commit 7300b4fe618d2206801846f7f50e5344d7c5117c
parent eef45f71a2589eb2f5c8eaef923e42e65c6a5635
Author: lash <dev@holbrook.no>
Date: Thu, 2 Mar 2023 07:50:39 +0000
Fix owner index implementation, remove enumeration option, declaration
Diffstat:
16 files changed, 189 insertions(+), 64 deletions(-)
diff --git a/js/contract/CraftNFT.bin b/js/contract/CraftNFT.bin
@@ -1 +1 @@
-60806040523480156200001157600080fd5b5060405162006c7d38038062006c7d833981810160405281019062000037919062000b97565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600c8190555083600a90816200008f919062000e98565b5082600b9081620000a1919062000e98565b50620000f5602060126040518060400160405280600681526020017f736861323536000000000000000000000000000000000000000000000000000081525062000197640100000000026401000000009004565b6200011060126200046e640100000000026401000000009004565b602067ffffffffffffffff8111156200012e576200012d620009bb565b5b6040519080825280601f01601f191660200182016040528015620001615781602001600182028036833780820191505090505b506013908162000172919062000fef565b5080600660006101000a81548160ff0219169083151502179055505050505062001471565b6060819050601081511115620001e4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001db9062001137565b60405180910390fd5b620001ee62000926565b6000600790505b60008160ff16106200025257600060088262000212919062001195565b60ff1660ff9060020a029050600086821667ffffffffffffffff1611156200023b575062000252565b81806200024890620011db565b92505050620001f5565b60018162000261919062001209565b826020019060ff16908160ff1681525050600881600762000283919062001245565b6200028f919062001195565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff1681525050826200031d90620012d4565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081601160008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b600060116000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff1611620004a757600080fd5b816012819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115620004df57620004de620009bb565b5b6040519080825280601f01601f191660200182016040528015620005125781602001600182028036833780820191505090505b506013908162000523919062000fef565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c6200055e62000579640100000000026401000000009004565b6040516200056d919062001396565b60405180910390a15050565b606062000627601380546200058e9062000c81565b80601f0160208091040260200160405190810160405280929190818152602001828054620005bc9062000c81565b80156200060d5780601f10620005e1576101008083540402835291602001916200060d565b820191906000526020600020905b815481529060010190602001808311620005ef57829003601f168201915b50505050506200062c640100000000026401000000009004565b905090565b60606000606060116000601254815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff168551620006819190620013ba565b6200068d9190620013ba565b67ffffffffffffffff811115620006a957620006a8620009bb565b5b6040519080825280601f01601f191660200182016040528015620006dc5781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff16811015620007bc578260000160139054906101000a900478010000000000000000000000000000000000000000000000000281600881106200073e576200073d620013f5565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110620007775762000776620013f5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620007b39062001424565b915050620006e2565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110620008065762000805620013f5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620008429062001424565b91505060005b85518110156200091a57858181518110620008685762000867620013f5565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838284620008c19190620013ba565b81518110620008d557620008d4620013f5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620009119062001424565b91505062000848565b50819350505050919050565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620009f582620009aa565b810181811067ffffffffffffffff8211171562000a175762000a16620009bb565b5b80604052505050565b600062000a2c6200098c565b905062000a3a8282620009ea565b919050565b600067ffffffffffffffff82111562000a5d5762000a5c620009bb565b5b62000a6882620009aa565b9050602081019050919050565b60005b8381101562000a9557808201518184015260208101905062000a78565b60008484015250505050565b600062000ab862000ab28462000a3f565b62000a20565b90508281526020810184848401111562000ad75762000ad6620009a5565b5b62000ae484828562000a75565b509392505050565b600082601f83011262000b045762000b03620009a0565b5b815162000b1684826020860162000aa1565b91505092915050565b6000819050919050565b62000b348162000b1f565b811462000b4057600080fd5b50565b60008151905062000b548162000b29565b92915050565b60008115159050919050565b62000b718162000b5a565b811462000b7d57600080fd5b50565b60008151905062000b918162000b66565b92915050565b6000806000806080858703121562000bb45762000bb362000996565b5b600085015167ffffffffffffffff81111562000bd55762000bd46200099b565b5b62000be38782880162000aec565b945050602085015167ffffffffffffffff81111562000c075762000c066200099b565b5b62000c158782880162000aec565b935050604062000c288782880162000b43565b925050606062000c3b8782880162000b80565b91505092959194509250565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000c9a57607f821691505b60208210810362000cb05762000caf62000c52565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000d1d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000cdb565b62000d29868362000cdb565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000d7662000d7062000d6a8462000d41565b62000d4b565b62000d41565b9050919050565b6000819050919050565b62000d928362000d55565b62000daa62000da18262000d7d565b84845462000ceb565b825550505050565b600090565b62000dc162000db2565b62000dce81848462000d87565b505050565b5b8181101562000df65762000dea60008262000db7565b60018101905062000dd4565b5050565b601f82111562000e455762000e0f8162000cb6565b62000e1a8462000ccb565b8101602085101562000e2a578190505b62000e4262000e398562000ccb565b83018262000dd3565b50505b505050565b60008160020a8304905092915050565b600062000e6d6000198460080262000e4a565b1980831691505092915050565b600062000e88838362000e5a565b9150826002028217905092915050565b62000ea38262000c47565b67ffffffffffffffff81111562000ebf5762000ebe620009bb565b5b62000ecb825462000c81565b62000ed882828562000dfa565b600060209050601f83116001811462000f10576000841562000efb578287015190505b62000f07858262000e7a565b86555062000f77565b601f19841662000f208662000cb6565b60005b8281101562000f4a5784890151825560018201915060208501945060208101905062000f23565b8683101562000f6a578489015162000f66601f89168262000e5a565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b60008190508160005260206000209050919050565b601f82111562000fea5762000fb48162000f8a565b62000fbf8462000ccb565b8101602085101562000fcf578190505b62000fe762000fde8562000ccb565b83018262000dd3565b50505b505050565b62000ffa8262000f7f565b67ffffffffffffffff811115620010165762001015620009bb565b5b62001022825462000c81565b6200102f82828562000f9f565b600060209050601f83116001811462001067576000841562001052578287015190505b6200105e858262000e7a565b865550620010ce565b601f198416620010778662000f8a565b60005b82811015620010a1578489015182556001820191506020850194506020810190506200107a565b86831015620010c15784890151620010bd601f89168262000e5a565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b60006200111f601383620010d6565b91506200112c82620010e7565b602082019050919050565b60006020820190508181036000830152620011528162001110565b9050919050565b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620011a28262001159565b9150620011af8362001159565b9250828202620011bf8162001159565b9150808214620011d457620011d362001166565b5b5092915050565b6000620011e88262001159565b915060008203620011fe57620011fd62001166565b5b600182039050919050565b6000620012168262001159565b9150620012238362001159565b9250828201905060ff8111156200123f576200123e62001166565b5b92915050565b6000620012528262001159565b91506200125f8362001159565b9250828203905060ff8111156200127b576200127a62001166565b5b92915050565b6000819050602082019050919050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6000620012cb825162001291565b80915050919050565b6000620012e18262000f7f565b82620012ed8462001281565b9050620012fa81620012bd565b925060108210156200133d57620013387fffffffffffffffffffffffffffffffff000000000000000000000000000000008360100360080262000cdb565b831692505b5050919050565b600082825260208201905092915050565b6000620013628262000f7f565b6200136e818562001344565b93506200138081856020860162000a75565b6200138b81620009aa565b840191505092915050565b60006020820190508181036000830152620013b2818462001355565b905092915050565b6000620013c78262000d41565b9150620013d48362000d41565b9250828201905080821115620013ef57620013ee62001166565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000620014318262000d41565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362001466576200146562001166565b5b600182019050919050565b6157fc80620014816000396000f3fe608060405260043610610263576000357c01000000000000000000000000000000000000000000000000000000009004806386e90b5911610156578063b88d4fde116100d3578063da2824a811610097578063da2824a81461096c578063e8a7f4c514610995578063e985e9c5146109d2578063f117e17314610a0f578063f2fde38b14610a4c578063f9613ab214610a8957610263565b8063b88d4fde14610870578063c5bec6fc1461088c578063c87b56dd146108c9578063ccc094c214610906578063d824ee4f1461092f57610263565b8063ad0dec2f1161011a578063ad0dec2f1461075f578063adf288df1461079c578063b1a6afd3146107d9578063b238d60314610804578063b5fdeb231461084557610263565b806386e90b591461067a5780638da5cb5b146106b757806395d89b41146106e25780639a7c5e9f1461070d578063a22cb4651461073657610263565b806349f2553a116101e4578063559f5dc9116101a8578063559f5dc91461055b5780635ae06f7e1461059a5780636352211e146105c35780636b9cb86a1461060057806370a082311461063d57610263565b806349f2553a146104525780634d03546a1461047b5780634f64b2be146104b85780634f6ccce7146104f55780635344299a1461053257610263565b806324e0febc1161022b57806324e0febc146103545780632b29ba23146103915780632f745c59146103ce57806340c84b0e1461040b57806342842e0e1461043657610263565b806301ffc9a71461026857806306fdde03146102a5578063081812fc146102d057806318160ddd1461030d57806323b872dd14610338575b600080fd5b34801561027457600080fd5b5061028f600480360381019061028a919061447d565b610ac6565b60405161029c91906144c5565b60405180910390f35b3480156102b157600080fd5b506102ba610c1a565b6040516102c79190614570565b60405180910390f35b3480156102dc57600080fd5b506102f760048036038101906102f291906145c8565b610ca8565b6040516103049190614636565b60405180910390f35b34801561031957600080fd5b50610322610ce5565b60405161032f9190614660565b60405180910390f35b610352600480360381019061034d91906146a7565b610cf2565b005b34801561036057600080fd5b5061037b60048036038101906103769190614730565b610d5d565b604051610388919061476c565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b39190614787565b610d75565b6040516103c591906144c5565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f091906147b4565b610e21565b6040516104029190614660565b60405180910390f35b34801561041757600080fd5b50610420610e46565b60405161042d9190614849565b60405180910390f35b610450600480360381019061044b91906146a7565b610ed4565b005b34801561045e57600080fd5b50610479600480360381019061047491906149a0565b610f3f565b005b34801561048757600080fd5b506104a2600480360381019061049d9190614a27565b611257565b6040516104af91906144c5565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da91906145c8565b6114e4565b6040516104ec919061476c565b60405180910390f35b34801561050157600080fd5b5061051c600480360381019061051791906145c8565b611508565b6040516105299190614660565b60405180910390f35b34801561053e57600080fd5b5061055960048036038101906105549190614b08565b61152c565b005b34801561056757600080fd5b50610582600480360381019061057d9190614b51565b6115b8565b60405161059193929190614ba0565b60405180910390f35b3480156105a657600080fd5b506105c160048036038101906105bc9190614787565b61162c565b005b3480156105cf57600080fd5b506105ea60048036038101906105e591906145c8565b61174b565b6040516105f79190614636565b60405180910390f35b34801561060c57600080fd5b5061062760048036038101906106229190614b08565b611787565b6040516106349190614570565b60405180910390f35b34801561064957600080fd5b50610664600480360381019061065f9190614787565b6119a0565b6040516106719190614660565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190614b08565b6119e9565b6040516106ae9190614570565b60405180910390f35b3480156106c357600080fd5b506106cc611c94565b6040516106d99190614636565b60405180910390f35b3480156106ee57600080fd5b506106f7611cb8565b6040516107049190614570565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f91906145c8565b611d46565b005b34801561074257600080fd5b5061075d60048036038101906107589190614c03565b611e37565b005b34801561076b57600080fd5b5061078660048036038101906107819190614b08565b6120d9565b6040516107939190614849565b60405180910390f35b3480156107a857600080fd5b506107c360048036038101906107be9190614c43565b6123b0565b6040516107d0919061476c565b60405180910390f35b3480156107e557600080fd5b506107ee61271c565b6040516107fb919061476c565b60405180910390f35b34801561081057600080fd5b5061082b600480360381019061082691906145c8565b612722565b60405161083c959493929190614d15565b60405180910390f35b34801561085157600080fd5b5061085a6127c1565b6040516108679190614849565b60405180910390f35b61088a60048036038101906108859190614d68565b61285b565b005b34801561089857600080fd5b506108b360048036038101906108ae9190614b08565b612936565b6040516108c09190614849565b60405180910390f35b3480156108d557600080fd5b506108f060048036038101906108eb91906145c8565b612cef565b6040516108fd9190614570565b60405180910390f35b34801561091257600080fd5b5061092d60048036038101906109289190614e57565b612e42565b005b34801561093b57600080fd5b5061095660048036038101906109519190614f00565b613104565b604051610963919061476c565b60405180910390f35b34801561097857600080fd5b50610993600480360381019061098e9190614787565b613377565b005b3480156109a157600080fd5b506109bc60048036038101906109b79190614b08565b61345f565b6040516109c99190614849565b60405180910390f35b3480156109de57600080fd5b506109f960048036038101906109f49190614f53565b613818565b604051610a0691906144c5565b60405180910390f35b348015610a1b57600080fd5b50610a366004803603810190610a319190614f93565b6138b0565b604051610a43919061476c565b60405180910390f35b348015610a5857600080fd5b50610a736004803603810190610a6e9190614787565b613a3f565b604051610a8091906144c5565b60405180910390f35b348015610a9557600080fd5b50610ab06004803603810190610aab9190614730565b613ae3565b604051610abd919061476c565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b1a5760019050610c15565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b6c5760019050610c15565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610bbe5760019050610c15565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c105760019050610c15565b600090505b919050565b600a8054610c2790615029565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5390615029565b8015610ca05780601f10610c7557610100808354040283529160200191610ca0565b820191906000526020600020905b815481529060010190602001808311610c8357829003601f168201915b505050505081565b60006008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600780549050905090565b610cfd838383613b8f565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610e1a575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b600e602052816000526040600020602052806000526040600020600091509150505481565b600d8054610e5390615029565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7f90615029565b8015610ecc5780601f10610ea157610100808354040283529160200191610ecc565b820191906000526020600020905b815481529060010190602001808311610eaf57829003601f168201915b505050505081565b610edf838383613b8f565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f9c57600080fd5b82915081519050602f7f01000000000000000000000000000000000000000000000000000000000000000282600183610fd59190615089565b81518110610fe657610fe56150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611066578080611062906150ec565b9150505b8067ffffffffffffffff8111156110805761107f614875565b5b6040519080825280601f01601f1916602001820160405280156110b25781602001600182028036833780820191505090505b50600d90816110c191906152e6565b5060005b82518110156111b2578281815181106110e1576110e06150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600d82815461113990615029565b8110611148576111476150bd565b5b8154600116156111675790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806111aa906150ec565b9150506110c5565b5081518114611252577f2f00000000000000000000000000000000000000000000000000000000000000600d835181546111eb90615029565b81106111fa576111f96150bd565b5b8154600116156112195790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806112fd5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61130657600080fd5b61130e614378565b60046000868152602001908152602001600020805490509150600082111561138b57600060046000878152602001908152602001600020600081548110611358576113576150bd565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161161138a57600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff021916908315150217905550505060038590806001815401808255809150506001900390600052602060002001600090919091909150558365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c342876040516114d0919061476c565b60405180910390a360019250505092915050565b600381815481106114f457600080fd5b906000526020600020016000915090505481565b6007818154811061151857600080fd5b906000526020600020016000915090505481565b600060116000601254815260200190815260200160002090508060000160009054906101000a900460ff1660ff1682511461156657600080fd5b816013908161157591906152e6565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c61159f6127c1565b6040516115ac9190614849565b60405180910390a15050565b600460205281600052604060002081815481106115d457600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806116b1575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6116f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e790615404565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b606080606060006117978561345f565b9150600d80546117a690615029565b905090508082516117b79190615424565b67ffffffffffffffff8111156117d0576117cf614875565b5b6040519080825280601f01601f1916602001820160405280156118025781602001600182028036833780820191505090505b50925060005b818110156118c757600d81815461181e90615029565b811061182d5761182c6150bd565b5b81546001161561184c5790600052602060002090602091828204019190065b9054901a7f010000000000000000000000000000000000000000000000000000000000000002848281518110611885576118846150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806118bf906150ec565b915050611808565b5060005b8251811015611994578281815181106118e7576118e66150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002848381518110611944576119436150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818061197e906150ec565b925050808061198c906150ec565b9150506118cb565b50829350505050919050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600060608060006119fb86612936565b915060116000601254815260200190815260200160002093508360000160029054906101000a900460ff1660ff1690506001825182611a3a9190615424565b611a449190615424565b67ffffffffffffffff811115611a5d57611a5c614875565b5b6040519080825280601f01601f191660200182016040528015611a8f5781602001600182028036833780820191505090505b50925060005b81811015611b49578460000160039054906101000a9004700100000000000000000000000000000000028160108110611ad157611ad06150bd565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002848281518110611b0757611b066150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611b41906150ec565b915050611a95565b50603a7f010000000000000000000000000000000000000000000000000000000000000002838281518110611b8157611b806150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611bbb906150ec565b91505060005b8251811015611c8757828181518110611bdd57611bdc6150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002848284611c349190615424565b81518110611c4557611c446150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611c7f906150ec565b915050611bc1565b5082945050505050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b8054611cc590615029565b80601f0160208091040260200160405190810160405280929190818152602001828054611cf190615029565b8015611d3e5780601f10611d1357610100808354040283529160200191611d3e565b820191906000526020600020905b815481529060010190602001808311611d2157829003601f168201915b505050505081565b600060116000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff1611611d7e57600080fd5b816012819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115611db357611db2614875565b5b6040519080825280601f01601f191660200182016040528015611de55781602001600182028036833780820191505090505b5060139081611df491906152e6565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c611e1e6127c1565b604051611e2b9190614849565b60405180910390a15050565b8015611f5857600073ffffffffffffffffffffffffffffffffffffffff16600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ed557600080fd5b81600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612070565b600073ffffffffffffffffffffffffffffffffffffffff16600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611ff057600080fd5b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120cd91906144c5565b60405180910390a35050565b60606000606060116000601254815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff16855161212c9190615424565b6121369190615424565b67ffffffffffffffff81111561214f5761214e614875565b5b6040519080825280601f01601f1916602001820160405280156121815781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff16811015612257578260000160139054906101000a900478010000000000000000000000000000000000000000000000000281600881106121df576121de6150bd565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110612215576122146150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061224f906150ec565b915050612187565b8260000160009054906101000a900460ff167f01000000000000000000000000000000000000000000000000000000000000000282828151811061229e5761229d6150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806122d8906150ec565b91505060005b85518110156123a4578581815181106122fa576122f96150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028382846123519190615424565b81518110612362576123616150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061239c906150ec565b9150506122de565b50819350505050919050565b60008060008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806124595750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61246257600080fd5b600160046000878152602001908152602001600020805490501461248557600080fd5b6000600460008781526020019081526020016000206000815481106124ad576124ac6150bd565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff16146124df57600080fd5b600060010260056000878152602001908152602001600020541461250257600080fd5b8573ffffffffffffffffffffffffffffffffffffffff1692507fc0000000000000000000000000000000000000000000000000000000000000008317925082600102600560008781526020019081526020016000208190555084600190049150600660009054906101000a900460ff161561262757601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080600f60008481526020019081526020016000208190555081600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055505b6001601060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126779190615424565b925050819055506007856001900490806001815401808255809150506001900390600052602060002001600090919091909150558573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8846040516127089190614660565b60405180910390a384935050505092915050565b600c5481565b60116020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060000160039054906101000a900470010000000000000000000000000000000002908060000160139054906101000a9004780100000000000000000000000000000000000000000000000002905085565b6060612856601380546127d390615029565b80601f01602080910402602001604051908101604052809291908181526020018280546127ff90615029565b801561284c5780601f106128215761010080835404028352916020019161284c565b820191906000526020600020905b81548152906001019060200180831161282f57829003601f168201915b50505050506120d9565b905090565b612866848484613b8f565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e8461291b9061547d565b604051612928919061476c565b60405180910390a450505050565b6060806000806002855161294a91906154e4565b67ffffffffffffffff81111561296357612962614875565b5b6040519080825280601f01601f1916602001820160405280156129955781602001600182028036833780820191505090505b5092506000905060005b6020811015612ce357600460f08783815181106129bf576129be6150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015612abe57603083612a559190615526565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110612a8a57612a896150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612b30565b605783612acb9190615526565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110612b0057612aff6150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868281518110612b4557612b446150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015612c4357603083612bce9190615526565b7f01000000000000000000000000000000000000000000000000000000000000000284600184612bfe9190615424565b81518110612c0f57612c0e6150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612cc1565b605783612c509190615526565b7f01000000000000000000000000000000000000000000000000000000000000000284600184612c809190615424565b81518110612c9157612c906150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282612cce9190615424565b91508080612cdb906150ec565b91505061299f565b50829350505050919050565b6060600060608360010291506000600460008481526020019081526020016000208054905003612d2557612d2282613ae3565b91505b6000600460008481526020019081526020016000208054905011612d4857600080fd5b602067ffffffffffffffff811115612d6357612d62614875565b5b6040519080825280601f01601f191660200182016040528015612d955781602001600182028036833780820191505090505b50905060005b6020811015612e2f57828160208110612db757612db66150bd565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110612ded57612dec6150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080612e27906150ec565b915050612d9b565b50612e3981611787565b92505050919050565b6060819050601081511115612e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e83906155a7565b60405180910390fd5b612e946143ab565b6000600790505b60008160ff1610612ef0576000600882612eb591906155c7565b60ff1660ff9060020a029050600086821667ffffffffffffffff161115612edc5750612ef0565b8180612ee790615604565b92505050612e9b565b600181612efd9190615526565b826020019060ff16908160ff16815250506008816007612f1d919061562d565b612f2791906155c7565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082612fb390615677565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081601160008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b600080600460008581526020019081526020016000208361ffff16815481106131305761312f6150bd565b5b90600052602060002001905080600001600c9054906101000a900460ff161561318e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131859061572a565b60405180910390fd5b60008361ffff161480156131c0575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b1561321f5760018160000160068282829054906101000a900465ffffffffffff166131eb919061574a565b92506101000a81548165ffffffffffff021916908365ffffffffffff16021790555061321785856123b0565b915050613370565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806132c25750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f890615404565b60405180910390fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff161061334957600080fd5b61336c8585858460000160069054906101000a900465ffffffffffff1685613f14565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133fc90615404565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6060806000806002855161347391906154e4565b67ffffffffffffffff81111561348c5761348b614875565b5b6040519080825280601f01601f1916602001820160405280156134be5781602001600182028036833780820191505090505b5092506000905060005b602081101561380c57600460f08783815181106134e8576134e76150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff1610156135e75760308361357e9190615526565b7f0100000000000000000000000000000000000000000000000000000000000000028483815181106135b3576135b26150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613659565b6057836135f49190615526565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110613629576136286150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f86828151811061366e5761366d6150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff16101561376c576030836136f79190615526565b7f010000000000000000000000000000000000000000000000000000000000000002846001846137279190615424565b81518110613738576137376150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506137ea565b6057836137799190615526565b7f010000000000000000000000000000000000000000000000000000000000000002846001846137a99190615424565b815181106137ba576137b96150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b6002826137f79190615424565b91508080613804906150ec565b9150506134c8565b50829350505050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff16815481106138dc576138db6150bd565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061398b5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6139ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139c190615404565b60405180910390fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff16116139f557600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff1610613a2757600080fd5b613a348686868685613f14565b915050949350505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613a9a57600080fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b60008060056000848152602001908152602001600020549050613b0581614283565b613b0e57600080fd5b613b17816142b5565b15613b255782915050613b8a565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b6000803073ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401613be79190614660565b602060405180830381865afa158015613c04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c289190615799565b91508473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613c6257600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614613d96573373ffffffffffffffffffffffffffffffffffffffff166008600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480613d8c57503373ffffffffffffffffffffffffffffffffffffffff16600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b613d9557600080fd5b5b60006008600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613df383856142e7565b600f60008481526020019081526020016000205490506000600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055506001601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613eaf9190615089565b925050819055506001601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613f069190615424565b925050819055505050505050565b60008060008060007fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008960019004169350603067ffffffffffffffff8961ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16841793508665ffffffffffff16841793508360010291506000600102600560008481526020019081526020016000205414613fa957600080fd5b85600001600c9054906101000a900460ff1661400b578560000160069054906101000a900465ffffffffffff1665ffffffffffff168765ffffffffffff161461400a57600186600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff896001900416925060b8839060020a0292507f8000000000000000000000000000000000000000000000000000000000000000831792508973ffffffffffffffffffffffffffffffffffffffff168317925060018660000160068282829054906101000a900465ffffffffffff1661408c919061574a565b92506101000a81548165ffffffffffff021916908365ffffffffffff160217905550826001026005600084815260200190815260200160002081905550600660009054906101000a900460ff161561418e57601060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080600f60008681526020019081526020016000208190555083600e60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055505b6001601060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546141de9190615424565b9250508190555060078490806001815401808255809150506001900390600052602060002001600090919091909150558973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88660405161426b9190614660565b60405180910390a38194505050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b60008083600102905060056000828152602001908152602001600020546001900491506000820361431757600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61445a81614425565b811461446557600080fd5b50565b60008135905061447781614451565b92915050565b6000602082840312156144935761449261441b565b5b60006144a184828501614468565b91505092915050565b60008115159050919050565b6144bf816144aa565b82525050565b60006020820190506144da60008301846144b6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561451a5780820151818401526020810190506144ff565b60008484015250505050565b6000601f19601f8301169050919050565b6000614542826144e0565b61454c81856144eb565b935061455c8185602086016144fc565b61456581614526565b840191505092915050565b6000602082019050818103600083015261458a8184614537565b905092915050565b6000819050919050565b6145a581614592565b81146145b057600080fd5b50565b6000813590506145c28161459c565b92915050565b6000602082840312156145de576145dd61441b565b5b60006145ec848285016145b3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614620826145f5565b9050919050565b61463081614615565b82525050565b600060208201905061464b6000830184614627565b92915050565b61465a81614592565b82525050565b60006020820190506146756000830184614651565b92915050565b61468481614615565b811461468f57600080fd5b50565b6000813590506146a18161467b565b92915050565b6000806000606084860312156146c0576146bf61441b565b5b60006146ce86828701614692565b93505060206146df86828701614692565b92505060406146f0868287016145b3565b9150509250925092565b6000819050919050565b61470d816146fa565b811461471857600080fd5b50565b60008135905061472a81614704565b92915050565b6000602082840312156147465761474561441b565b5b60006147548482850161471b565b91505092915050565b614766816146fa565b82525050565b6000602082019050614781600083018461475d565b92915050565b60006020828403121561479d5761479c61441b565b5b60006147ab84828501614692565b91505092915050565b600080604083850312156147cb576147ca61441b565b5b60006147d985828601614692565b92505060206147ea858286016145b3565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b600061481b826147f4565b61482581856147ff565b93506148358185602086016144fc565b61483e81614526565b840191505092915050565b600060208201905081810360008301526148638184614810565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6148ad82614526565b810181811067ffffffffffffffff821117156148cc576148cb614875565b5b80604052505050565b60006148df614411565b90506148eb82826148a4565b919050565b600067ffffffffffffffff82111561490b5761490a614875565b5b61491482614526565b9050602081019050919050565b82818337600083830152505050565b600061494361493e846148f0565b6148d5565b90508281526020810184848401111561495f5761495e614870565b5b61496a848285614921565b509392505050565b600082601f8301126149875761498661486b565b5b8135614997848260208601614930565b91505092915050565b6000602082840312156149b6576149b561441b565b5b600082013567ffffffffffffffff8111156149d4576149d3614420565b5b6149e084828501614972565b91505092915050565b600065ffffffffffff82169050919050565b614a04816149e9565b8114614a0f57600080fd5b50565b600081359050614a21816149fb565b92915050565b60008060408385031215614a3e57614a3d61441b565b5b6000614a4c8582860161471b565b9250506020614a5d85828601614a12565b9150509250929050565b600067ffffffffffffffff821115614a8257614a81614875565b5b614a8b82614526565b9050602081019050919050565b6000614aab614aa684614a67565b6148d5565b905082815260208101848484011115614ac757614ac6614870565b5b614ad2848285614921565b509392505050565b600082601f830112614aef57614aee61486b565b5b8135614aff848260208601614a98565b91505092915050565b600060208284031215614b1e57614b1d61441b565b5b600082013567ffffffffffffffff811115614b3c57614b3b614420565b5b614b4884828501614ada565b91505092915050565b60008060408385031215614b6857614b6761441b565b5b6000614b768582860161471b565b9250506020614b87858286016145b3565b9150509250929050565b614b9a816149e9565b82525050565b6000606082019050614bb56000830186614b91565b614bc26020830185614b91565b614bcf60408301846144b6565b949350505050565b614be0816144aa565b8114614beb57600080fd5b50565b600081359050614bfd81614bd7565b92915050565b60008060408385031215614c1a57614c1961441b565b5b6000614c2885828601614692565b9250506020614c3985828601614bee565b9150509250929050565b60008060408385031215614c5a57614c5961441b565b5b6000614c6885828601614692565b9250506020614c798582860161471b565b9150509250929050565b600060ff82169050919050565b614c9981614c83565b82525050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b614cd481614c9f565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b614d0f81614cda565b82525050565b600060a082019050614d2a6000830188614c90565b614d376020830187614c90565b614d446040830186614c90565b614d516060830185614ccb565b614d5e6080830184614d06565b9695505050505050565b60008060008060808587031215614d8257614d8161441b565b5b6000614d9087828801614692565b9450506020614da187828801614692565b9350506040614db2878288016145b3565b925050606085013567ffffffffffffffff811115614dd357614dd2614420565b5b614ddf87828801614ada565b91505092959194509250565b614df481614c83565b8114614dff57600080fd5b50565b600081359050614e1181614deb565b92915050565b600067ffffffffffffffff82169050919050565b614e3481614e17565b8114614e3f57600080fd5b50565b600081359050614e5181614e2b565b92915050565b600080600060608486031215614e7057614e6f61441b565b5b6000614e7e86828701614e02565b9350506020614e8f86828701614e42565b925050604084013567ffffffffffffffff811115614eb057614eaf614420565b5b614ebc86828701614972565b9150509250925092565b600061ffff82169050919050565b614edd81614ec6565b8114614ee857600080fd5b50565b600081359050614efa81614ed4565b92915050565b600080600060608486031215614f1957614f1861441b565b5b6000614f2786828701614692565b9350506020614f388682870161471b565b9250506040614f4986828701614eeb565b9150509250925092565b60008060408385031215614f6a57614f6961441b565b5b6000614f7885828601614692565b9250506020614f8985828601614692565b9150509250929050565b60008060008060808587031215614fad57614fac61441b565b5b6000614fbb87828801614692565b9450506020614fcc8782880161471b565b9350506040614fdd87828801614eeb565b9250506060614fee87828801614a12565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061504157607f821691505b60208210810361505457615053614ffa565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061509482614592565b915061509f83614592565b92508282039050818111156150b7576150b661505a565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006150f782614592565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036151295761512861505a565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b6000600883026151997fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615159565b6151a38683615159565b95508019841693508086168417925050509392505050565b6000819050919050565b60006151e06151db6151d684614592565b6151bb565b614592565b9050919050565b6000819050919050565b6151fa836151c5565b61520e615206826151e7565b848454615169565b825550505050565b600090565b615223615216565b61522e8184846151f1565b505050565b5b818110156152525761524760008261521b565b600181019050615234565b5050565b601f8211156152975761526881615134565b61527184615149565b81016020851015615280578190505b61529461528c85615149565b830182615233565b50505b505050565b60008160020a8304905092915050565b60006152bd6000198460080261529c565b1980831691505092915050565b60006152d683836152ac565b9150826002028217905092915050565b6152ef826147f4565b67ffffffffffffffff81111561530857615307614875565b5b6153128254615029565b61531d828285615256565b600060209050601f831160018114615350576000841561533e578287015190505b61534885826152ca565b8655506153b0565b601f19841661535e86615134565b60005b8281101561538657848901518255600182019150602085019450602081019050615361565b868310156153a3578489015161539f601f8916826152ac565b8355505b6001600288020188555050505b505050505050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006153ee600a836144eb565b91506153f9826153b8565b602082019050919050565b6000602082019050818103600083015261541d816153e1565b9050919050565b600061542f82614592565b915061543a83614592565b92508282019050808211156154525761545161505a565b5b92915050565b6000819050602082019050919050565b600061547482516146fa565b80915050919050565b6000615488826147f4565b8261549284615458565b905061549d81615468565b925060208210156154dd576154d87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802615159565b831692505b5050919050565b60006154ef82614592565b91506154fa83614592565b925082820261550881614592565b9150828204841483151761551f5761551e61505a565b5b5092915050565b600061553182614c83565b915061553c83614c83565b9250828201905060ff8111156155555761555461505a565b5b92915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b60006155916013836144eb565b915061559c8261555b565b602082019050919050565b600060208201905081810360008301526155c081615584565b9050919050565b60006155d282614c83565b91506155dd83614c83565b92508282026155eb81614c83565b91508082146155fd576155fc61505a565b5b5092915050565b600061560f82614c83565b9150600082036156225761562161505a565b5b600182039050919050565b600061563882614c83565b915061564383614c83565b9250828203905060ff81111561565c5761565b61505a565b5b92915050565b600061566e8251614c9f565b80915050919050565b6000615682826147f4565b8261568c84615458565b905061569781615662565b925060108210156156d7576156d27fffffffffffffffffffffffffffffffff0000000000000000000000000000000083601003600802615159565b831692505b5050919050565b7f4552525f53504152534500000000000000000000000000000000000000000000600082015250565b6000615714600a836144eb565b915061571f826156de565b602082019050919050565b6000602082019050818103600083015261574381615707565b9050919050565b6000615755826149e9565b9150615760836149e9565b9250828201905065ffffffffffff81111561577e5761577d61505a565b5b92915050565b6000815190506157938161467b565b92915050565b6000602082840312156157af576157ae61441b565b5b60006157bd84828501615784565b9150509291505056fea26469706673582212209c705c9e1194892f8963a676a7c89711310c7e29ec8d2831c88dc1d43a6ee06c64736f6c63430008120033
-\ No newline at end of file
+60806040523480156200001157600080fd5b50604051620071ad380380620071ad833981810160405281019062000037919062000afc565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816009908162000088919062000dd2565b5080600a90816200009a919062000dd2565b50620000ee602060126040518060400160405280600681526020017f736861323536000000000000000000000000000000000000000000000000000081525062000174640100000000026401000000009004565b6200010960126200044b640100000000026401000000009004565b602067ffffffffffffffff81111562000127576200012662000998565b5b6040519080825280601f01601f1916602001820160405280156200015a5781602001600182028036833780820191505090505b50601190816200016b919062000f29565b505050620013ab565b6060819050601081511115620001c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001b89062001071565b60405180910390fd5b620001cb62000903565b6000600790505b60008160ff16106200022f576000600882620001ef9190620010cf565b60ff1660ff9060020a029050600086821667ffffffffffffffff1611156200021857506200022f565b8180620002259062001115565b92505050620001d2565b6001816200023e919062001143565b826020019060ff16908160ff168152505060088160076200026091906200117f565b6200026c9190620010cf565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082620002fa906200120e565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600f60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b6000600f6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff16116200048457600080fd5b816010819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115620004bc57620004bb62000998565b5b6040519080825280601f01601f191660200182016040528015620004ef5781602001600182028036833780820191505090505b506011908162000500919062000f29565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c6200053b62000556640100000000026401000000009004565b6040516200054a9190620012d0565b60405180910390a15050565b606062000604601180546200056b9062000bbb565b80601f0160208091040260200160405190810160405280929190818152602001828054620005999062000bbb565b8015620005ea5780601f10620005be57610100808354040283529160200191620005ea565b820191906000526020600020905b815481529060010190602001808311620005cc57829003601f168201915b505050505062000609640100000000026401000000009004565b905090565b606060006060600f6000601054815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff1685516200065e9190620012f4565b6200066a9190620012f4565b67ffffffffffffffff81111562000686576200068562000998565b5b6040519080825280601f01601f191660200182016040528015620006b95781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff1681101562000799578260000160139054906101000a900478010000000000000000000000000000000000000000000000000281600881106200071b576200071a6200132f565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000028282815181106200075457620007536200132f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808062000790906200135e565b915050620006bf565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110620007e357620007e26200132f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806200081f906200135e565b91505060005b8551811015620008f7578581815181106200084557620008446200132f565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028382846200089e9190620012f4565b81518110620008b257620008b16200132f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620008ee906200135e565b91505062000825565b50819350505050919050565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620009d28262000987565b810181811067ffffffffffffffff82111715620009f457620009f362000998565b5b80604052505050565b600062000a0962000969565b905062000a178282620009c7565b919050565b600067ffffffffffffffff82111562000a3a5762000a3962000998565b5b62000a458262000987565b9050602081019050919050565b60005b8381101562000a7257808201518184015260208101905062000a55565b60008484015250505050565b600062000a9562000a8f8462000a1c565b620009fd565b90508281526020810184848401111562000ab45762000ab362000982565b5b62000ac184828562000a52565b509392505050565b600082601f83011262000ae15762000ae06200097d565b5b815162000af384826020860162000a7e565b91505092915050565b6000806040838503121562000b165762000b1562000973565b5b600083015167ffffffffffffffff81111562000b375762000b3662000978565b5b62000b458582860162000ac9565b925050602083015167ffffffffffffffff81111562000b695762000b6862000978565b5b62000b778582860162000ac9565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000bd457607f821691505b60208210810362000bea5762000be962000b8c565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c15565b62000c63868362000c15565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000cb062000caa62000ca48462000c7b565b62000c85565b62000c7b565b9050919050565b6000819050919050565b62000ccc8362000c8f565b62000ce462000cdb8262000cb7565b84845462000c25565b825550505050565b600090565b62000cfb62000cec565b62000d0881848462000cc1565b505050565b5b8181101562000d305762000d2460008262000cf1565b60018101905062000d0e565b5050565b601f82111562000d7f5762000d498162000bf0565b62000d548462000c05565b8101602085101562000d64578190505b62000d7c62000d738562000c05565b83018262000d0d565b50505b505050565b60008160020a8304905092915050565b600062000da76000198460080262000d84565b1980831691505092915050565b600062000dc2838362000d94565b9150826002028217905092915050565b62000ddd8262000b81565b67ffffffffffffffff81111562000df95762000df862000998565b5b62000e05825462000bbb565b62000e1282828562000d34565b600060209050601f83116001811462000e4a576000841562000e35578287015190505b62000e41858262000db4565b86555062000eb1565b601f19841662000e5a8662000bf0565b60005b8281101562000e845784890151825560018201915060208501945060208101905062000e5d565b8683101562000ea4578489015162000ea0601f89168262000d94565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b60008190508160005260206000209050919050565b601f82111562000f245762000eee8162000ec4565b62000ef98462000c05565b8101602085101562000f09578190505b62000f2162000f188562000c05565b83018262000d0d565b50505b505050565b62000f348262000eb9565b67ffffffffffffffff81111562000f505762000f4f62000998565b5b62000f5c825462000bbb565b62000f6982828562000ed9565b600060209050601f83116001811462000fa1576000841562000f8c578287015190505b62000f98858262000db4565b86555062001008565b601f19841662000fb18662000ec4565b60005b8281101562000fdb5784890151825560018201915060208501945060208101905062000fb4565b8683101562000ffb578489015162000ff7601f89168262000d94565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b60006200105960138362001010565b9150620010668262001021565b602082019050919050565b600060208201905081810360008301526200108c816200104a565b9050919050565b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620010dc8262001093565b9150620010e98362001093565b9250828202620010f98162001093565b91508082146200110e576200110d620010a0565b5b5092915050565b6000620011228262001093565b915060008203620011385762001137620010a0565b5b600182039050919050565b6000620011508262001093565b91506200115d8362001093565b9250828201905060ff811115620011795762001178620010a0565b5b92915050565b60006200118c8262001093565b9150620011998362001093565b9250828203905060ff811115620011b557620011b4620010a0565b5b92915050565b6000819050602082019050919050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6000620012058251620011cb565b80915050919050565b60006200121b8262000eb9565b826200122784620011bb565b90506200123481620011f7565b925060108210156200127757620012727fffffffffffffffffffffffffffffffff000000000000000000000000000000008360100360080262000c15565b831692505b5050919050565b600082825260208201905092915050565b60006200129c8262000eb9565b620012a881856200127e565b9350620012ba81856020860162000a52565b620012c58162000987565b840191505092915050565b60006020820190508181036000830152620012ec81846200128f565b905092915050565b6000620013018262000c7b565b91506200130e8362000c7b565b9250828201905080821115620013295762001328620010a0565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006200136b8262000c7b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620013a0576200139f620010a0565b5b600182019050919050565b615df280620013bb6000396000f3fe608060405260043610610263576000357c0100000000000000000000000000000000000000000000000000000000900480638da5cb5b11610156578063c6eba7c4116100d3578063e8a7f4c511610097578063e8a7f4c514610957578063e985e9c514610994578063f117e173146109d1578063f2fde38b14610a0e578063f70a3de814610a4b578063f9613ab214610a8857610263565b8063c6eba7c414610862578063c87b56dd1461088b578063ccc094c2146108c8578063d824ee4f146108f1578063da2824a81461092e57610263565b8063adf288df1161011a578063adf288df14610760578063b238d6031461079d578063b5fdeb23146107de578063b88d4fde14610809578063c5bec6fc1461082557610263565b80638da5cb5b1461067b57806395d89b41146106a65780639a7c5e9f146106d1578063a22cb465146106fa578063ad0dec2f1461072357610263565b806349f2553a116101e45780635ae06f7e116101a85780635ae06f7e1461055e5780636352211e146105875780636b9cb86a146105c457806370a082311461060157806386e90b591461063e57610263565b806349f2553a146104525780634f64b2be1461047b5780634f6ccce7146104b85780635344299a146104f5578063559f5dc91461051e57610263565b806324e0febc1161022b57806324e0febc146103545780632b29ba23146103915780632f745c59146103ce57806340c84b0e1461040b57806342842e0e1461043657610263565b806301ffc9a71461026857806306fdde03146102a5578063081812fc146102d057806318160ddd1461030d57806323b872dd14610338575b600080fd5b34801561027457600080fd5b5061028f600480360381019061028a9190614901565b610ac5565b60405161029c9190614949565b60405180910390f35b3480156102b157600080fd5b506102ba610c19565b6040516102c791906149f4565b60405180910390f35b3480156102dc57600080fd5b506102f760048036038101906102f29190614a4c565b610ca7565b6040516103049190614aba565b60405180910390f35b34801561031957600080fd5b50610322610ce4565b60405161032f9190614ae4565b60405180910390f35b610352600480360381019061034d9190614b2b565b610cf1565b005b34801561036057600080fd5b5061037b60048036038101906103769190614bb4565b610d5c565b6040516103889190614bf0565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b39190614c0b565b610d74565b6040516103c59190614949565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f09190614c38565b610e20565b6040516104029190614ae4565b60405180910390f35b34801561041757600080fd5b50610420610e45565b60405161042d9190614ccd565b60405180910390f35b610450600480360381019061044b9190614b2b565b610ed3565b005b34801561045e57600080fd5b5061047960048036038101906104749190614e24565b610f3e565b005b34801561048757600080fd5b506104a2600480360381019061049d9190614a4c565b611256565b6040516104af9190614bf0565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da9190614a4c565b61127a565b6040516104ec9190614ae4565b60405180910390f35b34801561050157600080fd5b5061051c60048036038101906105179190614f0e565b61129e565b005b34801561052a57600080fd5b5061054560048036038101906105409190614f57565b61132a565b6040516105559493929190614fb8565b60405180910390f35b34801561056a57600080fd5b5061058560048036038101906105809190614c0b565b6113b1565b005b34801561059357600080fd5b506105ae60048036038101906105a99190614a4c565b6114d0565b6040516105bb9190614aba565b60405180910390f35b3480156105d057600080fd5b506105eb60048036038101906105e69190614f0e565b61150c565b6040516105f891906149f4565b60405180910390f35b34801561060d57600080fd5b5061062860048036038101906106239190614c0b565b611725565b6040516106359190614ae4565b60405180910390f35b34801561064a57600080fd5b5061066560048036038101906106609190614f0e565b61176e565b60405161067291906149f4565b60405180910390f35b34801561068757600080fd5b50610690611a19565b60405161069d9190614aba565b60405180910390f35b3480156106b257600080fd5b506106bb611a3d565b6040516106c891906149f4565b60405180910390f35b3480156106dd57600080fd5b506106f860048036038101906106f39190614a4c565b611acb565b005b34801561070657600080fd5b50610721600480360381019061071c9190615029565b611bbc565b005b34801561072f57600080fd5b5061074a60048036038101906107459190614f0e565b611e5e565b6040516107579190614ccd565b60405180910390f35b34801561076c57600080fd5b5061078760048036038101906107829190615069565b612135565b6040516107949190614bf0565b60405180910390f35b3480156107a957600080fd5b506107c460048036038101906107bf9190614a4c565b61248b565b6040516107d595949392919061513b565b60405180910390f35b3480156107ea57600080fd5b506107f361252a565b6040516108009190614ccd565b60405180910390f35b610823600480360381019061081e919061518e565b6125c4565b005b34801561083157600080fd5b5061084c60048036038101906108479190614f0e565b61269f565b6040516108599190614ccd565b60405180910390f35b34801561086e57600080fd5b5061088960048036038101906108849190615277565b612a58565b005b34801561089757600080fd5b506108b260048036038101906108ad9190614a4c565b612c10565b6040516108bf91906149f4565b60405180910390f35b3480156108d457600080fd5b506108ef60048036038101906108ea9190615336565b612d63565b005b3480156108fd57600080fd5b50610918600480360381019061091391906153a5565b613025565b6040516109259190614bf0565b60405180910390f35b34801561093a57600080fd5b5061095560048036038101906109509190614c0b565b6132ca565b005b34801561096357600080fd5b5061097e60048036038101906109799190614f0e565b6133b2565b60405161098b9190614ccd565b60405180910390f35b3480156109a057600080fd5b506109bb60048036038101906109b691906153f8565b61376b565b6040516109c89190614949565b60405180910390f35b3480156109dd57600080fd5b506109f860048036038101906109f39190615438565b613803565b604051610a059190614bf0565b60405180910390f35b348015610a1a57600080fd5b50610a356004803603810190610a309190614c0b565b6139ad565b604051610a429190614949565b60405180910390f35b348015610a5757600080fd5b50610a726004803603810190610a6d91906154d8565b613a51565b604051610a7f9190614949565b60405180910390f35b348015610a9457600080fd5b50610aaf6004803603810190610aaa9190614bb4565b613d7f565b604051610abc9190614bf0565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b195760019050610c14565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b6b5760019050610c14565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610bbd5760019050610c14565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c0f5760019050610c14565b600090505b919050565b60098054610c2690615547565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5290615547565b8015610c9f5780601f10610c7457610100808354040283529160200191610c9f565b820191906000526020600020905b815481529060010190602001808311610c8257829003601f168201915b505050505081565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600680549050905090565b610cfc838383613e2b565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610e19575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b600c602052816000526040600020602052806000526040600020600091509150505481565b600b8054610e5290615547565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7e90615547565b8015610ecb5780601f10610ea057610100808354040283529160200191610ecb565b820191906000526020600020905b815481529060010190602001808311610eae57829003601f168201915b505050505081565b610ede838383613e2b565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f9b57600080fd5b82915081519050602f7f01000000000000000000000000000000000000000000000000000000000000000282600183610fd491906155a7565b81518110610fe557610fe46155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146110655780806110619061560a565b9150505b8067ffffffffffffffff81111561107f5761107e614cf9565b5b6040519080825280601f01601f1916602001820160405280156110b15781602001600182028036833780820191505090505b50600b90816110c09190615804565b5060005b82518110156111b1578281815181106110e0576110df6155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600b82815461113890615547565b8110611147576111466155db565b5b8154600116156111665790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806111a99061560a565b9150506110c4565b5081518114611251577f2f00000000000000000000000000000000000000000000000000000000000000600b835181546111ea90615547565b81106111f9576111f86155db565b5b8154600116156112185790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b6003818154811061126657600080fd5b906000526020600020016000915090505481565b6006818154811061128a57600080fd5b906000526020600020016000915090505481565b6000600f6000601054815260200190815260200160002090508060000160009054906101000a900460ff1660ff168251146112d857600080fd5b81601190816112e79190615804565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c61131161252a565b60405161131e9190614ccd565b60405180910390a15050565b6004602052816000526040600020818154811061134657600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff169080600001600d9054906101000a900460ff16905084565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611436575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146c90615922565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061151c856133b2565b9150600b805461152b90615547565b9050905080825161153c9190615942565b67ffffffffffffffff81111561155557611554614cf9565b5b6040519080825280601f01601f1916602001820160405280156115875781602001600182028036833780820191505090505b50925060005b8181101561164c57600b8181546115a390615547565b81106115b2576115b16155db565b5b8154600116156115d15790600052602060002090602091828204019190065b9054901a7f01000000000000000000000000000000000000000000000000000000000000000284828151811061160a576116096155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806116449061560a565b91505061158d565b5060005b82518110156117195782818151811061166c5761166b6155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028483815181106116c9576116c86155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806117039061560a565b92505080806117119061560a565b915050611650565b50829350505050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600060608060006117808661269f565b9150600f6000601054815260200190815260200160002093508360000160029054906101000a900460ff1660ff16905060018251826117bf9190615942565b6117c99190615942565b67ffffffffffffffff8111156117e2576117e1614cf9565b5b6040519080825280601f01601f1916602001820160405280156118145781602001600182028036833780820191505090505b50925060005b818110156118ce578460000160039054906101000a9004700100000000000000000000000000000000028160108110611856576118556155db565b5b1a7f01000000000000000000000000000000000000000000000000000000000000000284828151811061188c5761188b6155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806118c69061560a565b91505061181a565b50603a7f010000000000000000000000000000000000000000000000000000000000000002838281518110611906576119056155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806119409061560a565b91505060005b8251811015611a0c57828181518110611962576119616155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028482846119b99190615942565b815181106119ca576119c96155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611a049061560a565b915050611946565b5082945050505050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a8054611a4a90615547565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7690615547565b8015611ac35780601f10611a9857610100808354040283529160200191611ac3565b820191906000526020600020905b815481529060010190602001808311611aa657829003601f168201915b505050505081565b6000600f6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff1611611b0357600080fd5b816010819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115611b3857611b37614cf9565b5b6040519080825280601f01601f191660200182016040528015611b6a5781602001600182028036833780820191505090505b5060119081611b799190615804565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c611ba361252a565b604051611bb09190614ccd565b60405180910390a15050565b8015611cdd57600073ffffffffffffffffffffffffffffffffffffffff16600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c5a57600080fd5b81600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611df5565b600073ffffffffffffffffffffffffffffffffffffffff16600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611d7557600080fd5b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e529190614949565b60405180910390a35050565b606060006060600f6000601054815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff168551611eb19190615942565b611ebb9190615942565b67ffffffffffffffff811115611ed457611ed3614cf9565b5b6040519080825280601f01601f191660200182016040528015611f065781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff16811015611fdc578260000160139054906101000a90047801000000000000000000000000000000000000000000000000028160088110611f6457611f636155db565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110611f9a57611f996155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611fd49061560a565b915050611f0c565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110612023576120226155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061205d9061560a565b91505060005b85518110156121295785818151811061207f5761207e6155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028382846120d69190615942565b815181106120e7576120e66155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806121219061560a565b915050612063565b50819350505050919050565b60008060008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806121de5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6121e757600080fd5b600160046000878152602001908152602001600020805490501461220a57600080fd5b600060046000878152602001908152602001600020600081548110612232576122316155db565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161461226457600080fd5b600060010260056000878152602001908152602001600020541461228757600080fd5b8573ffffffffffffffffffffffffffffffffffffffff1692507fc0000000000000000000000000000000000000000000000000000000000000008317925082600102600560008781526020019081526020016000208190555084600190049150600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080600d60008481526020019081526020016000208190555081600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055506001600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123e69190615942565b925050819055506006856001900490806001815401808255809150506001900390600052602060002001600090919091909150558573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8846040516124779190614ae4565b60405180910390a384935050505092915050565b600f6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060000160039054906101000a900470010000000000000000000000000000000002908060000160139054906101000a9004780100000000000000000000000000000000000000000000000002905085565b60606125bf6011805461253c90615547565b80601f016020809104026020016040519081016040528092919081815260200182805461256890615547565b80156125b55780601f1061258a576101008083540402835291602001916125b5565b820191906000526020600020905b81548152906001019060200180831161259857829003601f168201915b5050505050611e5e565b905090565b6125cf848484613e2b565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e846126849061599b565b6040516126919190614bf0565b60405180910390a450505050565b606080600080600285516126b39190615a02565b67ffffffffffffffff8111156126cc576126cb614cf9565b5b6040519080825280601f01601f1916602001820160405280156126fe5781602001600182028036833780820191505090505b5092506000905060005b6020811015612a4c57600460f0878381518110612728576127276155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015612827576030836127be9190615a44565b7f0100000000000000000000000000000000000000000000000000000000000000028483815181106127f3576127f26155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612899565b6057836128349190615a44565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110612869576128686155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f8682815181106128ae576128ad6155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff1610156129ac576030836129379190615a44565b7f010000000000000000000000000000000000000000000000000000000000000002846001846129679190615942565b81518110612978576129776155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a2a565b6057836129b99190615a44565b7f010000000000000000000000000000000000000000000000000000000000000002846001846129e99190615942565b815181106129fa576129f96155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282612a379190615942565b91508080612a449061560a565b915050612708565b50829350505050919050565b6000600460008581526020019081526020016000208361ffff1681548110612a8357612a826155db565b5b90600052602060002001905080600001600c9054906101000a900460ff1615612ae1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad890615ac5565b60405180910390fd5b80600001600d9054906101000a900460ff1615612b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2a90615b31565b60405180910390fd5b60008265ffffffffffff1603612b5d578060000160069054906101000a900465ffffffffffff1691505b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168265ffffffffffff161015612bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbd90615b9d565b60405180910390fd5b818160000160006101000a81548165ffffffffffff021916908365ffffffffffff160217905550600181600001600d6101000a81548160ff02191690831515021790555050505050565b6060600060608360010291506000600460008481526020019081526020016000208054905003612c4657612c4382613d7f565b91505b6000600460008481526020019081526020016000208054905011612c6957600080fd5b602067ffffffffffffffff811115612c8457612c83614cf9565b5b6040519080825280601f01601f191660200182016040528015612cb65781602001600182028036833780820191505090505b50905060005b6020811015612d5057828160208110612cd857612cd76155db565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110612d0e57612d0d6155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080612d489061560a565b915050612cbc565b50612d5a8161150c565b92505050919050565b6060819050601081511115612dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da490615c09565b60405180910390fd5b612db56147f3565b6000600790505b60008160ff1610612e11576000600882612dd69190615c29565b60ff1660ff9060020a029050600086821667ffffffffffffffff161115612dfd5750612e11565b8180612e0890615c66565b92505050612dbc565b600181612e1e9190615a44565b826020019060ff16908160ff16815250506008816007612e3e9190615c8f565b612e489190615c29565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082612ed490615cd9565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600f60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b600080600460008581526020019081526020016000208361ffff1681548110613051576130506155db565b5b90600052602060002001905080600001600c9054906101000a900460ff16156130af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a690615ac5565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806131525750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613191576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318890615922565b60405180910390fd5b60008361ffff161480156131c3575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b80156131dd575080600001600d9054906101000a900460ff165b1561323c5760018160000160068282829054906101000a900465ffffffffffff166132089190615d40565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055506132348585612135565b9150506132c3565b80600001600d9054906101000a900460ff161561329c578060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff161061329b57600080fd5b5b6132bf8585858460000160069054906101000a900465ffffffffffff1685614346565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334f90615922565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b606080600080600285516133c69190615a02565b67ffffffffffffffff8111156133df576133de614cf9565b5b6040519080825280601f01601f1916602001820160405280156134115781602001600182028036833780820191505090505b5092506000905060005b602081101561375f57600460f087838151811061343b5761343a6155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff16101561353a576030836134d19190615a44565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110613506576135056155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506135ac565b6057836135479190615a44565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061357c5761357b6155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f8682815181106135c1576135c06155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff1610156136bf5760308361364a9190615a44565b7f0100000000000000000000000000000000000000000000000000000000000000028460018461367a9190615942565b8151811061368b5761368a6155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061373d565b6057836136cc9190615a44565b7f010000000000000000000000000000000000000000000000000000000000000002846001846136fc9190615942565b8151811061370d5761370c6155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b60028261374a9190615942565b915080806137579061560a565b91505061341b565b50829350505050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff168154811061382f5761382e6155db565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806138de5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61391d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161391490615922565b60405180910390fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff161161394857600080fd5b80600001600d9054906101000a900460ff1661396357600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff161061399557600080fd5b6139a28686868685614346565b915050949350505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613a0857600080fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480613af75750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b2d90615922565b60405180910390fd5b613b3e614859565b600460008681526020019081526020016000208054905091506000821115613bbb57600060046000878152602001908152602001600020600081548110613b8857613b876155db565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff1611613bba57600080fd5b5b60008460050b03613bdc576001816060019015159081151581525050613c17565b60008460050b1315613c165783816000019065ffffffffffff16908165ffffffffffff168152505060018160600190151590811515815250505b5b60046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff021916908315150217905550606082015181600001600d6101000a81548160ff0219169083151502179055505050600385908060018154018082558091505060019003906000526020600020016000909190919091505580606001511515816000015165ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f77d96978d8b40ac826d1984d992e71a84672e62d825fda78cd646656481d065b88604051613d6b9190614bf0565b60405180910390a460019250505092915050565b60008060056000848152602001908152602001600020549050613da1816146fe565b613daa57600080fd5b613db381614730565b15613dc15782915050613e26565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60008060003073ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401613e859190614ae4565b602060405180830381865afa158015613ea2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ec69190615d8f565b92508573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613f0057600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614614034573373ffffffffffffffffffffffffffffffffffffffff166007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061402a57503373ffffffffffffffffffffffffffffffffffffffff16600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61403357600080fd5b5b60006007600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506140918486614762565b600d60008581526020019081526020016000205491506001600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140f391906155a7565b9050818111156141a357600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002054600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020819055505b6000600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055506001600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546142e091906155a7565b925050819055506001600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546143379190615942565b92505081905550505050505050565b60008060008060007fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008960019004169350603067ffffffffffffffff8961ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16841793508665ffffffffffff168417935083600102915060006001026005600084815260200190815260200160002054146143db57600080fd5b85600001600c9054906101000a900460ff1661443d578560000160069054906101000a900465ffffffffffff1665ffffffffffff168765ffffffffffff161461443c57600186600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff896001900416925060b8839060020a0292507f8000000000000000000000000000000000000000000000000000000000000000831792508973ffffffffffffffffffffffffffffffffffffffff168317925060018660000160068282829054906101000a900465ffffffffffff166144be9190615d40565b92506101000a81548165ffffffffffff021916908365ffffffffffff16021790555085600001600d9054906101000a900460ff1661453f5760018660000160008282829054906101000a900465ffffffffffff1661451c9190615d40565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055505b826001026005600084815260200190815260200160002081905550600e60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080600d60008681526020019081526020016000208190555083600c60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055506001600e60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546146599190615942565b9250508190555060068490806001815401808255809150506001900390600052602060002001600090919091909150558973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8866040516146e69190614ae4565b60405180910390a38194505050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b60008083600102905060056000828152602001908152602001600020546001900491506000820361479257600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6040518060800160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6148de816148a9565b81146148e957600080fd5b50565b6000813590506148fb816148d5565b92915050565b6000602082840312156149175761491661489f565b5b6000614925848285016148ec565b91505092915050565b60008115159050919050565b6149438161492e565b82525050565b600060208201905061495e600083018461493a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561499e578082015181840152602081019050614983565b60008484015250505050565b6000601f19601f8301169050919050565b60006149c682614964565b6149d0818561496f565b93506149e0818560208601614980565b6149e9816149aa565b840191505092915050565b60006020820190508181036000830152614a0e81846149bb565b905092915050565b6000819050919050565b614a2981614a16565b8114614a3457600080fd5b50565b600081359050614a4681614a20565b92915050565b600060208284031215614a6257614a6161489f565b5b6000614a7084828501614a37565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614aa482614a79565b9050919050565b614ab481614a99565b82525050565b6000602082019050614acf6000830184614aab565b92915050565b614ade81614a16565b82525050565b6000602082019050614af96000830184614ad5565b92915050565b614b0881614a99565b8114614b1357600080fd5b50565b600081359050614b2581614aff565b92915050565b600080600060608486031215614b4457614b4361489f565b5b6000614b5286828701614b16565b9350506020614b6386828701614b16565b9250506040614b7486828701614a37565b9150509250925092565b6000819050919050565b614b9181614b7e565b8114614b9c57600080fd5b50565b600081359050614bae81614b88565b92915050565b600060208284031215614bca57614bc961489f565b5b6000614bd884828501614b9f565b91505092915050565b614bea81614b7e565b82525050565b6000602082019050614c056000830184614be1565b92915050565b600060208284031215614c2157614c2061489f565b5b6000614c2f84828501614b16565b91505092915050565b60008060408385031215614c4f57614c4e61489f565b5b6000614c5d85828601614b16565b9250506020614c6e85828601614a37565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000614c9f82614c78565b614ca98185614c83565b9350614cb9818560208601614980565b614cc2816149aa565b840191505092915050565b60006020820190508181036000830152614ce78184614c94565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614d31826149aa565b810181811067ffffffffffffffff82111715614d5057614d4f614cf9565b5b80604052505050565b6000614d63614895565b9050614d6f8282614d28565b919050565b600067ffffffffffffffff821115614d8f57614d8e614cf9565b5b614d98826149aa565b9050602081019050919050565b82818337600083830152505050565b6000614dc7614dc284614d74565b614d59565b905082815260208101848484011115614de357614de2614cf4565b5b614dee848285614da5565b509392505050565b600082601f830112614e0b57614e0a614cef565b5b8135614e1b848260208601614db4565b91505092915050565b600060208284031215614e3a57614e3961489f565b5b600082013567ffffffffffffffff811115614e5857614e576148a4565b5b614e6484828501614df6565b91505092915050565b600067ffffffffffffffff821115614e8857614e87614cf9565b5b614e91826149aa565b9050602081019050919050565b6000614eb1614eac84614e6d565b614d59565b905082815260208101848484011115614ecd57614ecc614cf4565b5b614ed8848285614da5565b509392505050565b600082601f830112614ef557614ef4614cef565b5b8135614f05848260208601614e9e565b91505092915050565b600060208284031215614f2457614f2361489f565b5b600082013567ffffffffffffffff811115614f4257614f416148a4565b5b614f4e84828501614ee0565b91505092915050565b60008060408385031215614f6e57614f6d61489f565b5b6000614f7c85828601614b9f565b9250506020614f8d85828601614a37565b9150509250929050565b600065ffffffffffff82169050919050565b614fb281614f97565b82525050565b6000608082019050614fcd6000830187614fa9565b614fda6020830186614fa9565b614fe7604083018561493a565b614ff4606083018461493a565b95945050505050565b6150068161492e565b811461501157600080fd5b50565b60008135905061502381614ffd565b92915050565b600080604083850312156150405761503f61489f565b5b600061504e85828601614b16565b925050602061505f85828601615014565b9150509250929050565b600080604083850312156150805761507f61489f565b5b600061508e85828601614b16565b925050602061509f85828601614b9f565b9150509250929050565b600060ff82169050919050565b6150bf816150a9565b82525050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6150fa816150c5565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b61513581615100565b82525050565b600060a08201905061515060008301886150b6565b61515d60208301876150b6565b61516a60408301866150b6565b61517760608301856150f1565b615184608083018461512c565b9695505050505050565b600080600080608085870312156151a8576151a761489f565b5b60006151b687828801614b16565b94505060206151c787828801614b16565b93505060406151d887828801614a37565b925050606085013567ffffffffffffffff8111156151f9576151f86148a4565b5b61520587828801614ee0565b91505092959194509250565b600061ffff82169050919050565b61522881615211565b811461523357600080fd5b50565b6000813590506152458161521f565b92915050565b61525481614f97565b811461525f57600080fd5b50565b6000813590506152718161524b565b92915050565b6000806000606084860312156152905761528f61489f565b5b600061529e86828701614b9f565b93505060206152af86828701615236565b92505060406152c086828701615262565b9150509250925092565b6152d3816150a9565b81146152de57600080fd5b50565b6000813590506152f0816152ca565b92915050565b600067ffffffffffffffff82169050919050565b615313816152f6565b811461531e57600080fd5b50565b6000813590506153308161530a565b92915050565b60008060006060848603121561534f5761534e61489f565b5b600061535d868287016152e1565b935050602061536e86828701615321565b925050604084013567ffffffffffffffff81111561538f5761538e6148a4565b5b61539b86828701614df6565b9150509250925092565b6000806000606084860312156153be576153bd61489f565b5b60006153cc86828701614b16565b93505060206153dd86828701614b9f565b92505060406153ee86828701615236565b9150509250925092565b6000806040838503121561540f5761540e61489f565b5b600061541d85828601614b16565b925050602061542e85828601614b16565b9150509250929050565b600080600080608085870312156154525761545161489f565b5b600061546087828801614b16565b945050602061547187828801614b9f565b935050604061548287828801615236565b925050606061549387828801615262565b91505092959194509250565b60008160050b9050919050565b6154b58161549f565b81146154c057600080fd5b50565b6000813590506154d2816154ac565b92915050565b600080604083850312156154ef576154ee61489f565b5b60006154fd85828601614b9f565b925050602061550e858286016154c3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061555f57607f821691505b60208210810361557257615571615518565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006155b282614a16565b91506155bd83614a16565b92508282039050818111156155d5576155d4615578565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061561582614a16565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361564757615646615578565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b6000600883026156b77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615677565b6156c18683615677565b95508019841693508086168417925050509392505050565b6000819050919050565b60006156fe6156f96156f484614a16565b6156d9565b614a16565b9050919050565b6000819050919050565b615718836156e3565b61572c61572482615705565b848454615687565b825550505050565b600090565b615741615734565b61574c81848461570f565b505050565b5b8181101561577057615765600082615739565b600181019050615752565b5050565b601f8211156157b55761578681615652565b61578f84615667565b8101602085101561579e578190505b6157b26157aa85615667565b830182615751565b50505b505050565b60008160020a8304905092915050565b60006157db600019846008026157ba565b1980831691505092915050565b60006157f483836157ca565b9150826002028217905092915050565b61580d82614c78565b67ffffffffffffffff81111561582657615825614cf9565b5b6158308254615547565b61583b828285615774565b600060209050601f83116001811461586e576000841561585c578287015190505b61586685826157e8565b8655506158ce565b601f19841661587c86615652565b60005b828110156158a45784890151825560018201915060208501945060208101905061587f565b868310156158c157848901516158bd601f8916826157ca565b8355505b6001600288020188555050505b505050505050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061590c600a8361496f565b9150615917826158d6565b602082019050919050565b6000602082019050818103600083015261593b816158ff565b9050919050565b600061594d82614a16565b915061595883614a16565b92508282019050808211156159705761596f615578565b5b92915050565b6000819050602082019050919050565b60006159928251614b7e565b80915050919050565b60006159a682614c78565b826159b084615976565b90506159bb81615986565b925060208210156159fb576159f67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802615677565b831692505b5050919050565b6000615a0d82614a16565b9150615a1883614a16565b9250828202615a2681614a16565b91508282048414831517615a3d57615a3c615578565b5b5092915050565b6000615a4f826150a9565b9150615a5a836150a9565b9250828201905060ff811115615a7357615a72615578565b5b92915050565b7f4552525f53504152534500000000000000000000000000000000000000000000600082015250565b6000615aaf600a8361496f565b9150615aba82615a79565b602082019050919050565b60006020820190508181036000830152615ade81615aa2565b9050919050565b7f4552525f43415050454400000000000000000000000000000000000000000000600082015250565b6000615b1b600a8361496f565b9150615b2682615ae5565b602082019050919050565b60006020820190508181036000830152615b4a81615b0e565b9050919050565b7f4552525f4341505f4c4f57000000000000000000000000000000000000000000600082015250565b6000615b87600b8361496f565b9150615b9282615b51565b602082019050919050565b60006020820190508181036000830152615bb681615b7a565b9050919050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b6000615bf360138361496f565b9150615bfe82615bbd565b602082019050919050565b60006020820190508181036000830152615c2281615be6565b9050919050565b6000615c34826150a9565b9150615c3f836150a9565b9250828202615c4d816150a9565b9150808214615c5f57615c5e615578565b5b5092915050565b6000615c71826150a9565b915060008203615c8457615c83615578565b5b600182039050919050565b6000615c9a826150a9565b9150615ca5836150a9565b9250828203905060ff811115615cbe57615cbd615578565b5b92915050565b6000615cd082516150c5565b80915050919050565b6000615ce482614c78565b82615cee84615976565b9050615cf981615cc4565b92506010821015615d3957615d347fffffffffffffffffffffffffffffffff0000000000000000000000000000000083601003600802615677565b831692505b5050919050565b6000615d4b82614f97565b9150615d5683614f97565b9250828201905065ffffffffffff811115615d7457615d73615578565b5b92915050565b600081519050615d8981614aff565b92915050565b600060208284031215615da557615da461489f565b5b6000615db384828501615d7a565b9150509291505056fea2646970667358221220e3ecd63913c2c2b0049a2a85bd8a6c9217553ce71f3579d5e3a4e2f26b14dcf364736f6c63430008120033
+\ 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"},{"internalType":"bool","name":"_enumeration","type":"bool"}],"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":false,"internalType":"bytes","name":"_multiHash","type":"bytes"}],"name":"Msg","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":"uint8","name":"_length","type":"uint8"},{"internalType":"uint64","name":"_codecId","type":"uint64"},{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"addCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":"bytes","name":"_data","type":"bytes"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getMsg","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"multiCodecs","outputs":[{"internalType":"uint8","name":"l","type":"uint8"},{"internalType":"uint8","name":"codecRLength","type":"uint8"},{"internalType":"uint8","name":"prefixRLength","type":"uint8"},{"internalType":"bytes16","name":"prefix","type":"bytes16"},{"internalType":"bytes8","name":"codec","type":"bytes8"}],"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":"bytes","name":"_digest","type":"bytes"}],"name":"setMsg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_codec","type":"uint256"}],"name":"setMsgCodec","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":"bytes","name":"_digest","type":"bytes"}],"name":"toHash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"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":"","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}],"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"}],"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":false,"internalType":"bytes","name":"_multiHash","type":"bytes"}],"name":"Msg","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":"uint8","name":"_length","type":"uint8"},{"internalType":"uint64","name":"_codecId","type":"uint64"},{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"addCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":[{"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":"bytes","name":"_data","type":"bytes"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getMsg","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"multiCodecs","outputs":[{"internalType":"uint8","name":"l","type":"uint8"},{"internalType":"uint8","name":"codecRLength","type":"uint8"},{"internalType":"uint8","name":"prefixRLength","type":"uint8"},{"internalType":"bytes16","name":"prefix","type":"bytes16"},{"internalType":"bytes8","name":"codec","type":"bytes8"}],"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":"bytes","name":"_digest","type":"bytes"}],"name":"setMsg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_codec","type":"uint256"}],"name":"setMsgCodec","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":"bytes","name":"_digest","type":"bytes"}],"name":"toHash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"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":"","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
diff --git a/js/index.html b/js/index.html
@@ -51,8 +51,8 @@ dt {
<dd id="data_symbol"></dd>
<dt>supply</dt>
<dd id="data_supply"></dd>
- <dt>contract declaration</dt>
- <dd id="data_declaration"></dd>
+ <!--<dt>contract declaration</dt>
+ <dd id="data_declaration"></dd>-->
</dl>
<div id="interactive">
<h2>Allocate token</h2>
diff --git a/js/manual_test_browser.js b/js/manual_test_browser.js
@@ -335,15 +335,15 @@ async function run(w3, generated_session) {
return false;
});
- if (session.contentGateway !== undefined) {
- declarationUrl = session.contentGateway.url(session.declarationHash);
- let a = document.createElement('a')
- a.setAttribute('href', declarationUrl);
- a.innerHTML = declarationUrl;
- document.getElementById('data_declaration').appendChild(a);
- } else {
- document.getElementById('data_declaration').innerHTML = 'sha256:' + session.declarationHash;
- }
+// if (session.contentGateway !== undefined) {
+// declarationUrl = session.contentGateway.url(session.declarationHash);
+// let a = document.createElement('a')
+// a.setAttribute('href', declarationUrl);
+// a.innerHTML = declarationUrl;
+// document.getElementById('data_declaration').appendChild(a);
+// } else {
+// document.getElementById('data_declaration').innerHTML = 'sha256:' + session.declarationHash;
+// }
window.craftnft.getTokens(w3, session, (tokenId) => {
if (tokenId.substring(0, 2) == '0x') {
diff --git a/js/qrread.js b/js/qrread.js
@@ -499,3 +499,7 @@ 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/js/src/common.js b/js/src/common.js
@@ -12,7 +12,7 @@ var session = {
contract: undefined,
name: undefined,
symbol: undefined,
- declarationHash: undefined,
+ //declarationHash: undefined,
contentGatewayUrl: undefined,
contentGateway: undefined,
supply: 0,
diff --git a/js/src/engine.js b/js/src/engine.js
@@ -55,10 +55,10 @@ async function startSession(w3, config, session, runner) {
session.name = await session.contract.methods.name().call({from: session.account});
session.symbol = await session.contract.methods.symbol().call({from: session.account});
session.supply = await session.contract.methods.totalSupply().call({from: session.account});
- session.declarationHash = await session.contract.methods.declaration().call({from: session.account});
- if (session.declarationHash.substring(0,2) == '0x') {
- session.declarationHash = session.declarationHash.substring(2);
- }
+ //session.declarationHash = await session.contract.methods.declaration().call({from: session.account});
+ //if (session.declarationHash.substring(0,2) == '0x') {
+ // session.declarationHash = session.declarationHash.substring(2);
+ //}
runner(w3, session);
}
diff --git a/python/CHANGELOG b/python/CHANGELOG
@@ -2,6 +2,8 @@
* Remove obsolete CREATE argflag in publish script
* Implement multihash for contract content
* Add in-contract message capability
+ * Add per-token tokenURI support
+ * Add support for unbounded, cappable batches
- 0.0.3
* Implement chainlib-gen
* Apply fully qualified URL for tokenUri, with mutable base url
diff --git a/python/craft_nft/data/CraftNFT.bin b/python/craft_nft/data/CraftNFT.bin
@@ -1 +1 @@
-60806040523480156200001157600080fd5b5060405162006c7d38038062006c7d833981810160405281019062000037919062000b97565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600c8190555083600a90816200008f919062000e98565b5082600b9081620000a1919062000e98565b50620000f5602060126040518060400160405280600681526020017f736861323536000000000000000000000000000000000000000000000000000081525062000197640100000000026401000000009004565b6200011060126200046e640100000000026401000000009004565b602067ffffffffffffffff8111156200012e576200012d620009bb565b5b6040519080825280601f01601f191660200182016040528015620001615781602001600182028036833780820191505090505b506013908162000172919062000fef565b5080600660006101000a81548160ff0219169083151502179055505050505062001471565b6060819050601081511115620001e4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001db9062001137565b60405180910390fd5b620001ee62000926565b6000600790505b60008160ff16106200025257600060088262000212919062001195565b60ff1660ff9060020a029050600086821667ffffffffffffffff1611156200023b575062000252565b81806200024890620011db565b92505050620001f5565b60018162000261919062001209565b826020019060ff16908160ff1681525050600881600762000283919062001245565b6200028f919062001195565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff1681525050826200031d90620012d4565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081601160008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b600060116000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff1611620004a757600080fd5b816012819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115620004df57620004de620009bb565b5b6040519080825280601f01601f191660200182016040528015620005125781602001600182028036833780820191505090505b506013908162000523919062000fef565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c6200055e62000579640100000000026401000000009004565b6040516200056d919062001396565b60405180910390a15050565b606062000627601380546200058e9062000c81565b80601f0160208091040260200160405190810160405280929190818152602001828054620005bc9062000c81565b80156200060d5780601f10620005e1576101008083540402835291602001916200060d565b820191906000526020600020905b815481529060010190602001808311620005ef57829003601f168201915b50505050506200062c640100000000026401000000009004565b905090565b60606000606060116000601254815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff168551620006819190620013ba565b6200068d9190620013ba565b67ffffffffffffffff811115620006a957620006a8620009bb565b5b6040519080825280601f01601f191660200182016040528015620006dc5781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff16811015620007bc578260000160139054906101000a900478010000000000000000000000000000000000000000000000000281600881106200073e576200073d620013f5565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110620007775762000776620013f5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620007b39062001424565b915050620006e2565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110620008065762000805620013f5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620008429062001424565b91505060005b85518110156200091a57858181518110620008685762000867620013f5565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838284620008c19190620013ba565b81518110620008d557620008d4620013f5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620009119062001424565b91505062000848565b50819350505050919050565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620009f582620009aa565b810181811067ffffffffffffffff8211171562000a175762000a16620009bb565b5b80604052505050565b600062000a2c6200098c565b905062000a3a8282620009ea565b919050565b600067ffffffffffffffff82111562000a5d5762000a5c620009bb565b5b62000a6882620009aa565b9050602081019050919050565b60005b8381101562000a9557808201518184015260208101905062000a78565b60008484015250505050565b600062000ab862000ab28462000a3f565b62000a20565b90508281526020810184848401111562000ad75762000ad6620009a5565b5b62000ae484828562000a75565b509392505050565b600082601f83011262000b045762000b03620009a0565b5b815162000b1684826020860162000aa1565b91505092915050565b6000819050919050565b62000b348162000b1f565b811462000b4057600080fd5b50565b60008151905062000b548162000b29565b92915050565b60008115159050919050565b62000b718162000b5a565b811462000b7d57600080fd5b50565b60008151905062000b918162000b66565b92915050565b6000806000806080858703121562000bb45762000bb362000996565b5b600085015167ffffffffffffffff81111562000bd55762000bd46200099b565b5b62000be38782880162000aec565b945050602085015167ffffffffffffffff81111562000c075762000c066200099b565b5b62000c158782880162000aec565b935050604062000c288782880162000b43565b925050606062000c3b8782880162000b80565b91505092959194509250565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000c9a57607f821691505b60208210810362000cb05762000caf62000c52565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000d1d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000cdb565b62000d29868362000cdb565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000d7662000d7062000d6a8462000d41565b62000d4b565b62000d41565b9050919050565b6000819050919050565b62000d928362000d55565b62000daa62000da18262000d7d565b84845462000ceb565b825550505050565b600090565b62000dc162000db2565b62000dce81848462000d87565b505050565b5b8181101562000df65762000dea60008262000db7565b60018101905062000dd4565b5050565b601f82111562000e455762000e0f8162000cb6565b62000e1a8462000ccb565b8101602085101562000e2a578190505b62000e4262000e398562000ccb565b83018262000dd3565b50505b505050565b60008160020a8304905092915050565b600062000e6d6000198460080262000e4a565b1980831691505092915050565b600062000e88838362000e5a565b9150826002028217905092915050565b62000ea38262000c47565b67ffffffffffffffff81111562000ebf5762000ebe620009bb565b5b62000ecb825462000c81565b62000ed882828562000dfa565b600060209050601f83116001811462000f10576000841562000efb578287015190505b62000f07858262000e7a565b86555062000f77565b601f19841662000f208662000cb6565b60005b8281101562000f4a5784890151825560018201915060208501945060208101905062000f23565b8683101562000f6a578489015162000f66601f89168262000e5a565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b60008190508160005260206000209050919050565b601f82111562000fea5762000fb48162000f8a565b62000fbf8462000ccb565b8101602085101562000fcf578190505b62000fe762000fde8562000ccb565b83018262000dd3565b50505b505050565b62000ffa8262000f7f565b67ffffffffffffffff811115620010165762001015620009bb565b5b62001022825462000c81565b6200102f82828562000f9f565b600060209050601f83116001811462001067576000841562001052578287015190505b6200105e858262000e7a565b865550620010ce565b601f198416620010778662000f8a565b60005b82811015620010a1578489015182556001820191506020850194506020810190506200107a565b86831015620010c15784890151620010bd601f89168262000e5a565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b60006200111f601383620010d6565b91506200112c82620010e7565b602082019050919050565b60006020820190508181036000830152620011528162001110565b9050919050565b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620011a28262001159565b9150620011af8362001159565b9250828202620011bf8162001159565b9150808214620011d457620011d362001166565b5b5092915050565b6000620011e88262001159565b915060008203620011fe57620011fd62001166565b5b600182039050919050565b6000620012168262001159565b9150620012238362001159565b9250828201905060ff8111156200123f576200123e62001166565b5b92915050565b6000620012528262001159565b91506200125f8362001159565b9250828203905060ff8111156200127b576200127a62001166565b5b92915050565b6000819050602082019050919050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6000620012cb825162001291565b80915050919050565b6000620012e18262000f7f565b82620012ed8462001281565b9050620012fa81620012bd565b925060108210156200133d57620013387fffffffffffffffffffffffffffffffff000000000000000000000000000000008360100360080262000cdb565b831692505b5050919050565b600082825260208201905092915050565b6000620013628262000f7f565b6200136e818562001344565b93506200138081856020860162000a75565b6200138b81620009aa565b840191505092915050565b60006020820190508181036000830152620013b2818462001355565b905092915050565b6000620013c78262000d41565b9150620013d48362000d41565b9250828201905080821115620013ef57620013ee62001166565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000620014318262000d41565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362001466576200146562001166565b5b600182019050919050565b6157fc80620014816000396000f3fe608060405260043610610263576000357c01000000000000000000000000000000000000000000000000000000009004806386e90b5911610156578063b88d4fde116100d3578063da2824a811610097578063da2824a81461096c578063e8a7f4c514610995578063e985e9c5146109d2578063f117e17314610a0f578063f2fde38b14610a4c578063f9613ab214610a8957610263565b8063b88d4fde14610870578063c5bec6fc1461088c578063c87b56dd146108c9578063ccc094c214610906578063d824ee4f1461092f57610263565b8063ad0dec2f1161011a578063ad0dec2f1461075f578063adf288df1461079c578063b1a6afd3146107d9578063b238d60314610804578063b5fdeb231461084557610263565b806386e90b591461067a5780638da5cb5b146106b757806395d89b41146106e25780639a7c5e9f1461070d578063a22cb4651461073657610263565b806349f2553a116101e4578063559f5dc9116101a8578063559f5dc91461055b5780635ae06f7e1461059a5780636352211e146105c35780636b9cb86a1461060057806370a082311461063d57610263565b806349f2553a146104525780634d03546a1461047b5780634f64b2be146104b85780634f6ccce7146104f55780635344299a1461053257610263565b806324e0febc1161022b57806324e0febc146103545780632b29ba23146103915780632f745c59146103ce57806340c84b0e1461040b57806342842e0e1461043657610263565b806301ffc9a71461026857806306fdde03146102a5578063081812fc146102d057806318160ddd1461030d57806323b872dd14610338575b600080fd5b34801561027457600080fd5b5061028f600480360381019061028a919061447d565b610ac6565b60405161029c91906144c5565b60405180910390f35b3480156102b157600080fd5b506102ba610c1a565b6040516102c79190614570565b60405180910390f35b3480156102dc57600080fd5b506102f760048036038101906102f291906145c8565b610ca8565b6040516103049190614636565b60405180910390f35b34801561031957600080fd5b50610322610ce5565b60405161032f9190614660565b60405180910390f35b610352600480360381019061034d91906146a7565b610cf2565b005b34801561036057600080fd5b5061037b60048036038101906103769190614730565b610d5d565b604051610388919061476c565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b39190614787565b610d75565b6040516103c591906144c5565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f091906147b4565b610e21565b6040516104029190614660565b60405180910390f35b34801561041757600080fd5b50610420610e46565b60405161042d9190614849565b60405180910390f35b610450600480360381019061044b91906146a7565b610ed4565b005b34801561045e57600080fd5b50610479600480360381019061047491906149a0565b610f3f565b005b34801561048757600080fd5b506104a2600480360381019061049d9190614a27565b611257565b6040516104af91906144c5565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da91906145c8565b6114e4565b6040516104ec919061476c565b60405180910390f35b34801561050157600080fd5b5061051c600480360381019061051791906145c8565b611508565b6040516105299190614660565b60405180910390f35b34801561053e57600080fd5b5061055960048036038101906105549190614b08565b61152c565b005b34801561056757600080fd5b50610582600480360381019061057d9190614b51565b6115b8565b60405161059193929190614ba0565b60405180910390f35b3480156105a657600080fd5b506105c160048036038101906105bc9190614787565b61162c565b005b3480156105cf57600080fd5b506105ea60048036038101906105e591906145c8565b61174b565b6040516105f79190614636565b60405180910390f35b34801561060c57600080fd5b5061062760048036038101906106229190614b08565b611787565b6040516106349190614570565b60405180910390f35b34801561064957600080fd5b50610664600480360381019061065f9190614787565b6119a0565b6040516106719190614660565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190614b08565b6119e9565b6040516106ae9190614570565b60405180910390f35b3480156106c357600080fd5b506106cc611c94565b6040516106d99190614636565b60405180910390f35b3480156106ee57600080fd5b506106f7611cb8565b6040516107049190614570565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f91906145c8565b611d46565b005b34801561074257600080fd5b5061075d60048036038101906107589190614c03565b611e37565b005b34801561076b57600080fd5b5061078660048036038101906107819190614b08565b6120d9565b6040516107939190614849565b60405180910390f35b3480156107a857600080fd5b506107c360048036038101906107be9190614c43565b6123b0565b6040516107d0919061476c565b60405180910390f35b3480156107e557600080fd5b506107ee61271c565b6040516107fb919061476c565b60405180910390f35b34801561081057600080fd5b5061082b600480360381019061082691906145c8565b612722565b60405161083c959493929190614d15565b60405180910390f35b34801561085157600080fd5b5061085a6127c1565b6040516108679190614849565b60405180910390f35b61088a60048036038101906108859190614d68565b61285b565b005b34801561089857600080fd5b506108b360048036038101906108ae9190614b08565b612936565b6040516108c09190614849565b60405180910390f35b3480156108d557600080fd5b506108f060048036038101906108eb91906145c8565b612cef565b6040516108fd9190614570565b60405180910390f35b34801561091257600080fd5b5061092d60048036038101906109289190614e57565b612e42565b005b34801561093b57600080fd5b5061095660048036038101906109519190614f00565b613104565b604051610963919061476c565b60405180910390f35b34801561097857600080fd5b50610993600480360381019061098e9190614787565b613377565b005b3480156109a157600080fd5b506109bc60048036038101906109b79190614b08565b61345f565b6040516109c99190614849565b60405180910390f35b3480156109de57600080fd5b506109f960048036038101906109f49190614f53565b613818565b604051610a0691906144c5565b60405180910390f35b348015610a1b57600080fd5b50610a366004803603810190610a319190614f93565b6138b0565b604051610a43919061476c565b60405180910390f35b348015610a5857600080fd5b50610a736004803603810190610a6e9190614787565b613a3f565b604051610a8091906144c5565b60405180910390f35b348015610a9557600080fd5b50610ab06004803603810190610aab9190614730565b613ae3565b604051610abd919061476c565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b1a5760019050610c15565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b6c5760019050610c15565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610bbe5760019050610c15565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c105760019050610c15565b600090505b919050565b600a8054610c2790615029565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5390615029565b8015610ca05780601f10610c7557610100808354040283529160200191610ca0565b820191906000526020600020905b815481529060010190602001808311610c8357829003601f168201915b505050505081565b60006008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600780549050905090565b610cfd838383613b8f565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610e1a575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b600e602052816000526040600020602052806000526040600020600091509150505481565b600d8054610e5390615029565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7f90615029565b8015610ecc5780601f10610ea157610100808354040283529160200191610ecc565b820191906000526020600020905b815481529060010190602001808311610eaf57829003601f168201915b505050505081565b610edf838383613b8f565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f9c57600080fd5b82915081519050602f7f01000000000000000000000000000000000000000000000000000000000000000282600183610fd59190615089565b81518110610fe657610fe56150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611066578080611062906150ec565b9150505b8067ffffffffffffffff8111156110805761107f614875565b5b6040519080825280601f01601f1916602001820160405280156110b25781602001600182028036833780820191505090505b50600d90816110c191906152e6565b5060005b82518110156111b2578281815181106110e1576110e06150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600d82815461113990615029565b8110611148576111476150bd565b5b8154600116156111675790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806111aa906150ec565b9150506110c5565b5081518114611252577f2f00000000000000000000000000000000000000000000000000000000000000600d835181546111eb90615029565b81106111fa576111f96150bd565b5b8154600116156112195790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806112fd5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61130657600080fd5b61130e614378565b60046000868152602001908152602001600020805490509150600082111561138b57600060046000878152602001908152602001600020600081548110611358576113576150bd565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161161138a57600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff021916908315150217905550505060038590806001815401808255809150506001900390600052602060002001600090919091909150558365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c342876040516114d0919061476c565b60405180910390a360019250505092915050565b600381815481106114f457600080fd5b906000526020600020016000915090505481565b6007818154811061151857600080fd5b906000526020600020016000915090505481565b600060116000601254815260200190815260200160002090508060000160009054906101000a900460ff1660ff1682511461156657600080fd5b816013908161157591906152e6565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c61159f6127c1565b6040516115ac9190614849565b60405180910390a15050565b600460205281600052604060002081815481106115d457600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806116b1575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6116f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e790615404565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b606080606060006117978561345f565b9150600d80546117a690615029565b905090508082516117b79190615424565b67ffffffffffffffff8111156117d0576117cf614875565b5b6040519080825280601f01601f1916602001820160405280156118025781602001600182028036833780820191505090505b50925060005b818110156118c757600d81815461181e90615029565b811061182d5761182c6150bd565b5b81546001161561184c5790600052602060002090602091828204019190065b9054901a7f010000000000000000000000000000000000000000000000000000000000000002848281518110611885576118846150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806118bf906150ec565b915050611808565b5060005b8251811015611994578281815181106118e7576118e66150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002848381518110611944576119436150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818061197e906150ec565b925050808061198c906150ec565b9150506118cb565b50829350505050919050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600060608060006119fb86612936565b915060116000601254815260200190815260200160002093508360000160029054906101000a900460ff1660ff1690506001825182611a3a9190615424565b611a449190615424565b67ffffffffffffffff811115611a5d57611a5c614875565b5b6040519080825280601f01601f191660200182016040528015611a8f5781602001600182028036833780820191505090505b50925060005b81811015611b49578460000160039054906101000a9004700100000000000000000000000000000000028160108110611ad157611ad06150bd565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002848281518110611b0757611b066150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611b41906150ec565b915050611a95565b50603a7f010000000000000000000000000000000000000000000000000000000000000002838281518110611b8157611b806150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611bbb906150ec565b91505060005b8251811015611c8757828181518110611bdd57611bdc6150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002848284611c349190615424565b81518110611c4557611c446150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611c7f906150ec565b915050611bc1565b5082945050505050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b8054611cc590615029565b80601f0160208091040260200160405190810160405280929190818152602001828054611cf190615029565b8015611d3e5780601f10611d1357610100808354040283529160200191611d3e565b820191906000526020600020905b815481529060010190602001808311611d2157829003601f168201915b505050505081565b600060116000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff1611611d7e57600080fd5b816012819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115611db357611db2614875565b5b6040519080825280601f01601f191660200182016040528015611de55781602001600182028036833780820191505090505b5060139081611df491906152e6565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c611e1e6127c1565b604051611e2b9190614849565b60405180910390a15050565b8015611f5857600073ffffffffffffffffffffffffffffffffffffffff16600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ed557600080fd5b81600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612070565b600073ffffffffffffffffffffffffffffffffffffffff16600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611ff057600080fd5b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120cd91906144c5565b60405180910390a35050565b60606000606060116000601254815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff16855161212c9190615424565b6121369190615424565b67ffffffffffffffff81111561214f5761214e614875565b5b6040519080825280601f01601f1916602001820160405280156121815781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff16811015612257578260000160139054906101000a900478010000000000000000000000000000000000000000000000000281600881106121df576121de6150bd565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110612215576122146150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061224f906150ec565b915050612187565b8260000160009054906101000a900460ff167f01000000000000000000000000000000000000000000000000000000000000000282828151811061229e5761229d6150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806122d8906150ec565b91505060005b85518110156123a4578581815181106122fa576122f96150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028382846123519190615424565b81518110612362576123616150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061239c906150ec565b9150506122de565b50819350505050919050565b60008060008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806124595750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61246257600080fd5b600160046000878152602001908152602001600020805490501461248557600080fd5b6000600460008781526020019081526020016000206000815481106124ad576124ac6150bd565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff16146124df57600080fd5b600060010260056000878152602001908152602001600020541461250257600080fd5b8573ffffffffffffffffffffffffffffffffffffffff1692507fc0000000000000000000000000000000000000000000000000000000000000008317925082600102600560008781526020019081526020016000208190555084600190049150600660009054906101000a900460ff161561262757601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080600f60008481526020019081526020016000208190555081600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055505b6001601060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126779190615424565b925050819055506007856001900490806001815401808255809150506001900390600052602060002001600090919091909150558573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8846040516127089190614660565b60405180910390a384935050505092915050565b600c5481565b60116020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060000160039054906101000a900470010000000000000000000000000000000002908060000160139054906101000a9004780100000000000000000000000000000000000000000000000002905085565b6060612856601380546127d390615029565b80601f01602080910402602001604051908101604052809291908181526020018280546127ff90615029565b801561284c5780601f106128215761010080835404028352916020019161284c565b820191906000526020600020905b81548152906001019060200180831161282f57829003601f168201915b50505050506120d9565b905090565b612866848484613b8f565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e8461291b9061547d565b604051612928919061476c565b60405180910390a450505050565b6060806000806002855161294a91906154e4565b67ffffffffffffffff81111561296357612962614875565b5b6040519080825280601f01601f1916602001820160405280156129955781602001600182028036833780820191505090505b5092506000905060005b6020811015612ce357600460f08783815181106129bf576129be6150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015612abe57603083612a559190615526565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110612a8a57612a896150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612b30565b605783612acb9190615526565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110612b0057612aff6150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868281518110612b4557612b446150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015612c4357603083612bce9190615526565b7f01000000000000000000000000000000000000000000000000000000000000000284600184612bfe9190615424565b81518110612c0f57612c0e6150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612cc1565b605783612c509190615526565b7f01000000000000000000000000000000000000000000000000000000000000000284600184612c809190615424565b81518110612c9157612c906150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282612cce9190615424565b91508080612cdb906150ec565b91505061299f565b50829350505050919050565b6060600060608360010291506000600460008481526020019081526020016000208054905003612d2557612d2282613ae3565b91505b6000600460008481526020019081526020016000208054905011612d4857600080fd5b602067ffffffffffffffff811115612d6357612d62614875565b5b6040519080825280601f01601f191660200182016040528015612d955781602001600182028036833780820191505090505b50905060005b6020811015612e2f57828160208110612db757612db66150bd565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110612ded57612dec6150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080612e27906150ec565b915050612d9b565b50612e3981611787565b92505050919050565b6060819050601081511115612e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e83906155a7565b60405180910390fd5b612e946143ab565b6000600790505b60008160ff1610612ef0576000600882612eb591906155c7565b60ff1660ff9060020a029050600086821667ffffffffffffffff161115612edc5750612ef0565b8180612ee790615604565b92505050612e9b565b600181612efd9190615526565b826020019060ff16908160ff16815250506008816007612f1d919061562d565b612f2791906155c7565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082612fb390615677565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081601160008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b600080600460008581526020019081526020016000208361ffff16815481106131305761312f6150bd565b5b90600052602060002001905080600001600c9054906101000a900460ff161561318e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131859061572a565b60405180910390fd5b60008361ffff161480156131c0575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b1561321f5760018160000160068282829054906101000a900465ffffffffffff166131eb919061574a565b92506101000a81548165ffffffffffff021916908365ffffffffffff16021790555061321785856123b0565b915050613370565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806132c25750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f890615404565b60405180910390fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff161061334957600080fd5b61336c8585858460000160069054906101000a900465ffffffffffff1685613f14565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133fc90615404565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6060806000806002855161347391906154e4565b67ffffffffffffffff81111561348c5761348b614875565b5b6040519080825280601f01601f1916602001820160405280156134be5781602001600182028036833780820191505090505b5092506000905060005b602081101561380c57600460f08783815181106134e8576134e76150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff1610156135e75760308361357e9190615526565b7f0100000000000000000000000000000000000000000000000000000000000000028483815181106135b3576135b26150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613659565b6057836135f49190615526565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110613629576136286150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f86828151811061366e5761366d6150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff16101561376c576030836136f79190615526565b7f010000000000000000000000000000000000000000000000000000000000000002846001846137279190615424565b81518110613738576137376150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506137ea565b6057836137799190615526565b7f010000000000000000000000000000000000000000000000000000000000000002846001846137a99190615424565b815181106137ba576137b96150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b6002826137f79190615424565b91508080613804906150ec565b9150506134c8565b50829350505050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff16815481106138dc576138db6150bd565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061398b5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6139ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139c190615404565b60405180910390fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff16116139f557600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff1610613a2757600080fd5b613a348686868685613f14565b915050949350505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613a9a57600080fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b60008060056000848152602001908152602001600020549050613b0581614283565b613b0e57600080fd5b613b17816142b5565b15613b255782915050613b8a565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b6000803073ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401613be79190614660565b602060405180830381865afa158015613c04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c289190615799565b91508473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613c6257600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614613d96573373ffffffffffffffffffffffffffffffffffffffff166008600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480613d8c57503373ffffffffffffffffffffffffffffffffffffffff16600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b613d9557600080fd5b5b60006008600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613df383856142e7565b600f60008481526020019081526020016000205490506000600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055506001601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613eaf9190615089565b925050819055506001601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613f069190615424565b925050819055505050505050565b60008060008060007fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008960019004169350603067ffffffffffffffff8961ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16841793508665ffffffffffff16841793508360010291506000600102600560008481526020019081526020016000205414613fa957600080fd5b85600001600c9054906101000a900460ff1661400b578560000160069054906101000a900465ffffffffffff1665ffffffffffff168765ffffffffffff161461400a57600186600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff896001900416925060b8839060020a0292507f8000000000000000000000000000000000000000000000000000000000000000831792508973ffffffffffffffffffffffffffffffffffffffff168317925060018660000160068282829054906101000a900465ffffffffffff1661408c919061574a565b92506101000a81548165ffffffffffff021916908365ffffffffffff160217905550826001026005600084815260200190815260200160002081905550600660009054906101000a900460ff161561418e57601060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080600f60008681526020019081526020016000208190555083600e60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055505b6001601060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546141de9190615424565b9250508190555060078490806001815401808255809150506001900390600052602060002001600090919091909150558973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88660405161426b9190614660565b60405180910390a38194505050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b60008083600102905060056000828152602001908152602001600020546001900491506000820361431757600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61445a81614425565b811461446557600080fd5b50565b60008135905061447781614451565b92915050565b6000602082840312156144935761449261441b565b5b60006144a184828501614468565b91505092915050565b60008115159050919050565b6144bf816144aa565b82525050565b60006020820190506144da60008301846144b6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561451a5780820151818401526020810190506144ff565b60008484015250505050565b6000601f19601f8301169050919050565b6000614542826144e0565b61454c81856144eb565b935061455c8185602086016144fc565b61456581614526565b840191505092915050565b6000602082019050818103600083015261458a8184614537565b905092915050565b6000819050919050565b6145a581614592565b81146145b057600080fd5b50565b6000813590506145c28161459c565b92915050565b6000602082840312156145de576145dd61441b565b5b60006145ec848285016145b3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614620826145f5565b9050919050565b61463081614615565b82525050565b600060208201905061464b6000830184614627565b92915050565b61465a81614592565b82525050565b60006020820190506146756000830184614651565b92915050565b61468481614615565b811461468f57600080fd5b50565b6000813590506146a18161467b565b92915050565b6000806000606084860312156146c0576146bf61441b565b5b60006146ce86828701614692565b93505060206146df86828701614692565b92505060406146f0868287016145b3565b9150509250925092565b6000819050919050565b61470d816146fa565b811461471857600080fd5b50565b60008135905061472a81614704565b92915050565b6000602082840312156147465761474561441b565b5b60006147548482850161471b565b91505092915050565b614766816146fa565b82525050565b6000602082019050614781600083018461475d565b92915050565b60006020828403121561479d5761479c61441b565b5b60006147ab84828501614692565b91505092915050565b600080604083850312156147cb576147ca61441b565b5b60006147d985828601614692565b92505060206147ea858286016145b3565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b600061481b826147f4565b61482581856147ff565b93506148358185602086016144fc565b61483e81614526565b840191505092915050565b600060208201905081810360008301526148638184614810565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6148ad82614526565b810181811067ffffffffffffffff821117156148cc576148cb614875565b5b80604052505050565b60006148df614411565b90506148eb82826148a4565b919050565b600067ffffffffffffffff82111561490b5761490a614875565b5b61491482614526565b9050602081019050919050565b82818337600083830152505050565b600061494361493e846148f0565b6148d5565b90508281526020810184848401111561495f5761495e614870565b5b61496a848285614921565b509392505050565b600082601f8301126149875761498661486b565b5b8135614997848260208601614930565b91505092915050565b6000602082840312156149b6576149b561441b565b5b600082013567ffffffffffffffff8111156149d4576149d3614420565b5b6149e084828501614972565b91505092915050565b600065ffffffffffff82169050919050565b614a04816149e9565b8114614a0f57600080fd5b50565b600081359050614a21816149fb565b92915050565b60008060408385031215614a3e57614a3d61441b565b5b6000614a4c8582860161471b565b9250506020614a5d85828601614a12565b9150509250929050565b600067ffffffffffffffff821115614a8257614a81614875565b5b614a8b82614526565b9050602081019050919050565b6000614aab614aa684614a67565b6148d5565b905082815260208101848484011115614ac757614ac6614870565b5b614ad2848285614921565b509392505050565b600082601f830112614aef57614aee61486b565b5b8135614aff848260208601614a98565b91505092915050565b600060208284031215614b1e57614b1d61441b565b5b600082013567ffffffffffffffff811115614b3c57614b3b614420565b5b614b4884828501614ada565b91505092915050565b60008060408385031215614b6857614b6761441b565b5b6000614b768582860161471b565b9250506020614b87858286016145b3565b9150509250929050565b614b9a816149e9565b82525050565b6000606082019050614bb56000830186614b91565b614bc26020830185614b91565b614bcf60408301846144b6565b949350505050565b614be0816144aa565b8114614beb57600080fd5b50565b600081359050614bfd81614bd7565b92915050565b60008060408385031215614c1a57614c1961441b565b5b6000614c2885828601614692565b9250506020614c3985828601614bee565b9150509250929050565b60008060408385031215614c5a57614c5961441b565b5b6000614c6885828601614692565b9250506020614c798582860161471b565b9150509250929050565b600060ff82169050919050565b614c9981614c83565b82525050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b614cd481614c9f565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b614d0f81614cda565b82525050565b600060a082019050614d2a6000830188614c90565b614d376020830187614c90565b614d446040830186614c90565b614d516060830185614ccb565b614d5e6080830184614d06565b9695505050505050565b60008060008060808587031215614d8257614d8161441b565b5b6000614d9087828801614692565b9450506020614da187828801614692565b9350506040614db2878288016145b3565b925050606085013567ffffffffffffffff811115614dd357614dd2614420565b5b614ddf87828801614ada565b91505092959194509250565b614df481614c83565b8114614dff57600080fd5b50565b600081359050614e1181614deb565b92915050565b600067ffffffffffffffff82169050919050565b614e3481614e17565b8114614e3f57600080fd5b50565b600081359050614e5181614e2b565b92915050565b600080600060608486031215614e7057614e6f61441b565b5b6000614e7e86828701614e02565b9350506020614e8f86828701614e42565b925050604084013567ffffffffffffffff811115614eb057614eaf614420565b5b614ebc86828701614972565b9150509250925092565b600061ffff82169050919050565b614edd81614ec6565b8114614ee857600080fd5b50565b600081359050614efa81614ed4565b92915050565b600080600060608486031215614f1957614f1861441b565b5b6000614f2786828701614692565b9350506020614f388682870161471b565b9250506040614f4986828701614eeb565b9150509250925092565b60008060408385031215614f6a57614f6961441b565b5b6000614f7885828601614692565b9250506020614f8985828601614692565b9150509250929050565b60008060008060808587031215614fad57614fac61441b565b5b6000614fbb87828801614692565b9450506020614fcc8782880161471b565b9350506040614fdd87828801614eeb565b9250506060614fee87828801614a12565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061504157607f821691505b60208210810361505457615053614ffa565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061509482614592565b915061509f83614592565b92508282039050818111156150b7576150b661505a565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006150f782614592565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036151295761512861505a565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b6000600883026151997fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615159565b6151a38683615159565b95508019841693508086168417925050509392505050565b6000819050919050565b60006151e06151db6151d684614592565b6151bb565b614592565b9050919050565b6000819050919050565b6151fa836151c5565b61520e615206826151e7565b848454615169565b825550505050565b600090565b615223615216565b61522e8184846151f1565b505050565b5b818110156152525761524760008261521b565b600181019050615234565b5050565b601f8211156152975761526881615134565b61527184615149565b81016020851015615280578190505b61529461528c85615149565b830182615233565b50505b505050565b60008160020a8304905092915050565b60006152bd6000198460080261529c565b1980831691505092915050565b60006152d683836152ac565b9150826002028217905092915050565b6152ef826147f4565b67ffffffffffffffff81111561530857615307614875565b5b6153128254615029565b61531d828285615256565b600060209050601f831160018114615350576000841561533e578287015190505b61534885826152ca565b8655506153b0565b601f19841661535e86615134565b60005b8281101561538657848901518255600182019150602085019450602081019050615361565b868310156153a3578489015161539f601f8916826152ac565b8355505b6001600288020188555050505b505050505050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006153ee600a836144eb565b91506153f9826153b8565b602082019050919050565b6000602082019050818103600083015261541d816153e1565b9050919050565b600061542f82614592565b915061543a83614592565b92508282019050808211156154525761545161505a565b5b92915050565b6000819050602082019050919050565b600061547482516146fa565b80915050919050565b6000615488826147f4565b8261549284615458565b905061549d81615468565b925060208210156154dd576154d87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802615159565b831692505b5050919050565b60006154ef82614592565b91506154fa83614592565b925082820261550881614592565b9150828204841483151761551f5761551e61505a565b5b5092915050565b600061553182614c83565b915061553c83614c83565b9250828201905060ff8111156155555761555461505a565b5b92915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b60006155916013836144eb565b915061559c8261555b565b602082019050919050565b600060208201905081810360008301526155c081615584565b9050919050565b60006155d282614c83565b91506155dd83614c83565b92508282026155eb81614c83565b91508082146155fd576155fc61505a565b5b5092915050565b600061560f82614c83565b9150600082036156225761562161505a565b5b600182039050919050565b600061563882614c83565b915061564383614c83565b9250828203905060ff81111561565c5761565b61505a565b5b92915050565b600061566e8251614c9f565b80915050919050565b6000615682826147f4565b8261568c84615458565b905061569781615662565b925060108210156156d7576156d27fffffffffffffffffffffffffffffffff0000000000000000000000000000000083601003600802615159565b831692505b5050919050565b7f4552525f53504152534500000000000000000000000000000000000000000000600082015250565b6000615714600a836144eb565b915061571f826156de565b602082019050919050565b6000602082019050818103600083015261574381615707565b9050919050565b6000615755826149e9565b9150615760836149e9565b9250828201905065ffffffffffff81111561577e5761577d61505a565b5b92915050565b6000815190506157938161467b565b92915050565b6000602082840312156157af576157ae61441b565b5b60006157bd84828501615784565b9150509291505056fea26469706673582212209c705c9e1194892f8963a676a7c89711310c7e29ec8d2831c88dc1d43a6ee06c64736f6c63430008120033
-\ No newline at end of file
+60806040523480156200001157600080fd5b50604051620071ad380380620071ad833981810160405281019062000037919062000afc565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816009908162000088919062000dd2565b5080600a90816200009a919062000dd2565b50620000ee602060126040518060400160405280600681526020017f736861323536000000000000000000000000000000000000000000000000000081525062000174640100000000026401000000009004565b6200010960126200044b640100000000026401000000009004565b602067ffffffffffffffff81111562000127576200012662000998565b5b6040519080825280601f01601f1916602001820160405280156200015a5781602001600182028036833780820191505090505b50601190816200016b919062000f29565b505050620013ab565b6060819050601081511115620001c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001b89062001071565b60405180910390fd5b620001cb62000903565b6000600790505b60008160ff16106200022f576000600882620001ef9190620010cf565b60ff1660ff9060020a029050600086821667ffffffffffffffff1611156200021857506200022f565b8180620002259062001115565b92505050620001d2565b6001816200023e919062001143565b826020019060ff16908160ff168152505060088160076200026091906200117f565b6200026c9190620010cf565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082620002fa906200120e565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600f60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b6000600f6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff16116200048457600080fd5b816010819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115620004bc57620004bb62000998565b5b6040519080825280601f01601f191660200182016040528015620004ef5781602001600182028036833780820191505090505b506011908162000500919062000f29565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c6200053b62000556640100000000026401000000009004565b6040516200054a9190620012d0565b60405180910390a15050565b606062000604601180546200056b9062000bbb565b80601f0160208091040260200160405190810160405280929190818152602001828054620005999062000bbb565b8015620005ea5780601f10620005be57610100808354040283529160200191620005ea565b820191906000526020600020905b815481529060010190602001808311620005cc57829003601f168201915b505050505062000609640100000000026401000000009004565b905090565b606060006060600f6000601054815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff1685516200065e9190620012f4565b6200066a9190620012f4565b67ffffffffffffffff81111562000686576200068562000998565b5b6040519080825280601f01601f191660200182016040528015620006b95781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff1681101562000799578260000160139054906101000a900478010000000000000000000000000000000000000000000000000281600881106200071b576200071a6200132f565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000028282815181106200075457620007536200132f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808062000790906200135e565b915050620006bf565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110620007e357620007e26200132f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806200081f906200135e565b91505060005b8551811015620008f7578581815181106200084557620008446200132f565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028382846200089e9190620012f4565b81518110620008b257620008b16200132f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620008ee906200135e565b91505062000825565b50819350505050919050565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620009d28262000987565b810181811067ffffffffffffffff82111715620009f457620009f362000998565b5b80604052505050565b600062000a0962000969565b905062000a178282620009c7565b919050565b600067ffffffffffffffff82111562000a3a5762000a3962000998565b5b62000a458262000987565b9050602081019050919050565b60005b8381101562000a7257808201518184015260208101905062000a55565b60008484015250505050565b600062000a9562000a8f8462000a1c565b620009fd565b90508281526020810184848401111562000ab45762000ab362000982565b5b62000ac184828562000a52565b509392505050565b600082601f83011262000ae15762000ae06200097d565b5b815162000af384826020860162000a7e565b91505092915050565b6000806040838503121562000b165762000b1562000973565b5b600083015167ffffffffffffffff81111562000b375762000b3662000978565b5b62000b458582860162000ac9565b925050602083015167ffffffffffffffff81111562000b695762000b6862000978565b5b62000b778582860162000ac9565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000bd457607f821691505b60208210810362000bea5762000be962000b8c565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c15565b62000c63868362000c15565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000cb062000caa62000ca48462000c7b565b62000c85565b62000c7b565b9050919050565b6000819050919050565b62000ccc8362000c8f565b62000ce462000cdb8262000cb7565b84845462000c25565b825550505050565b600090565b62000cfb62000cec565b62000d0881848462000cc1565b505050565b5b8181101562000d305762000d2460008262000cf1565b60018101905062000d0e565b5050565b601f82111562000d7f5762000d498162000bf0565b62000d548462000c05565b8101602085101562000d64578190505b62000d7c62000d738562000c05565b83018262000d0d565b50505b505050565b60008160020a8304905092915050565b600062000da76000198460080262000d84565b1980831691505092915050565b600062000dc2838362000d94565b9150826002028217905092915050565b62000ddd8262000b81565b67ffffffffffffffff81111562000df95762000df862000998565b5b62000e05825462000bbb565b62000e1282828562000d34565b600060209050601f83116001811462000e4a576000841562000e35578287015190505b62000e41858262000db4565b86555062000eb1565b601f19841662000e5a8662000bf0565b60005b8281101562000e845784890151825560018201915060208501945060208101905062000e5d565b8683101562000ea4578489015162000ea0601f89168262000d94565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b60008190508160005260206000209050919050565b601f82111562000f245762000eee8162000ec4565b62000ef98462000c05565b8101602085101562000f09578190505b62000f2162000f188562000c05565b83018262000d0d565b50505b505050565b62000f348262000eb9565b67ffffffffffffffff81111562000f505762000f4f62000998565b5b62000f5c825462000bbb565b62000f6982828562000ed9565b600060209050601f83116001811462000fa1576000841562000f8c578287015190505b62000f98858262000db4565b86555062001008565b601f19841662000fb18662000ec4565b60005b8281101562000fdb5784890151825560018201915060208501945060208101905062000fb4565b8683101562000ffb578489015162000ff7601f89168262000d94565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b60006200105960138362001010565b9150620010668262001021565b602082019050919050565b600060208201905081810360008301526200108c816200104a565b9050919050565b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620010dc8262001093565b9150620010e98362001093565b9250828202620010f98162001093565b91508082146200110e576200110d620010a0565b5b5092915050565b6000620011228262001093565b915060008203620011385762001137620010a0565b5b600182039050919050565b6000620011508262001093565b91506200115d8362001093565b9250828201905060ff811115620011795762001178620010a0565b5b92915050565b60006200118c8262001093565b9150620011998362001093565b9250828203905060ff811115620011b557620011b4620010a0565b5b92915050565b6000819050602082019050919050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6000620012058251620011cb565b80915050919050565b60006200121b8262000eb9565b826200122784620011bb565b90506200123481620011f7565b925060108210156200127757620012727fffffffffffffffffffffffffffffffff000000000000000000000000000000008360100360080262000c15565b831692505b5050919050565b600082825260208201905092915050565b60006200129c8262000eb9565b620012a881856200127e565b9350620012ba81856020860162000a52565b620012c58162000987565b840191505092915050565b60006020820190508181036000830152620012ec81846200128f565b905092915050565b6000620013018262000c7b565b91506200130e8362000c7b565b9250828201905080821115620013295762001328620010a0565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006200136b8262000c7b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620013a0576200139f620010a0565b5b600182019050919050565b615df280620013bb6000396000f3fe608060405260043610610263576000357c0100000000000000000000000000000000000000000000000000000000900480638da5cb5b11610156578063c6eba7c4116100d3578063e8a7f4c511610097578063e8a7f4c514610957578063e985e9c514610994578063f117e173146109d1578063f2fde38b14610a0e578063f70a3de814610a4b578063f9613ab214610a8857610263565b8063c6eba7c414610862578063c87b56dd1461088b578063ccc094c2146108c8578063d824ee4f146108f1578063da2824a81461092e57610263565b8063adf288df1161011a578063adf288df14610760578063b238d6031461079d578063b5fdeb23146107de578063b88d4fde14610809578063c5bec6fc1461082557610263565b80638da5cb5b1461067b57806395d89b41146106a65780639a7c5e9f146106d1578063a22cb465146106fa578063ad0dec2f1461072357610263565b806349f2553a116101e45780635ae06f7e116101a85780635ae06f7e1461055e5780636352211e146105875780636b9cb86a146105c457806370a082311461060157806386e90b591461063e57610263565b806349f2553a146104525780634f64b2be1461047b5780634f6ccce7146104b85780635344299a146104f5578063559f5dc91461051e57610263565b806324e0febc1161022b57806324e0febc146103545780632b29ba23146103915780632f745c59146103ce57806340c84b0e1461040b57806342842e0e1461043657610263565b806301ffc9a71461026857806306fdde03146102a5578063081812fc146102d057806318160ddd1461030d57806323b872dd14610338575b600080fd5b34801561027457600080fd5b5061028f600480360381019061028a9190614901565b610ac5565b60405161029c9190614949565b60405180910390f35b3480156102b157600080fd5b506102ba610c19565b6040516102c791906149f4565b60405180910390f35b3480156102dc57600080fd5b506102f760048036038101906102f29190614a4c565b610ca7565b6040516103049190614aba565b60405180910390f35b34801561031957600080fd5b50610322610ce4565b60405161032f9190614ae4565b60405180910390f35b610352600480360381019061034d9190614b2b565b610cf1565b005b34801561036057600080fd5b5061037b60048036038101906103769190614bb4565b610d5c565b6040516103889190614bf0565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b39190614c0b565b610d74565b6040516103c59190614949565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f09190614c38565b610e20565b6040516104029190614ae4565b60405180910390f35b34801561041757600080fd5b50610420610e45565b60405161042d9190614ccd565b60405180910390f35b610450600480360381019061044b9190614b2b565b610ed3565b005b34801561045e57600080fd5b5061047960048036038101906104749190614e24565b610f3e565b005b34801561048757600080fd5b506104a2600480360381019061049d9190614a4c565b611256565b6040516104af9190614bf0565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da9190614a4c565b61127a565b6040516104ec9190614ae4565b60405180910390f35b34801561050157600080fd5b5061051c60048036038101906105179190614f0e565b61129e565b005b34801561052a57600080fd5b5061054560048036038101906105409190614f57565b61132a565b6040516105559493929190614fb8565b60405180910390f35b34801561056a57600080fd5b5061058560048036038101906105809190614c0b565b6113b1565b005b34801561059357600080fd5b506105ae60048036038101906105a99190614a4c565b6114d0565b6040516105bb9190614aba565b60405180910390f35b3480156105d057600080fd5b506105eb60048036038101906105e69190614f0e565b61150c565b6040516105f891906149f4565b60405180910390f35b34801561060d57600080fd5b5061062860048036038101906106239190614c0b565b611725565b6040516106359190614ae4565b60405180910390f35b34801561064a57600080fd5b5061066560048036038101906106609190614f0e565b61176e565b60405161067291906149f4565b60405180910390f35b34801561068757600080fd5b50610690611a19565b60405161069d9190614aba565b60405180910390f35b3480156106b257600080fd5b506106bb611a3d565b6040516106c891906149f4565b60405180910390f35b3480156106dd57600080fd5b506106f860048036038101906106f39190614a4c565b611acb565b005b34801561070657600080fd5b50610721600480360381019061071c9190615029565b611bbc565b005b34801561072f57600080fd5b5061074a60048036038101906107459190614f0e565b611e5e565b6040516107579190614ccd565b60405180910390f35b34801561076c57600080fd5b5061078760048036038101906107829190615069565b612135565b6040516107949190614bf0565b60405180910390f35b3480156107a957600080fd5b506107c460048036038101906107bf9190614a4c565b61248b565b6040516107d595949392919061513b565b60405180910390f35b3480156107ea57600080fd5b506107f361252a565b6040516108009190614ccd565b60405180910390f35b610823600480360381019061081e919061518e565b6125c4565b005b34801561083157600080fd5b5061084c60048036038101906108479190614f0e565b61269f565b6040516108599190614ccd565b60405180910390f35b34801561086e57600080fd5b5061088960048036038101906108849190615277565b612a58565b005b34801561089757600080fd5b506108b260048036038101906108ad9190614a4c565b612c10565b6040516108bf91906149f4565b60405180910390f35b3480156108d457600080fd5b506108ef60048036038101906108ea9190615336565b612d63565b005b3480156108fd57600080fd5b50610918600480360381019061091391906153a5565b613025565b6040516109259190614bf0565b60405180910390f35b34801561093a57600080fd5b5061095560048036038101906109509190614c0b565b6132ca565b005b34801561096357600080fd5b5061097e60048036038101906109799190614f0e565b6133b2565b60405161098b9190614ccd565b60405180910390f35b3480156109a057600080fd5b506109bb60048036038101906109b691906153f8565b61376b565b6040516109c89190614949565b60405180910390f35b3480156109dd57600080fd5b506109f860048036038101906109f39190615438565b613803565b604051610a059190614bf0565b60405180910390f35b348015610a1a57600080fd5b50610a356004803603810190610a309190614c0b565b6139ad565b604051610a429190614949565b60405180910390f35b348015610a5757600080fd5b50610a726004803603810190610a6d91906154d8565b613a51565b604051610a7f9190614949565b60405180910390f35b348015610a9457600080fd5b50610aaf6004803603810190610aaa9190614bb4565b613d7f565b604051610abc9190614bf0565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b195760019050610c14565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b6b5760019050610c14565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610bbd5760019050610c14565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c0f5760019050610c14565b600090505b919050565b60098054610c2690615547565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5290615547565b8015610c9f5780601f10610c7457610100808354040283529160200191610c9f565b820191906000526020600020905b815481529060010190602001808311610c8257829003601f168201915b505050505081565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600680549050905090565b610cfc838383613e2b565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610e19575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b600c602052816000526040600020602052806000526040600020600091509150505481565b600b8054610e5290615547565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7e90615547565b8015610ecb5780601f10610ea057610100808354040283529160200191610ecb565b820191906000526020600020905b815481529060010190602001808311610eae57829003601f168201915b505050505081565b610ede838383613e2b565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f9b57600080fd5b82915081519050602f7f01000000000000000000000000000000000000000000000000000000000000000282600183610fd491906155a7565b81518110610fe557610fe46155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146110655780806110619061560a565b9150505b8067ffffffffffffffff81111561107f5761107e614cf9565b5b6040519080825280601f01601f1916602001820160405280156110b15781602001600182028036833780820191505090505b50600b90816110c09190615804565b5060005b82518110156111b1578281815181106110e0576110df6155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600b82815461113890615547565b8110611147576111466155db565b5b8154600116156111665790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806111a99061560a565b9150506110c4565b5081518114611251577f2f00000000000000000000000000000000000000000000000000000000000000600b835181546111ea90615547565b81106111f9576111f86155db565b5b8154600116156112185790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b6003818154811061126657600080fd5b906000526020600020016000915090505481565b6006818154811061128a57600080fd5b906000526020600020016000915090505481565b6000600f6000601054815260200190815260200160002090508060000160009054906101000a900460ff1660ff168251146112d857600080fd5b81601190816112e79190615804565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c61131161252a565b60405161131e9190614ccd565b60405180910390a15050565b6004602052816000526040600020818154811061134657600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff169080600001600d9054906101000a900460ff16905084565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611436575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146c90615922565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061151c856133b2565b9150600b805461152b90615547565b9050905080825161153c9190615942565b67ffffffffffffffff81111561155557611554614cf9565b5b6040519080825280601f01601f1916602001820160405280156115875781602001600182028036833780820191505090505b50925060005b8181101561164c57600b8181546115a390615547565b81106115b2576115b16155db565b5b8154600116156115d15790600052602060002090602091828204019190065b9054901a7f01000000000000000000000000000000000000000000000000000000000000000284828151811061160a576116096155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806116449061560a565b91505061158d565b5060005b82518110156117195782818151811061166c5761166b6155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028483815181106116c9576116c86155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806117039061560a565b92505080806117119061560a565b915050611650565b50829350505050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600060608060006117808661269f565b9150600f6000601054815260200190815260200160002093508360000160029054906101000a900460ff1660ff16905060018251826117bf9190615942565b6117c99190615942565b67ffffffffffffffff8111156117e2576117e1614cf9565b5b6040519080825280601f01601f1916602001820160405280156118145781602001600182028036833780820191505090505b50925060005b818110156118ce578460000160039054906101000a9004700100000000000000000000000000000000028160108110611856576118556155db565b5b1a7f01000000000000000000000000000000000000000000000000000000000000000284828151811061188c5761188b6155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806118c69061560a565b91505061181a565b50603a7f010000000000000000000000000000000000000000000000000000000000000002838281518110611906576119056155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806119409061560a565b91505060005b8251811015611a0c57828181518110611962576119616155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028482846119b99190615942565b815181106119ca576119c96155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611a049061560a565b915050611946565b5082945050505050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a8054611a4a90615547565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7690615547565b8015611ac35780601f10611a9857610100808354040283529160200191611ac3565b820191906000526020600020905b815481529060010190602001808311611aa657829003601f168201915b505050505081565b6000600f6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff1611611b0357600080fd5b816010819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115611b3857611b37614cf9565b5b6040519080825280601f01601f191660200182016040528015611b6a5781602001600182028036833780820191505090505b5060119081611b799190615804565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c611ba361252a565b604051611bb09190614ccd565b60405180910390a15050565b8015611cdd57600073ffffffffffffffffffffffffffffffffffffffff16600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c5a57600080fd5b81600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611df5565b600073ffffffffffffffffffffffffffffffffffffffff16600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611d7557600080fd5b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e529190614949565b60405180910390a35050565b606060006060600f6000601054815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff168551611eb19190615942565b611ebb9190615942565b67ffffffffffffffff811115611ed457611ed3614cf9565b5b6040519080825280601f01601f191660200182016040528015611f065781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff16811015611fdc578260000160139054906101000a90047801000000000000000000000000000000000000000000000000028160088110611f6457611f636155db565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110611f9a57611f996155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611fd49061560a565b915050611f0c565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110612023576120226155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061205d9061560a565b91505060005b85518110156121295785818151811061207f5761207e6155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028382846120d69190615942565b815181106120e7576120e66155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806121219061560a565b915050612063565b50819350505050919050565b60008060008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806121de5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6121e757600080fd5b600160046000878152602001908152602001600020805490501461220a57600080fd5b600060046000878152602001908152602001600020600081548110612232576122316155db565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161461226457600080fd5b600060010260056000878152602001908152602001600020541461228757600080fd5b8573ffffffffffffffffffffffffffffffffffffffff1692507fc0000000000000000000000000000000000000000000000000000000000000008317925082600102600560008781526020019081526020016000208190555084600190049150600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080600d60008481526020019081526020016000208190555081600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055506001600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123e69190615942565b925050819055506006856001900490806001815401808255809150506001900390600052602060002001600090919091909150558573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8846040516124779190614ae4565b60405180910390a384935050505092915050565b600f6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060000160039054906101000a900470010000000000000000000000000000000002908060000160139054906101000a9004780100000000000000000000000000000000000000000000000002905085565b60606125bf6011805461253c90615547565b80601f016020809104026020016040519081016040528092919081815260200182805461256890615547565b80156125b55780601f1061258a576101008083540402835291602001916125b5565b820191906000526020600020905b81548152906001019060200180831161259857829003601f168201915b5050505050611e5e565b905090565b6125cf848484613e2b565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e846126849061599b565b6040516126919190614bf0565b60405180910390a450505050565b606080600080600285516126b39190615a02565b67ffffffffffffffff8111156126cc576126cb614cf9565b5b6040519080825280601f01601f1916602001820160405280156126fe5781602001600182028036833780820191505090505b5092506000905060005b6020811015612a4c57600460f0878381518110612728576127276155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015612827576030836127be9190615a44565b7f0100000000000000000000000000000000000000000000000000000000000000028483815181106127f3576127f26155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612899565b6057836128349190615a44565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110612869576128686155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f8682815181106128ae576128ad6155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff1610156129ac576030836129379190615a44565b7f010000000000000000000000000000000000000000000000000000000000000002846001846129679190615942565b81518110612978576129776155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a2a565b6057836129b99190615a44565b7f010000000000000000000000000000000000000000000000000000000000000002846001846129e99190615942565b815181106129fa576129f96155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282612a379190615942565b91508080612a449061560a565b915050612708565b50829350505050919050565b6000600460008581526020019081526020016000208361ffff1681548110612a8357612a826155db565b5b90600052602060002001905080600001600c9054906101000a900460ff1615612ae1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad890615ac5565b60405180910390fd5b80600001600d9054906101000a900460ff1615612b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2a90615b31565b60405180910390fd5b60008265ffffffffffff1603612b5d578060000160069054906101000a900465ffffffffffff1691505b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168265ffffffffffff161015612bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbd90615b9d565b60405180910390fd5b818160000160006101000a81548165ffffffffffff021916908365ffffffffffff160217905550600181600001600d6101000a81548160ff02191690831515021790555050505050565b6060600060608360010291506000600460008481526020019081526020016000208054905003612c4657612c4382613d7f565b91505b6000600460008481526020019081526020016000208054905011612c6957600080fd5b602067ffffffffffffffff811115612c8457612c83614cf9565b5b6040519080825280601f01601f191660200182016040528015612cb65781602001600182028036833780820191505090505b50905060005b6020811015612d5057828160208110612cd857612cd76155db565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110612d0e57612d0d6155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080612d489061560a565b915050612cbc565b50612d5a8161150c565b92505050919050565b6060819050601081511115612dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da490615c09565b60405180910390fd5b612db56147f3565b6000600790505b60008160ff1610612e11576000600882612dd69190615c29565b60ff1660ff9060020a029050600086821667ffffffffffffffff161115612dfd5750612e11565b8180612e0890615c66565b92505050612dbc565b600181612e1e9190615a44565b826020019060ff16908160ff16815250506008816007612e3e9190615c8f565b612e489190615c29565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082612ed490615cd9565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600f60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b600080600460008581526020019081526020016000208361ffff1681548110613051576130506155db565b5b90600052602060002001905080600001600c9054906101000a900460ff16156130af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a690615ac5565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806131525750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613191576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318890615922565b60405180910390fd5b60008361ffff161480156131c3575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b80156131dd575080600001600d9054906101000a900460ff165b1561323c5760018160000160068282829054906101000a900465ffffffffffff166132089190615d40565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055506132348585612135565b9150506132c3565b80600001600d9054906101000a900460ff161561329c578060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff161061329b57600080fd5b5b6132bf8585858460000160069054906101000a900465ffffffffffff1685614346565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334f90615922565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b606080600080600285516133c69190615a02565b67ffffffffffffffff8111156133df576133de614cf9565b5b6040519080825280601f01601f1916602001820160405280156134115781602001600182028036833780820191505090505b5092506000905060005b602081101561375f57600460f087838151811061343b5761343a6155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff16101561353a576030836134d19190615a44565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110613506576135056155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506135ac565b6057836135479190615a44565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061357c5761357b6155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f8682815181106135c1576135c06155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff1610156136bf5760308361364a9190615a44565b7f0100000000000000000000000000000000000000000000000000000000000000028460018461367a9190615942565b8151811061368b5761368a6155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061373d565b6057836136cc9190615a44565b7f010000000000000000000000000000000000000000000000000000000000000002846001846136fc9190615942565b8151811061370d5761370c6155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b60028261374a9190615942565b915080806137579061560a565b91505061341b565b50829350505050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff168154811061382f5761382e6155db565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806138de5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61391d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161391490615922565b60405180910390fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff161161394857600080fd5b80600001600d9054906101000a900460ff1661396357600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff161061399557600080fd5b6139a28686868685614346565b915050949350505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613a0857600080fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480613af75750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b2d90615922565b60405180910390fd5b613b3e614859565b600460008681526020019081526020016000208054905091506000821115613bbb57600060046000878152602001908152602001600020600081548110613b8857613b876155db565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff1611613bba57600080fd5b5b60008460050b03613bdc576001816060019015159081151581525050613c17565b60008460050b1315613c165783816000019065ffffffffffff16908165ffffffffffff168152505060018160600190151590811515815250505b5b60046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff021916908315150217905550606082015181600001600d6101000a81548160ff0219169083151502179055505050600385908060018154018082558091505060019003906000526020600020016000909190919091505580606001511515816000015165ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f77d96978d8b40ac826d1984d992e71a84672e62d825fda78cd646656481d065b88604051613d6b9190614bf0565b60405180910390a460019250505092915050565b60008060056000848152602001908152602001600020549050613da1816146fe565b613daa57600080fd5b613db381614730565b15613dc15782915050613e26565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60008060003073ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401613e859190614ae4565b602060405180830381865afa158015613ea2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ec69190615d8f565b92508573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613f0057600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614614034573373ffffffffffffffffffffffffffffffffffffffff166007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061402a57503373ffffffffffffffffffffffffffffffffffffffff16600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61403357600080fd5b5b60006007600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506140918486614762565b600d60008581526020019081526020016000205491506001600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140f391906155a7565b9050818111156141a357600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002054600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020819055505b6000600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055506001600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546142e091906155a7565b925050819055506001600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546143379190615942565b92505081905550505050505050565b60008060008060007fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008960019004169350603067ffffffffffffffff8961ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16841793508665ffffffffffff168417935083600102915060006001026005600084815260200190815260200160002054146143db57600080fd5b85600001600c9054906101000a900460ff1661443d578560000160069054906101000a900465ffffffffffff1665ffffffffffff168765ffffffffffff161461443c57600186600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff896001900416925060b8839060020a0292507f8000000000000000000000000000000000000000000000000000000000000000831792508973ffffffffffffffffffffffffffffffffffffffff168317925060018660000160068282829054906101000a900465ffffffffffff166144be9190615d40565b92506101000a81548165ffffffffffff021916908365ffffffffffff16021790555085600001600d9054906101000a900460ff1661453f5760018660000160008282829054906101000a900465ffffffffffff1661451c9190615d40565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055505b826001026005600084815260200190815260200160002081905550600e60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080600d60008681526020019081526020016000208190555083600c60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055506001600e60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546146599190615942565b9250508190555060068490806001815401808255809150506001900390600052602060002001600090919091909150558973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8866040516146e69190614ae4565b60405180910390a38194505050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b60008083600102905060056000828152602001908152602001600020546001900491506000820361479257600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6040518060800160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6148de816148a9565b81146148e957600080fd5b50565b6000813590506148fb816148d5565b92915050565b6000602082840312156149175761491661489f565b5b6000614925848285016148ec565b91505092915050565b60008115159050919050565b6149438161492e565b82525050565b600060208201905061495e600083018461493a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561499e578082015181840152602081019050614983565b60008484015250505050565b6000601f19601f8301169050919050565b60006149c682614964565b6149d0818561496f565b93506149e0818560208601614980565b6149e9816149aa565b840191505092915050565b60006020820190508181036000830152614a0e81846149bb565b905092915050565b6000819050919050565b614a2981614a16565b8114614a3457600080fd5b50565b600081359050614a4681614a20565b92915050565b600060208284031215614a6257614a6161489f565b5b6000614a7084828501614a37565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614aa482614a79565b9050919050565b614ab481614a99565b82525050565b6000602082019050614acf6000830184614aab565b92915050565b614ade81614a16565b82525050565b6000602082019050614af96000830184614ad5565b92915050565b614b0881614a99565b8114614b1357600080fd5b50565b600081359050614b2581614aff565b92915050565b600080600060608486031215614b4457614b4361489f565b5b6000614b5286828701614b16565b9350506020614b6386828701614b16565b9250506040614b7486828701614a37565b9150509250925092565b6000819050919050565b614b9181614b7e565b8114614b9c57600080fd5b50565b600081359050614bae81614b88565b92915050565b600060208284031215614bca57614bc961489f565b5b6000614bd884828501614b9f565b91505092915050565b614bea81614b7e565b82525050565b6000602082019050614c056000830184614be1565b92915050565b600060208284031215614c2157614c2061489f565b5b6000614c2f84828501614b16565b91505092915050565b60008060408385031215614c4f57614c4e61489f565b5b6000614c5d85828601614b16565b9250506020614c6e85828601614a37565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000614c9f82614c78565b614ca98185614c83565b9350614cb9818560208601614980565b614cc2816149aa565b840191505092915050565b60006020820190508181036000830152614ce78184614c94565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614d31826149aa565b810181811067ffffffffffffffff82111715614d5057614d4f614cf9565b5b80604052505050565b6000614d63614895565b9050614d6f8282614d28565b919050565b600067ffffffffffffffff821115614d8f57614d8e614cf9565b5b614d98826149aa565b9050602081019050919050565b82818337600083830152505050565b6000614dc7614dc284614d74565b614d59565b905082815260208101848484011115614de357614de2614cf4565b5b614dee848285614da5565b509392505050565b600082601f830112614e0b57614e0a614cef565b5b8135614e1b848260208601614db4565b91505092915050565b600060208284031215614e3a57614e3961489f565b5b600082013567ffffffffffffffff811115614e5857614e576148a4565b5b614e6484828501614df6565b91505092915050565b600067ffffffffffffffff821115614e8857614e87614cf9565b5b614e91826149aa565b9050602081019050919050565b6000614eb1614eac84614e6d565b614d59565b905082815260208101848484011115614ecd57614ecc614cf4565b5b614ed8848285614da5565b509392505050565b600082601f830112614ef557614ef4614cef565b5b8135614f05848260208601614e9e565b91505092915050565b600060208284031215614f2457614f2361489f565b5b600082013567ffffffffffffffff811115614f4257614f416148a4565b5b614f4e84828501614ee0565b91505092915050565b60008060408385031215614f6e57614f6d61489f565b5b6000614f7c85828601614b9f565b9250506020614f8d85828601614a37565b9150509250929050565b600065ffffffffffff82169050919050565b614fb281614f97565b82525050565b6000608082019050614fcd6000830187614fa9565b614fda6020830186614fa9565b614fe7604083018561493a565b614ff4606083018461493a565b95945050505050565b6150068161492e565b811461501157600080fd5b50565b60008135905061502381614ffd565b92915050565b600080604083850312156150405761503f61489f565b5b600061504e85828601614b16565b925050602061505f85828601615014565b9150509250929050565b600080604083850312156150805761507f61489f565b5b600061508e85828601614b16565b925050602061509f85828601614b9f565b9150509250929050565b600060ff82169050919050565b6150bf816150a9565b82525050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6150fa816150c5565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b61513581615100565b82525050565b600060a08201905061515060008301886150b6565b61515d60208301876150b6565b61516a60408301866150b6565b61517760608301856150f1565b615184608083018461512c565b9695505050505050565b600080600080608085870312156151a8576151a761489f565b5b60006151b687828801614b16565b94505060206151c787828801614b16565b93505060406151d887828801614a37565b925050606085013567ffffffffffffffff8111156151f9576151f86148a4565b5b61520587828801614ee0565b91505092959194509250565b600061ffff82169050919050565b61522881615211565b811461523357600080fd5b50565b6000813590506152458161521f565b92915050565b61525481614f97565b811461525f57600080fd5b50565b6000813590506152718161524b565b92915050565b6000806000606084860312156152905761528f61489f565b5b600061529e86828701614b9f565b93505060206152af86828701615236565b92505060406152c086828701615262565b9150509250925092565b6152d3816150a9565b81146152de57600080fd5b50565b6000813590506152f0816152ca565b92915050565b600067ffffffffffffffff82169050919050565b615313816152f6565b811461531e57600080fd5b50565b6000813590506153308161530a565b92915050565b60008060006060848603121561534f5761534e61489f565b5b600061535d868287016152e1565b935050602061536e86828701615321565b925050604084013567ffffffffffffffff81111561538f5761538e6148a4565b5b61539b86828701614df6565b9150509250925092565b6000806000606084860312156153be576153bd61489f565b5b60006153cc86828701614b16565b93505060206153dd86828701614b9f565b92505060406153ee86828701615236565b9150509250925092565b6000806040838503121561540f5761540e61489f565b5b600061541d85828601614b16565b925050602061542e85828601614b16565b9150509250929050565b600080600080608085870312156154525761545161489f565b5b600061546087828801614b16565b945050602061547187828801614b9f565b935050604061548287828801615236565b925050606061549387828801615262565b91505092959194509250565b60008160050b9050919050565b6154b58161549f565b81146154c057600080fd5b50565b6000813590506154d2816154ac565b92915050565b600080604083850312156154ef576154ee61489f565b5b60006154fd85828601614b9f565b925050602061550e858286016154c3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061555f57607f821691505b60208210810361557257615571615518565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006155b282614a16565b91506155bd83614a16565b92508282039050818111156155d5576155d4615578565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061561582614a16565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361564757615646615578565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b6000600883026156b77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615677565b6156c18683615677565b95508019841693508086168417925050509392505050565b6000819050919050565b60006156fe6156f96156f484614a16565b6156d9565b614a16565b9050919050565b6000819050919050565b615718836156e3565b61572c61572482615705565b848454615687565b825550505050565b600090565b615741615734565b61574c81848461570f565b505050565b5b8181101561577057615765600082615739565b600181019050615752565b5050565b601f8211156157b55761578681615652565b61578f84615667565b8101602085101561579e578190505b6157b26157aa85615667565b830182615751565b50505b505050565b60008160020a8304905092915050565b60006157db600019846008026157ba565b1980831691505092915050565b60006157f483836157ca565b9150826002028217905092915050565b61580d82614c78565b67ffffffffffffffff81111561582657615825614cf9565b5b6158308254615547565b61583b828285615774565b600060209050601f83116001811461586e576000841561585c578287015190505b61586685826157e8565b8655506158ce565b601f19841661587c86615652565b60005b828110156158a45784890151825560018201915060208501945060208101905061587f565b868310156158c157848901516158bd601f8916826157ca565b8355505b6001600288020188555050505b505050505050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061590c600a8361496f565b9150615917826158d6565b602082019050919050565b6000602082019050818103600083015261593b816158ff565b9050919050565b600061594d82614a16565b915061595883614a16565b92508282019050808211156159705761596f615578565b5b92915050565b6000819050602082019050919050565b60006159928251614b7e565b80915050919050565b60006159a682614c78565b826159b084615976565b90506159bb81615986565b925060208210156159fb576159f67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802615677565b831692505b5050919050565b6000615a0d82614a16565b9150615a1883614a16565b9250828202615a2681614a16565b91508282048414831517615a3d57615a3c615578565b5b5092915050565b6000615a4f826150a9565b9150615a5a836150a9565b9250828201905060ff811115615a7357615a72615578565b5b92915050565b7f4552525f53504152534500000000000000000000000000000000000000000000600082015250565b6000615aaf600a8361496f565b9150615aba82615a79565b602082019050919050565b60006020820190508181036000830152615ade81615aa2565b9050919050565b7f4552525f43415050454400000000000000000000000000000000000000000000600082015250565b6000615b1b600a8361496f565b9150615b2682615ae5565b602082019050919050565b60006020820190508181036000830152615b4a81615b0e565b9050919050565b7f4552525f4341505f4c4f57000000000000000000000000000000000000000000600082015250565b6000615b87600b8361496f565b9150615b9282615b51565b602082019050919050565b60006020820190508181036000830152615bb681615b7a565b9050919050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b6000615bf360138361496f565b9150615bfe82615bbd565b602082019050919050565b60006020820190508181036000830152615c2281615be6565b9050919050565b6000615c34826150a9565b9150615c3f836150a9565b9250828202615c4d816150a9565b9150808214615c5f57615c5e615578565b5b5092915050565b6000615c71826150a9565b915060008203615c8457615c83615578565b5b600182039050919050565b6000615c9a826150a9565b9150615ca5836150a9565b9250828203905060ff811115615cbe57615cbd615578565b5b92915050565b6000615cd082516150c5565b80915050919050565b6000615ce482614c78565b82615cee84615976565b9050615cf981615cc4565b92506010821015615d3957615d347fffffffffffffffffffffffffffffffff0000000000000000000000000000000083601003600802615677565b831692505b5050919050565b6000615d4b82614f97565b9150615d5683614f97565b9250828201905065ffffffffffff811115615d7457615d73615578565b5b92915050565b600081519050615d8981614aff565b92915050565b600060208284031215615da557615da461489f565b5b6000615db384828501615d7a565b9150509291505056fea2646970667358221220e3ecd63913c2c2b0049a2a85bd8a6c9217553ce71f3579d5e3a4e2f26b14dcf364736f6c63430008120033
+\ 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"},{"internalType":"bool","name":"_enumeration","type":"bool"}],"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":false,"internalType":"bytes","name":"_multiHash","type":"bytes"}],"name":"Msg","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":"uint8","name":"_length","type":"uint8"},{"internalType":"uint64","name":"_codecId","type":"uint64"},{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"addCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":"bytes","name":"_data","type":"bytes"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getMsg","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"multiCodecs","outputs":[{"internalType":"uint8","name":"l","type":"uint8"},{"internalType":"uint8","name":"codecRLength","type":"uint8"},{"internalType":"uint8","name":"prefixRLength","type":"uint8"},{"internalType":"bytes16","name":"prefix","type":"bytes16"},{"internalType":"bytes8","name":"codec","type":"bytes8"}],"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":"bytes","name":"_digest","type":"bytes"}],"name":"setMsg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_codec","type":"uint256"}],"name":"setMsgCodec","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":"bytes","name":"_digest","type":"bytes"}],"name":"toHash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"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":"","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}],"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"}],"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":false,"internalType":"bytes","name":"_multiHash","type":"bytes"}],"name":"Msg","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":"uint8","name":"_length","type":"uint8"},{"internalType":"uint64","name":"_codecId","type":"uint64"},{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"addCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":[{"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":"bytes","name":"_data","type":"bytes"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getMsg","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"multiCodecs","outputs":[{"internalType":"uint8","name":"l","type":"uint8"},{"internalType":"uint8","name":"codecRLength","type":"uint8"},{"internalType":"uint8","name":"prefixRLength","type":"uint8"},{"internalType":"bytes16","name":"prefix","type":"bytes16"},{"internalType":"bytes8","name":"codec","type":"bytes8"}],"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":"bytes","name":"_digest","type":"bytes"}],"name":"setMsg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_codec","type":"uint256"}],"name":"setMsgCodec","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":"bytes","name":"_digest","type":"bytes"}],"name":"toHash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"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":"","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}],"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
@@ -105,22 +105,22 @@ class CraftNFT(ERC721):
return 4000000
- def constructor(self, sender_address, name, symbol, declaration=ZERO_CONTENT, enumeration=False, tx_format=TxFormat.JSONRPC, version=None):
- code = self.cargs(name, symbol, declaration, enumeration, version=version)
+ #def constructor(self, sender_address, name, symbol, declaration=ZERO_CONTENT, enumeration=False, tx_format=TxFormat.JSONRPC, version=None):
+ def constructor(self, sender_address, name, symbol, tx_format=TxFormat.JSONRPC, version=None):
+ #code = self.cargs(name, symbol, declaration, enumeration, version=version)
+ code = self.cargs(name, symbol, version=version)
tx = self.template(sender_address, None, use_nonce=True)
tx = self.set_code(tx, code)
return self.finalize(tx, tx_format)
@staticmethod
- def cargs(name, symbol, declaration, enumeration, version=None):
- declaration = strip_0x(declaration)
+ #def cargs(name, symbol, declaration, enumeration, version=None):
+ def cargs(name, symbol, version=None):
code = CraftNFT.bytecode()
enc = ABIContractEncoder()
enc.string(name)
enc.string(symbol)
- enc.bytes32(declaration)
- enc.bool(enumeration)
code += enc.get()
return code
@@ -129,9 +129,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)
@@ -241,6 +244,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/craft_nft/runnable/mint.py b/python/craft_nft/runnable/mint.py
@@ -90,7 +90,7 @@ def process_settings_local(settings, config):
arg_flags = ArgFlag()
arg = Arg(arg_flags)
-flags = arg_flags.STD_WRITE | arg_flags.WALLET | arg_flags.CREATE | arg_flags.VALUE | arg_flags.TAB | arg_flags.EXEC
+flags = arg_flags.STD_WRITE | arg_flags.WALLET | arg_flags.VALUE | arg_flags.TAB | arg_flags.EXEC
argparser = chainlib.eth.cli.ArgumentParser()
argparser = process_args(argparser, arg, flags)
diff --git a/python/craft_nft/runnable/publish.py b/python/craft_nft/runnable/publish.py
@@ -99,7 +99,8 @@ def main():
settings.get('SENDER_ADDRESS'),
token_name,
token_symbol,
- token_declaration,
+ #token_declaration,
+ #enumeration=True,
)
if config.get('_RPC_SEND'):
conn.do(o)
diff --git a/python/requirements.txt b/python/requirements.txt
@@ -1,2 +1,3 @@
eth-erc721~=0.0.5
aenum~=3.1.11
+chainlib-eth~=0.4.16
diff --git a/python/tests/test_basic.py b/python/tests/test_basic.py
@@ -210,6 +210,9 @@ class Test(TestCraftNFT):
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)
@@ -517,5 +520,77 @@ class Test(TestCraftNFT):
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)
+
+
+ def test_mint_cap_immediate(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(3):
+ (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, 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.
@@ -37,8 +38,6 @@ contract CraftNFT {
// All Minted Tokens.
// Represents both Unique Tokens and Batch Tokens.
mapping(bytes32 => bytes32) public mintedToken;
- // Activate enumeration
- bool enumeration;
// ERC721 - Enumerable - List of tokens in order of minting
uint256[] public tokenByIndex;
@@ -58,7 +57,7 @@ contract CraftNFT {
//uint256 supply;
// The digest of a human-readable resource that describes the rationale and terms for all tokens created by this contract.
- bytes32 public declaration;
+ //bytes32 public declaration;
// Editable base URI against which to look up token data by token id
bytes public baseURL;
@@ -80,8 +79,7 @@ contract CraftNFT {
// Minter
event Mint(address indexed _minter, address indexed _beneficiary, uint256 _value);
- // Batcher
- event Allocate(address indexed _minter, uint48 indexed _count, bytes32 _tokenId);
+ event Allocate(address indexed _minter, uint48 indexed _count, bool indexed _capped, bytes32 _tokenId);
// Content hashes
// Represents a multicodec item
@@ -100,15 +98,13 @@ contract CraftNFT {
event Msg(bytes _multiHash);
- constructor(string memory _name, string memory _symbol, bytes32 _declaration, bool _enumeration) {
+ constructor(string memory _name, string memory _symbol) {
owner = msg.sender;
- declaration =_declaration;
name = _name;
symbol = _symbol;
addCodec(32, 0x12, "sha256");
setMsgCodec(0x12);
currentMsg = new bytes(32);
- enumeration = _enumeration;
}
// Transfer ownership of token contract to new owner.
@@ -166,9 +162,10 @@ 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) {
+ // if count is set a negative number, the token will be unbounded (may be capped later with setCap).
+ 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;
@@ -177,16 +174,16 @@ contract CraftNFT {
require(token[content][0].count > 0);
}
- _token.count = count;
+ if (count == 0) {
+ _token.capped = true;
+ } else if (count > 0) {
+ _token.count = uint48(count);
+ _token.capped = true;
+ }
token[content].push(_token);
tokens.push(content);
-// if (count == 0) {
-// supply += 1;
-// } else {
-// supply += count;
-// }
- emit Allocate(msg.sender, count, content);
+ emit Allocate(msg.sender, _token.count, _token.capped, content);
return true;
}
@@ -217,11 +214,9 @@ contract CraftNFT {
mintedToken[_content] = bytes32(right);
tokenId = uint256(_content);
- if (enumeration) {
- _balance = balance[_recipient];
- ownerIndexReverse[tokenId] = _balance;
- tokenOfOwnerByIndex[_recipient][_balance] = tokenId;
- }
+ _balance = balance[_recipient];
+ ownerIndexReverse[tokenId] = _balance;
+ tokenOfOwnerByIndex[_recipient][_balance] = tokenId;
balance[_recipient] += 1;
tokenByIndex.push(uint256(_content));
@@ -245,6 +240,22 @@ contract CraftNFT {
mintedToken[_k] = bytes32(_data);
}
+ // Apply cap on unbounded token
+ // if cap value is set to 0, cap will be set on the current count.
+ 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');
+ if (_cap == 0) {
+ _cap = spec.cursor;
+ }
+ 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
@@ -258,12 +269,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);
}
@@ -272,13 +285,14 @@ contract CraftNFT {
// If the index is not the next sequential index in the batch, the token will be marked as sparse.
// Sparse tokens cannot thereafter be minted using mintFromBatchTo
// The method will fail if the token at the specified index has already been minted, or if the index is out of bounds of the batch.
- // This method cannot be used to mint a unique token.
+ // This method cannot be used to mint a unique token or an unbounded token.
function mintExactFromBatchTo(address _recipient, bytes32 _content, uint16 _batch, uint48 _index) public returns (bytes32) {
tokenSpec storage spec;
spec = token[_content][_batch];
require(msg.sender == owner || writer[msg.sender], 'ERR_ACCESS');
require(spec.count > 0);
+ require(spec.capped);
require(_index < spec.count);
return mintBatchCore(_recipient, _content, _batch, _index, spec);
}
@@ -309,13 +323,14 @@ contract CraftNFT {
right |= uint160(_recipient);
_spec.cursor += 1;
+ if (!_spec.capped) {
+ _spec.count += 1;
+ }
mintedToken[k] = bytes32(right);
- if (enumeration) {
- _balance = balance[_recipient];
- ownerIndexReverse[left] = _balance;
- tokenOfOwnerByIndex[_recipient][_balance] = left;
- }
+ _balance = balance[_recipient];
+ ownerIndexReverse[left] = _balance;
+ tokenOfOwnerByIndex[_recipient][_balance] = left;
balance[_recipient] += 1;
tokenByIndex.push(left);
@@ -364,6 +379,7 @@ contract CraftNFT {
function transferCore(address _from, address _to, uint256 _tokenId) internal {
address currentTokenOwner;
uint256 reverseIndex;
+ uint256 currentIndex;
currentTokenOwner = this.ownerOf(_tokenId);
@@ -375,7 +391,14 @@ contract CraftNFT {
tokenAllowance[_tokenId] = address(0);
setTokenOwner(_tokenId, _to);
reverseIndex = ownerIndexReverse[_tokenId];
- tokenOfOwnerByIndex[_from][reverseIndex] = uint256(0);
+ currentIndex = balance[_from] - 1;
+ if (currentIndex > reverseIndex) {
+ tokenOfOwnerByIndex[_from][reverseIndex] = tokenOfOwnerByIndex[_from][currentIndex];
+ }
+ tokenOfOwnerByIndex[_from][currentIndex] = uint256(0);
+
+ currentIndex = balance[_to];
+ tokenOfOwnerByIndex[_to][currentIndex] = _tokenId;
balance[_from] -= 1;
balance[_to] += 1;