[ { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "indexed": false, "internalType": "bytes32", "name": "accessToken", "type": "bytes32" }, { "indexed": false, "internalType": "uint256", "name": "expirationTime", "type": "uint256" } ], "name": "AccessGranted", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "approved", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": false, "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "ApprovalForAll", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "_fromTokenId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "_toTokenId", "type": "uint256" } ], "name": "BatchMetadataUpdate", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": false, "internalType": "string", "name": "certId", "type": "string" } ], "name": "CertificateMinted", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "student", "type": "address" }, { "indexed": false, "internalType": "string", "name": "certId", "type": "string" } ], "name": "CertificationApproved", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "_tokenId", "type": "uint256" } ], "name": "MetadataUpdate", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "indexed": true, "internalType": "bytes32", "name": "previousAdminRole", "type": "bytes32" }, { "indexed": true, "internalType": "bytes32", "name": "newAdminRole", "type": "bytes32" } ], "name": "RoleAdminChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" } ], "name": "RoleGranted", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" } ], "name": "RoleRevoked", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "inputs": [], "name": "DEFAULT_ADMIN_ROLE", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "SCHOOL_ROLE", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "approve", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "student", "type": "address" }, { "internalType": "string", "name": "certId", "type": "string" } ], "name": "approveCertification", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "checkAccessTokenValidity", "outputs": [ { "internalType": "bool", "name": "isValid", "type": "bool" }, { "internalType": "uint256", "name": "expirationTime", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "uint256", "name": "duration", "type": "uint256" } ], "name": "generateAccessToken", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "getAccessToken", "outputs": [ { "internalType": "bytes4", "name": "", "type": "bytes4" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "getApproved", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "bytes4", "name": "accessToken", "type": "bytes4" } ], "name": "getCertificateId", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" } ], "name": "getRoleAdmin", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "user", "type": "address" } ], "name": "getTokenId", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "account", "type": "address" } ], "name": "grantRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "account", "type": "address" } ], "name": "hasRole", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "operator", "type": "address" } ], "name": "isApprovedForAll", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "certId", "type": "string" }, { "internalType": "string", "name": "uri", "type": "string" } ], "name": "mintCertificate", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "ownerOf", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "account", "type": "address" } ], "name": "renounceRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "revokeAccessToken", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "account", "type": "address" } ], "name": "revokeRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "safeTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "safeTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "setApprovalForAll", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "tokenURI", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "transferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ]
60806040523480156200001157600080fd5b506040518060400160405280600b81526020016a416c70686156657269667960a81b81525060405180604001604052806005815260200164414c50565960d81b815250816000908162000065919062000202565b50600162000074828262000202565b506200008691506000905033620000b8565b620000b27fbf2d3c1ba72e79e259c756e56391a6a8f36a6ebdc23f41c00790ba276c7104e833620000b8565b620002ce565b60008281526007602090815260408083206001600160a01b038516845290915290205460ff16620001595760008281526007602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620001183390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200018857607f821691505b602082108103620001a957634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001fd57600081815260208120601f850160051c81016020861015620001d85750805b601f850160051c820191505b81811015620001f957828155600101620001e4565b5050505b505050565b81516001600160401b038111156200021e576200021e6200015d565b62000236816200022f845462000173565b84620001af565b602080601f8311600181146200026e5760008415620002555750858301515b600019600386901b1c1916600185901b178555620001f9565b600085815260208120601f198616915b828110156200029f578886015182559484019460019091019084016200027e565b5085821015620002be5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61255d80620002de6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806391d14854116100f9578063c87b56dd11610097578063d547741f11610071578063d547741f1461040e578063e547996414610421578063e985e9c514610434578063f15376861461047057600080fd5b8063c87b56dd146103c1578063c9469307146103d4578063d0bdf89b146103fb57600080fd5b8063a217fddf116100d3578063a217fddf14610380578063a22cb46514610388578063aac931721461039b578063b88d4fde146103ae57600080fd5b806391d148541461033957806395d89b411461034c578063991acf6e1461035457600080fd5b80632f1fad9b1161016657806342842e0e1161014057806342842e0e146102ed5780636352211e1461030057806370a08231146103135780638ef1a8271461032657600080fd5b80632f1fad9b146102b45780632f2ff15d146102c757806336568abe146102da57600080fd5b8063095ea7b3116101a2578063095ea7b3146102315780631bb9ac2f1461024657806323b872dd14610270578063248a9ca31461028357600080fd5b806301ffc9a7146101c957806306fdde03146101f1578063081812fc14610206575b600080fd5b6101dc6101d7366004611d68565b610499565b60405190151581526020015b60405180910390f35b6101f96104aa565b6040516101e89190611dd5565b610219610214366004611de8565b61053c565b6040516001600160a01b0390911681526020016101e8565b61024461023f366004611e1d565b610563565b005b610259610254366004611de8565b61067d565b6040805192151583526020830191909152016101e8565b61024461027e366004611e47565b6106a9565b6102a6610291366004611de8565b60009081526007602052604090206001015490565b6040519081526020016101e8565b6102446102c2366004611e83565b6106da565b6102446102d5366004611ea5565b61081b565b6102446102e8366004611ea5565b610840565b6102446102fb366004611e47565b6108be565b61021961030e366004611de8565b6108d9565b6102a6610321366004611ed1565b610939565b610244610334366004611de8565b6109bf565b6101dc610347366004611ea5565b610a12565b6101f9610a3d565b610367610362366004611de8565b610a4c565b6040516001600160e01b031990911681526020016101e8565b6102a6600081565b610244610396366004611eec565b610aef565b6102446103a9366004611fd4565b610afa565b6102446103bc366004612022565b610c10565b6101f96103cf366004611de8565b610c48565b6102a67fbf2d3c1ba72e79e259c756e56391a6a8f36a6ebdc23f41c00790ba276c7104e881565b61024461040936600461209e565b610c53565b61024461041c366004611ea5565b610e17565b6101f961042f3660046120f8565b610e3c565b6101dc61044236600461211d565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6102a661047e366004611ed1565b6001600160a01b03166000908152600a602052604090205490565b60006104a482610f7b565b92915050565b6060600080546104b990612147565b80601f01602080910402602001604051908101604052809291908181526020018280546104e590612147565b80156105325780601f1061050757610100808354040283529160200191610532565b820191906000526020600020905b81548152906001019060200180831161051557829003601f168201915b5050505050905090565b600061054782610fa0565b506000908152600460205260409020546001600160a01b031690565b600061056e826108d9565b9050806001600160a01b0316836001600160a01b0316036105e05760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806105fc57506105fc8133610442565b61066e5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016105d7565b6106788383611002565b505050565b600081815260096020526040812060020154819080158015906106a05750804211155b94909350915050565b6106b33382611070565b6106cf5760405162461bcd60e51b81526004016105d790612181565b6106788383836110ef565b336106e4836108d9565b6001600160a01b03161461070a5760405162461bcd60e51b81526004016105d7906121ce565b600082815260096020526040902060020154421161072b5761072b826109bf565b604080514260208201526bffffffffffffffffffffffff193360601b1691810191909152605481018390526074810182905260009060940160408051808303601f190181529181528151602092830120600086815260099093529120600101805463ffffffff191660e083901c17905590506107a78242612211565b600084815260096020526040908190206002810183905560010154905185927faa880fb89f8ad52a5b440ab86cf57ea6a53e3d0a52577dc86ed07108281ef3fd9261080e9260e09190911b91906001600160e01b0319929092168252602082015260400190565b60405180910390a2505050565b60008281526007602052604090206001015461083681611253565b610678838361125d565b6001600160a01b03811633146108b05760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016105d7565b6108ba82826112e3565b5050565b61067883838360405180602001604052806000815250610c10565b6000818152600260205260408120546001600160a01b0316806104a45760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016105d7565b60006001600160a01b0382166109a35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016105d7565b506001600160a01b031660009081526003602052604090205490565b336109c9826108d9565b6001600160a01b0316146109ef5760405162461bcd60e51b81526004016105d7906121ce565b600090815260096020526040812060018101805463ffffffff1916905560020155565b60009182526007602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600180546104b990612147565b600033610a58836108d9565b6001600160a01b031614610a7e5760405162461bcd60e51b81526004016105d7906121ce565b600082815260096020526040902060020154421115610ad65760405162461bcd60e51b81526020600482015260146024820152731058d8d95cdcc81d1bdad95b88195e1c1a5c995960621b60448201526064016105d7565b5060009081526009602052604090206001015460e01b90565b6108ba33838361134a565b6001600160a01b0382166000908152600b6020526040908190209051610b21908390612224565b9081526040519081900360200190205460ff1615610b815760405162461bcd60e51b815260206004820152601e60248201527f43657274696669636174696f6e20616c726561647920617070726f766564000060448201526064016105d7565b6001600160a01b0382166000908152600b602052604090819020905160019190610bac908490612224565b908152604051908190036020018120805492151560ff19909316929092179091556001600160a01b038316907e3a7d68ad0c24dcf5a37c1e6f39eb6842c4782ea0c09b765825697d44ecd67a90610c04908490611dd5565b60405180910390a25050565b610c1a3383611070565b610c365760405162461bcd60e51b81526004016105d790612181565b610c4284848484611418565b50505050565b60606104a48261144b565b336000908152600a602052604090205415610cbb5760405162461bcd60e51b815260206004820152602260248201527f477261647561746520616c726561647920686173206120636572746966696361604482015261746560f01b60648201526084016105d7565b336000908152600b6020526040908190209051610cd9908490612224565b9081526040519081900360200190205460ff16610d445760405162461bcd60e51b8152602060048201526024808201527f43657274696669636174696f6e206e6f7420617070726f7665642062792073636044820152631a1bdbdb60e21b60648201526084016105d7565b610d52600880546001019055565b6000610d5d60085490565b9050610d693382611553565b610d73818361156d565b600081815260096020526040902080610d8c858261228e565b50336000908152600a60209081526040808320859055600b9091528082209051610db7908790612224565b908152604051908190036020018120805492151560ff1990931692909217909155339083907f8f25ba6a82901a4fd6415ef13a61a268ca433a2b06840284ed6cee98d0237d9e90610e09908890611dd5565b60405180910390a350505050565b600082815260076020526040902060010154610e3281611253565b61067883836112e3565b6060610e483384611070565b80610e90575060008381526009602052604090206001015460e01b6001600160e01b0319908116908316148015610e9057506000838152600960205260409020600201544211155b610edc5760405162461bcd60e51b815260206004820181905260248201527f4e6f7420617574686f72697a6564206f7220616363657373206578706972656460448201526064016105d7565b60008381526009602052604090208054610ef590612147565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2190612147565b8015610f6e5780601f10610f4357610100808354040283529160200191610f6e565b820191906000526020600020905b815481529060010190602001808311610f5157829003601f168201915b5050505050905092915050565b60006001600160e01b03198216637965db0b60e01b14806104a457506104a482611638565b6000818152600260205260409020546001600160a01b0316610fff5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016105d7565b50565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611037826108d9565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061107c836108d9565b9050806001600160a01b0316846001600160a01b031614806110b75750836001600160a01b03166110ac8461053c565b6001600160a01b0316145b806110e757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611102826108d9565b6001600160a01b0316146111285760405162461bcd60e51b81526004016105d79061234e565b6001600160a01b03821661118a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105d7565b826001600160a01b031661119d826108d9565b6001600160a01b0316146111c35760405162461bcd60e51b81526004016105d79061234e565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610fff813361165d565b6112678282610a12565b6108ba5760008281526007602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561129f3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6112ed8282610a12565b156108ba5760008281526007602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b816001600160a01b0316836001600160a01b0316036113ab5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105d7565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6114238484846110ef565b61142f848484846116b6565b610c425760405162461bcd60e51b81526004016105d790612393565b606061145682610fa0565b6000828152600660205260408120805461146f90612147565b80601f016020809104026020016040519081016040528092919081815260200182805461149b90612147565b80156114e85780601f106114bd576101008083540402835291602001916114e8565b820191906000526020600020905b8154815290600101906020018083116114cb57829003601f168201915b50505050509050600061150660408051602081019091526000815290565b90508051600003611518575092915050565b81511561154a5780826040516020016115329291906123e5565b60405160208183030381529060405292505050919050565b6110e7846117b7565b6108ba82826040518060200160405280600081525061182b565b6000828152600260205260409020546001600160a01b03166115e85760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b60648201526084016105d7565b6000828152600660205260409020611600828261228e565b506040518281527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79060200160405180910390a15050565b60006001600160e01b03198216632483248360e11b14806104a457506104a48261185e565b6116678282610a12565b6108ba57611674816118ae565b61167f8360206118c0565b604051602001611690929190612414565b60408051601f198184030181529082905262461bcd60e51b82526105d791600401611dd5565b60006001600160a01b0384163b156117ac57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906116fa903390899088908890600401612489565b6020604051808303816000875af1925050508015611735575060408051601f3d908101601f19168201909252611732918101906124c6565b60015b611792573d808015611763576040519150601f19603f3d011682016040523d82523d6000602084013e611768565b606091505b50805160000361178a5760405162461bcd60e51b81526004016105d790612393565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506110e7565b506001949350505050565b60606117c282610fa0565b60006117d960408051602081019091526000815290565b905060008151116117f95760405180602001604052806000815250611824565b8061180384611a5c565b6040516020016118149291906123e5565b6040516020818303038152906040525b9392505050565b6118358383611aef565b61184260008484846116b6565b6106785760405162461bcd60e51b81526004016105d790612393565b60006001600160e01b031982166380ac58cd60e01b148061188f57506001600160e01b03198216635b5e139f60e01b145b806104a457506301ffc9a760e01b6001600160e01b03198316146104a4565b60606104a46001600160a01b03831660145b606060006118cf8360026124e3565b6118da906002612211565b67ffffffffffffffff8111156118f2576118f2611f28565b6040519080825280601f01601f19166020018201604052801561191c576020820181803683370190505b509050600360fc1b81600081518110611937576119376124fa565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611966576119666124fa565b60200101906001600160f81b031916908160001a905350600061198a8460026124e3565b611995906001612211565b90505b6001811115611a0d576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106119c9576119c96124fa565b1a60f81b8282815181106119df576119df6124fa565b60200101906001600160f81b031916908160001a90535060049490941c93611a0681612510565b9050611998565b5083156118245760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016105d7565b60606000611a6983611c7a565b600101905060008167ffffffffffffffff811115611a8957611a89611f28565b6040519080825280601f01601f191660200182016040528015611ab3576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611abd57509392505050565b6001600160a01b038216611b455760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105d7565b6000818152600260205260409020546001600160a01b031615611baa5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105d7565b6000818152600260205260409020546001600160a01b031615611c0f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105d7565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611cb95772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611ce5576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611d0357662386f26fc10000830492506010015b6305f5e1008310611d1b576305f5e100830492506008015b6127108310611d2f57612710830492506004015b60648310611d41576064830492506002015b600a83106104a45760010192915050565b6001600160e01b031981168114610fff57600080fd5b600060208284031215611d7a57600080fd5b813561182481611d52565b60005b83811015611da0578181015183820152602001611d88565b50506000910152565b60008151808452611dc1816020860160208601611d85565b601f01601f19169290920160200192915050565b6020815260006118246020830184611da9565b600060208284031215611dfa57600080fd5b5035919050565b80356001600160a01b0381168114611e1857600080fd5b919050565b60008060408385031215611e3057600080fd5b611e3983611e01565b946020939093013593505050565b600080600060608486031215611e5c57600080fd5b611e6584611e01565b9250611e7360208501611e01565b9150604084013590509250925092565b60008060408385031215611e9657600080fd5b50508035926020909101359150565b60008060408385031215611eb857600080fd5b82359150611ec860208401611e01565b90509250929050565b600060208284031215611ee357600080fd5b61182482611e01565b60008060408385031215611eff57600080fd5b611f0883611e01565b915060208301358015158114611f1d57600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611f5957611f59611f28565b604051601f8501601f19908116603f01168101908282118183101715611f8157611f81611f28565b81604052809350858152868686011115611f9a57600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112611fc557600080fd5b61182483833560208501611f3e565b60008060408385031215611fe757600080fd5b611ff083611e01565b9150602083013567ffffffffffffffff81111561200c57600080fd5b61201885828601611fb4565b9150509250929050565b6000806000806080858703121561203857600080fd5b61204185611e01565b935061204f60208601611e01565b925060408501359150606085013567ffffffffffffffff81111561207257600080fd5b8501601f8101871361208357600080fd5b61209287823560208401611f3e565b91505092959194509250565b600080604083850312156120b157600080fd5b823567ffffffffffffffff808211156120c957600080fd5b6120d586838701611fb4565b935060208501359150808211156120eb57600080fd5b5061201885828601611fb4565b6000806040838503121561210b57600080fd5b823591506020830135611f1d81611d52565b6000806040838503121561213057600080fd5b61213983611e01565b9150611ec860208401611e01565b600181811c9082168061215b57607f821691505b60208210810361217b57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b6020808252601390820152722737ba103a3432903a37b5b2b71037bbb732b960691b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808201808211156104a4576104a46121fb565b60008251612236818460208701611d85565b9190910192915050565b601f82111561067857600081815260208120601f850160051c810160208610156122675750805b601f850160051c820191505b8181101561228657828155600101612273565b505050505050565b815167ffffffffffffffff8111156122a8576122a8611f28565b6122bc816122b68454612147565b84612240565b602080601f8311600181146122f157600084156122d95750858301515b600019600386901b1c1916600185901b178555612286565b600085815260208120601f198616915b8281101561232057888601518255948401946001909101908401612301565b508582101561233e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600083516123f7818460208801611d85565b83519083019061240b818360208801611d85565b01949350505050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161244c816017850160208801611d85565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161247d816028840160208801611d85565b01602801949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906124bc90830184611da9565b9695505050505050565b6000602082840312156124d857600080fd5b815161182481611d52565b80820281158282048414176104a4576104a46121fb565b634e487b7160e01b600052603260045260246000fd5b60008161251f5761251f6121fb565b50600019019056fea26469706673582212205dc3729172fd03ef60d0fc4816bdad5e8731fdeaa616b6b685f68da09ca9027664736f6c63430008110033