craft-nft

A standalone NFT implementation for real-world arts and crafts assets
Log | Files | Refs | README

commit e1e3b1b9fa021214e69ce526d31b34bd21715c08
parent 368075314cff0fcf6c9b0f1f342b6689e08cb264
Author: lash <dev@holbrook.no>
Date:   Wed, 22 Feb 2023 17:59:22 +0000

Add unbounded batch functionality

Diffstat:
Mjs/contract/CraftNFT.bin | 4++--
Mjs/contract/CraftNFT.json | 2+-
Mjs/qrread.js | 3+++
Mpython/craft_nft/data/CraftNFT.bin | 4++--
Mpython/craft_nft/data/CraftNFT.json | 2+-
Mpython/craft_nft/nft.py | 23+++++++++++++++++++++--
Mpython/tests/test_basic.py | 45+++++++++++++++++++++++++++++++++++++++++++++
Msolidity/CraftNFT.sol | 46+++++++++++++++++++++++++++++++++-------------
8 files changed, 108 insertions(+), 21 deletions(-)

diff --git a/js/contract/CraftNFT.bin b/js/contract/CraftNFT.bin @@ -1 +1 @@ -60806040523480156200001157600080fd5b506040516200489938038062004899833981810160405281019062000037919062000279565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b8190555082600890816200008f919062000564565b508160099081620000a1919062000564565b505050506200064b565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200011482620000c9565b810181811067ffffffffffffffff82111715620001365762000135620000da565b5b80604052505050565b60006200014b620000ab565b905062000159828262000109565b919050565b600067ffffffffffffffff8211156200017c576200017b620000da565b5b6200018782620000c9565b9050602081019050919050565b60005b83811015620001b457808201518184015260208101905062000197565b60008484015250505050565b6000620001d7620001d1846200015e565b6200013f565b905082815260208101848484011115620001f657620001f5620000c4565b5b6200020384828562000194565b509392505050565b600082601f830112620002235762000222620000bf565b5b815162000235848260208601620001c0565b91505092915050565b6000819050919050565b62000253816200023e565b81146200025f57600080fd5b50565b600081519050620002738162000248565b92915050565b600080600060608486031215620002955762000294620000b5565b5b600084015167ffffffffffffffff811115620002b657620002b5620000ba565b5b620002c4868287016200020b565b935050602084015167ffffffffffffffff811115620002e857620002e7620000ba565b5b620002f6868287016200020b565b9250506040620003098682870162000262565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036657607f821691505b6020821081036200037c576200037b6200031e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620003e97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003a7565b620003f58683620003a7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004426200043c62000436846200040d565b62000417565b6200040d565b9050919050565b6000819050919050565b6200045e8362000421565b620004766200046d8262000449565b848454620003b7565b825550505050565b600090565b6200048d6200047e565b6200049a81848462000453565b505050565b5b81811015620004c257620004b660008262000483565b600181019050620004a0565b5050565b601f8211156200051157620004db8162000382565b620004e68462000397565b81016020851015620004f6578190505b6200050e620005058562000397565b8301826200049f565b50505b505050565b60008160020a8304905092915050565b6000620005396000198460080262000516565b1980831691505092915050565b600062000554838362000526565b9150826002028217905092915050565b6200056f8262000313565b67ffffffffffffffff8111156200058b576200058a620000da565b5b6200059782546200034d565b620005a4828285620004c6565b600060209050601f831160018114620005dc5760008415620005c7578287015190505b620005d3858262000546565b86555062000643565b601f198416620005ec8662000382565b60005b828110156200061657848901518255600182019150602085019450602081019050620005ef565b8683101562000636578489015162000632601f89168262000526565b8355505b6001600288020188555050505b505050505050565b61423e806200065b6000396000f3fe608060405260043610610200576000357c01000000000000000000000000000000000000000000000000000000009004806369e85c711161011f578063b88d4fde116100b2578063da2824a811610081578063da2824a8146107a8578063e985e9c5146107d1578063f117e1731461080e578063f9613ab21461084b57610200565b8063b88d4fde146106d5578063c87b56dd146106f1578063c9796c391461072e578063d824ee4f1461076b57610200565b8063a22cb465116100ee578063a22cb46514610607578063adf288df14610630578063b1a6afd31461066d578063b242e5341461069857610200565b806369e85c711461053757806370a08231146105745780638da5cb5b146105b157806395d89b41146105dc57610200565b806340c84b0e116101975780634f64b2be116101665780634f64b2be14610455578063559f5dc9146104925780635ae06f7e146104d15780636352211e146104fa57610200565b806340c84b0e146103a857806342842e0e146103d357806349f2553a146103ef5780634d03546a1461041857610200565b806323b872dd116101d357806323b872dd146102d557806324e0febc146102f15780632b29ba231461032e5780633fd2f5931461036b57610200565b806301ffc9a71461020557806306fdde0314610242578063081812fc1461026d57806318160ddd146102aa575b600080fd5b34801561021157600080fd5b5061022c6004803603810190610227919061332c565b610888565b6040516102399190613374565b60405180910390f35b34801561024e57600080fd5b506102576109dc565b604051610264919061341f565b60405180910390f35b34801561027957600080fd5b50610294600480360381019061028f9190613477565b610a6a565b6040516102a191906134e5565b60405180910390f35b3480156102b657600080fd5b506102bf610aa7565b6040516102cc919061350f565b60405180910390f35b6102ef60048036038101906102ea9190613556565b610ab1565b005b3480156102fd57600080fd5b50610318600480360381019061031391906135df565b610b1c565b604051610325919061361b565b60405180910390f35b34801561033a57600080fd5b5061035560048036038101906103509190613636565b610b34565b6040516103629190613374565b60405180910390f35b34801561037757600080fd5b50610392600480360381019061038d91906135df565b610be0565b60405161039f91906136b8565b60405180910390f35b3480156103b457600080fd5b506103bd610f3f565b6040516103ca91906136b8565b60405180910390f35b6103ed60048036038101906103e89190613556565b610fcd565b005b3480156103fb57600080fd5b506104166004803603810190610411919061380f565b611038565b005b34801561042457600080fd5b5061043f600480360381019061043a9190613896565b611350565b60405161044c9190613374565b60405180910390f35b34801561046157600080fd5b5061047c60048036038101906104779190613477565b61162e565b604051610489919061361b565b60405180910390f35b34801561049e57600080fd5b506104b960048036038101906104b491906138d6565b611652565b6040516104c893929190613925565b60405180910390f35b3480156104dd57600080fd5b506104f860048036038101906104f39190613636565b6116c6565b005b34801561050657600080fd5b50610521600480360381019061051c9190613477565b6117e5565b60405161052e91906134e5565b60405180910390f35b34801561054357600080fd5b5061055e600480360381019061055991906135df565b611821565b60405161056b919061341f565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190613636565b611a3a565b6040516105a8919061350f565b60405180910390f35b3480156105bd57600080fd5b506105c6611a83565b6040516105d391906134e5565b60405180910390f35b3480156105e857600080fd5b506105f1611aa7565b6040516105fe919061341f565b60405180910390f35b34801561061357600080fd5b5061062e60048036038101906106299190613988565b611b35565b005b34801561063c57600080fd5b50610657600480360381019061065291906139c8565b611dd7565b604051610664919061361b565b60405180910390f35b34801561067957600080fd5b50610682612049565b60405161068f919061361b565b60405180910390f35b3480156106a457600080fd5b506106bf60048036038101906106ba9190613988565b61204f565b6040516106cc9190613374565b60405180910390f35b6106ef60048036038101906106ea9190613aa9565b612130565b005b3480156106fd57600080fd5b5061071860048036038101906107139190613477565b61220b565b604051610725919061341f565b60405180910390f35b34801561073a57600080fd5b50610755600480360381019061075091906135df565b61227d565b604051610762919061341f565b60405180910390f35b34801561077757600080fd5b50610792600480360381019061078d9190613b66565b612677565b60405161079f919061361b565b60405180910390f35b3480156107b457600080fd5b506107cf60048036038101906107ca9190613636565b61287e565b005b3480156107dd57600080fd5b506107f860048036038101906107f39190613bb9565b612966565b6040516108059190613374565b60405180910390f35b34801561081a57600080fd5b5061083560048036038101906108309190613bf9565b6129fe565b604051610842919061361b565b60405180910390f35b34801561085757600080fd5b50610872600480360381019061086d91906135df565b612b57565b60405161087f919061361b565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036108dc57600190506109d7565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361092e57600190506109d7565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361098057600190506109d7565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109d257600190506109d7565b600090505b919050565b600880546109e990613c8f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1590613c8f565b8015610a625780601f10610a3757610100808354040283529160200191610a62565b820191906000526020600020905b815481529060010190602001808311610a4557829003601f168201915b505050505081565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a54905090565b610abc838383612c03565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610bd9575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b606080600080604067ffffffffffffffff811115610c0157610c006136e4565b5b6040519080825280601f01601f191660200182016040528015610c335781602001600182028036833780820191505090505b5092506000905060005b6020811015610f3357600460f0878360208110610c5d57610c5c613cc0565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015610d3557603083610ccc9190613d2b565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610d0157610d00613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610da7565b605783610d429190613d2b565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610d7757610d76613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868260208110610dbc57610dbb613cc0565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015610e9357603083610e1e9190613d2b565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610e4e9190613d60565b81518110610e5f57610e5e613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610f11565b605783610ea09190613d2b565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610ed09190613d60565b81518110610ee157610ee0613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282610f1e9190613d60565b91508080610f2b90613d94565b915050610c3d565b50829350505050919050565b600c8054610f4c90613c8f565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7890613c8f565b8015610fc55780601f10610f9a57610100808354040283529160200191610fc5565b820191906000526020600020905b815481529060010190602001808311610fa857829003601f168201915b505050505081565b610fd8838383612c03565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461109557600080fd5b82915081519050602f7f010000000000000000000000000000000000000000000000000000000000000002826001836110ce9190613ddc565b815181106110df576110de613cc0565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461115f57808061115b90613d94565b9150505b8067ffffffffffffffff811115611179576111786136e4565b5b6040519080825280601f01601f1916602001820160405280156111ab5781602001600182028036833780820191505090505b50600c90816111ba9190613fc2565b5060005b82518110156112ab578281815181106111da576111d9613cc0565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600c82815461123290613c8f565b811061124157611240613cc0565b5b8154600116156112605790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806112a390613d94565b9150506111be565b508151811461134b577f2f00000000000000000000000000000000000000000000000000000000000000600c835181546112e490613c8f565b81106112f3576112f2613cc0565b5b8154600116156113125790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806113f65750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6113ff57600080fd5b61140761328d565b6004600086815260200190815260200160002080549050915060008211156114845760006004600087815260200190815260200160002060008154811061145157611450613cc0565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161161148357600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff0219169083151502179055505050600385908060018154018082558091505060019003906000526020600020016000909190919091505560008465ffffffffffff16036115a9576001600a600082825461159d9190613d60565b925050819055506115cb565b8365ffffffffffff16600a60008282546115c39190613d60565b925050819055505b8365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c3428760405161161a919061361b565b60405180910390a360019250505092915050565b6003818154811061163e57600080fd5b906000526020600020016000915090505481565b6004602052816000526040600020818154811061166e57600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061174b575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61178a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611781906140e0565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061183185610be0565b9150600c805461184090613c8f565b905090508082516118519190613d60565b67ffffffffffffffff81111561186a576118696136e4565b5b6040519080825280601f01601f19166020018201604052801561189c5781602001600182028036833780820191505090505b50925060005b8181101561196157600c8181546118b890613c8f565b81106118c7576118c6613cc0565b5b8154600116156118e65790600052602060002090602091828204019190065b9054901a7f01000000000000000000000000000000000000000000000000000000000000000284828151811061191f5761191e613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061195990613d94565b9150506118a2565b5060005b8251811015611a2e5782818151811061198157611980613cc0565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028483815181106119de576119dd613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180611a1890613d94565b9250508080611a2690613d94565b915050611965565b50829350505050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60098054611ab490613c8f565b80601f0160208091040260200160405190810160405280929190818152602001828054611ae090613c8f565b8015611b2d5780601f10611b0257610100808354040283529160200191611b2d565b820191906000526020600020905b815481529060010190602001808311611b1057829003601f168201915b505050505081565b8015611c5657600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bd357600080fd5b81600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611d6e565b600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611cee57600080fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dcb9190613374565b60405180910390a35050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611e7d5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611e8657600080fd5b6001600460008581526020019081526020016000208054905014611ea957600080fd5b600060046000858152602001908152602001600020600081548110611ed157611ed0613cc0565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff1614611f0357600080fd5b6000600102600560008581526020019081526020016000205414611f2657600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1690507fc000000000000000000000000000000000000000000000000000000000000000811790508060010260056000858152602001908152602001600020819055506001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fcf9190613d60565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560019004604051612037919061350f565b60405180910390a38291505092915050565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120aa57600080fd5b600260009054906101000a900460ff16156120c457600080fd5b81156120e6576001600260006101000a81548160ff0219169083151502179055505b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905092915050565b61213b848484612c03565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e846121f090614125565b6040516121fd919061361b565b60405180910390a450505050565b6060600082600102905060006004600083815260200190815260200160002080549050036122465761223c81612b57565b9050806001900492505b600060046000838152602001908152602001600020805490501161226957600080fd5b61227583600102611821565b915050919050565b6060806060600061228d85610be0565b9150604767ffffffffffffffff8111156122aa576122a96136e4565b5b6040519080825280601f01601f1916602001820160405280156122dc5781602001600182028036833780820191505090505b5092507f73000000000000000000000000000000000000000000000000000000000000008360008151811061231457612313613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f68000000000000000000000000000000000000000000000000000000000000008360018151811061237857612377613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f6100000000000000000000000000000000000000000000000000000000000000836002815181106123dc576123db613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3200000000000000000000000000000000000000000000000000000000000000836003815181106124405761243f613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3500000000000000000000000000000000000000000000000000000000000000836004815181106124a4576124a3613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f36000000000000000000000000000000000000000000000000000000000000008360058151811061250857612507613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3a000000000000000000000000000000000000000000000000000000000000008360068151811061256c5761256b613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506007905060005b604081101561266b578281815181106125be576125bd613cc0565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000284838151811061261b5761261a613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818061265590613d94565b925050808061266390613d94565b9150506125a2565b50829350505050919050565b600080600460008581526020019081526020016000208361ffff16815481106126a3576126a2613cc0565b5b90600052602060002001905080600001600c9054906101000a900460ff16156126cb57600080fd5b60008361ffff161480156126fd575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b1561275c5760018160000160068282829054906101000a900465ffffffffffff16612728919061418c565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055506127548585611dd7565b915050612877565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806127ff5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61280857600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff161061285057600080fd5b6128738585858460000160069054906101000a900465ffffffffffff1685612f1a565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461290c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612903906140e0565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008173ffffffffffffffffffffffffffffffffffffffff16600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff1681548110612a2a57612a29613cc0565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612ad95750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612ae257600080fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff1611612b0d57600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff1610612b3f57600080fd5b612b4c8686868685612f1a565b915050949350505050565b60008060056000848152602001908152602001600020549050612b7981613198565b612b8257600080fd5b612b8b816131ca565b15612b995782915050612bfe565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612c5a919061350f565b602060405180830381865afa158015612c77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c9b91906141db565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612cd557600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612e09573373ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612dff57503373ffffffffffffffffffffffffffffffffffffffff16600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b612e0857600080fd5b5b60006006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612e6682846131fc565b6001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612eb69190613ddc565b925050819055506001600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f0d9190613d60565b9250508190555050505050565b6000806000807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008860019004169250603067ffffffffffffffff8861ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16831792508565ffffffffffff16831792508260010290506000600102600560008381526020019081526020016000205414612fad57600080fd5b84600001600c9054906101000a900460ff1661300f578460000160069054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff161461300e57600185600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff886001900416915060b8829060020a0291507f8000000000000000000000000000000000000000000000000000000000000000821791508873ffffffffffffffffffffffffffffffffffffffff168217915060018560000160068282829054906101000a900465ffffffffffff16613090919061418c565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055508160010260056000838152602001908152602001600020819055506001600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461311d9190613d60565b925050819055508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051613181919061350f565b60405180910390a380935050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b60008083600102905060056000828152602001908152602001600020546001900491506000820361322c57600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613309816132d4565b811461331457600080fd5b50565b60008135905061332681613300565b92915050565b600060208284031215613342576133416132ca565b5b600061335084828501613317565b91505092915050565b60008115159050919050565b61336e81613359565b82525050565b60006020820190506133896000830184613365565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156133c95780820151818401526020810190506133ae565b60008484015250505050565b6000601f19601f8301169050919050565b60006133f18261338f565b6133fb818561339a565b935061340b8185602086016133ab565b613414816133d5565b840191505092915050565b6000602082019050818103600083015261343981846133e6565b905092915050565b6000819050919050565b61345481613441565b811461345f57600080fd5b50565b6000813590506134718161344b565b92915050565b60006020828403121561348d5761348c6132ca565b5b600061349b84828501613462565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006134cf826134a4565b9050919050565b6134df816134c4565b82525050565b60006020820190506134fa60008301846134d6565b92915050565b61350981613441565b82525050565b60006020820190506135246000830184613500565b92915050565b613533816134c4565b811461353e57600080fd5b50565b6000813590506135508161352a565b92915050565b60008060006060848603121561356f5761356e6132ca565b5b600061357d86828701613541565b935050602061358e86828701613541565b925050604061359f86828701613462565b9150509250925092565b6000819050919050565b6135bc816135a9565b81146135c757600080fd5b50565b6000813590506135d9816135b3565b92915050565b6000602082840312156135f5576135f46132ca565b5b6000613603848285016135ca565b91505092915050565b613615816135a9565b82525050565b6000602082019050613630600083018461360c565b92915050565b60006020828403121561364c5761364b6132ca565b5b600061365a84828501613541565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061368a82613663565b613694818561366e565b93506136a48185602086016133ab565b6136ad816133d5565b840191505092915050565b600060208201905081810360008301526136d2818461367f565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61371c826133d5565b810181811067ffffffffffffffff8211171561373b5761373a6136e4565b5b80604052505050565b600061374e6132c0565b905061375a8282613713565b919050565b600067ffffffffffffffff82111561377a576137796136e4565b5b613783826133d5565b9050602081019050919050565b82818337600083830152505050565b60006137b26137ad8461375f565b613744565b9050828152602081018484840111156137ce576137cd6136df565b5b6137d9848285613790565b509392505050565b600082601f8301126137f6576137f56136da565b5b813561380684826020860161379f565b91505092915050565b600060208284031215613825576138246132ca565b5b600082013567ffffffffffffffff811115613843576138426132cf565b5b61384f848285016137e1565b91505092915050565b600065ffffffffffff82169050919050565b61387381613858565b811461387e57600080fd5b50565b6000813590506138908161386a565b92915050565b600080604083850312156138ad576138ac6132ca565b5b60006138bb858286016135ca565b92505060206138cc85828601613881565b9150509250929050565b600080604083850312156138ed576138ec6132ca565b5b60006138fb858286016135ca565b925050602061390c85828601613462565b9150509250929050565b61391f81613858565b82525050565b600060608201905061393a6000830186613916565b6139476020830185613916565b6139546040830184613365565b949350505050565b61396581613359565b811461397057600080fd5b50565b6000813590506139828161395c565b92915050565b6000806040838503121561399f5761399e6132ca565b5b60006139ad85828601613541565b92505060206139be85828601613973565b9150509250929050565b600080604083850312156139df576139de6132ca565b5b60006139ed85828601613541565b92505060206139fe858286016135ca565b9150509250929050565b600067ffffffffffffffff821115613a2357613a226136e4565b5b613a2c826133d5565b9050602081019050919050565b6000613a4c613a4784613a08565b613744565b905082815260208101848484011115613a6857613a676136df565b5b613a73848285613790565b509392505050565b600082601f830112613a9057613a8f6136da565b5b8135613aa0848260208601613a39565b91505092915050565b60008060008060808587031215613ac357613ac26132ca565b5b6000613ad187828801613541565b9450506020613ae287828801613541565b9350506040613af387828801613462565b925050606085013567ffffffffffffffff811115613b1457613b136132cf565b5b613b2087828801613a7b565b91505092959194509250565b600061ffff82169050919050565b613b4381613b2c565b8114613b4e57600080fd5b50565b600081359050613b6081613b3a565b92915050565b600080600060608486031215613b7f57613b7e6132ca565b5b6000613b8d86828701613541565b9350506020613b9e868287016135ca565b9250506040613baf86828701613b51565b9150509250925092565b60008060408385031215613bd057613bcf6132ca565b5b6000613bde85828601613541565b9250506020613bef85828601613541565b9150509250929050565b60008060008060808587031215613c1357613c126132ca565b5b6000613c2187828801613541565b9450506020613c32878288016135ca565b9350506040613c4387828801613b51565b9250506060613c5487828801613881565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ca757607f821691505b602082108103613cba57613cb9613c60565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d3682613cef565b9150613d4183613cef565b9250828201905060ff811115613d5a57613d59613cfc565b5b92915050565b6000613d6b82613441565b9150613d7683613441565b9250828201905080821115613d8e57613d8d613cfc565b5b92915050565b6000613d9f82613441565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613dd157613dd0613cfc565b5b600182019050919050565b6000613de782613441565b9150613df283613441565b9250828203905081811115613e0a57613e09613cfc565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302613e757fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613e35565b613e7f8683613e35565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613ebc613eb7613eb284613441565b613e97565b613441565b9050919050565b6000819050919050565b613ed683613ea1565b613eea613ee282613ec3565b848454613e45565b825550505050565b600090565b613eff613ef2565b613f0a818484613ecd565b505050565b5b81811015613f2e57613f23600082613ef7565b600181019050613f10565b5050565b601f821115613f7357613f4481613e10565b613f4d84613e25565b81016020851015613f5c578190505b613f70613f6885613e25565b830182613f0f565b50505b505050565b60008160020a8304905092915050565b6000613f9960001984600802613f78565b1980831691505092915050565b6000613fb28383613f88565b9150826002028217905092915050565b613fcb82613663565b67ffffffffffffffff811115613fe457613fe36136e4565b5b613fee8254613c8f565b613ff9828285613f32565b600060209050601f83116001811461402c576000841561401a578287015190505b6140248582613fa6565b86555061408c565b601f19841661403a86613e10565b60005b828110156140625784890151825560018201915060208501945060208101905061403d565b8683101561407f578489015161407b601f891682613f88565b8355505b6001600288020188555050505b505050505050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006140ca600a8361339a565b91506140d582614094565b602082019050919050565b600060208201905081810360008301526140f9816140bd565b9050919050565b6000819050602082019050919050565b600061411c82516135a9565b80915050919050565b600061413082613663565b8261413a84614100565b905061414581614110565b92506020821015614185576141807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802613e35565b831692505b5050919050565b600061419782613858565b91506141a283613858565b9250828201905065ffffffffffff8111156141c0576141bf613cfc565b5b92915050565b6000815190506141d58161352a565b92915050565b6000602082840312156141f1576141f06132ca565b5b60006141ff848285016141c6565b9150509291505056fea2646970667358221220a4af5fe38235e6966c14266548b35f81299d92794a1448e534de90d1ab82258264736f6c63430008120033 -\ No newline at end of file +60806040523480156200001157600080fd5b5060405162004e3238038062004e32833981810160405281019062000037919062000279565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b8190555082600890816200008f919062000564565b508160099081620000a1919062000564565b505050506200064b565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200011482620000c9565b810181811067ffffffffffffffff82111715620001365762000135620000da565b5b80604052505050565b60006200014b620000ab565b905062000159828262000109565b919050565b600067ffffffffffffffff8211156200017c576200017b620000da565b5b6200018782620000c9565b9050602081019050919050565b60005b83811015620001b457808201518184015260208101905062000197565b60008484015250505050565b6000620001d7620001d1846200015e565b6200013f565b905082815260208101848484011115620001f657620001f5620000c4565b5b6200020384828562000194565b509392505050565b600082601f830112620002235762000222620000bf565b5b815162000235848260208601620001c0565b91505092915050565b6000819050919050565b62000253816200023e565b81146200025f57600080fd5b50565b600081519050620002738162000248565b92915050565b600080600060608486031215620002955762000294620000b5565b5b600084015167ffffffffffffffff811115620002b657620002b5620000ba565b5b620002c4868287016200020b565b935050602084015167ffffffffffffffff811115620002e857620002e7620000ba565b5b620002f6868287016200020b565b9250506040620003098682870162000262565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036657607f821691505b6020821081036200037c576200037b6200031e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620003e97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003a7565b620003f58683620003a7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004426200043c62000436846200040d565b62000417565b6200040d565b9050919050565b6000819050919050565b6200045e8362000421565b620004766200046d8262000449565b848454620003b7565b825550505050565b600090565b6200048d6200047e565b6200049a81848462000453565b505050565b5b81811015620004c257620004b660008262000483565b600181019050620004a0565b5050565b601f8211156200051157620004db8162000382565b620004e68462000397565b81016020851015620004f6578190505b6200050e620005058562000397565b8301826200049f565b50505b505050565b60008160020a8304905092915050565b6000620005396000198460080262000516565b1980831691505092915050565b600062000554838362000526565b9150826002028217905092915050565b6200056f8262000313565b67ffffffffffffffff8111156200058b576200058a620000da565b5b6200059782546200034d565b620005a4828285620004c6565b600060209050601f831160018114620005dc5760008415620005c7578287015190505b620005d3858262000546565b86555062000643565b601f198416620005ec8662000382565b60005b828110156200061657848901518255600182019150602085019450602081019050620005ef565b8683101562000636578489015162000632601f89168262000526565b8355505b6001600288020188555050505b505050505050565b6147d7806200065b6000396000f3fe60806040526004361061020b576000357c01000000000000000000000000000000000000000000000000000000009004806370a082311161012a578063c6eba7c4116100bd578063da2824a81161008c578063da2824a8146107a0578063e985e9c5146107c9578063f117e17314610806578063f70a3de814610843578063f9613ab2146108805761020b565b8063c6eba7c4146106c0578063c87b56dd146106e9578063c9796c3914610726578063d824ee4f146107635761020b565b8063adf288df116100f9578063adf288df146105ff578063b1a6afd31461063c578063b242e53414610667578063b88d4fde146106a45761020b565b806370a08231146105435780638da5cb5b1461058057806395d89b41146105ab578063a22cb465146105d65761020b565b806340c84b0e116101a2578063559f5dc911610171578063559f5dc9146104605780635ae06f7e146104a05780636352211e146104c957806369e85c71146105065761020b565b806340c84b0e146103b357806342842e0e146103de57806349f2553a146103fa5780634f64b2be146104235761020b565b806323b872dd116101de57806323b872dd146102e057806324e0febc146102fc5780632b29ba23146103395780633fd2f593146103765761020b565b806301ffc9a71461021057806306fdde031461024d578063081812fc1461027857806318160ddd146102b5575b600080fd5b34801561021c57600080fd5b50610237600480360381019061023291906136e7565b6108bd565b604051610244919061372f565b60405180910390f35b34801561025957600080fd5b50610262610a11565b60405161026f91906137da565b60405180910390f35b34801561028457600080fd5b5061029f600480360381019061029a9190613832565b610a9f565b6040516102ac91906138a0565b60405180910390f35b3480156102c157600080fd5b506102ca610adc565b6040516102d791906138ca565b60405180910390f35b6102fa60048036038101906102f59190613911565b610ae6565b005b34801561030857600080fd5b50610323600480360381019061031e919061399a565b610b51565b60405161033091906139d6565b60405180910390f35b34801561034557600080fd5b50610360600480360381019061035b91906139f1565b610b69565b60405161036d919061372f565b60405180910390f35b34801561038257600080fd5b5061039d6004803603810190610398919061399a565b610c15565b6040516103aa9190613a73565b60405180910390f35b3480156103bf57600080fd5b506103c8610f74565b6040516103d59190613a73565b60405180910390f35b6103f860048036038101906103f39190613911565b611002565b005b34801561040657600080fd5b50610421600480360381019061041c9190613bca565b61106d565b005b34801561042f57600080fd5b5061044a60048036038101906104459190613832565b611385565b60405161045791906139d6565b60405180910390f35b34801561046c57600080fd5b5061048760048036038101906104829190613c13565b6113a9565b6040516104979493929190613c74565b60405180910390f35b3480156104ac57600080fd5b506104c760048036038101906104c291906139f1565b611430565b005b3480156104d557600080fd5b506104f060048036038101906104eb9190613832565b61154f565b6040516104fd91906138a0565b60405180910390f35b34801561051257600080fd5b5061052d6004803603810190610528919061399a565b61158b565b60405161053a91906137da565b60405180910390f35b34801561054f57600080fd5b5061056a600480360381019061056591906139f1565b6117a4565b60405161057791906138ca565b60405180910390f35b34801561058c57600080fd5b506105956117ed565b6040516105a291906138a0565b60405180910390f35b3480156105b757600080fd5b506105c0611811565b6040516105cd91906137da565b60405180910390f35b3480156105e257600080fd5b506105fd60048036038101906105f89190613ce5565b61189f565b005b34801561060b57600080fd5b5061062660048036038101906106219190613d25565b611b41565b60405161063391906139d6565b60405180910390f35b34801561064857600080fd5b50610651611db3565b60405161065e91906139d6565b60405180910390f35b34801561067357600080fd5b5061068e60048036038101906106899190613ce5565b611db9565b60405161069b919061372f565b60405180910390f35b6106be60048036038101906106b99190613e06565b611e9a565b005b3480156106cc57600080fd5b506106e760048036038101906106e29190613eef565b611f75565b005b3480156106f557600080fd5b50610710600480360381019061070b9190613832565b612103565b60405161071d91906137da565b60405180910390f35b34801561073257600080fd5b5061074d6004803603810190610748919061399a565b612175565b60405161075a91906137da565b60405180910390f35b34801561076f57600080fd5b5061078a60048036038101906107859190613f42565b61256f565b60405161079791906139d6565b60405180910390f35b3480156107ac57600080fd5b506107c760048036038101906107c291906139f1565b612814565b005b3480156107d557600080fd5b506107f060048036038101906107eb9190613f95565b6128fc565b6040516107fd919061372f565b60405180910390f35b34801561081257600080fd5b5061082d60048036038101906108289190613fd5565b612994565b60405161083a91906139d6565b60405180910390f35b34801561084f57600080fd5b5061086a60048036038101906108659190614075565b612b23565b604051610877919061372f565b60405180910390f35b34801561088c57600080fd5b506108a760048036038101906108a2919061399a565b612e90565b6040516108b491906139d6565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109115760019050610a0c565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109635760019050610a0c565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109b55760019050610a0c565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a075760019050610a0c565b600090505b919050565b60088054610a1e906140e4565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4a906140e4565b8015610a975780601f10610a6c57610100808354040283529160200191610a97565b820191906000526020600020905b815481529060010190602001808311610a7a57829003601f168201915b505050505081565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a54905090565b610af1838383612f3c565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610c0e575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b606080600080604067ffffffffffffffff811115610c3657610c35613a9f565b5b6040519080825280601f01601f191660200182016040528015610c685781602001600182028036833780820191505090505b5092506000905060005b6020811015610f6857600460f0878360208110610c9257610c91614115565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015610d6a57603083610d019190614180565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610d3657610d35614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610ddc565b605783610d779190614180565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610dac57610dab614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868260208110610df157610df0614115565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015610ec857603083610e539190614180565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610e8391906141b5565b81518110610e9457610e93614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610f46565b605783610ed59190614180565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610f0591906141b5565b81518110610f1657610f15614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282610f5391906141b5565b91508080610f60906141e9565b915050610c72565b50829350505050919050565b600c8054610f81906140e4565b80601f0160208091040260200160405190810160405280929190818152602001828054610fad906140e4565b8015610ffa5780601f10610fcf57610100808354040283529160200191610ffa565b820191906000526020600020905b815481529060010190602001808311610fdd57829003601f168201915b505050505081565b61100d838383612f3c565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110ca57600080fd5b82915081519050602f7f010000000000000000000000000000000000000000000000000000000000000002826001836111039190614231565b8151811061111457611113614115565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611194578080611190906141e9565b9150505b8067ffffffffffffffff8111156111ae576111ad613a9f565b5b6040519080825280601f01601f1916602001820160405280156111e05781602001600182028036833780820191505090505b50600c90816111ef9190614417565b5060005b82518110156112e05782818151811061120f5761120e614115565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600c828154611267906140e4565b811061127657611275614115565b5b8154600116156112955790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806112d8906141e9565b9150506111f3565b5081518114611380577f2f00000000000000000000000000000000000000000000000000000000000000600c83518154611319906140e4565b811061132857611327614115565b5b8154600116156113475790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b6003818154811061139557600080fd5b906000526020600020016000915090505481565b600460205281600052604060002081815481106113c557600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff169080600001600d9054906101000a900460ff16905084565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806114b5575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114eb90614535565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061159b85610c15565b9150600c80546115aa906140e4565b905090508082516115bb91906141b5565b67ffffffffffffffff8111156115d4576115d3613a9f565b5b6040519080825280601f01601f1916602001820160405280156116065781602001600182028036833780820191505090505b50925060005b818110156116cb57600c818154611622906140e4565b811061163157611630614115565b5b8154600116156116505790600052602060002090602091828204019190065b9054901a7f01000000000000000000000000000000000000000000000000000000000000000284828151811061168957611688614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806116c3906141e9565b91505061160c565b5060005b8251811015611798578281815181106116eb576116ea614115565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000284838151811061174857611747614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180611782906141e9565b9250508080611790906141e9565b9150506116cf565b50829350505050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6009805461181e906140e4565b80601f016020809104026020016040519081016040528092919081815260200182805461184a906140e4565b80156118975780601f1061186c57610100808354040283529160200191611897565b820191906000526020600020905b81548152906001019060200180831161187a57829003601f168201915b505050505081565b80156119c057600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461193d57600080fd5b81600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611ad8565b600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611a5857600080fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b35919061372f565b60405180910390a35050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611be75750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611bf057600080fd5b6001600460008581526020019081526020016000208054905014611c1357600080fd5b600060046000858152602001908152602001600020600081548110611c3b57611c3a614115565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff1614611c6d57600080fd5b6000600102600560008581526020019081526020016000205414611c9057600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1690507fc000000000000000000000000000000000000000000000000000000000000000811790508060010260056000858152602001908152602001600020819055506001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d3991906141b5565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560019004604051611da191906138ca565b60405180910390a38291505092915050565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e1457600080fd5b600260009054906101000a900460ff1615611e2e57600080fd5b8115611e50576001600260006101000a81548160ff0219169083151502179055505b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905092915050565b611ea5848484612f3c565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e84611f5a9061457a565b604051611f6791906139d6565b60405180910390a450505050565b6000600460008581526020019081526020016000208361ffff1681548110611fa057611f9f614115565b5b90600052602060002001905080600001600c9054906101000a900460ff1615611ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff59061462d565b60405180910390fd5b80600001600d9054906101000a900460ff1615612050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204790614699565b60405180910390fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168265ffffffffffff1610156120b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b090614705565b60405180910390fd5b818160000160006101000a81548165ffffffffffff021916908365ffffffffffff160217905550600181600001600d6101000a81548160ff02191690831515021790555050505050565b60606000826001029050600060046000838152602001908152602001600020805490500361213e5761213481612e90565b9050806001900492505b600060046000838152602001908152602001600020805490501161216157600080fd5b61216d8360010261158b565b915050919050565b6060806060600061218585610c15565b9150604767ffffffffffffffff8111156121a2576121a1613a9f565b5b6040519080825280601f01601f1916602001820160405280156121d45781602001600182028036833780820191505090505b5092507f73000000000000000000000000000000000000000000000000000000000000008360008151811061220c5761220b614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f6800000000000000000000000000000000000000000000000000000000000000836001815181106122705761226f614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f6100000000000000000000000000000000000000000000000000000000000000836002815181106122d4576122d3614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f32000000000000000000000000000000000000000000000000000000000000008360038151811061233857612337614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f35000000000000000000000000000000000000000000000000000000000000008360048151811061239c5761239b614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f360000000000000000000000000000000000000000000000000000000000000083600581518110612400576123ff614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3a000000000000000000000000000000000000000000000000000000000000008360068151811061246457612463614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506007905060005b6040811015612563578281815181106124b6576124b5614115565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000284838151811061251357612512614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818061254d906141e9565b925050808061255b906141e9565b91505061249a565b50829350505050919050565b600080600460008581526020019081526020016000208361ffff168154811061259b5761259a614115565b5b90600052602060002001905080600001600c9054906101000a900460ff16156125f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f09061462d565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061269c5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6126db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d290614535565b60405180910390fd5b60008361ffff1614801561270d575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b8015612727575080600001600d9054906101000a900460ff165b156127865760018160000160068282829054906101000a900465ffffffffffff166127529190614725565b92506101000a81548165ffffffffffff021916908365ffffffffffff16021790555061277e8585611b41565b91505061280d565b80600001600d9054906101000a900460ff16156127e6578060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff16106127e557600080fd5b5b6128098585858460000160069054906101000a900465ffffffffffff1685613253565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146128a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289990614535565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008173ffffffffffffffffffffffffffffffffffffffff16600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff16815481106129c0576129bf614115565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612a6f5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa590614535565b60405180910390fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff1611612ad957600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff1610612b0b57600080fd5b612b188686868685613253565b915050949350505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612bc95750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bff90614535565b60405180910390fd5b612c1061363f565b600460008681526020019081526020016000208054905091506000821115612c8d57600060046000878152602001908152602001600020600081548110612c5a57612c59614115565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff1611612c8c57600080fd5b5b60008460050b03612cc85760018160600190151590811515815250506001600a6000828254612cbc91906141b5565b92505081905550612d28565b60008460050b1315612d275783816000019065ffffffffffff16908165ffffffffffff16815250506001816060019015159081151581525050806000015165ffffffffffff16600a6000828254612d1f91906141b5565b925050819055505b5b60046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff021916908315150217905550606082015181600001600d6101000a81548160ff0219169083151502179055505050600385908060018154018082558091505060019003906000526020600020016000909190919091505580606001511515816000015165ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f77d96978d8b40ac826d1984d992e71a84672e62d825fda78cd646656481d065b88604051612e7c91906139d6565b60405180910390a460019250505092915050565b60008060056000848152602001908152602001600020549050612eb28161354a565b612ebb57600080fd5b612ec48161357c565b15612ed25782915050612f37565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612f9391906138ca565b602060405180830381865afa158015612fb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd49190614774565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461300e57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614613142573373ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061313857503373ffffffffffffffffffffffffffffffffffffffff16600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61314157600080fd5b5b60006006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061319f82846135ae565b6001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131ef9190614231565b925050819055506001600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461324691906141b5565b9250508190555050505050565b6000806000807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008860019004169250603067ffffffffffffffff8861ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16831792508565ffffffffffff168317925082600102905060006001026005600083815260200190815260200160002054146132e657600080fd5b84600001600c9054906101000a900460ff16613348578460000160069054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff161461334757600185600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff886001900416915060b8829060020a0291507f8000000000000000000000000000000000000000000000000000000000000000821791508873ffffffffffffffffffffffffffffffffffffffff168217915060018560000160068282829054906101000a900465ffffffffffff166133c99190614725565b92506101000a81548165ffffffffffff021916908365ffffffffffff16021790555084600001600d9054906101000a900460ff166134645760018560000160008282829054906101000a900465ffffffffffff166134279190614725565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055506001600a600082825461345c91906141b5565b925050819055505b8160010260056000838152602001908152602001600020819055506001600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134cf91906141b5565b925050819055508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161353391906138ca565b60405180910390a380935050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000808360010290506005600082815260200190815260200160002054600190049150600082036135de57600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060800160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6136c48161368f565b81146136cf57600080fd5b50565b6000813590506136e1816136bb565b92915050565b6000602082840312156136fd576136fc613685565b5b600061370b848285016136d2565b91505092915050565b60008115159050919050565b61372981613714565b82525050565b60006020820190506137446000830184613720565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613784578082015181840152602081019050613769565b60008484015250505050565b6000601f19601f8301169050919050565b60006137ac8261374a565b6137b68185613755565b93506137c6818560208601613766565b6137cf81613790565b840191505092915050565b600060208201905081810360008301526137f481846137a1565b905092915050565b6000819050919050565b61380f816137fc565b811461381a57600080fd5b50565b60008135905061382c81613806565b92915050565b60006020828403121561384857613847613685565b5b60006138568482850161381d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061388a8261385f565b9050919050565b61389a8161387f565b82525050565b60006020820190506138b56000830184613891565b92915050565b6138c4816137fc565b82525050565b60006020820190506138df60008301846138bb565b92915050565b6138ee8161387f565b81146138f957600080fd5b50565b60008135905061390b816138e5565b92915050565b60008060006060848603121561392a57613929613685565b5b6000613938868287016138fc565b9350506020613949868287016138fc565b925050604061395a8682870161381d565b9150509250925092565b6000819050919050565b61397781613964565b811461398257600080fd5b50565b6000813590506139948161396e565b92915050565b6000602082840312156139b0576139af613685565b5b60006139be84828501613985565b91505092915050565b6139d081613964565b82525050565b60006020820190506139eb60008301846139c7565b92915050565b600060208284031215613a0757613a06613685565b5b6000613a15848285016138fc565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000613a4582613a1e565b613a4f8185613a29565b9350613a5f818560208601613766565b613a6881613790565b840191505092915050565b60006020820190508181036000830152613a8d8184613a3a565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613ad782613790565b810181811067ffffffffffffffff82111715613af657613af5613a9f565b5b80604052505050565b6000613b0961367b565b9050613b158282613ace565b919050565b600067ffffffffffffffff821115613b3557613b34613a9f565b5b613b3e82613790565b9050602081019050919050565b82818337600083830152505050565b6000613b6d613b6884613b1a565b613aff565b905082815260208101848484011115613b8957613b88613a9a565b5b613b94848285613b4b565b509392505050565b600082601f830112613bb157613bb0613a95565b5b8135613bc1848260208601613b5a565b91505092915050565b600060208284031215613be057613bdf613685565b5b600082013567ffffffffffffffff811115613bfe57613bfd61368a565b5b613c0a84828501613b9c565b91505092915050565b60008060408385031215613c2a57613c29613685565b5b6000613c3885828601613985565b9250506020613c498582860161381d565b9150509250929050565b600065ffffffffffff82169050919050565b613c6e81613c53565b82525050565b6000608082019050613c896000830187613c65565b613c966020830186613c65565b613ca36040830185613720565b613cb06060830184613720565b95945050505050565b613cc281613714565b8114613ccd57600080fd5b50565b600081359050613cdf81613cb9565b92915050565b60008060408385031215613cfc57613cfb613685565b5b6000613d0a858286016138fc565b9250506020613d1b85828601613cd0565b9150509250929050565b60008060408385031215613d3c57613d3b613685565b5b6000613d4a858286016138fc565b9250506020613d5b85828601613985565b9150509250929050565b600067ffffffffffffffff821115613d8057613d7f613a9f565b5b613d8982613790565b9050602081019050919050565b6000613da9613da484613d65565b613aff565b905082815260208101848484011115613dc557613dc4613a9a565b5b613dd0848285613b4b565b509392505050565b600082601f830112613ded57613dec613a95565b5b8135613dfd848260208601613d96565b91505092915050565b60008060008060808587031215613e2057613e1f613685565b5b6000613e2e878288016138fc565b9450506020613e3f878288016138fc565b9350506040613e508782880161381d565b925050606085013567ffffffffffffffff811115613e7157613e7061368a565b5b613e7d87828801613dd8565b91505092959194509250565b600061ffff82169050919050565b613ea081613e89565b8114613eab57600080fd5b50565b600081359050613ebd81613e97565b92915050565b613ecc81613c53565b8114613ed757600080fd5b50565b600081359050613ee981613ec3565b92915050565b600080600060608486031215613f0857613f07613685565b5b6000613f1686828701613985565b9350506020613f2786828701613eae565b9250506040613f3886828701613eda565b9150509250925092565b600080600060608486031215613f5b57613f5a613685565b5b6000613f69868287016138fc565b9350506020613f7a86828701613985565b9250506040613f8b86828701613eae565b9150509250925092565b60008060408385031215613fac57613fab613685565b5b6000613fba858286016138fc565b9250506020613fcb858286016138fc565b9150509250929050565b60008060008060808587031215613fef57613fee613685565b5b6000613ffd878288016138fc565b945050602061400e87828801613985565b935050604061401f87828801613eae565b925050606061403087828801613eda565b91505092959194509250565b60008160050b9050919050565b6140528161403c565b811461405d57600080fd5b50565b60008135905061406f81614049565b92915050565b6000806040838503121561408c5761408b613685565b5b600061409a85828601613985565b92505060206140ab85828601614060565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806140fc57607f821691505b60208210810361410f5761410e6140b5565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061418b82614144565b915061419683614144565b9250828201905060ff8111156141af576141ae614151565b5b92915050565b60006141c0826137fc565b91506141cb836137fc565b92508282019050808211156141e3576141e2614151565b5b92915050565b60006141f4826137fc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361422657614225614151565b5b600182019050919050565b600061423c826137fc565b9150614247836137fc565b925082820390508181111561425f5761425e614151565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b6000600883026142ca7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261428a565b6142d4868361428a565b95508019841693508086168417925050509392505050565b6000819050919050565b600061431161430c614307846137fc565b6142ec565b6137fc565b9050919050565b6000819050919050565b61432b836142f6565b61433f61433782614318565b84845461429a565b825550505050565b600090565b614354614347565b61435f818484614322565b505050565b5b818110156143835761437860008261434c565b600181019050614365565b5050565b601f8211156143c85761439981614265565b6143a28461427a565b810160208510156143b1578190505b6143c56143bd8561427a565b830182614364565b50505b505050565b60008160020a8304905092915050565b60006143ee600019846008026143cd565b1980831691505092915050565b600061440783836143dd565b9150826002028217905092915050565b61442082613a1e565b67ffffffffffffffff81111561443957614438613a9f565b5b61444382546140e4565b61444e828285614387565b600060209050601f831160018114614481576000841561446f578287015190505b61447985826143fb565b8655506144e1565b601f19841661448f86614265565b60005b828110156144b757848901518255600182019150602085019450602081019050614492565b868310156144d457848901516144d0601f8916826143dd565b8355505b6001600288020188555050505b505050505050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061451f600a83613755565b915061452a826144e9565b602082019050919050565b6000602082019050818103600083015261454e81614512565b9050919050565b6000819050602082019050919050565b60006145718251613964565b80915050919050565b600061458582613a1e565b8261458f84614555565b905061459a81614565565b925060208210156145da576145d57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8360200360080261428a565b831692505b5050919050565b7f4552525f53504152534500000000000000000000000000000000000000000000600082015250565b6000614617600a83613755565b9150614622826145e1565b602082019050919050565b600060208201905081810360008301526146468161460a565b9050919050565b7f4552525f43415050454400000000000000000000000000000000000000000000600082015250565b6000614683600a83613755565b915061468e8261464d565b602082019050919050565b600060208201905081810360008301526146b281614676565b9050919050565b7f4552525f4341505f4c4f57000000000000000000000000000000000000000000600082015250565b60006146ef600b83613755565b91506146fa826146b9565b602082019050919050565b6000602082019050818103600083015261471e816146e2565b9050919050565b600061473082613c53565b915061473b83613c53565b9250828201905065ffffffffffff81111561475957614758614151565b5b92915050565b60008151905061476e816138e5565b92915050565b60006020828403121561478a57614789613685565b5b60006147988482850161475f565b9150509291505056fea26469706673582212209832c65cee22fc017db822d90ff9954969b15c3a4cea7123bdd545203784fe5564736f6c63430008120033 +\ No newline at end of file diff --git a/js/contract/CraftNFT.json b/js/contract/CraftNFT.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","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":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","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"},{"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"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"deleteWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","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":"address","name":"_writer","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"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":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bool","name":"_final","type":"bool"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":true,"internalType":"bool","name":"_capped","type":"bool"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","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":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","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"},{"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"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"int48","name":"count","type":"int48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"deleteWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","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":"address","name":"_writer","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_cap","type":"uint48"}],"name":"setCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"},{"internalType":"bool","name":"capped","type":"bool"}],"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":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bool","name":"_final","type":"bool"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/js/qrread.js b/js/qrread.js @@ -385,3 +385,6 @@ const nftAbi = [{"inputs":[{"internalType":"string","name":"_name","type":"strin const erc20Abi = [{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"TransferFrom","type":"event"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]; +const writerAbi = [{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_writer","type":"address"}],"name":"WriterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_writer","type":"address"}],"name":"WriterRemoved","type":"event"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"deleteWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_idx","type":"uint256"}],"name":"writers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]; + +const expireAbi = [{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]; diff --git a/python/craft_nft/data/CraftNFT.bin b/python/craft_nft/data/CraftNFT.bin @@ -1 +1 @@ -60806040523480156200001157600080fd5b506040516200489938038062004899833981810160405281019062000037919062000279565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b8190555082600890816200008f919062000564565b508160099081620000a1919062000564565b505050506200064b565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200011482620000c9565b810181811067ffffffffffffffff82111715620001365762000135620000da565b5b80604052505050565b60006200014b620000ab565b905062000159828262000109565b919050565b600067ffffffffffffffff8211156200017c576200017b620000da565b5b6200018782620000c9565b9050602081019050919050565b60005b83811015620001b457808201518184015260208101905062000197565b60008484015250505050565b6000620001d7620001d1846200015e565b6200013f565b905082815260208101848484011115620001f657620001f5620000c4565b5b6200020384828562000194565b509392505050565b600082601f830112620002235762000222620000bf565b5b815162000235848260208601620001c0565b91505092915050565b6000819050919050565b62000253816200023e565b81146200025f57600080fd5b50565b600081519050620002738162000248565b92915050565b600080600060608486031215620002955762000294620000b5565b5b600084015167ffffffffffffffff811115620002b657620002b5620000ba565b5b620002c4868287016200020b565b935050602084015167ffffffffffffffff811115620002e857620002e7620000ba565b5b620002f6868287016200020b565b9250506040620003098682870162000262565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036657607f821691505b6020821081036200037c576200037b6200031e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620003e97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003a7565b620003f58683620003a7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004426200043c62000436846200040d565b62000417565b6200040d565b9050919050565b6000819050919050565b6200045e8362000421565b620004766200046d8262000449565b848454620003b7565b825550505050565b600090565b6200048d6200047e565b6200049a81848462000453565b505050565b5b81811015620004c257620004b660008262000483565b600181019050620004a0565b5050565b601f8211156200051157620004db8162000382565b620004e68462000397565b81016020851015620004f6578190505b6200050e620005058562000397565b8301826200049f565b50505b505050565b60008160020a8304905092915050565b6000620005396000198460080262000516565b1980831691505092915050565b600062000554838362000526565b9150826002028217905092915050565b6200056f8262000313565b67ffffffffffffffff8111156200058b576200058a620000da565b5b6200059782546200034d565b620005a4828285620004c6565b600060209050601f831160018114620005dc5760008415620005c7578287015190505b620005d3858262000546565b86555062000643565b601f198416620005ec8662000382565b60005b828110156200061657848901518255600182019150602085019450602081019050620005ef565b8683101562000636578489015162000632601f89168262000526565b8355505b6001600288020188555050505b505050505050565b61423e806200065b6000396000f3fe608060405260043610610200576000357c01000000000000000000000000000000000000000000000000000000009004806369e85c711161011f578063b88d4fde116100b2578063da2824a811610081578063da2824a8146107a8578063e985e9c5146107d1578063f117e1731461080e578063f9613ab21461084b57610200565b8063b88d4fde146106d5578063c87b56dd146106f1578063c9796c391461072e578063d824ee4f1461076b57610200565b8063a22cb465116100ee578063a22cb46514610607578063adf288df14610630578063b1a6afd31461066d578063b242e5341461069857610200565b806369e85c711461053757806370a08231146105745780638da5cb5b146105b157806395d89b41146105dc57610200565b806340c84b0e116101975780634f64b2be116101665780634f64b2be14610455578063559f5dc9146104925780635ae06f7e146104d15780636352211e146104fa57610200565b806340c84b0e146103a857806342842e0e146103d357806349f2553a146103ef5780634d03546a1461041857610200565b806323b872dd116101d357806323b872dd146102d557806324e0febc146102f15780632b29ba231461032e5780633fd2f5931461036b57610200565b806301ffc9a71461020557806306fdde0314610242578063081812fc1461026d57806318160ddd146102aa575b600080fd5b34801561021157600080fd5b5061022c6004803603810190610227919061332c565b610888565b6040516102399190613374565b60405180910390f35b34801561024e57600080fd5b506102576109dc565b604051610264919061341f565b60405180910390f35b34801561027957600080fd5b50610294600480360381019061028f9190613477565b610a6a565b6040516102a191906134e5565b60405180910390f35b3480156102b657600080fd5b506102bf610aa7565b6040516102cc919061350f565b60405180910390f35b6102ef60048036038101906102ea9190613556565b610ab1565b005b3480156102fd57600080fd5b50610318600480360381019061031391906135df565b610b1c565b604051610325919061361b565b60405180910390f35b34801561033a57600080fd5b5061035560048036038101906103509190613636565b610b34565b6040516103629190613374565b60405180910390f35b34801561037757600080fd5b50610392600480360381019061038d91906135df565b610be0565b60405161039f91906136b8565b60405180910390f35b3480156103b457600080fd5b506103bd610f3f565b6040516103ca91906136b8565b60405180910390f35b6103ed60048036038101906103e89190613556565b610fcd565b005b3480156103fb57600080fd5b506104166004803603810190610411919061380f565b611038565b005b34801561042457600080fd5b5061043f600480360381019061043a9190613896565b611350565b60405161044c9190613374565b60405180910390f35b34801561046157600080fd5b5061047c60048036038101906104779190613477565b61162e565b604051610489919061361b565b60405180910390f35b34801561049e57600080fd5b506104b960048036038101906104b491906138d6565b611652565b6040516104c893929190613925565b60405180910390f35b3480156104dd57600080fd5b506104f860048036038101906104f39190613636565b6116c6565b005b34801561050657600080fd5b50610521600480360381019061051c9190613477565b6117e5565b60405161052e91906134e5565b60405180910390f35b34801561054357600080fd5b5061055e600480360381019061055991906135df565b611821565b60405161056b919061341f565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190613636565b611a3a565b6040516105a8919061350f565b60405180910390f35b3480156105bd57600080fd5b506105c6611a83565b6040516105d391906134e5565b60405180910390f35b3480156105e857600080fd5b506105f1611aa7565b6040516105fe919061341f565b60405180910390f35b34801561061357600080fd5b5061062e60048036038101906106299190613988565b611b35565b005b34801561063c57600080fd5b50610657600480360381019061065291906139c8565b611dd7565b604051610664919061361b565b60405180910390f35b34801561067957600080fd5b50610682612049565b60405161068f919061361b565b60405180910390f35b3480156106a457600080fd5b506106bf60048036038101906106ba9190613988565b61204f565b6040516106cc9190613374565b60405180910390f35b6106ef60048036038101906106ea9190613aa9565b612130565b005b3480156106fd57600080fd5b5061071860048036038101906107139190613477565b61220b565b604051610725919061341f565b60405180910390f35b34801561073a57600080fd5b50610755600480360381019061075091906135df565b61227d565b604051610762919061341f565b60405180910390f35b34801561077757600080fd5b50610792600480360381019061078d9190613b66565b612677565b60405161079f919061361b565b60405180910390f35b3480156107b457600080fd5b506107cf60048036038101906107ca9190613636565b61287e565b005b3480156107dd57600080fd5b506107f860048036038101906107f39190613bb9565b612966565b6040516108059190613374565b60405180910390f35b34801561081a57600080fd5b5061083560048036038101906108309190613bf9565b6129fe565b604051610842919061361b565b60405180910390f35b34801561085757600080fd5b50610872600480360381019061086d91906135df565b612b57565b60405161087f919061361b565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036108dc57600190506109d7565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361092e57600190506109d7565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361098057600190506109d7565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109d257600190506109d7565b600090505b919050565b600880546109e990613c8f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1590613c8f565b8015610a625780601f10610a3757610100808354040283529160200191610a62565b820191906000526020600020905b815481529060010190602001808311610a4557829003601f168201915b505050505081565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a54905090565b610abc838383612c03565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610bd9575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b606080600080604067ffffffffffffffff811115610c0157610c006136e4565b5b6040519080825280601f01601f191660200182016040528015610c335781602001600182028036833780820191505090505b5092506000905060005b6020811015610f3357600460f0878360208110610c5d57610c5c613cc0565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015610d3557603083610ccc9190613d2b565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610d0157610d00613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610da7565b605783610d429190613d2b565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610d7757610d76613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868260208110610dbc57610dbb613cc0565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015610e9357603083610e1e9190613d2b565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610e4e9190613d60565b81518110610e5f57610e5e613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610f11565b605783610ea09190613d2b565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610ed09190613d60565b81518110610ee157610ee0613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282610f1e9190613d60565b91508080610f2b90613d94565b915050610c3d565b50829350505050919050565b600c8054610f4c90613c8f565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7890613c8f565b8015610fc55780601f10610f9a57610100808354040283529160200191610fc5565b820191906000526020600020905b815481529060010190602001808311610fa857829003601f168201915b505050505081565b610fd8838383612c03565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461109557600080fd5b82915081519050602f7f010000000000000000000000000000000000000000000000000000000000000002826001836110ce9190613ddc565b815181106110df576110de613cc0565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461115f57808061115b90613d94565b9150505b8067ffffffffffffffff811115611179576111786136e4565b5b6040519080825280601f01601f1916602001820160405280156111ab5781602001600182028036833780820191505090505b50600c90816111ba9190613fc2565b5060005b82518110156112ab578281815181106111da576111d9613cc0565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600c82815461123290613c8f565b811061124157611240613cc0565b5b8154600116156112605790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806112a390613d94565b9150506111be565b508151811461134b577f2f00000000000000000000000000000000000000000000000000000000000000600c835181546112e490613c8f565b81106112f3576112f2613cc0565b5b8154600116156113125790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806113f65750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6113ff57600080fd5b61140761328d565b6004600086815260200190815260200160002080549050915060008211156114845760006004600087815260200190815260200160002060008154811061145157611450613cc0565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161161148357600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff0219169083151502179055505050600385908060018154018082558091505060019003906000526020600020016000909190919091505560008465ffffffffffff16036115a9576001600a600082825461159d9190613d60565b925050819055506115cb565b8365ffffffffffff16600a60008282546115c39190613d60565b925050819055505b8365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c3428760405161161a919061361b565b60405180910390a360019250505092915050565b6003818154811061163e57600080fd5b906000526020600020016000915090505481565b6004602052816000526040600020818154811061166e57600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061174b575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61178a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611781906140e0565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061183185610be0565b9150600c805461184090613c8f565b905090508082516118519190613d60565b67ffffffffffffffff81111561186a576118696136e4565b5b6040519080825280601f01601f19166020018201604052801561189c5781602001600182028036833780820191505090505b50925060005b8181101561196157600c8181546118b890613c8f565b81106118c7576118c6613cc0565b5b8154600116156118e65790600052602060002090602091828204019190065b9054901a7f01000000000000000000000000000000000000000000000000000000000000000284828151811061191f5761191e613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061195990613d94565b9150506118a2565b5060005b8251811015611a2e5782818151811061198157611980613cc0565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028483815181106119de576119dd613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180611a1890613d94565b9250508080611a2690613d94565b915050611965565b50829350505050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60098054611ab490613c8f565b80601f0160208091040260200160405190810160405280929190818152602001828054611ae090613c8f565b8015611b2d5780601f10611b0257610100808354040283529160200191611b2d565b820191906000526020600020905b815481529060010190602001808311611b1057829003601f168201915b505050505081565b8015611c5657600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bd357600080fd5b81600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611d6e565b600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611cee57600080fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dcb9190613374565b60405180910390a35050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611e7d5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611e8657600080fd5b6001600460008581526020019081526020016000208054905014611ea957600080fd5b600060046000858152602001908152602001600020600081548110611ed157611ed0613cc0565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff1614611f0357600080fd5b6000600102600560008581526020019081526020016000205414611f2657600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1690507fc000000000000000000000000000000000000000000000000000000000000000811790508060010260056000858152602001908152602001600020819055506001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fcf9190613d60565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560019004604051612037919061350f565b60405180910390a38291505092915050565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120aa57600080fd5b600260009054906101000a900460ff16156120c457600080fd5b81156120e6576001600260006101000a81548160ff0219169083151502179055505b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905092915050565b61213b848484612c03565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e846121f090614125565b6040516121fd919061361b565b60405180910390a450505050565b6060600082600102905060006004600083815260200190815260200160002080549050036122465761223c81612b57565b9050806001900492505b600060046000838152602001908152602001600020805490501161226957600080fd5b61227583600102611821565b915050919050565b6060806060600061228d85610be0565b9150604767ffffffffffffffff8111156122aa576122a96136e4565b5b6040519080825280601f01601f1916602001820160405280156122dc5781602001600182028036833780820191505090505b5092507f73000000000000000000000000000000000000000000000000000000000000008360008151811061231457612313613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f68000000000000000000000000000000000000000000000000000000000000008360018151811061237857612377613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f6100000000000000000000000000000000000000000000000000000000000000836002815181106123dc576123db613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3200000000000000000000000000000000000000000000000000000000000000836003815181106124405761243f613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3500000000000000000000000000000000000000000000000000000000000000836004815181106124a4576124a3613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f36000000000000000000000000000000000000000000000000000000000000008360058151811061250857612507613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3a000000000000000000000000000000000000000000000000000000000000008360068151811061256c5761256b613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506007905060005b604081101561266b578281815181106125be576125bd613cc0565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000284838151811061261b5761261a613cc0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818061265590613d94565b925050808061266390613d94565b9150506125a2565b50829350505050919050565b600080600460008581526020019081526020016000208361ffff16815481106126a3576126a2613cc0565b5b90600052602060002001905080600001600c9054906101000a900460ff16156126cb57600080fd5b60008361ffff161480156126fd575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b1561275c5760018160000160068282829054906101000a900465ffffffffffff16612728919061418c565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055506127548585611dd7565b915050612877565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806127ff5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61280857600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff161061285057600080fd5b6128738585858460000160069054906101000a900465ffffffffffff1685612f1a565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461290c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612903906140e0565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008173ffffffffffffffffffffffffffffffffffffffff16600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff1681548110612a2a57612a29613cc0565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612ad95750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612ae257600080fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff1611612b0d57600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff1610612b3f57600080fd5b612b4c8686868685612f1a565b915050949350505050565b60008060056000848152602001908152602001600020549050612b7981613198565b612b8257600080fd5b612b8b816131ca565b15612b995782915050612bfe565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612c5a919061350f565b602060405180830381865afa158015612c77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c9b91906141db565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612cd557600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612e09573373ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612dff57503373ffffffffffffffffffffffffffffffffffffffff16600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b612e0857600080fd5b5b60006006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612e6682846131fc565b6001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612eb69190613ddc565b925050819055506001600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f0d9190613d60565b9250508190555050505050565b6000806000807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008860019004169250603067ffffffffffffffff8861ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16831792508565ffffffffffff16831792508260010290506000600102600560008381526020019081526020016000205414612fad57600080fd5b84600001600c9054906101000a900460ff1661300f578460000160069054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff161461300e57600185600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff886001900416915060b8829060020a0291507f8000000000000000000000000000000000000000000000000000000000000000821791508873ffffffffffffffffffffffffffffffffffffffff168217915060018560000160068282829054906101000a900465ffffffffffff16613090919061418c565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055508160010260056000838152602001908152602001600020819055506001600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461311d9190613d60565b925050819055508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051613181919061350f565b60405180910390a380935050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b60008083600102905060056000828152602001908152602001600020546001900491506000820361322c57600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613309816132d4565b811461331457600080fd5b50565b60008135905061332681613300565b92915050565b600060208284031215613342576133416132ca565b5b600061335084828501613317565b91505092915050565b60008115159050919050565b61336e81613359565b82525050565b60006020820190506133896000830184613365565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156133c95780820151818401526020810190506133ae565b60008484015250505050565b6000601f19601f8301169050919050565b60006133f18261338f565b6133fb818561339a565b935061340b8185602086016133ab565b613414816133d5565b840191505092915050565b6000602082019050818103600083015261343981846133e6565b905092915050565b6000819050919050565b61345481613441565b811461345f57600080fd5b50565b6000813590506134718161344b565b92915050565b60006020828403121561348d5761348c6132ca565b5b600061349b84828501613462565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006134cf826134a4565b9050919050565b6134df816134c4565b82525050565b60006020820190506134fa60008301846134d6565b92915050565b61350981613441565b82525050565b60006020820190506135246000830184613500565b92915050565b613533816134c4565b811461353e57600080fd5b50565b6000813590506135508161352a565b92915050565b60008060006060848603121561356f5761356e6132ca565b5b600061357d86828701613541565b935050602061358e86828701613541565b925050604061359f86828701613462565b9150509250925092565b6000819050919050565b6135bc816135a9565b81146135c757600080fd5b50565b6000813590506135d9816135b3565b92915050565b6000602082840312156135f5576135f46132ca565b5b6000613603848285016135ca565b91505092915050565b613615816135a9565b82525050565b6000602082019050613630600083018461360c565b92915050565b60006020828403121561364c5761364b6132ca565b5b600061365a84828501613541565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061368a82613663565b613694818561366e565b93506136a48185602086016133ab565b6136ad816133d5565b840191505092915050565b600060208201905081810360008301526136d2818461367f565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61371c826133d5565b810181811067ffffffffffffffff8211171561373b5761373a6136e4565b5b80604052505050565b600061374e6132c0565b905061375a8282613713565b919050565b600067ffffffffffffffff82111561377a576137796136e4565b5b613783826133d5565b9050602081019050919050565b82818337600083830152505050565b60006137b26137ad8461375f565b613744565b9050828152602081018484840111156137ce576137cd6136df565b5b6137d9848285613790565b509392505050565b600082601f8301126137f6576137f56136da565b5b813561380684826020860161379f565b91505092915050565b600060208284031215613825576138246132ca565b5b600082013567ffffffffffffffff811115613843576138426132cf565b5b61384f848285016137e1565b91505092915050565b600065ffffffffffff82169050919050565b61387381613858565b811461387e57600080fd5b50565b6000813590506138908161386a565b92915050565b600080604083850312156138ad576138ac6132ca565b5b60006138bb858286016135ca565b92505060206138cc85828601613881565b9150509250929050565b600080604083850312156138ed576138ec6132ca565b5b60006138fb858286016135ca565b925050602061390c85828601613462565b9150509250929050565b61391f81613858565b82525050565b600060608201905061393a6000830186613916565b6139476020830185613916565b6139546040830184613365565b949350505050565b61396581613359565b811461397057600080fd5b50565b6000813590506139828161395c565b92915050565b6000806040838503121561399f5761399e6132ca565b5b60006139ad85828601613541565b92505060206139be85828601613973565b9150509250929050565b600080604083850312156139df576139de6132ca565b5b60006139ed85828601613541565b92505060206139fe858286016135ca565b9150509250929050565b600067ffffffffffffffff821115613a2357613a226136e4565b5b613a2c826133d5565b9050602081019050919050565b6000613a4c613a4784613a08565b613744565b905082815260208101848484011115613a6857613a676136df565b5b613a73848285613790565b509392505050565b600082601f830112613a9057613a8f6136da565b5b8135613aa0848260208601613a39565b91505092915050565b60008060008060808587031215613ac357613ac26132ca565b5b6000613ad187828801613541565b9450506020613ae287828801613541565b9350506040613af387828801613462565b925050606085013567ffffffffffffffff811115613b1457613b136132cf565b5b613b2087828801613a7b565b91505092959194509250565b600061ffff82169050919050565b613b4381613b2c565b8114613b4e57600080fd5b50565b600081359050613b6081613b3a565b92915050565b600080600060608486031215613b7f57613b7e6132ca565b5b6000613b8d86828701613541565b9350506020613b9e868287016135ca565b9250506040613baf86828701613b51565b9150509250925092565b60008060408385031215613bd057613bcf6132ca565b5b6000613bde85828601613541565b9250506020613bef85828601613541565b9150509250929050565b60008060008060808587031215613c1357613c126132ca565b5b6000613c2187828801613541565b9450506020613c32878288016135ca565b9350506040613c4387828801613b51565b9250506060613c5487828801613881565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ca757607f821691505b602082108103613cba57613cb9613c60565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d3682613cef565b9150613d4183613cef565b9250828201905060ff811115613d5a57613d59613cfc565b5b92915050565b6000613d6b82613441565b9150613d7683613441565b9250828201905080821115613d8e57613d8d613cfc565b5b92915050565b6000613d9f82613441565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613dd157613dd0613cfc565b5b600182019050919050565b6000613de782613441565b9150613df283613441565b9250828203905081811115613e0a57613e09613cfc565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302613e757fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613e35565b613e7f8683613e35565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613ebc613eb7613eb284613441565b613e97565b613441565b9050919050565b6000819050919050565b613ed683613ea1565b613eea613ee282613ec3565b848454613e45565b825550505050565b600090565b613eff613ef2565b613f0a818484613ecd565b505050565b5b81811015613f2e57613f23600082613ef7565b600181019050613f10565b5050565b601f821115613f7357613f4481613e10565b613f4d84613e25565b81016020851015613f5c578190505b613f70613f6885613e25565b830182613f0f565b50505b505050565b60008160020a8304905092915050565b6000613f9960001984600802613f78565b1980831691505092915050565b6000613fb28383613f88565b9150826002028217905092915050565b613fcb82613663565b67ffffffffffffffff811115613fe457613fe36136e4565b5b613fee8254613c8f565b613ff9828285613f32565b600060209050601f83116001811461402c576000841561401a578287015190505b6140248582613fa6565b86555061408c565b601f19841661403a86613e10565b60005b828110156140625784890151825560018201915060208501945060208101905061403d565b8683101561407f578489015161407b601f891682613f88565b8355505b6001600288020188555050505b505050505050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006140ca600a8361339a565b91506140d582614094565b602082019050919050565b600060208201905081810360008301526140f9816140bd565b9050919050565b6000819050602082019050919050565b600061411c82516135a9565b80915050919050565b600061413082613663565b8261413a84614100565b905061414581614110565b92506020821015614185576141807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802613e35565b831692505b5050919050565b600061419782613858565b91506141a283613858565b9250828201905065ffffffffffff8111156141c0576141bf613cfc565b5b92915050565b6000815190506141d58161352a565b92915050565b6000602082840312156141f1576141f06132ca565b5b60006141ff848285016141c6565b9150509291505056fea2646970667358221220a4af5fe38235e6966c14266548b35f81299d92794a1448e534de90d1ab82258264736f6c63430008120033 -\ No newline at end of file +60806040523480156200001157600080fd5b5060405162004e3238038062004e32833981810160405281019062000037919062000279565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b8190555082600890816200008f919062000564565b508160099081620000a1919062000564565b505050506200064b565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200011482620000c9565b810181811067ffffffffffffffff82111715620001365762000135620000da565b5b80604052505050565b60006200014b620000ab565b905062000159828262000109565b919050565b600067ffffffffffffffff8211156200017c576200017b620000da565b5b6200018782620000c9565b9050602081019050919050565b60005b83811015620001b457808201518184015260208101905062000197565b60008484015250505050565b6000620001d7620001d1846200015e565b6200013f565b905082815260208101848484011115620001f657620001f5620000c4565b5b6200020384828562000194565b509392505050565b600082601f830112620002235762000222620000bf565b5b815162000235848260208601620001c0565b91505092915050565b6000819050919050565b62000253816200023e565b81146200025f57600080fd5b50565b600081519050620002738162000248565b92915050565b600080600060608486031215620002955762000294620000b5565b5b600084015167ffffffffffffffff811115620002b657620002b5620000ba565b5b620002c4868287016200020b565b935050602084015167ffffffffffffffff811115620002e857620002e7620000ba565b5b620002f6868287016200020b565b9250506040620003098682870162000262565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036657607f821691505b6020821081036200037c576200037b6200031e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620003e97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003a7565b620003f58683620003a7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004426200043c62000436846200040d565b62000417565b6200040d565b9050919050565b6000819050919050565b6200045e8362000421565b620004766200046d8262000449565b848454620003b7565b825550505050565b600090565b6200048d6200047e565b6200049a81848462000453565b505050565b5b81811015620004c257620004b660008262000483565b600181019050620004a0565b5050565b601f8211156200051157620004db8162000382565b620004e68462000397565b81016020851015620004f6578190505b6200050e620005058562000397565b8301826200049f565b50505b505050565b60008160020a8304905092915050565b6000620005396000198460080262000516565b1980831691505092915050565b600062000554838362000526565b9150826002028217905092915050565b6200056f8262000313565b67ffffffffffffffff8111156200058b576200058a620000da565b5b6200059782546200034d565b620005a4828285620004c6565b600060209050601f831160018114620005dc5760008415620005c7578287015190505b620005d3858262000546565b86555062000643565b601f198416620005ec8662000382565b60005b828110156200061657848901518255600182019150602085019450602081019050620005ef565b8683101562000636578489015162000632601f89168262000526565b8355505b6001600288020188555050505b505050505050565b6147d7806200065b6000396000f3fe60806040526004361061020b576000357c01000000000000000000000000000000000000000000000000000000009004806370a082311161012a578063c6eba7c4116100bd578063da2824a81161008c578063da2824a8146107a0578063e985e9c5146107c9578063f117e17314610806578063f70a3de814610843578063f9613ab2146108805761020b565b8063c6eba7c4146106c0578063c87b56dd146106e9578063c9796c3914610726578063d824ee4f146107635761020b565b8063adf288df116100f9578063adf288df146105ff578063b1a6afd31461063c578063b242e53414610667578063b88d4fde146106a45761020b565b806370a08231146105435780638da5cb5b1461058057806395d89b41146105ab578063a22cb465146105d65761020b565b806340c84b0e116101a2578063559f5dc911610171578063559f5dc9146104605780635ae06f7e146104a05780636352211e146104c957806369e85c71146105065761020b565b806340c84b0e146103b357806342842e0e146103de57806349f2553a146103fa5780634f64b2be146104235761020b565b806323b872dd116101de57806323b872dd146102e057806324e0febc146102fc5780632b29ba23146103395780633fd2f593146103765761020b565b806301ffc9a71461021057806306fdde031461024d578063081812fc1461027857806318160ddd146102b5575b600080fd5b34801561021c57600080fd5b50610237600480360381019061023291906136e7565b6108bd565b604051610244919061372f565b60405180910390f35b34801561025957600080fd5b50610262610a11565b60405161026f91906137da565b60405180910390f35b34801561028457600080fd5b5061029f600480360381019061029a9190613832565b610a9f565b6040516102ac91906138a0565b60405180910390f35b3480156102c157600080fd5b506102ca610adc565b6040516102d791906138ca565b60405180910390f35b6102fa60048036038101906102f59190613911565b610ae6565b005b34801561030857600080fd5b50610323600480360381019061031e919061399a565b610b51565b60405161033091906139d6565b60405180910390f35b34801561034557600080fd5b50610360600480360381019061035b91906139f1565b610b69565b60405161036d919061372f565b60405180910390f35b34801561038257600080fd5b5061039d6004803603810190610398919061399a565b610c15565b6040516103aa9190613a73565b60405180910390f35b3480156103bf57600080fd5b506103c8610f74565b6040516103d59190613a73565b60405180910390f35b6103f860048036038101906103f39190613911565b611002565b005b34801561040657600080fd5b50610421600480360381019061041c9190613bca565b61106d565b005b34801561042f57600080fd5b5061044a60048036038101906104459190613832565b611385565b60405161045791906139d6565b60405180910390f35b34801561046c57600080fd5b5061048760048036038101906104829190613c13565b6113a9565b6040516104979493929190613c74565b60405180910390f35b3480156104ac57600080fd5b506104c760048036038101906104c291906139f1565b611430565b005b3480156104d557600080fd5b506104f060048036038101906104eb9190613832565b61154f565b6040516104fd91906138a0565b60405180910390f35b34801561051257600080fd5b5061052d6004803603810190610528919061399a565b61158b565b60405161053a91906137da565b60405180910390f35b34801561054f57600080fd5b5061056a600480360381019061056591906139f1565b6117a4565b60405161057791906138ca565b60405180910390f35b34801561058c57600080fd5b506105956117ed565b6040516105a291906138a0565b60405180910390f35b3480156105b757600080fd5b506105c0611811565b6040516105cd91906137da565b60405180910390f35b3480156105e257600080fd5b506105fd60048036038101906105f89190613ce5565b61189f565b005b34801561060b57600080fd5b5061062660048036038101906106219190613d25565b611b41565b60405161063391906139d6565b60405180910390f35b34801561064857600080fd5b50610651611db3565b60405161065e91906139d6565b60405180910390f35b34801561067357600080fd5b5061068e60048036038101906106899190613ce5565b611db9565b60405161069b919061372f565b60405180910390f35b6106be60048036038101906106b99190613e06565b611e9a565b005b3480156106cc57600080fd5b506106e760048036038101906106e29190613eef565b611f75565b005b3480156106f557600080fd5b50610710600480360381019061070b9190613832565b612103565b60405161071d91906137da565b60405180910390f35b34801561073257600080fd5b5061074d6004803603810190610748919061399a565b612175565b60405161075a91906137da565b60405180910390f35b34801561076f57600080fd5b5061078a60048036038101906107859190613f42565b61256f565b60405161079791906139d6565b60405180910390f35b3480156107ac57600080fd5b506107c760048036038101906107c291906139f1565b612814565b005b3480156107d557600080fd5b506107f060048036038101906107eb9190613f95565b6128fc565b6040516107fd919061372f565b60405180910390f35b34801561081257600080fd5b5061082d60048036038101906108289190613fd5565b612994565b60405161083a91906139d6565b60405180910390f35b34801561084f57600080fd5b5061086a60048036038101906108659190614075565b612b23565b604051610877919061372f565b60405180910390f35b34801561088c57600080fd5b506108a760048036038101906108a2919061399a565b612e90565b6040516108b491906139d6565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109115760019050610a0c565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109635760019050610a0c565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109b55760019050610a0c565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a075760019050610a0c565b600090505b919050565b60088054610a1e906140e4565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4a906140e4565b8015610a975780601f10610a6c57610100808354040283529160200191610a97565b820191906000526020600020905b815481529060010190602001808311610a7a57829003601f168201915b505050505081565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a54905090565b610af1838383612f3c565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610c0e575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b606080600080604067ffffffffffffffff811115610c3657610c35613a9f565b5b6040519080825280601f01601f191660200182016040528015610c685781602001600182028036833780820191505090505b5092506000905060005b6020811015610f6857600460f0878360208110610c9257610c91614115565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015610d6a57603083610d019190614180565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610d3657610d35614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610ddc565b605783610d779190614180565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610dac57610dab614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868260208110610df157610df0614115565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015610ec857603083610e539190614180565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610e8391906141b5565b81518110610e9457610e93614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610f46565b605783610ed59190614180565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610f0591906141b5565b81518110610f1657610f15614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282610f5391906141b5565b91508080610f60906141e9565b915050610c72565b50829350505050919050565b600c8054610f81906140e4565b80601f0160208091040260200160405190810160405280929190818152602001828054610fad906140e4565b8015610ffa5780601f10610fcf57610100808354040283529160200191610ffa565b820191906000526020600020905b815481529060010190602001808311610fdd57829003601f168201915b505050505081565b61100d838383612f3c565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110ca57600080fd5b82915081519050602f7f010000000000000000000000000000000000000000000000000000000000000002826001836111039190614231565b8151811061111457611113614115565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611194578080611190906141e9565b9150505b8067ffffffffffffffff8111156111ae576111ad613a9f565b5b6040519080825280601f01601f1916602001820160405280156111e05781602001600182028036833780820191505090505b50600c90816111ef9190614417565b5060005b82518110156112e05782818151811061120f5761120e614115565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600c828154611267906140e4565b811061127657611275614115565b5b8154600116156112955790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806112d8906141e9565b9150506111f3565b5081518114611380577f2f00000000000000000000000000000000000000000000000000000000000000600c83518154611319906140e4565b811061132857611327614115565b5b8154600116156113475790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b6003818154811061139557600080fd5b906000526020600020016000915090505481565b600460205281600052604060002081815481106113c557600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff169080600001600d9054906101000a900460ff16905084565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806114b5575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114eb90614535565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061159b85610c15565b9150600c80546115aa906140e4565b905090508082516115bb91906141b5565b67ffffffffffffffff8111156115d4576115d3613a9f565b5b6040519080825280601f01601f1916602001820160405280156116065781602001600182028036833780820191505090505b50925060005b818110156116cb57600c818154611622906140e4565b811061163157611630614115565b5b8154600116156116505790600052602060002090602091828204019190065b9054901a7f01000000000000000000000000000000000000000000000000000000000000000284828151811061168957611688614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806116c3906141e9565b91505061160c565b5060005b8251811015611798578281815181106116eb576116ea614115565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000284838151811061174857611747614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180611782906141e9565b9250508080611790906141e9565b9150506116cf565b50829350505050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6009805461181e906140e4565b80601f016020809104026020016040519081016040528092919081815260200182805461184a906140e4565b80156118975780601f1061186c57610100808354040283529160200191611897565b820191906000526020600020905b81548152906001019060200180831161187a57829003601f168201915b505050505081565b80156119c057600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461193d57600080fd5b81600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611ad8565b600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611a5857600080fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b35919061372f565b60405180910390a35050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611be75750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611bf057600080fd5b6001600460008581526020019081526020016000208054905014611c1357600080fd5b600060046000858152602001908152602001600020600081548110611c3b57611c3a614115565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff1614611c6d57600080fd5b6000600102600560008581526020019081526020016000205414611c9057600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1690507fc000000000000000000000000000000000000000000000000000000000000000811790508060010260056000858152602001908152602001600020819055506001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d3991906141b5565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560019004604051611da191906138ca565b60405180910390a38291505092915050565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e1457600080fd5b600260009054906101000a900460ff1615611e2e57600080fd5b8115611e50576001600260006101000a81548160ff0219169083151502179055505b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905092915050565b611ea5848484612f3c565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e84611f5a9061457a565b604051611f6791906139d6565b60405180910390a450505050565b6000600460008581526020019081526020016000208361ffff1681548110611fa057611f9f614115565b5b90600052602060002001905080600001600c9054906101000a900460ff1615611ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff59061462d565b60405180910390fd5b80600001600d9054906101000a900460ff1615612050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204790614699565b60405180910390fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168265ffffffffffff1610156120b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b090614705565b60405180910390fd5b818160000160006101000a81548165ffffffffffff021916908365ffffffffffff160217905550600181600001600d6101000a81548160ff02191690831515021790555050505050565b60606000826001029050600060046000838152602001908152602001600020805490500361213e5761213481612e90565b9050806001900492505b600060046000838152602001908152602001600020805490501161216157600080fd5b61216d8360010261158b565b915050919050565b6060806060600061218585610c15565b9150604767ffffffffffffffff8111156121a2576121a1613a9f565b5b6040519080825280601f01601f1916602001820160405280156121d45781602001600182028036833780820191505090505b5092507f73000000000000000000000000000000000000000000000000000000000000008360008151811061220c5761220b614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f6800000000000000000000000000000000000000000000000000000000000000836001815181106122705761226f614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f6100000000000000000000000000000000000000000000000000000000000000836002815181106122d4576122d3614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f32000000000000000000000000000000000000000000000000000000000000008360038151811061233857612337614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f35000000000000000000000000000000000000000000000000000000000000008360048151811061239c5761239b614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f360000000000000000000000000000000000000000000000000000000000000083600581518110612400576123ff614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3a000000000000000000000000000000000000000000000000000000000000008360068151811061246457612463614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506007905060005b6040811015612563578281815181106124b6576124b5614115565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000284838151811061251357612512614115565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818061254d906141e9565b925050808061255b906141e9565b91505061249a565b50829350505050919050565b600080600460008581526020019081526020016000208361ffff168154811061259b5761259a614115565b5b90600052602060002001905080600001600c9054906101000a900460ff16156125f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f09061462d565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061269c5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6126db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d290614535565b60405180910390fd5b60008361ffff1614801561270d575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b8015612727575080600001600d9054906101000a900460ff165b156127865760018160000160068282829054906101000a900465ffffffffffff166127529190614725565b92506101000a81548165ffffffffffff021916908365ffffffffffff16021790555061277e8585611b41565b91505061280d565b80600001600d9054906101000a900460ff16156127e6578060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff16106127e557600080fd5b5b6128098585858460000160069054906101000a900465ffffffffffff1685613253565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146128a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289990614535565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008173ffffffffffffffffffffffffffffffffffffffff16600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff16815481106129c0576129bf614115565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612a6f5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa590614535565b60405180910390fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff1611612ad957600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff1610612b0b57600080fd5b612b188686868685613253565b915050949350505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612bc95750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bff90614535565b60405180910390fd5b612c1061363f565b600460008681526020019081526020016000208054905091506000821115612c8d57600060046000878152602001908152602001600020600081548110612c5a57612c59614115565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff1611612c8c57600080fd5b5b60008460050b03612cc85760018160600190151590811515815250506001600a6000828254612cbc91906141b5565b92505081905550612d28565b60008460050b1315612d275783816000019065ffffffffffff16908165ffffffffffff16815250506001816060019015159081151581525050806000015165ffffffffffff16600a6000828254612d1f91906141b5565b925050819055505b5b60046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff021916908315150217905550606082015181600001600d6101000a81548160ff0219169083151502179055505050600385908060018154018082558091505060019003906000526020600020016000909190919091505580606001511515816000015165ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f77d96978d8b40ac826d1984d992e71a84672e62d825fda78cd646656481d065b88604051612e7c91906139d6565b60405180910390a460019250505092915050565b60008060056000848152602001908152602001600020549050612eb28161354a565b612ebb57600080fd5b612ec48161357c565b15612ed25782915050612f37565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612f9391906138ca565b602060405180830381865afa158015612fb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd49190614774565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461300e57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614613142573373ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061313857503373ffffffffffffffffffffffffffffffffffffffff16600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61314157600080fd5b5b60006006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061319f82846135ae565b6001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131ef9190614231565b925050819055506001600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461324691906141b5565b9250508190555050505050565b6000806000807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008860019004169250603067ffffffffffffffff8861ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16831792508565ffffffffffff168317925082600102905060006001026005600083815260200190815260200160002054146132e657600080fd5b84600001600c9054906101000a900460ff16613348578460000160069054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff161461334757600185600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff886001900416915060b8829060020a0291507f8000000000000000000000000000000000000000000000000000000000000000821791508873ffffffffffffffffffffffffffffffffffffffff168217915060018560000160068282829054906101000a900465ffffffffffff166133c99190614725565b92506101000a81548165ffffffffffff021916908365ffffffffffff16021790555084600001600d9054906101000a900460ff166134645760018560000160008282829054906101000a900465ffffffffffff166134279190614725565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055506001600a600082825461345c91906141b5565b925050819055505b8160010260056000838152602001908152602001600020819055506001600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134cf91906141b5565b925050819055508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161353391906138ca565b60405180910390a380935050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000808360010290506005600082815260200190815260200160002054600190049150600082036135de57600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060800160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6136c48161368f565b81146136cf57600080fd5b50565b6000813590506136e1816136bb565b92915050565b6000602082840312156136fd576136fc613685565b5b600061370b848285016136d2565b91505092915050565b60008115159050919050565b61372981613714565b82525050565b60006020820190506137446000830184613720565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613784578082015181840152602081019050613769565b60008484015250505050565b6000601f19601f8301169050919050565b60006137ac8261374a565b6137b68185613755565b93506137c6818560208601613766565b6137cf81613790565b840191505092915050565b600060208201905081810360008301526137f481846137a1565b905092915050565b6000819050919050565b61380f816137fc565b811461381a57600080fd5b50565b60008135905061382c81613806565b92915050565b60006020828403121561384857613847613685565b5b60006138568482850161381d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061388a8261385f565b9050919050565b61389a8161387f565b82525050565b60006020820190506138b56000830184613891565b92915050565b6138c4816137fc565b82525050565b60006020820190506138df60008301846138bb565b92915050565b6138ee8161387f565b81146138f957600080fd5b50565b60008135905061390b816138e5565b92915050565b60008060006060848603121561392a57613929613685565b5b6000613938868287016138fc565b9350506020613949868287016138fc565b925050604061395a8682870161381d565b9150509250925092565b6000819050919050565b61397781613964565b811461398257600080fd5b50565b6000813590506139948161396e565b92915050565b6000602082840312156139b0576139af613685565b5b60006139be84828501613985565b91505092915050565b6139d081613964565b82525050565b60006020820190506139eb60008301846139c7565b92915050565b600060208284031215613a0757613a06613685565b5b6000613a15848285016138fc565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000613a4582613a1e565b613a4f8185613a29565b9350613a5f818560208601613766565b613a6881613790565b840191505092915050565b60006020820190508181036000830152613a8d8184613a3a565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613ad782613790565b810181811067ffffffffffffffff82111715613af657613af5613a9f565b5b80604052505050565b6000613b0961367b565b9050613b158282613ace565b919050565b600067ffffffffffffffff821115613b3557613b34613a9f565b5b613b3e82613790565b9050602081019050919050565b82818337600083830152505050565b6000613b6d613b6884613b1a565b613aff565b905082815260208101848484011115613b8957613b88613a9a565b5b613b94848285613b4b565b509392505050565b600082601f830112613bb157613bb0613a95565b5b8135613bc1848260208601613b5a565b91505092915050565b600060208284031215613be057613bdf613685565b5b600082013567ffffffffffffffff811115613bfe57613bfd61368a565b5b613c0a84828501613b9c565b91505092915050565b60008060408385031215613c2a57613c29613685565b5b6000613c3885828601613985565b9250506020613c498582860161381d565b9150509250929050565b600065ffffffffffff82169050919050565b613c6e81613c53565b82525050565b6000608082019050613c896000830187613c65565b613c966020830186613c65565b613ca36040830185613720565b613cb06060830184613720565b95945050505050565b613cc281613714565b8114613ccd57600080fd5b50565b600081359050613cdf81613cb9565b92915050565b60008060408385031215613cfc57613cfb613685565b5b6000613d0a858286016138fc565b9250506020613d1b85828601613cd0565b9150509250929050565b60008060408385031215613d3c57613d3b613685565b5b6000613d4a858286016138fc565b9250506020613d5b85828601613985565b9150509250929050565b600067ffffffffffffffff821115613d8057613d7f613a9f565b5b613d8982613790565b9050602081019050919050565b6000613da9613da484613d65565b613aff565b905082815260208101848484011115613dc557613dc4613a9a565b5b613dd0848285613b4b565b509392505050565b600082601f830112613ded57613dec613a95565b5b8135613dfd848260208601613d96565b91505092915050565b60008060008060808587031215613e2057613e1f613685565b5b6000613e2e878288016138fc565b9450506020613e3f878288016138fc565b9350506040613e508782880161381d565b925050606085013567ffffffffffffffff811115613e7157613e7061368a565b5b613e7d87828801613dd8565b91505092959194509250565b600061ffff82169050919050565b613ea081613e89565b8114613eab57600080fd5b50565b600081359050613ebd81613e97565b92915050565b613ecc81613c53565b8114613ed757600080fd5b50565b600081359050613ee981613ec3565b92915050565b600080600060608486031215613f0857613f07613685565b5b6000613f1686828701613985565b9350506020613f2786828701613eae565b9250506040613f3886828701613eda565b9150509250925092565b600080600060608486031215613f5b57613f5a613685565b5b6000613f69868287016138fc565b9350506020613f7a86828701613985565b9250506040613f8b86828701613eae565b9150509250925092565b60008060408385031215613fac57613fab613685565b5b6000613fba858286016138fc565b9250506020613fcb858286016138fc565b9150509250929050565b60008060008060808587031215613fef57613fee613685565b5b6000613ffd878288016138fc565b945050602061400e87828801613985565b935050604061401f87828801613eae565b925050606061403087828801613eda565b91505092959194509250565b60008160050b9050919050565b6140528161403c565b811461405d57600080fd5b50565b60008135905061406f81614049565b92915050565b6000806040838503121561408c5761408b613685565b5b600061409a85828601613985565b92505060206140ab85828601614060565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806140fc57607f821691505b60208210810361410f5761410e6140b5565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061418b82614144565b915061419683614144565b9250828201905060ff8111156141af576141ae614151565b5b92915050565b60006141c0826137fc565b91506141cb836137fc565b92508282019050808211156141e3576141e2614151565b5b92915050565b60006141f4826137fc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361422657614225614151565b5b600182019050919050565b600061423c826137fc565b9150614247836137fc565b925082820390508181111561425f5761425e614151565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b6000600883026142ca7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261428a565b6142d4868361428a565b95508019841693508086168417925050509392505050565b6000819050919050565b600061431161430c614307846137fc565b6142ec565b6137fc565b9050919050565b6000819050919050565b61432b836142f6565b61433f61433782614318565b84845461429a565b825550505050565b600090565b614354614347565b61435f818484614322565b505050565b5b818110156143835761437860008261434c565b600181019050614365565b5050565b601f8211156143c85761439981614265565b6143a28461427a565b810160208510156143b1578190505b6143c56143bd8561427a565b830182614364565b50505b505050565b60008160020a8304905092915050565b60006143ee600019846008026143cd565b1980831691505092915050565b600061440783836143dd565b9150826002028217905092915050565b61442082613a1e565b67ffffffffffffffff81111561443957614438613a9f565b5b61444382546140e4565b61444e828285614387565b600060209050601f831160018114614481576000841561446f578287015190505b61447985826143fb565b8655506144e1565b601f19841661448f86614265565b60005b828110156144b757848901518255600182019150602085019450602081019050614492565b868310156144d457848901516144d0601f8916826143dd565b8355505b6001600288020188555050505b505050505050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061451f600a83613755565b915061452a826144e9565b602082019050919050565b6000602082019050818103600083015261454e81614512565b9050919050565b6000819050602082019050919050565b60006145718251613964565b80915050919050565b600061458582613a1e565b8261458f84614555565b905061459a81614565565b925060208210156145da576145d57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8360200360080261428a565b831692505b5050919050565b7f4552525f53504152534500000000000000000000000000000000000000000000600082015250565b6000614617600a83613755565b9150614622826145e1565b602082019050919050565b600060208201905081810360008301526146468161460a565b9050919050565b7f4552525f43415050454400000000000000000000000000000000000000000000600082015250565b6000614683600a83613755565b915061468e8261464d565b602082019050919050565b600060208201905081810360008301526146b281614676565b9050919050565b7f4552525f4341505f4c4f57000000000000000000000000000000000000000000600082015250565b60006146ef600b83613755565b91506146fa826146b9565b602082019050919050565b6000602082019050818103600083015261471e816146e2565b9050919050565b600061473082613c53565b915061473b83613c53565b9250828201905065ffffffffffff81111561475957614758614151565b5b92915050565b60008151905061476e816138e5565b92915050565b60006020828403121561478a57614789613685565b5b60006147988482850161475f565b9150509291505056fea26469706673582212209832c65cee22fc017db822d90ff9954969b15c3a4cea7123bdd545203784fe5564736f6c63430008120033 +\ No newline at end of file diff --git a/python/craft_nft/data/CraftNFT.json b/python/craft_nft/data/CraftNFT.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","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":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","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"},{"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"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"deleteWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","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":"address","name":"_writer","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"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":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bool","name":"_final","type":"bool"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":true,"internalType":"bool","name":"_capped","type":"bool"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","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":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","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"},{"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"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"int48","name":"count","type":"int48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"deleteWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","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":"address","name":"_writer","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_cap","type":"uint48"}],"name":"setCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"},{"internalType":"bool","name":"capped","type":"bool"}],"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":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bool","name":"_final","type":"bool"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/craft_nft/nft.py b/python/craft_nft/nft.py @@ -128,9 +128,12 @@ class CraftNFT(ERC721): enc = ABIContractEncoder() enc.method('allocate') enc.typ(ABIContractType.BYTES32) - enc.typ(ABIContractType.UINT48) + enc.typ_literal('int48') enc.bytes32(token_id) - enc.uintn(amount, 48) + if amount < 0: + enc.bytes32('ff' * 32) + else: + enc.uintn(amount, 48) data = enc.get() tx = self.template(sender_address, contract_address, use_nonce=True) tx = self.set_code(tx, data) @@ -240,6 +243,22 @@ class CraftNFT(ERC721): return tx + def set_cap(self, contract_address, sender_address, token_id, batch, amount, tx_format=TxFormat.JSONRPC): + enc = ABIContractEncoder() + enc.method('setCap') + enc.typ(ABIContractType.BYTES32) + enc.typ(ABIContractType.UINT16) + enc.typ_literal('uint48') + enc.bytes32(token_id) + enc.uintn(batch, 16) + enc.uintn(amount, 48) + data = enc.get() + tx = self.template(sender_address, contract_address, use_nonce=True) + tx = self.set_code(tx, data) + tx = self.finalize(tx, tx_format) + return tx + + def to_uri(self, contract_address, token_id, sender_address=ZERO_ADDRESS, id_generator=None): j = JSONRPCRequest(id_generator) o = j.template() diff --git a/python/tests/test_basic.py b/python/tests/test_basic.py @@ -223,6 +223,9 @@ class Test(EthTesterCase): expected_id = hash_of_foo[:64-16] + '0000000000000000' o = c.get_token(self.address, expected_id, sender_address=self.accounts[0]) r = self.rpc.do(o) + o = receipt(tx_hash_hex) + r = self.conn.do(o) + self.assertEqual(r['status'], 1) o = c.owner_of(self.address, int(expected_id, 16), sender_address=self.accounts[0]) r = self.rpc.do(o) @@ -530,5 +533,47 @@ class Test(EthTesterCase): self.assertEqual(balance, 1) + def test_mint_uncapped(self): + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = CraftNFT(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + (tx_hash_hex, o) = c.allocate(self.address, self.accounts[0], hash_of_foo, amount=-1) + self.rpc.do(o) + o = receipt(tx_hash_hex) + r = self.conn.do(o) + self.assertEqual(r['status'], 1) + + for i in range(5): + (tx_hash_hex, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1+i], hash_of_foo, 0) + self.rpc.do(o) + o = receipt(tx_hash_hex) + r = self.conn.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash_hex, o) = c.set_cap(self.address, self.accounts[0], hash_of_foo, 0, 4) + self.rpc.do(o) + o = receipt(tx_hash_hex) + r = self.conn.do(o) + self.assertEqual(r['status'], 0) + + (tx_hash_hex, o) = c.set_cap(self.address, self.accounts[0], hash_of_foo, 0, 6) + self.rpc.do(o) + o = receipt(tx_hash_hex) + r = self.conn.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash_hex, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1+i], hash_of_foo, 0) + self.rpc.do(o) + o = receipt(tx_hash_hex) + r = self.conn.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash_hex, o) = c.mint_to(self.address, self.accounts[0], self.accounts[2], hash_of_foo, 0) + self.rpc.do(o) + o = receipt(tx_hash_hex) + r = self.conn.do(o) + self.assertEqual(r['status'], 0) + + if __name__ == '__main__': unittest.main() diff --git a/solidity/CraftNFT.sol b/solidity/CraftNFT.sol @@ -16,6 +16,7 @@ contract CraftNFT { uint48 count; uint48 cursor; bool sparse; + bool capped; } // The owner of the token contract. @@ -74,7 +75,7 @@ contract CraftNFT { // Minter event Mint(address indexed _minter, address indexed _beneficiary, uint256 _value); - event Allocate(address indexed _minter, uint48 indexed _count, bytes32 _tokenId); + event Allocate(address indexed _minter, uint48 indexed _count, bool indexed _capped, bytes32 _tokenId); constructor(string memory _name, string memory _symbol, bytes32 _declaration) { owner = msg.sender; @@ -142,9 +143,9 @@ contract CraftNFT { // Allocate tokens for minting. // if count is set to 0, only a single unique token can be minted. - function allocate(bytes32 content, uint48 count) public returns (bool) { + function allocate(bytes32 content, int48 count) public returns (bool) { uint256 l; - require(msg.sender == owner || writer[msg.sender]); + require(msg.sender == owner || writer[msg.sender], 'ERR_ACCESS'); tokenSpec memory _token; @@ -153,16 +154,18 @@ contract CraftNFT { require(token[content][0].count > 0); } - _token.count = count; - token[content].push(_token); - tokens.push(content); - if (count == 0) { + _token.capped = true; supply += 1; - } else { - supply += count; + } else if (count > 0) { + _token.count = uint48(count); + _token.capped = true; + supply += _token.count; } - emit Allocate(msg.sender, count, content); + token[content].push(_token); + tokens.push(content); + + emit Allocate(msg.sender, _token.count, _token.capped, content); return true; } @@ -212,6 +215,17 @@ contract CraftNFT { mintedToken[_k] = bytes32(_data); } + function setCap(bytes32 _content, uint16 _batch, uint48 _cap) public { + tokenSpec storage spec; + + spec = token[_content][uint256(_batch)]; + require(!spec.sparse, 'ERR_SPARSE'); + require(!spec.capped, 'ERR_CAPPED'); + require(_cap >= spec.count, 'ERR_CAP_LOW'); + spec.count = _cap; + spec.capped = true; + } + // Mint a token from a batch. // Will fail if: // * All tokens in the batch have already been minted @@ -225,12 +239,14 @@ contract CraftNFT { spec = token[_content][uint256(_batch)]; require(!spec.sparse, 'ERR_SPARSE'); - if (_batch == 0 && spec.count == 0) { + require(msg.sender == owner || writer[msg.sender], 'ERR_ACCESS'); + if (_batch == 0 && spec.count == 0 && spec.capped) { spec.cursor += 1; return mintTo(_recipient, _content); } - require(msg.sender == owner || writer[msg.sender], 'ERR_ACCESS'); - require(spec.cursor < spec.count); + if (spec.capped) { + require(spec.cursor < spec.count); + } return mintBatchCore(_recipient, _content, _batch, spec.cursor, spec); } @@ -275,6 +291,10 @@ contract CraftNFT { right |= uint160(_recipient); _spec.cursor += 1; + if (!_spec.capped) { + _spec.count += 1; + supply += 1; + } mintedToken[k] = bytes32(right); balance[_recipient] += 1;