Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 73 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Add Complex Shap... | 17018059 | 457 days ago | IN | 0 ETH | 0.07285949 | ||||
Add Complex Shap... | 17018059 | 457 days ago | IN | 0 ETH | 0.07324047 | ||||
Add Complex Shap... | 17018059 | 457 days ago | IN | 0 ETH | 0.05883649 | ||||
Add Complex Shap... | 17018058 | 457 days ago | IN | 0 ETH | 0.06919889 | ||||
Add Complex Shap... | 17018058 | 457 days ago | IN | 0 ETH | 0.06956073 | ||||
Add Complex Shap... | 17018058 | 457 days ago | IN | 0 ETH | 0.05539855 | ||||
Add Complex Shap... | 17018058 | 457 days ago | IN | 0 ETH | 0.06919889 | ||||
Add Complex Shap... | 17016068 | 457 days ago | IN | 0 ETH | 0.08551703 | ||||
Add Complex Shap... | 17015896 | 457 days ago | IN | 0 ETH | 0.02620887 | ||||
Add Complex Shap... | 17015896 | 457 days ago | IN | 0 ETH | 0.10365903 | ||||
Add Complex Shap... | 17015895 | 457 days ago | IN | 0 ETH | 0.09838596 | ||||
Add Complex Shap... | 17015895 | 457 days ago | IN | 0 ETH | 0.09838596 | ||||
Add Complex Shap... | 17015895 | 457 days ago | IN | 0 ETH | 0.09890042 | ||||
Add Complex Shap... | 17015895 | 457 days ago | IN | 0 ETH | 0.01683507 | ||||
Add Complex Shap... | 17015895 | 457 days ago | IN | 0 ETH | 0.0921529 | ||||
Add Complex Shap... | 17015895 | 457 days ago | IN | 0 ETH | 0.0921529 | ||||
Add Complex Shap... | 17015895 | 457 days ago | IN | 0 ETH | 0.09263477 | ||||
Add Complex Shap... | 17015895 | 457 days ago | IN | 0 ETH | 0.01102278 | ||||
Add Complex Shap... | 17015895 | 457 days ago | IN | 0 ETH | 0.0921529 | ||||
Add Complex Shap... | 17015894 | 457 days ago | IN | 0 ETH | 0.08264071 | ||||
Add Complex Shap... | 17015894 | 457 days ago | IN | 0 ETH | 0.00989763 | ||||
Add Complex Shap... | 17015892 | 457 days ago | IN | 0 ETH | 0.07528615 | ||||
Add Complex Shap... | 17015892 | 457 days ago | IN | 0 ETH | 0.07567982 | ||||
Add Complex Shap... | 17015892 | 457 days ago | IN | 0 ETH | 0.01962397 | ||||
Add Complex Shap... | 17015892 | 457 days ago | IN | 0 ETH | 0.07567982 |
Latest 25 internal transactions (View All)
Advanced mode:
Loading...
Loading
Contract Name:
goodblocksGen1
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; import "./SSTORE2.sol"; error YooooThatTokenIdIsWayTooHigh(); error GottaUnlockGen1Please(); error YoureNotTheOwnerHomie(); /* ██████ ██████ ██████ ██████ ██████ ██ ██████ ██████ ██ ██ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ███ ██ ██ ██ ██ ██ ██ ██████ ██ ██ ██ ██ █████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ ██████ ██████ ██████ ██████ ███████ ██████ ██████ ██ ██ ███████ ██████ ███████ ███ ██ ██ ██ ██ ████ ██ ███ ██ ███ █████ ██ ██ ██ █████ ██ ██ ██ ██ ██ ██ ██ ██ ██████ ███████ ██ ████ ██ circles and squares */ contract goodblocksGen1 { // gen-1 description string private constant Gen1Description = unicode"who said circles and squares cant get along? welcome to gen-1 where these two shapes come together in perfect harmony. you know the drill... enjoy the art, explore the code, and dont forget to click around for some extra fun! 😉"; /* ███████ ████████ ██████ ██████ ███████ ████████ ██ ██ ███████ ███ ███ ██████ ██ ██████ ██████ ██ ██ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ███████ ██ ██ ██ ██████ █████ ██ ███████ █████ ██ ████ ██ ██████ ██ ██ ██ ██ █████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ███████ ██ ██████ ██ ██ ███████ ██ ██ ██ ███████ ██ ██ ██████ ███████ ██████ ██████ ██ ██ ███████ */ // gen-1 block struct struct Gen1Block { uint256 numLevels; uint256 widthInterval; uint256 circleCount; uint256 squareCount; uint256 noneCount; uint256 complexityLevel; bool glitchy; string svg; string name; string[4] palette; } // struct to store complex shapes struct ComplexShape { // array of addresses that store complex shape string pieces address[] pointers; } // 32 complex shapes for gen-1 ComplexShape[32] private ComplexShapes; // write string with sstore2 function writeString(string memory _string) external onlyOwner returns(address) { return SSTORE2.write(bytes(_string)); } // add pointer to complex shape address data function addComplexShapePointer(uint256 _shapeIndex, uint256 _pointerIndex, address _pointer) external onlyOwner { ComplexShapes[_shapeIndex].pointers[_pointerIndex] = _pointer; } // add another sstore2 contract address to a complex shape array by index function addComplexShapeString(uint256 _shapeIndex, string memory _string) external onlyOwner { // write string and get pointer address _newPointer = SSTORE2.write(bytes(_string)); // add pointer to complex shape array ComplexShapes[_shapeIndex].pointers.push(_newPointer); } // returns the svg shapes of a complex shape function getComplexShape(uint256 _shapeIndex) public view returns(string memory) { // if complex shape not loaded, return empty string if(ComplexShapes[_shapeIndex].pointers.length == 0) { return ""; } uint256 i; string memory output; address[] memory pointers = ComplexShapes[_shapeIndex].pointers; unchecked { do { output = string.concat(output, string(SSTORE2.read(pointers[i]))); ++i; } while(i<pointers.length); } return output; } // reset complex shape to rewrite shape function resetComplexShapePointers(uint256 _shapeIndex) external onlyOwner { delete ComplexShapes[_shapeIndex].pointers; } // borrowed colors and palettes from gen0 string[7] private ColorGroupNames = ["Joy", "Night", "Cosmos", "Earth", "Arctic", "Serenity", "Twilight"]; string[4][56] private ColorPalettes = [ ["#FDFF8F","#A8ECE7","#F4BEEE","#D47AE8"], // 0 palette (Joy) ["#FD6F96","#FFEBA1","#95DAC1","#6F69AC"], ["#FFDF6B","#FF79CD","#AA2EE6","#23049D"], ["#95E1D3","#EAFFD0","#FCE38A","#FF75A0"], ["#FFCC29","#F58634","#007965","#00AF91"], ["#998CEB","#77E4D4","#B4FE98","#FBF46D"], ["#EEEEEE","#77D970","#172774","#FF0075"], ["#005F99","#FF449F","#FFF5B7","#00EAD3"], ["#0B0B0D","#474A56","#929AAB","#D3D5FD"], // 1 palette (Night) ["#07031A","#4F8A8B","#B1B493","#FFCB74"], ["#2E3A63","#665C84","#71A0A5","#FAB95B"], ["#000000","#226089","#4592AF","#E3C4A8"], ["#1B1F3A","#53354A","#A64942","#FF7844"], ["#1a1a1a","#153B44","#2D6E7E","#C6DE41"], ["#0F0A3C","#07456F","#009F9D","#CDFFEB"], ["#130026","#801336","#C72C41","#EE4540"], ["#111D5E","#C70039","#F37121","#C0E218"], // 2 palette (Cosmos) ["#02383C","#230338","#ED5107","#C70D3A"], ["#03C4A1","#C62A88","#590995","#150485"], ["#00A8CC","#005082","#000839","#FFA41B"], ["#E94560","#0F3460","#16213E","#1A1A2E"], ["#D2FAFB","#FE346E","#512B58","#2C003E"], ["#706C61","#E1F4F3","#FFFFFF","#333333"], ["#FAF7F2","#2BB3C0","#161C2E","#EF6C35"], ["#FFFBE9","#E3CAA5","#CEAB93","#AD8B73"], // 3 palette (Earth) ["#A09F57","#C56824","#CFB784","#EADEB8"], ["#E3D0B9","#E1BC91","#C19277","#62959C"], ["#E9C891","#8A8635","#AE431E","#D06224"], ["#83B582","#D6E4AA","#FFFFC5","#F0DD92"], ["#303E27","#B4BB72","#E7EAA8","#F6FAF7"], ["#A8896C","#F1E8A7","#AED09E","#61B292"], ["#F4DFBA","#EEC373","#CA965C","#876445"], ["#42C2FF","#85F4FF","#B8FFF9","#EFFFFD"], // 4 palette (Arctic) ["#E8F0F2","#A2DBFA","#39A2DB","#053742"], ["#3E64FF","#5EDFFF","#B2FCFF","#ECFCFF"], ["#D1FFFA","#4AA9AF","#3E31AE","#1C226B"], ["#F7F3F3","#C1EAF2","#5CC2F2","#191BA9"], ["#F3F3F3","#303841","#3A4750","#2185D5"], ["#769FCD","#B9D7EA","#D6E6F2","#F7FBFC"], ["#3D6CB9","#00D1FF","#00FFF0","#FAFAF6"], ["#99FEFF","#94DAFF","#94B3FD","#B983FF"], // 5 palette (Serenity) ["#E5707E","#E6B566","#E8E9A1","#A3DDCB"], ["#6892D5","#79D1C3","#C9FDD7","#F8FCFB"], ["#6C5B7B","#C06C84","#F67280","#F8B195"], ["#30475E","#BA6B57","#F1935C","#E7B2A5"], ["#FFEBD3","#264E70","#679186","#FFB4AC"], ["#6DDCCF","#94EBCD","#FFEFA1","#FFCB91"], ["#D8EFF0","#B0E0A8","#F0F69F","#F3C1C6"], ["#35477D","#6C5B7B","#C06C84","#F67280"], // 6 palette (Twilight) ["#F6C065","#55B3B1","#AF0069","#09015F"], ["#470D21","#9C0F48","#D67D3E","#F9E4D4"], ["#001F52","#A10054","#FF8D68","#FFECBA"], ["#FF6C00","#A0204C","#23103A","#282D4F"], ["#FFF9B2","#ECAC5D","#B24080","#3F0713"], ["#FFE98A","#C84771","#61105E","#280B45"], ["#EDE862","#FA9856","#F27370","#22559C"] ]; // bones of the gen-1 svg address[4] private SVGAddresses; // set svg piece function setSvgPiece(uint256 _index, string memory _string) external onlyOwner returns(address) { SVGAddresses[_index] = SSTORE2.write(bytes(_string)); return SVGAddresses[_index]; } // read svg piece function readSvgPiece(uint256 _index) public view returns(string memory) { return string(SSTORE2.read(SVGAddresses[_index])); } /* ███ ███ █████ ██ ██ ███████ ██████ ███████ ███ ███ ██████ ██ ██████ ██████ ██ ██ ███████ ████ ████ ██ ██ ██ ██ ██ ██ ██ ██ ████ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ███████ █████ █████ ██ ██ █████ ██ ████ ██ ██████ ██ ██ ██ ██ █████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ███████ ██████ ███████ ██ ██ ██████ ███████ ██████ ██████ ██ ██ ███████ */ // get token uri for gen-1 function tokenGenURI(uint256 _tokenId, string memory _tokenMetadata, string memory _tokenAttributes) public view returns(string memory) { // check if valid token ID if(_tokenId > 8280) revert YooooThatTokenIdIsWayTooHigh(); // get token data IGBContract.TokenData memory tokenData = GBTokenContract.getTokenData(_tokenId); // check if gen-1 has been unlocked if(tokenData.highestGenLevel < 1) revert GottaUnlockGen1Please(); // get gen-0 block IGen0Contract.GoodBlock memory gen0_block = Gen0Contract.tokenToGoodblock(_tokenId); // get gen-1 block Gen1Block memory gen1_block = getGen1Block(_tokenId, tokenData, gen0_block); // get token metadata string memory metadata = blockToMetadata(tokenData, gen0_block, gen1_block, _tokenAttributes); // construct token uri string memory tokenUri = string.concat( '{"name":"', ColorGroupNames[gen0_block.colorGroupIndex], ' #', OZ.toString(_tokenId), '","description":"', Gen1Description, '",', _tokenMetadata, '"attributes":[', metadata, '],"image":"data:image/svg+xml;base64,', string(OZ.encode(bytes(gen1_block.svg))), '"}' ); // return that suckah! return string.concat("data:application/json;base64,", string(OZ.encode(bytes(tokenUri)))); } // get token svg (interoperability) function getTokenSVG(uint256 _tokenId) public view returns(string memory) { // check if valid token ID if(_tokenId > 8280) revert YooooThatTokenIdIsWayTooHigh(); // get token data IGBContract.TokenData memory tokenData = GBTokenContract.getTokenData(_tokenId); // check if gen-1 has been unlocked if(tokenData.highestGenLevel < 1) revert GottaUnlockGen1Please(); // get gen-0 block IGen0Contract.GoodBlock memory gen0_block = Gen0Contract.tokenToGoodblock(_tokenId); Gen1Block memory gen1Block = getGen1Block(_tokenId, tokenData, gen0_block); return gen1Block.svg; } // get gen-1 block function getGen1Block(uint256 _tokenId, IGBContract.TokenData memory _tokenData, IGen0Contract.GoodBlock memory _gen0block) private view returns(Gen1Block memory) { // create gen-1 block Gen1Block memory gen1_block; // create token id as string string memory tokenIdString = OZ.toString(_tokenId); unchecked { // set levels and shape width interval gen1_block.numLevels = (random(string.concat(tokenIdString, "create x innovate x impact x do good"))%4) + 5; gen1_block.widthInterval = 3000/gen1_block.numLevels; // retrieve color palette string[4] memory palette = ColorPalettes[(_gen0block.colorGroupIndex * 8) + _gen0block.paletteIndex]; gen1_block.palette = palette; } // get svg gen1_block.svg = getGen1SVG(_tokenId, _tokenData, _gen0block, gen1_block); // return gen-1 block return gen1_block; } // generate svg for gen-1 block function getGen1SVG(uint256 _tokenId, IGBContract.TokenData memory _tokenData, IGen0Contract.GoodBlock memory _gen0Block, Gen1Block memory _gen1Block) private view returns(string memory) { uint256 width; uint256 shapeDesign; uint256 tokenRand; uint256 scale; uint256 i; // svg intro string memory svg = string.concat( readSvgPiece(1), '<g id="art"', _gen0Block.symmetryIndex == 5 ? ' filter="url(#glitch)">\n\n' : '>\n\n', '<rect x="0" y="0" width="100%" height="100%" fill="', _gen0Block.isDarkBlock ? '#000' : _gen1Block.palette[0], '"/>\n\n<g id="shapes"', _gen0Block.symmetryIndex == 5 ? ' filter="url(#noise)">\n\n' : '>\n\n' ); unchecked { do { // get random number tokenRand = (_tokenId+13)*(i+1); // check if complexity is possible if(_gen1Block.complexityLevel > 1 || i > 5) { // get simpler shape shapeDesign = getShapeDesign(tokenRand, 150); } else { // get more complex shape shapeDesign = getShapeDesign(tokenRand, 300); } // update width width = _gen1Block.widthInterval*(_gen1Block.numLevels-i); // none if(shapeDesign == 0) { // nothing to see here folks! ++_gen1Block.noneCount; // basic circle } else if(shapeDesign == 1) { // add to svg svg = string.concat( svg, '<g id="shapeGroup_', OZ.toString(i), '" fill="', _gen0Block.isDarkBlock && (tokenRand % 13 == 0) ? "#000" : _gen1Block.palette[(tokenRand+1)%4], '" stroke="', _gen1Block.palette[(tokenRand+2)%4], '" stroke-width="50">\n', drawCircle(width/2), '</g>\n\n' ); ++_gen1Block.circleCount; // basic square } else if(shapeDesign == 2) { // add to svg svg = string.concat( svg, '<g id="shapeGroup_', OZ.toString(i), '" fill="', _gen0Block.isDarkBlock && (tokenRand % 13 == 0) ? "#000" : _gen1Block.palette[(tokenRand+10)%4], '" stroke="', _gen1Block.palette[(tokenRand+11)%4], '" stroke-width="50">\n', drawSquare(width), '</g>\n\n' ); ++_gen1Block.squareCount; // repeated circle } else if(shapeDesign == 3) { // add to svg scale = (width*100)/(4000); svg = string.concat( svg, '<g id="shapeGroup_', OZ.toString(i), string.concat( '" fill="', _gen0Block.isDarkBlock && (tokenRand % 13 == 0) ? "#000" : _gen1Block.palette[(tokenRand+3)%4], '" stroke="', _gen1Block.palette[(tokenRand+4)%4] ), '" stroke-width="10" transform="translate(', string.concat(addDecimalFromTheRight(200000-2000*(scale), 2), ', ', addDecimalFromTheRight(200000-2000*(scale), 2)) ); svg = string.concat( svg, ') scale(', string.concat(addDecimalFromTheRight((scale), 2), ', ', addDecimalFromTheRight((scale), 2)), ')" >\n', getComplexShape((tokenRand)%12), '</g>\n\n' ); // update counts ++_gen1Block.circleCount; ++_gen1Block.complexityLevel; // repeated square } else if(shapeDesign == 4) { // add to svg scale = (width*100)/(4000); svg = string.concat( svg, '<g id="shapeGroup_', OZ.toString(i), string.concat( '" fill="', _gen0Block.isDarkBlock && (tokenRand % 13 == 0) ? "#000" : _gen1Block.palette[(tokenRand+3)%4], '" stroke="', _gen1Block.palette[(tokenRand+4)%4] ), '" stroke-width="10" transform="translate(', string.concat(addDecimalFromTheRight(200000-2000*(scale), 2), ', ', addDecimalFromTheRight(200000-2000*(scale), 2)) ); svg = string.concat( svg, ') scale(', string.concat(addDecimalFromTheRight((scale), 2), ', ', addDecimalFromTheRight((scale), 2)), ')" >\n', getComplexShape((tokenRand)%12), '</g>\n\n' ); // update counts ++_gen1Block.squareCount; ++_gen1Block.complexityLevel; // rotated square same } else if(shapeDesign == 5) { // add to svg scale = (width*100)/(4000); svg = string.concat( svg, '<g id="shapeGroup_', OZ.toString(i), string.concat( '" fill="', _gen0Block.isDarkBlock && (tokenRand % 13 == 0) ? "#000" : _gen1Block.palette[(tokenRand+3)%4], '" stroke="', _gen1Block.palette[(tokenRand+4)%4] ), '" stroke-width="10" transform="translate(', string.concat(addDecimalFromTheRight(200000-2000*(scale), 2), ', ', addDecimalFromTheRight(200000-2000*(scale), 2)) ); svg = string.concat( svg, ') scale(', string.concat(addDecimalFromTheRight((scale), 2), ', ', addDecimalFromTheRight((scale), 2)), ')" >\n', getComplexShape((tokenRand)%12), '</g>\n\n' ); // update counts ++_gen1Block.squareCount; ++_gen1Block.complexityLevel; //rotated square bi direction } else if(shapeDesign == 6) { // add to svg scale = (width*100)/(4000); svg = string.concat( svg, '<g id="shapeGroup_', OZ.toString(i), string.concat( '" fill="', _gen0Block.isDarkBlock && (tokenRand % 13 == 0) ? "#000" : _gen1Block.palette[(tokenRand+7)%4], '" stroke="', _gen1Block.palette[(tokenRand+8)%4] ), '" stroke-width="10" transform="translate(', string.concat(addDecimalFromTheRight(200000-2000*(scale), 2), ', ', addDecimalFromTheRight(200000-2000*(scale), 2)) ); svg = string.concat( svg, ') scale(', string.concat(addDecimalFromTheRight((scale), 2), ', ', addDecimalFromTheRight((scale), 2)), ')" >\n', getComplexShape(((tokenRand)%12)+12), '</g>\n\n' ); // update counts ++_gen1Block.squareCount; ++_gen1Block.complexityLevel; } // iterate to next shape ++i; // continue until all levels are complete } while (i<_gen1Block.numLevels); } // return final svg return string.concat( readSvgPiece(0), getTokenDataString(_tokenId, _tokenData, _gen0Block, _gen1Block), svg, // end shapes group and add token name readSvgPiece(2), _gen0Block.symmetryIndex == 5 ? readSvgPiece(3) : '', '\n\n</svg>' // close svg ); } // get metadata for gen-1 block function blockToMetadata(IGBContract.TokenData memory _tokenData, IGen0Contract.GoodBlock memory _gen0Block, Gen1Block memory _gen1Block, string memory _tokenAttributes) private view returns(string memory) { // get attribute substring string[2] memory ogAttributes = cleanAttributes(_tokenAttributes); // begin metadata string memory metadata = string.concat( '{"trait_type": "Generations Unlocked", "value":', OZ.toString(_tokenData.highestGenLevel+1), '},{"trait_type": "Active Generation", "value":', OZ.toString(_tokenData.activeGen), '},{"trait_type": "Times Transferred", "value":"', ogAttributes[0], '"},{"trait_type": "Owned Since", "value":"', ogAttributes[1] ); metadata = string.concat( metadata, '"},{"trait_type": "Color Group", "value":"', ColorGroupNames[_gen0Block.colorGroupIndex], '"},{"trait_type": "Palette Index", "value":"', OZ.toString(_gen0Block.paletteIndex), '{"trait_type": "Shape Count", "value":"', OZ.toString(_gen1Block.numLevels), '"},{"trait_type": "Circle Count", "value":"', OZ.toString(_gen1Block.circleCount), '"},{"trait_type": "Square Count", "value":"', OZ.toString(_gen1Block.squareCount), '"},{"trait_type": "None Count", "value":"', OZ.toString(_gen1Block.noneCount) ); metadata = string.concat( metadata, '"},{"trait_type": "Complexity Level", "value":"', OZ.toString(_gen1Block.complexityLevel), '"},{"trait_type": "Glitchy", "value":"', _gen0Block.symmetryIndex == 5 ? "True" : "False", '"},{"trait_type": "Special Trait", "value":"', _gen0Block.isDarkBlock ? 'Do Good"}' : 'None"}' ); // return metadata string return metadata; } // create token data string function getTokenDataString(uint256 _tokenId, IGBContract.TokenData memory _tokenData, IGen0Contract.GoodBlock memory _gen0Block, Gen1Block memory _gen1Block) private view returns(string memory) { // create name _gen1Block.name = string.concat(ColorGroupNames[_gen0Block.colorGroupIndex], ' #', OZ.toString(_tokenId)); // begin token data string for token string memory tokenDataString = string.concat( OZ.toString(_tokenId), "|", _gen1Block.name, "|", OZ.toHexString(_tokenData.tokenOwner), "|", OZ.toString(_tokenData.ownedSince), "|", OZ.toString(_tokenData.timesTransferred), "|", OZ.toString(_tokenData.highestGenLevel), "|", OZ.toString(_tokenData.activeGen), "|", ColorGroupNames[_gen0Block.colorGroupIndex], "|", OZ.toString(_gen0Block.paletteIndex), "|" ); tokenDataString = string.concat( tokenDataString, OZ.toString(_gen1Block.numLevels), "|", OZ.toString(_gen1Block.circleCount), "|", OZ.toString(_gen1Block.squareCount), "|", OZ.toString(_gen1Block.noneCount), "|", OZ.toString(_gen1Block.complexityLevel), "|", _gen0Block.symmetryIndex == 5 ? "true" : "false", "|", _gen0Block.isDarkBlock ? "Do Good" : "None", "|", _gen1Block.palette[0], "|", _gen1Block.palette[1], "|", _gen1Block.palette[2], "|", _gen1Block.palette[3] ); // return token data string return tokenDataString; } // determine shape design function getShapeDesign(uint256 _seed, uint256 _limit) private pure returns(uint256) { // set shape weights uint8[7] memory ShapeDesignWeights = [50, 50, 50, 15, 15, 60, 60]; // select a shape at random unchecked { uint256 index = 0; uint256 j = ShapeDesignWeights[0]; uint256 i = random(string.concat("its a good day", OZ.toString(_seed*13), "to have a good day"))%_limit; while (j <= i) { ++index; j += ShapeDesignWeights[index]; } return index; } } /* ██████ ██ ██ ██████ ██ ██ ██████ ████████ ██████ ██████ ██ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ ██ ██ ██████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ ██████ ███████ ██ ██████ ██ ██████ ██████ ███████ ███████ */ // draw circle centered at (2000,2000) function drawCircle(uint256 _radius) public pure returns(string memory) { return string.concat( '<circle cx="2000" cy="2000" r="', OZ.toString(_radius), '"/>\n' ); } // draw circle centered at (2000,2000) function drawSquare(uint256 _width) public pure returns(string memory) { uint256 o = 2000 - _width/2; string memory outputSVG = string.concat( '<rect x="', OZ.toString(o), '" y="', OZ.toString(o), '" width="', OZ.toString(_width), '" height="', OZ.toString(_width), '"/>\n' ); return outputSVG; } // add decimal number from the right function addDecimalFromTheRight(uint256 _number, uint256 _sigFigs) public pure returns(string memory) { // get initial variables string memory numString = OZ.toString(_number); uint256 length = bytes(numString).length; bytes memory decimal = new bytes(_sigFigs); unchecked { // check if sig fig greater thant length (0 padded) if(_sigFigs > length) { uint256 i = _sigFigs-length; do { if(i < _sigFigs-length) { decimal[i] = bytes("0")[0]; } else { decimal[i] = bytes(numString)[i-(_sigFigs-length)]; } --i; } while(i>0); decimal[0] = "0"; // return string return string.concat("0", ".", string(decimal)); // sig figs is = length } else if(_sigFigs == length) { // return string return string.concat("0", ".", numString); // sig figs < length } else { uint256 wholeIndex; uint256 decimalIndex; uint256 i; bytes memory whole = new bytes(length-_sigFigs); do { if(i < length-_sigFigs) { whole[wholeIndex] = bytes(numString)[i]; ++wholeIndex; } else { decimal[decimalIndex] = bytes(numString)[i]; ++decimalIndex; } ++i; } while(i<length); // return string return string.concat(string(whole), ".", string(decimal)); } } } // get random number back function random(string memory _input) public pure returns (uint256) { return uint256(keccak256(abi.encodePacked(_input))); } // attribute data struct AttData { uint256 ownedStart; uint256 ownedEnd; uint256 ownedLength; uint256 transferStart; uint256 transferEnd; uint256 transferLength; } // funciton clean original attributes function cleanAttributes(string memory _attributes) public pure returns(string[2] memory) { uint256 i; bytes memory attBytes = bytes(_attributes); AttData memory attData; // get time owned attribute attData.ownedEnd = attBytes.length-3; for(i=attData.ownedEnd; i>0; --i) { if(attBytes[i] == bytes1('"')) { attData.ownedStart = i+1; attData.ownedLength = (attData.ownedEnd-attData.ownedStart+1); break; } } // get times transfrerred attribute attData.transferEnd = attData.ownedStart-43; for(i=attData.transferEnd; i>0; --i) { if(attBytes[i] == bytes1('"')) { attData.transferStart = i+1; attData.transferLength = (attData.transferEnd-attData.transferStart+1); break; } } bytes memory timesTransferredBytes = new bytes(attData.transferLength); bytes memory ownedSinceBytes = new bytes(attData.ownedLength); for(i=0; i<attData.transferLength; i++) { timesTransferredBytes[i] = attBytes[attData.transferStart + i]; } for(i=0; i<attData.ownedLength; i++) { ownedSinceBytes[i] = attBytes[attData.ownedStart + i]; } // return attributes return [string(timesTransferredBytes), string(ownedSinceBytes)]; } /* ██ ███ ██ ████████ ███████ ██████ ███████ █████ ██████ ███████ ███████ ████████ ██ ██ ███████ ███████ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ █████ ██████ █████ ███████ ██ █████ ███████ ██ ██ ██ █████ █████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ███████ ██ ██ ██ ██ ██ ██████ ███████ ███████ ██ ██████ ██ ██ */ // interface contracts IGBContract private GBTokenContract = IGBContract(address(0x29B4Ea6B1164C7cd8A3a0a1dc4ad88d1E0589124)); IGen0Contract private Gen0Contract = IGen0Contract(address(0xAd77f8106d1E4891be0428133f35F78977671F2F)); // set contract addresses function setInterfaceAddresses(address[2] memory _newAddresses) external onlyOwner { GBTokenContract = IGBContract(_newAddresses[0]); Gen0Contract = IGen0Contract(_newAddresses[1]); } /* ██████ ██ ██ ███ ██ ███████ ██████ ███████ ██ ██ ██ ███████ ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ███ ██ ██ ██ █ ██ ██ ██ ██ █████ ██████ ███████ ███████ ██ ███ ██ ██ ██ ███ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ███ ██████ ███ ███ ██ ████ ███████ ██ ██ ███████ ██ ██ ██ ███████ */ // construct that thing constructor() { ContractOwner = msg.sender; } // contract owner address private ContractOwner; // only owner modifier function _onlyOwner() private view { if(msg.sender != ContractOwner) revert YoureNotTheOwnerHomie(); } modifier onlyOwner() { _onlyOwner(); _; } // transfer contract ownership function transferOwnership(address _newOwner) external onlyOwner { ContractOwner = _newOwner; } // if youre reading this, make a goodblocks collage with all our tokens } // interface for the goodblocks contract interface IGBContract { struct TokenData { uint8 activeGen; uint8 highestGenLevel; uint64 timesTransferred; uint64 ownedSince; address tokenOwner; } function ownerOf(uint256 _tokenId) external view returns(address); function getTokenData(uint256 _tokenId) external view returns (TokenData memory); } // interface for the gen-0 contract interface IGen0Contract { struct GoodBlock { uint8 pixelSizeIndex; uint8 symmetryIndex; uint8 colorGroupIndex; uint8 paletteIndex; bool isDarkBlock; uint16 tokenIndex; bytes3 labelColor; string blockDNA; } function tokenToGoodblock(uint256 _tokenId) external view returns(GoodBlock memory); } /* ██ ██ ██████ ██████ █████ ██████ ██ ███████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ ██████ ███████ ██████ ██ █████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ███████ ██ ██████ ██ ██ ██ ██ ██ ██ ██ ███████ ███████ using OpenZeppelin Strings and Base64 contracts */ library OZ { // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } // OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol) /** * @dev Base64 Encoding/Decoding Table */ string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /** * @dev Converts a `bytes` to its Bytes64 `string` representation. */ function encode(bytes memory data) internal pure returns (string memory) { /** * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol */ if (data.length == 0) return ""; // Loads the table into memory string memory table = _TABLE; // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter // and split into 4 numbers of 6 bits. // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up // - `data.length + 2` -> Round up // - `/ 3` -> Number of 3-bytes chunks // - `4 *` -> 4 characters for each chunk string memory result = new string(4 * ((data.length + 2) / 3)); /// @solidity memory-safe-assembly assembly { // Prepare the lookup table (skip the first "length" byte) let tablePtr := add(table, 1) // Prepare result pointer, jump over length let resultPtr := add(result, 32) // Run over the input, 3 bytes at a time for { let dataPtr := data let endPtr := add(data, mload(data)) } lt(dataPtr, endPtr) { } { // Advance 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // To write each character, shift the 3 bytes (18 bits) chunk // 4 times in blocks of 6 bits for each character (18, 12, 6, 0) // and apply logical AND with 0x3F which is the number of // the previous character in the ASCII table prior to the Base64 Table // The result is then added to the table to get the character to write, // and finally write it in the result pointer but with a left shift // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F)))) resultPtr := add(resultPtr, 1) // Advance } // When data `bytes` is not exactly 3 bytes long // it is padded with `=` characters at the end switch mod(mload(data), 3) case 1 { mstore8(sub(resultPtr, 1), 0x3d) mstore8(sub(resultPtr, 2), 0x3d) } case 2 { mstore8(sub(resultPtr, 1), 0x3d) } } return result; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library Bytecode { error InvalidCodeAtRange(uint256 _size, uint256 _start, uint256 _end); /** @notice Generate a creation code that results on a contract with `_code` as bytecode @param _code The returning value of the resulting `creationCode` @return creationCode (constructor) for new contract */ function creationCodeFor(bytes memory _code) internal pure returns (bytes memory) { /* 0x00 0x63 0x63XXXXXX PUSH4 _code.length size 0x01 0x80 0x80 DUP1 size size 0x02 0x60 0x600e PUSH1 14 14 size size 0x03 0x60 0x6000 PUSH1 00 0 14 size size 0x04 0x39 0x39 CODECOPY size 0x05 0x60 0x6000 PUSH1 00 0 size 0x06 0xf3 0xf3 RETURN <CODE> */ return abi.encodePacked( hex"63", uint32(_code.length), hex"80_60_0E_60_00_39_60_00_F3", _code ); } /** @notice Returns the size of the code on a given address @param _addr Address that may or may not contain code @return size of the code on the given `_addr` */ function codeSize(address _addr) internal view returns (uint256 size) { assembly { size := extcodesize(_addr) } } /** @notice Returns the code of a given address @dev It will fail if `_end < _start` @param _addr Address that may or may not contain code @param _start number of bytes of code to skip on read @param _end index before which to end extraction @return oCode read from `_addr` deployed bytecode Forked from: https://gist.github.com/KardanovIR/fe98661df9338c842b4a30306d507fbd */ function codeAt(address _addr, uint256 _start, uint256 _end) internal view returns (bytes memory oCode) { uint256 csize = codeSize(_addr); if (csize == 0) return bytes(""); if (_start > csize) return bytes(""); if (_end < _start) revert InvalidCodeAtRange(csize, _start, _end); unchecked { uint256 reqSize = _end - _start; uint256 maxSize = csize - _start; uint256 size = maxSize < reqSize ? maxSize : reqSize; assembly { // allocate output byte array - this could also be done without assembly // by using o_code = new bytes(size) oCode := mload(0x40) // new "memory end" including padding mstore(0x40, add(oCode, and(add(add(size, 0x20), 0x1f), not(0x1f)))) // store length in memory mstore(oCode, size) // actually retrieve the code, this needs assembly extcodecopy(_addr, add(oCode, 0x20), _start, size) } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Bytecode.sol"; /** @title A key-value storage with auto-generated keys for storing chunks of data with a lower write & read cost. @author Agustin Aguilar <[email protected]> Readme: https://github.com/0xsequence/sstore2#readme */ library SSTORE2 { error WriteError(); /** @notice Stores `_data` and returns `pointer` as key for later retrieval @dev The pointer is a contract address with `_data` as code @param _data to be written @return pointer Pointer to the written `_data` */ function write(bytes memory _data) internal returns (address pointer) { // Append 00 to _data so contract can't be called // Build init code bytes memory code = Bytecode.creationCodeFor( abi.encodePacked( hex'00', _data ) ); // Deploy contract using create assembly { pointer := create(0, add(code, 32), mload(code)) } // Address MUST be non-zero if (pointer == address(0)) revert WriteError(); } /** @notice Reads the contents of the `_pointer` code as data, skips the first byte @dev The function is intended for reading pointers generated by `write` @param _pointer to be read @return data read from `_pointer` contract */ function read(address _pointer) internal view returns (bytes memory) { return Bytecode.codeAt(_pointer, 1, type(uint256).max); } /** @notice Reads the contents of the `_pointer` code as data, skips the first byte @dev The function is intended for reading pointers generated by `write` @param _pointer to be read @param _start number of bytes to skip @return data read from `_pointer` contract */ function read(address _pointer, uint256 _start) internal view returns (bytes memory) { return Bytecode.codeAt(_pointer, _start + 1, type(uint256).max); } /** @notice Reads the contents of the `_pointer` code as data, skips the first byte @dev The function is intended for reading pointers generated by `write` @param _pointer to be read @param _start number of bytes to skip @param _end index before which to end extraction @return data read from `_pointer` contract */ function read(address _pointer, uint256 _start, uint256 _end) internal view returns (bytes memory) { return Bytecode.codeAt(_pointer, _start + 1, _end + 1); } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"GottaUnlockGen1Please","type":"error"},{"inputs":[{"internalType":"uint256","name":"_size","type":"uint256"},{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"}],"name":"InvalidCodeAtRange","type":"error"},{"inputs":[],"name":"WriteError","type":"error"},{"inputs":[],"name":"YooooThatTokenIdIsWayTooHigh","type":"error"},{"inputs":[],"name":"YoureNotTheOwnerHomie","type":"error"},{"inputs":[{"internalType":"uint256","name":"_shapeIndex","type":"uint256"},{"internalType":"uint256","name":"_pointerIndex","type":"uint256"},{"internalType":"address","name":"_pointer","type":"address"}],"name":"addComplexShapePointer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shapeIndex","type":"uint256"},{"internalType":"string","name":"_string","type":"string"}],"name":"addComplexShapeString","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_number","type":"uint256"},{"internalType":"uint256","name":"_sigFigs","type":"uint256"}],"name":"addDecimalFromTheRight","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"_attributes","type":"string"}],"name":"cleanAttributes","outputs":[{"internalType":"string[2]","name":"","type":"string[2]"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_radius","type":"uint256"}],"name":"drawCircle","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_width","type":"uint256"}],"name":"drawSquare","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shapeIndex","type":"uint256"}],"name":"getComplexShape","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getTokenSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_input","type":"string"}],"name":"random","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"readSvgPiece","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shapeIndex","type":"uint256"}],"name":"resetComplexShapePointers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[2]","name":"_newAddresses","type":"address[2]"}],"name":"setInterfaceAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"string","name":"_string","type":"string"}],"name":"setSvgPiece","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_tokenMetadata","type":"string"},{"internalType":"string","name":"_tokenAttributes","type":"string"}],"name":"tokenGenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_string","type":"string"}],"name":"writeString","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060e001604052806040518060400160405280600381526020017f4a6f79000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4e6967687400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f436f736d6f73000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f456172746800000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f417263746963000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f536572656e69747900000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f5477696c696768740000000000000000000000000000000000000000000000008152508152506020906007620001bc9291906200398c565b5060405180610700016040528060405180608001604052806040518060400160405280600781526020017f234644464638460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234138454345370000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234634424545450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2344343741453800000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234644364639360000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234646454241310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233935444143310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2336463639414300000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234646444636420000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234646373943440000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234141324545360000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2332333034394400000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233935453144330000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234541464644300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234643453338410000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346463735413000000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234646434332390000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234635383633340000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233030373936350000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2330304146393100000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233939384345420000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233737453444340000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234234464539380000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346424634364400000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234545454545450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233737443937300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233137323737340000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346463030373500000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233030354639390000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234646343439460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234646463542370000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2330304541443300000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233042304230440000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233437344135360000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233932394141420000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2344334435464400000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233037303331410000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233446384138420000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234231423439330000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346464342373400000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233245334136330000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233636354338340000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233731413041350000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346414239354200000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233030303030300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233232363038390000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233435393241460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2345334334413800000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233142314633410000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233533333534410000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234136343934320000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346463738343400000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233161316131610000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233135334234340000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233244364537450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2343364445343100000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233046304133430000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233037343536460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233030394639440000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2343444646454200000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233133303032360000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233830313333360000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234337324334310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2345453435343000000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233131314435450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234337303033390000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234633373132310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2343304532313800000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233032333833430000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233233303333380000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234544353130370000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2343373044334100000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233033433441310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234336324138380000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233539303939350000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2331353034383500000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233030413843430000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233030353038320000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233030303833390000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346464134314200000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234539343536300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233046333436300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233136323133450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2331413141324500000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234432464146420000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234645333436450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233531324235380000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2332433030334500000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233730364336310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234531463446330000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234646464646460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2333333333333300000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234641463746320000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233242423343300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233136314332450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2345463643333500000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234646464245390000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234533434141350000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234345414239330000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2341443842373300000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234130394635370000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234335363832340000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234346423738340000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2345414445423800000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234533443042390000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234531424339310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234331393237370000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2336323935394300000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234539433839310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233841383633350000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234145343331450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2344303632323400000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233833423538320000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234436453441410000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234646464643350000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346304444393200000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233330334532370000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234234424237320000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234537454141380000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346364641463700000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234138383936430000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234631453841370000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234145443039450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2336314232393200000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234634444642410000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234545433337330000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234341393635430000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2338373634343500000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233432433246460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233835463446460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234238464646390000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2345464646464400000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234538463046320000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234132444246410000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233339413244420000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2330353337343200000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233345363446460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233545444646460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234232464346460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2345434643464600000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234431464646410000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233441413941460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233345333141450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2331433232364200000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234637463346330000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234331454146320000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233543433246320000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2331393142413900000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234633463346330000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233330333834310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233341343735300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2332313835443500000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233736394643440000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234239443745410000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234436453646320000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346374642464300000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233344364342390000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233030443146460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233030464646300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346414641463600000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233939464546460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233934444146460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233934423346440000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2342393833464600000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234535373037450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234536423536360000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234538453941310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2341334444434200000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233638393244350000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233739443143330000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234339464444370000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346384643464200000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233643354237420000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234330364338340000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234636373238300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346384231393500000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233330343735450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234241364235370000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234631393335430000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2345374232413500000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234646454244330000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233236344537300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233637393138360000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346464234414300000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233644444343460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233934454243440000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234646454641310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346464342393100000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234438454646300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234230453041380000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234630463639460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346334331433600000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233335343737440000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233643354237420000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234330364338340000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346363732383000000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234636433036350000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233535423342310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234146303036390000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2330393031354600000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233437304432310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233943304634380000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234436374433450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346394534443400000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233030314635320000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234131303035340000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234646384436380000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346464543424100000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234646364330300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234130323034430000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233233313033410000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2332383244344600000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234646463942320000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234543414335440000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234232343038300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2333463037313300000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234646453938410000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234338343737310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233631313035450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2332383042343500000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234544453836320000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234641393835360000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234632373337300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2332323535394300000000000000000000000000000000000000000000000000815250815250815250602790603862003889929190620039df565b507329b4ea6b1164c7cd8a3a0a1dc4ad88d1e058912461010b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073ad77f8106d1e4891be0428133f35f78977671f2f61010c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200394357600080fd5b503361010d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062003eed565b8260078101928215620039cc579160200282015b82811115620039cb578251829081620039ba919062003e06565b5091602001919060010190620039a0565b5b509050620039db919062003a37565b5090565b826038600402810192821562003a24579160200282015b8281111562003a235782518290600462003a1292919062003a5f565b5091602001919060040190620039f6565b5b50905062003a33919062003ab2565b5090565b5b8082111562003a5b576000818162003a51919062003ada565b5060010162003a38565b5090565b826004810192821562003a9f579160200282015b8281111562003a9e57825182908162003a8d919062003e06565b509160200191906001019062003a73565b5b50905062003aae919062003a37565b5090565b5b8082111562003ad6576000818162003acc919062003b20565b5060040162003ab3565b5090565b50805462003ae89062003bf5565b6000825580601f1062003afc575062003b1d565b601f01602090049060005260206000209081019062003b1c919062003b6d565b5b50565b506000818162003b31919062003ada565b506001016000818162003b45919062003ada565b506001016000818162003b59919062003ada565b50600101600062003b6b919062003ada565b565b5b8082111562003b8857600081600090555060010162003b6e565b5090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062003c0e57607f821691505b60208210810362003c245762003c2362003bc6565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262003c8e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262003c4f565b62003c9a868362003c4f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062003ce762003ce162003cdb8462003cb2565b62003cbc565b62003cb2565b9050919050565b6000819050919050565b62003d038362003cc6565b62003d1b62003d128262003cee565b84845462003c5c565b825550505050565b600090565b62003d3262003d23565b62003d3f81848462003cf8565b505050565b5b8181101562003d675762003d5b60008262003d28565b60018101905062003d45565b5050565b601f82111562003db65762003d808162003c2a565b62003d8b8462003c3f565b8101602085101562003d9b578190505b62003db362003daa8562003c3f565b83018262003d44565b50505b505050565b600082821c905092915050565b600062003ddb6000198460080262003dbb565b1980831691505092915050565b600062003df6838362003dc8565b9150826002028217905092915050565b62003e118262003b8c565b67ffffffffffffffff81111562003e2d5762003e2c62003b97565b5b62003e39825462003bf5565b62003e4682828562003d6b565b600060209050601f83116001811462003e7e576000841562003e69578287015190505b62003e75858262003de8565b86555062003ee5565b601f19841662003e8e8662003c2a565b60005b8281101562003eb85784890151825560018201915060208501945060208101905062003e91565b8683101562003ed8578489015162003ed4601f89168262003dc8565b8355505b6001600288020188555050505b505050505050565b615a878062003efd6000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c8063a0a93f0711610097578063d2e1e30911610066578063d2e1e3091461031d578063dd20620214610339578063e4fbf23a14610369578063f2fde38b1461038557610100565b8063a0a93f071461025d578063c379dc431461028d578063c382a04b146102bd578063c7ab2dbc146102ed57610100565b8063373e3526116100d3578063373e3526146101b157806367462265146101e15780637f4f479114610211578063952178261461024157610100565b806311b315421461010557806322b8d04414610135578063321d8bb91461016557806336e10fa014610181575b600080fd5b61011f600480360381019061011a919061354e565b6103a1565b60405161012c91906136cc565b60405180910390f35b61014f600480360381019061014a919061354e565b6107b5565b60405161015c9190613707565b60405180910390f35b61017f600480360381019061017a919061374e565b6107e8565b005b61019b600480360381019061019691906137aa565b61087b565b6040516101a89190613821565b60405180910390f35b6101cb60048036038101906101c69190613843565b6108ef565b6040516101d89190613821565b60405180910390f35b6101fb60048036038101906101f691906137aa565b610cb1565b6040516102089190613821565b60405180910390f35b61022b600480360381019061022691906137aa565b610cf9565b6040516102389190613821565b60405180910390f35b61025b60048036038101906102569190613997565b610e39565b005b610277600480360381019061027291906137aa565b610ef8565b6040516102849190613821565b60405180910390f35b6102a760048036038101906102a291906139c4565b610f29565b6040516102b49190613821565b60405180910390f35b6102d760048036038101906102d2919061374e565b6111bb565b6040516102e49190613a5e565b60405180910390f35b610307600480360381019061030291906137aa565b611261565b6040516103149190613821565b60405180910390f35b610337600480360381019061033291906137aa565b611446565b005b610353600480360381019061034e919061354e565b611475565b6040516103609190613a5e565b60405180910390f35b610383600480360381019061037e9190613a79565b61148f565b005b61039f600480360381019061039a9190613acc565b61150f565b005b6103a96132d7565b6000808390506103b76132fe565b600382516103c59190613b28565b816020018181525050806020015192505b60008311156104bc577f22000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191682848151811061043557610434613b5c565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036104ab576001836104749190613b8b565b8160000181815250506001816000015182602001516104939190613b28565b61049d9190613b8b565b8160400181815250506104bc565b826104b590613bbf565b92506103d6565b602b81600001516104cd9190613b28565b816080018181525050806080015192505b60008311156105c4577f22000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191682848151811061053d5761053c613b5c565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036105b35760018361057c9190613b8b565b81606001818152505060018160600151826080015161059b9190613b28565b6105a59190613b8b565b8160a00181815250506105c4565b826105bd90613bbf565b92506104de565b60008160a0015167ffffffffffffffff8111156105e4576105e3613423565b5b6040519080825280601f01601f1916602001820160405280156106165781602001600182028036833780820191505090505b5090506000826040015167ffffffffffffffff81111561063957610638613423565b5b6040519080825280601f01601f19166020018201604052801561066b5781602001600182028036833780820191505090505b509050600094505b8260a0015185101561070157838584606001516106909190613b8b565b815181106106a1576106a0613b5c565b5b602001015160f81c60f81b8286815181106106bf576106be613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535084806106f990613be8565b955050610673565b600094505b826040015185101561079457838584600001516107239190613b8b565b8151811061073457610733613b5c565b5b602001015160f81c60f81b81868151811061075257610751613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350848061078c90613be8565b955050610706565b60405180604001604052808381526020018281525095505050505050919050565b6000816040516020016107c89190613c6c565b6040516020818303038152906040528051906020012060001c9050919050565b6107f061155c565b60006107fb826115e6565b90506000836020811061081157610810613b5c565b5b01600001819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b6060600060028361088c9190613cb2565b6107d06108999190613b28565b905060006108a68261168a565b6108af8361168a565b6108b88661168a565b6108c18761168a565b6040516020016108d49493929190613da1565b60405160208183030381529060405290508092505050919050565b606060006108fc8461168a565b905060008151905060008467ffffffffffffffff8111156109205761091f613423565b5b6040519080825280601f01601f1916602001820160405280156109525781602001600182028036833780820191505090505b50905081851115610b0d57600082860390505b828603811015610a0a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152506000815181106109b8576109b7613b5c565b5b602001015160f81c60f81b8282815181106109d6576109d5613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610a6f565b83838703820381518110610a2157610a20613b5c565b5b602001015160f81c60f81b828281518110610a3f57610a3e613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b8060019003905060008111610965577f300000000000000000000000000000000000000000000000000000000000000082600081518110610ab357610ab2613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081604051602001610af39190613e76565b604051602081830303815290604052945050505050610cab565b818503610b3e5782604051602001610b259190613e76565b6040516020818303038152906040529350505050610cab565b60008060008088860367ffffffffffffffff811115610b6057610b5f613423565b5b6040519080825280601f01601f191660200182016040528015610b925781602001600182028036833780820191505090505b5090505b888603821015610c0b57868281518110610bb357610bb2613b5c565b5b602001015160f81c60f81b818581518110610bd157610bd0613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350836001019350610c72565b868281518110610c1e57610c1d613b5c565b5b602001015160f81c60f81b858481518110610c3c57610c3b613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508260010192505b816001019150858210610b96578085604051602001610c92929190613eab565b6040516020818303038152906040529750505050505050505b92915050565b6060610cf26101078360048110610ccb57610cca613b5c565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611758565b9050919050565b60606000808360208110610d1057610d0f613b5c565b5b016000018054905003610d3457604051806020016040528060008152509050610e34565b600060606000808560208110610d4d57610d4c613b5c565b5b01600001805480602002602001604051908101604052809291908181526020018280548015610dd157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610d87575b505050505090505b81610dfd828581518110610df057610def613b5c565b5b6020026020010151611758565b604051602001610e0e929190613ede565b604051602081830303815290604052915082600101925080518310610dd9578193505050505b919050565b610e4161155c565b80600060028110610e5557610e54613b5c565b5b602002015161010b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160028110610eaf57610eae613b5c565b5b602002015161010c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060610f038261168a565b604051602001610f139190613f28565b6040516020818303038152906040529050919050565b6060612058841115610f67576040517f4621ae1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061010b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b09afec1866040518263ffffffff1660e01b8152600401610fc59190613707565b60a060405180830381865afa158015610fe2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110069190614081565b90506001816020015160ff16101561104a576040517fb14f83d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061010c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166307160cf5876040518263ffffffff1660e01b81526004016110a89190613707565b600060405180830381865afa1580156110c5573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110ee91906142ce565b905060006110fd87848461178d565b9050600061110d84848489611924565b905060006020846040015160ff166007811061112c5761112b613b5c565b5b016111368a61168a565b60405180610120016040528060e6815260200161592c60e691398a8561115f8860e00151611b7a565b60405160200161117496959493929190614565565b604051602081830303815290604052905061118e81611b7a565b60405160200161119e9190614648565b604051602081830303815290604052955050505050509392505050565b60006111c561155c565b6111ce826115e6565b61010784600481106111e3576111e2613b5c565b5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610107836004811061123757611236613b5c565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b606061205882111561129f576040517f4621ae1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061010b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b09afec1846040518263ffffffff1660e01b81526004016112fd9190613707565b60a060405180830381865afa15801561131a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133e9190614081565b90506001816020015160ff161015611382576040517fb14f83d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061010c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166307160cf5856040518263ffffffff1660e01b81526004016113e09190613707565b600060405180830381865afa1580156113fd573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061142691906142ce565b9050600061143585848461178d565b90508060e001519350505050919050565b61144e61155c565b6000816020811061146257611461613b5c565b5b0160000160006114729190613334565b50565b600061147f61155c565b611488826115e6565b9050919050565b61149761155c565b80600084602081106114ac576114ab613b5c565b5b0160000183815481106114c2576114c1613b5c565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b61151761155c565b8061010d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61010d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115e4576040517f8e2aa84b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600080611611836040516020016115fd91906146e1565b604051602081830303815290604052611cdd565b90508051602082016000f09150600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611684576040517f08d4abb600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50919050565b60606000600161169984611d09565b01905060008167ffffffffffffffff8111156116b8576116b7613423565b5b6040519080825280601f01601f1916602001820160405280156116ea5781602001600182028036833780820191505090505b509050600082602001820190505b60011561174d578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161174157611740613c83565b5b049450600085036116f8575b819350505050919050565b60606117868260017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611e5c565b9050919050565b611795613355565b61179d613355565b60006117a88661168a565b9050600560046117d6836040516020016117c29190614775565b6040516020818303038152906040526107b5565b816117e4576117e3613c83565b5b06018260000181815250508160000151610bb88161180557611804613c83565b5b0482602001818152505060006027856060015160088760400151020160ff166038811061183557611834613b5c565b5b60040201600480602002604051908101604052809291906000905b828210156118f35783820180546118669061436c565b80601f01602080910402602001604051908101604052809291908181526020018280546118929061436c565b80156118df5780601f106118b4576101008083540402835291602001916118df565b820191906000526020600020905b8154815290600101906020018083116118c257829003601f168201915b505050505081526020019060010190611850565b505050509050808361012001819052505061191086868685611f41565b8260e0018190525081925050509392505050565b60606000611931836103a1565b90506000611951600188602001516119499190614797565b60ff1661168a565b611961886000015160ff1661168a565b8360006002811061197557611974613b5c565b5b60200201518460016002811061198e5761198d613b5c565b5b60200201516040516020016119a69493929190614994565b6040516020818303038152906040529050806020876040015160ff16600781106119d3576119d2613b5c565b5b016119e4886060015160ff1661168a565b6119f1886000015161168a565b6119fe896040015161168a565b611a0b8a6060015161168a565b611a188b6080015161168a565b604051602001611a2e9796959493929190614caa565b604051602081830303815290604052905080611a4d8660a0015161168a565b6005886020015160ff1614611a97576040518060400160405280600581526020017f46616c7365000000000000000000000000000000000000000000000000000000815250611ace565b6040518060400160405280600481526020017f54727565000000000000000000000000000000000000000000000000000000008152505b8860800151611b12576040518060400160405280600681526020017f4e6f6e65227d0000000000000000000000000000000000000000000000000000815250611b49565b6040518060400160405280600981526020017f446f20476f6f64227d00000000000000000000000000000000000000000000008152505b604051602001611b5c9493929190614ea7565b60405160208183030381529060405290508092505050949350505050565b60606000825103611b9c57604051806020016040528060008152509050611cd8565b6000604051806060016040528060408152602001615a126040913990506000600360028551611bcb9190613b8b565b611bd59190613cb2565b6004611be19190614f06565b67ffffffffffffffff811115611bfa57611bf9613423565b5b6040519080825280601f01601f191660200182016040528015611c2c5781602001600182028036833780820191505090505b509050600182016020820185865187015b80821015611c98576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845360018401935050611c3d565b5050600386510660018114611cb45760028114611cc757611ccf565b603d6001830353603d6002830353611ccf565b603d60018303535b50505080925050505b919050565b6060815182604051602001611cf3929190615026565b6040516020818303038152906040529050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611d67577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611d5d57611d5c613c83565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611da4576d04ee2d6d415b85acef81000000008381611d9a57611d99613c83565b5b0492506020810190505b662386f26fc100008310611dd357662386f26fc100008381611dc957611dc8613c83565b5b0492506010810190505b6305f5e1008310611dfc576305f5e1008381611df257611df1613c83565b5b0492506008810190505b6127108310611e21576127108381611e1757611e16613c83565b5b0492506004810190505b60648310611e445760648381611e3a57611e39613c83565b5b0492506002810190505b600a8310611e53576001810190505b80915050919050565b60606000611e6985612c69565b905060008103611e8b5760405180602001604052806000815250915050611f3a565b80841115611eab5760405180602001604052806000815250915050611f3a565b83831015611ef4578084846040517f2c4a89fa000000000000000000000000000000000000000000000000000000008152600401611eeb93929190615064565b60405180910390fd5b60008484039050600085830390506000828210611f115782611f13565b815b90506040519450601f19601f60208301011685016040528085528087602087018a3c505050505b9392505050565b6060600080600080600080611f566001610cb1565b60058a6020015160ff1614611fa0576040518060400160405280600381526020017f3e0a0a0000000000000000000000000000000000000000000000000000000000815250611fd7565b6040518060400160405280601981526020017f2066696c7465723d2275726c2823676c6974636829223e0a0a000000000000008152505b8a6080015161200357896101200151600060048110611ff957611ff8613b5c565b5b602002015161203a565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b60058c6020015160ff1614612084576040518060400160405280600381526020017f3e0a0a00000000000000000000000000000000000000000000000000000000008152506120bb565b6040518060400160405280601881526020017f2066696c7465723d2275726c28236e6f69736529223e0a0a00000000000000008152505b6040516020016120ce9493929190615159565b60405160208183030381529060405290505b60018201600d8c0102935060018860a0015111806120fe5750600582115b156121155761210e846096612c74565b9450612124565b6121218461012c612c74565b94505b8188600001510388602001510295506000850361214f57876080018051600101908181525050612bd5565b6001850361227857806121618361168a565b8a60800151801561218357506000600d87816121805761217f613c83565b5b06145b6121bd57896101200151600460018801816121a1576121a0613c83565b5b06600481106121b3576121b2613b5c565b5b60200201516121f4565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b8a61012001516004600289018161220e5761220d613c83565b5b06600481106122205761221f613b5c565b5b602002015161223f60028b8161223957612238613c83565b5b04610ef8565b60405160200161225395949392919061527e565b6040516020818303038152906040529050876040018051600101908181525050612bd4565b60028503612390578061228a8361168a565b8a6080015180156122ac57506000600d87816122a9576122a8613c83565b5b06145b6122e6578961012001516004600a8801816122ca576122c9613c83565b5b06600481106122dc576122db613b5c565b5b602002015161231d565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b8a61012001516004600b89018161233757612336613c83565b5b066004811061234957612348613b5c565b5b60200201516123578a61087b565b60405160200161236b95949392919061527e565b6040516020818303038152906040529050876060018051600101908181525050612bd3565b600385036125a057610fa060648702816123ad576123ac613c83565b5b049250806123ba8361168a565b8a6080015180156123dc57506000600d87816123d9576123d8613c83565b5b06145b61241657896101200151600460038801816123fa576123f9613c83565b5b066004811061240c5761240b613b5c565b5b602002015161244d565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b8a610120015160048089018161246657612465613c83565b5b066004811061247857612477613b5c565b5b602002015160405160200161248e929190615314565b6040516020818303038152906040526124b1866107d00262030d400360026108ef565b6124c5876107d00262030d400360026108ef565b6040516020016124d692919061537c565b6040516020818303038152906040526040516020016124f89493929190615421565b6040516020818303038152906040529050806125158460026108ef565b6125208560026108ef565b60405160200161253192919061537c565b60405160208183030381529060405261255a600c878161255457612553613c83565b5b06610cf9565b60405160200161256c939291906154c5565b60405160208183030381529060405290508760400180516001019081815250508760a0018051600101908181525050612bd2565b600485036127b057610fa060648702816125bd576125bc613c83565b5b049250806125ca8361168a565b8a6080015180156125ec57506000600d87816125e9576125e8613c83565b5b06145b612626578961012001516004600388018161260a57612609613c83565b5b066004811061261c5761261b613b5c565b5b602002015161265d565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b8a610120015160048089018161267657612675613c83565b5b066004811061268857612687613b5c565b5b602002015160405160200161269e929190615314565b6040516020818303038152906040526126c1866107d00262030d400360026108ef565b6126d5876107d00262030d400360026108ef565b6040516020016126e692919061537c565b6040516020818303038152906040526040516020016127089493929190615421565b6040516020818303038152906040529050806127258460026108ef565b6127308560026108ef565b60405160200161274192919061537c565b60405160208183030381529060405261276a600c878161276457612763613c83565b5b06610cf9565b60405160200161277c939291906154c5565b60405160208183030381529060405290508760600180516001019081815250508760a0018051600101908181525050612bd1565b600585036129c057610fa060648702816127cd576127cc613c83565b5b049250806127da8361168a565b8a6080015180156127fc57506000600d87816127f9576127f8613c83565b5b06145b612836578961012001516004600388018161281a57612819613c83565b5b066004811061282c5761282b613b5c565b5b602002015161286d565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b8a610120015160048089018161288657612885613c83565b5b066004811061289857612897613b5c565b5b60200201516040516020016128ae929190615314565b6040516020818303038152906040526128d1866107d00262030d400360026108ef565b6128e5876107d00262030d400360026108ef565b6040516020016128f692919061537c565b6040516020818303038152906040526040516020016129189493929190615421565b6040516020818303038152906040529050806129358460026108ef565b6129408560026108ef565b60405160200161295192919061537c565b60405160208183030381529060405261297a600c878161297457612973613c83565b5b06610cf9565b60405160200161298c939291906154c5565b60405160208183030381529060405290508760600180516001019081815250508760a0018051600101908181525050612bd0565b60068503612bcf57610fa060648702816129dd576129dc613c83565b5b049250806129ea8361168a565b8a608001518015612a0c57506000600d8781612a0957612a08613c83565b5b06145b612a465789610120015160046007880181612a2a57612a29613c83565b5b0660048110612a3c57612a3b613b5c565b5b6020020151612a7d565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b8a610120015160046008890181612a9757612a96613c83565b5b0660048110612aa957612aa8613b5c565b5b6020020151604051602001612abf929190615314565b604051602081830303815290604052612ae2866107d00262030d400360026108ef565b612af6876107d00262030d400360026108ef565b604051602001612b0792919061537c565b604051602081830303815290604052604051602001612b299493929190615421565b604051602081830303815290604052905080612b468460026108ef565b612b518560026108ef565b604051602001612b6292919061537c565b604051602081830303815290604052612b8d600c808881612b8657612b85613c83565b5b0601610cf9565b604051602001612b9f939291906154c5565b60405160208183030381529060405290508760600180516001019081815250508760a00180516001019081815250505b5b5b5b5b5b5b816001019150876000015182106120e057612bf06000610cb1565b612bfc8c8c8c8c612d6f565b82612c076002610cb1565b60058d6020015160ff1614612c2b5760405180602001604052806000815250612c36565b612c356003610cb1565b5b604051602001612c4a959493929190615549565b6040516020818303038152906040529650505050505050949350505050565b6000813b9050919050565b6000806040518060e00160405280603260ff168152602001603260ff168152602001603260ff168152602001600f60ff168152602001600f60ff168152602001603c60ff168152602001603c60ff16815250905060008082600060078110612cdf57612cde613b5c565b5b602002015160ff169050600085612d1f612cfb600d8a0261168a565b604051602001612d0b91906155ef565b6040516020818303038152906040526107b5565b81612d2d57612d2c613c83565b5b0690505b808211612d6257826001019250838360078110612d5157612d50613b5c565b5b602002015160ff1682019150612d31565b8294505050505092915050565b60606020836040015160ff1660078110612d8c57612d8b613b5c565b5b01612d968661168a565b604051602001612da7929190615624565b6040516020818303038152906040528261010001819052506000612dca8661168a565b836101000151612ddd876080015161306e565b612df4886060015167ffffffffffffffff1661168a565b612e0b896040015167ffffffffffffffff1661168a565b612e1b8a6020015160ff1661168a565b612e2b8b6000015160ff1661168a565b60208b6040015160ff1660078110612e4657612e45613b5c565b5b01612e578c6060015160ff1661168a565b604051602001612e6f9998979695949392919061567d565b604051602081830303815290604052905080612e8e846000015161168a565b612e9b856040015161168a565b612ea8866060015161168a565b612eb5876080015161168a565b612ec28860a0015161168a565b60058a6020015160ff1614612f0c576040518060400160405280600581526020017f66616c7365000000000000000000000000000000000000000000000000000000815250612f43565b6040518060400160405280600481526020017f74727565000000000000000000000000000000000000000000000000000000008152505b8a60800151612f87576040518060400160405280600481526020017f4e6f6e6500000000000000000000000000000000000000000000000000000000815250612fbe565b6040518060400160405280600781526020017f446f20476f6f64000000000000000000000000000000000000000000000000008152505b8a6101200151600060048110612fd757612fd6613b5c565b5b60200201518b6101200151600160048110612ff557612ff4613b5c565b5b60200201518c610120015160026004811061301357613012613b5c565b5b60200201518d610120015160036004811061303157613030613b5c565b5b60200201516040516020016130519c9b9a99989796959493929190615783565b604051602081830303815290604052905080915050949350505050565b60606130948273ffffffffffffffffffffffffffffffffffffffff16601460ff1661309b565b9050919050565b6060600060028360026130ae9190614f06565b6130b89190613b8b565b67ffffffffffffffff8111156130d1576130d0613423565b5b6040519080825280601f01601f1916602001820160405280156131035781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061313b5761313a613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061319f5761319e613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026131df9190614f06565b6131e99190613b8b565b90505b6001811115613289577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061322b5761322a613b5c565b5b1a60f81b82828151811061324257613241613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061328290613bbf565b90506131ec565b50600084146132cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c49061590b565b60405180910390fd5b8091505092915050565b60405180604001604052806002905b60608152602001906001900390816132e65790505090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b508054600082559060005260206000209081019061335291906133b0565b50565b60405180610140016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160001515815260200160608152602001606081526020016133aa6133cd565b81525090565b5b808211156133c95760008160009055506001016133b1565b5090565b60405180608001604052806004905b60608152602001906001900390816133dc5790505090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61345b82613412565b810181811067ffffffffffffffff8211171561347a57613479613423565b5b80604052505050565b600061348d6133f4565b90506134998282613452565b919050565b600067ffffffffffffffff8211156134b9576134b8613423565b5b6134c282613412565b9050602081019050919050565b82818337600083830152505050565b60006134f16134ec8461349e565b613483565b90508281526020810184848401111561350d5761350c61340d565b5b6135188482856134cf565b509392505050565b600082601f83011261353557613534613408565b5b81356135458482602086016134de565b91505092915050565b600060208284031215613564576135636133fe565b5b600082013567ffffffffffffffff81111561358257613581613403565b5b61358e84828501613520565b91505092915050565b600060029050919050565b600081905092915050565b6000819050919050565b600081519050919050565b600082825260208201905092915050565b60005b838110156135f15780820151818401526020810190506135d6565b60008484015250505050565b6000613608826135b7565b61361281856135c2565b93506136228185602086016135d3565b61362b81613412565b840191505092915050565b600061364283836135fd565b905092915050565b6000602082019050919050565b600061366282613597565b61366c81856135a2565b93508360208202850161367e856135ad565b8060005b858110156136ba578484038952815161369b8582613636565b94506136a68361364a565b925060208a01995050600181019050613682565b50829750879550505050505092915050565b600060208201905081810360008301526136e68184613657565b905092915050565b6000819050919050565b613701816136ee565b82525050565b600060208201905061371c60008301846136f8565b92915050565b61372b816136ee565b811461373657600080fd5b50565b60008135905061374881613722565b92915050565b60008060408385031215613765576137646133fe565b5b600061377385828601613739565b925050602083013567ffffffffffffffff81111561379457613793613403565b5b6137a085828601613520565b9150509250929050565b6000602082840312156137c0576137bf6133fe565b5b60006137ce84828501613739565b91505092915050565b600082825260208201905092915050565b60006137f3826135b7565b6137fd81856137d7565b935061380d8185602086016135d3565b61381681613412565b840191505092915050565b6000602082019050818103600083015261383b81846137e8565b905092915050565b6000806040838503121561385a576138596133fe565b5b600061386885828601613739565b925050602061387985828601613739565b9150509250929050565b600067ffffffffffffffff82111561389e5761389d613423565b5b602082029050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006138d9826138ae565b9050919050565b6138e9816138ce565b81146138f457600080fd5b50565b600081359050613906816138e0565b92915050565b600061391f61391a84613883565b613483565b90508060208402830185811115613939576139386138a9565b5b835b81811015613962578061394e88826138f7565b84526020840193505060208101905061393b565b5050509392505050565b600082601f83011261398157613980613408565b5b600261398e84828561390c565b91505092915050565b6000604082840312156139ad576139ac6133fe565b5b60006139bb8482850161396c565b91505092915050565b6000806000606084860312156139dd576139dc6133fe565b5b60006139eb86828701613739565b935050602084013567ffffffffffffffff811115613a0c57613a0b613403565b5b613a1886828701613520565b925050604084013567ffffffffffffffff811115613a3957613a38613403565b5b613a4586828701613520565b9150509250925092565b613a58816138ce565b82525050565b6000602082019050613a736000830184613a4f565b92915050565b600080600060608486031215613a9257613a916133fe565b5b6000613aa086828701613739565b9350506020613ab186828701613739565b9250506040613ac2868287016138f7565b9150509250925092565b600060208284031215613ae257613ae16133fe565b5b6000613af0848285016138f7565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b33826136ee565b9150613b3e836136ee565b9250828203905081811115613b5657613b55613af9565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613b96826136ee565b9150613ba1836136ee565b9250828201905080821115613bb957613bb8613af9565b5b92915050565b6000613bca826136ee565b915060008203613bdd57613bdc613af9565b5b600182039050919050565b6000613bf3826136ee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c2557613c24613af9565b5b600182019050919050565b600081905092915050565b6000613c46826135b7565b613c508185613c30565b9350613c608185602086016135d3565b80840191505092915050565b6000613c788284613c3b565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613cbd826136ee565b9150613cc8836136ee565b925082613cd857613cd7613c83565b5b828204905092915050565b7f3c7265637420783d220000000000000000000000000000000000000000000000815250565b7f2220793d22000000000000000000000000000000000000000000000000000000815250565b7f222077696474683d220000000000000000000000000000000000000000000000815250565b7f22206865696768743d2200000000000000000000000000000000000000000000815250565b7f222f3e0a00000000000000000000000000000000000000000000000000000000815250565b6000613dac82613ce3565b600982019150613dbc8287613c3b565b9150613dc782613d09565b600582019150613dd78286613c3b565b9150613de282613d2f565b600982019150613df28285613c3b565b9150613dfd82613d55565b600a82019150613e0d8284613c3b565b9150613e1882613d7b565b60048201915081905095945050505050565b7f3000000000000000000000000000000000000000000000000000000000000000815250565b7f2e00000000000000000000000000000000000000000000000000000000000000815250565b6000613e8182613e2a565b600182019150613e9082613e50565b600182019150613ea08284613c3b565b915081905092915050565b6000613eb78285613c3b565b9150613ec282613e50565b600182019150613ed28284613c3b565b91508190509392505050565b6000613eea8285613c3b565b9150613ef68284613c3b565b91508190509392505050565b7f3c636972636c652063783d2232303030222063793d22323030302220723d2200815250565b6000613f3382613f02565b601f82019150613f438284613c3b565b9150613f4e82613d7b565b60048201915081905092915050565b600080fd5b600080fd5b600060ff82169050919050565b613f7d81613f67565b8114613f8857600080fd5b50565b600081519050613f9a81613f74565b92915050565b600067ffffffffffffffff82169050919050565b613fbd81613fa0565b8114613fc857600080fd5b50565b600081519050613fda81613fb4565b92915050565b600081519050613fef816138e0565b92915050565b600060a0828403121561400b5761400a613f5d565b5b61401560a0613483565b9050600061402584828501613f8b565b600083015250602061403984828501613f8b565b602083015250604061404d84828501613fcb565b604083015250606061406184828501613fcb565b606083015250608061407584828501613fe0565b60808301525092915050565b600060a08284031215614097576140966133fe565b5b60006140a584828501613ff5565b91505092915050565b60008115159050919050565b6140c3816140ae565b81146140ce57600080fd5b50565b6000815190506140e0816140ba565b92915050565b600061ffff82169050919050565b6140fd816140e6565b811461410857600080fd5b50565b60008151905061411a816140f4565b92915050565b60007fffffff000000000000000000000000000000000000000000000000000000000082169050919050565b61415581614120565b811461416057600080fd5b50565b6000815190506141728161414c565b92915050565b600061418b6141868461349e565b613483565b9050828152602081018484840111156141a7576141a661340d565b5b6141b28482856135d3565b509392505050565b600082601f8301126141cf576141ce613408565b5b81516141df848260208601614178565b91505092915050565b600061010082840312156141ff576141fe613f5d565b5b61420a610100613483565b9050600061421a84828501613f8b565b600083015250602061422e84828501613f8b565b602083015250604061424284828501613f8b565b604083015250606061425684828501613f8b565b606083015250608061426a848285016140d1565b60808301525060a061427e8482850161410b565b60a08301525060c061429284828501614163565b60c08301525060e082015167ffffffffffffffff8111156142b6576142b5613f62565b5b6142c2848285016141ba565b60e08301525092915050565b6000602082840312156142e4576142e36133fe565b5b600082015167ffffffffffffffff81111561430257614301613403565b5b61430e848285016141e8565b91505092915050565b7f7b226e616d65223a220000000000000000000000000000000000000000000000815250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061438457607f821691505b6020821081036143975761439661433d565b5b50919050565b60008190508160005260206000209050919050565b600081546143bf8161436c565b6143c98186613c30565b945060018216600081146143e457600181146143f95761442c565b60ff198316865281151582028601935061442c565b6144028561439d565b60005b8381101561442457815481890152600182019150602081019050614405565b838801955050505b50505092915050565b7f2023000000000000000000000000000000000000000000000000000000000000815250565b7f222c226465736372697074696f6e223a22000000000000000000000000000000815250565b7f222c000000000000000000000000000000000000000000000000000000000000815250565b7f2261747472696275746573223a5b000000000000000000000000000000000000815250565b7f5d2c22696d616765223a22646174613a696d6167652f7376672b786d6c3b626160008201527f736536342c000000000000000000000000000000000000000000000000000000602082015250565b6000614529602583613c30565b9150614534826144cd565b602582019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000815250565b600061457082614317565b60098201915061458082896143b2565b915061458b82614435565b60028201915061459b8288613c3b565b91506145a68261445b565b6011820191506145b68287613c3b565b91506145c182614481565b6002820191506145d18286613c3b565b91506145dc826144a7565b600e820191506145ec8285613c3b565b91506145f78261451c565b91506146038284613c3b565b915061460e8261453f565b600282019150819050979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815250565b600061465382614622565b601d820191506146638284613c3b565b915081905092915050565b60008082015250565b6000614684600183613c30565b915061468f8261466e565b600182019050919050565b600081519050919050565b600081905092915050565b60006146bb8261469a565b6146c581856146a5565b93506146d58185602086016135d3565b80840191505092915050565b60006146ec82614677565b91506146f882846146b0565b915081905092915050565b7f637265617465207820696e6e6f76617465207820696d70616374207820646f2060008201527f676f6f6400000000000000000000000000000000000000000000000000000000602082015250565b600061475f602483613c30565b915061476a82614703565b602482019050919050565b60006147818284613c3b565b915061478c82614752565b915081905092915050565b60006147a282613f67565b91506147ad83613f67565b9250828201905060ff8111156147c6576147c5613af9565b5b92915050565b7f7b2274726169745f74797065223a202247656e65726174696f6e7320556e6c6f60008201527f636b6564222c202276616c7565223a0000000000000000000000000000000000602082015250565b6000614828602f83613c30565b9150614833826147cc565b602f82019050919050565b7f7d2c7b2274726169745f74797065223a20224163746976652047656e6572617460008201527f696f6e222c202276616c7565223a000000000000000000000000000000000000602082015250565b600061489a602e83613c30565b91506148a58261483e565b602e82019050919050565b7f7d2c7b2274726169745f74797065223a202254696d6573205472616e7366657260008201527f726564222c202276616c7565223a220000000000000000000000000000000000602082015250565b600061490c602f83613c30565b9150614917826148b0565b602f82019050919050565b7f227d2c7b2274726169745f74797065223a20224f776e65642053696e6365222c60008201527f202276616c7565223a2200000000000000000000000000000000000000000000602082015250565b600061497e602a83613c30565b915061498982614922565b602a82019050919050565b600061499f8261481b565b91506149ab8287613c3b565b91506149b68261488d565b91506149c28286613c3b565b91506149cd826148ff565b91506149d98285613c3b565b91506149e482614971565b91506149f08284613c3b565b915081905095945050505050565b7f227d2c7b2274726169745f74797065223a2022436f6c6f722047726f7570222c60008201527f202276616c7565223a2200000000000000000000000000000000000000000000602082015250565b6000614a5a602a83613c30565b9150614a65826149fe565b602a82019050919050565b7f227d2c7b2274726169745f74797065223a202250616c6574746520496e64657860008201527f222c202276616c7565223a220000000000000000000000000000000000000000602082015250565b6000614acc602c83613c30565b9150614ad782614a70565b602c82019050919050565b7f7b2274726169745f74797065223a2022536861706520436f756e74222c20227660008201527f616c7565223a2200000000000000000000000000000000000000000000000000602082015250565b6000614b3e602783613c30565b9150614b4982614ae2565b602782019050919050565b7f227d2c7b2274726169745f74797065223a2022436972636c6520436f756e742260008201527f2c202276616c7565223a22000000000000000000000000000000000000000000602082015250565b6000614bb0602b83613c30565b9150614bbb82614b54565b602b82019050919050565b7f227d2c7b2274726169745f74797065223a202253717561726520436f756e742260008201527f2c202276616c7565223a22000000000000000000000000000000000000000000602082015250565b6000614c22602b83613c30565b9150614c2d82614bc6565b602b82019050919050565b7f227d2c7b2274726169745f74797065223a20224e6f6e6520436f756e74222c2060008201527f2276616c7565223a220000000000000000000000000000000000000000000000602082015250565b6000614c94602983613c30565b9150614c9f82614c38565b602982019050919050565b6000614cb6828a613c3b565b9150614cc182614a4d565b9150614ccd82896143b2565b9150614cd882614abf565b9150614ce48288613c3b565b9150614cef82614b31565b9150614cfb8287613c3b565b9150614d0682614ba3565b9150614d128286613c3b565b9150614d1d82614c15565b9150614d298285613c3b565b9150614d3482614c87565b9150614d408284613c3b565b915081905098975050505050505050565b7f227d2c7b2274726169745f74797065223a2022436f6d706c6578697479204c6560008201527f76656c222c202276616c7565223a220000000000000000000000000000000000602082015250565b6000614dad602f83613c30565b9150614db882614d51565b602f82019050919050565b7f227d2c7b2274726169745f74797065223a2022476c6974636879222c2022766160008201527f6c7565223a220000000000000000000000000000000000000000000000000000602082015250565b6000614e1f602683613c30565b9150614e2a82614dc3565b602682019050919050565b7f227d2c7b2274726169745f74797065223a20225370656369616c20547261697460008201527f222c202276616c7565223a220000000000000000000000000000000000000000602082015250565b6000614e91602c83613c30565b9150614e9c82614e35565b602c82019050919050565b6000614eb38287613c3b565b9150614ebe82614da0565b9150614eca8286613c3b565b9150614ed582614e12565b9150614ee18285613c3b565b9150614eec82614e84565b9150614ef88284613c3b565b915081905095945050505050565b6000614f11826136ee565b9150614f1c836136ee565b9250828202614f2a816136ee565b91508282048414831517614f4157614f40613af9565b5b5092915050565b7f6300000000000000000000000000000000000000000000000000000000000000600082015250565b6000614f7e600183613c30565b9150614f8982614f48565b600182019050919050565b600063ffffffff82169050919050565b60008160e01b9050919050565b6000614fbc82614fa4565b9050919050565b614fd4614fcf82614f94565b614fb1565b82525050565b7f80600e6000396000f30000000000000000000000000000000000000000000000600082015250565b6000615010600983613c30565b915061501b82614fda565b600982019050919050565b600061503182614f71565b915061503d8285614fc3565b60048201915061504c82615003565b915061505882846146b0565b91508190509392505050565b600060608201905061507960008301866136f8565b61508660208301856136f8565b61509360408301846136f8565b949350505050565b7f3c672069643d2261727422000000000000000000000000000000000000000000815250565b7f3c7265637420783d22302220793d2230222077696474683d223130302522206860008201527f65696768743d2231303025222066696c6c3d2200000000000000000000000000602082015250565b600061511d603383613c30565b9150615128826150c1565b603382019050919050565b7f222f3e0a0a3c672069643d227368617065732200000000000000000000000000815250565b60006151658287613c3b565b91506151708261509b565b600b820191506151808286613c3b565b915061518b82615110565b91506151978285613c3b565b91506151a282615133565b6013820191506151b28284613c3b565b915081905095945050505050565b7f3c672069643d22736861706547726f75705f0000000000000000000000000000815250565b7f222066696c6c3d22000000000000000000000000000000000000000000000000815250565b7f22207374726f6b653d2200000000000000000000000000000000000000000000815250565b7f22207374726f6b652d77696474683d223530223e0a0000000000000000000000815250565b7f3c2f673e0a0a0000000000000000000000000000000000000000000000000000815250565b600061528a8288613c3b565b9150615295826151c0565b6012820191506152a58287613c3b565b91506152b0826151e6565b6008820191506152c08286613c3b565b91506152cb8261520c565b600a820191506152db8285613c3b565b91506152e682615232565b6015820191506152f68284613c3b565b915061530182615258565b6006820191508190509695505050505050565b600061531f826151e6565b60088201915061532f8285613c3b565b915061533a8261520c565b600a8201915061534a8284613c3b565b91508190509392505050565b7f2c20000000000000000000000000000000000000000000000000000000000000815250565b60006153888285613c3b565b915061539382615356565b6002820191506153a38284613c3b565b91508190509392505050565b7f22207374726f6b652d77696474683d22313022207472616e73666f726d3d227460008201527f72616e736c617465280000000000000000000000000000000000000000000000602082015250565b600061540b602983613c30565b9150615416826153af565b602982019050919050565b600061542d8287613c3b565b9150615438826151c0565b6012820191506154488286613c3b565b91506154548285613c3b565b915061545f826153fe565b915061546b8284613c3b565b915081905095945050505050565b7f29207363616c6528000000000000000000000000000000000000000000000000815250565b7f2922203e0a000000000000000000000000000000000000000000000000000000815250565b60006154d18286613c3b565b91506154dc82615479565b6008820191506154ec8285613c3b565b91506154f78261549f565b6005820191506155078284613c3b565b915061551282615258565b600682019150819050949350505050565b7f0a0a3c2f7376673e000000000000000000000000000000000000000000000000815250565b60006155558288613c3b565b91506155618287613c3b565b915061556d8286613c3b565b91506155798285613c3b565b91506155858284613c3b565b915061559082615523565b6008820191508190509695505050505050565b7f697473206120676f6f6420646179000000000000000000000000000000000000815250565b7f746f2068617665206120676f6f64206461790000000000000000000000000000815250565b60006155fa826155a3565b600e8201915061560a8284613c3b565b9150615615826155c9565b60128201915081905092915050565b600061563082856143b2565b915061563b82614435565b60028201915061564b8284613c3b565b91508190509392505050565b7f7c00000000000000000000000000000000000000000000000000000000000000815250565b6000615689828c613c3b565b915061569482615657565b6001820191506156a4828b613c3b565b91506156af82615657565b6001820191506156bf828a613c3b565b91506156ca82615657565b6001820191506156da8289613c3b565b91506156e582615657565b6001820191506156f58288613c3b565b915061570082615657565b6001820191506157108287613c3b565b915061571b82615657565b60018201915061572b8286613c3b565b915061573682615657565b60018201915061574682856143b2565b915061575182615657565b6001820191506157618284613c3b565b915061576c82615657565b6001820191508190509a9950505050505050505050565b600061578f828f613c3b565b915061579b828e613c3b565b91506157a682615657565b6001820191506157b6828d613c3b565b91506157c182615657565b6001820191506157d1828c613c3b565b91506157dc82615657565b6001820191506157ec828b613c3b565b91506157f782615657565b600182019150615807828a613c3b565b915061581282615657565b6001820191506158228289613c3b565b915061582d82615657565b60018201915061583d8288613c3b565b915061584882615657565b6001820191506158588287613c3b565b915061586382615657565b6001820191506158738286613c3b565b915061587e82615657565b60018201915061588e8285613c3b565b915061589982615657565b6001820191506158a98284613c3b565b91508190509d9c50505050505050505050505050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006158f56020836137d7565b9150615900826158bf565b602082019050919050565b60006020820190508181036000830152615924816158e8565b905091905056fe77686f207361696420636972636c657320616e6420737175617265732063616e742067657420616c6f6e673f2077656c636f6d6520746f2067656e2d312077686572652074686573652074776f2073686170657320636f6d6520746f67657468657220696e2070657266656374206861726d6f6e792e20796f75206b6e6f7720746865206472696c6c2e2e2e20656e6a6f7920746865206172742c206578706c6f72652074686520636f64652c20616e6420646f6e7420666f7267657420746f20636c69636b2061726f756e6420666f7220736f6d652065787472612066756e2120f09f98894142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220ceae77a067acd3d8d80d55458e0906bf0b913bac991f18a943e1f8e1e658362864736f6c63430008130033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101005760003560e01c8063a0a93f0711610097578063d2e1e30911610066578063d2e1e3091461031d578063dd20620214610339578063e4fbf23a14610369578063f2fde38b1461038557610100565b8063a0a93f071461025d578063c379dc431461028d578063c382a04b146102bd578063c7ab2dbc146102ed57610100565b8063373e3526116100d3578063373e3526146101b157806367462265146101e15780637f4f479114610211578063952178261461024157610100565b806311b315421461010557806322b8d04414610135578063321d8bb91461016557806336e10fa014610181575b600080fd5b61011f600480360381019061011a919061354e565b6103a1565b60405161012c91906136cc565b60405180910390f35b61014f600480360381019061014a919061354e565b6107b5565b60405161015c9190613707565b60405180910390f35b61017f600480360381019061017a919061374e565b6107e8565b005b61019b600480360381019061019691906137aa565b61087b565b6040516101a89190613821565b60405180910390f35b6101cb60048036038101906101c69190613843565b6108ef565b6040516101d89190613821565b60405180910390f35b6101fb60048036038101906101f691906137aa565b610cb1565b6040516102089190613821565b60405180910390f35b61022b600480360381019061022691906137aa565b610cf9565b6040516102389190613821565b60405180910390f35b61025b60048036038101906102569190613997565b610e39565b005b610277600480360381019061027291906137aa565b610ef8565b6040516102849190613821565b60405180910390f35b6102a760048036038101906102a291906139c4565b610f29565b6040516102b49190613821565b60405180910390f35b6102d760048036038101906102d2919061374e565b6111bb565b6040516102e49190613a5e565b60405180910390f35b610307600480360381019061030291906137aa565b611261565b6040516103149190613821565b60405180910390f35b610337600480360381019061033291906137aa565b611446565b005b610353600480360381019061034e919061354e565b611475565b6040516103609190613a5e565b60405180910390f35b610383600480360381019061037e9190613a79565b61148f565b005b61039f600480360381019061039a9190613acc565b61150f565b005b6103a96132d7565b6000808390506103b76132fe565b600382516103c59190613b28565b816020018181525050806020015192505b60008311156104bc577f22000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191682848151811061043557610434613b5c565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036104ab576001836104749190613b8b565b8160000181815250506001816000015182602001516104939190613b28565b61049d9190613b8b565b8160400181815250506104bc565b826104b590613bbf565b92506103d6565b602b81600001516104cd9190613b28565b816080018181525050806080015192505b60008311156105c4577f22000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191682848151811061053d5761053c613b5c565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036105b35760018361057c9190613b8b565b81606001818152505060018160600151826080015161059b9190613b28565b6105a59190613b8b565b8160a00181815250506105c4565b826105bd90613bbf565b92506104de565b60008160a0015167ffffffffffffffff8111156105e4576105e3613423565b5b6040519080825280601f01601f1916602001820160405280156106165781602001600182028036833780820191505090505b5090506000826040015167ffffffffffffffff81111561063957610638613423565b5b6040519080825280601f01601f19166020018201604052801561066b5781602001600182028036833780820191505090505b509050600094505b8260a0015185101561070157838584606001516106909190613b8b565b815181106106a1576106a0613b5c565b5b602001015160f81c60f81b8286815181106106bf576106be613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535084806106f990613be8565b955050610673565b600094505b826040015185101561079457838584600001516107239190613b8b565b8151811061073457610733613b5c565b5b602001015160f81c60f81b81868151811061075257610751613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350848061078c90613be8565b955050610706565b60405180604001604052808381526020018281525095505050505050919050565b6000816040516020016107c89190613c6c565b6040516020818303038152906040528051906020012060001c9050919050565b6107f061155c565b60006107fb826115e6565b90506000836020811061081157610810613b5c565b5b01600001819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b6060600060028361088c9190613cb2565b6107d06108999190613b28565b905060006108a68261168a565b6108af8361168a565b6108b88661168a565b6108c18761168a565b6040516020016108d49493929190613da1565b60405160208183030381529060405290508092505050919050565b606060006108fc8461168a565b905060008151905060008467ffffffffffffffff8111156109205761091f613423565b5b6040519080825280601f01601f1916602001820160405280156109525781602001600182028036833780820191505090505b50905081851115610b0d57600082860390505b828603811015610a0a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152506000815181106109b8576109b7613b5c565b5b602001015160f81c60f81b8282815181106109d6576109d5613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610a6f565b83838703820381518110610a2157610a20613b5c565b5b602001015160f81c60f81b828281518110610a3f57610a3e613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b8060019003905060008111610965577f300000000000000000000000000000000000000000000000000000000000000082600081518110610ab357610ab2613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081604051602001610af39190613e76565b604051602081830303815290604052945050505050610cab565b818503610b3e5782604051602001610b259190613e76565b6040516020818303038152906040529350505050610cab565b60008060008088860367ffffffffffffffff811115610b6057610b5f613423565b5b6040519080825280601f01601f191660200182016040528015610b925781602001600182028036833780820191505090505b5090505b888603821015610c0b57868281518110610bb357610bb2613b5c565b5b602001015160f81c60f81b818581518110610bd157610bd0613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350836001019350610c72565b868281518110610c1e57610c1d613b5c565b5b602001015160f81c60f81b858481518110610c3c57610c3b613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508260010192505b816001019150858210610b96578085604051602001610c92929190613eab565b6040516020818303038152906040529750505050505050505b92915050565b6060610cf26101078360048110610ccb57610cca613b5c565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611758565b9050919050565b60606000808360208110610d1057610d0f613b5c565b5b016000018054905003610d3457604051806020016040528060008152509050610e34565b600060606000808560208110610d4d57610d4c613b5c565b5b01600001805480602002602001604051908101604052809291908181526020018280548015610dd157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610d87575b505050505090505b81610dfd828581518110610df057610def613b5c565b5b6020026020010151611758565b604051602001610e0e929190613ede565b604051602081830303815290604052915082600101925080518310610dd9578193505050505b919050565b610e4161155c565b80600060028110610e5557610e54613b5c565b5b602002015161010b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160028110610eaf57610eae613b5c565b5b602002015161010c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060610f038261168a565b604051602001610f139190613f28565b6040516020818303038152906040529050919050565b6060612058841115610f67576040517f4621ae1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061010b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b09afec1866040518263ffffffff1660e01b8152600401610fc59190613707565b60a060405180830381865afa158015610fe2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110069190614081565b90506001816020015160ff16101561104a576040517fb14f83d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061010c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166307160cf5876040518263ffffffff1660e01b81526004016110a89190613707565b600060405180830381865afa1580156110c5573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110ee91906142ce565b905060006110fd87848461178d565b9050600061110d84848489611924565b905060006020846040015160ff166007811061112c5761112b613b5c565b5b016111368a61168a565b60405180610120016040528060e6815260200161592c60e691398a8561115f8860e00151611b7a565b60405160200161117496959493929190614565565b604051602081830303815290604052905061118e81611b7a565b60405160200161119e9190614648565b604051602081830303815290604052955050505050509392505050565b60006111c561155c565b6111ce826115e6565b61010784600481106111e3576111e2613b5c565b5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610107836004811061123757611236613b5c565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b606061205882111561129f576040517f4621ae1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061010b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b09afec1846040518263ffffffff1660e01b81526004016112fd9190613707565b60a060405180830381865afa15801561131a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133e9190614081565b90506001816020015160ff161015611382576040517fb14f83d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061010c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166307160cf5856040518263ffffffff1660e01b81526004016113e09190613707565b600060405180830381865afa1580156113fd573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061142691906142ce565b9050600061143585848461178d565b90508060e001519350505050919050565b61144e61155c565b6000816020811061146257611461613b5c565b5b0160000160006114729190613334565b50565b600061147f61155c565b611488826115e6565b9050919050565b61149761155c565b80600084602081106114ac576114ab613b5c565b5b0160000183815481106114c2576114c1613b5c565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b61151761155c565b8061010d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61010d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115e4576040517f8e2aa84b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600080611611836040516020016115fd91906146e1565b604051602081830303815290604052611cdd565b90508051602082016000f09150600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611684576040517f08d4abb600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50919050565b60606000600161169984611d09565b01905060008167ffffffffffffffff8111156116b8576116b7613423565b5b6040519080825280601f01601f1916602001820160405280156116ea5781602001600182028036833780820191505090505b509050600082602001820190505b60011561174d578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161174157611740613c83565b5b049450600085036116f8575b819350505050919050565b60606117868260017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611e5c565b9050919050565b611795613355565b61179d613355565b60006117a88661168a565b9050600560046117d6836040516020016117c29190614775565b6040516020818303038152906040526107b5565b816117e4576117e3613c83565b5b06018260000181815250508160000151610bb88161180557611804613c83565b5b0482602001818152505060006027856060015160088760400151020160ff166038811061183557611834613b5c565b5b60040201600480602002604051908101604052809291906000905b828210156118f35783820180546118669061436c565b80601f01602080910402602001604051908101604052809291908181526020018280546118929061436c565b80156118df5780601f106118b4576101008083540402835291602001916118df565b820191906000526020600020905b8154815290600101906020018083116118c257829003601f168201915b505050505081526020019060010190611850565b505050509050808361012001819052505061191086868685611f41565b8260e0018190525081925050509392505050565b60606000611931836103a1565b90506000611951600188602001516119499190614797565b60ff1661168a565b611961886000015160ff1661168a565b8360006002811061197557611974613b5c565b5b60200201518460016002811061198e5761198d613b5c565b5b60200201516040516020016119a69493929190614994565b6040516020818303038152906040529050806020876040015160ff16600781106119d3576119d2613b5c565b5b016119e4886060015160ff1661168a565b6119f1886000015161168a565b6119fe896040015161168a565b611a0b8a6060015161168a565b611a188b6080015161168a565b604051602001611a2e9796959493929190614caa565b604051602081830303815290604052905080611a4d8660a0015161168a565b6005886020015160ff1614611a97576040518060400160405280600581526020017f46616c7365000000000000000000000000000000000000000000000000000000815250611ace565b6040518060400160405280600481526020017f54727565000000000000000000000000000000000000000000000000000000008152505b8860800151611b12576040518060400160405280600681526020017f4e6f6e65227d0000000000000000000000000000000000000000000000000000815250611b49565b6040518060400160405280600981526020017f446f20476f6f64227d00000000000000000000000000000000000000000000008152505b604051602001611b5c9493929190614ea7565b60405160208183030381529060405290508092505050949350505050565b60606000825103611b9c57604051806020016040528060008152509050611cd8565b6000604051806060016040528060408152602001615a126040913990506000600360028551611bcb9190613b8b565b611bd59190613cb2565b6004611be19190614f06565b67ffffffffffffffff811115611bfa57611bf9613423565b5b6040519080825280601f01601f191660200182016040528015611c2c5781602001600182028036833780820191505090505b509050600182016020820185865187015b80821015611c98576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845360018401935050611c3d565b5050600386510660018114611cb45760028114611cc757611ccf565b603d6001830353603d6002830353611ccf565b603d60018303535b50505080925050505b919050565b6060815182604051602001611cf3929190615026565b6040516020818303038152906040529050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611d67577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611d5d57611d5c613c83565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611da4576d04ee2d6d415b85acef81000000008381611d9a57611d99613c83565b5b0492506020810190505b662386f26fc100008310611dd357662386f26fc100008381611dc957611dc8613c83565b5b0492506010810190505b6305f5e1008310611dfc576305f5e1008381611df257611df1613c83565b5b0492506008810190505b6127108310611e21576127108381611e1757611e16613c83565b5b0492506004810190505b60648310611e445760648381611e3a57611e39613c83565b5b0492506002810190505b600a8310611e53576001810190505b80915050919050565b60606000611e6985612c69565b905060008103611e8b5760405180602001604052806000815250915050611f3a565b80841115611eab5760405180602001604052806000815250915050611f3a565b83831015611ef4578084846040517f2c4a89fa000000000000000000000000000000000000000000000000000000008152600401611eeb93929190615064565b60405180910390fd5b60008484039050600085830390506000828210611f115782611f13565b815b90506040519450601f19601f60208301011685016040528085528087602087018a3c505050505b9392505050565b6060600080600080600080611f566001610cb1565b60058a6020015160ff1614611fa0576040518060400160405280600381526020017f3e0a0a0000000000000000000000000000000000000000000000000000000000815250611fd7565b6040518060400160405280601981526020017f2066696c7465723d2275726c2823676c6974636829223e0a0a000000000000008152505b8a6080015161200357896101200151600060048110611ff957611ff8613b5c565b5b602002015161203a565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b60058c6020015160ff1614612084576040518060400160405280600381526020017f3e0a0a00000000000000000000000000000000000000000000000000000000008152506120bb565b6040518060400160405280601881526020017f2066696c7465723d2275726c28236e6f69736529223e0a0a00000000000000008152505b6040516020016120ce9493929190615159565b60405160208183030381529060405290505b60018201600d8c0102935060018860a0015111806120fe5750600582115b156121155761210e846096612c74565b9450612124565b6121218461012c612c74565b94505b8188600001510388602001510295506000850361214f57876080018051600101908181525050612bd5565b6001850361227857806121618361168a565b8a60800151801561218357506000600d87816121805761217f613c83565b5b06145b6121bd57896101200151600460018801816121a1576121a0613c83565b5b06600481106121b3576121b2613b5c565b5b60200201516121f4565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b8a61012001516004600289018161220e5761220d613c83565b5b06600481106122205761221f613b5c565b5b602002015161223f60028b8161223957612238613c83565b5b04610ef8565b60405160200161225395949392919061527e565b6040516020818303038152906040529050876040018051600101908181525050612bd4565b60028503612390578061228a8361168a565b8a6080015180156122ac57506000600d87816122a9576122a8613c83565b5b06145b6122e6578961012001516004600a8801816122ca576122c9613c83565b5b06600481106122dc576122db613b5c565b5b602002015161231d565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b8a61012001516004600b89018161233757612336613c83565b5b066004811061234957612348613b5c565b5b60200201516123578a61087b565b60405160200161236b95949392919061527e565b6040516020818303038152906040529050876060018051600101908181525050612bd3565b600385036125a057610fa060648702816123ad576123ac613c83565b5b049250806123ba8361168a565b8a6080015180156123dc57506000600d87816123d9576123d8613c83565b5b06145b61241657896101200151600460038801816123fa576123f9613c83565b5b066004811061240c5761240b613b5c565b5b602002015161244d565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b8a610120015160048089018161246657612465613c83565b5b066004811061247857612477613b5c565b5b602002015160405160200161248e929190615314565b6040516020818303038152906040526124b1866107d00262030d400360026108ef565b6124c5876107d00262030d400360026108ef565b6040516020016124d692919061537c565b6040516020818303038152906040526040516020016124f89493929190615421565b6040516020818303038152906040529050806125158460026108ef565b6125208560026108ef565b60405160200161253192919061537c565b60405160208183030381529060405261255a600c878161255457612553613c83565b5b06610cf9565b60405160200161256c939291906154c5565b60405160208183030381529060405290508760400180516001019081815250508760a0018051600101908181525050612bd2565b600485036127b057610fa060648702816125bd576125bc613c83565b5b049250806125ca8361168a565b8a6080015180156125ec57506000600d87816125e9576125e8613c83565b5b06145b612626578961012001516004600388018161260a57612609613c83565b5b066004811061261c5761261b613b5c565b5b602002015161265d565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b8a610120015160048089018161267657612675613c83565b5b066004811061268857612687613b5c565b5b602002015160405160200161269e929190615314565b6040516020818303038152906040526126c1866107d00262030d400360026108ef565b6126d5876107d00262030d400360026108ef565b6040516020016126e692919061537c565b6040516020818303038152906040526040516020016127089493929190615421565b6040516020818303038152906040529050806127258460026108ef565b6127308560026108ef565b60405160200161274192919061537c565b60405160208183030381529060405261276a600c878161276457612763613c83565b5b06610cf9565b60405160200161277c939291906154c5565b60405160208183030381529060405290508760600180516001019081815250508760a0018051600101908181525050612bd1565b600585036129c057610fa060648702816127cd576127cc613c83565b5b049250806127da8361168a565b8a6080015180156127fc57506000600d87816127f9576127f8613c83565b5b06145b612836578961012001516004600388018161281a57612819613c83565b5b066004811061282c5761282b613b5c565b5b602002015161286d565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b8a610120015160048089018161288657612885613c83565b5b066004811061289857612897613b5c565b5b60200201516040516020016128ae929190615314565b6040516020818303038152906040526128d1866107d00262030d400360026108ef565b6128e5876107d00262030d400360026108ef565b6040516020016128f692919061537c565b6040516020818303038152906040526040516020016129189493929190615421565b6040516020818303038152906040529050806129358460026108ef565b6129408560026108ef565b60405160200161295192919061537c565b60405160208183030381529060405261297a600c878161297457612973613c83565b5b06610cf9565b60405160200161298c939291906154c5565b60405160208183030381529060405290508760600180516001019081815250508760a0018051600101908181525050612bd0565b60068503612bcf57610fa060648702816129dd576129dc613c83565b5b049250806129ea8361168a565b8a608001518015612a0c57506000600d8781612a0957612a08613c83565b5b06145b612a465789610120015160046007880181612a2a57612a29613c83565b5b0660048110612a3c57612a3b613b5c565b5b6020020151612a7d565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b8a610120015160046008890181612a9757612a96613c83565b5b0660048110612aa957612aa8613b5c565b5b6020020151604051602001612abf929190615314565b604051602081830303815290604052612ae2866107d00262030d400360026108ef565b612af6876107d00262030d400360026108ef565b604051602001612b0792919061537c565b604051602081830303815290604052604051602001612b299493929190615421565b604051602081830303815290604052905080612b468460026108ef565b612b518560026108ef565b604051602001612b6292919061537c565b604051602081830303815290604052612b8d600c808881612b8657612b85613c83565b5b0601610cf9565b604051602001612b9f939291906154c5565b60405160208183030381529060405290508760600180516001019081815250508760a00180516001019081815250505b5b5b5b5b5b5b816001019150876000015182106120e057612bf06000610cb1565b612bfc8c8c8c8c612d6f565b82612c076002610cb1565b60058d6020015160ff1614612c2b5760405180602001604052806000815250612c36565b612c356003610cb1565b5b604051602001612c4a959493929190615549565b6040516020818303038152906040529650505050505050949350505050565b6000813b9050919050565b6000806040518060e00160405280603260ff168152602001603260ff168152602001603260ff168152602001600f60ff168152602001600f60ff168152602001603c60ff168152602001603c60ff16815250905060008082600060078110612cdf57612cde613b5c565b5b602002015160ff169050600085612d1f612cfb600d8a0261168a565b604051602001612d0b91906155ef565b6040516020818303038152906040526107b5565b81612d2d57612d2c613c83565b5b0690505b808211612d6257826001019250838360078110612d5157612d50613b5c565b5b602002015160ff1682019150612d31565b8294505050505092915050565b60606020836040015160ff1660078110612d8c57612d8b613b5c565b5b01612d968661168a565b604051602001612da7929190615624565b6040516020818303038152906040528261010001819052506000612dca8661168a565b836101000151612ddd876080015161306e565b612df4886060015167ffffffffffffffff1661168a565b612e0b896040015167ffffffffffffffff1661168a565b612e1b8a6020015160ff1661168a565b612e2b8b6000015160ff1661168a565b60208b6040015160ff1660078110612e4657612e45613b5c565b5b01612e578c6060015160ff1661168a565b604051602001612e6f9998979695949392919061567d565b604051602081830303815290604052905080612e8e846000015161168a565b612e9b856040015161168a565b612ea8866060015161168a565b612eb5876080015161168a565b612ec28860a0015161168a565b60058a6020015160ff1614612f0c576040518060400160405280600581526020017f66616c7365000000000000000000000000000000000000000000000000000000815250612f43565b6040518060400160405280600481526020017f74727565000000000000000000000000000000000000000000000000000000008152505b8a60800151612f87576040518060400160405280600481526020017f4e6f6e6500000000000000000000000000000000000000000000000000000000815250612fbe565b6040518060400160405280600781526020017f446f20476f6f64000000000000000000000000000000000000000000000000008152505b8a6101200151600060048110612fd757612fd6613b5c565b5b60200201518b6101200151600160048110612ff557612ff4613b5c565b5b60200201518c610120015160026004811061301357613012613b5c565b5b60200201518d610120015160036004811061303157613030613b5c565b5b60200201516040516020016130519c9b9a99989796959493929190615783565b604051602081830303815290604052905080915050949350505050565b60606130948273ffffffffffffffffffffffffffffffffffffffff16601460ff1661309b565b9050919050565b6060600060028360026130ae9190614f06565b6130b89190613b8b565b67ffffffffffffffff8111156130d1576130d0613423565b5b6040519080825280601f01601f1916602001820160405280156131035781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061313b5761313a613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061319f5761319e613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026131df9190614f06565b6131e99190613b8b565b90505b6001811115613289577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061322b5761322a613b5c565b5b1a60f81b82828151811061324257613241613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061328290613bbf565b90506131ec565b50600084146132cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c49061590b565b60405180910390fd5b8091505092915050565b60405180604001604052806002905b60608152602001906001900390816132e65790505090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b508054600082559060005260206000209081019061335291906133b0565b50565b60405180610140016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160001515815260200160608152602001606081526020016133aa6133cd565b81525090565b5b808211156133c95760008160009055506001016133b1565b5090565b60405180608001604052806004905b60608152602001906001900390816133dc5790505090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61345b82613412565b810181811067ffffffffffffffff8211171561347a57613479613423565b5b80604052505050565b600061348d6133f4565b90506134998282613452565b919050565b600067ffffffffffffffff8211156134b9576134b8613423565b5b6134c282613412565b9050602081019050919050565b82818337600083830152505050565b60006134f16134ec8461349e565b613483565b90508281526020810184848401111561350d5761350c61340d565b5b6135188482856134cf565b509392505050565b600082601f83011261353557613534613408565b5b81356135458482602086016134de565b91505092915050565b600060208284031215613564576135636133fe565b5b600082013567ffffffffffffffff81111561358257613581613403565b5b61358e84828501613520565b91505092915050565b600060029050919050565b600081905092915050565b6000819050919050565b600081519050919050565b600082825260208201905092915050565b60005b838110156135f15780820151818401526020810190506135d6565b60008484015250505050565b6000613608826135b7565b61361281856135c2565b93506136228185602086016135d3565b61362b81613412565b840191505092915050565b600061364283836135fd565b905092915050565b6000602082019050919050565b600061366282613597565b61366c81856135a2565b93508360208202850161367e856135ad565b8060005b858110156136ba578484038952815161369b8582613636565b94506136a68361364a565b925060208a01995050600181019050613682565b50829750879550505050505092915050565b600060208201905081810360008301526136e68184613657565b905092915050565b6000819050919050565b613701816136ee565b82525050565b600060208201905061371c60008301846136f8565b92915050565b61372b816136ee565b811461373657600080fd5b50565b60008135905061374881613722565b92915050565b60008060408385031215613765576137646133fe565b5b600061377385828601613739565b925050602083013567ffffffffffffffff81111561379457613793613403565b5b6137a085828601613520565b9150509250929050565b6000602082840312156137c0576137bf6133fe565b5b60006137ce84828501613739565b91505092915050565b600082825260208201905092915050565b60006137f3826135b7565b6137fd81856137d7565b935061380d8185602086016135d3565b61381681613412565b840191505092915050565b6000602082019050818103600083015261383b81846137e8565b905092915050565b6000806040838503121561385a576138596133fe565b5b600061386885828601613739565b925050602061387985828601613739565b9150509250929050565b600067ffffffffffffffff82111561389e5761389d613423565b5b602082029050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006138d9826138ae565b9050919050565b6138e9816138ce565b81146138f457600080fd5b50565b600081359050613906816138e0565b92915050565b600061391f61391a84613883565b613483565b90508060208402830185811115613939576139386138a9565b5b835b81811015613962578061394e88826138f7565b84526020840193505060208101905061393b565b5050509392505050565b600082601f83011261398157613980613408565b5b600261398e84828561390c565b91505092915050565b6000604082840312156139ad576139ac6133fe565b5b60006139bb8482850161396c565b91505092915050565b6000806000606084860312156139dd576139dc6133fe565b5b60006139eb86828701613739565b935050602084013567ffffffffffffffff811115613a0c57613a0b613403565b5b613a1886828701613520565b925050604084013567ffffffffffffffff811115613a3957613a38613403565b5b613a4586828701613520565b9150509250925092565b613a58816138ce565b82525050565b6000602082019050613a736000830184613a4f565b92915050565b600080600060608486031215613a9257613a916133fe565b5b6000613aa086828701613739565b9350506020613ab186828701613739565b9250506040613ac2868287016138f7565b9150509250925092565b600060208284031215613ae257613ae16133fe565b5b6000613af0848285016138f7565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b33826136ee565b9150613b3e836136ee565b9250828203905081811115613b5657613b55613af9565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613b96826136ee565b9150613ba1836136ee565b9250828201905080821115613bb957613bb8613af9565b5b92915050565b6000613bca826136ee565b915060008203613bdd57613bdc613af9565b5b600182039050919050565b6000613bf3826136ee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c2557613c24613af9565b5b600182019050919050565b600081905092915050565b6000613c46826135b7565b613c508185613c30565b9350613c608185602086016135d3565b80840191505092915050565b6000613c788284613c3b565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613cbd826136ee565b9150613cc8836136ee565b925082613cd857613cd7613c83565b5b828204905092915050565b7f3c7265637420783d220000000000000000000000000000000000000000000000815250565b7f2220793d22000000000000000000000000000000000000000000000000000000815250565b7f222077696474683d220000000000000000000000000000000000000000000000815250565b7f22206865696768743d2200000000000000000000000000000000000000000000815250565b7f222f3e0a00000000000000000000000000000000000000000000000000000000815250565b6000613dac82613ce3565b600982019150613dbc8287613c3b565b9150613dc782613d09565b600582019150613dd78286613c3b565b9150613de282613d2f565b600982019150613df28285613c3b565b9150613dfd82613d55565b600a82019150613e0d8284613c3b565b9150613e1882613d7b565b60048201915081905095945050505050565b7f3000000000000000000000000000000000000000000000000000000000000000815250565b7f2e00000000000000000000000000000000000000000000000000000000000000815250565b6000613e8182613e2a565b600182019150613e9082613e50565b600182019150613ea08284613c3b565b915081905092915050565b6000613eb78285613c3b565b9150613ec282613e50565b600182019150613ed28284613c3b565b91508190509392505050565b6000613eea8285613c3b565b9150613ef68284613c3b565b91508190509392505050565b7f3c636972636c652063783d2232303030222063793d22323030302220723d2200815250565b6000613f3382613f02565b601f82019150613f438284613c3b565b9150613f4e82613d7b565b60048201915081905092915050565b600080fd5b600080fd5b600060ff82169050919050565b613f7d81613f67565b8114613f8857600080fd5b50565b600081519050613f9a81613f74565b92915050565b600067ffffffffffffffff82169050919050565b613fbd81613fa0565b8114613fc857600080fd5b50565b600081519050613fda81613fb4565b92915050565b600081519050613fef816138e0565b92915050565b600060a0828403121561400b5761400a613f5d565b5b61401560a0613483565b9050600061402584828501613f8b565b600083015250602061403984828501613f8b565b602083015250604061404d84828501613fcb565b604083015250606061406184828501613fcb565b606083015250608061407584828501613fe0565b60808301525092915050565b600060a08284031215614097576140966133fe565b5b60006140a584828501613ff5565b91505092915050565b60008115159050919050565b6140c3816140ae565b81146140ce57600080fd5b50565b6000815190506140e0816140ba565b92915050565b600061ffff82169050919050565b6140fd816140e6565b811461410857600080fd5b50565b60008151905061411a816140f4565b92915050565b60007fffffff000000000000000000000000000000000000000000000000000000000082169050919050565b61415581614120565b811461416057600080fd5b50565b6000815190506141728161414c565b92915050565b600061418b6141868461349e565b613483565b9050828152602081018484840111156141a7576141a661340d565b5b6141b28482856135d3565b509392505050565b600082601f8301126141cf576141ce613408565b5b81516141df848260208601614178565b91505092915050565b600061010082840312156141ff576141fe613f5d565b5b61420a610100613483565b9050600061421a84828501613f8b565b600083015250602061422e84828501613f8b565b602083015250604061424284828501613f8b565b604083015250606061425684828501613f8b565b606083015250608061426a848285016140d1565b60808301525060a061427e8482850161410b565b60a08301525060c061429284828501614163565b60c08301525060e082015167ffffffffffffffff8111156142b6576142b5613f62565b5b6142c2848285016141ba565b60e08301525092915050565b6000602082840312156142e4576142e36133fe565b5b600082015167ffffffffffffffff81111561430257614301613403565b5b61430e848285016141e8565b91505092915050565b7f7b226e616d65223a220000000000000000000000000000000000000000000000815250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061438457607f821691505b6020821081036143975761439661433d565b5b50919050565b60008190508160005260206000209050919050565b600081546143bf8161436c565b6143c98186613c30565b945060018216600081146143e457600181146143f95761442c565b60ff198316865281151582028601935061442c565b6144028561439d565b60005b8381101561442457815481890152600182019150602081019050614405565b838801955050505b50505092915050565b7f2023000000000000000000000000000000000000000000000000000000000000815250565b7f222c226465736372697074696f6e223a22000000000000000000000000000000815250565b7f222c000000000000000000000000000000000000000000000000000000000000815250565b7f2261747472696275746573223a5b000000000000000000000000000000000000815250565b7f5d2c22696d616765223a22646174613a696d6167652f7376672b786d6c3b626160008201527f736536342c000000000000000000000000000000000000000000000000000000602082015250565b6000614529602583613c30565b9150614534826144cd565b602582019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000815250565b600061457082614317565b60098201915061458082896143b2565b915061458b82614435565b60028201915061459b8288613c3b565b91506145a68261445b565b6011820191506145b68287613c3b565b91506145c182614481565b6002820191506145d18286613c3b565b91506145dc826144a7565b600e820191506145ec8285613c3b565b91506145f78261451c565b91506146038284613c3b565b915061460e8261453f565b600282019150819050979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815250565b600061465382614622565b601d820191506146638284613c3b565b915081905092915050565b60008082015250565b6000614684600183613c30565b915061468f8261466e565b600182019050919050565b600081519050919050565b600081905092915050565b60006146bb8261469a565b6146c581856146a5565b93506146d58185602086016135d3565b80840191505092915050565b60006146ec82614677565b91506146f882846146b0565b915081905092915050565b7f637265617465207820696e6e6f76617465207820696d70616374207820646f2060008201527f676f6f6400000000000000000000000000000000000000000000000000000000602082015250565b600061475f602483613c30565b915061476a82614703565b602482019050919050565b60006147818284613c3b565b915061478c82614752565b915081905092915050565b60006147a282613f67565b91506147ad83613f67565b9250828201905060ff8111156147c6576147c5613af9565b5b92915050565b7f7b2274726169745f74797065223a202247656e65726174696f6e7320556e6c6f60008201527f636b6564222c202276616c7565223a0000000000000000000000000000000000602082015250565b6000614828602f83613c30565b9150614833826147cc565b602f82019050919050565b7f7d2c7b2274726169745f74797065223a20224163746976652047656e6572617460008201527f696f6e222c202276616c7565223a000000000000000000000000000000000000602082015250565b600061489a602e83613c30565b91506148a58261483e565b602e82019050919050565b7f7d2c7b2274726169745f74797065223a202254696d6573205472616e7366657260008201527f726564222c202276616c7565223a220000000000000000000000000000000000602082015250565b600061490c602f83613c30565b9150614917826148b0565b602f82019050919050565b7f227d2c7b2274726169745f74797065223a20224f776e65642053696e6365222c60008201527f202276616c7565223a2200000000000000000000000000000000000000000000602082015250565b600061497e602a83613c30565b915061498982614922565b602a82019050919050565b600061499f8261481b565b91506149ab8287613c3b565b91506149b68261488d565b91506149c28286613c3b565b91506149cd826148ff565b91506149d98285613c3b565b91506149e482614971565b91506149f08284613c3b565b915081905095945050505050565b7f227d2c7b2274726169745f74797065223a2022436f6c6f722047726f7570222c60008201527f202276616c7565223a2200000000000000000000000000000000000000000000602082015250565b6000614a5a602a83613c30565b9150614a65826149fe565b602a82019050919050565b7f227d2c7b2274726169745f74797065223a202250616c6574746520496e64657860008201527f222c202276616c7565223a220000000000000000000000000000000000000000602082015250565b6000614acc602c83613c30565b9150614ad782614a70565b602c82019050919050565b7f7b2274726169745f74797065223a2022536861706520436f756e74222c20227660008201527f616c7565223a2200000000000000000000000000000000000000000000000000602082015250565b6000614b3e602783613c30565b9150614b4982614ae2565b602782019050919050565b7f227d2c7b2274726169745f74797065223a2022436972636c6520436f756e742260008201527f2c202276616c7565223a22000000000000000000000000000000000000000000602082015250565b6000614bb0602b83613c30565b9150614bbb82614b54565b602b82019050919050565b7f227d2c7b2274726169745f74797065223a202253717561726520436f756e742260008201527f2c202276616c7565223a22000000000000000000000000000000000000000000602082015250565b6000614c22602b83613c30565b9150614c2d82614bc6565b602b82019050919050565b7f227d2c7b2274726169745f74797065223a20224e6f6e6520436f756e74222c2060008201527f2276616c7565223a220000000000000000000000000000000000000000000000602082015250565b6000614c94602983613c30565b9150614c9f82614c38565b602982019050919050565b6000614cb6828a613c3b565b9150614cc182614a4d565b9150614ccd82896143b2565b9150614cd882614abf565b9150614ce48288613c3b565b9150614cef82614b31565b9150614cfb8287613c3b565b9150614d0682614ba3565b9150614d128286613c3b565b9150614d1d82614c15565b9150614d298285613c3b565b9150614d3482614c87565b9150614d408284613c3b565b915081905098975050505050505050565b7f227d2c7b2274726169745f74797065223a2022436f6d706c6578697479204c6560008201527f76656c222c202276616c7565223a220000000000000000000000000000000000602082015250565b6000614dad602f83613c30565b9150614db882614d51565b602f82019050919050565b7f227d2c7b2274726169745f74797065223a2022476c6974636879222c2022766160008201527f6c7565223a220000000000000000000000000000000000000000000000000000602082015250565b6000614e1f602683613c30565b9150614e2a82614dc3565b602682019050919050565b7f227d2c7b2274726169745f74797065223a20225370656369616c20547261697460008201527f222c202276616c7565223a220000000000000000000000000000000000000000602082015250565b6000614e91602c83613c30565b9150614e9c82614e35565b602c82019050919050565b6000614eb38287613c3b565b9150614ebe82614da0565b9150614eca8286613c3b565b9150614ed582614e12565b9150614ee18285613c3b565b9150614eec82614e84565b9150614ef88284613c3b565b915081905095945050505050565b6000614f11826136ee565b9150614f1c836136ee565b9250828202614f2a816136ee565b91508282048414831517614f4157614f40613af9565b5b5092915050565b7f6300000000000000000000000000000000000000000000000000000000000000600082015250565b6000614f7e600183613c30565b9150614f8982614f48565b600182019050919050565b600063ffffffff82169050919050565b60008160e01b9050919050565b6000614fbc82614fa4565b9050919050565b614fd4614fcf82614f94565b614fb1565b82525050565b7f80600e6000396000f30000000000000000000000000000000000000000000000600082015250565b6000615010600983613c30565b915061501b82614fda565b600982019050919050565b600061503182614f71565b915061503d8285614fc3565b60048201915061504c82615003565b915061505882846146b0565b91508190509392505050565b600060608201905061507960008301866136f8565b61508660208301856136f8565b61509360408301846136f8565b949350505050565b7f3c672069643d2261727422000000000000000000000000000000000000000000815250565b7f3c7265637420783d22302220793d2230222077696474683d223130302522206860008201527f65696768743d2231303025222066696c6c3d2200000000000000000000000000602082015250565b600061511d603383613c30565b9150615128826150c1565b603382019050919050565b7f222f3e0a0a3c672069643d227368617065732200000000000000000000000000815250565b60006151658287613c3b565b91506151708261509b565b600b820191506151808286613c3b565b915061518b82615110565b91506151978285613c3b565b91506151a282615133565b6013820191506151b28284613c3b565b915081905095945050505050565b7f3c672069643d22736861706547726f75705f0000000000000000000000000000815250565b7f222066696c6c3d22000000000000000000000000000000000000000000000000815250565b7f22207374726f6b653d2200000000000000000000000000000000000000000000815250565b7f22207374726f6b652d77696474683d223530223e0a0000000000000000000000815250565b7f3c2f673e0a0a0000000000000000000000000000000000000000000000000000815250565b600061528a8288613c3b565b9150615295826151c0565b6012820191506152a58287613c3b565b91506152b0826151e6565b6008820191506152c08286613c3b565b91506152cb8261520c565b600a820191506152db8285613c3b565b91506152e682615232565b6015820191506152f68284613c3b565b915061530182615258565b6006820191508190509695505050505050565b600061531f826151e6565b60088201915061532f8285613c3b565b915061533a8261520c565b600a8201915061534a8284613c3b565b91508190509392505050565b7f2c20000000000000000000000000000000000000000000000000000000000000815250565b60006153888285613c3b565b915061539382615356565b6002820191506153a38284613c3b565b91508190509392505050565b7f22207374726f6b652d77696474683d22313022207472616e73666f726d3d227460008201527f72616e736c617465280000000000000000000000000000000000000000000000602082015250565b600061540b602983613c30565b9150615416826153af565b602982019050919050565b600061542d8287613c3b565b9150615438826151c0565b6012820191506154488286613c3b565b91506154548285613c3b565b915061545f826153fe565b915061546b8284613c3b565b915081905095945050505050565b7f29207363616c6528000000000000000000000000000000000000000000000000815250565b7f2922203e0a000000000000000000000000000000000000000000000000000000815250565b60006154d18286613c3b565b91506154dc82615479565b6008820191506154ec8285613c3b565b91506154f78261549f565b6005820191506155078284613c3b565b915061551282615258565b600682019150819050949350505050565b7f0a0a3c2f7376673e000000000000000000000000000000000000000000000000815250565b60006155558288613c3b565b91506155618287613c3b565b915061556d8286613c3b565b91506155798285613c3b565b91506155858284613c3b565b915061559082615523565b6008820191508190509695505050505050565b7f697473206120676f6f6420646179000000000000000000000000000000000000815250565b7f746f2068617665206120676f6f64206461790000000000000000000000000000815250565b60006155fa826155a3565b600e8201915061560a8284613c3b565b9150615615826155c9565b60128201915081905092915050565b600061563082856143b2565b915061563b82614435565b60028201915061564b8284613c3b565b91508190509392505050565b7f7c00000000000000000000000000000000000000000000000000000000000000815250565b6000615689828c613c3b565b915061569482615657565b6001820191506156a4828b613c3b565b91506156af82615657565b6001820191506156bf828a613c3b565b91506156ca82615657565b6001820191506156da8289613c3b565b91506156e582615657565b6001820191506156f58288613c3b565b915061570082615657565b6001820191506157108287613c3b565b915061571b82615657565b60018201915061572b8286613c3b565b915061573682615657565b60018201915061574682856143b2565b915061575182615657565b6001820191506157618284613c3b565b915061576c82615657565b6001820191508190509a9950505050505050505050565b600061578f828f613c3b565b915061579b828e613c3b565b91506157a682615657565b6001820191506157b6828d613c3b565b91506157c182615657565b6001820191506157d1828c613c3b565b91506157dc82615657565b6001820191506157ec828b613c3b565b91506157f782615657565b600182019150615807828a613c3b565b915061581282615657565b6001820191506158228289613c3b565b915061582d82615657565b60018201915061583d8288613c3b565b915061584882615657565b6001820191506158588287613c3b565b915061586382615657565b6001820191506158738286613c3b565b915061587e82615657565b60018201915061588e8285613c3b565b915061589982615657565b6001820191506158a98284613c3b565b91508190509d9c50505050505050505050505050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006158f56020836137d7565b9150615900826158bf565b602082019050919050565b60006020820190508181036000830152615924816158e8565b905091905056fe77686f207361696420636972636c657320616e6420737175617265732063616e742067657420616c6f6e673f2077656c636f6d6520746f2067656e2d312077686572652074686573652074776f2073686170657320636f6d6520746f67657468657220696e2070657266656374206861726d6f6e792e20796f75206b6e6f7720746865206472696c6c2e2e2e20656e6a6f7920746865206172742c206578706c6f72652074686520636f64652c20616e6420646f6e7420666f7267657420746f20636c69636b2061726f756e6420666f7220736f6d652065787472612066756e2120f09f98894142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220ceae77a067acd3d8d80d55458e0906bf0b913bac991f18a943e1f8e1e658362864736f6c63430008130033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.