Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 7 from a total of 7 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 16823888 | 602 days ago | IN | 0 ETH | 0.0005694 | ||||
Mint | 16823880 | 602 days ago | IN | 0.03 ETH | 0.00142348 | ||||
Withdraw | 16785389 | 607 days ago | IN | 0 ETH | 0.00164161 | ||||
Mint | 16784726 | 607 days ago | IN | 0.03 ETH | 0.00273882 | ||||
Mint | 16778774 | 608 days ago | IN | 0.015 ETH | 0.00252815 | ||||
Mint4Owner | 16774780 | 609 days ago | IN | 0 ETH | 0.00168565 | ||||
0x60806040 | 16774767 | 609 days ago | IN | 0 ETH | 0.09610885 |
Loading...
Loading
Contract Name:
UltimateCurrency
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.18; import "./ERC721A.sol"; import "./Ownable.sol"; import "./Utilities.sol"; import "./Segments.sol"; import "./IERC4906.sol"; contract UltimateCurrency is ERC721A, Ownable, IERC4906 { event CountdownExtended(uint _finalBlock); uint public price = 3000000000000000; //.003 eth bool public isCombinable = false; uint public finalMintingBlock; SVGPrefix public _prefix; mapping(uint => uint) newValues; mapping(uint => uint) baseColors; mapping(address => uint) freeMints; constructor(address _address) ERC721A("Ultimate Currency", "TIME") { _prefix = SVGPrefix(_address); } function mint(uint quantity) public payable { require(msg.value >= quantity * price, "not enough eth"); handleMint(msg.sender, quantity); } function freeMint(uint quantity) public { require(quantity <= freeMints[msg.sender], "not enough free mints"); handleMint(msg.sender, quantity); freeMints[msg.sender] -= quantity; } function handleMint(address recipient, uint quantity) internal { uint supply = _totalMinted(); if (supply >= 5000) { require(utils.secondsRemaining(finalMintingBlock) > 0, "mint is closed"); if (supply < 8000 && (supply + quantity) >= 8000) { finalMintingBlock = block.timestamp + 24 hours; emit CountdownExtended(finalMintingBlock); } } else if (supply + quantity >= 5000) { finalMintingBlock = block.timestamp + 24 hours; emit CountdownExtended(finalMintingBlock); } _mint(recipient, quantity); } function combine(uint[] memory tokens) public { require(isCombinable, "combining not active"); uint256 sum; for (uint i = 0; i < tokens.length; i++) { require(ownerOf(tokens[i]) == msg.sender, "must own all tokens"); sum = sum + getValue(tokens[i]); } if (sum > 315359999999) { revert("sum must be 9999:52:0:23:59:59 or less"); } for (uint i = 1; i < tokens.length; i++) { _burn(tokens[i]); newValues[tokens[i]] = 0; baseColors[tokens[i]] = 0; emit MetadataUpdate(tokens[i]); } // Why was 6 afraid of 7? Because 7 8 9! newValues[tokens[0]] = sum; baseColors[tokens[0]] = utils.random(tokens[0], 1, 4); emit MetadataUpdate(tokens[0]); } function getValue(uint256 tokenId) public view returns (uint) { if (!_exists(tokenId)) { return 0; } else if (newValues[tokenId] > 0) { return newValues[tokenId]; } else { return utils.initValue(tokenId); } } function tokenURI(uint256 tokenId) public view virtual override(ERC721A, IERC721A) returns (string memory) { bool burned; uint256 value; if (newValues[tokenId] > 0) { value = newValues[tokenId]; burned = false; } else if (newValues[tokenId] == 0 && !_exists(tokenId)) { value = 0; burned = true; } else { if(tokenId <= 3) { //value = (tokenId < 2? 3153600000: 315360000); if(tokenId == 1) { value = 31536000000; } else if(tokenId == 2) { value = 3153600000; } else { value = 315360000; } } else { value = utils.initValue(tokenId); } burned = false; } return segments.getMetadata(tokenId, value, baseColors[tokenId], burned, _prefix.prefixTxt()); } function _startTokenId() internal view virtual override returns (uint256) { return 1; } function getMinutesRemaining() public view returns (uint) { return utils.minutesRemaining(finalMintingBlock); } function mintCount() public view returns (uint) { return _totalMinted(); } function toggleCombinable() public onlyOwner { isCombinable = !isCombinable; } function withdraw() external onlyOwner { require(payable(msg.sender).send(address(this).balance)); } function freeMintBalance(address addy) public view returns (uint) { return freeMints[addy]; } function addFreeMints(address[] calldata addresses, uint quantity) public onlyOwner { for (uint i = 0; i < addresses.length; i++) { freeMints[addresses[i]] = quantity; } } function mint4Owner(uint quantity) public onlyOwner { handleMint(msg.sender, quantity); } } contract SVGPrefix { constructor() { } function prefixTxt() external pure returns (bytes memory) { return '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 600 600"><defs><linearGradient id="_grad1" x1="124.8" y1="228.27" x2="124.8" y2="356.23" gradientTransform="matrix(1, 0, 0, 1, 0, 0)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffca3f"/><stop offset=".1" stop-color="#ca7c22"/><stop offset=".19" stop-color="#fddb7a"/><stop offset=".42" stop-color="#ffad45"/><stop offset=".55" stop-color="#a95f0d"/><stop offset=".66" stop-color="#ffad45"/><stop offset=".79" stop-color="#ffff9b"/><stop offset=".87" stop-color="#ffed7b"/><stop offset="1" stop-color="#ffca3f"/></linearGradient><linearGradient id="_grad2" y1="197.25" y2="357.47" xlink:href="#_grad1"/></defs><rect width="600" height="600" fill="white"/><path d="M540,431.58c0,10.18-8.22,18.42-18.36,18.42H78.36c-10.14,0-18.36-8.24-18.36-18.42V168.42c0-10.18,8.22-18.42,18.36-18.42h443.28c10.14,0,18.36,8.24,18.36,18.42V431.58Z" style="fill-rule:evenodd;"/><path d="M106.35,178.63c-.23-.8-.53-1.62-.8-2.07-.4-.67-.65-.85-2.02-.85h-2.5v12.17c0,1.95,.2,2.22,2.57,2.37v.7h-7.27v-.7c2.32-.15,2.52-.4,2.52-2.37v-12.17h-2.27c-1.37,0-1.77,.15-2.2,.9-.3,.5-.5,1.1-.82,2.02h-.75c.15-1.52,.3-3.1,.38-4.5h.57c.38,.6,.65,.57,1.35,.57h9.9c.7,0,.9-.1,1.27-.57h.6c0,1.17,.1,2.97,.22,4.42l-.75,.08Z" fill="white"/><path d="M107.88,190.95v-.7c1.57-.15,1.75-.27,1.75-1.97v-5.15c0-1.55-.08-1.65-1.58-1.9v-.6c1.3-.23,2.47-.55,3.55-1v8.65c0,1.7,.18,1.82,1.8,1.97v.7h-5.52Zm2.6-13.77c-.7,0-1.33-.62-1.33-1.32,0-.8,.62-1.38,1.35-1.38s1.28,.58,1.28,1.38c0,.7-.58,1.32-1.3,1.32Z" fill="white"/><path d="M128.4,190.95v-.7c1.47-.15,1.65-.25,1.65-2v-4.17c0-1.77-.6-2.9-2.15-2.9-.95,0-1.83,.52-2.77,1.3,.02,.3,.08,.6,.08,1.08v4.85c0,1.57,.22,1.7,1.6,1.85v.7h-5.35v-.7c1.55-.15,1.78-.25,1.78-1.9v-4.3c0-1.85-.58-2.87-2.1-2.87-1,0-1.97,.67-2.75,1.3v5.87c0,1.65,.18,1.75,1.6,1.9v.7h-5.37v-.7c1.65-.15,1.8-.25,1.8-1.9v-5.17c0-1.6-.1-1.7-1.5-1.95v-.62c1.17-.17,2.35-.5,3.47-1v2.02c.53-.4,1.05-.82,1.85-1.3,.62-.4,1.17-.65,1.97-.65,1.2,0,2.22,.75,2.72,2.05,.7-.55,1.35-.98,1.97-1.4,.55-.35,1.25-.65,1.97-.65,1.95,0,3.15,1.4,3.15,3.85v4.82c0,1.67,.15,1.75,1.57,1.9v.7h-5.2Z" fill="white"/><path d="M144.17,188.83c-1.6,2-3.35,2.42-4.15,2.42-3.05,0-4.9-2.5-4.9-5.37,0-1.7,.6-3.27,1.62-4.37,1.05-1.17,2.42-1.82,3.72-1.82,2.17,0,3.82,1.87,3.82,3.87-.02,.5-.1,.72-.5,.82-.5,.1-3.7,.32-6.67,.42-.08,3.35,1.97,4.72,3.75,4.72,1.02,0,1.97-.42,2.9-1.27l.4,.57Zm-4.3-8.2c-1.15,0-2.27,1.07-2.62,3.1,1.4,0,2.8,0,4.27-.08,.45,0,.6-.12,.6-.5,.02-1.32-.85-2.52-2.25-2.52Z" fill="white"/><path d="M166.92,186.96c-.35,1.2-1,3-1.38,3.77-.72,.15-2.67,.6-4.57,.6-5.97,0-9.02-3.97-9.02-8.35,0-5.1,3.87-8.62,9.47-8.62,2.15,0,3.9,.45,4.72,.58,.1,1.12,.27,2.62,.47,3.87l-.78,.17c-.5-1.67-1.1-2.7-2.37-3.22-.65-.3-1.67-.48-2.62-.48-4.12,0-6.3,3.05-6.3,7.17,0,4.82,2.5,7.92,6.55,7.92,2.55,0,3.8-1.17,5.07-3.67l.75,.25Z" fill="white"/><path d="M177.05,191.25c-.38,0-.92-.2-1.17-.47-.32-.33-.47-.67-.6-1.12-1,.67-2.22,1.6-3,1.6-1.77,0-3.05-1.47-3.05-3.07,0-1.22,.67-2.02,2.05-2.5,1.52-.52,3.4-1.17,3.95-1.62v-.5c0-1.77-.9-2.8-2.2-2.8-.58,0-.92,.28-1.17,.58-.28,.35-.45,.9-.67,1.62-.12,.4-.35,.57-.73,.57-.47,0-1.1-.5-1.1-1.1,0-.35,.33-.65,.83-1,.72-.52,2.17-1.45,3.6-1.75,.75,0,1.53,.23,2.1,.68,.88,.75,1.28,1.6,1.28,2.9v4.82c0,1.15,.42,1.5,.87,1.5,.3,0,.62-.12,.9-.27l.25,.7-2.12,1.25Zm-1.82-6.32c-.55,.27-1.75,.8-2.32,1.05-.95,.42-1.53,.9-1.53,1.82,0,1.32,1,1.92,1.8,1.92,.65,0,1.55-.4,2.05-.9v-3.9Z" fill="white"/><path d="M185.97,190.95h-5.75v-.7c1.57-.15,1.72-.27,1.72-1.9v-5.2c0-1.65-.1-1.72-1.55-1.9v-.62c1.22-.2,2.35-.5,3.52-1.02v2.75c.88-1.3,1.92-2.67,3.17-2.67,.92,0,1.45,.58,1.45,1.2,0,.58-.4,1.12-.85,1.38-.25,.15-.45,.12-.65-.05-.38-.37-.67-.62-1.12-.62-.53,0-1.45,.77-2,2.05v4.7c0,1.65,.12,1.77,2.05,1.92v.7Z" fill="white"/><path d="M201.47,190.33c-.53,.1-2.4,.4-3.87,.92v-1.62c-.45,.27-1.1,.62-1.55,.9-1,.57-1.67,.72-1.97,.72-2,0-4.65-2-4.65-5.5s3.05-6.07,6.47-6.07c.35,0,1.17,.05,1.7,.27v-3.67c0-1.6-.17-1.65-1.95-1.8v-.65c1.25-.18,3-.52,3.92-.85v15.07c0,1.3,.17,1.47,1.1,1.52l.8,.05v.7Zm-3.87-8.4c-.58-.87-1.65-1.27-2.62-1.27-1.2,0-3.32,.8-3.32,4.4,0,3.02,1.88,4.62,3.47,4.65,.9,0,1.87-.45,2.47-.9v-6.87Z" fill="white"/><path d="M507.39,267.29c-.11,7.26-2.86,13.31-8.37,18.08-.75,.65-1.79,.57-2.42-.16-.59-.69-.52-1.72,.22-2.36,2.01-1.73,3.68-3.74,4.91-6.1,3.87-7.38,2.92-16.21-2.46-22.57-.74-.88-1.6-1.66-2.44-2.45-.73-.68-.84-1.69-.22-2.42,.62-.71,1.66-.77,2.42-.12,4.63,4,7.37,9.02,8.21,15.08,.07,.47,.12,.95,.14,1.43,.02,.52,0,1.05,0,1.57Z" fill="white"/><path d="M499.74,267.92c-.12,4.81-2.18,9.33-6.29,12.89-.81,.7-1.86,.62-2.53-.16-.64-.74-.55-1.81,.24-2.5,2.15-1.86,3.72-4.11,4.47-6.85,1.51-5.59,.13-10.42-4-14.47-.15-.15-.32-.29-.48-.43-.75-.67-.85-1.75-.23-2.48,.66-.77,1.74-.85,2.53-.18,1.87,1.59,3.35,3.47,4.44,5.67,1.23,2.49,1.84,5.13,1.85,8.51Z" fill="white"/><path d="M486.91,275.48c-.7,0-1.32-.42-1.58-1.08-.26-.66-.09-1.39,.47-1.88,.82-.72,1.48-1.56,1.91-2.57,1.17-2.76,.44-5.81-1.88-7.87-.55-.49-.75-1.1-.54-1.8,.21-.68,.69-1.07,1.39-1.17,.49-.07,.93,.07,1.31,.39,4.25,3.52,4.85,10,1.31,14.24-.4,.48-.85,.93-1.34,1.33-.28,.23-.68,.34-1.02,.5l-.04-.09Z" fill="white"/><path d="M101.94,241.92h45.72c5.04,0,9.14,4.1,9.14,9.14v32.44c0,5.05-4.1,9.14-9.14,9.14h-45.71c-5.05,0-9.14-4.1-9.14-9.14v-32.43c0-5.05,4.1-9.14,9.14-9.14Z" style="fill:url(#_grad1);"/><path d="M156.8,257.9v-1.17h-11.72v-14.81h-1.17v14.81h-9.5c-1.25-3.97-4.75-6.9-9.02-7.3v-7.51h-1.17v7.43c-4.63,.08-8.5,3.17-9.82,7.38h-8.63v-14.81h-1.17v14.81h-11.8v1.17h11.8v16.59h-11.8v1.17h11.8v16.97h1.17v-16.97h8.38c1.06,4.62,5.15,8.08,10.06,8.17v8.8h1.17v-8.88c4.56-.43,8.27-3.73,9.27-8.09h9.25v16.97h1.17v-16.97h11.72v-1.17h-6.99v-16.59h6.99Zm-42.82,16.59h-8.21v-16.59h8.29c-.12,.64-.2,1.29-.2,1.96,0,2.46,.87,4.83,2.47,6.73-1.6,1.91-2.47,4.27-2.47,6.73,0,.4,.08,.78,.12,1.17Zm10.41,8.19c-5.16,0-9.36-4.2-9.36-9.36,0-2.33,.89-4.58,2.51-6.33l.36-.4-.36-.4c-1.62-1.75-2.51-4-2.51-6.33,0-5.16,4.2-9.36,9.36-9.36s9.36,4.2,9.36,9.36c0,2.34-.89,4.58-2.51,6.33l-.37,.4,.37,.4c1.62,1.75,2.51,4,2.51,6.33,0,5.16-4.2,9.36-9.36,9.36Zm24.24-8.19h-13.82c.04-.39,.12-.77,.12-1.17,0-2.46-.87-4.82-2.47-6.73,1.6-1.9,2.47-4.27,2.47-6.73,0-.67-.08-1.32-.2-1.96h13.9v16.59Z" style="fill:url(#_grad2); mix-blend-mode:multiply;"/><path id="p01" d="M110.21,332.41l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p02" d="M92.8,336.93l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p03" d="M110.86,336.93l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p04" d="M110.21,350.47l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p05" d="M92.8,354.98l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p06" d="M110.86,354.98l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p07" d="M110.21,368.52l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p11" d="M136.13,332.41l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p12" d="M118.73,336.93l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p13" d="M136.78,336.93l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p14" d="M136.13,350.47l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p15" d="M118.73,354.98l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p16" d="M136.78,354.98l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p17" d="M136.13,368.52l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/> <path id="p21" d="M162.06,332.41l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p22" d="M144.65,336.93l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p23" d="M162.7,336.93l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p24" d="M162.06,350.47l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p25" d="M144.65,354.98l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p26" d="M162.7,354.98l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p27" d="M162.06,368.52l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p31" d="M187.98,332.41l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p32" d="M170.57,336.93l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p33" d="M188.62,336.93l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p34" d="M187.98,350.47l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p35" d="M170.57,354.98l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p36" d="M188.62,354.98l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p37" d="M187.98,368.52l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p41" d="M230.16,332.41l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p42" d="M212.75,336.93l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p43" d="M230.81,336.93l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p44" d="M230.16,350.47l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p45" d="M212.75,354.98l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p46" d="M230.81,354.98l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p47" d="M230.16,368.52l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p51" d="M256.08,332.41l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p52" d="M238.67,336.93l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p53" d="M256.73,336.93l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p54" d="M256.08,350.47l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p55" d="M238.67,354.98l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p56" d="M256.73,354.98l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p57" d="M256.08,368.52l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p61" d="M298.3,332.41l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p62" d="M280.89,336.93l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p63" d="M298.94,336.93l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p64" d="M298.3,350.47l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p65" d="M280.89,354.98l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p66" d="M298.94,354.98l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p67" d="M298.3,368.52l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p71" d="M340.49,332.41l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p72" d="M323.08,336.93l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p73" d="M341.13,336.93l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p74" d="M340.49,350.47l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p75" d="M323.08,354.98l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p76" d="M341.13,354.98l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p77" d="M340.49,368.52l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p81" d="M366.41,332.41l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p82" d="M349,336.93l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p83" d="M367.05,336.93l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p84" d="M366.41,350.47l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p85" d="M349,354.98l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p86" d="M367.05,354.98l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p87" d="M366.41,368.52l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p91" d="M408.62,332.41l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p92" d="M391.22,336.93l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p93" d="M409.27,336.93l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p94" d="M408.62,350.47l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p95" d="M391.22,354.98l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p96" d="M409.27,354.98l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p97" d="M408.62,368.52l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p101" d="M434.55,332.41l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p102" d="M417.14,336.93l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p103" d="M435.19,336.93l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p104" d="M434.55,350.47l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p105" d="M417.14,354.98l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p106" d="M435.19,354.98l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p107" d="M434.55,368.52l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p111" d="M476.76,332.41l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p112" d="M459.35,336.93l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p113" d="M477.41,336.93l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p114" d="M476.76,350.47l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p115" d="M459.35,354.98l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p116" d="M477.41,354.98l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p117" d="M476.76,368.52l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p121" d="M502.68,332.41l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p122" d="M485.27,336.93l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p123" d="M503.33,336.93l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p124" d="M502.68,350.47l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="p125" d="M485.27,354.98l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p126" d="M503.33,354.98l1.93-1.93,1.93,1.93v12.9l-1.93,1.93-1.93-1.93v-12.9Z" fill="white" fill-opacity="0.05"/><path id="p127" d="M502.68,368.52l1.93,1.93-1.93,1.93h-12.9l-1.93-1.93,1.93-1.93h12.9Z" fill="white" fill-opacity="0.05"/><path id="pcolon1" d="M200.49,346.34v-4.35h4.29v4.35h-4.29Zm0,16.47v-4.35h4.29v4.35h-4.29Z" fill="white"/><path id="pcolon2" d="M268.6,346.34v-4.35h4.29v4.35h-4.29Zm0,16.47v-4.35h4.29v4.35h-4.29Z" fill="white"/><path id="pcolon3" d="M310.78,346.34v-4.35h4.29v4.35h-4.29Zm0,16.47v-4.35h4.29v4.35h-4.29Z" fill="white"/><path id="pcolon4" d="M378.92,346.34v-4.35h4.29v4.35h-4.29Zm0,16.47v-4.35h4.29v4.35h-4.29Z" fill="white"/><path id="pcolon5" d="M447.06,346.34v-4.35h4.29v4.35h-4.29Zm0,16.47v-4.35h4.29v4.35h-4.29Z" fill="white"/><style>'; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol) pragma solidity ^0.8.0; /** * @dev Provides a set of functions to operate with Base64 strings. * * _Available since v4.5._ */ library Base64 { /** * @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 // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721A.sol'; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/CHECKS721.sol) pragma solidity ^0.8.0; import "./IERC721A.sol"; /// @title EIP-721 Metadata Update Extension interface IERC4906 is IERC721A { /// @dev This event emits when the metadata of a token is changed. /// Third-party platforms such as NFT marketplaces can listen to /// the event and auto-update the tokens in their apps. event MetadataUpdate(uint256 _tokenId); }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.18; import "./Utilities.sol"; import "./Base64.sol"; library segments { function getBaseColorName(uint index) internal pure returns (string memory) { string[4] memory baseColorNames = ["White", "Red", "Green", "Blue"]; return baseColorNames[index]; } function getMetadata(uint tokenId, uint256 value, uint baseColor, bool burned, bytes memory _svgPrefix) internal pure returns (string memory) { uint[3] memory rgbs = utils.getRgbs(tokenId, baseColor); string memory json; if (burned) { json = string(abi.encodePacked( '{"name": "TIME ', utils.uint2str(tokenId), ' [BURNED]", "description": "Time is the ultimate currency.", "attributes":[{"trait_type": "Burned", "value": "Yes"}], "image": "data:image/svg+xml;base64,', Base64.encode(bytes(renderSvg(value, rgbs, _svgPrefix))), '"}' )); } else { json = string(abi.encodePacked( '{"name": "TIME ', utils.uint2str(tokenId), '", "description": "Time is the ultimate currency.", "attributes":[{"trait_type": "Balance", "max_value": 315359999999, "value": ', utils.uint2str(value), '},{"display_type": "number", "trait_type": "Mint Phase", "value": ', utils.uint2str(utils.getMintPhase(tokenId)), '},{"trait_type": "Burned", "value": "No"},{"trait_type": "Base Color", "value": "', getBaseColorName(baseColor), '"},{"trait_type": "Color", "value": "RGB(', utils.uint2str(rgbs[0]), ",", utils.uint2str(rgbs[1]), ",", utils.uint2str(rgbs[2]), ')"}], "image": "data:image/svg+xml;base64,', Base64.encode(bytes(renderSvg(value, rgbs, _svgPrefix))), '"}' )); } return string(abi.encodePacked( "data:application/json;base64,", Base64.encode(bytes(json)) )); } function getNumberStyle(uint position, uint _value) internal pure returns (string memory) { string memory p = utils.uint2str(position); if (_value == 0) { return string(abi.encodePacked( "#p",p,"1,","#p",p,"2,","#p",p,"3,","#p",p,"5,","#p",p,"6,","#p",p,"7 {fill-opacity:1}" )); } else if (_value == 1) { return string(abi.encodePacked( "#p",p,"3,","#p",p,"6 {fill-opacity:1}" )); } else if (_value == 2) { return string(abi.encodePacked( "#p",p,"1,","#p",p,"3,","#p",p,"4,","#p",p,"5,","#p",p,"7 {fill-opacity:1}" )); } else if (_value == 3) { return string(abi.encodePacked( "#p",p,"1,","#p",p,"3,","#p",p,"4,","#p",p,"6,","#p",p,"7 {fill-opacity:1}" )); } else if (_value == 4) { return string(abi.encodePacked( "#p",p,"2,","#p",p,"3,","#p",p,"4,","#p",p,"6 {fill-opacity:1}" )); } else if (_value == 5) { return string(abi.encodePacked( "#p",p,"1,","#p",p,"2,","#p",p,"4,","#p",p,"6,","#p",p,"7 {fill-opacity:1}" )); } else if (_value == 6) { return string(abi.encodePacked( "#p",p,"1,","#p",p,"2,","#p",p,"4,","#p",p,"5,","#p",p,"6,","#p",p,"7 {fill-opacity:1}" )); } else if (_value == 7) { return string(abi.encodePacked( "#p",p,"1,","#p",p,"3,","#p",p,"6 {fill-opacity:1}" )); } else if (_value == 8) { return string(abi.encodePacked( "#p",p,"1,","#p",p,"2,","#p",p,"3,","#p",p,"4,","#p",p,"5,","#p",p,"6,","#p",p,"7 {fill-opacity:1}" )); } else if (_value == 9) { return string(abi.encodePacked( "#p",p,"1,","#p",p,"2,","#p",p,"3,","#p",p,"4,","#p",p,"6,","#p",p,"7 {fill-opacity:1}" )); } else { return "error"; } } function renderSvg(uint256 value,uint256[3] memory rgbs, bytes memory _svgPrefix) internal pure returns (string memory svg) { svg = string(_svgPrefix); string memory styles = string( abi.encodePacked( "path[id^='p']{fill:rgb(", utils.uint2str(rgbs[0]), ",", utils.uint2str(rgbs[1]), ",", utils.uint2str(rgbs[2]), ")}#bg{fill:#0C0C0C}" ) ); //bytes memory _number = bytes(utils.seconds2str(value)); uint[13] memory _number = utils.seconds2strv2(value); styles = string( abi.encodePacked(styles, getNumberStyle(0, _number[0])) ); styles = string( abi.encodePacked(styles, getNumberStyle(1, _number[1])) ); styles = string( abi.encodePacked(styles, getNumberStyle(2, _number[2])) ); styles = string( abi.encodePacked(styles, getNumberStyle(3, _number[3])) ); styles = string( abi.encodePacked(styles, getNumberStyle(4, _number[4])) ); styles = string( abi.encodePacked(styles, getNumberStyle(5, _number[5])) ); styles = string( abi.encodePacked(styles, getNumberStyle(6, _number[6])) ); styles = string( abi.encodePacked(styles, getNumberStyle(7, _number[7])) ); styles = string( abi.encodePacked(styles, getNumberStyle(8, _number[8])) ); styles = string( abi.encodePacked(styles, getNumberStyle(9, _number[9])) ); styles = string( abi.encodePacked(styles, getNumberStyle(10, _number[10])) ); styles = string( abi.encodePacked(styles, getNumberStyle(11, _number[11])) ); styles = string( abi.encodePacked(styles, getNumberStyle(12, _number[12])) ); return string(abi.encodePacked(svg, styles, "</style></svg>")); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.18; library utils { function uint2str( uint256 _i ) internal pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint256 j = _i; uint256 len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint256 k = len; while (_i != 0) { k = k - 1; uint8 temp = (48 + uint8(_i - (_i / 10) * 10)); bytes1 b1 = bytes1(temp); bstr[k] = b1; _i /= 10; } return string(bstr); } function seconds2strv2(uint256 _seconds) internal pure returns (uint[13] memory _numbers) { uint _years = _seconds / 31536000; _seconds -= _years * 31536000; uint _weeks = _seconds / 604800; _seconds -= _weeks * 604800; uint _days = _seconds / 86400; _seconds -= _days * 86400; uint _hours = _seconds / 3600; _seconds -= _hours * 3600; uint _minutes = _seconds / 60; _seconds -= _minutes * 60; uint _secondsRemaining = _seconds; if(_years < 10) { _numbers[0] = 0; _numbers[1] = 0; _numbers[2] = 0; _numbers[3] = _years; } else if(_years < 100) { _numbers[0] = 0; _numbers[1] = 0; _numbers[2] = (_years / 10); _numbers[3] = (_years % 10); } else if(_years < 1000) { _numbers[0] = 0; _numbers[1] = (_years / 100); _numbers[2] = ((_years % 100) / 10); _numbers[3] = (_years % 10); } else if(_years < 10000) { _numbers[0] = (_years / 1000); _numbers[1] = ((_years % 1000) / 100); _numbers[2] = ((_years % 100) / 10); _numbers[3] = (_years % 10); } if(_weeks < 10) { _numbers[4] = 0; _numbers[5] = _weeks; } else { _numbers[4] = (_weeks / 10); _numbers[5] = (_weeks % 10); } _numbers[6] = _days; if(_hours < 10) { _numbers[7] = 0; _numbers[8] = _hours; } else { _numbers[7] = (_hours / 10); _numbers[8] = (_hours % 10); } if(_minutes < 10) { _numbers[9] = 0; _numbers[10] = _minutes; } else { _numbers[9] = (_minutes / 10); _numbers[10] = (_minutes % 10); } if(_secondsRemaining < 10) { _numbers[11] = 0; _numbers[12] = _secondsRemaining; } else { _numbers[11] = (_secondsRemaining / 10); _numbers[12] = (_secondsRemaining % 10); } return _numbers; } // Get a pseudo random number function random(uint256 input, uint256 min, uint256 max) internal pure returns (uint256) { uint256 randRange = max - min; return max - (uint256(keccak256(abi.encodePacked(input + 2023))) % randRange) - 1; } function randomNumber(uint256 input, uint256 min, uint256 max) internal pure returns (uint256) { return uint256(keccak256(abi.encodePacked(input))) % (max - min + 1) + min; } function initValue(uint256 tokenId) internal pure returns (uint256 value) { if (tokenId <= 5000) { value = randomNumber(tokenId, 24 * 3600, 1000 * 3600); } else if (tokenId <= 8000) { value = randomNumber(tokenId, 12 * 3600, 500 * 3600); } else { value = randomNumber(tokenId, 6 * 3600, 250 * 3600); } return value; } function getRgbs(uint tokenId, uint baseColor) internal pure returns (uint256[3] memory rgbValues) { if (baseColor > 0) { for (uint i = 0; i < 3; i++) { if (baseColor == i + 1) { rgbValues[i] = 255; } else { rgbValues[i] = utils.random(tokenId + i, 0, 256); } } } else { for (uint i = 0; i < 3; i++) { rgbValues[i] = 255; } } return rgbValues; } function getMintPhase(uint tokenId) internal pure returns (uint mintPhase) { if (tokenId <= 5000) { mintPhase = 1; } else if (tokenId <= 8000) { mintPhase = 2; } else { mintPhase = 3; } } function secondsRemaining(uint end) internal view returns (uint) { if (block.timestamp <= end) { return end - block.timestamp; } else { return 0; } } function minutesRemaining(uint end) internal view returns (uint) { if (secondsRemaining(end) >= 60) { return (end - block.timestamp) / 60; } else { return 0; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_finalBlock","type":"uint256"}],"name":"CountdownExtended","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_prefix","outputs":[{"internalType":"contract SVGPrefix","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"addFreeMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokens","type":"uint256[]"}],"name":"combine","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finalMintingBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"}],"name":"freeMintBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinutesRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isCombinable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint4Owner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleCombinable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052660aa87bee5380006009556000600a60006101000a81548160ff0219169083151502179055503480156200003757600080fd5b50604051620062403803806200624083398181016040528101906200005d9190620002ae565b6040518060400160405280601181526020017f556c74696d6174652043757272656e63790000000000000000000000000000008152506040518060400160405280600481526020017f54494d45000000000000000000000000000000000000000000000000000000008152508160029081620000da91906200055a565b508060039081620000ec91906200055a565b50620000fd6200016d60201b60201c565b600081905550505062000125620001196200017660201b60201c565b6200017e60201b60201c565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000641565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002768262000249565b9050919050565b620002888162000269565b81146200029457600080fd5b50565b600081519050620002a8816200027d565b92915050565b600060208284031215620002c757620002c662000244565b5b6000620002d78482850162000297565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036257607f821691505b6020821081036200037857620003776200031a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003e27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003a3565b620003ee8683620003a3565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200043b620004356200042f8462000406565b62000410565b62000406565b9050919050565b6000819050919050565b62000457836200041a565b6200046f620004668262000442565b848454620003b0565b825550505050565b600090565b6200048662000477565b620004938184846200044c565b505050565b5b81811015620004bb57620004af6000826200047c565b60018101905062000499565b5050565b601f8211156200050a57620004d4816200037e565b620004df8462000393565b81016020851015620004ef578190505b62000507620004fe8562000393565b83018262000498565b50505b505050565b600082821c905092915050565b60006200052f600019846008026200050f565b1980831691505092915050565b60006200054a83836200051c565b9150826002028217905092915050565b6200056582620002e0565b67ffffffffffffffff811115620005815762000580620002eb565b5b6200058d825462000349565b6200059a828285620004bf565b600060209050601f831160018114620005d25760008415620005bd578287015190505b620005c985826200053c565b86555062000639565b601f198416620005e2866200037e565b60005b828110156200060c57848901518255600182019150602085019450602081019050620005e5565b868310156200062c578489015162000628601f8916826200051c565b8355505b6001600288020188555050505b505050505050565b615bef80620006516000396000f3fe6080604052600436106101e35760003560e01c8063715018a611610102578063a6c56c7911610095578063d1d18f5011610064578063d1d18f5014610679578063d8c718a8146106b6578063e985e9c5146106df578063f2fde38b1461071c576101e3565b8063a6c56c79146105de578063b88d4fde14610609578063b8be6e9814610625578063c87b56dd1461063c576101e3565b80639659867e116100d15780639659867e14610543578063a035b1fe1461056e578063a0712d6814610599578063a22cb465146105b5576101e3565b8063715018a6146104ad5780637c928fe9146104c45780638da5cb5b146104ed57806395d89b4114610518576101e3565b806323b872dd1161017a57806342842e0e1161014957806342842e0e146103ec5780635375d9fe146104085780636352211e1461043357806370a0823114610470576101e3565b806323b872dd1461036557806325e514c61461038157806337c5fa0d146103aa5780633ccfd60b146103d5576101e3565b80630ff4c916116101b65780630ff4c916146102a957806318160ddd146102e65780631ad3beeb1461031157806321cf7ecf1461033a576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190613a29565b610745565b60405161021c9190613a71565b60405180910390f35b34801561023157600080fd5b5061023a6107d7565b6040516102479190613b1c565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190613b74565b610869565b6040516102849190613be2565b60405180910390f35b6102a760048036038101906102a29190613c29565b6108e8565b005b3480156102b557600080fd5b506102d060048036038101906102cb9190613b74565b610a2c565b6040516102dd9190613c78565b60405180910390f35b3480156102f257600080fd5b506102fb610a8c565b6040516103089190613c78565b60405180910390f35b34801561031d57600080fd5b5061033860048036038101906103339190613b74565b610aa3565b005b34801561034657600080fd5b5061034f610ab8565b60405161035c9190613c78565b60405180910390f35b61037f600480360381019061037a9190613c93565b610abe565b005b34801561038d57600080fd5b506103a860048036038101906103a39190613e2e565b610de0565b005b3480156103b657600080fd5b506103bf61113d565b6040516103cc9190613a71565b60405180910390f35b3480156103e157600080fd5b506103ea611150565b005b61040660048036038101906104019190613c93565b611198565b005b34801561041457600080fd5b5061041d6111b8565b60405161042a9190613ed6565b60405180910390f35b34801561043f57600080fd5b5061045a60048036038101906104559190613b74565b6111de565b6040516104679190613be2565b60405180910390f35b34801561047c57600080fd5b5061049760048036038101906104929190613ef1565b6111f0565b6040516104a49190613c78565b60405180910390f35b3480156104b957600080fd5b506104c26112a8565b005b3480156104d057600080fd5b506104eb60048036038101906104e69190613b74565b6112bc565b005b3480156104f957600080fd5b506105026113a1565b60405161050f9190613be2565b60405180910390f35b34801561052457600080fd5b5061052d6113cb565b60405161053a9190613b1c565b60405180910390f35b34801561054f57600080fd5b5061055861145d565b6040516105659190613c78565b60405180910390f35b34801561057a57600080fd5b5061058361146c565b6040516105909190613c78565b60405180910390f35b6105b360048036038101906105ae9190613b74565b611472565b005b3480156105c157600080fd5b506105dc60048036038101906105d79190613f4a565b6114cf565b005b3480156105ea57600080fd5b506105f36115da565b6040516106009190613c78565b60405180910390f35b610623600480360381019061061e919061403f565b6115ec565b005b34801561063157600080fd5b5061063a61165f565b005b34801561064857600080fd5b50610663600480360381019061065e9190613b74565b611693565b6040516106709190613b1c565b60405180910390f35b34801561068557600080fd5b506106a0600480360381019061069b9190613ef1565b61181d565b6040516106ad9190613c78565b60405180910390f35b3480156106c257600080fd5b506106dd60048036038101906106d8919061411d565b611866565b005b3480156106eb57600080fd5b506107066004803603810190610701919061417d565b611900565b6040516107139190613a71565b60405180910390f35b34801561072857600080fd5b50610743600480360381019061073e9190613ef1565b611994565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107a057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107d05750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546107e6906141ec565b80601f0160208091040260200160405190810160405280929190818152602001828054610812906141ec565b801561085f5780601f106108345761010080835404028352916020019161085f565b820191906000526020600020905b81548152906001019060200180831161084257829003601f168201915b5050505050905090565b600061087482611a17565b6108aa576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108f3826111de565b90508073ffffffffffffffffffffffffffffffffffffffff16610914611a76565b73ffffffffffffffffffffffffffffffffffffffff1614610977576109408161093b611a76565b611900565b610976576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a3782611a17565b610a445760009050610a87565b6000600d6000848152602001908152602001600020541115610a7b57600d6000838152602001908152602001600020549050610a87565b610a8482611a7e565b90505b919050565b6000610a96611ada565b6001546000540303905090565b610aab611ae3565b610ab53382611b61565b50565b600b5481565b6000610ac982611cad565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b30576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b3c84611d79565b91509150610b528187610b4d611a76565b611da0565b610b9e57610b6786610b62611a76565b611900565b610b9d576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610c04576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c118686866001611de4565b8015610c1c57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610cea85610cc6888887611dea565b7c020000000000000000000000000000000000000000000000000000000017611e12565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610d705760006001850190506000600460008381526020019081526020016000205403610d6e576000548114610d6d578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610dd88686866001611e3d565b505050505050565b600a60009054906101000a900460ff16610e2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2690614269565b60405180910390fd5b600080600090505b8251811015610f13573373ffffffffffffffffffffffffffffffffffffffff16610e7a848381518110610e6d57610e6c614289565b5b60200260200101516111de565b73ffffffffffffffffffffffffffffffffffffffff1614610ed0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec790614304565b60405180910390fd5b610ef3838281518110610ee657610ee5614289565b5b6020026020010151610a2c565b82610efe9190614353565b91508080610f0b90614387565b915050610e37565b5064496cebb7ff811115610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5390614441565b60405180910390fd5b6000600190505b825181101561105957610f8f838281518110610f8257610f81614289565b5b6020026020010151611e43565b6000600d6000858481518110610fa857610fa7614289565b5b60200260200101518152602001908152602001600020819055506000600e6000858481518110610fdb57610fda614289565b5b60200260200101518152602001908152602001600020819055507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce783828151811061102957611028614289565b5b602002602001015160405161103e9190613c78565b60405180910390a1808061105190614387565b915050610f63565b5080600d60008460008151811061107357611072614289565b5b60200260200101518152602001908152602001600020819055506110b5826000815181106110a4576110a3614289565b5b602002602001015160016004611e51565b600e6000846000815181106110cd576110cc614289565b5b60200260200101518152602001908152602001600020819055507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78260008151811061111c5761111b614289565b5b60200260200101516040516111319190613c78565b60405180910390a15050565b600a60009054906101000a900460ff1681565b611158611ae3565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061119657600080fd5b565b6111b3838383604051806020016040528060008152506115ec565b505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006111e982611cad565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611257576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6112b0611ae3565b6112ba6000611ec5565b565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561133e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611335906144ad565b60405180910390fd5b6113483382611b61565b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461139791906144cd565b9250508190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546113da906141ec565b80601f0160208091040260200160405190810160405280929190818152602001828054611406906141ec565b80156114535780601f1061142857610100808354040283529160200191611453565b820191906000526020600020905b81548152906001019060200180831161143657829003601f168201915b5050505050905090565b6000611467611f8b565b905090565b60095481565b600954816114809190614501565b3410156114c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b99061458f565b60405180910390fd5b6114cc3382611b61565b50565b80600760006114dc611a76565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611589611a76565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115ce9190613a71565b60405180910390a35050565b60006115e7600b54611f9e565b905090565b6115f7848484610abe565b60008373ffffffffffffffffffffffffffffffffffffffff163b146116595761162284848484611fd9565b611658576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611667611ae3565b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b60606000806000600d60008681526020019081526020016000205411156116d357600d60008581526020019081526020016000205490506000915061175f565b6000600d6000868152602001908152602001600020541480156116fc57506116fa84611a17565b155b1561170e57600090506001915061175e565b6003841161174d576001840361172b57640757b12c009050611748565b6002840361173f5763bbf81e009050611747565b6312cc030090505b5b611759565b61175684611a7e565b90505b600091505b5b6118148482600e60008881526020019081526020016000205485600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ae8d1506040518163ffffffff1660e01b8152600401600060405180830381865afa1580156117e6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061180f919061461f565b612129565b92505050919050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61186e611ae3565b60005b838390508110156118fa5781600f600086868581811061189457611893614289565b5b90506020020160208101906118a99190613ef1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806118f290614387565b915050611871565b50505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61199c611ae3565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a02906146da565b60405180910390fd5b611a1481611ec5565b50565b600081611a22611ada565b11158015611a31575060005482105b8015611a6f575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006113888211611aa157611a9a82620151806236ee80612284565b9050611ad5565b611f408211611ac157611aba8261a8c0621b7740612284565b9050611ad4565b611ad182615460620dbba0612284565b90505b5b919050565b60006001905090565b611aeb6122e6565b73ffffffffffffffffffffffffffffffffffffffff16611b096113a1565b73ffffffffffffffffffffffffffffffffffffffff1614611b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5690614746565b60405180910390fd5b565b6000611b6b611f8b565b90506113888110611c3a576000611b83600b546122ee565b11611bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bba906147b2565b60405180910390fd5b611f4081108015611be15750611f408282611bde9190614353565b10155b15611c35576201518042611bf59190614353565b600b819055507ff5b316bf09d21e0058eb23be118a6b81bd52674b4cb843e0f446b986ce22433e600b54604051611c2c9190613c78565b60405180910390a15b611c9e565b6113888282611c499190614353565b10611c9d576201518042611c5d9190614353565b600b819055507ff5b316bf09d21e0058eb23be118a6b81bd52674b4cb843e0f446b986ce22433e600b54604051611c949190613c78565b60405180910390a15b5b611ca88383612314565b505050565b60008082905080611cbc611ada565b11611d4257600054811015611d415760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611d3f575b60008103611d35576004600083600190039350838152602001908152602001600020549050611d0b565b8092505050611d74565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611e018686846124cf565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611e4e8160006124d8565b50565b6000808383611e6091906144cd565b90506001816107e787611e739190614353565b604051602001611e8391906147f3565b6040516020818303038152906040528051906020012060001c611ea6919061483d565b84611eb191906144cd565b611ebb91906144cd565b9150509392505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000611f95611ada565b60005403905090565b6000603c611fab836122ee565b10611fcf57603c4283611fbe91906144cd565b611fc8919061486e565b9050611fd4565b600090505b919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611fff611a76565b8786866040518563ffffffff1660e01b815260040161202194939291906148f4565b6020604051808303816000875af192505050801561205d57506040513d601f19601f8201168201806040525081019061205a9190614955565b60015b6120d6573d806000811461208d576040519150601f19603f3d011682016040523d82523d6000602084013e612092565b606091505b5060008151036120ce576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000612137878661272a565b9050606084156121845761214a88612811565b61215d612158898588612999565b612dee565b60405160200161216e929190614b3a565b604051602081830303815290604052905061224f565b61218d88612811565b61219688612811565b6121a76121a28b612f51565b612811565b6121b089612f82565b6121d1866000600381106121c7576121c6614289565b5b6020020151612811565b6121f2876001600381106121e8576121e7614289565b5b6020020151612811565b6122138860026003811061220957612208614289565b5b6020020151612811565b6122266122218f8b8e612999565b612dee565b60405160200161223d989796959493929190614e9d565b60405160208183030381529060405290505b61225881612dee565b6040516020016122689190614fbe565b6040516020818303038152906040529250505095945050505050565b6000826001848461229591906144cd565b61229f9190614353565b856040516020016122b091906147f3565b6040516020818303038152906040528051906020012060001c6122d3919061483d565b6122dd9190614353565b90509392505050565b600033905090565b600081421161230a57428261230391906144cd565b905061230f565b600090505b919050565b60008054905060008203612354576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123616000848385611de4565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506123d8836123c96000866000611dea565b6123d28561309d565b17611e12565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461247957808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061243e565b50600082036124b4576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506124ca6000848385611e3d565b505050565b60009392505050565b60006124e383611cad565b905060008190506000806124f686611d79565b91509150841561255f57612512818461250d611a76565b611da0565b61255e5761252783612522611a76565b611900565b61255d576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b61256d836000886001611de4565b801561257857600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612620836125dd85600088611dea565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717611e12565b600460008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036126a657600060018701905060006004600083815260200190815260200160002054036126a45760005481146126a3578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612710836000886001611e3d565b600160008154809291906001019190505550505050505050565b612732613978565b60008211156127cc5760005b60038110156127c6576001816127549190614353565b830361277d5760ff82826003811061276f5761276e614289565b5b6020020181815250506127b3565b612796818561278c9190614353565b6000610100611e51565b8282600381106127a9576127a8614289565b5b6020020181815250505b80806127be90614387565b91505061273e565b5061280b565b60005b60038110156128095760ff8282600381106127ed576127ec614289565b5b602002018181525050808061280190614387565b9150506127cf565b505b92915050565b606060008203612858576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612994565b600082905060005b6000821461288a57808061287390614387565b915050600a82612883919061486e565b9150612860565b60008167ffffffffffffffff8111156128a6576128a5613ceb565b5b6040519080825280601f01601f1916602001820160405280156128d85781602001600182028036833780820191505090505b50905060008290505b6000861461298c576001816128f691906144cd565b90506000600a8088612908919061486e565b6129129190614501565b8761291d91906144cd565b60306129299190614fed565b905060008160f81b90508084848151811061294757612946614289565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a88612983919061486e565b975050506128e1565b819450505050505b919050565b606081905060006129c1846000600381106129b7576129b6614289565b5b6020020151612811565b6129e2856001600381106129d8576129d7614289565b5b6020020151612811565b612a03866002600381106129f9576129f8614289565b5b6020020151612811565b604051602001612a15939291906150ba565b60405160208183030381529060405290506000612a31866130ad565b905081612a576000836000600d8110612a4d57612a4c614289565b5b60200201516136fb565b604051602001612a68929190615117565b604051602081830303815290604052915081612a9d6001836001600d8110612a9357612a92614289565b5b60200201516136fb565b604051602001612aae929190615117565b604051602081830303815290604052915081612ae36002836002600d8110612ad957612ad8614289565b5b60200201516136fb565b604051602001612af4929190615117565b604051602081830303815290604052915081612b296003836003600d8110612b1f57612b1e614289565b5b60200201516136fb565b604051602001612b3a929190615117565b604051602081830303815290604052915081612b6f6004836004600d8110612b6557612b64614289565b5b60200201516136fb565b604051602001612b80929190615117565b604051602081830303815290604052915081612bb56005836005600d8110612bab57612baa614289565b5b60200201516136fb565b604051602001612bc6929190615117565b604051602081830303815290604052915081612bfb6006836006600d8110612bf157612bf0614289565b5b60200201516136fb565b604051602001612c0c929190615117565b604051602081830303815290604052915081612c416007836007600d8110612c3757612c36614289565b5b60200201516136fb565b604051602001612c52929190615117565b604051602081830303815290604052915081612c876008836008600d8110612c7d57612c7c614289565b5b60200201516136fb565b604051602001612c98929190615117565b604051602081830303815290604052915081612ccd6009836009600d8110612cc357612cc2614289565b5b60200201516136fb565b604051602001612cde929190615117565b604051602081830303815290604052915081612d13600a83600a600d8110612d0957612d08614289565b5b60200201516136fb565b604051602001612d24929190615117565b604051602081830303815290604052915081612d59600b83600b600d8110612d4f57612d4e614289565b5b60200201516136fb565b604051602001612d6a929190615117565b604051602081830303815290604052915081612d9f600c83600c600d8110612d9557612d94614289565b5b60200201516136fb565b604051602001612db0929190615117565b60405160208183030381529060405291508282604051602001612dd4929190615187565b604051602081830303815290604052925050509392505050565b60606000825103612e1057604051806020016040528060008152509050612f4c565b6000604051806060016040528060408152602001615b7a6040913990506000600360028551612e3f9190614353565b612e49919061486e565b6004612e559190614501565b67ffffffffffffffff811115612e6e57612e6d613ceb565b5b6040519080825280601f01601f191660200182016040528015612ea05781602001600182028036833780820191505090505b509050600182016020820185865187015b80821015612f0c576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845360018401935050612eb1565b5050600386510660018114612f285760028114612f3b57612f43565b603d6001830353603d6002830353612f43565b603d60018303535b50505080925050505b919050565b60006113888211612f655760019050612f7d565b611f408211612f775760029050612f7c565b600390505b5b919050565b6060600060405180608001604052806040518060400160405280600581526020017f576869746500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f526564000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f477265656e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f426c75650000000000000000000000000000000000000000000000000000000081525081525090508083600481106130905761308f614289565b5b6020020151915050919050565b60006001821460e11b9050919050565b6130b561399a565b60006301e13380836130c7919061486e565b90506301e13380816130d99190614501565b836130e491906144cd565b9250600062093a80846130f7919061486e565b905062093a80816131089190614501565b8461311391906144cd565b935060006201518085613126919061486e565b905062015180816131379190614501565b8561314291906144cd565b94506000610e1086613154919061486e565b9050610e10816131649190614501565b8661316f91906144cd565b95506000603c87613180919061486e565b9050603c8161318f9190614501565b8761319a91906144cd565b96506000879050600a86101561322a576000876000600d81106131c0576131bf614289565b5b6020020181815250506000876001600d81106131df576131de614289565b5b6020020181815250506000876002600d81106131fe576131fd614289565b5b60200201818152505085876003600d811061321c5761321b614289565b5b602002018181525050613452565b60648610156132ca576000876000600d811061324957613248614289565b5b6020020181815250506000876001600d811061326857613267614289565b5b602002018181525050600a8661327e919061486e565b876002600d811061329257613291614289565b5b602002018181525050600a866132a8919061483d565b876003600d81106132bc576132bb614289565b5b602002018181525050613451565b6103e8861015613382576000876000600d81106132ea576132e9614289565b5b602002018181525050606486613300919061486e565b876001600d811061331457613313614289565b5b602002018181525050600a60648761332c919061483d565b613336919061486e565b876002600d811061334a57613349614289565b5b602002018181525050600a86613360919061483d565b876003600d811061337457613373614289565b5b602002018181525050613450565b61271086101561344f576103e88661339a919061486e565b876000600d81106133ae576133ad614289565b5b60200201818152505060646103e8876133c7919061483d565b6133d1919061486e565b876001600d81106133e5576133e4614289565b5b602002018181525050600a6064876133fd919061483d565b613407919061486e565b876002600d811061341b5761341a614289565b5b602002018181525050600a86613431919061483d565b876003600d811061344557613444614289565b5b6020020181815250505b5b5b5b600a85101561349d576000876004600d811061347157613470614289565b5b60200201818152505084876005600d811061348f5761348e614289565b5b6020020181815250506134f2565b600a856134aa919061486e565b876004600d81106134be576134bd614289565b5b602002018181525050600a856134d4919061483d565b876005600d81106134e8576134e7614289565b5b6020020181815250505b83876006600d811061350757613506614289565b5b602002018181525050600a83101561355b576000876007600d811061352f5761352e614289565b5b60200201818152505082876008600d811061354d5761354c614289565b5b6020020181815250506135b0565b600a83613568919061486e565b876007600d811061357c5761357b614289565b5b602002018181525050600a83613592919061483d565b876008600d81106135a6576135a5614289565b5b6020020181815250505b600a8210156135fb576000876009600d81106135cf576135ce614289565b5b6020020181815250508187600a600d81106135ed576135ec614289565b5b602002018181525050613650565b600a82613608919061486e565b876009600d811061361c5761361b614289565b5b602002018181525050600a82613632919061483d565b87600a600d811061364657613645614289565b5b6020020181815250505b600a81101561369b57600087600b600d811061366f5761366e614289565b5b6020020181815250508087600c600d811061368d5761368c614289565b5b6020020181815250506136f0565b600a816136a8919061486e565b87600b600d81106136bc576136bb614289565b5b602002018181525050600a816136d2919061483d565b87600c600d81106136e6576136e5614289565b5b6020020181815250505b505050505050919050565b6060600061370884612811565b9050600083036137445780818283848560405160200161372d969594939291906153ca565b604051602081830303815290604052915050613972565b6001830361377657808160405160200161375f9291906154f2565b604051602081830303815290604052915050613972565b600283036137ae57808182838460405160200161379795949392919061558e565b604051602081830303815290604052915050613972565b600383036137e65780818283846040516020016137cf959493929190615647565b604051602081830303815290604052915050613972565b6004830361381c57808182836040516020016138059493929190615700565b604051602081830303815290604052915050613972565b6005830361385457808182838460405160200161383d959493929190615796565b604051602081830303815290604052915050613972565b6006830361388e578081828384856040516020016138779695949392919061584f565b604051602081830303815290604052915050613972565b600783036138c2578081826040516020016138ab9392919061592b565b604051602081830303815290604052915050613972565b600883036138fe57808182838485866040516020016138e7979695949392919061599e565b604051602081830303815290604052915050613972565b600983036139385780818283848560405160200161392196959493929190615a9d565b604051602081830303815290604052915050613972565b6040518060400160405280600581526020017f6572726f720000000000000000000000000000000000000000000000000000008152509150505b92915050565b6040518060600160405280600390602082028036833780820191505090505090565b604051806101a00160405280600d90602082028036833780820191505090505090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a06816139d1565b8114613a1157600080fd5b50565b600081359050613a23816139fd565b92915050565b600060208284031215613a3f57613a3e6139c7565b5b6000613a4d84828501613a14565b91505092915050565b60008115159050919050565b613a6b81613a56565b82525050565b6000602082019050613a866000830184613a62565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ac6578082015181840152602081019050613aab565b60008484015250505050565b6000601f19601f8301169050919050565b6000613aee82613a8c565b613af88185613a97565b9350613b08818560208601613aa8565b613b1181613ad2565b840191505092915050565b60006020820190508181036000830152613b368184613ae3565b905092915050565b6000819050919050565b613b5181613b3e565b8114613b5c57600080fd5b50565b600081359050613b6e81613b48565b92915050565b600060208284031215613b8a57613b896139c7565b5b6000613b9884828501613b5f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bcc82613ba1565b9050919050565b613bdc81613bc1565b82525050565b6000602082019050613bf76000830184613bd3565b92915050565b613c0681613bc1565b8114613c1157600080fd5b50565b600081359050613c2381613bfd565b92915050565b60008060408385031215613c4057613c3f6139c7565b5b6000613c4e85828601613c14565b9250506020613c5f85828601613b5f565b9150509250929050565b613c7281613b3e565b82525050565b6000602082019050613c8d6000830184613c69565b92915050565b600080600060608486031215613cac57613cab6139c7565b5b6000613cba86828701613c14565b9350506020613ccb86828701613c14565b9250506040613cdc86828701613b5f565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d2382613ad2565b810181811067ffffffffffffffff82111715613d4257613d41613ceb565b5b80604052505050565b6000613d556139bd565b9050613d618282613d1a565b919050565b600067ffffffffffffffff821115613d8157613d80613ceb565b5b602082029050602081019050919050565b600080fd5b6000613daa613da584613d66565b613d4b565b90508083825260208201905060208402830185811115613dcd57613dcc613d92565b5b835b81811015613df65780613de28882613b5f565b845260208401935050602081019050613dcf565b5050509392505050565b600082601f830112613e1557613e14613ce6565b5b8135613e25848260208601613d97565b91505092915050565b600060208284031215613e4457613e436139c7565b5b600082013567ffffffffffffffff811115613e6257613e616139cc565b5b613e6e84828501613e00565b91505092915050565b6000819050919050565b6000613e9c613e97613e9284613ba1565b613e77565b613ba1565b9050919050565b6000613eae82613e81565b9050919050565b6000613ec082613ea3565b9050919050565b613ed081613eb5565b82525050565b6000602082019050613eeb6000830184613ec7565b92915050565b600060208284031215613f0757613f066139c7565b5b6000613f1584828501613c14565b91505092915050565b613f2781613a56565b8114613f3257600080fd5b50565b600081359050613f4481613f1e565b92915050565b60008060408385031215613f6157613f606139c7565b5b6000613f6f85828601613c14565b9250506020613f8085828601613f35565b9150509250929050565b600080fd5b600067ffffffffffffffff821115613faa57613fa9613ceb565b5b613fb382613ad2565b9050602081019050919050565b82818337600083830152505050565b6000613fe2613fdd84613f8f565b613d4b565b905082815260208101848484011115613ffe57613ffd613f8a565b5b614009848285613fc0565b509392505050565b600082601f83011261402657614025613ce6565b5b8135614036848260208601613fcf565b91505092915050565b60008060008060808587031215614059576140586139c7565b5b600061406787828801613c14565b945050602061407887828801613c14565b935050604061408987828801613b5f565b925050606085013567ffffffffffffffff8111156140aa576140a96139cc565b5b6140b687828801614011565b91505092959194509250565b600080fd5b60008083601f8401126140dd576140dc613ce6565b5b8235905067ffffffffffffffff8111156140fa576140f96140c2565b5b60208301915083602082028301111561411657614115613d92565b5b9250929050565b600080600060408486031215614136576141356139c7565b5b600084013567ffffffffffffffff811115614154576141536139cc565b5b614160868287016140c7565b9350935050602061417386828701613b5f565b9150509250925092565b60008060408385031215614194576141936139c7565b5b60006141a285828601613c14565b92505060206141b385828601613c14565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061420457607f821691505b602082108103614217576142166141bd565b5b50919050565b7f636f6d62696e696e67206e6f7420616374697665000000000000000000000000600082015250565b6000614253601483613a97565b915061425e8261421d565b602082019050919050565b6000602082019050818103600083015261428281614246565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f6d757374206f776e20616c6c20746f6b656e7300000000000000000000000000600082015250565b60006142ee601383613a97565b91506142f9826142b8565b602082019050919050565b6000602082019050818103600083015261431d816142e1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061435e82613b3e565b915061436983613b3e565b925082820190508082111561438157614380614324565b5b92915050565b600061439282613b3e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143c4576143c3614324565b5b600182019050919050565b7f73756d206d75737420626520393939393a35323a303a32333a35393a3539206f60008201527f72206c6573730000000000000000000000000000000000000000000000000000602082015250565b600061442b602683613a97565b9150614436826143cf565b604082019050919050565b6000602082019050818103600083015261445a8161441e565b9050919050565b7f6e6f7420656e6f7567682066726565206d696e74730000000000000000000000600082015250565b6000614497601583613a97565b91506144a282614461565b602082019050919050565b600060208201905081810360008301526144c68161448a565b9050919050565b60006144d882613b3e565b91506144e383613b3e565b92508282039050818111156144fb576144fa614324565b5b92915050565b600061450c82613b3e565b915061451783613b3e565b925082820261452581613b3e565b9150828204841483151761453c5761453b614324565b5b5092915050565b7f6e6f7420656e6f75676820657468000000000000000000000000000000000000600082015250565b6000614579600e83613a97565b915061458482614543565b602082019050919050565b600060208201905081810360008301526145a88161456c565b9050919050565b60006145c26145bd84613f8f565b613d4b565b9050828152602081018484840111156145de576145dd613f8a565b5b6145e9848285613aa8565b509392505050565b600082601f83011261460657614605613ce6565b5b81516146168482602086016145af565b91505092915050565b600060208284031215614635576146346139c7565b5b600082015167ffffffffffffffff811115614653576146526139cc565b5b61465f848285016145f1565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146c4602683613a97565b91506146cf82614668565b604082019050919050565b600060208201905081810360008301526146f3816146b7565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614730602083613a97565b915061473b826146fa565b602082019050919050565b6000602082019050818103600083015261475f81614723565b9050919050565b7f6d696e7420697320636c6f736564000000000000000000000000000000000000600082015250565b600061479c600e83613a97565b91506147a782614766565b602082019050919050565b600060208201905081810360008301526147cb8161478f565b9050919050565b6000819050919050565b6147ed6147e882613b3e565b6147d2565b82525050565b60006147ff82846147dc565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061484882613b3e565b915061485383613b3e565b9250826148635761486261480e565b5b828206905092915050565b600061487982613b3e565b915061488483613b3e565b9250826148945761489361480e565b5b828204905092915050565b600081519050919050565b600082825260208201905092915050565b60006148c68261489f565b6148d081856148aa565b93506148e0818560208601613aa8565b6148e981613ad2565b840191505092915050565b60006080820190506149096000830187613bd3565b6149166020830186613bd3565b6149236040830185613c69565b818103606083015261493581846148bb565b905095945050505050565b60008151905061494f816139fd565b92915050565b60006020828403121561496b5761496a6139c7565b5b600061497984828501614940565b91505092915050565b600081905092915050565b7f7b226e616d65223a202254494d45200000000000000000000000000000000000600082015250565b60006149c3600f83614982565b91506149ce8261498d565b600f82019050919050565b60006149e482613a8c565b6149ee8185614982565b93506149fe818560208601613aa8565b80840191505092915050565b7f205b4255524e45445d222c20226465736372697074696f6e223a202254696d6560008201527f2069732074686520756c74696d6174652063757272656e63792e222c2022617460208201527f7472696275746573223a5b7b2274726169745f74797065223a20224275726e6560408201527f64222c202276616c7565223a2022596573227d5d2c2022696d616765223a202260608201527f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000608082015250565b6000614ad8609a83614982565b9150614ae382614a0a565b609a82019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b6000614b24600283614982565b9150614b2f82614aee565b600282019050919050565b6000614b45826149b6565b9150614b5182856149d9565b9150614b5c82614acb565b9150614b6882846149d9565b9150614b7382614b17565b91508190509392505050565b7f222c20226465736372697074696f6e223a202254696d6520697320746865207560008201527f6c74696d6174652063757272656e63792e222c2022617474726962757465732260208201527f3a5b7b2274726169745f74797065223a202242616c616e6365222c20226d617860408201527f5f76616c7565223a203331353335393939393939392c202276616c7565223a20606082015250565b6000614c27608083614982565b9150614c3282614b7f565b608082019050919050565b7f7d2c7b22646973706c61795f74797065223a20226e756d626572222c2022747260008201527f6169745f74797065223a20224d696e74205068617365222c202276616c75652260208201527f3a20000000000000000000000000000000000000000000000000000000000000604082015250565b6000614cbf604283614982565b9150614cca82614c3d565b604282019050919050565b7f7d2c7b2274726169745f74797065223a20224275726e6564222c202276616c7560008201527f65223a20224e6f227d2c7b2274726169745f74797065223a202242617365204360208201527f6f6c6f72222c202276616c7565223a2022000000000000000000000000000000604082015250565b6000614d57605183614982565b9150614d6282614cd5565b605182019050919050565b7f227d2c7b2274726169745f74797065223a2022436f6c6f72222c202276616c7560008201527f65223a2022524742280000000000000000000000000000000000000000000000602082015250565b6000614dc9602983614982565b9150614dd482614d6d565b602982019050919050565b7f2c00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614e15600183614982565b9150614e2082614ddf565b600182019050919050565b7f29227d5d2c2022696d616765223a2022646174613a696d6167652f7376672b7860008201527f6d6c3b6261736536342c00000000000000000000000000000000000000000000602082015250565b6000614e87602a83614982565b9150614e9282614e2b565b602a82019050919050565b6000614ea8826149b6565b9150614eb4828b6149d9565b9150614ebf82614c1a565b9150614ecb828a6149d9565b9150614ed682614cb2565b9150614ee282896149d9565b9150614eed82614d4a565b9150614ef982886149d9565b9150614f0482614dbc565b9150614f1082876149d9565b9150614f1b82614e08565b9150614f2782866149d9565b9150614f3282614e08565b9150614f3e82856149d9565b9150614f4982614e7a565b9150614f5582846149d9565b9150614f6082614b17565b91508190509998505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b6000614fa8601d83614982565b9150614fb382614f72565b601d82019050919050565b6000614fc982614f9b565b9150614fd582846149d9565b915081905092915050565b600060ff82169050919050565b6000614ff882614fe0565b915061500383614fe0565b9250828201905060ff81111561501c5761501b614324565b5b92915050565b7f706174685b69645e3d2770275d7b66696c6c3a72676228000000000000000000600082015250565b6000615058601783614982565b915061506382615022565b601782019050919050565b7f297d2362677b66696c6c3a233043304330437d00000000000000000000000000600082015250565b60006150a4601383614982565b91506150af8261506e565b601382019050919050565b60006150c58261504b565b91506150d182866149d9565b91506150dc82614e08565b91506150e882856149d9565b91506150f382614e08565b91506150ff82846149d9565b915061510a82615097565b9150819050949350505050565b600061512382856149d9565b915061512f82846149d9565b91508190509392505050565b7f3c2f7374796c653e3c2f7376673e000000000000000000000000000000000000600082015250565b6000615171600e83614982565b915061517c8261513b565b600e82019050919050565b600061519382856149d9565b915061519f82846149d9565b91506151aa82615164565b91508190509392505050565b7f2370000000000000000000000000000000000000000000000000000000000000600082015250565b60006151ec600283614982565b91506151f7826151b6565b600282019050919050565b7f312c000000000000000000000000000000000000000000000000000000000000600082015250565b6000615238600283614982565b915061524382615202565b600282019050919050565b7f322c000000000000000000000000000000000000000000000000000000000000600082015250565b6000615284600283614982565b915061528f8261524e565b600282019050919050565b7f332c000000000000000000000000000000000000000000000000000000000000600082015250565b60006152d0600283614982565b91506152db8261529a565b600282019050919050565b7f352c000000000000000000000000000000000000000000000000000000000000600082015250565b600061531c600283614982565b9150615327826152e6565b600282019050919050565b7f362c000000000000000000000000000000000000000000000000000000000000600082015250565b6000615368600283614982565b915061537382615332565b600282019050919050565b7f37207b66696c6c2d6f7061636974793a317d0000000000000000000000000000600082015250565b60006153b4601283614982565b91506153bf8261537e565b601282019050919050565b60006153d5826151df565b91506153e182896149d9565b91506153ec8261522b565b91506153f7826151df565b915061540382886149d9565b915061540e82615277565b9150615419826151df565b915061542582876149d9565b9150615430826152c3565b915061543b826151df565b915061544782866149d9565b91506154528261530f565b915061545d826151df565b915061546982856149d9565b91506154748261535b565b915061547f826151df565b915061548b82846149d9565b9150615496826153a7565b9150819050979650505050505050565b7f36207b66696c6c2d6f7061636974793a317d0000000000000000000000000000600082015250565b60006154dc601283614982565b91506154e7826154a6565b601282019050919050565b60006154fd826151df565b915061550982856149d9565b9150615514826152c3565b915061551f826151df565b915061552b82846149d9565b9150615536826154cf565b91508190509392505050565b7f342c000000000000000000000000000000000000000000000000000000000000600082015250565b6000615578600283614982565b915061558382615542565b600282019050919050565b6000615599826151df565b91506155a582886149d9565b91506155b08261522b565b91506155bb826151df565b91506155c782876149d9565b91506155d2826152c3565b91506155dd826151df565b91506155e982866149d9565b91506155f48261556b565b91506155ff826151df565b915061560b82856149d9565b91506156168261530f565b9150615621826151df565b915061562d82846149d9565b9150615638826153a7565b91508190509695505050505050565b6000615652826151df565b915061565e82886149d9565b91506156698261522b565b9150615674826151df565b915061568082876149d9565b915061568b826152c3565b9150615696826151df565b91506156a282866149d9565b91506156ad8261556b565b91506156b8826151df565b91506156c482856149d9565b91506156cf8261535b565b91506156da826151df565b91506156e682846149d9565b91506156f1826153a7565b91508190509695505050505050565b600061570b826151df565b915061571782876149d9565b915061572282615277565b915061572d826151df565b915061573982866149d9565b9150615744826152c3565b915061574f826151df565b915061575b82856149d9565b91506157668261556b565b9150615771826151df565b915061577d82846149d9565b9150615788826154cf565b915081905095945050505050565b60006157a1826151df565b91506157ad82886149d9565b91506157b88261522b565b91506157c3826151df565b91506157cf82876149d9565b91506157da82615277565b91506157e5826151df565b91506157f182866149d9565b91506157fc8261556b565b9150615807826151df565b915061581382856149d9565b915061581e8261535b565b9150615829826151df565b915061583582846149d9565b9150615840826153a7565b91508190509695505050505050565b600061585a826151df565b915061586682896149d9565b91506158718261522b565b915061587c826151df565b915061588882886149d9565b915061589382615277565b915061589e826151df565b91506158aa82876149d9565b91506158b58261556b565b91506158c0826151df565b91506158cc82866149d9565b91506158d78261530f565b91506158e2826151df565b91506158ee82856149d9565b91506158f98261535b565b9150615904826151df565b915061591082846149d9565b915061591b826153a7565b9150819050979650505050505050565b6000615936826151df565b915061594282866149d9565b915061594d8261522b565b9150615958826151df565b915061596482856149d9565b915061596f826152c3565b915061597a826151df565b915061598682846149d9565b9150615991826154cf565b9150819050949350505050565b60006159a9826151df565b91506159b5828a6149d9565b91506159c08261522b565b91506159cb826151df565b91506159d782896149d9565b91506159e282615277565b91506159ed826151df565b91506159f982886149d9565b9150615a04826152c3565b9150615a0f826151df565b9150615a1b82876149d9565b9150615a268261556b565b9150615a31826151df565b9150615a3d82866149d9565b9150615a488261530f565b9150615a53826151df565b9150615a5f82856149d9565b9150615a6a8261535b565b9150615a75826151df565b9150615a8182846149d9565b9150615a8c826153a7565b915081905098975050505050505050565b6000615aa8826151df565b9150615ab482896149d9565b9150615abf8261522b565b9150615aca826151df565b9150615ad682886149d9565b9150615ae182615277565b9150615aec826151df565b9150615af882876149d9565b9150615b03826152c3565b9150615b0e826151df565b9150615b1a82866149d9565b9150615b258261556b565b9150615b30826151df565b9150615b3c82856149d9565b9150615b478261535b565b9150615b52826151df565b9150615b5e82846149d9565b9150615b69826153a7565b915081905097965050505050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220bf72455ed2e269244f6346932f54a18403e17f250f58cd2c25513078a5bd27ed64736f6c63430008120033000000000000000000000000b5b12fe8f4eed7959cecf3ca8f9feccc0d0942a1
Deployed Bytecode
0x6080604052600436106101e35760003560e01c8063715018a611610102578063a6c56c7911610095578063d1d18f5011610064578063d1d18f5014610679578063d8c718a8146106b6578063e985e9c5146106df578063f2fde38b1461071c576101e3565b8063a6c56c79146105de578063b88d4fde14610609578063b8be6e9814610625578063c87b56dd1461063c576101e3565b80639659867e116100d15780639659867e14610543578063a035b1fe1461056e578063a0712d6814610599578063a22cb465146105b5576101e3565b8063715018a6146104ad5780637c928fe9146104c45780638da5cb5b146104ed57806395d89b4114610518576101e3565b806323b872dd1161017a57806342842e0e1161014957806342842e0e146103ec5780635375d9fe146104085780636352211e1461043357806370a0823114610470576101e3565b806323b872dd1461036557806325e514c61461038157806337c5fa0d146103aa5780633ccfd60b146103d5576101e3565b80630ff4c916116101b65780630ff4c916146102a957806318160ddd146102e65780631ad3beeb1461031157806321cf7ecf1461033a576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190613a29565b610745565b60405161021c9190613a71565b60405180910390f35b34801561023157600080fd5b5061023a6107d7565b6040516102479190613b1c565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190613b74565b610869565b6040516102849190613be2565b60405180910390f35b6102a760048036038101906102a29190613c29565b6108e8565b005b3480156102b557600080fd5b506102d060048036038101906102cb9190613b74565b610a2c565b6040516102dd9190613c78565b60405180910390f35b3480156102f257600080fd5b506102fb610a8c565b6040516103089190613c78565b60405180910390f35b34801561031d57600080fd5b5061033860048036038101906103339190613b74565b610aa3565b005b34801561034657600080fd5b5061034f610ab8565b60405161035c9190613c78565b60405180910390f35b61037f600480360381019061037a9190613c93565b610abe565b005b34801561038d57600080fd5b506103a860048036038101906103a39190613e2e565b610de0565b005b3480156103b657600080fd5b506103bf61113d565b6040516103cc9190613a71565b60405180910390f35b3480156103e157600080fd5b506103ea611150565b005b61040660048036038101906104019190613c93565b611198565b005b34801561041457600080fd5b5061041d6111b8565b60405161042a9190613ed6565b60405180910390f35b34801561043f57600080fd5b5061045a60048036038101906104559190613b74565b6111de565b6040516104679190613be2565b60405180910390f35b34801561047c57600080fd5b5061049760048036038101906104929190613ef1565b6111f0565b6040516104a49190613c78565b60405180910390f35b3480156104b957600080fd5b506104c26112a8565b005b3480156104d057600080fd5b506104eb60048036038101906104e69190613b74565b6112bc565b005b3480156104f957600080fd5b506105026113a1565b60405161050f9190613be2565b60405180910390f35b34801561052457600080fd5b5061052d6113cb565b60405161053a9190613b1c565b60405180910390f35b34801561054f57600080fd5b5061055861145d565b6040516105659190613c78565b60405180910390f35b34801561057a57600080fd5b5061058361146c565b6040516105909190613c78565b60405180910390f35b6105b360048036038101906105ae9190613b74565b611472565b005b3480156105c157600080fd5b506105dc60048036038101906105d79190613f4a565b6114cf565b005b3480156105ea57600080fd5b506105f36115da565b6040516106009190613c78565b60405180910390f35b610623600480360381019061061e919061403f565b6115ec565b005b34801561063157600080fd5b5061063a61165f565b005b34801561064857600080fd5b50610663600480360381019061065e9190613b74565b611693565b6040516106709190613b1c565b60405180910390f35b34801561068557600080fd5b506106a0600480360381019061069b9190613ef1565b61181d565b6040516106ad9190613c78565b60405180910390f35b3480156106c257600080fd5b506106dd60048036038101906106d8919061411d565b611866565b005b3480156106eb57600080fd5b506107066004803603810190610701919061417d565b611900565b6040516107139190613a71565b60405180910390f35b34801561072857600080fd5b50610743600480360381019061073e9190613ef1565b611994565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107a057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107d05750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546107e6906141ec565b80601f0160208091040260200160405190810160405280929190818152602001828054610812906141ec565b801561085f5780601f106108345761010080835404028352916020019161085f565b820191906000526020600020905b81548152906001019060200180831161084257829003601f168201915b5050505050905090565b600061087482611a17565b6108aa576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108f3826111de565b90508073ffffffffffffffffffffffffffffffffffffffff16610914611a76565b73ffffffffffffffffffffffffffffffffffffffff1614610977576109408161093b611a76565b611900565b610976576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a3782611a17565b610a445760009050610a87565b6000600d6000848152602001908152602001600020541115610a7b57600d6000838152602001908152602001600020549050610a87565b610a8482611a7e565b90505b919050565b6000610a96611ada565b6001546000540303905090565b610aab611ae3565b610ab53382611b61565b50565b600b5481565b6000610ac982611cad565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b30576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b3c84611d79565b91509150610b528187610b4d611a76565b611da0565b610b9e57610b6786610b62611a76565b611900565b610b9d576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610c04576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c118686866001611de4565b8015610c1c57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610cea85610cc6888887611dea565b7c020000000000000000000000000000000000000000000000000000000017611e12565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610d705760006001850190506000600460008381526020019081526020016000205403610d6e576000548114610d6d578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610dd88686866001611e3d565b505050505050565b600a60009054906101000a900460ff16610e2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2690614269565b60405180910390fd5b600080600090505b8251811015610f13573373ffffffffffffffffffffffffffffffffffffffff16610e7a848381518110610e6d57610e6c614289565b5b60200260200101516111de565b73ffffffffffffffffffffffffffffffffffffffff1614610ed0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec790614304565b60405180910390fd5b610ef3838281518110610ee657610ee5614289565b5b6020026020010151610a2c565b82610efe9190614353565b91508080610f0b90614387565b915050610e37565b5064496cebb7ff811115610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5390614441565b60405180910390fd5b6000600190505b825181101561105957610f8f838281518110610f8257610f81614289565b5b6020026020010151611e43565b6000600d6000858481518110610fa857610fa7614289565b5b60200260200101518152602001908152602001600020819055506000600e6000858481518110610fdb57610fda614289565b5b60200260200101518152602001908152602001600020819055507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce783828151811061102957611028614289565b5b602002602001015160405161103e9190613c78565b60405180910390a1808061105190614387565b915050610f63565b5080600d60008460008151811061107357611072614289565b5b60200260200101518152602001908152602001600020819055506110b5826000815181106110a4576110a3614289565b5b602002602001015160016004611e51565b600e6000846000815181106110cd576110cc614289565b5b60200260200101518152602001908152602001600020819055507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78260008151811061111c5761111b614289565b5b60200260200101516040516111319190613c78565b60405180910390a15050565b600a60009054906101000a900460ff1681565b611158611ae3565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061119657600080fd5b565b6111b3838383604051806020016040528060008152506115ec565b505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006111e982611cad565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611257576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6112b0611ae3565b6112ba6000611ec5565b565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561133e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611335906144ad565b60405180910390fd5b6113483382611b61565b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461139791906144cd565b9250508190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546113da906141ec565b80601f0160208091040260200160405190810160405280929190818152602001828054611406906141ec565b80156114535780601f1061142857610100808354040283529160200191611453565b820191906000526020600020905b81548152906001019060200180831161143657829003601f168201915b5050505050905090565b6000611467611f8b565b905090565b60095481565b600954816114809190614501565b3410156114c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b99061458f565b60405180910390fd5b6114cc3382611b61565b50565b80600760006114dc611a76565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611589611a76565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115ce9190613a71565b60405180910390a35050565b60006115e7600b54611f9e565b905090565b6115f7848484610abe565b60008373ffffffffffffffffffffffffffffffffffffffff163b146116595761162284848484611fd9565b611658576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611667611ae3565b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b60606000806000600d60008681526020019081526020016000205411156116d357600d60008581526020019081526020016000205490506000915061175f565b6000600d6000868152602001908152602001600020541480156116fc57506116fa84611a17565b155b1561170e57600090506001915061175e565b6003841161174d576001840361172b57640757b12c009050611748565b6002840361173f5763bbf81e009050611747565b6312cc030090505b5b611759565b61175684611a7e565b90505b600091505b5b6118148482600e60008881526020019081526020016000205485600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ae8d1506040518163ffffffff1660e01b8152600401600060405180830381865afa1580156117e6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061180f919061461f565b612129565b92505050919050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61186e611ae3565b60005b838390508110156118fa5781600f600086868581811061189457611893614289565b5b90506020020160208101906118a99190613ef1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806118f290614387565b915050611871565b50505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61199c611ae3565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a02906146da565b60405180910390fd5b611a1481611ec5565b50565b600081611a22611ada565b11158015611a31575060005482105b8015611a6f575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006113888211611aa157611a9a82620151806236ee80612284565b9050611ad5565b611f408211611ac157611aba8261a8c0621b7740612284565b9050611ad4565b611ad182615460620dbba0612284565b90505b5b919050565b60006001905090565b611aeb6122e6565b73ffffffffffffffffffffffffffffffffffffffff16611b096113a1565b73ffffffffffffffffffffffffffffffffffffffff1614611b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5690614746565b60405180910390fd5b565b6000611b6b611f8b565b90506113888110611c3a576000611b83600b546122ee565b11611bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bba906147b2565b60405180910390fd5b611f4081108015611be15750611f408282611bde9190614353565b10155b15611c35576201518042611bf59190614353565b600b819055507ff5b316bf09d21e0058eb23be118a6b81bd52674b4cb843e0f446b986ce22433e600b54604051611c2c9190613c78565b60405180910390a15b611c9e565b6113888282611c499190614353565b10611c9d576201518042611c5d9190614353565b600b819055507ff5b316bf09d21e0058eb23be118a6b81bd52674b4cb843e0f446b986ce22433e600b54604051611c949190613c78565b60405180910390a15b5b611ca88383612314565b505050565b60008082905080611cbc611ada565b11611d4257600054811015611d415760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611d3f575b60008103611d35576004600083600190039350838152602001908152602001600020549050611d0b565b8092505050611d74565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611e018686846124cf565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611e4e8160006124d8565b50565b6000808383611e6091906144cd565b90506001816107e787611e739190614353565b604051602001611e8391906147f3565b6040516020818303038152906040528051906020012060001c611ea6919061483d565b84611eb191906144cd565b611ebb91906144cd565b9150509392505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000611f95611ada565b60005403905090565b6000603c611fab836122ee565b10611fcf57603c4283611fbe91906144cd565b611fc8919061486e565b9050611fd4565b600090505b919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611fff611a76565b8786866040518563ffffffff1660e01b815260040161202194939291906148f4565b6020604051808303816000875af192505050801561205d57506040513d601f19601f8201168201806040525081019061205a9190614955565b60015b6120d6573d806000811461208d576040519150601f19603f3d011682016040523d82523d6000602084013e612092565b606091505b5060008151036120ce576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000612137878661272a565b9050606084156121845761214a88612811565b61215d612158898588612999565b612dee565b60405160200161216e929190614b3a565b604051602081830303815290604052905061224f565b61218d88612811565b61219688612811565b6121a76121a28b612f51565b612811565b6121b089612f82565b6121d1866000600381106121c7576121c6614289565b5b6020020151612811565b6121f2876001600381106121e8576121e7614289565b5b6020020151612811565b6122138860026003811061220957612208614289565b5b6020020151612811565b6122266122218f8b8e612999565b612dee565b60405160200161223d989796959493929190614e9d565b60405160208183030381529060405290505b61225881612dee565b6040516020016122689190614fbe565b6040516020818303038152906040529250505095945050505050565b6000826001848461229591906144cd565b61229f9190614353565b856040516020016122b091906147f3565b6040516020818303038152906040528051906020012060001c6122d3919061483d565b6122dd9190614353565b90509392505050565b600033905090565b600081421161230a57428261230391906144cd565b905061230f565b600090505b919050565b60008054905060008203612354576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123616000848385611de4565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506123d8836123c96000866000611dea565b6123d28561309d565b17611e12565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461247957808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061243e565b50600082036124b4576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506124ca6000848385611e3d565b505050565b60009392505050565b60006124e383611cad565b905060008190506000806124f686611d79565b91509150841561255f57612512818461250d611a76565b611da0565b61255e5761252783612522611a76565b611900565b61255d576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b61256d836000886001611de4565b801561257857600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612620836125dd85600088611dea565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717611e12565b600460008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036126a657600060018701905060006004600083815260200190815260200160002054036126a45760005481146126a3578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612710836000886001611e3d565b600160008154809291906001019190505550505050505050565b612732613978565b60008211156127cc5760005b60038110156127c6576001816127549190614353565b830361277d5760ff82826003811061276f5761276e614289565b5b6020020181815250506127b3565b612796818561278c9190614353565b6000610100611e51565b8282600381106127a9576127a8614289565b5b6020020181815250505b80806127be90614387565b91505061273e565b5061280b565b60005b60038110156128095760ff8282600381106127ed576127ec614289565b5b602002018181525050808061280190614387565b9150506127cf565b505b92915050565b606060008203612858576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612994565b600082905060005b6000821461288a57808061287390614387565b915050600a82612883919061486e565b9150612860565b60008167ffffffffffffffff8111156128a6576128a5613ceb565b5b6040519080825280601f01601f1916602001820160405280156128d85781602001600182028036833780820191505090505b50905060008290505b6000861461298c576001816128f691906144cd565b90506000600a8088612908919061486e565b6129129190614501565b8761291d91906144cd565b60306129299190614fed565b905060008160f81b90508084848151811061294757612946614289565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a88612983919061486e565b975050506128e1565b819450505050505b919050565b606081905060006129c1846000600381106129b7576129b6614289565b5b6020020151612811565b6129e2856001600381106129d8576129d7614289565b5b6020020151612811565b612a03866002600381106129f9576129f8614289565b5b6020020151612811565b604051602001612a15939291906150ba565b60405160208183030381529060405290506000612a31866130ad565b905081612a576000836000600d8110612a4d57612a4c614289565b5b60200201516136fb565b604051602001612a68929190615117565b604051602081830303815290604052915081612a9d6001836001600d8110612a9357612a92614289565b5b60200201516136fb565b604051602001612aae929190615117565b604051602081830303815290604052915081612ae36002836002600d8110612ad957612ad8614289565b5b60200201516136fb565b604051602001612af4929190615117565b604051602081830303815290604052915081612b296003836003600d8110612b1f57612b1e614289565b5b60200201516136fb565b604051602001612b3a929190615117565b604051602081830303815290604052915081612b6f6004836004600d8110612b6557612b64614289565b5b60200201516136fb565b604051602001612b80929190615117565b604051602081830303815290604052915081612bb56005836005600d8110612bab57612baa614289565b5b60200201516136fb565b604051602001612bc6929190615117565b604051602081830303815290604052915081612bfb6006836006600d8110612bf157612bf0614289565b5b60200201516136fb565b604051602001612c0c929190615117565b604051602081830303815290604052915081612c416007836007600d8110612c3757612c36614289565b5b60200201516136fb565b604051602001612c52929190615117565b604051602081830303815290604052915081612c876008836008600d8110612c7d57612c7c614289565b5b60200201516136fb565b604051602001612c98929190615117565b604051602081830303815290604052915081612ccd6009836009600d8110612cc357612cc2614289565b5b60200201516136fb565b604051602001612cde929190615117565b604051602081830303815290604052915081612d13600a83600a600d8110612d0957612d08614289565b5b60200201516136fb565b604051602001612d24929190615117565b604051602081830303815290604052915081612d59600b83600b600d8110612d4f57612d4e614289565b5b60200201516136fb565b604051602001612d6a929190615117565b604051602081830303815290604052915081612d9f600c83600c600d8110612d9557612d94614289565b5b60200201516136fb565b604051602001612db0929190615117565b60405160208183030381529060405291508282604051602001612dd4929190615187565b604051602081830303815290604052925050509392505050565b60606000825103612e1057604051806020016040528060008152509050612f4c565b6000604051806060016040528060408152602001615b7a6040913990506000600360028551612e3f9190614353565b612e49919061486e565b6004612e559190614501565b67ffffffffffffffff811115612e6e57612e6d613ceb565b5b6040519080825280601f01601f191660200182016040528015612ea05781602001600182028036833780820191505090505b509050600182016020820185865187015b80821015612f0c576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845360018401935050612eb1565b5050600386510660018114612f285760028114612f3b57612f43565b603d6001830353603d6002830353612f43565b603d60018303535b50505080925050505b919050565b60006113888211612f655760019050612f7d565b611f408211612f775760029050612f7c565b600390505b5b919050565b6060600060405180608001604052806040518060400160405280600581526020017f576869746500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f526564000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f477265656e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f426c75650000000000000000000000000000000000000000000000000000000081525081525090508083600481106130905761308f614289565b5b6020020151915050919050565b60006001821460e11b9050919050565b6130b561399a565b60006301e13380836130c7919061486e565b90506301e13380816130d99190614501565b836130e491906144cd565b9250600062093a80846130f7919061486e565b905062093a80816131089190614501565b8461311391906144cd565b935060006201518085613126919061486e565b905062015180816131379190614501565b8561314291906144cd565b94506000610e1086613154919061486e565b9050610e10816131649190614501565b8661316f91906144cd565b95506000603c87613180919061486e565b9050603c8161318f9190614501565b8761319a91906144cd565b96506000879050600a86101561322a576000876000600d81106131c0576131bf614289565b5b6020020181815250506000876001600d81106131df576131de614289565b5b6020020181815250506000876002600d81106131fe576131fd614289565b5b60200201818152505085876003600d811061321c5761321b614289565b5b602002018181525050613452565b60648610156132ca576000876000600d811061324957613248614289565b5b6020020181815250506000876001600d811061326857613267614289565b5b602002018181525050600a8661327e919061486e565b876002600d811061329257613291614289565b5b602002018181525050600a866132a8919061483d565b876003600d81106132bc576132bb614289565b5b602002018181525050613451565b6103e8861015613382576000876000600d81106132ea576132e9614289565b5b602002018181525050606486613300919061486e565b876001600d811061331457613313614289565b5b602002018181525050600a60648761332c919061483d565b613336919061486e565b876002600d811061334a57613349614289565b5b602002018181525050600a86613360919061483d565b876003600d811061337457613373614289565b5b602002018181525050613450565b61271086101561344f576103e88661339a919061486e565b876000600d81106133ae576133ad614289565b5b60200201818152505060646103e8876133c7919061483d565b6133d1919061486e565b876001600d81106133e5576133e4614289565b5b602002018181525050600a6064876133fd919061483d565b613407919061486e565b876002600d811061341b5761341a614289565b5b602002018181525050600a86613431919061483d565b876003600d811061344557613444614289565b5b6020020181815250505b5b5b5b600a85101561349d576000876004600d811061347157613470614289565b5b60200201818152505084876005600d811061348f5761348e614289565b5b6020020181815250506134f2565b600a856134aa919061486e565b876004600d81106134be576134bd614289565b5b602002018181525050600a856134d4919061483d565b876005600d81106134e8576134e7614289565b5b6020020181815250505b83876006600d811061350757613506614289565b5b602002018181525050600a83101561355b576000876007600d811061352f5761352e614289565b5b60200201818152505082876008600d811061354d5761354c614289565b5b6020020181815250506135b0565b600a83613568919061486e565b876007600d811061357c5761357b614289565b5b602002018181525050600a83613592919061483d565b876008600d81106135a6576135a5614289565b5b6020020181815250505b600a8210156135fb576000876009600d81106135cf576135ce614289565b5b6020020181815250508187600a600d81106135ed576135ec614289565b5b602002018181525050613650565b600a82613608919061486e565b876009600d811061361c5761361b614289565b5b602002018181525050600a82613632919061483d565b87600a600d811061364657613645614289565b5b6020020181815250505b600a81101561369b57600087600b600d811061366f5761366e614289565b5b6020020181815250508087600c600d811061368d5761368c614289565b5b6020020181815250506136f0565b600a816136a8919061486e565b87600b600d81106136bc576136bb614289565b5b602002018181525050600a816136d2919061483d565b87600c600d81106136e6576136e5614289565b5b6020020181815250505b505050505050919050565b6060600061370884612811565b9050600083036137445780818283848560405160200161372d969594939291906153ca565b604051602081830303815290604052915050613972565b6001830361377657808160405160200161375f9291906154f2565b604051602081830303815290604052915050613972565b600283036137ae57808182838460405160200161379795949392919061558e565b604051602081830303815290604052915050613972565b600383036137e65780818283846040516020016137cf959493929190615647565b604051602081830303815290604052915050613972565b6004830361381c57808182836040516020016138059493929190615700565b604051602081830303815290604052915050613972565b6005830361385457808182838460405160200161383d959493929190615796565b604051602081830303815290604052915050613972565b6006830361388e578081828384856040516020016138779695949392919061584f565b604051602081830303815290604052915050613972565b600783036138c2578081826040516020016138ab9392919061592b565b604051602081830303815290604052915050613972565b600883036138fe57808182838485866040516020016138e7979695949392919061599e565b604051602081830303815290604052915050613972565b600983036139385780818283848560405160200161392196959493929190615a9d565b604051602081830303815290604052915050613972565b6040518060400160405280600581526020017f6572726f720000000000000000000000000000000000000000000000000000008152509150505b92915050565b6040518060600160405280600390602082028036833780820191505090505090565b604051806101a00160405280600d90602082028036833780820191505090505090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a06816139d1565b8114613a1157600080fd5b50565b600081359050613a23816139fd565b92915050565b600060208284031215613a3f57613a3e6139c7565b5b6000613a4d84828501613a14565b91505092915050565b60008115159050919050565b613a6b81613a56565b82525050565b6000602082019050613a866000830184613a62565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ac6578082015181840152602081019050613aab565b60008484015250505050565b6000601f19601f8301169050919050565b6000613aee82613a8c565b613af88185613a97565b9350613b08818560208601613aa8565b613b1181613ad2565b840191505092915050565b60006020820190508181036000830152613b368184613ae3565b905092915050565b6000819050919050565b613b5181613b3e565b8114613b5c57600080fd5b50565b600081359050613b6e81613b48565b92915050565b600060208284031215613b8a57613b896139c7565b5b6000613b9884828501613b5f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bcc82613ba1565b9050919050565b613bdc81613bc1565b82525050565b6000602082019050613bf76000830184613bd3565b92915050565b613c0681613bc1565b8114613c1157600080fd5b50565b600081359050613c2381613bfd565b92915050565b60008060408385031215613c4057613c3f6139c7565b5b6000613c4e85828601613c14565b9250506020613c5f85828601613b5f565b9150509250929050565b613c7281613b3e565b82525050565b6000602082019050613c8d6000830184613c69565b92915050565b600080600060608486031215613cac57613cab6139c7565b5b6000613cba86828701613c14565b9350506020613ccb86828701613c14565b9250506040613cdc86828701613b5f565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d2382613ad2565b810181811067ffffffffffffffff82111715613d4257613d41613ceb565b5b80604052505050565b6000613d556139bd565b9050613d618282613d1a565b919050565b600067ffffffffffffffff821115613d8157613d80613ceb565b5b602082029050602081019050919050565b600080fd5b6000613daa613da584613d66565b613d4b565b90508083825260208201905060208402830185811115613dcd57613dcc613d92565b5b835b81811015613df65780613de28882613b5f565b845260208401935050602081019050613dcf565b5050509392505050565b600082601f830112613e1557613e14613ce6565b5b8135613e25848260208601613d97565b91505092915050565b600060208284031215613e4457613e436139c7565b5b600082013567ffffffffffffffff811115613e6257613e616139cc565b5b613e6e84828501613e00565b91505092915050565b6000819050919050565b6000613e9c613e97613e9284613ba1565b613e77565b613ba1565b9050919050565b6000613eae82613e81565b9050919050565b6000613ec082613ea3565b9050919050565b613ed081613eb5565b82525050565b6000602082019050613eeb6000830184613ec7565b92915050565b600060208284031215613f0757613f066139c7565b5b6000613f1584828501613c14565b91505092915050565b613f2781613a56565b8114613f3257600080fd5b50565b600081359050613f4481613f1e565b92915050565b60008060408385031215613f6157613f606139c7565b5b6000613f6f85828601613c14565b9250506020613f8085828601613f35565b9150509250929050565b600080fd5b600067ffffffffffffffff821115613faa57613fa9613ceb565b5b613fb382613ad2565b9050602081019050919050565b82818337600083830152505050565b6000613fe2613fdd84613f8f565b613d4b565b905082815260208101848484011115613ffe57613ffd613f8a565b5b614009848285613fc0565b509392505050565b600082601f83011261402657614025613ce6565b5b8135614036848260208601613fcf565b91505092915050565b60008060008060808587031215614059576140586139c7565b5b600061406787828801613c14565b945050602061407887828801613c14565b935050604061408987828801613b5f565b925050606085013567ffffffffffffffff8111156140aa576140a96139cc565b5b6140b687828801614011565b91505092959194509250565b600080fd5b60008083601f8401126140dd576140dc613ce6565b5b8235905067ffffffffffffffff8111156140fa576140f96140c2565b5b60208301915083602082028301111561411657614115613d92565b5b9250929050565b600080600060408486031215614136576141356139c7565b5b600084013567ffffffffffffffff811115614154576141536139cc565b5b614160868287016140c7565b9350935050602061417386828701613b5f565b9150509250925092565b60008060408385031215614194576141936139c7565b5b60006141a285828601613c14565b92505060206141b385828601613c14565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061420457607f821691505b602082108103614217576142166141bd565b5b50919050565b7f636f6d62696e696e67206e6f7420616374697665000000000000000000000000600082015250565b6000614253601483613a97565b915061425e8261421d565b602082019050919050565b6000602082019050818103600083015261428281614246565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f6d757374206f776e20616c6c20746f6b656e7300000000000000000000000000600082015250565b60006142ee601383613a97565b91506142f9826142b8565b602082019050919050565b6000602082019050818103600083015261431d816142e1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061435e82613b3e565b915061436983613b3e565b925082820190508082111561438157614380614324565b5b92915050565b600061439282613b3e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143c4576143c3614324565b5b600182019050919050565b7f73756d206d75737420626520393939393a35323a303a32333a35393a3539206f60008201527f72206c6573730000000000000000000000000000000000000000000000000000602082015250565b600061442b602683613a97565b9150614436826143cf565b604082019050919050565b6000602082019050818103600083015261445a8161441e565b9050919050565b7f6e6f7420656e6f7567682066726565206d696e74730000000000000000000000600082015250565b6000614497601583613a97565b91506144a282614461565b602082019050919050565b600060208201905081810360008301526144c68161448a565b9050919050565b60006144d882613b3e565b91506144e383613b3e565b92508282039050818111156144fb576144fa614324565b5b92915050565b600061450c82613b3e565b915061451783613b3e565b925082820261452581613b3e565b9150828204841483151761453c5761453b614324565b5b5092915050565b7f6e6f7420656e6f75676820657468000000000000000000000000000000000000600082015250565b6000614579600e83613a97565b915061458482614543565b602082019050919050565b600060208201905081810360008301526145a88161456c565b9050919050565b60006145c26145bd84613f8f565b613d4b565b9050828152602081018484840111156145de576145dd613f8a565b5b6145e9848285613aa8565b509392505050565b600082601f83011261460657614605613ce6565b5b81516146168482602086016145af565b91505092915050565b600060208284031215614635576146346139c7565b5b600082015167ffffffffffffffff811115614653576146526139cc565b5b61465f848285016145f1565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146c4602683613a97565b91506146cf82614668565b604082019050919050565b600060208201905081810360008301526146f3816146b7565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614730602083613a97565b915061473b826146fa565b602082019050919050565b6000602082019050818103600083015261475f81614723565b9050919050565b7f6d696e7420697320636c6f736564000000000000000000000000000000000000600082015250565b600061479c600e83613a97565b91506147a782614766565b602082019050919050565b600060208201905081810360008301526147cb8161478f565b9050919050565b6000819050919050565b6147ed6147e882613b3e565b6147d2565b82525050565b60006147ff82846147dc565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061484882613b3e565b915061485383613b3e565b9250826148635761486261480e565b5b828206905092915050565b600061487982613b3e565b915061488483613b3e565b9250826148945761489361480e565b5b828204905092915050565b600081519050919050565b600082825260208201905092915050565b60006148c68261489f565b6148d081856148aa565b93506148e0818560208601613aa8565b6148e981613ad2565b840191505092915050565b60006080820190506149096000830187613bd3565b6149166020830186613bd3565b6149236040830185613c69565b818103606083015261493581846148bb565b905095945050505050565b60008151905061494f816139fd565b92915050565b60006020828403121561496b5761496a6139c7565b5b600061497984828501614940565b91505092915050565b600081905092915050565b7f7b226e616d65223a202254494d45200000000000000000000000000000000000600082015250565b60006149c3600f83614982565b91506149ce8261498d565b600f82019050919050565b60006149e482613a8c565b6149ee8185614982565b93506149fe818560208601613aa8565b80840191505092915050565b7f205b4255524e45445d222c20226465736372697074696f6e223a202254696d6560008201527f2069732074686520756c74696d6174652063757272656e63792e222c2022617460208201527f7472696275746573223a5b7b2274726169745f74797065223a20224275726e6560408201527f64222c202276616c7565223a2022596573227d5d2c2022696d616765223a202260608201527f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000608082015250565b6000614ad8609a83614982565b9150614ae382614a0a565b609a82019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b6000614b24600283614982565b9150614b2f82614aee565b600282019050919050565b6000614b45826149b6565b9150614b5182856149d9565b9150614b5c82614acb565b9150614b6882846149d9565b9150614b7382614b17565b91508190509392505050565b7f222c20226465736372697074696f6e223a202254696d6520697320746865207560008201527f6c74696d6174652063757272656e63792e222c2022617474726962757465732260208201527f3a5b7b2274726169745f74797065223a202242616c616e6365222c20226d617860408201527f5f76616c7565223a203331353335393939393939392c202276616c7565223a20606082015250565b6000614c27608083614982565b9150614c3282614b7f565b608082019050919050565b7f7d2c7b22646973706c61795f74797065223a20226e756d626572222c2022747260008201527f6169745f74797065223a20224d696e74205068617365222c202276616c75652260208201527f3a20000000000000000000000000000000000000000000000000000000000000604082015250565b6000614cbf604283614982565b9150614cca82614c3d565b604282019050919050565b7f7d2c7b2274726169745f74797065223a20224275726e6564222c202276616c7560008201527f65223a20224e6f227d2c7b2274726169745f74797065223a202242617365204360208201527f6f6c6f72222c202276616c7565223a2022000000000000000000000000000000604082015250565b6000614d57605183614982565b9150614d6282614cd5565b605182019050919050565b7f227d2c7b2274726169745f74797065223a2022436f6c6f72222c202276616c7560008201527f65223a2022524742280000000000000000000000000000000000000000000000602082015250565b6000614dc9602983614982565b9150614dd482614d6d565b602982019050919050565b7f2c00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614e15600183614982565b9150614e2082614ddf565b600182019050919050565b7f29227d5d2c2022696d616765223a2022646174613a696d6167652f7376672b7860008201527f6d6c3b6261736536342c00000000000000000000000000000000000000000000602082015250565b6000614e87602a83614982565b9150614e9282614e2b565b602a82019050919050565b6000614ea8826149b6565b9150614eb4828b6149d9565b9150614ebf82614c1a565b9150614ecb828a6149d9565b9150614ed682614cb2565b9150614ee282896149d9565b9150614eed82614d4a565b9150614ef982886149d9565b9150614f0482614dbc565b9150614f1082876149d9565b9150614f1b82614e08565b9150614f2782866149d9565b9150614f3282614e08565b9150614f3e82856149d9565b9150614f4982614e7a565b9150614f5582846149d9565b9150614f6082614b17565b91508190509998505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b6000614fa8601d83614982565b9150614fb382614f72565b601d82019050919050565b6000614fc982614f9b565b9150614fd582846149d9565b915081905092915050565b600060ff82169050919050565b6000614ff882614fe0565b915061500383614fe0565b9250828201905060ff81111561501c5761501b614324565b5b92915050565b7f706174685b69645e3d2770275d7b66696c6c3a72676228000000000000000000600082015250565b6000615058601783614982565b915061506382615022565b601782019050919050565b7f297d2362677b66696c6c3a233043304330437d00000000000000000000000000600082015250565b60006150a4601383614982565b91506150af8261506e565b601382019050919050565b60006150c58261504b565b91506150d182866149d9565b91506150dc82614e08565b91506150e882856149d9565b91506150f382614e08565b91506150ff82846149d9565b915061510a82615097565b9150819050949350505050565b600061512382856149d9565b915061512f82846149d9565b91508190509392505050565b7f3c2f7374796c653e3c2f7376673e000000000000000000000000000000000000600082015250565b6000615171600e83614982565b915061517c8261513b565b600e82019050919050565b600061519382856149d9565b915061519f82846149d9565b91506151aa82615164565b91508190509392505050565b7f2370000000000000000000000000000000000000000000000000000000000000600082015250565b60006151ec600283614982565b91506151f7826151b6565b600282019050919050565b7f312c000000000000000000000000000000000000000000000000000000000000600082015250565b6000615238600283614982565b915061524382615202565b600282019050919050565b7f322c000000000000000000000000000000000000000000000000000000000000600082015250565b6000615284600283614982565b915061528f8261524e565b600282019050919050565b7f332c000000000000000000000000000000000000000000000000000000000000600082015250565b60006152d0600283614982565b91506152db8261529a565b600282019050919050565b7f352c000000000000000000000000000000000000000000000000000000000000600082015250565b600061531c600283614982565b9150615327826152e6565b600282019050919050565b7f362c000000000000000000000000000000000000000000000000000000000000600082015250565b6000615368600283614982565b915061537382615332565b600282019050919050565b7f37207b66696c6c2d6f7061636974793a317d0000000000000000000000000000600082015250565b60006153b4601283614982565b91506153bf8261537e565b601282019050919050565b60006153d5826151df565b91506153e182896149d9565b91506153ec8261522b565b91506153f7826151df565b915061540382886149d9565b915061540e82615277565b9150615419826151df565b915061542582876149d9565b9150615430826152c3565b915061543b826151df565b915061544782866149d9565b91506154528261530f565b915061545d826151df565b915061546982856149d9565b91506154748261535b565b915061547f826151df565b915061548b82846149d9565b9150615496826153a7565b9150819050979650505050505050565b7f36207b66696c6c2d6f7061636974793a317d0000000000000000000000000000600082015250565b60006154dc601283614982565b91506154e7826154a6565b601282019050919050565b60006154fd826151df565b915061550982856149d9565b9150615514826152c3565b915061551f826151df565b915061552b82846149d9565b9150615536826154cf565b91508190509392505050565b7f342c000000000000000000000000000000000000000000000000000000000000600082015250565b6000615578600283614982565b915061558382615542565b600282019050919050565b6000615599826151df565b91506155a582886149d9565b91506155b08261522b565b91506155bb826151df565b91506155c782876149d9565b91506155d2826152c3565b91506155dd826151df565b91506155e982866149d9565b91506155f48261556b565b91506155ff826151df565b915061560b82856149d9565b91506156168261530f565b9150615621826151df565b915061562d82846149d9565b9150615638826153a7565b91508190509695505050505050565b6000615652826151df565b915061565e82886149d9565b91506156698261522b565b9150615674826151df565b915061568082876149d9565b915061568b826152c3565b9150615696826151df565b91506156a282866149d9565b91506156ad8261556b565b91506156b8826151df565b91506156c482856149d9565b91506156cf8261535b565b91506156da826151df565b91506156e682846149d9565b91506156f1826153a7565b91508190509695505050505050565b600061570b826151df565b915061571782876149d9565b915061572282615277565b915061572d826151df565b915061573982866149d9565b9150615744826152c3565b915061574f826151df565b915061575b82856149d9565b91506157668261556b565b9150615771826151df565b915061577d82846149d9565b9150615788826154cf565b915081905095945050505050565b60006157a1826151df565b91506157ad82886149d9565b91506157b88261522b565b91506157c3826151df565b91506157cf82876149d9565b91506157da82615277565b91506157e5826151df565b91506157f182866149d9565b91506157fc8261556b565b9150615807826151df565b915061581382856149d9565b915061581e8261535b565b9150615829826151df565b915061583582846149d9565b9150615840826153a7565b91508190509695505050505050565b600061585a826151df565b915061586682896149d9565b91506158718261522b565b915061587c826151df565b915061588882886149d9565b915061589382615277565b915061589e826151df565b91506158aa82876149d9565b91506158b58261556b565b91506158c0826151df565b91506158cc82866149d9565b91506158d78261530f565b91506158e2826151df565b91506158ee82856149d9565b91506158f98261535b565b9150615904826151df565b915061591082846149d9565b915061591b826153a7565b9150819050979650505050505050565b6000615936826151df565b915061594282866149d9565b915061594d8261522b565b9150615958826151df565b915061596482856149d9565b915061596f826152c3565b915061597a826151df565b915061598682846149d9565b9150615991826154cf565b9150819050949350505050565b60006159a9826151df565b91506159b5828a6149d9565b91506159c08261522b565b91506159cb826151df565b91506159d782896149d9565b91506159e282615277565b91506159ed826151df565b91506159f982886149d9565b9150615a04826152c3565b9150615a0f826151df565b9150615a1b82876149d9565b9150615a268261556b565b9150615a31826151df565b9150615a3d82866149d9565b9150615a488261530f565b9150615a53826151df565b9150615a5f82856149d9565b9150615a6a8261535b565b9150615a75826151df565b9150615a8182846149d9565b9150615a8c826153a7565b915081905098975050505050505050565b6000615aa8826151df565b9150615ab482896149d9565b9150615abf8261522b565b9150615aca826151df565b9150615ad682886149d9565b9150615ae182615277565b9150615aec826151df565b9150615af882876149d9565b9150615b03826152c3565b9150615b0e826151df565b9150615b1a82866149d9565b9150615b258261556b565b9150615b30826151df565b9150615b3c82856149d9565b9150615b478261535b565b9150615b52826151df565b9150615b5e82846149d9565b9150615b69826153a7565b915081905097965050505050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220bf72455ed2e269244f6346932f54a18403e17f250f58cd2c25513078a5bd27ed64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b5b12fe8f4eed7959cecf3ca8f9feccc0d0942a1
-----Decoded View---------------
Arg [0] : _address (address): 0xb5b12Fe8f4EED7959cecF3Ca8F9fECCC0d0942a1
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000b5b12fe8f4eed7959cecf3ca8f9feccc0d0942a1
Deployed Bytecode Sourcemap
192:4717:7:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9410:639:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10312:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16803:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16236:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2621:288:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6063:323:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4803:103:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;404:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20442:2825:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1772:841:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;365:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4351:114;;;;;;;;;;;;;:::i;:::-;;23363:193:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;442:24:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11705:152:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7247:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1884:103:5;;;;;;;;;;;;;:::i;:::-;;896:213:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1236:87:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10488:104:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4155:88:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;311:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;726:162;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17361:234:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4022:125:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24154:407:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4251:92:7;;;;;;;;;;;;;:::i;:::-;;2917:988;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4473:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4588:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17752:164:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2142:201:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9410:639:2;9495:4;9834:10;9819:25;;:11;:25;;;;:102;;;;9911:10;9896:25;;:11;:25;;;;9819:102;:179;;;;9988:10;9973:25;;:11;:25;;;;9819:179;9799:199;;9410:639;;;:::o;10312:100::-;10366:13;10399:5;10392:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10312:100;:::o;16803:218::-;16879:7;16904:16;16912:7;16904;:16::i;:::-;16899:64;;16929:34;;;;;;;;;;;;;;16899:64;16983:15;:24;16999:7;16983:24;;;;;;;;;;;:30;;;;;;;;;;;;16976:37;;16803:218;;;:::o;16236:408::-;16325:13;16341:16;16349:7;16341;:16::i;:::-;16325:32;;16397:5;16374:28;;:19;:17;:19::i;:::-;:28;;;16370:175;;16422:44;16439:5;16446:19;:17;:19::i;:::-;16422:16;:44::i;:::-;16417:128;;16494:35;;;;;;;;;;;;;;16417:128;16370:175;16590:2;16557:15;:24;16573:7;16557:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;16628:7;16624:2;16608:28;;16617:5;16608:28;;;;;;;;;;;;16314:330;16236:408;;:::o;2621:288:7:-;2677:4;2699:16;2707:7;2699;:16::i;:::-;2694:208;;2739:1;2732:8;;;;2694:208;2783:1;2762:9;:18;2772:7;2762:18;;;;;;;;;;;;:22;2758:144;;;2808:9;:18;2818:7;2808:18;;;;;;;;;;;;2801:25;;;;2758:144;2866:24;2882:7;2866:15;:24::i;:::-;2859:31;;2621:288;;;;:::o;6063:323:2:-;6124:7;6352:15;:13;:15::i;:::-;6337:12;;6321:13;;:28;:46;6314:53;;6063:323;:::o;4803:103:7:-;1122:13:5;:11;:13::i;:::-;4866:32:7::1;4877:10;4889:8;4866:10;:32::i;:::-;4803:103:::0;:::o;404:29::-;;;;:::o;20442:2825:2:-;20584:27;20614;20633:7;20614:18;:27::i;:::-;20584:57;;20699:4;20658:45;;20674:19;20658:45;;;20654:86;;20712:28;;;;;;;;;;;;;;20654:86;20754:27;20783:23;20810:35;20837:7;20810:26;:35::i;:::-;20753:92;;;;20945:68;20970:15;20987:4;20993:19;:17;:19::i;:::-;20945:24;:68::i;:::-;20940:180;;21033:43;21050:4;21056:19;:17;:19::i;:::-;21033:16;:43::i;:::-;21028:92;;21085:35;;;;;;;;;;;;;;21028:92;20940:180;21151:1;21137:16;;:2;:16;;;21133:52;;21162:23;;;;;;;;;;;;;;21133:52;21198:43;21220:4;21226:2;21230:7;21239:1;21198:21;:43::i;:::-;21334:15;21331:160;;;21474:1;21453:19;21446:30;21331:160;21871:18;:24;21890:4;21871:24;;;;;;;;;;;;;;;;21869:26;;;;;;;;;;;;21940:18;:22;21959:2;21940:22;;;;;;;;;;;;;;;;21938:24;;;;;;;;;;;22262:146;22299:2;22348:45;22363:4;22369:2;22373:19;22348:14;:45::i;:::-;2462:8;22320:73;22262:18;:146::i;:::-;22233:17;:26;22251:7;22233:26;;;;;;;;;;;:175;;;;22579:1;2462:8;22528:19;:47;:52;22524:627;;22601:19;22633:1;22623:7;:11;22601:33;;22790:1;22756:17;:30;22774:11;22756:30;;;;;;;;;;;;:35;22752:384;;22894:13;;22879:11;:28;22875:242;;23074:19;23041:17;:30;23059:11;23041:30;;;;;;;;;;;:52;;;;22875:242;22752:384;22582:569;22524:627;23198:7;23194:2;23179:27;;23188:4;23179:27;;;;;;;;;;;;23217:42;23238:4;23244:2;23248:7;23257:1;23217:20;:42::i;:::-;20573:2694;;;20442:2825;;;:::o;1772:841:7:-;1837:12;;;;;;;;;;;1829:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;1885:11;1912:6;1921:1;1912:10;;1907:178;1928:6;:13;1924:1;:17;1907:178;;;1993:10;1971:32;;:18;1979:6;1986:1;1979:9;;;;;;;;:::i;:::-;;;;;;;;1971:7;:18::i;:::-;:32;;;1963:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;2054:19;2063:6;2070:1;2063:9;;;;;;;;:::i;:::-;;;;;;;;2054:8;:19::i;:::-;2048:3;:25;;;;:::i;:::-;2042:31;;1943:3;;;;;:::i;:::-;;;;1907:178;;;;2105:12;2099:3;:18;2095:99;;;2134:48;;;;;;;;;;:::i;:::-;;;;;;;;2095:99;2209:6;2218:1;2209:10;;2204:208;2225:6;:13;2221:1;:17;2204:208;;;2260:16;2266:6;2273:1;2266:9;;;;;;;;:::i;:::-;;;;;;;;2260:5;:16::i;:::-;2314:1;2291:9;:20;2301:6;2308:1;2301:9;;;;;;;;:::i;:::-;;;;;;;;2291:20;;;;;;;;;;;:24;;;;2354:1;2330:10;:21;2341:6;2348:1;2341:9;;;;;;;;:::i;:::-;;;;;;;;2330:21;;;;;;;;;;;:25;;;;2375;2390:6;2397:1;2390:9;;;;;;;;:::i;:::-;;;;;;;;2375:25;;;;;;:::i;:::-;;;;;;;;2240:3;;;;;:::i;:::-;;;;2204:208;;;;2497:3;2474:9;:20;2484:6;2491:1;2484:9;;;;;;;;:::i;:::-;;;;;;;;2474:20;;;;;;;;;;;:26;;;;2535:29;2548:6;2555:1;2548:9;;;;;;;;:::i;:::-;;;;;;;;2559:1;2562;2535:12;:29::i;:::-;2511:10;:21;2522:6;2529:1;2522:9;;;;;;;;:::i;:::-;;;;;;;;2511:21;;;;;;;;;;;:53;;;;2580:25;2595:6;2602:1;2595:9;;;;;;;;:::i;:::-;;;;;;;;2580:25;;;;;;:::i;:::-;;;;;;;;1818:795;1772:841;:::o;365:32::-;;;;;;;;;;;;;:::o;4351:114::-;1122:13:5;:11;:13::i;:::-;4417:10:7::1;4409:24;;:47;4434:21;4409:47;;;;;;;;;;;;;;;;;;;;;;;4401:56;;;::::0;::::1;;4351:114::o:0;23363:193:2:-;23509:39;23526:4;23532:2;23536:7;23509:39;;;;;;;;;;;;:16;:39::i;:::-;23363:193;;;:::o;442:24:7:-;;;;;;;;;;;;;:::o;11705:152:2:-;11777:7;11820:27;11839:7;11820:18;:27::i;:::-;11797:52;;11705:152;;;:::o;7247:233::-;7319:7;7360:1;7343:19;;:5;:19;;;7339:60;;7371:28;;;;;;;;;;;;;;7339:60;1406:13;7417:18;:25;7436:5;7417:25;;;;;;;;;;;;;;;;:55;7410:62;;7247:233;;;:::o;1884:103:5:-;1122:13;:11;:13::i;:::-;1949:30:::1;1976:1;1949:18;:30::i;:::-;1884:103::o:0;896:213:7:-;967:9;:21;977:10;967:21;;;;;;;;;;;;;;;;955:8;:33;;947:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;1025:32;1036:10;1048:8;1025:10;:32::i;:::-;1093:8;1068:9;:21;1078:10;1068:21;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;896:213;:::o;1236:87:5:-;1282:7;1309:6;;;;;;;;;;;1302:13;;1236:87;:::o;10488:104:2:-;10544:13;10577:7;10570:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10488:104;:::o;4155:88:7:-;4197:4;4221:14;:12;:14::i;:::-;4214:21;;4155:88;:::o;311:36::-;;;;:::o;726:162::-;813:5;;802:8;:16;;;;:::i;:::-;789:9;:29;;781:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;848:32;859:10;871:8;848:10;:32::i;:::-;726:162;:::o;17361:234:2:-;17508:8;17456:18;:39;17475:19;:17;:19::i;:::-;17456:39;;;;;;;;;;;;;;;:49;17496:8;17456:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;17568:8;17532:55;;17547:19;:17;:19::i;:::-;17532:55;;;17578:8;17532:55;;;;;;:::i;:::-;;;;;;;;17361:234;;:::o;4022:125:7:-;4074:4;4098:41;4121:17;;4098:22;:41::i;:::-;4091:48;;4022:125;:::o;24154:407:2:-;24329:31;24342:4;24348:2;24352:7;24329:12;:31::i;:::-;24393:1;24375:2;:14;;;:19;24371:183;;24414:56;24445:4;24451:2;24455:7;24464:5;24414:30;:56::i;:::-;24409:145;;24498:40;;;;;;;;;;;;;;24409:145;24371:183;24154:407;;;;:::o;4251:92:7:-;1122:13:5;:11;:13::i;:::-;4323:12:7::1;;;;;;;;;;;4322:13;4307:12;;:28;;;;;;;;;;;;;;;;;;4251:92::o:0;2917:988::-;3009:13;3035:11;3057:13;3108:1;3087:9;:18;3097:7;3087:18;;;;;;;;;;;;:22;3083:709;;;3134:9;:18;3144:7;3134:18;;;;;;;;;;;;3126:26;;3176:5;3167:14;;3083:709;;;3225:1;3203:9;:18;3213:7;3203:18;;;;;;;;;;;;:23;:44;;;;;3231:16;3239:7;3231;:16::i;:::-;3230:17;3203:44;3199:593;;;3272:1;3264:9;;3297:4;3288:13;;3199:593;;;3348:1;3337:7;:12;3334:418;;3449:1;3438:7;:12;3435:229;;3483:11;3475:19;;3435:229;;;3534:1;3523:7;:12;3520:144;;3568:10;3560:18;;3520:144;;;3635:9;3627:17;;3520:144;3435:229;3334:418;;;3712:24;3728:7;3712:15;:24::i;:::-;3704:32;;3334:418;3775:5;3766:14;;3199:593;3083:709;3811:86;3832:7;3841:5;3848:10;:19;3859:7;3848:19;;;;;;;;;;;;3869:6;3877:7;;;;;;;;;;;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3811:20;:86::i;:::-;3804:93;;;;2917:988;;;:::o;4473:107::-;4533:4;4557:9;:15;4567:4;4557:15;;;;;;;;;;;;;;;;4550:22;;4473:107;;;:::o;4588:207::-;1122:13:5;:11;:13::i;:::-;4688:6:7::1;4683:105;4704:9;;:16;;4700:1;:20;4683:105;;;4768:8;4742:9;:23;4752:9;;4762:1;4752:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;4742:23;;;;;;;;;;;;;;;:34;;;;4722:3;;;;;:::i;:::-;;;;4683:105;;;;4588:207:::0;;;:::o;17752:164:2:-;17849:4;17873:18;:25;17892:5;17873:25;;;;;;;;;;;;;;;:35;17899:8;17873:35;;;;;;;;;;;;;;;;;;;;;;;;;17866:42;;17752:164;;;;:::o;2142:201:5:-;1122:13;:11;:13::i;:::-;2251:1:::1;2231:22;;:8;:22;;::::0;2223:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2307:28;2326:8;2307:18;:28::i;:::-;2142:201:::0;:::o;18174:282:2:-;18239:4;18295:7;18276:15;:13;:15::i;:::-;:26;;:66;;;;;18329:13;;18319:7;:23;18276:66;:153;;;;;18428:1;2182:8;18380:17;:26;18398:7;18380:26;;;;;;;;;;;;:44;:49;18276:153;18256:173;;18174:282;;;:::o;40482:105::-;40542:7;40569:10;40562:17;;40482:105;:::o;3445:408:8:-;3504:13;3545:4;3534:7;:15;3530:293;;3574:45;3587:7;3596:9;3607:11;3574:12;:45::i;:::-;3566:53;;3530:293;;;3653:4;3642:7;:15;3638:185;;3682:44;3695:7;3704:9;3715:10;3682:12;:44::i;:::-;3674:52;;3638:185;;;3768:43;3781:7;3790:8;3800:10;3768:12;:43::i;:::-;3760:51;;3638:185;3530:293;3445:408;;;:::o;3913:101:7:-;3978:7;4005:1;3998:8;;3913:101;:::o;1401:132:5:-;1476:12;:10;:12::i;:::-;1465:23;;:7;:5;:7::i;:::-;:23;;;1457:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1401:132::o;1117:647:7:-;1191:11;1205:14;:12;:14::i;:::-;1191:28;;1244:4;1234:6;:14;1230:490;;1317:1;1273:41;1296:17;;1273:22;:41::i;:::-;:45;1265:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;1365:4;1356:6;:13;:44;;;;;1396:4;1383:8;1374:6;:17;;;;:::i;:::-;1373:27;;1356:44;1352:191;;;1459:8;1441:15;:26;;;;:::i;:::-;1421:17;:46;;;;1491:36;1509:17;;1491:36;;;;;;:::i;:::-;;;;;;;;1352:191;1230:490;;;1585:4;1573:8;1564:6;:17;;;;:::i;:::-;:25;1560:160;;1644:8;1626:15;:26;;;;:::i;:::-;1606:17;:46;;;;1672:36;1690:17;;1672:36;;;;;;:::i;:::-;;;;;;;;1560:160;1230:490;1730:26;1736:9;1747:8;1730:5;:26::i;:::-;1180:584;1117:647;;:::o;12860:1275:2:-;12927:7;12947:12;12962:7;12947:22;;13030:4;13011:15;:13;:15::i;:::-;:23;13007:1061;;13064:13;;13057:4;:20;13053:1015;;;13102:14;13119:17;:23;13137:4;13119:23;;;;;;;;;;;;13102:40;;13236:1;2182:8;13208:6;:24;:29;13204:845;;13873:113;13890:1;13880:6;:11;13873:113;;13933:17;:25;13951:6;;;;;;;13933:25;;;;;;;;;;;;13924:34;;13873:113;;;14019:6;14012:13;;;;;;13204:845;13079:989;13053:1015;13007:1061;14096:31;;;;;;;;;;;;;;12860:1275;;;;:::o;19337:485::-;19439:27;19468:23;19509:38;19550:15;:24;19566:7;19550:24;;;;;;;;;;;19509:65;;19727:18;19704:41;;19784:19;19778:26;19759:45;;19689:126;19337:485;;;:::o;18565:659::-;18714:11;18879:16;18872:5;18868:28;18859:37;;19039:16;19028:9;19024:32;19011:45;;19189:15;19178:9;19175:30;19167:5;19156:9;19153:20;19150:56;19140:66;;18565:659;;;;;:::o;25223:159::-;;;;;:::o;39791:311::-;39926:7;39946:16;2586:3;39972:19;:41;;39946:68;;2586:3;40040:31;40051:4;40057:2;40061:9;40040:10;:31::i;:::-;40032:40;;:62;;40025:69;;;39791:311;;;;;:::o;14683:450::-;14763:14;14931:16;14924:5;14920:28;14911:37;;15108:5;15094:11;15069:23;15065:41;15062:52;15055:5;15052:63;15042:73;;14683:450;;;;:::o;26047:158::-;;;;;:::o;34693:89::-;34753:21;34759:7;34768:5;34753;:21::i;:::-;34693:89;:::o;3012:229:8:-;3092:7;3112:17;3138:3;3132;:9;;;;:::i;:::-;3112:29;;3232:1;3219:9;3209:4;3201:5;:12;;;;:::i;:::-;3184:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;3174:41;;;;;;3166:50;;:62;;;;:::i;:::-;3159:3;:70;;;;:::i;:::-;:74;;;;:::i;:::-;3152:81;;;3012:229;;;;;:::o;2503:191:5:-;2577:16;2596:6;;;;;;;;;;;2577:25;;2622:8;2613:6;;:17;;;;;;;;;;;;;;;;;;2677:8;2646:40;;2667:8;2646:40;;;;;;;;;;;;2566:128;2503:191;:::o;6484:296:2:-;6539:7;6746:15;:13;:15::i;:::-;6730:13;;:31;6723:38;;6484:296;:::o;4907:219:8:-;4966:4;5012:2;4987:21;5004:3;4987:16;:21::i;:::-;:27;4983:136;;5064:2;5045:15;5039:3;:21;;;;:::i;:::-;5038:28;;;;:::i;:::-;5031:35;;;;4983:136;5106:1;5099:8;;4907:219;;;;:::o;26645:716:2:-;26808:4;26854:2;26829:45;;;26875:19;:17;:19::i;:::-;26896:4;26902:7;26911:5;26829:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;26825:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27129:1;27112:6;:13;:18;27108:235;;27158:40;;;;;;;;;;;;;;27108:235;27301:6;27295:13;27286:6;27282:2;27278:15;27271:38;26825:529;26998:54;;;26988:64;;;:6;:64;;;;26981:71;;;26645:716;;;;;;:::o;349:1775:6:-;476:13;502:19;524:33;538:7;547:9;524:13;:33::i;:::-;502:55;;568:18;603:6;599:1376;;;703:23;718:7;703:14;:23::i;:::-;912:56;932:34;942:5;949:4;955:10;932:9;:34::i;:::-;912:13;:56::i;:::-;640:358;;;;;;;;;:::i;:::-;;;;;;;;;;;;;626:373;;599:1376;;;1109:23;1124:7;1109:14;:23::i;:::-;1292:21;1307:5;1292:14;:21::i;:::-;1411:43;1426:27;1445:7;1426:18;:27::i;:::-;1411:14;:43::i;:::-;1567:27;1584:9;1567:16;:27::i;:::-;1667:23;1682:4;1687:1;1682:7;;;;;;;:::i;:::-;;;;;;1667:14;:23::i;:::-;1723;1738:4;1743:1;1738:7;;;;;;;:::i;:::-;;;;;;1723:14;:23::i;:::-;1779;1794:4;1799:1;1794:7;;;;;;;:::i;:::-;;;;;;1779:14;:23::i;:::-;1876:56;1896:34;1906:5;1913:4;1919:10;1896:9;:34::i;:::-;1876:13;:56::i;:::-;1046:916;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1032:931;;599:1376;2078:26;2098:4;2078:13;:26::i;:::-;2001:114;;;;;;;;:::i;:::-;;;;;;;;;;;;;1987:129;;;;349:1775;;;;;;;:::o;3249:188:8:-;3335:7;3426:3;3421:1;3415:3;3409;:9;;;;:::i;:::-;:13;;;;:::i;:::-;3397:5;3380:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;3370:34;;;;;;3362:43;;:61;;;;:::i;:::-;:67;;;;:::i;:::-;3355:74;;3249:188;;;;;:::o;656:98:1:-;709:7;736:10;729:17;;656:98;:::o;4692:207:8:-;4751:4;4791:3;4772:15;:22;4768:124;;4824:15;4818:3;:21;;;;:::i;:::-;4811:28;;;;4768:124;4879:1;4872:8;;4692:207;;;;:::o;27823:2966:2:-;27896:20;27919:13;;27896:36;;27959:1;27947:8;:13;27943:44;;27969:18;;;;;;;;;;;;;;27943:44;28000:61;28030:1;28034:2;28038:12;28052:8;28000:21;:61::i;:::-;28544:1;1544:2;28514:1;:26;;28513:32;28501:8;:45;28475:18;:22;28494:2;28475:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;28823:139;28860:2;28914:33;28937:1;28941:2;28945:1;28914:14;:33::i;:::-;28881:30;28902:8;28881:20;:30::i;:::-;:66;28823:18;:139::i;:::-;28789:17;:31;28807:12;28789:31;;;;;;;;;;;:173;;;;28979:16;29010:11;29039:8;29024:12;:23;29010:37;;29560:16;29556:2;29552:25;29540:37;;29932:12;29892:8;29851:1;29789:25;29730:1;29669;29642:335;30303:1;30289:12;30285:20;30243:346;30344:3;30335:7;30332:16;30243:346;;30562:7;30552:8;30549:1;30522:25;30519:1;30516;30511:59;30397:1;30388:7;30384:15;30373:26;;30243:346;;;30247:77;30634:1;30622:8;:13;30618:45;;30644:19;;;;;;;;;;;;;;30618:45;30696:3;30680:13;:19;;;;28249:2462;;30721:60;30750:1;30754:2;30758:12;30772:8;30721:20;:60::i;:::-;27885:2904;27823:2966;;:::o;39492:147::-;39629:6;39492:147;;;;;:::o;35011:3081::-;35091:27;35121;35140:7;35121:18;:27::i;:::-;35091:57;;35161:12;35192:19;35161:52;;35227:27;35256:23;35283:35;35310:7;35283:26;:35::i;:::-;35226:92;;;;35335:13;35331:316;;;35456:68;35481:15;35498:4;35504:19;:17;:19::i;:::-;35456:24;:68::i;:::-;35451:184;;35548:43;35565:4;35571:19;:17;:19::i;:::-;35548:16;:43::i;:::-;35543:92;;35600:35;;;;;;;;;;;;;;35543:92;35451:184;35331:316;35659:51;35681:4;35695:1;35699:7;35708:1;35659:21;:51::i;:::-;35803:15;35800:160;;;35943:1;35922:19;35915:30;35800:160;36621:1;1671:3;36591:1;:26;;36590:32;36562:18;:24;36581:4;36562:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;36889:176;36926:4;36997:53;37012:4;37026:1;37030:19;36997:14;:53::i;:::-;2462:8;2182;36950:43;36949:101;36889:18;:176::i;:::-;36860:17;:26;36878:7;36860:26;;;;;;;;;;;:205;;;;37236:1;2462:8;37185:19;:47;:52;37181:627;;37258:19;37290:1;37280:7;:11;37258:33;;37447:1;37413:17;:30;37431:11;37413:30;;;;;;;;;;;;:35;37409:384;;37551:13;;37536:11;:28;37532:242;;37731:19;37698:17;:30;37716:11;37698:30;;;;;;;;;;;:52;;;;37532:242;37409:384;37239:569;37181:627;37863:7;37859:1;37836:35;;37845:4;37836:35;;;;;;;;;;;;37882:50;37903:4;37917:1;37921:7;37930:1;37882:20;:50::i;:::-;38059:12;;:14;;;;;;;;;;;;;35080:3012;;;;35011:3081;;:::o;3861:548:8:-;3931:27;;:::i;:::-;3987:1;3975:9;:13;3971:404;;;4010:6;4005:245;4026:1;4022;:5;4005:245;;;4074:1;4070;:5;;;;:::i;:::-;4057:9;:18;4053:182;;4115:3;4100:9;4110:1;4100:12;;;;;;;:::i;:::-;;;;;:18;;;;;4053:182;;;4182:33;4205:1;4195:7;:11;;;;:::i;:::-;4208:1;4211:3;4182:12;:33::i;:::-;4167:9;4177:1;4167:12;;;;;;;:::i;:::-;;;;;:48;;;;;4053:182;4029:3;;;;;:::i;:::-;;;;4005:245;;;;3971:404;;;4287:6;4282:82;4303:1;4299;:5;4282:82;;;4345:3;4330:9;4340:1;4330:12;;;;;;;:::i;:::-;;;;;:18;;;;;4306:3;;;;;:::i;:::-;;;;4282:82;;;;3971:404;3861:548;;;;:::o;86:605::-;155:27;205:1;199:2;:7;195:50;;223:10;;;;;;;;;;;;;;;;;;;;;195:50;255:9;267:2;255:14;;280:11;302:69;314:1;309;:6;302:69;;332:5;;;;;:::i;:::-;;;;357:2;352:7;;;;;:::i;:::-;;;302:69;;;381:17;411:3;401:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;381:34;;426:9;438:3;426:15;;452:202;465:1;459:2;:7;452:202;;491:1;487;:5;;;;:::i;:::-;483:9;;507:10;549:2;543;538;:7;;;;:::i;:::-;537:14;;;;:::i;:::-;532:2;:19;;;;:::i;:::-;521:2;:31;;;;:::i;:::-;507:46;;568:9;587:4;580:12;;568:24;;617:2;607:4;612:1;607:7;;;;;;;;:::i;:::-;;;;;:12;;;;;;;;;;;640:2;634:8;;;;;:::i;:::-;;;468:186;;452:202;;;678:4;664:19;;;;;;86:605;;;;:::o;4230:2140:6:-;4335:17;4378:10;4365:24;;4402:20;4525:23;4540:4;4545:1;4540:7;;;;;;;:::i;:::-;;;;;;4525:14;:23::i;:::-;4589;4604:4;4609:1;4604:7;;;;;;;:::i;:::-;;;;;;4589:14;:23::i;:::-;4653;4668:4;4673:1;4668:7;;;;;;;:::i;:::-;;;;;;4653:14;:23::i;:::-;4446:285;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4402:340;;4824:23;4850:26;4870:5;4850:19;:26::i;:::-;4824:52;;4944:6;4952:29;4967:1;4970:7;4978:1;4970:10;;;;;;;:::i;:::-;;;;;;4952:14;:29::i;:::-;4927:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4897:96;;5051:6;5059:29;5074:1;5077:7;5085:1;5077:10;;;;;;;:::i;:::-;;;;;;5059:14;:29::i;:::-;5034:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5004:96;;5158:6;5166:29;5181:1;5184:7;5192:1;5184:10;;;;;;;:::i;:::-;;;;;;5166:14;:29::i;:::-;5141:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5111:96;;5265:6;5273:29;5288:1;5291:7;5299:1;5291:10;;;;;;;:::i;:::-;;;;;;5273:14;:29::i;:::-;5248:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5218:96;;5372:6;5380:29;5395:1;5398:7;5406:1;5398:10;;;;;;;:::i;:::-;;;;;;5380:14;:29::i;:::-;5355:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5325:96;;5479:6;5487:29;5502:1;5505:7;5513:1;5505:10;;;;;;;:::i;:::-;;;;;;5487:14;:29::i;:::-;5462:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5432:96;;5586:6;5594:29;5609:1;5612:7;5620:1;5612:10;;;;;;;:::i;:::-;;;;;;5594:14;:29::i;:::-;5569:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5539:96;;5693:6;5701:29;5716:1;5719:7;5727:1;5719:10;;;;;;;:::i;:::-;;;;;;5701:14;:29::i;:::-;5676:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5646:96;;5800:6;5808:29;5823:1;5826:7;5834:1;5826:10;;;;;;;:::i;:::-;;;;;;5808:14;:29::i;:::-;5783:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5753:96;;5907:6;5915:29;5930:1;5933:7;5941:1;5933:10;;;;;;;:::i;:::-;;;;;;5915:14;:29::i;:::-;5890:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5860:96;;6014:6;6022:31;6037:2;6041:7;6049:2;6041:11;;;;;;;:::i;:::-;;;;;;6022:14;:31::i;:::-;5997:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5967:98;;6123:6;6131:31;6146:2;6150:7;6158:2;6150:11;;;;;;;:::i;:::-;;;;;;6131:14;:31::i;:::-;6106:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6076:98;;6232:6;6240:31;6255:2;6259:7;6267:2;6259:11;;;;;;;:::i;:::-;;;;;;6240:14;:31::i;:::-;6215:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6185:98;;6331:3;6336:6;6314:47;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6300:62;;;;4230:2140;;;;;:::o;524:3097:0:-;582:13;834:1;819:4;:11;:16;815:31;;837:9;;;;;;;;;;;;;;;;815:31;899:19;921:6;;;;;;;;;;;;;;;;;899:28;;1338:20;1397:1;1392;1378:4;:11;:15;;;;:::i;:::-;1377:21;;;;:::i;:::-;1372:1;:27;;;;:::i;:::-;1361:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1338:62;;1580:1;1573:5;1569:13;1684:2;1676:6;1672:15;1795:4;1847;1841:11;1835:4;1831:22;1757:1432;1881:6;1872:7;1869:19;1757:1432;;;1987:1;1978:7;1974:15;1963:26;;2026:7;2020:14;2679:4;2671:5;2667:2;2663:14;2659:25;2649:8;2645:40;2639:47;2628:9;2620:67;2733:1;2722:9;2718:17;2705:30;;2825:4;2817:5;2813:2;2809:14;2805:25;2795:8;2791:40;2785:47;2774:9;2766:67;2879:1;2868:9;2864:17;2851:30;;2970:4;2962:5;2959:1;2955:13;2951:24;2941:8;2937:39;2931:46;2920:9;2912:66;3024:1;3013:9;3009:17;2996:30;;3107:4;3100:5;3096:16;3086:8;3082:31;3076:38;3065:9;3057:58;3161:1;3150:9;3146:17;3133:30;;1908:1281;1757:1432;;;1761:107;;3351:1;3344:4;3338:11;3334:19;3372:1;3367:123;;;;3509:1;3504:73;;;;3327:250;;3367:123;3420:4;3416:1;3405:9;3401:17;3393:32;3470:4;3466:1;3455:9;3451:17;3443:32;3367:123;;3504:73;3557:4;3553:1;3542:9;3538:17;3530:32;3327:250;;1466:2122;;3607:6;3600:13;;;;524:3097;;;;:::o;4417:267:8:-;4476:14;4518:4;4507:7;:15;4503:174;;4551:1;4539:13;;4503:174;;;4585:4;4574:7;:15;4570:107;;4618:1;4606:13;;4570:107;;;4664:1;4652:13;;4570:107;4503:174;4417:267;;;:::o;140:201:6:-;201:13;227:31;:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;312:14;327:5;312:21;;;;;;;:::i;:::-;;;;;;305:28;;;140:201;;;:::o;15235:324:2:-;15305:14;15538:1;15528:8;15525:15;15499:24;15495:46;15485:56;;15235:324;;;:::o;699:2270:8:-;763:24;;:::i;:::-;800:11;825:8;814;:19;;;;:::i;:::-;800:33;;865:8;856:6;:17;;;;:::i;:::-;844:29;;;;;:::i;:::-;;;886:11;911:6;900:8;:17;;;;:::i;:::-;886:31;;949:6;940;:15;;;;:::i;:::-;928:27;;;;;:::i;:::-;;;968:10;992:5;981:8;:16;;;;:::i;:::-;968:29;;1028:5;1020;:13;;;;:::i;:::-;1008:25;;;;;:::i;:::-;;;1046:11;1071:4;1060:8;:15;;;;:::i;:::-;1046:29;;1107:4;1098:6;:13;;;;:::i;:::-;1086:25;;;;;:::i;:::-;;;1124:13;1151:2;1140:8;:13;;;;:::i;:::-;1124:29;;1187:2;1176:8;:13;;;;:::i;:::-;1164:25;;;;;:::i;:::-;;;1202:22;1227:8;1202:33;;1260:2;1251:6;:11;1248:758;;;1293:1;1279:8;1288:1;1279:11;;;;;;;:::i;:::-;;;;;:15;;;;;1323:1;1309:8;1318:1;1309:11;;;;;;;:::i;:::-;;;;;:15;;;;;1353:1;1339:8;1348:1;1339:11;;;;;;;:::i;:::-;;;;;:15;;;;;1383:6;1369:8;1378:1;1369:11;;;;;;;:::i;:::-;;;;;:20;;;;;1248:758;;;1419:3;1410:6;:12;1407:599;;;1453:1;1439:8;1448:1;1439:11;;;;;;;:::i;:::-;;;;;:15;;;;;1483:1;1469:8;1478:1;1469:11;;;;;;;:::i;:::-;;;;;:15;;;;;1523:2;1514:6;:11;;;;:::i;:::-;1499:8;1508:1;1499:11;;;;;;;:::i;:::-;;;;;:27;;;;;1565:2;1556:6;:11;;;;:::i;:::-;1541:8;1550:1;1541:11;;;;;;;:::i;:::-;;;;;:27;;;;;1407:599;;;1598:4;1589:6;:13;1586:420;;;1633:1;1619:8;1628:1;1619:11;;;;;;;:::i;:::-;;;;;:15;;;;;1673:3;1664:6;:12;;;;:::i;:::-;1649:8;1658:1;1649:11;;;;;;;:::i;:::-;;;;;:28;;;;;1724:2;1717:3;1708:6;:12;;;;:::i;:::-;1707:19;;;;:::i;:::-;1692:8;1701:1;1692:11;;;;;;;:::i;:::-;;;;;:35;;;;;1766:2;1757:6;:11;;;;:::i;:::-;1742:8;1751:1;1742:11;;;;;;;:::i;:::-;;;;;:27;;;;;1586:420;;;1799:5;1790:6;:14;1787:219;;;1845:4;1836:6;:13;;;;:::i;:::-;1821:8;1830:1;1821:11;;;;;;;:::i;:::-;;;;;:29;;;;;1898:3;1890:4;1881:6;:13;;;;:::i;:::-;1880:21;;;;:::i;:::-;1865:8;1874:1;1865:11;;;;;;;:::i;:::-;;;;;:37;;;;;1949:2;1942:3;1933:6;:12;;;;:::i;:::-;1932:19;;;;:::i;:::-;1917:8;1926:1;1917:11;;;;;;;:::i;:::-;;;;;:35;;;;;1991:2;1982:6;:11;;;;:::i;:::-;1967:8;1976:1;1967:11;;;;;;;:::i;:::-;;;;;:27;;;;;1787:219;1586:420;1407:599;1248:758;2030:2;2021:6;:11;2018:195;;;2063:1;2049:8;2058:1;2049:11;;;;;;;:::i;:::-;;;;;:15;;;;;2093:6;2079:8;2088:1;2079:11;;;;;;;:::i;:::-;;;;;:20;;;;;2018:195;;;2156:2;2147:6;:11;;;;:::i;:::-;2132:8;2141:1;2132:11;;;;;;;:::i;:::-;;;;;:27;;;;;2198:2;2189:6;:11;;;;:::i;:::-;2174:8;2183:1;2174:11;;;;;;;:::i;:::-;;;;;:27;;;;;2018:195;2239:5;2225:8;2234:1;2225:11;;;;;;;:::i;:::-;;;;;:19;;;;;2269:2;2260:6;:11;2257:195;;;2302:1;2288:8;2297:1;2288:11;;;;;;;:::i;:::-;;;;;:15;;;;;2332:6;2318:8;2327:1;2318:11;;;;;;;:::i;:::-;;;;;:20;;;;;2257:195;;;2395:2;2386:6;:11;;;;:::i;:::-;2371:8;2380:1;2371:11;;;;;;;:::i;:::-;;;;;:27;;;;;2437:2;2428:6;:11;;;;:::i;:::-;2413:8;2422:1;2413:11;;;;;;;:::i;:::-;;;;;:27;;;;;2257:195;2478:2;2467:8;:13;2464:205;;;2511:1;2497:8;2506:1;2497:11;;;;;;;:::i;:::-;;;;;:15;;;;;2542:8;2527;2536:2;2527:12;;;;;;;:::i;:::-;;;;;:23;;;;;2464:205;;;2609:2;2598:8;:13;;;;:::i;:::-;2583:8;2592:1;2583:11;;;;;;;:::i;:::-;;;;;:29;;;;;2654:2;2643:8;:13;;;;:::i;:::-;2627:8;2636:2;2627:12;;;;;;;:::i;:::-;;;;;:30;;;;;2464:205;2706:2;2686:17;:22;2683:243;;;2740:1;2725:8;2734:2;2725:12;;;;;;;:::i;:::-;;;;;:16;;;;;2771:17;2756:8;2765:2;2756:12;;;;;;;:::i;:::-;;;;;:32;;;;;2683:243;;;2857:2;2837:17;:22;;;;:::i;:::-;2821:8;2830:2;2821:12;;;;;;;:::i;:::-;;;;;:39;;;;;2911:2;2891:17;:22;;;;:::i;:::-;2875:8;2884:2;2875:12;;;;;;;:::i;:::-;;;;;:39;;;;;2683:243;2946:15;;;;;;699:2270;;;:::o;2132:2090:6:-;2207:13;2233:15;2251:24;2266:8;2251:14;:24::i;:::-;2233:42;;2300:1;2290:6;:11;2286:1929;;2372:1;2384;2396;2408;2420;2432;2332:137;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2318:152;;;;;2286:1929;2502:1;2492:6;:11;2488:1727;;2574:1;2586;2534:89;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2520:104;;;;;2488:1727;2656:1;2646:6;:11;2642:1573;;2728:1;2740;2752;2764;2776;2688:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2674:140;;;;;2642:1573;2846:1;2836:6;:11;2832:1383;;2918:1;2930;2942;2954;2966;2878:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2864:140;;;;;2832:1383;3036:1;3026:6;:11;3022:1193;;3108:1;3120;3132;3144;3068:113;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3054:128;;;;;3022:1193;3214:1;3204:6;:11;3200:1015;;3286:1;3298;3310;3322;3334;3246:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3232:140;;;;;3200:1015;3404:1;3394:6;:11;3390:825;;3476:1;3488;3500;3512;3524;3536;3436:137;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3422:152;;;;;3390:825;3606:1;3596:6;:11;3592:623;;3678:1;3690;3702;3638:101;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3624:116;;;;;3592:623;3772:1;3762:6;:11;3758:457;;3844:1;3856;3868;3880;3892;3904;3916;3804:149;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3790:164;;;;;3758:457;3986:1;3976:6;:11;3972:243;;4058:1;4070;4082;4094;4106;4118;4018:137;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4004:152;;;;;3972:243;4189:14;;;;;;;;;;;;;;;;;;;;2132:2090;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:9:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:117::-;5976:1;5973;5966:12;5990:180;6038:77;6035:1;6028:88;6135:4;6132:1;6125:15;6159:4;6156:1;6149:15;6176:281;6259:27;6281:4;6259:27;:::i;:::-;6251:6;6247:40;6389:6;6377:10;6374:22;6353:18;6341:10;6338:34;6335:62;6332:88;;;6400:18;;:::i;:::-;6332:88;6440:10;6436:2;6429:22;6219:238;6176:281;;:::o;6463:129::-;6497:6;6524:20;;:::i;:::-;6514:30;;6553:33;6581:4;6573:6;6553:33;:::i;:::-;6463:129;;;:::o;6598:311::-;6675:4;6765:18;6757:6;6754:30;6751:56;;;6787:18;;:::i;:::-;6751:56;6837:4;6829:6;6825:17;6817:25;;6897:4;6891;6887:15;6879:23;;6598:311;;;:::o;6915:117::-;7024:1;7021;7014:12;7055:710;7151:5;7176:81;7192:64;7249:6;7192:64;:::i;:::-;7176:81;:::i;:::-;7167:90;;7277:5;7306:6;7299:5;7292:21;7340:4;7333:5;7329:16;7322:23;;7393:4;7385:6;7381:17;7373:6;7369:30;7422:3;7414:6;7411:15;7408:122;;;7441:79;;:::i;:::-;7408:122;7556:6;7539:220;7573:6;7568:3;7565:15;7539:220;;;7648:3;7677:37;7710:3;7698:10;7677:37;:::i;:::-;7672:3;7665:50;7744:4;7739:3;7735:14;7728:21;;7615:144;7599:4;7594:3;7590:14;7583:21;;7539:220;;;7543:21;7157:608;;7055:710;;;;;:::o;7788:370::-;7859:5;7908:3;7901:4;7893:6;7889:17;7885:27;7875:122;;7916:79;;:::i;:::-;7875:122;8033:6;8020:20;8058:94;8148:3;8140:6;8133:4;8125:6;8121:17;8058:94;:::i;:::-;8049:103;;7865:293;7788:370;;;;:::o;8164:539::-;8248:6;8297:2;8285:9;8276:7;8272:23;8268:32;8265:119;;;8303:79;;:::i;:::-;8265:119;8451:1;8440:9;8436:17;8423:31;8481:18;8473:6;8470:30;8467:117;;;8503:79;;:::i;:::-;8467:117;8608:78;8678:7;8669:6;8658:9;8654:22;8608:78;:::i;:::-;8598:88;;8394:302;8164:539;;;;:::o;8709:60::-;8737:3;8758:5;8751:12;;8709:60;;;:::o;8775:142::-;8825:9;8858:53;8876:34;8885:24;8903:5;8885:24;:::i;:::-;8876:34;:::i;:::-;8858:53;:::i;:::-;8845:66;;8775:142;;;:::o;8923:126::-;8973:9;9006:37;9037:5;9006:37;:::i;:::-;8993:50;;8923:126;;;:::o;9055:144::-;9123:9;9156:37;9187:5;9156:37;:::i;:::-;9143:50;;9055:144;;;:::o;9205:167::-;9310:55;9359:5;9310:55;:::i;:::-;9305:3;9298:68;9205:167;;:::o;9378:258::-;9489:4;9527:2;9516:9;9512:18;9504:26;;9540:89;9626:1;9615:9;9611:17;9602:6;9540:89;:::i;:::-;9378:258;;;;:::o;9642:329::-;9701:6;9750:2;9738:9;9729:7;9725:23;9721:32;9718:119;;;9756:79;;:::i;:::-;9718:119;9876:1;9901:53;9946:7;9937:6;9926:9;9922:22;9901:53;:::i;:::-;9891:63;;9847:117;9642:329;;;;:::o;9977:116::-;10047:21;10062:5;10047:21;:::i;:::-;10040:5;10037:32;10027:60;;10083:1;10080;10073:12;10027:60;9977:116;:::o;10099:133::-;10142:5;10180:6;10167:20;10158:29;;10196:30;10220:5;10196:30;:::i;:::-;10099:133;;;;:::o;10238:468::-;10303:6;10311;10360:2;10348:9;10339:7;10335:23;10331:32;10328:119;;;10366:79;;:::i;:::-;10328:119;10486:1;10511:53;10556:7;10547:6;10536:9;10532:22;10511:53;:::i;:::-;10501:63;;10457:117;10613:2;10639:50;10681:7;10672:6;10661:9;10657:22;10639:50;:::i;:::-;10629:60;;10584:115;10238:468;;;;;:::o;10712:117::-;10821:1;10818;10811:12;10835:307;10896:4;10986:18;10978:6;10975:30;10972:56;;;11008:18;;:::i;:::-;10972:56;11046:29;11068:6;11046:29;:::i;:::-;11038:37;;11130:4;11124;11120:15;11112:23;;10835:307;;;:::o;11148:146::-;11245:6;11240:3;11235;11222:30;11286:1;11277:6;11272:3;11268:16;11261:27;11148:146;;;:::o;11300:423::-;11377:5;11402:65;11418:48;11459:6;11418:48;:::i;:::-;11402:65;:::i;:::-;11393:74;;11490:6;11483:5;11476:21;11528:4;11521:5;11517:16;11566:3;11557:6;11552:3;11548:16;11545:25;11542:112;;;11573:79;;:::i;:::-;11542:112;11663:54;11710:6;11705:3;11700;11663:54;:::i;:::-;11383:340;11300:423;;;;;:::o;11742:338::-;11797:5;11846:3;11839:4;11831:6;11827:17;11823:27;11813:122;;11854:79;;:::i;:::-;11813:122;11971:6;11958:20;11996:78;12070:3;12062:6;12055:4;12047:6;12043:17;11996:78;:::i;:::-;11987:87;;11803:277;11742:338;;;;:::o;12086:943::-;12181:6;12189;12197;12205;12254:3;12242:9;12233:7;12229:23;12225:33;12222:120;;;12261:79;;:::i;:::-;12222:120;12381:1;12406:53;12451:7;12442:6;12431:9;12427:22;12406:53;:::i;:::-;12396:63;;12352:117;12508:2;12534:53;12579:7;12570:6;12559:9;12555:22;12534:53;:::i;:::-;12524:63;;12479:118;12636:2;12662:53;12707:7;12698:6;12687:9;12683:22;12662:53;:::i;:::-;12652:63;;12607:118;12792:2;12781:9;12777:18;12764:32;12823:18;12815:6;12812:30;12809:117;;;12845:79;;:::i;:::-;12809:117;12950:62;13004:7;12995:6;12984:9;12980:22;12950:62;:::i;:::-;12940:72;;12735:287;12086:943;;;;;;;:::o;13035:117::-;13144:1;13141;13134:12;13175:568;13248:8;13258:6;13308:3;13301:4;13293:6;13289:17;13285:27;13275:122;;13316:79;;:::i;:::-;13275:122;13429:6;13416:20;13406:30;;13459:18;13451:6;13448:30;13445:117;;;13481:79;;:::i;:::-;13445:117;13595:4;13587:6;13583:17;13571:29;;13649:3;13641:4;13633:6;13629:17;13619:8;13615:32;13612:41;13609:128;;;13656:79;;:::i;:::-;13609:128;13175:568;;;;;:::o;13749:704::-;13844:6;13852;13860;13909:2;13897:9;13888:7;13884:23;13880:32;13877:119;;;13915:79;;:::i;:::-;13877:119;14063:1;14052:9;14048:17;14035:31;14093:18;14085:6;14082:30;14079:117;;;14115:79;;:::i;:::-;14079:117;14228:80;14300:7;14291:6;14280:9;14276:22;14228:80;:::i;:::-;14210:98;;;;14006:312;14357:2;14383:53;14428:7;14419:6;14408:9;14404:22;14383:53;:::i;:::-;14373:63;;14328:118;13749:704;;;;;:::o;14459:474::-;14527:6;14535;14584:2;14572:9;14563:7;14559:23;14555:32;14552:119;;;14590:79;;:::i;:::-;14552:119;14710:1;14735:53;14780:7;14771:6;14760:9;14756:22;14735:53;:::i;:::-;14725:63;;14681:117;14837:2;14863:53;14908:7;14899:6;14888:9;14884:22;14863:53;:::i;:::-;14853:63;;14808:118;14459:474;;;;;:::o;14939:180::-;14987:77;14984:1;14977:88;15084:4;15081:1;15074:15;15108:4;15105:1;15098:15;15125:320;15169:6;15206:1;15200:4;15196:12;15186:22;;15253:1;15247:4;15243:12;15274:18;15264:81;;15330:4;15322:6;15318:17;15308:27;;15264:81;15392:2;15384:6;15381:14;15361:18;15358:38;15355:84;;15411:18;;:::i;:::-;15355:84;15176:269;15125:320;;;:::o;15451:170::-;15591:22;15587:1;15579:6;15575:14;15568:46;15451:170;:::o;15627:366::-;15769:3;15790:67;15854:2;15849:3;15790:67;:::i;:::-;15783:74;;15866:93;15955:3;15866:93;:::i;:::-;15984:2;15979:3;15975:12;15968:19;;15627:366;;;:::o;15999:419::-;16165:4;16203:2;16192:9;16188:18;16180:26;;16252:9;16246:4;16242:20;16238:1;16227:9;16223:17;16216:47;16280:131;16406:4;16280:131;:::i;:::-;16272:139;;15999:419;;;:::o;16424:180::-;16472:77;16469:1;16462:88;16569:4;16566:1;16559:15;16593:4;16590:1;16583:15;16610:169;16750:21;16746:1;16738:6;16734:14;16727:45;16610:169;:::o;16785:366::-;16927:3;16948:67;17012:2;17007:3;16948:67;:::i;:::-;16941:74;;17024:93;17113:3;17024:93;:::i;:::-;17142:2;17137:3;17133:12;17126:19;;16785:366;;;:::o;17157:419::-;17323:4;17361:2;17350:9;17346:18;17338:26;;17410:9;17404:4;17400:20;17396:1;17385:9;17381:17;17374:47;17438:131;17564:4;17438:131;:::i;:::-;17430:139;;17157:419;;;:::o;17582:180::-;17630:77;17627:1;17620:88;17727:4;17724:1;17717:15;17751:4;17748:1;17741:15;17768:191;17808:3;17827:20;17845:1;17827:20;:::i;:::-;17822:25;;17861:20;17879:1;17861:20;:::i;:::-;17856:25;;17904:1;17901;17897:9;17890:16;;17925:3;17922:1;17919:10;17916:36;;;17932:18;;:::i;:::-;17916:36;17768:191;;;;:::o;17965:233::-;18004:3;18027:24;18045:5;18027:24;:::i;:::-;18018:33;;18073:66;18066:5;18063:77;18060:103;;18143:18;;:::i;:::-;18060:103;18190:1;18183:5;18179:13;18172:20;;17965:233;;;:::o;18204:225::-;18344:34;18340:1;18332:6;18328:14;18321:58;18413:8;18408:2;18400:6;18396:15;18389:33;18204:225;:::o;18435:366::-;18577:3;18598:67;18662:2;18657:3;18598:67;:::i;:::-;18591:74;;18674:93;18763:3;18674:93;:::i;:::-;18792:2;18787:3;18783:12;18776:19;;18435:366;;;:::o;18807:419::-;18973:4;19011:2;19000:9;18996:18;18988:26;;19060:9;19054:4;19050:20;19046:1;19035:9;19031:17;19024:47;19088:131;19214:4;19088:131;:::i;:::-;19080:139;;18807:419;;;:::o;19232:171::-;19372:23;19368:1;19360:6;19356:14;19349:47;19232:171;:::o;19409:366::-;19551:3;19572:67;19636:2;19631:3;19572:67;:::i;:::-;19565:74;;19648:93;19737:3;19648:93;:::i;:::-;19766:2;19761:3;19757:12;19750:19;;19409:366;;;:::o;19781:419::-;19947:4;19985:2;19974:9;19970:18;19962:26;;20034:9;20028:4;20024:20;20020:1;20009:9;20005:17;19998:47;20062:131;20188:4;20062:131;:::i;:::-;20054:139;;19781:419;;;:::o;20206:194::-;20246:4;20266:20;20284:1;20266:20;:::i;:::-;20261:25;;20300:20;20318:1;20300:20;:::i;:::-;20295:25;;20344:1;20341;20337:9;20329:17;;20368:1;20362:4;20359:11;20356:37;;;20373:18;;:::i;:::-;20356:37;20206:194;;;;:::o;20406:410::-;20446:7;20469:20;20487:1;20469:20;:::i;:::-;20464:25;;20503:20;20521:1;20503:20;:::i;:::-;20498:25;;20558:1;20555;20551:9;20580:30;20598:11;20580:30;:::i;:::-;20569:41;;20759:1;20750:7;20746:15;20743:1;20740:22;20720:1;20713:9;20693:83;20670:139;;20789:18;;:::i;:::-;20670:139;20454:362;20406:410;;;;:::o;20822:164::-;20962:16;20958:1;20950:6;20946:14;20939:40;20822:164;:::o;20992:366::-;21134:3;21155:67;21219:2;21214:3;21155:67;:::i;:::-;21148:74;;21231:93;21320:3;21231:93;:::i;:::-;21349:2;21344:3;21340:12;21333:19;;20992:366;;;:::o;21364:419::-;21530:4;21568:2;21557:9;21553:18;21545:26;;21617:9;21611:4;21607:20;21603:1;21592:9;21588:17;21581:47;21645:131;21771:4;21645:131;:::i;:::-;21637:139;;21364:419;;;:::o;21789:432::-;21877:5;21902:65;21918:48;21959:6;21918:48;:::i;:::-;21902:65;:::i;:::-;21893:74;;21990:6;21983:5;21976:21;22028:4;22021:5;22017:16;22066:3;22057:6;22052:3;22048:16;22045:25;22042:112;;;22073:79;;:::i;:::-;22042:112;22163:52;22208:6;22203:3;22198;22163:52;:::i;:::-;21883:338;21789:432;;;;;:::o;22240:353::-;22306:5;22355:3;22348:4;22340:6;22336:17;22332:27;22322:122;;22363:79;;:::i;:::-;22322:122;22473:6;22467:13;22498:89;22583:3;22575:6;22568:4;22560:6;22556:17;22498:89;:::i;:::-;22489:98;;22312:281;22240:353;;;;:::o;22599:522::-;22678:6;22727:2;22715:9;22706:7;22702:23;22698:32;22695:119;;;22733:79;;:::i;:::-;22695:119;22874:1;22863:9;22859:17;22853:24;22904:18;22896:6;22893:30;22890:117;;;22926:79;;:::i;:::-;22890:117;23031:73;23096:7;23087:6;23076:9;23072:22;23031:73;:::i;:::-;23021:83;;22824:290;22599:522;;;;:::o;23127:225::-;23267:34;23263:1;23255:6;23251:14;23244:58;23336:8;23331:2;23323:6;23319:15;23312:33;23127:225;:::o;23358:366::-;23500:3;23521:67;23585:2;23580:3;23521:67;:::i;:::-;23514:74;;23597:93;23686:3;23597:93;:::i;:::-;23715:2;23710:3;23706:12;23699:19;;23358:366;;;:::o;23730:419::-;23896:4;23934:2;23923:9;23919:18;23911:26;;23983:9;23977:4;23973:20;23969:1;23958:9;23954:17;23947:47;24011:131;24137:4;24011:131;:::i;:::-;24003:139;;23730:419;;;:::o;24155:182::-;24295:34;24291:1;24283:6;24279:14;24272:58;24155:182;:::o;24343:366::-;24485:3;24506:67;24570:2;24565:3;24506:67;:::i;:::-;24499:74;;24582:93;24671:3;24582:93;:::i;:::-;24700:2;24695:3;24691:12;24684:19;;24343:366;;;:::o;24715:419::-;24881:4;24919:2;24908:9;24904:18;24896:26;;24968:9;24962:4;24958:20;24954:1;24943:9;24939:17;24932:47;24996:131;25122:4;24996:131;:::i;:::-;24988:139;;24715:419;;;:::o;25140:164::-;25280:16;25276:1;25268:6;25264:14;25257:40;25140:164;:::o;25310:366::-;25452:3;25473:67;25537:2;25532:3;25473:67;:::i;:::-;25466:74;;25549:93;25638:3;25549:93;:::i;:::-;25667:2;25662:3;25658:12;25651:19;;25310:366;;;:::o;25682:419::-;25848:4;25886:2;25875:9;25871:18;25863:26;;25935:9;25929:4;25925:20;25921:1;25910:9;25906:17;25899:47;25963:131;26089:4;25963:131;:::i;:::-;25955:139;;25682:419;;;:::o;26107:79::-;26146:7;26175:5;26164:16;;26107:79;;;:::o;26192:157::-;26297:45;26317:24;26335:5;26317:24;:::i;:::-;26297:45;:::i;:::-;26292:3;26285:58;26192:157;;:::o;26355:256::-;26467:3;26482:75;26553:3;26544:6;26482:75;:::i;:::-;26582:2;26577:3;26573:12;26566:19;;26602:3;26595:10;;26355:256;;;;:::o;26617:180::-;26665:77;26662:1;26655:88;26762:4;26759:1;26752:15;26786:4;26783:1;26776:15;26803:176;26835:1;26852:20;26870:1;26852:20;:::i;:::-;26847:25;;26886:20;26904:1;26886:20;:::i;:::-;26881:25;;26925:1;26915:35;;26930:18;;:::i;:::-;26915:35;26971:1;26968;26964:9;26959:14;;26803:176;;;;:::o;26985:185::-;27025:1;27042:20;27060:1;27042:20;:::i;:::-;27037:25;;27076:20;27094:1;27076:20;:::i;:::-;27071:25;;27115:1;27105:35;;27120:18;;:::i;:::-;27105:35;27162:1;27159;27155:9;27150:14;;26985:185;;;;:::o;27176:98::-;27227:6;27261:5;27255:12;27245:22;;27176:98;;;:::o;27280:168::-;27363:11;27397:6;27392:3;27385:19;27437:4;27432:3;27428:14;27413:29;;27280:168;;;;:::o;27454:373::-;27540:3;27568:38;27600:5;27568:38;:::i;:::-;27622:70;27685:6;27680:3;27622:70;:::i;:::-;27615:77;;27701:65;27759:6;27754:3;27747:4;27740:5;27736:16;27701:65;:::i;:::-;27791:29;27813:6;27791:29;:::i;:::-;27786:3;27782:39;27775:46;;27544:283;27454:373;;;;:::o;27833:640::-;28028:4;28066:3;28055:9;28051:19;28043:27;;28080:71;28148:1;28137:9;28133:17;28124:6;28080:71;:::i;:::-;28161:72;28229:2;28218:9;28214:18;28205:6;28161:72;:::i;:::-;28243;28311:2;28300:9;28296:18;28287:6;28243:72;:::i;:::-;28362:9;28356:4;28352:20;28347:2;28336:9;28332:18;28325:48;28390:76;28461:4;28452:6;28390:76;:::i;:::-;28382:84;;27833:640;;;;;;;:::o;28479:141::-;28535:5;28566:6;28560:13;28551:22;;28582:32;28608:5;28582:32;:::i;:::-;28479:141;;;;:::o;28626:349::-;28695:6;28744:2;28732:9;28723:7;28719:23;28715:32;28712:119;;;28750:79;;:::i;:::-;28712:119;28870:1;28895:63;28950:7;28941:6;28930:9;28926:22;28895:63;:::i;:::-;28885:73;;28841:127;28626:349;;;;:::o;28981:148::-;29083:11;29120:3;29105:18;;28981:148;;;;:::o;29135:214::-;29275:66;29271:1;29263:6;29259:14;29252:90;29135:214;:::o;29355:402::-;29515:3;29536:85;29618:2;29613:3;29536:85;:::i;:::-;29529:92;;29630:93;29719:3;29630:93;:::i;:::-;29748:2;29743:3;29739:12;29732:19;;29355:402;;;:::o;29763:390::-;29869:3;29897:39;29930:5;29897:39;:::i;:::-;29952:89;30034:6;30029:3;29952:89;:::i;:::-;29945:96;;30050:65;30108:6;30103:3;30096:4;30089:5;30085:16;30050:65;:::i;:::-;30140:6;30135:3;30131:16;30124:23;;29873:280;29763:390;;;;:::o;30159:581::-;30299:66;30295:1;30287:6;30283:14;30276:90;30400:66;30395:2;30387:6;30383:15;30376:91;30501:66;30496:2;30488:6;30484:15;30477:91;30602:66;30597:2;30589:6;30585:15;30578:91;30704:28;30698:3;30690:6;30686:16;30679:54;30159:581;:::o;30746:404::-;30906:3;30927:86;31009:3;31004;30927:86;:::i;:::-;30920:93;;31022;31111:3;31022:93;:::i;:::-;31140:3;31135;31131:13;31124:20;;30746:404;;;:::o;31156:214::-;31296:66;31292:1;31284:6;31280:14;31273:90;31156:214;:::o;31376:400::-;31536:3;31557:84;31639:1;31634:3;31557:84;:::i;:::-;31550:91;;31650:93;31739:3;31650:93;:::i;:::-;31768:1;31763:3;31759:11;31752:18;;31376:400;;;:::o;31782:1233::-;32265:3;32287:148;32431:3;32287:148;:::i;:::-;32280:155;;32452:95;32543:3;32534:6;32452:95;:::i;:::-;32445:102;;32564:148;32708:3;32564:148;:::i;:::-;32557:155;;32729:95;32820:3;32811:6;32729:95;:::i;:::-;32722:102;;32841:148;32985:3;32841:148;:::i;:::-;32834:155;;33006:3;32999:10;;31782:1233;;;;;:::o;33021:517::-;33161:66;33157:1;33149:6;33145:14;33138:90;33262:66;33257:2;33249:6;33245:15;33238:91;33363:66;33358:2;33350:6;33346:15;33339:91;33464:66;33459:2;33451:6;33447:15;33440:91;33021:517;:::o;33544:404::-;33704:3;33725:86;33807:3;33802;33725:86;:::i;:::-;33718:93;;33820;33909:3;33820:93;:::i;:::-;33938:3;33933;33929:13;33922:20;;33544:404;;;:::o;33954:354::-;34094:66;34090:1;34082:6;34078:14;34071:90;34195:66;34190:2;34182:6;34178:15;34171:91;34296:4;34291:2;34283:6;34279:15;34272:29;33954:354;:::o;34314:402::-;34474:3;34495:85;34577:2;34572:3;34495:85;:::i;:::-;34488:92;;34589:93;34678:3;34589:93;:::i;:::-;34707:2;34702:3;34698:12;34691:19;;34314:402;;;:::o;34722:416::-;34862:66;34858:1;34850:6;34846:14;34839:90;34963:66;34958:2;34950:6;34946:15;34939:91;35064:66;35059:2;35051:6;35047:15;35040:91;34722:416;:::o;35144:402::-;35304:3;35325:85;35407:2;35402:3;35325:85;:::i;:::-;35318:92;;35419:93;35508:3;35419:93;:::i;:::-;35537:2;35532:3;35528:12;35521:19;;35144:402;;;:::o;35552:315::-;35692:66;35688:1;35680:6;35676:14;35669:90;35793:66;35788:2;35780:6;35776:15;35769:91;35552:315;:::o;35873:402::-;36033:3;36054:85;36136:2;36131:3;36054:85;:::i;:::-;36047:92;;36148:93;36237:3;36148:93;:::i;:::-;36266:2;36261:3;36257:12;36250:19;;35873:402;;;:::o;36281:151::-;36421:3;36417:1;36409:6;36405:14;36398:27;36281:151;:::o;36438:400::-;36598:3;36619:84;36701:1;36696:3;36619:84;:::i;:::-;36612:91;;36712:93;36801:3;36712:93;:::i;:::-;36830:1;36825:3;36821:11;36814:18;;36438:400;;;:::o;36844:261::-;36984:66;36980:1;36972:6;36968:14;36961:90;37085:12;37080:2;37072:6;37068:15;37061:37;36844:261;:::o;37111:402::-;37271:3;37292:85;37374:2;37369:3;37292:85;:::i;:::-;37285:92;;37386:93;37475:3;37386:93;:::i;:::-;37504:2;37499:3;37495:12;37488:19;;37111:402;;;:::o;37519:3789::-;38896:3;38918:148;39062:3;38918:148;:::i;:::-;38911:155;;39083:95;39174:3;39165:6;39083:95;:::i;:::-;39076:102;;39195:148;39339:3;39195:148;:::i;:::-;39188:155;;39360:95;39451:3;39442:6;39360:95;:::i;:::-;39353:102;;39472:148;39616:3;39472:148;:::i;:::-;39465:155;;39637:95;39728:3;39719:6;39637:95;:::i;:::-;39630:102;;39749:148;39893:3;39749:148;:::i;:::-;39742:155;;39914:95;40005:3;39996:6;39914:95;:::i;:::-;39907:102;;40026:148;40170:3;40026:148;:::i;:::-;40019:155;;40191:95;40282:3;40273:6;40191:95;:::i;:::-;40184:102;;40303:148;40447:3;40303:148;:::i;:::-;40296:155;;40468:95;40559:3;40550:6;40468:95;:::i;:::-;40461:102;;40580:148;40724:3;40580:148;:::i;:::-;40573:155;;40745:95;40836:3;40827:6;40745:95;:::i;:::-;40738:102;;40857:148;41001:3;40857:148;:::i;:::-;40850:155;;41022:95;41113:3;41104:6;41022:95;:::i;:::-;41015:102;;41134:148;41278:3;41134:148;:::i;:::-;41127:155;;41299:3;41292:10;;37519:3789;;;;;;;;;;;:::o;41314:179::-;41454:31;41450:1;41442:6;41438:14;41431:55;41314:179;:::o;41499:402::-;41659:3;41680:85;41762:2;41757:3;41680:85;:::i;:::-;41673:92;;41774:93;41863:3;41774:93;:::i;:::-;41892:2;41887:3;41883:12;41876:19;;41499:402;;;:::o;41907:541::-;42140:3;42162:148;42306:3;42162:148;:::i;:::-;42155:155;;42327:95;42418:3;42409:6;42327:95;:::i;:::-;42320:102;;42439:3;42432:10;;41907:541;;;;:::o;42454:86::-;42489:7;42529:4;42522:5;42518:16;42507:27;;42454:86;;;:::o;42546:188::-;42584:3;42603:18;42619:1;42603:18;:::i;:::-;42598:23;;42635:18;42651:1;42635:18;:::i;:::-;42630:23;;42676:1;42673;42669:9;42662:16;;42699:4;42694:3;42691:13;42688:39;;;42707:18;;:::i;:::-;42688:39;42546:188;;;;:::o;42740:181::-;42880:25;42876:1;42868:6;42864:14;42857:49;42740:181;:::o;42935:434::-;43095:3;43124:85;43206:2;43201:3;43124:85;:::i;:::-;43117:92;;43226:93;43315:3;43226:93;:::i;:::-;43352:2;43347:3;43343:12;43336:19;;42935:434;;;:::o;43383:169::-;43523:21;43519:1;43511:6;43507:14;43500:45;43383:169;:::o;43558:402::-;43718:3;43739:85;43821:2;43816:3;43739:85;:::i;:::-;43732:92;;43833:93;43922:3;43833:93;:::i;:::-;43951:2;43946:3;43942:12;43935:19;;43558:402;;;:::o;43966:1659::-;44598:3;44620:148;44764:3;44620:148;:::i;:::-;44613:155;;44785:95;44876:3;44867:6;44785:95;:::i;:::-;44778:102;;44897:148;45041:3;44897:148;:::i;:::-;44890:155;;45062:95;45153:3;45144:6;45062:95;:::i;:::-;45055:102;;45174:148;45318:3;45174:148;:::i;:::-;45167:155;;45339:95;45430:3;45421:6;45339:95;:::i;:::-;45332:102;;45451:148;45595:3;45451:148;:::i;:::-;45444:155;;45616:3;45609:10;;43966:1659;;;;;;:::o;45631:435::-;45811:3;45833:95;45924:3;45915:6;45833:95;:::i;:::-;45826:102;;45945:95;46036:3;46027:6;45945:95;:::i;:::-;45938:102;;46057:3;46050:10;;45631:435;;;;;:::o;46072:164::-;46212:16;46208:1;46200:6;46196:14;46189:40;46072:164;:::o;46242:402::-;46402:3;46423:85;46505:2;46500:3;46423:85;:::i;:::-;46416:92;;46517:93;46606:3;46517:93;:::i;:::-;46635:2;46630:3;46626:12;46619:19;;46242:402;;;:::o;46650:701::-;46931:3;46953:95;47044:3;47035:6;46953:95;:::i;:::-;46946:102;;47065:95;47156:3;47147:6;47065:95;:::i;:::-;47058:102;;47177:148;47321:3;47177:148;:::i;:::-;47170:155;;47342:3;47335:10;;46650:701;;;;;:::o;47357:152::-;47497:4;47493:1;47485:6;47481:14;47474:28;47357:152;:::o;47515:400::-;47675:3;47696:84;47778:1;47773:3;47696:84;:::i;:::-;47689:91;;47789:93;47878:3;47789:93;:::i;:::-;47907:1;47902:3;47898:11;47891:18;;47515:400;;;:::o;47921:152::-;48061:4;48057:1;48049:6;48045:14;48038:28;47921:152;:::o;48079:400::-;48239:3;48260:84;48342:1;48337:3;48260:84;:::i;:::-;48253:91;;48353:93;48442:3;48353:93;:::i;:::-;48471:1;48466:3;48462:11;48455:18;;48079:400;;;:::o;48485:152::-;48625:4;48621:1;48613:6;48609:14;48602:28;48485:152;:::o;48643:400::-;48803:3;48824:84;48906:1;48901:3;48824:84;:::i;:::-;48817:91;;48917:93;49006:3;48917:93;:::i;:::-;49035:1;49030:3;49026:11;49019:18;;48643:400;;;:::o;49049:152::-;49189:4;49185:1;49177:6;49173:14;49166:28;49049:152;:::o;49207:400::-;49367:3;49388:84;49470:1;49465:3;49388:84;:::i;:::-;49381:91;;49481:93;49570:3;49481:93;:::i;:::-;49599:1;49594:3;49590:11;49583:18;;49207:400;;;:::o;49613:152::-;49753:4;49749:1;49741:6;49737:14;49730:28;49613:152;:::o;49771:400::-;49931:3;49952:84;50034:1;50029:3;49952:84;:::i;:::-;49945:91;;50045:93;50134:3;50045:93;:::i;:::-;50163:1;50158:3;50154:11;50147:18;;49771:400;;;:::o;50177:152::-;50317:4;50313:1;50305:6;50301:14;50294:28;50177:152;:::o;50335:400::-;50495:3;50516:84;50598:1;50593:3;50516:84;:::i;:::-;50509:91;;50609:93;50698:3;50609:93;:::i;:::-;50727:1;50722:3;50718:11;50711:18;;50335:400;;;:::o;50741:168::-;50881:20;50877:1;50869:6;50865:14;50858:44;50741:168;:::o;50915:402::-;51075:3;51096:85;51178:2;51173:3;51096:85;:::i;:::-;51089:92;;51190:93;51279:3;51190:93;:::i;:::-;51308:2;51303:3;51299:12;51292:19;;50915:402;;;:::o;51323:4267::-;52907:3;52929:148;53073:3;52929:148;:::i;:::-;52922:155;;53094:95;53185:3;53176:6;53094:95;:::i;:::-;53087:102;;53206:148;53350:3;53206:148;:::i;:::-;53199:155;;53371:148;53515:3;53371:148;:::i;:::-;53364:155;;53536:95;53627:3;53618:6;53536:95;:::i;:::-;53529:102;;53648:148;53792:3;53648:148;:::i;:::-;53641:155;;53813:148;53957:3;53813:148;:::i;:::-;53806:155;;53978:95;54069:3;54060:6;53978:95;:::i;:::-;53971:102;;54090:148;54234:3;54090:148;:::i;:::-;54083:155;;54255:148;54399:3;54255:148;:::i;:::-;54248:155;;54420:95;54511:3;54502:6;54420:95;:::i;:::-;54413:102;;54532:148;54676:3;54532:148;:::i;:::-;54525:155;;54697:148;54841:3;54697:148;:::i;:::-;54690:155;;54862:95;54953:3;54944:6;54862:95;:::i;:::-;54855:102;;54974:148;55118:3;54974:148;:::i;:::-;54967:155;;55139:148;55283:3;55139:148;:::i;:::-;55132:155;;55304:95;55395:3;55386:6;55304:95;:::i;:::-;55297:102;;55416:148;55560:3;55416:148;:::i;:::-;55409:155;;55581:3;55574:10;;51323:4267;;;;;;;;;:::o;55596:168::-;55736:20;55732:1;55724:6;55720:14;55713:44;55596:168;:::o;55770:402::-;55930:3;55951:85;56033:2;56028:3;55951:85;:::i;:::-;55944:92;;56045:93;56134:3;56045:93;:::i;:::-;56163:2;56158:3;56154:12;56147:19;;55770:402;;;:::o;56178:1499::-;56762:3;56784:148;56928:3;56784:148;:::i;:::-;56777:155;;56949:95;57040:3;57031:6;56949:95;:::i;:::-;56942:102;;57061:148;57205:3;57061:148;:::i;:::-;57054:155;;57226:148;57370:3;57226:148;:::i;:::-;57219:155;;57391:95;57482:3;57473:6;57391:95;:::i;:::-;57384:102;;57503:148;57647:3;57503:148;:::i;:::-;57496:155;;57668:3;57661:10;;56178:1499;;;;;:::o;57683:152::-;57823:4;57819:1;57811:6;57807:14;57800:28;57683:152;:::o;57841:400::-;58001:3;58022:84;58104:1;58099:3;58022:84;:::i;:::-;58015:91;;58115:93;58204:3;58115:93;:::i;:::-;58233:1;58228:3;58224:11;58217:18;;57841:400;;;:::o;58247:3575::-;59581:3;59603:148;59747:3;59603:148;:::i;:::-;59596:155;;59768:95;59859:3;59850:6;59768:95;:::i;:::-;59761:102;;59880:148;60024:3;59880:148;:::i;:::-;59873:155;;60045:148;60189:3;60045:148;:::i;:::-;60038:155;;60210:95;60301:3;60292:6;60210:95;:::i;:::-;60203:102;;60322:148;60466:3;60322:148;:::i;:::-;60315:155;;60487:148;60631:3;60487:148;:::i;:::-;60480:155;;60652:95;60743:3;60734:6;60652:95;:::i;:::-;60645:102;;60764:148;60908:3;60764:148;:::i;:::-;60757:155;;60929:148;61073:3;60929:148;:::i;:::-;60922:155;;61094:95;61185:3;61176:6;61094:95;:::i;:::-;61087:102;;61206:148;61350:3;61206:148;:::i;:::-;61199:155;;61371:148;61515:3;61371:148;:::i;:::-;61364:155;;61536:95;61627:3;61618:6;61536:95;:::i;:::-;61529:102;;61648:148;61792:3;61648:148;:::i;:::-;61641:155;;61813:3;61806:10;;58247:3575;;;;;;;;:::o;61828:::-;63162:3;63184:148;63328:3;63184:148;:::i;:::-;63177:155;;63349:95;63440:3;63431:6;63349:95;:::i;:::-;63342:102;;63461:148;63605:3;63461:148;:::i;:::-;63454:155;;63626:148;63770:3;63626:148;:::i;:::-;63619:155;;63791:95;63882:3;63873:6;63791:95;:::i;:::-;63784:102;;63903:148;64047:3;63903:148;:::i;:::-;63896:155;;64068:148;64212:3;64068:148;:::i;:::-;64061:155;;64233:95;64324:3;64315:6;64233:95;:::i;:::-;64226:102;;64345:148;64489:3;64345:148;:::i;:::-;64338:155;;64510:148;64654:3;64510:148;:::i;:::-;64503:155;;64675:95;64766:3;64757:6;64675:95;:::i;:::-;64668:102;;64787:148;64931:3;64787:148;:::i;:::-;64780:155;;64952:148;65096:3;64952:148;:::i;:::-;64945:155;;65117:95;65208:3;65199:6;65117:95;:::i;:::-;65110:102;;65229:148;65373:3;65229:148;:::i;:::-;65222:155;;65394:3;65387:10;;61828:3575;;;;;;;;:::o;65409:2883::-;66493:3;66515:148;66659:3;66515:148;:::i;:::-;66508:155;;66680:95;66771:3;66762:6;66680:95;:::i;:::-;66673:102;;66792:148;66936:3;66792:148;:::i;:::-;66785:155;;66957:148;67101:3;66957:148;:::i;:::-;66950:155;;67122:95;67213:3;67204:6;67122:95;:::i;:::-;67115:102;;67234:148;67378:3;67234:148;:::i;:::-;67227:155;;67399:148;67543:3;67399:148;:::i;:::-;67392:155;;67564:95;67655:3;67646:6;67564:95;:::i;:::-;67557:102;;67676:148;67820:3;67676:148;:::i;:::-;67669:155;;67841:148;67985:3;67841:148;:::i;:::-;67834:155;;68006:95;68097:3;68088:6;68006:95;:::i;:::-;67999:102;;68118:148;68262:3;68118:148;:::i;:::-;68111:155;;68283:3;68276:10;;65409:2883;;;;;;;:::o;68298:3575::-;69632:3;69654:148;69798:3;69654:148;:::i;:::-;69647:155;;69819:95;69910:3;69901:6;69819:95;:::i;:::-;69812:102;;69931:148;70075:3;69931:148;:::i;:::-;69924:155;;70096:148;70240:3;70096:148;:::i;:::-;70089:155;;70261:95;70352:3;70343:6;70261:95;:::i;:::-;70254:102;;70373:148;70517:3;70373:148;:::i;:::-;70366:155;;70538:148;70682:3;70538:148;:::i;:::-;70531:155;;70703:95;70794:3;70785:6;70703:95;:::i;:::-;70696:102;;70815:148;70959:3;70815:148;:::i;:::-;70808:155;;70980:148;71124:3;70980:148;:::i;:::-;70973:155;;71145:95;71236:3;71227:6;71145:95;:::i;:::-;71138:102;;71257:148;71401:3;71257:148;:::i;:::-;71250:155;;71422:148;71566:3;71422:148;:::i;:::-;71415:155;;71587:95;71678:3;71669:6;71587:95;:::i;:::-;71580:102;;71699:148;71843:3;71699:148;:::i;:::-;71692:155;;71864:3;71857:10;;68298:3575;;;;;;;;:::o;71879:4267::-;73463:3;73485:148;73629:3;73485:148;:::i;:::-;73478:155;;73650:95;73741:3;73732:6;73650:95;:::i;:::-;73643:102;;73762:148;73906:3;73762:148;:::i;:::-;73755:155;;73927:148;74071:3;73927:148;:::i;:::-;73920:155;;74092:95;74183:3;74174:6;74092:95;:::i;:::-;74085:102;;74204:148;74348:3;74204:148;:::i;:::-;74197:155;;74369:148;74513:3;74369:148;:::i;:::-;74362:155;;74534:95;74625:3;74616:6;74534:95;:::i;:::-;74527:102;;74646:148;74790:3;74646:148;:::i;:::-;74639:155;;74811:148;74955:3;74811:148;:::i;:::-;74804:155;;74976:95;75067:3;75058:6;74976:95;:::i;:::-;74969:102;;75088:148;75232:3;75088:148;:::i;:::-;75081:155;;75253:148;75397:3;75253:148;:::i;:::-;75246:155;;75418:95;75509:3;75500:6;75418:95;:::i;:::-;75411:102;;75530:148;75674:3;75530:148;:::i;:::-;75523:155;;75695:148;75839:3;75695:148;:::i;:::-;75688:155;;75860:95;75951:3;75942:6;75860:95;:::i;:::-;75853:102;;75972:148;76116:3;75972:148;:::i;:::-;75965:155;;76137:3;76130:10;;71879:4267;;;;;;;;;:::o;76152:2191::-;76986:3;77008:148;77152:3;77008:148;:::i;:::-;77001:155;;77173:95;77264:3;77255:6;77173:95;:::i;:::-;77166:102;;77285:148;77429:3;77285:148;:::i;:::-;77278:155;;77450:148;77594:3;77450:148;:::i;:::-;77443:155;;77615:95;77706:3;77697:6;77615:95;:::i;:::-;77608:102;;77727:148;77871:3;77727:148;:::i;:::-;77720:155;;77892:148;78036:3;77892:148;:::i;:::-;77885:155;;78057:95;78148:3;78139:6;78057:95;:::i;:::-;78050:102;;78169:148;78313:3;78169:148;:::i;:::-;78162:155;;78334:3;78327:10;;76152:2191;;;;;;:::o;78349:4959::-;80183:3;80205:148;80349:3;80205:148;:::i;:::-;80198:155;;80370:95;80461:3;80452:6;80370:95;:::i;:::-;80363:102;;80482:148;80626:3;80482:148;:::i;:::-;80475:155;;80647:148;80791:3;80647:148;:::i;:::-;80640:155;;80812:95;80903:3;80894:6;80812:95;:::i;:::-;80805:102;;80924:148;81068:3;80924:148;:::i;:::-;80917:155;;81089:148;81233:3;81089:148;:::i;:::-;81082:155;;81254:95;81345:3;81336:6;81254:95;:::i;:::-;81247:102;;81366:148;81510:3;81366:148;:::i;:::-;81359:155;;81531:148;81675:3;81531:148;:::i;:::-;81524:155;;81696:95;81787:3;81778:6;81696:95;:::i;:::-;81689:102;;81808:148;81952:3;81808:148;:::i;:::-;81801:155;;81973:148;82117:3;81973:148;:::i;:::-;81966:155;;82138:95;82229:3;82220:6;82138:95;:::i;:::-;82131:102;;82250:148;82394:3;82250:148;:::i;:::-;82243:155;;82415:148;82559:3;82415:148;:::i;:::-;82408:155;;82580:95;82671:3;82662:6;82580:95;:::i;:::-;82573:102;;82692:148;82836:3;82692:148;:::i;:::-;82685:155;;82857:148;83001:3;82857:148;:::i;:::-;82850:155;;83022:95;83113:3;83104:6;83022:95;:::i;:::-;83015:102;;83134:148;83278:3;83134:148;:::i;:::-;83127:155;;83299:3;83292:10;;78349:4959;;;;;;;;;;:::o;83314:4267::-;84898:3;84920:148;85064:3;84920:148;:::i;:::-;84913:155;;85085:95;85176:3;85167:6;85085:95;:::i;:::-;85078:102;;85197:148;85341:3;85197:148;:::i;:::-;85190:155;;85362:148;85506:3;85362:148;:::i;:::-;85355:155;;85527:95;85618:3;85609:6;85527:95;:::i;:::-;85520:102;;85639:148;85783:3;85639:148;:::i;:::-;85632:155;;85804:148;85948:3;85804:148;:::i;:::-;85797:155;;85969:95;86060:3;86051:6;85969:95;:::i;:::-;85962:102;;86081:148;86225:3;86081:148;:::i;:::-;86074:155;;86246:148;86390:3;86246:148;:::i;:::-;86239:155;;86411:95;86502:3;86493:6;86411:95;:::i;:::-;86404:102;;86523:148;86667:3;86523:148;:::i;:::-;86516:155;;86688:148;86832:3;86688:148;:::i;:::-;86681:155;;86853:95;86944:3;86935:6;86853:95;:::i;:::-;86846:102;;86965:148;87109:3;86965:148;:::i;:::-;86958:155;;87130:148;87274:3;87130:148;:::i;:::-;87123:155;;87295:95;87386:3;87377:6;87295:95;:::i;:::-;87288:102;;87407:148;87551:3;87407:148;:::i;:::-;87400:155;;87572:3;87565:10;;83314:4267;;;;;;;;;:::o
Swarm Source
ipfs://bf72455ed2e269244f6346932f54a18403e17f250f58cd2c25513078a5bd27ed
Loading...
Loading
Loading...
Loading
OVERVIEW
[Mint here](https://mint.fun/0x9B896C71810c6Da711e46640751B1961C2F8C0d2). Welcome to a world where time has become the ultimate currency.You stop aging at 25, but you're genetically-engineered to live only one more year, unless you can buy your way out of it.Time is the com...Multichain Portfolio | 30 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.