Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- citySupply
- Optimization enabled
- true
- Compiler version
- v0.8.0+commit.c7dfd78e
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2024-09-12T09:44:21.644894Z
Contract source code
pragma solidity ^0.8.0; contract citySupply { struct SupplyItem { string name; string description; address currentHolder; bool active; } struct TrackingEvent { uint256 timestamp; address handler; string location; string status; } address public cityAdmin; mapping(uint256 => SupplyItem) public supplyItems; mapping(uint256 => TrackingEvent[]) public itemTrackingHistory; uint256 public itemCount; event ItemRegistered(uint256 indexed itemId, string name, address initialHolder); event ItemTransferred(uint256 indexed itemId, address indexed from, address indexed to); event TrackingEventAdded(uint256 indexed itemId, string location, string status); event ItemStatusChanged(uint256 indexed itemId, bool active); modifier onlyCityAdmin() { require(msg.sender == cityAdmin, "Only city admin can call this function"); _; } modifier onlyItemHolder(uint256 _itemId) { require(msg.sender == supplyItems[_itemId].currentHolder, "Only current item holder can call this function"); _; } constructor() { cityAdmin = msg.sender; } function registerItem(string memory _name, string memory _description, address _initialHolder) public onlyCityAdmin { itemCount++; supplyItems[itemCount] = SupplyItem(_name, _description, _initialHolder, true); TrackingEvent memory initialEvent = TrackingEvent(block.timestamp, _initialHolder, "Initial Location", "Registered"); itemTrackingHistory[itemCount].push(initialEvent); emit ItemRegistered(itemCount, _name, _initialHolder); emit TrackingEventAdded(itemCount, "Initial Location", "Registered"); } function transferItem(uint256 _itemId, address _newHolder) public onlyItemHolder(_itemId) { require(supplyItems[_itemId].active, "Item is not active"); address previousHolder = supplyItems[_itemId].currentHolder; supplyItems[_itemId].currentHolder = _newHolder; emit ItemTransferred(_itemId, previousHolder, _newHolder); } function addTrackingEvent(uint256 _itemId, string memory _location, string memory _status) public onlyItemHolder(_itemId) { require(supplyItems[_itemId].active, "Item is not active"); TrackingEvent memory newEvent = TrackingEvent(block.timestamp, msg.sender, _location, _status); itemTrackingHistory[_itemId].push(newEvent); emit TrackingEventAdded(_itemId, _location, _status); } function changeItemStatus(uint256 _itemId, bool _active) public onlyCityAdmin { supplyItems[_itemId].active = _active; emit ItemStatusChanged(_itemId, _active); } function getItemDetails(uint256 _itemId) public view returns (string memory, string memory, address, bool) { SupplyItem memory item = supplyItems[_itemId]; return (item.name, item.description, item.currentHolder, item.active); } function getTrackingHistoryCount(uint256 _itemId) public view returns (uint256) { return itemTrackingHistory[_itemId].length; } function getTrackingEvent(uint256 _itemId, uint256 _eventIndex) public view returns (uint256, address, string memory, string memory) { require(_eventIndex < itemTrackingHistory[_itemId].length, "Event index out of bounds"); TrackingEvent memory trackingEvent = itemTrackingHistory[_itemId][_eventIndex]; return (trackingEvent.timestamp, trackingEvent.handler, trackingEvent.location, trackingEvent.status); } function isItemHolder(uint256 _itemId, address _address) public view returns (bool) { return supplyItems[_itemId].currentHolder == _address; } function getLatestLocation(uint256 _itemId) public view returns (string memory) { require(itemTrackingHistory[_itemId].length > 0, "No tracking history for this item"); return itemTrackingHistory[_itemId][itemTrackingHistory[_itemId].length - 1].location; } }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"ItemRegistered","inputs":[{"type":"uint256","name":"itemId","internalType":"uint256","indexed":true},{"type":"string","name":"name","internalType":"string","indexed":false},{"type":"address","name":"initialHolder","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"ItemStatusChanged","inputs":[{"type":"uint256","name":"itemId","internalType":"uint256","indexed":true},{"type":"bool","name":"active","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"ItemTransferred","inputs":[{"type":"uint256","name":"itemId","internalType":"uint256","indexed":true},{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"TrackingEventAdded","inputs":[{"type":"uint256","name":"itemId","internalType":"uint256","indexed":true},{"type":"string","name":"location","internalType":"string","indexed":false},{"type":"string","name":"status","internalType":"string","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addTrackingEvent","inputs":[{"type":"uint256","name":"_itemId","internalType":"uint256"},{"type":"string","name":"_location","internalType":"string"},{"type":"string","name":"_status","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeItemStatus","inputs":[{"type":"uint256","name":"_itemId","internalType":"uint256"},{"type":"bool","name":"_active","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"cityAdmin","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"},{"type":"string","name":"","internalType":"string"},{"type":"address","name":"","internalType":"address"},{"type":"bool","name":"","internalType":"bool"}],"name":"getItemDetails","inputs":[{"type":"uint256","name":"_itemId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"getLatestLocation","inputs":[{"type":"uint256","name":"_itemId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"address","name":"","internalType":"address"},{"type":"string","name":"","internalType":"string"},{"type":"string","name":"","internalType":"string"}],"name":"getTrackingEvent","inputs":[{"type":"uint256","name":"_itemId","internalType":"uint256"},{"type":"uint256","name":"_eventIndex","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTrackingHistoryCount","inputs":[{"type":"uint256","name":"_itemId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isItemHolder","inputs":[{"type":"uint256","name":"_itemId","internalType":"uint256"},{"type":"address","name":"_address","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"itemCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"timestamp","internalType":"uint256"},{"type":"address","name":"handler","internalType":"address"},{"type":"string","name":"location","internalType":"string"},{"type":"string","name":"status","internalType":"string"}],"name":"itemTrackingHistory","inputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"registerItem","inputs":[{"type":"string","name":"_name","internalType":"string"},{"type":"string","name":"_description","internalType":"string"},{"type":"address","name":"_initialHolder","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"name","internalType":"string"},{"type":"string","name":"description","internalType":"string"},{"type":"address","name":"currentHolder","internalType":"address"},{"type":"bool","name":"active","internalType":"bool"}],"name":"supplyItems","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferItem","inputs":[{"type":"uint256","name":"_itemId","internalType":"uint256"},{"type":"address","name":"_newHolder","internalType":"address"}]}]
Contract Creation Code
0x608060405234801561001057600080fd5b50600080546001600160a01b0319163317905561150f806100326000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806373004ca01161008c578063a422910111610066578063a4229101146101b9578063be7fe8eb146101cc578063c7ed366b146101e1578063ded7374c146101f4576100cf565b806373004ca014610170578063895377a7146101935780639a2817b2146101a6576100cf565b806347bc9d2b146100d45780634df157ed146100e957806354916e63146101155780635c61f40e1461012857806364d3c038146101485780636bfb0d011461015b575b600080fd5b6100e76100e2366004610fd6565b610214565b005b6100fc6100f7366004611127565b610454565b60405161010c94939291906113f9565b60405180910390f35b6100fc610123366004611127565b610651565b61013b610136366004611047565b6107b5565b60405161010c91906111b2565b6100e761015636600461108a565b6108bf565b61016361094d565b60405161010c91906113f0565b61018361017e366004611047565b610953565b60405161010c9493929190611224565b6101636101a1366004611047565b610aea565b6100e76101b43660046110bd565b610afc565b6100e76101c736600461105f565b610c55565b6101d4610d2a565b60405161010c9190611193565b6101836101ef366004611047565b610d39565b61020761020236600461105f565b610e81565b60405161010c91906111a7565b6000546001600160a01b031633146102475760405162461bcd60e51b815260040161023e9061126b565b60405180910390fd5b6003805490600061025783611492565b90915550506040805160808101825284815260208082018590526001600160a01b0384168284015260016060830181905260035460009081529082529290922081518051929391926102ac9284920190610ea5565b5060208281015180516102c59260018501920190610ea5565b50604082810151600292830180546060958601516001600160a01b03199182166001600160a01b039485161760ff60a01b1916600160a01b91151591909102179091558251608081018452428152868316602080830191825285518087018752601081526f24b734ba34b0b6102637b1b0ba34b7b760811b8183015283870190815286518088018852600a815269149959da5cdd195c995960b21b818401529884019890985260035460009081528782529586208054600181810183559188529682902084516004909802019687559151918601805490941691909416179091559351805185946103bb93908501920190610ea5565b50606082015180516103d7916003840191602090910190610ea5565b5050506003547fa3d89617a5e6e5b9541662946379863531fa40dd54355c6fc5d7c4c7d1a491cc858460405161040e9291906111cc565b60405180910390a26003547fb1acea5458062330d6ce48e40787865b0eb468120d110b2695f8097c13d2fb7d60405161044690611363565b60405180910390a250505050565b6000828152600260205260408120548190606090819085106104885760405162461bcd60e51b815260040161023e9061132c565b60008681526002602052604081208054879081106104b657634e487b7160e01b600052603260045260246000fd5b9060005260206000209060040201604051806080016040529081600082015481526020016001820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160028201805461051890611457565b80601f016020809104026020016040519081016040528092919081815260200182805461054490611457565b80156105915780601f1061056657610100808354040283529160200191610591565b820191906000526020600020905b81548152906001019060200180831161057457829003601f168201915b505050505081526020016003820180546105aa90611457565b80601f01602080910402602001604051908101604052809291908181526020018280546105d690611457565b80156106235780601f106105f857610100808354040283529160200191610623565b820191906000526020600020905b81548152906001019060200180831161060657829003601f168201915b505050919092525050815160208301516040840151606090940151919b909a50929850965090945050505050565b6002602052816000526040600020818154811061066d57600080fd5b60009182526020909120600490910201805460018201546002830180549295506001600160a01b039091169350906106a490611457565b80601f01602080910402602001604051908101604052809291908181526020018280546106d090611457565b801561071d5780601f106106f25761010080835404028352916020019161071d565b820191906000526020600020905b81548152906001019060200180831161070057829003601f168201915b50505050509080600301805461073290611457565b80601f016020809104026020016040519081016040528092919081815260200182805461075e90611457565b80156107ab5780601f10610780576101008083540402835291602001916107ab565b820191906000526020600020905b81548152906001019060200180831161078e57829003601f168201915b5050505050905084565b6000818152600260205260409020546060906107e35760405162461bcd60e51b815260040161023e906113af565b600082815260026020526040902080546107ff90600190611440565b8154811061081d57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060040201600201805461083990611457565b80601f016020809104026020016040519081016040528092919081815260200182805461086590611457565b80156108b25780601f10610887576101008083540402835291602001916108b2565b820191906000526020600020905b81548152906001019060200180831161089557829003601f168201915b505050505090505b919050565b6000546001600160a01b031633146108e95760405162461bcd60e51b815260040161023e9061126b565b60008281526001602052604090819020600201805460ff60a01b1916600160a01b841515021790555182907f27bfdfdb5124afd9131767b916d313cc80e98400a2d985e8adba2329087dab23906109419084906111a7565b60405180910390a25050565b60035481565b60608060008060006001600087815260200190815260200160002060405180608001604052908160008201805461098990611457565b80601f01602080910402602001604051908101604052809291908181526020018280546109b590611457565b8015610a025780601f106109d757610100808354040283529160200191610a02565b820191906000526020600020905b8154815290600101906020018083116109e557829003601f168201915b50505050508152602001600182018054610a1b90611457565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4790611457565b8015610a945780601f10610a6957610100808354040283529160200191610a94565b820191906000526020600020905b815481529060010190602001808311610a7757829003601f168201915b5050509183525050600291909101546001600160a01b038116602080840191909152600160a01b90910460ff16151560409283015282519083015191830151606090930151909991985091965090945092505050565b60009081526002602052604090205490565b60008381526001602052604090206002015483906001600160a01b03163314610b375760405162461bcd60e51b815260040161023e906112dd565b600084815260016020526040902060020154600160a01b900460ff16610b6f5760405162461bcd60e51b815260040161023e906112b1565b604080516080810182524281523360208083019182528284018781526060840187905260008981526002808452958120805460018082018355918352918490208651600490930201918255935193810180546001600160a01b0319166001600160a01b039095169490941790935551805193948594610bf5939185019290910190610ea5565b5060608201518051610c11916003840191602090910190610ea5565b505050847fb1acea5458062330d6ce48e40787865b0eb468120d110b2695f8097c13d2fb7d8585604051610c469291906111f6565b60405180910390a25050505050565b60008281526001602052604090206002015482906001600160a01b03163314610c905760405162461bcd60e51b815260040161023e906112dd565b600083815260016020526040902060020154600160a01b900460ff16610cc85760405162461bcd60e51b815260040161023e906112b1565b60008381526001602052604080822060020180546001600160a01b031981166001600160a01b038781169182179093559251911692839187917f9d0353aeb19b9952d7b54a1f8427105b8885d62f9c4e04d82cca517abe142f5191a450505050565b6000546001600160a01b031681565b600160205260009081526040902080548190610d5490611457565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8090611457565b8015610dcd5780601f10610da257610100808354040283529160200191610dcd565b820191906000526020600020905b815481529060010190602001808311610db057829003601f168201915b505050505090806001018054610de290611457565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0e90611457565b8015610e5b5780601f10610e3057610100808354040283529160200191610e5b565b820191906000526020600020905b815481529060010190602001808311610e3e57829003601f168201915b505050600290930154919250506001600160a01b0381169060ff600160a01b9091041684565b600091825260016020526040909120600201546001600160a01b0391821691161490565b828054610eb190611457565b90600052602060002090601f016020900481019282610ed35760008555610f19565b82601f10610eec57805160ff1916838001178555610f19565b82800160010185558215610f19579182015b82811115610f19578251825591602001919060010190610efe565b50610f25929150610f29565b5090565b5b80821115610f255760008155600101610f2a565b80356001600160a01b03811681146108ba57600080fd5b600082601f830112610f65578081fd5b813567ffffffffffffffff80821115610f8057610f806114c3565b604051601f8301601f191681016020018281118282101715610fa457610fa46114c3565b604052828152848301602001861015610fbb578384fd5b82602086016020830137918201602001929092529392505050565b600080600060608486031215610fea578283fd5b833567ffffffffffffffff80821115611001578485fd5b61100d87838801610f55565b94506020860135915080821115611022578384fd5b5061102f86828701610f55565b92505061103e60408501610f3e565b90509250925092565b600060208284031215611058578081fd5b5035919050565b60008060408385031215611071578182fd5b8235915061108160208401610f3e565b90509250929050565b6000806040838503121561109c578182fd5b82359150602083013580151581146110b2578182fd5b809150509250929050565b6000806000606084860312156110d1578283fd5b83359250602084013567ffffffffffffffff808211156110ef578384fd5b6110fb87838801610f55565b93506040860135915080821115611110578283fd5b5061111d86828701610f55565b9150509250925092565b60008060408385031215611139578182fd5b50508035926020909101359150565b60008151808452815b8181101561116d57602081850181015186830182015201611151565b8181111561117e5782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b901515815260200190565b6000602082526111c56020830184611148565b9392505050565b6000604082526111df6040830185611148565b905060018060a01b03831660208301529392505050565b6000604082526112096040830185611148565b828103602084015261121b8185611148565b95945050505050565b6000608082526112376080830187611148565b82810360208401526112498187611148565b6001600160a01b03959095166040840152505090151560609091015292915050565b60208082526026908201527f4f6e6c7920636974792061646d696e2063616e2063616c6c20746869732066756040820152653731ba34b7b760d11b606082015260800190565b6020808252601290820152714974656d206973206e6f742061637469766560701b604082015260600190565b6020808252602f908201527f4f6e6c792063757272656e74206974656d20686f6c6465722063616e2063616c60408201526e36103a3434b990333ab731ba34b7b760891b606082015260800190565b60208082526019908201527f4576656e7420696e646578206f7574206f6620626f756e647300000000000000604082015260600190565b60408082526010908201526f24b734ba34b0b6102637b1b0ba34b7b760811b6060820152608060208201819052600a9082015269149959da5cdd195c995960b21b60a082015260c00190565b60208082526021908201527f4e6f20747261636b696e6720686973746f727920666f722074686973206974656040820152606d60f81b606082015260800190565b90815260200190565b8481526001600160a01b038416602082015260806040820181905260009061142390830185611148565b82810360608401526114358185611148565b979650505050505050565b600082821015611452576114526114ad565b500390565b60028104600182168061146b57607f821691505b6020821081141561148c57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156114a6576114a66114ad565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220995fd2922a2017ccd8f98cc89e8776c596277c2a731987f71cfe79d27ef57bd064736f6c63430008000033
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c806373004ca01161008c578063a422910111610066578063a4229101146101b9578063be7fe8eb146101cc578063c7ed366b146101e1578063ded7374c146101f4576100cf565b806373004ca014610170578063895377a7146101935780639a2817b2146101a6576100cf565b806347bc9d2b146100d45780634df157ed146100e957806354916e63146101155780635c61f40e1461012857806364d3c038146101485780636bfb0d011461015b575b600080fd5b6100e76100e2366004610fd6565b610214565b005b6100fc6100f7366004611127565b610454565b60405161010c94939291906113f9565b60405180910390f35b6100fc610123366004611127565b610651565b61013b610136366004611047565b6107b5565b60405161010c91906111b2565b6100e761015636600461108a565b6108bf565b61016361094d565b60405161010c91906113f0565b61018361017e366004611047565b610953565b60405161010c9493929190611224565b6101636101a1366004611047565b610aea565b6100e76101b43660046110bd565b610afc565b6100e76101c736600461105f565b610c55565b6101d4610d2a565b60405161010c9190611193565b6101836101ef366004611047565b610d39565b61020761020236600461105f565b610e81565b60405161010c91906111a7565b6000546001600160a01b031633146102475760405162461bcd60e51b815260040161023e9061126b565b60405180910390fd5b6003805490600061025783611492565b90915550506040805160808101825284815260208082018590526001600160a01b0384168284015260016060830181905260035460009081529082529290922081518051929391926102ac9284920190610ea5565b5060208281015180516102c59260018501920190610ea5565b50604082810151600292830180546060958601516001600160a01b03199182166001600160a01b039485161760ff60a01b1916600160a01b91151591909102179091558251608081018452428152868316602080830191825285518087018752601081526f24b734ba34b0b6102637b1b0ba34b7b760811b8183015283870190815286518088018852600a815269149959da5cdd195c995960b21b818401529884019890985260035460009081528782529586208054600181810183559188529682902084516004909802019687559151918601805490941691909416179091559351805185946103bb93908501920190610ea5565b50606082015180516103d7916003840191602090910190610ea5565b5050506003547fa3d89617a5e6e5b9541662946379863531fa40dd54355c6fc5d7c4c7d1a491cc858460405161040e9291906111cc565b60405180910390a26003547fb1acea5458062330d6ce48e40787865b0eb468120d110b2695f8097c13d2fb7d60405161044690611363565b60405180910390a250505050565b6000828152600260205260408120548190606090819085106104885760405162461bcd60e51b815260040161023e9061132c565b60008681526002602052604081208054879081106104b657634e487b7160e01b600052603260045260246000fd5b9060005260206000209060040201604051806080016040529081600082015481526020016001820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160028201805461051890611457565b80601f016020809104026020016040519081016040528092919081815260200182805461054490611457565b80156105915780601f1061056657610100808354040283529160200191610591565b820191906000526020600020905b81548152906001019060200180831161057457829003601f168201915b505050505081526020016003820180546105aa90611457565b80601f01602080910402602001604051908101604052809291908181526020018280546105d690611457565b80156106235780601f106105f857610100808354040283529160200191610623565b820191906000526020600020905b81548152906001019060200180831161060657829003601f168201915b505050919092525050815160208301516040840151606090940151919b909a50929850965090945050505050565b6002602052816000526040600020818154811061066d57600080fd5b60009182526020909120600490910201805460018201546002830180549295506001600160a01b039091169350906106a490611457565b80601f01602080910402602001604051908101604052809291908181526020018280546106d090611457565b801561071d5780601f106106f25761010080835404028352916020019161071d565b820191906000526020600020905b81548152906001019060200180831161070057829003601f168201915b50505050509080600301805461073290611457565b80601f016020809104026020016040519081016040528092919081815260200182805461075e90611457565b80156107ab5780601f10610780576101008083540402835291602001916107ab565b820191906000526020600020905b81548152906001019060200180831161078e57829003601f168201915b5050505050905084565b6000818152600260205260409020546060906107e35760405162461bcd60e51b815260040161023e906113af565b600082815260026020526040902080546107ff90600190611440565b8154811061081d57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060040201600201805461083990611457565b80601f016020809104026020016040519081016040528092919081815260200182805461086590611457565b80156108b25780601f10610887576101008083540402835291602001916108b2565b820191906000526020600020905b81548152906001019060200180831161089557829003601f168201915b505050505090505b919050565b6000546001600160a01b031633146108e95760405162461bcd60e51b815260040161023e9061126b565b60008281526001602052604090819020600201805460ff60a01b1916600160a01b841515021790555182907f27bfdfdb5124afd9131767b916d313cc80e98400a2d985e8adba2329087dab23906109419084906111a7565b60405180910390a25050565b60035481565b60608060008060006001600087815260200190815260200160002060405180608001604052908160008201805461098990611457565b80601f01602080910402602001604051908101604052809291908181526020018280546109b590611457565b8015610a025780601f106109d757610100808354040283529160200191610a02565b820191906000526020600020905b8154815290600101906020018083116109e557829003601f168201915b50505050508152602001600182018054610a1b90611457565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4790611457565b8015610a945780601f10610a6957610100808354040283529160200191610a94565b820191906000526020600020905b815481529060010190602001808311610a7757829003601f168201915b5050509183525050600291909101546001600160a01b038116602080840191909152600160a01b90910460ff16151560409283015282519083015191830151606090930151909991985091965090945092505050565b60009081526002602052604090205490565b60008381526001602052604090206002015483906001600160a01b03163314610b375760405162461bcd60e51b815260040161023e906112dd565b600084815260016020526040902060020154600160a01b900460ff16610b6f5760405162461bcd60e51b815260040161023e906112b1565b604080516080810182524281523360208083019182528284018781526060840187905260008981526002808452958120805460018082018355918352918490208651600490930201918255935193810180546001600160a01b0319166001600160a01b039095169490941790935551805193948594610bf5939185019290910190610ea5565b5060608201518051610c11916003840191602090910190610ea5565b505050847fb1acea5458062330d6ce48e40787865b0eb468120d110b2695f8097c13d2fb7d8585604051610c469291906111f6565b60405180910390a25050505050565b60008281526001602052604090206002015482906001600160a01b03163314610c905760405162461bcd60e51b815260040161023e906112dd565b600083815260016020526040902060020154600160a01b900460ff16610cc85760405162461bcd60e51b815260040161023e906112b1565b60008381526001602052604080822060020180546001600160a01b031981166001600160a01b038781169182179093559251911692839187917f9d0353aeb19b9952d7b54a1f8427105b8885d62f9c4e04d82cca517abe142f5191a450505050565b6000546001600160a01b031681565b600160205260009081526040902080548190610d5490611457565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8090611457565b8015610dcd5780601f10610da257610100808354040283529160200191610dcd565b820191906000526020600020905b815481529060010190602001808311610db057829003601f168201915b505050505090806001018054610de290611457565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0e90611457565b8015610e5b5780601f10610e3057610100808354040283529160200191610e5b565b820191906000526020600020905b815481529060010190602001808311610e3e57829003601f168201915b505050600290930154919250506001600160a01b0381169060ff600160a01b9091041684565b600091825260016020526040909120600201546001600160a01b0391821691161490565b828054610eb190611457565b90600052602060002090601f016020900481019282610ed35760008555610f19565b82601f10610eec57805160ff1916838001178555610f19565b82800160010185558215610f19579182015b82811115610f19578251825591602001919060010190610efe565b50610f25929150610f29565b5090565b5b80821115610f255760008155600101610f2a565b80356001600160a01b03811681146108ba57600080fd5b600082601f830112610f65578081fd5b813567ffffffffffffffff80821115610f8057610f806114c3565b604051601f8301601f191681016020018281118282101715610fa457610fa46114c3565b604052828152848301602001861015610fbb578384fd5b82602086016020830137918201602001929092529392505050565b600080600060608486031215610fea578283fd5b833567ffffffffffffffff80821115611001578485fd5b61100d87838801610f55565b94506020860135915080821115611022578384fd5b5061102f86828701610f55565b92505061103e60408501610f3e565b90509250925092565b600060208284031215611058578081fd5b5035919050565b60008060408385031215611071578182fd5b8235915061108160208401610f3e565b90509250929050565b6000806040838503121561109c578182fd5b82359150602083013580151581146110b2578182fd5b809150509250929050565b6000806000606084860312156110d1578283fd5b83359250602084013567ffffffffffffffff808211156110ef578384fd5b6110fb87838801610f55565b93506040860135915080821115611110578283fd5b5061111d86828701610f55565b9150509250925092565b60008060408385031215611139578182fd5b50508035926020909101359150565b60008151808452815b8181101561116d57602081850181015186830182015201611151565b8181111561117e5782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b901515815260200190565b6000602082526111c56020830184611148565b9392505050565b6000604082526111df6040830185611148565b905060018060a01b03831660208301529392505050565b6000604082526112096040830185611148565b828103602084015261121b8185611148565b95945050505050565b6000608082526112376080830187611148565b82810360208401526112498187611148565b6001600160a01b03959095166040840152505090151560609091015292915050565b60208082526026908201527f4f6e6c7920636974792061646d696e2063616e2063616c6c20746869732066756040820152653731ba34b7b760d11b606082015260800190565b6020808252601290820152714974656d206973206e6f742061637469766560701b604082015260600190565b6020808252602f908201527f4f6e6c792063757272656e74206974656d20686f6c6465722063616e2063616c60408201526e36103a3434b990333ab731ba34b7b760891b606082015260800190565b60208082526019908201527f4576656e7420696e646578206f7574206f6620626f756e647300000000000000604082015260600190565b60408082526010908201526f24b734ba34b0b6102637b1b0ba34b7b760811b6060820152608060208201819052600a9082015269149959da5cdd195c995960b21b60a082015260c00190565b60208082526021908201527f4e6f20747261636b696e6720686973746f727920666f722074686973206974656040820152606d60f81b606082015260800190565b90815260200190565b8481526001600160a01b038416602082015260806040820181905260009061142390830185611148565b82810360608401526114358185611148565b979650505050505050565b600082821015611452576114526114ad565b500390565b60028104600182168061146b57607f821691505b6020821081141561148c57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156114a6576114a66114ad565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220995fd2922a2017ccd8f98cc89e8776c596277c2a731987f71cfe79d27ef57bd064736f6c63430008000033