ETH Price: $3,674.40 (+1.53%)

Contract

0x53beA59B69bF9e58E0AFeEB4f34f49Fc29D10F55
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Upgrade Equipmen...194168152024-03-12 5:08:47263 days ago1710220127IN
0x53beA59B...c29D10F55
0 ETH0.0060063646.79496701
Upgrade Equipmen...194167982024-03-12 5:05:23263 days ago1710219923IN
0x53beA59B...c29D10F55
0 ETH0.0059155946.11509652
Upgrade Equipmen...194167842024-03-12 5:02:35263 days ago1710219755IN
0x53beA59B...c29D10F55
0 ETH0.0057157144.6073478
Upgrade Equipmen...194167802024-03-12 5:01:47263 days ago1710219707IN
0x53beA59B...c29D10F55
0 ETH0.0062952249.1730246
Upgrade Equipmen...194167742024-03-12 5:00:35263 days ago1710219635IN
0x53beA59B...c29D10F55
0 ETH0.0058129545.46060149
Upgrade Equipmen...194167662024-03-12 4:58:59263 days ago1710219539IN
0x53beA59B...c29D10F55
0 ETH0.0055916543.77817628
Change Render Ty...194167382024-03-12 4:53:23263 days ago1710219203IN
0x53beA59B...c29D10F55
0 ETH0.0042943449.31829589
Level Up189317092024-01-04 4:52:59331 days ago1704343979IN
0x53beA59B...c29D10F55
0 ETH0.0017385112.51739813
Change Name187023182023-12-03 0:31:59363 days ago1701563519IN
0x53beA59B...c29D10F55
0 ETH0.0036844931.30811971
Upgrade Equipmen...187022672023-12-03 0:21:47363 days ago1701562907IN
0x53beA59B...c29D10F55
0 ETH0.004063130.31306746
Level Up187022562023-12-03 0:19:35363 days ago1701562775IN
0x53beA59B...c29D10F55
0 ETH0.0048866530.92309574
Change Render Ty...185691752023-11-14 9:13:47382 days ago1699953227IN
0x53beA59B...c29D10F55
0 ETH0.002755427.07300079
Level Up185528262023-11-12 2:22:23384 days ago1699755743IN
0x53beA59B...c29D10F55
0 ETH0.0019715319.62214945
Level Up185528212023-11-12 2:21:23384 days ago1699755683IN
0x53beA59B...c29D10F55
0 ETH0.0021758920.84331177
Change Render Ty...185484592023-11-11 11:42:11385 days ago1699702931IN
0x53beA59B...c29D10F55
0 ETH0.0022133524.51062623
Change Render Ty...185484562023-11-11 11:41:35385 days ago1699702895IN
0x53beA59B...c29D10F55
0 ETH0.0020323722.50646407
Change Render Ty...185484522023-11-11 11:40:47385 days ago1699702847IN
0x53beA59B...c29D10F55
0 ETH0.0020726522.95249269
Change Render Ty...185484492023-11-11 11:40:11385 days ago1699702811IN
0x53beA59B...c29D10F55
0 ETH0.0021719124.05484266
Level Up185418422023-11-10 13:27:59386 days ago1699622879IN
0x53beA59B...c29D10F55
0 ETH0.0056816330.67288459
Change Render Ty...185336082023-11-09 9:51:47387 days ago1699523507IN
0x53beA59B...c29D10F55
0 ETH0.003136734.73576741
Reroll Race185127302023-11-06 11:45:59390 days ago1699271159IN
0x53beA59B...c29D10F55
0 ETH0.002257224.04071736
Reroll Race185119192023-11-06 9:01:59390 days ago1699261319IN
0x53beA59B...c29D10F55
0 ETH0.0031895333.97062901
Reroll Race185119142023-11-06 9:00:59390 days ago1699261259IN
0x53beA59B...c29D10F55
0 ETH0.002635328.0677241
Reroll Race185119082023-11-06 8:59:47390 days ago1699261187IN
0x53beA59B...c29D10F55
0 ETH0.0025562827.22606463
Reroll Race185119012023-11-06 8:58:23390 days ago1699261103IN
0x53beA59B...c29D10F55
0 ETH0.0023218124.72878724
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MTMCharactersController

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-10
*/

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IERC721 {
    function ownerOf(uint256 tokenId_) external view returns (address);
    function transferFrom(address from_, address to_, uint256 tokenId_) external;
}

interface iCM {
    function ownerOf(uint256 tokenId_) external view returns (address);
    function transferFrom(address from_, address to_, uint256 tokenId_) external;
    function contractAddressToTokenUploaded(address contractAddress_, uint256 tokenId_) external view returns (bool);
    function renderTypeAllowed(uint8 renderType_) external view returns (bool);
}

interface iMES {
    // View Functions
    function balanceOf(address address_) external view returns (uint256);
    function pendingRewards(address address_) external view returns (uint256); 
    function getStorageClaimableTokens(address address_) external view returns (uint256);
    function getPendingClaimableTokens(address address_) external view returns (uint256);
    function getTotalClaimableTokens(address address_) external view returns (uint256);
    // Administration
    function setYieldRate(address address_, uint256 yieldRate_) external;
    function addYieldRate(address address_, uint256 yieldRateAdd_) external;
    function subYieldRate(address address_, uint256 yieldRateSub_) external;
    // Updating
    function updateReward(address address_) external;
    // Credits System
    function deductCredits(address address_, uint256 amount_) external;
    function addCredits(address address_, uint256 amount_) external;
    // Burn
    function burn(address from, uint256 amount_) external;
}

interface iCS {
    struct Character {
        uint8  race_;
        uint8  renderType_;
        uint16 transponderId_;
        uint16 spaceCapsuleId_;
        uint8  augments_;
        uint16 basePoints_;
        uint16 totalEquipmentBonus_;
    }
    struct Stats {
        uint8 strength_; 
        uint8 agility_; 
        uint8 constitution_; 
        uint8 intelligence_; 
        uint8 spirit_; 
    }
    struct Equipment {
        uint8 weaponUpgrades_;
        uint8 chestUpgrades_;
        uint8 headUpgrades_;
        uint8 legsUpgrades_;
        uint8 vehicleUpgrades_;
        uint8 armsUpgrades_;
        uint8 artifactUpgrades_;
        uint8 ringUpgrades_;
    }

    // Create Character
    function createCharacter(uint tokenId_, Character memory Character_) external;
    // Characters
    function setName(uint256 tokenId_, string memory name_) external;
    function setBio(uint256 tokenId_, string memory bio_) external;
    function setRace(uint256 tokenId_, uint8 race_) external;
    function setRenderType(uint256 tokenId_, uint8 renderType_) external;
    function setTransponderId(uint256 tokenId_, uint16 transponderId_) external;
    function setSpaceCapsuleId(uint256 tokenId_, uint16 spaceCapsuleId_) external;
    function setAugments(uint256 tokenId_, uint8 augments_) external;
    function setBasePoints(uint256 tokenId_, uint16 basePoints_) external;
    function setBaseEquipmentBonus(uint256 tokenId_, uint16 baseEquipmentBonus_) external;
    function setTotalEquipmentBonus(uint256 tokenId_, uint16 totalEquipmentBonus) external;
    // Stats
    function setStrength(uint256 tokenId_, uint8 strength_) external;
    function setAgility(uint256 tokenId_, uint8 agility_) external;
    function setConstitution(uint256 tokenId_, uint8 constitution_) external;
    function setIntelligence(uint256 tokenId_, uint8 intelligence_) external;
    function setSpirit(uint256 tokenId_, uint8 spirit_) external;
    // Equipment
    function setWeaponUpgrades(uint256 tokenId_, uint8 upgrade_) external;
    function setChestUpgrades(uint256 tokenId_, uint8 upgrade_) external;
    function setHeadUpgrades(uint256 tokenId_, uint8 upgrade_) external;
    function setLegsUpgrades(uint256 tokenId_, uint8 upgrade_) external;
    function setVehicleUpgrades(uint256 tokenId_, uint8 upgrade_) external;
    function setArmsUpgrades(uint256 tokenId_, uint8 upgrade_) external;
    function setArtifactUpgrades(uint256 tokenId_, uint8 upgrade_) external;
    function setRingUpgrades(uint256 tokenId_, uint8 upgrade_) external;
    // Structs and Mappings
    function names(uint256 tokenId_) external view returns (string memory);
    function characters(uint256 tokenId_) external view returns (Character memory);
    function stats(uint256 tokenId_) external view returns (Stats memory);
    function equipments(uint256 tokenId_) external view returns (Equipment memory);
    function contractToRace(address contractAddress_) external view returns (uint8);
}

library Strings {
    function toString(uint256 value_) internal pure returns (string memory) {
        if (value_ == 0) { return "0"; }
        uint256 _iterate = value_; uint256 _digits;
        while (_iterate != 0) { _digits++; _iterate /= 10; } // get digits in value_
        bytes memory _buffer = new bytes(_digits);
        while (value_ != 0) { _digits--; _buffer[_digits] = bytes1(uint8(48 + uint256(value_ % 10 ))); value_ /= 10; } // create bytes of value_
        return string(_buffer); // return string converted bytes of value_
    }
}

library MTMLib {
    // Static String Returns
    function getNameOfItem(uint8 item_) public pure returns (string memory) {
        if      (item_ == 1) { return "WEAPONS";   }
        else if (item_ == 2) { return "CHEST";     }
        else if (item_ == 3) { return "HEAD";      }
        else if (item_ == 4) { return "LEGS";      }
        else if (item_ == 5) { return "VEHICLE";   }
        else if (item_ == 6) { return "ARMS";      }
        else if (item_ == 7) { return "ARTIFACTS"; }
        else if (item_ == 8) { return "RINGS";     }
        else                 { revert("Invalid Equipment Upgrades Query!"); }
    }

    // Static Rarity Stuff
    function getItemRarity(uint16 spaceCapsuleId_, string memory keyPrefix_) public pure returns (uint8) {
        uint256 _rarity = uint256(keccak256(abi.encodePacked(keyPrefix_, Strings.toString(spaceCapsuleId_)))) % 21;
        return uint8(_rarity);
    }
    function queryEquipmentUpgradability(uint8 rarity_) public pure returns (uint8) {
        return rarity_ >= 19 ? rarity_ == 19 ? 4 : 4 : 4; 
    }
    function queryBaseEquipmentTier(uint8 rarity_) public pure returns (uint8) {
        return rarity_ >= 19 ? rarity_ == 19 ? 1 : 2 : 0;
    }

    // Character Modification Costs
    function queryAugmentCost(uint8 currentLevel_) public pure returns (uint256) {
        if      (currentLevel_ == 0) { return 0;         }
        else if (currentLevel_ == 1) { return 1 ether;   }
        else if (currentLevel_ == 2) { return 2 ether;   }
        else if (currentLevel_ == 3) { return 5 ether;   }
        else if (currentLevel_ == 4) { return 10 ether;  }
        else if (currentLevel_ == 5) { return 15 ether;  }
        else if (currentLevel_ == 6) { return 25 ether;  }
        else if (currentLevel_ == 7) { return 50 ether;  }
        else if (currentLevel_ == 8) { return 100 ether; }
        else if (currentLevel_ == 9) { return 250 ether; }
        else                         { revert("Invalid level!"); }
    }
    function queryBasePointsUpgradeCost(uint16 currentLevel_) public pure returns (uint256) {
        uint8 _tier = uint8(currentLevel_ / 5);
        if      (_tier == 0) { return 1 ether;   }
        else if (_tier == 1) { return 2 ether;   }
        else if (_tier == 2) { return 5 ether;   }
        else if (_tier == 3) { return 10 ether;  }
        else if (_tier == 4) { return 20 ether;  }
        else if (_tier == 5) { return 30 ether;  }
        else if (_tier == 6) { return 50 ether;  }
        else if (_tier == 7) { return 70 ether;  }
        else if (_tier == 8) { return 100 ether; }
        else if (_tier == 9) { return 150 ether; }
        else                 { revert("Invalid Level!"); }
    }
    function queryEquipmentUpgradeCost(uint8 currentLevel_) public pure returns (uint256) {
        if      (currentLevel_ == 0) { return 50 ether;   }
        else if (currentLevel_ == 1) { return 250 ether;  }
        else if (currentLevel_ == 2) { return 750 ether;  }
        else if (currentLevel_ == 3) { return 1500 ether; }
        else                         { revert("Invalid Level!"); }
    }

    // Yield Rate Constants
    function getBaseYieldRate(uint8 augments_) public pure returns (uint256) {
        if      (augments_ == 0 ) { return 0.1 ether; }
        else if (augments_ == 1 ) { return 1 ether;   }
        else if (augments_ == 2 ) { return 2 ether;   }
        else if (augments_ == 3 ) { return 3 ether;   }
        else if (augments_ == 4 ) { return 4 ether;   }
        else if (augments_ == 5 ) { return 5 ether;   }
        else if (augments_ == 6 ) { return 6 ether;   }
        else if (augments_ == 7 ) { return 7 ether;   }
        else if (augments_ == 8 ) { return 8 ether;   }
        else if (augments_ == 9 ) { return 9 ether;   }
        else if (augments_ == 10) { return 10 ether;  }
        else                      { return 0;         }
    }
    function queryEquipmentModulus(uint8 rarity_, uint8 upgrades_) public pure returns (uint8) {
        uint8 _baseTier = queryBaseEquipmentTier(rarity_);
        uint8 _currentTier = _baseTier + upgrades_;
        if      (_currentTier == 0) { return 0;  }
        else if (_currentTier == 1) { return 2;  }
        else if (_currentTier == 2) { return 5;  }
        else if (_currentTier == 3) { return 10; }
        else if (_currentTier == 4) { return 20; }
        else if (_currentTier == 5) { return 35; }
        else if (_currentTier == 6) { return 50; }
        else                        { revert("Invalid Level!"); }
    }
    function getStatMultiplier(uint16 basePoints_) public pure returns (uint256) {
        return uint256( (basePoints_ * 2) + 100 );
    }
    function getEquipmentMultiplier(uint16 totalEquipmentBonus_) public pure returns (uint256) {
        return uint256( totalEquipmentBonus_ + 100 );
    }

    // Base Yield Rate Caclulations
    function getItemBaseBonus(uint16 spaceCapsuleId_, string memory keyPrefix_) public pure returns (uint8) {
        return queryEquipmentModulus( getItemRarity(spaceCapsuleId_, keyPrefix_), 0 );
    }
    function getEquipmentBaseBonus(uint16 spaceCapsuleId_) public pure returns (uint16) {
        return uint16(
        getItemBaseBonus(spaceCapsuleId_, "WEAPONS") + 
        getItemBaseBonus(spaceCapsuleId_, "CHEST") +
        getItemBaseBonus(spaceCapsuleId_, "HEAD") +
        getItemBaseBonus(spaceCapsuleId_, "LEGS") +
        getItemBaseBonus(spaceCapsuleId_, "VEHICLE") +
        getItemBaseBonus(spaceCapsuleId_, "ARMS") + 
        getItemBaseBonus(spaceCapsuleId_, "ARTIFACTS") +
        getItemBaseBonus(spaceCapsuleId_, "RINGS")
        );
    }

    // Yield Rate Calculation
    function getCharacterYieldRate(uint8 augments_, uint16 basePoints_, uint16 totalEquipmentBonus_) public pure returns (uint256) {
        uint256 _baseYield = getBaseYieldRate(augments_);
        uint256 _statMultiplier = getStatMultiplier(basePoints_);
        uint256 _eqMultiplier = getEquipmentMultiplier(totalEquipmentBonus_);
        return _baseYield * (_statMultiplier * _eqMultiplier) / 10000;
    }
}

library MTMStrings {
    function onlyAllowedCharacters(string memory string_) public pure returns (bool) {
        bytes memory _strBytes = bytes(string_);
        for (uint i = 0; i < _strBytes.length; i++) {
            if (_strBytes[i] < 0x20 || _strBytes[i] > 0x7A || _strBytes[i] == 0x26 || _strBytes[i] == 0x22 || _strBytes[i] == 0x3C || _strBytes[i] == 0x3E) {
                return false;
            }     
        }
        return true;
    }
}

contract MTMCharactersController {
    // Access
    address public owner;
    constructor() { owner = msg.sender; }
    modifier onlyOwner { require(msg.sender == owner, "You are not the owner!"); _; }
    function setNewOwner(address address_) external onlyOwner { owner = address_; }

    // Burn Target
    address internal constant burnAddress = 0x000000000000000000000000000000000000dEaD;

    // Interfaces
    iCM public CM; iMES public MES; iCS public CS;
    IERC721 public SC; IERC721 public TP;
    function setContracts(address cm_, address mes_, address cs_, address sc_, address tp_) external onlyOwner {
        CM = iCM(cm_); MES = iMES(mes_); CS = iCS(cs_);
        SC = IERC721(sc_); TP = IERC721(tp_);
    }

    // Internal Write Functions
    function __MESPayment(address address_, uint256 amount_, bool useCredits_) internal {
        if (useCredits_) {
            require(amount_ <= MES.getTotalClaimableTokens(address_), "Not enough MES credits to do action!");
            if (amount_ >= MES.getStorageClaimableTokens(address_)) { MES.updateReward(address_); }
            MES.deductCredits(address_, amount_);
        } else {
            require(amount_ <= MES.balanceOf(address_), "Not enough MES to do action!");
            MES.burn(address_, amount_);
        }
    }
    function __updateReward(address address_) internal {
        MES.updateReward(address_);
    }
    function __addYieldRate(address address_, uint256 yieldRate_) internal {
        MES.addYieldRate(address_, yieldRate_);
    }

    // Internal Read Functions
    function __getCharacter(uint256 characterId_) internal view returns (iCS.Character memory) {
        return CS.characters(characterId_);
    }
    function __getEquipment(uint256 characterId_) internal view returns (iCS.Equipment memory) {
        return CS.equipments(characterId_);
    }
    function __getStats(uint256 characterId_) internal view returns (iCS.Stats memory) {
        return CS.stats(characterId_);
    }
    function __getAugments(uint256 characterId_) internal view returns (uint8) {
        return CS.characters(characterId_).augments_;
    }
    function __getBasePoints(uint256 characterId_) internal view returns (uint16) {
        return CS.characters(characterId_).basePoints_;
    }

    // Internal Equipment Administration
    function __getEquipmentUpgrades(iCS.Equipment memory Equipment_, uint8 item_) internal pure returns (uint8) {
        if      (item_ == 1) { return Equipment_.weaponUpgrades_;   }
        else if (item_ == 2) { return Equipment_.chestUpgrades_;    }
        else if (item_ == 3) { return Equipment_.headUpgrades_;     }
        else if (item_ == 4) { return Equipment_.legsUpgrades_;     }
        else if (item_ == 5) { return Equipment_.vehicleUpgrades_;  }
        else if (item_ == 6) { return Equipment_.armsUpgrades_;     }
        else if (item_ == 7) { return Equipment_.artifactUpgrades_; }
        else if (item_ == 8) { return Equipment_.ringUpgrades_;     }
        else                 { revert("Invalid Equipment Upgrades Query!"); }
    }
    function __setItemUpgrades(uint256 characterId_, uint8 newUpgrades_, uint8 item_) internal {
        if      (item_ == 1) { CS.setWeaponUpgrades(characterId_, newUpgrades_);   }
        else if (item_ == 2) { CS.setChestUpgrades(characterId_, newUpgrades_);    }
        else if (item_ == 3) { CS.setHeadUpgrades(characterId_, newUpgrades_);     }
        else if (item_ == 4) { CS.setLegsUpgrades(characterId_, newUpgrades_);     }
        else if (item_ == 5) { CS.setVehicleUpgrades(characterId_, newUpgrades_);  }
        else if (item_ == 6) { CS.setArmsUpgrades(characterId_, newUpgrades_);     }
        else if (item_ == 7) { CS.setArtifactUpgrades(characterId_, newUpgrades_); }
        else if (item_ == 8) { CS.setRingUpgrades(characterId_, newUpgrades_);     }
        else                 { revert("Invalid Equipment Set Upgrade Query!"); }
    }

    // Augment Character
    function augmentCharacter(uint256 characterId_, uint256[] memory charactersToBurn_, bool useCredits_) public {
        require(msg.sender == CM.ownerOf(characterId_), "You don't own this character!");

        iCS.Character memory _Character = __getCharacter(characterId_);

        uint8 _augments = _Character.augments_;
        uint8 _numberOfAugments = uint8(charactersToBurn_.length);

        // Calculate the Augmentation Cost
        uint256 _totalAugmentCost;
        for (uint8 i = 0; i < _numberOfAugments; i++) {
            _totalAugmentCost += MTMLib.queryAugmentCost(_augments + i);
        }

        // Check $MES Requirements and Burn $MES!
        __MESPayment(msg.sender, _totalAugmentCost, useCredits_);

        // Check Character Requirements and Loop-Burn Characters!
        for (uint8 i = 0; i < _numberOfAugments; i++) {
            require(characterId_ != charactersToBurn_[i], "Cannot Burn Augmenting Character!");
            require(msg.sender == CM.ownerOf(charactersToBurn_[i]), "Unowned Character to Burn!");

            CM.transferFrom(msg.sender, burnAddress, charactersToBurn_[i]);
        }

        // Update Reward
        __updateReward(msg.sender);

        // Calculate Current Character Yield Rate before Augment
        uint256 _currentYieldRate = MTMLib.getCharacterYieldRate(_augments, _Character.basePoints_, _Character.totalEquipmentBonus_);

        // Set New Augment Level
        uint8 _newAugments = _augments + _numberOfAugments;
        CS.setAugments(characterId_, _newAugments);

        // Calculate New Character Yield Rate and Difference
        uint256 _newYieldRate = MTMLib.getCharacterYieldRate(_newAugments, _Character.basePoints_, _Character.totalEquipmentBonus_);
        uint256 _increasedYieldRate = _newYieldRate - _currentYieldRate;

        // Add Increased Yield Rate
        __addYieldRate(msg.sender, _increasedYieldRate);
    }
    function augmentCharacterWithMats(uint256 characterId_, uint256[] memory transponders_, uint256[] memory spaceCapsules_, bool useCredits_) public {
        require(msg.sender == CM.ownerOf(characterId_), "You don't own this Character!");
        require(transponders_.length == spaceCapsules_.length, "Pair length mismatch!");

        iCS.Character memory _Character = __getCharacter(characterId_);

        uint8 _augments = __getAugments(characterId_);
        uint8 _numberOfAugments = uint8(transponders_.length);

        // Calculate the Augmentation Cost
        uint256 _totalAugmentCost;
        for (uint8 i = 0; i < _numberOfAugments; i++) {
            _totalAugmentCost += MTMLib.queryAugmentCost(_augments + i);
        }

        // Check $MES Requirements and Burn $MES!
        __MESPayment(msg.sender, _totalAugmentCost, useCredits_);

        // Check TP/SC Requirements and Loop-Burn TP/SC!
        for (uint8 i = 0; i < _numberOfAugments; i++) {
            require(msg.sender == TP.ownerOf(transponders_[i]) && msg.sender == SC.ownerOf(spaceCapsules_[i]), "Not owner of pair!");

            TP.transferFrom(msg.sender, burnAddress, transponders_[i]);
            SC.transferFrom(msg.sender, burnAddress, spaceCapsules_[i]);
        }

        // Update Reward
        __updateReward(msg.sender);

        // Calculate Current Character Yield Rate before Augment
        uint256 _currentYieldRate = MTMLib.getCharacterYieldRate(_augments, _Character.basePoints_, _Character.totalEquipmentBonus_);

        // Set New Augment Level
        uint8 _newAugments = _augments + _numberOfAugments;
        CS.setAugments(characterId_, _newAugments);

        // Calculate New Character Yield Rate and Difference
        uint256 _newYieldRate = MTMLib.getCharacterYieldRate(_newAugments, _Character.basePoints_, _Character.totalEquipmentBonus_);
        uint256 _increasedYieldRate = _newYieldRate - _currentYieldRate;

        // Add Increased Yield Rate
        __addYieldRate(msg.sender, _increasedYieldRate);
    }

    // Level Up Base Points
    function levelUp(uint256 characterId_, uint16 amount_, bool useCredits_) public {
        require(msg.sender == CM.ownerOf(characterId_), "You don't own this Character!");

        iCS.Character memory _Character = __getCharacter(characterId_);

        uint16 _currentBasePoints = __getBasePoints(characterId_);

        // Calculate $MES Cost for Level Up
        uint256 _levelUpCost;
        for (uint16 i = 0; i < amount_; i++) {
            _levelUpCost += MTMLib.queryBasePointsUpgradeCost(_currentBasePoints + i);
        }

        // Check $MES Requires and Burn $MES!
        __MESPayment(msg.sender, _levelUpCost, useCredits_);

        // Update Reward
        __updateReward(msg.sender);

        // Calculate Current Character Yield Rate before Augment
        uint256 _currentYieldRate = MTMLib.getCharacterYieldRate(
            _Character.augments_, _currentBasePoints, _Character.totalEquipmentBonus_);

        // Set New Base Points
        uint16 _newBasePoints = _currentBasePoints + amount_;
        CS.setBasePoints(characterId_, _newBasePoints);

        // Calculate Yield Rate Benefits
        uint256 _newYieldRate = MTMLib.getCharacterYieldRate(
            _Character.augments_, _newBasePoints, _Character.totalEquipmentBonus_);
        uint256 _increasedYieldRate = _newYieldRate - _currentYieldRate;

        // Add Increased Yield Rate
        __addYieldRate(msg.sender, _increasedYieldRate);
    }
    function multiLevelUp(uint256[] memory characterIds_, uint16[] memory amounts_, bool useCredits_) public {
        // User must make sure they have enough $MES for the entire loop otherwise it will revert. Use with care.
        require(characterIds_.length == amounts_.length, "Mismatched length of arrays!");
        for (uint256 i = 0; i < characterIds_.length; i++) {
            levelUp(characterIds_[i], amounts_[i], useCredits_);
        }
    }

    // Equipment Upgrade
    function upgradeEquipment(uint256 characterId_, uint8 amount_, uint8 item_, bool useCredits_) public {
        require(msg.sender == CM.ownerOf(characterId_), "You don't own this Character!");

        iCS.Character memory _Character = __getCharacter(characterId_);
        iCS.Equipment memory _Equipment = __getEquipment(characterId_);

        uint8 _rarity = MTMLib.getItemRarity(_Character.spaceCapsuleId_, MTMLib.getNameOfItem(item_));
        uint8 _currentUpgrades = __getEquipmentUpgrades(_Equipment, item_);

        require(_currentUpgrades + amount_ <= MTMLib.queryEquipmentUpgradability(_rarity), "Request to upgrade past upgradability!");

        // Calculate the Upgrade Cost
        uint256 _upgradeCost;
        for (uint8 i = 0; i < amount_; i++) {
            _upgradeCost += MTMLib.queryEquipmentUpgradeCost(_currentUpgrades + i);
        }

        // Check $MES Requires and Burn $MES!
        __MESPayment(msg.sender, _upgradeCost, useCredits_);

        // Update Reward
        __updateReward(msg.sender);

        // Calculate the Curent Yield Rate before Upgrading
        uint256 _currentYieldRate = MTMLib.getCharacterYieldRate(_Character.augments_, _Character.basePoints_, _Character.totalEquipmentBonus_);

        // Calculate and Set the New Item Level
        uint8 _newUpgrades = _currentUpgrades + amount_;
        __setItemUpgrades(characterId_, _newUpgrades, item_);

        // Calculate and Set the New Total Equipment Bonus of the Character
        uint16 _newTotalEquipmentBonus = _Character.totalEquipmentBonus_ + ( MTMLib.queryEquipmentModulus(_rarity, _newUpgrades) - MTMLib.queryEquipmentModulus(_rarity, _currentUpgrades) );
        CS.setTotalEquipmentBonus(characterId_, _newTotalEquipmentBonus);

        // Calculate the Yield Rate Difference
        uint256 _newYieldRate = MTMLib.getCharacterYieldRate(_Character.augments_, _Character.basePoints_, _newTotalEquipmentBonus);
        uint256 _increasedYieldRate = _newYieldRate - _currentYieldRate;

        // Adjust the Yield Rate accordingly
        __addYieldRate(msg.sender, _increasedYieldRate);
    }
    function multiUpgradeEquipment(uint256 characterId_, uint8[] memory amounts_, uint8[] memory items_, bool useCredits_) public {
        require(amounts_.length == items_.length, "Amounts and Items length mismatch!");
        for (uint256 i = 0; i < amounts_.length; i++) {
            upgradeEquipment(characterId_, amounts_[i], items_[i], useCredits_);
        }
    }

    // Role Play Stats
    function __getTotalStatsLeveled(iCS.Stats memory Stats_) internal pure returns (uint8) {
        return Stats_.strength_ + Stats_.agility_ + Stats_.constitution_ + Stats_.intelligence_ + Stats_.spirit_;
    }
    function __getCharacterLevel(iCS.Stats memory Stats_, uint8 attribute_) internal pure returns (uint8) {
        if      (attribute_ == 1) { return Stats_.strength_; }
        else if (attribute_ == 2) { return Stats_.agility_; }
        else if (attribute_ == 3) { return Stats_.constitution_; }
        else if (attribute_ == 4) { return Stats_.intelligence_; }
        else if (attribute_ == 5) { return Stats_.spirit_; }
        else                      { revert("Invalid attribute type!"); }
    }
    function __setCharacterLevel(uint256 characterId_, uint8 attribute_, uint8 level_) internal {
        if      (attribute_ == 1) { CS.setStrength(characterId_, level_); }
        else if (attribute_ == 2) { CS.setAgility(characterId_, level_); }
        else if (attribute_ == 3) { CS.setConstitution(characterId_, level_); }
        else if (attribute_ == 4) { CS.setIntelligence(characterId_, level_); }
        else if (attribute_ == 5) { CS.setSpirit(characterId_, level_); }
        else                      { revert("Invalid attribute type!"); }
    }
    function levelCharacterStat(uint256 characterId_, uint8 attribute_, uint8 amount_) public {
        require(msg.sender == CM.ownerOf(characterId_), "You don't own this Character!");

        iCS.Character memory _Character = __getCharacter(characterId_);
        iCS.Stats memory _Stats = __getStats(characterId_);
        require(__getTotalStatsLeveled(_Stats) + amount_ <= _Character.basePoints_, "Request to upgrade stats above available base points!");

        // Get Current Level and New Level of Attribute
        uint8 _currentLevel = __getCharacterLevel(_Stats, attribute_);
        uint8 _newLevel = _currentLevel + amount_;

        // Set New Level for Attribute
        __setCharacterLevel(characterId_, attribute_, _newLevel);
    }
    function multiLevelCharacterStat(uint256 characterId_, uint8[] memory attributes_, uint8[] memory amounts_) public {
        require(msg.sender == CM.ownerOf(characterId_), "You don't own this Character!");
        require(attributes_.length == amounts_.length, "Attributes and Amounts length mismatch!");
        
        // Load Character and Stats into local memory
        iCS.Character memory _Character = __getCharacter(characterId_);
        iCS.Stats memory _Stats = __getStats(characterId_);

        // Calculate total Amounts to add
        uint16 _amountToAdd;
        for (uint256 i = 0; i < amounts_.length; i++) {
            _amountToAdd += amounts_[i];
        }

        // Make sure stat upgrades are not above base points
        require(__getTotalStatsLeveled(_Stats) + _amountToAdd <= _Character.basePoints_, "Request to upgrade stats above available base points!");

        // Loop-Level each stat
        for (uint256 i = 0; i < amounts_.length; i++) {
            uint8 _currentLevel = __getCharacterLevel(_Stats, attributes_[i]);
            uint8 _newLevel = _currentLevel + amounts_[i];

            __setCharacterLevel(characterId_, attributes_[i], _newLevel);
        }
    }

    // General Cosmetics Variables
    uint256 nameChangeCost = 5 ether;
    uint256 bioChangeCost = 20 ether;
    uint256 rerollRaceCost = 10 ether;
    uint256 uploadRaceCost = 50 ether;
    uint256 renderTypeChangeCost = 10 ether;
    function __setCostmeticCost(uint8 type_, uint256 cost_) internal {
        if      (type_ == 1) { nameChangeCost = cost_; }
        else if (type_ == 2) { bioChangeCost = cost_; }
        else if (type_ == 3) { rerollRaceCost = cost_; }
        else if (type_ == 4) { uploadRaceCost = cost_; }
        else if (type_ == 5) { renderTypeChangeCost = cost_; }
        else                 { revert("Invalid Type!"); }
    }
    function setCosmeticCosts(uint8[] memory types_, uint256[] memory costs_) public onlyOwner {
        require(types_.length == costs_.length, "Array length mismatch!");
        for (uint256 i = 0; i < costs_.length; i++) {
            __setCostmeticCost(types_[i], costs_[i]);
        }
    }

    // Change Name
    bool public characterChangeNameable = true;
    function setCharacterChangeNameable(bool bool_) external onlyOwner { characterChangeNameable = bool_; }

    function changeName(uint256 characterId_, string memory name_, bool useCredits_) public {
        require(characterChangeNameable, "Characters not namable!");
        require(msg.sender == CM.ownerOf(characterId_), "You don't own this Character!");
        require(MTMStrings.onlyAllowedCharacters(name_), "Name contains unallowed characters!");
        require(20 >= bytes(name_).length, "Name can only contain 20 characters max!");
        __MESPayment(msg.sender, nameChangeCost, useCredits_);
        CS.setName(characterId_, name_);
    }

    // Change Bio
    bool public characterChangeBioable = true;
    function setCharacterChangeBioable(bool bool_) external onlyOwner { characterChangeBioable = bool_; }

    function changeBio(uint256 characterId_, string memory bio_, bool useCredits_) public {
        require(characterChangeBioable, "Characters not bio changable!");
        require(msg.sender == CM.ownerOf(characterId_), "You don't own this Character!");
        require(MTMStrings.onlyAllowedCharacters(bio_), "Bio contains unallowed characters!");
        // require(160 >= bytes(bio_).length, "Bio can only contain 160 characters max!");
        __MESPayment(msg.sender, bioChangeCost, useCredits_);
        CS.setBio(characterId_, bio_);
    }

    // Reroll Race
    bool public characterRerollable;
    function setCharacterRerollable(bool bool_) public onlyOwner { characterRerollable = bool_; }
    
    function rerollRace(uint256 characterId_, bool useCredits_) public {
        require(characterRerollable, "Character model is not rerollable!");
        require(msg.sender == CM.ownerOf(characterId_), "You don't own this Character!");
        __MESPayment(msg.sender, rerollRaceCost, useCredits_);
        uint8 _race = uint8( (uint256(keccak256(abi.encodePacked(msg.sender, block.timestamp, block.difficulty, characterId_))) % 10) + 1 ); // RNG (1-10) 
        CS.setRace(characterId_, _race);
    }

    // Upload Race
    bool public characterUploadable;
    function setCharacterUploadable(bool bool_) public onlyOwner { characterUploadable = bool_; }
    mapping(address => mapping(uint256 => bool)) public contractAddressToTokenUploaded;
    
    function uploadRace(uint256 characterId_, address contractAddress_, uint256 uploadId_, bool useCredits_) public {
        require(characterUploadable, "Character type is not uploadable!");
        require(msg.sender == CM.ownerOf(characterId_), "You don't own this Character!");
        require(!CM.contractAddressToTokenUploaded(contractAddress_, uploadId_), "This character has already been uploaded!"); // from CM
        require(contractAddressToTokenUploaded[contractAddress_][uploadId_], "This character has already been uploaded"); // from this contract

        __MESPayment(msg.sender, uploadRaceCost, useCredits_);

        contractAddressToTokenUploaded[contractAddress_][uploadId_] = true;

        uint8 _race = CS.contractToRace(contractAddress_);
        CS.setRace(characterId_, _race);
    }

    // Change Render Type
    bool public renderTypeChangable;
    function setRenderTypeChangable(bool bool_) public onlyOwner { renderTypeChangable = bool_; }
    
    function changeRenderType(uint256 characterId_, uint8 renderType_, bool useCredits_) public {
        require(renderTypeChangable, "Render type is not changable!");
        require(CM.renderTypeAllowed(renderType_), "Render type is not supported!");
        require(msg.sender == CM.ownerOf(characterId_), "You don't own this Character!");
         __MESPayment(msg.sender, uploadRaceCost, useCredits_);
        CS.setRenderType(characterId_, renderType_);
    }

    // Public View Functions (Mainly for Interfacing)
    function getCharacterYieldRate(uint256 characterId_) public view returns (uint256) {
        iCS.Character memory Character_ = __getCharacter(characterId_);
        return MTMLib.getCharacterYieldRate(Character_.augments_, Character_.basePoints_, Character_.totalEquipmentBonus_);
    }
    function queryCharacterYieldRate(uint8 augments_, uint16 basePoints_, uint16 totalEquipmentBonus_) public pure returns (uint256) {
        return MTMLib.getCharacterYieldRate(augments_, basePoints_, totalEquipmentBonus_);
    }
    function getItemRarity(uint16 spaceCapsuleId_, string memory keyPrefix_) public pure returns (uint8) {
        return MTMLib.getItemRarity(spaceCapsuleId_, keyPrefix_);
    }
    function queryBaseEquipmentTier(uint8 rarity_) public pure returns (uint8) {
        return MTMLib.queryBaseEquipmentTier(rarity_);
    }
    function getEquipmentBaseBonus(uint16 spaceCapsuleId_) public pure returns (uint16) {
        return MTMLib.getEquipmentBaseBonus(spaceCapsuleId_);
    }

    // Add GetCurrentItemLevel public view function
    function getNameOfItem(uint8 itemType_) public pure returns (string memory) {
        return MTMLib.getNameOfItem(itemType_);
    }
    function getCurrentItemLevel(uint256 characterId_, uint8 itemType_) public view returns (uint8) {
        iCS.Character memory _Character = __getCharacter(characterId_);
        iCS.Equipment memory _Equipment = __getEquipment(characterId_);

        uint8 _rarity = getItemRarity(_Character.spaceCapsuleId_, getNameOfItem(itemType_));
        uint8 _baseEquipmentTier = queryBaseEquipmentTier(_rarity);

        uint8 _upgrades;
        if      (itemType_ == 1) { _upgrades = _Equipment.weaponUpgrades_; }
        else if (itemType_ == 2) { _upgrades = _Equipment.chestUpgrades_; }
        else if (itemType_ == 3) { _upgrades = _Equipment.headUpgrades_; }
        else if (itemType_ == 4) { _upgrades = _Equipment.legsUpgrades_; }
        else if (itemType_ == 5) { _upgrades = _Equipment.vehicleUpgrades_; }
        else if (itemType_ == 6) { _upgrades = _Equipment.armsUpgrades_; }
        else if (itemType_ == 7) { _upgrades = _Equipment.artifactUpgrades_; }
        else if (itemType_ == 8) { _upgrades = _Equipment.ringUpgrades_; }
        else                     { revert("Invalid Item!"); }

        return _baseEquipmentTier + _upgrades;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CM","outputs":[{"internalType":"contract iCM","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CS","outputs":[{"internalType":"contract iCS","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MES","outputs":[{"internalType":"contract iMES","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SC","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TP","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"characterId_","type":"uint256"},{"internalType":"uint256[]","name":"charactersToBurn_","type":"uint256[]"},{"internalType":"bool","name":"useCredits_","type":"bool"}],"name":"augmentCharacter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"characterId_","type":"uint256"},{"internalType":"uint256[]","name":"transponders_","type":"uint256[]"},{"internalType":"uint256[]","name":"spaceCapsules_","type":"uint256[]"},{"internalType":"bool","name":"useCredits_","type":"bool"}],"name":"augmentCharacterWithMats","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"characterId_","type":"uint256"},{"internalType":"string","name":"bio_","type":"string"},{"internalType":"bool","name":"useCredits_","type":"bool"}],"name":"changeBio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"characterId_","type":"uint256"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"bool","name":"useCredits_","type":"bool"}],"name":"changeName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"characterId_","type":"uint256"},{"internalType":"uint8","name":"renderType_","type":"uint8"},{"internalType":"bool","name":"useCredits_","type":"bool"}],"name":"changeRenderType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"characterChangeBioable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"characterChangeNameable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"characterRerollable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"characterUploadable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"contractAddressToTokenUploaded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"characterId_","type":"uint256"}],"name":"getCharacterYieldRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"characterId_","type":"uint256"},{"internalType":"uint8","name":"itemType_","type":"uint8"}],"name":"getCurrentItemLevel","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"spaceCapsuleId_","type":"uint16"}],"name":"getEquipmentBaseBonus","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint16","name":"spaceCapsuleId_","type":"uint16"},{"internalType":"string","name":"keyPrefix_","type":"string"}],"name":"getItemRarity","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint8","name":"itemType_","type":"uint8"}],"name":"getNameOfItem","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"characterId_","type":"uint256"},{"internalType":"uint8","name":"attribute_","type":"uint8"},{"internalType":"uint8","name":"amount_","type":"uint8"}],"name":"levelCharacterStat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"characterId_","type":"uint256"},{"internalType":"uint16","name":"amount_","type":"uint16"},{"internalType":"bool","name":"useCredits_","type":"bool"}],"name":"levelUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"characterId_","type":"uint256"},{"internalType":"uint8[]","name":"attributes_","type":"uint8[]"},{"internalType":"uint8[]","name":"amounts_","type":"uint8[]"}],"name":"multiLevelCharacterStat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"characterIds_","type":"uint256[]"},{"internalType":"uint16[]","name":"amounts_","type":"uint16[]"},{"internalType":"bool","name":"useCredits_","type":"bool"}],"name":"multiLevelUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"characterId_","type":"uint256"},{"internalType":"uint8[]","name":"amounts_","type":"uint8[]"},{"internalType":"uint8[]","name":"items_","type":"uint8[]"},{"internalType":"bool","name":"useCredits_","type":"bool"}],"name":"multiUpgradeEquipment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"rarity_","type":"uint8"}],"name":"queryBaseEquipmentTier","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint8","name":"augments_","type":"uint8"},{"internalType":"uint16","name":"basePoints_","type":"uint16"},{"internalType":"uint16","name":"totalEquipmentBonus_","type":"uint16"}],"name":"queryCharacterYieldRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"renderTypeChangable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"characterId_","type":"uint256"},{"internalType":"bool","name":"useCredits_","type":"bool"}],"name":"rerollRace","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setCharacterChangeBioable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setCharacterChangeNameable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setCharacterRerollable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setCharacterUploadable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"cm_","type":"address"},{"internalType":"address","name":"mes_","type":"address"},{"internalType":"address","name":"cs_","type":"address"},{"internalType":"address","name":"sc_","type":"address"},{"internalType":"address","name":"tp_","type":"address"}],"name":"setContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8[]","name":"types_","type":"uint8[]"},{"internalType":"uint256[]","name":"costs_","type":"uint256[]"}],"name":"setCosmeticCosts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"setNewOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setRenderTypeChangable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"characterId_","type":"uint256"},{"internalType":"uint8","name":"amount_","type":"uint8"},{"internalType":"uint8","name":"item_","type":"uint8"},{"internalType":"bool","name":"useCredits_","type":"bool"}],"name":"upgradeEquipment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"characterId_","type":"uint256"},{"internalType":"address","name":"contractAddress_","type":"address"},{"internalType":"uint256","name":"uploadId_","type":"uint256"},{"internalType":"bool","name":"useCredits_","type":"bool"}],"name":"uploadRace","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052674563918244f400006006556801158e460913d00000600755678ac7230489e8000060088190556802b5e3af16b1880000600955600a55600b805461ffff191661010117905534801561005657600080fd5b50600080546001600160a01b031916331790556151a8806100786000396000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c806383b2dd8b1161013b578063c16ac06f116100b8578063e2d979341161007c578063e2d9793414610564578063e5b0754214610577578063f5a1f5b41461058a578063f63bf8bd1461059d578063f9bd780a146105b057600080fd5b8063c16ac06f146104f9578063c6bec4531461050c578063d3be215a1461051f578063dbbc5f0a1461053f578063de0657101461055157600080fd5b80639bd8e920116100ff5780639bd8e920146104a0578063a8c16e56146104b3578063a96bbdf5146104c6578063b4ca50a6146104d3578063bc6b1bdf146104e657600080fd5b806383b2dd8b1461042b57806387092a91146104385780638bcd63521461044b5780638da5cb5b1461045f578063978fbc3c1461047257600080fd5b80635f3d7de8116101c9578063699c0f841161018d578063699c0f84146103b95780636d71931b146103cc57806375af9d8f146103df5780637e633e00146103f2578063813fd7fd1461040557600080fd5b80635f3d7de814610348578063602123c61461035b578063639807d01461036e57806365e8659b14610381578063673afa64146103a657600080fd5b8063361617111161021057806336161711146102c35780633ae23cc4146102e45780633fb139a51461030f57806346b088d2146103225780635a1389111461033557600080fd5b806314a8c37b1461024d5780631625a4701461026257806327d217ff1461028a5780632a8586291461029d5780632d819dfc146102b0575b600080fd5b61026061025b3660046146af565b6105c3565b005b600b546102759062010000900460ff1681565b60405190151581526020015b60405180910390f35b610260610298366004614ae5565b610614565b6102606102ab366004614bab565b610c06565b6102606102be3660046146af565b610cc5565b6102d66102d1366004614db8565b610d02565b604051908152602001610281565b6003546102f7906001600160a01b031681565b6040516001600160a01b039091168152602001610281565b61026061031d36600461464c565b610da4565b610260610330366004614c0e565b610e77565b6004546102f7906001600160a01b031681565b6102606103563660046146af565b611066565b610260610369366004614b3f565b6110aa565b6005546102f7906001600160a01b031681565b61039461038f366004614cb3565b6112f2565b60405160ff9091168152602001610281565b6102606103b43660046146af565b611436565b6102606103c73660046146af565b611473565b6102606103da366004614d36565b6114b9565b6103946103ed366004614d7e565b611b98565b610260610400366004614572565b611c20565b610418610413366004614976565b611cd2565b60405161ffff9091168152602001610281565b600d546102759060ff1681565b6103946104463660046149b0565b611d5b565b600b54610275906301000000900460ff1681565b6000546102f7906001600160a01b031681565b610275610480366004614546565b600c60209081526000928352604080842090915290825290205460ff1681565b6102d66104ae3660046149f5565b611dee565b6102606104c1366004614a27565b611ea3565b600b546102759060ff1681565b6102606104e1366004614cd8565b612239565b6102606104f4366004614c3e565b612448565b6001546102f7906001600160a01b031681565b61026061051a366004614cff565b6126c7565b61053261052d366004614d7e565b6127f2565b6040516102819190614e24565b600b5461027590610100900460ff1681565b61026061055f366004614c3e565b61287e565b6002546102f7906001600160a01b031681565b610260610585366004614a71565b612a9e565b61026061059836600461449b565b613192565b6102606105ab3660046144d5565b6131de565b6102606105be366004614c7c565b613267565b6000546001600160a01b031633146105f65760405162461bcd60e51b81526004016105ed90614e37565b60405180910390fd5b600b805491151563010000000263ff00000019909216919091179055565b6001546040516331a9108f60e11b8152600481018590526001600160a01b0390911690636352211e9060240160206040518083038186803b15801561065857600080fd5b505afa15801561066c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069091906144b8565b6001600160a01b0316336001600160a01b0316146106f05760405162461bcd60e51b815260206004820152601d60248201527f596f7520646f6e2774206f776e2074686973206368617261637465722100000060448201526064016105ed565b60006106fb846135ef565b60808101518451919250906000805b8260ff168160ff1610156107cb5773a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d63a7eb59d161073c8387614fe1565b6040516001600160e01b031960e084901b16815260ff909116600482015260240160206040518083038186803b15801561077557600080fd5b505af4158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad9190614a0e565b6107b79083614fc9565b9150806107c3816150a9565b91505061070a565b506107d73382876136a0565b60005b8260ff168160ff161015610a1757868160ff16815181106107fd576107fd615101565b602002602001015188141561085e5760405162461bcd60e51b815260206004820152602160248201527f43616e6e6f74204275726e204175676d656e74696e67204368617261637465726044820152602160f81b60648201526084016105ed565b60015487516001600160a01b0390911690636352211e90899060ff851690811061088a5761088a615101565b60200260200101516040518263ffffffff1660e01b81526004016108b091815260200190565b60206040518083038186803b1580156108c857600080fd5b505afa1580156108dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090091906144b8565b6001600160a01b0316336001600160a01b0316146109605760405162461bcd60e51b815260206004820152601a60248201527f556e6f776e65642043686172616374657220746f204275726e2100000000000060448201526064016105ed565b60015487516001600160a01b03909116906323b872dd90339061dead908b9060ff871690811061099257610992615101565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b1580156109ec57600080fd5b505af1158015610a00573d6000803e3d6000fd5b505050508080610a0f906150a9565b9150506107da565b50610a213361399f565b60a084015160c0850151604051637332eaed60e01b815260ff8616600482015261ffff92831660248201529116604482015260009073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d90637332eaed9060640160206040518083038186803b158015610a8d57600080fd5b505af4158015610aa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac59190614a0e565b90506000610ad38486614fe1565b600354604051630b76df3560e21b8152600481018c905260ff831660248201529192506001600160a01b031690632ddb7cd490604401600060405180830381600087803b158015610b2357600080fd5b505af1158015610b37573d6000803e3d6000fd5b5050505060a086015160c0870151604051637332eaed60e01b815260ff8416600482015261ffff92831660248201529116604482015260009073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d90637332eaed9060640160206040518083038186803b158015610ba757600080fd5b505af4158015610bbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdf9190614a0e565b90506000610bed8483615006565b9050610bf933826139fa565b5050505050505050505050565b8151835114610c625760405162461bcd60e51b815260206004820152602260248201527f416d6f756e747320616e64204974656d73206c656e677468206d69736d617463604482015261682160f01b60648201526084016105ed565b60005b8351811015610cbe57610cac85858381518110610c8457610c84615101565b6020026020010151858481518110610c9e57610c9e615101565b6020026020010151856114b9565b80610cb68161508e565b915050610c65565b5050505050565b6000546001600160a01b03163314610cef5760405162461bcd60e51b81526004016105ed90614e37565b600b805460ff1916911515919091179055565b604051637332eaed60e01b815260ff8416600482015261ffff80841660248301528216604482015260009073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d90637332eaed9060640160206040518083038186803b158015610d6457600080fd5b505af4158015610d78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9c9190614a0e565b949350505050565b6000546001600160a01b03163314610dce5760405162461bcd60e51b81526004016105ed90614e37565b8051825114610e185760405162461bcd60e51b81526020600482015260166024820152754172726179206c656e677468206d69736d617463682160501b60448201526064016105ed565b60005b8151811015610e7257610e60838281518110610e3957610e39615101565b6020026020010151838381518110610e5357610e53615101565b6020026020010151613a64565b80610e6a8161508e565b915050610e1b565b505050565b600b5462010000900460ff16610eda5760405162461bcd60e51b815260206004820152602260248201527f436861726163746572206d6f64656c206973206e6f74207265726f6c6c61626c604482015261652160f01b60648201526084016105ed565b6001546040516331a9108f60e11b8152600481018490526001600160a01b0390911690636352211e9060240160206040518083038186803b158015610f1e57600080fd5b505afa158015610f32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5691906144b8565b6001600160a01b0316336001600160a01b031614610f865760405162461bcd60e51b81526004016105ed90614ebc565b610f9333600854836136a0565b6040516bffffffffffffffffffffffff193360601b16602082015242603482015244605482015260748101839052600090600a906094016040516020818303038152906040528051906020012060001c610fed91906150c9565b610ff8906001614fc9565b6003546040516369cbb5a560e01b81526004810186905260ff831660248201529192506001600160a01b0316906369cbb5a5906044015b600060405180830381600087803b15801561104957600080fd5b505af115801561105d573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031633146110905760405162461bcd60e51b81526004016105ed90614e37565b600b80549115156101000261ff0019909216919091179055565b6001546040516331a9108f60e11b8152600481018590526001600160a01b0390911690636352211e9060240160206040518083038186803b1580156110ee57600080fd5b505afa158015611102573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112691906144b8565b6001600160a01b0316336001600160a01b0316146111565760405162461bcd60e51b81526004016105ed90614ebc565b80518251146111b75760405162461bcd60e51b815260206004820152602760248201527f4174747269627574657320616e6420416d6f756e7473206c656e677468206d69604482015266736d617463682160c81b60648201526084016105ed565b60006111c2846135ef565b905060006111cf85613af6565b90506000805b845181101561121a578481815181106111f0576111f0615101565b602002602001015160ff16826112069190614fa3565b9150806112128161508e565b9150506111d5565b508260a0015161ffff168161122e84613b99565b60ff1661123b9190614fa3565b61ffff16111561125d5760405162461bcd60e51b81526004016105ed90614e67565b60005b845181101561105d57600061128e8488848151811061128157611281615101565b6020026020010151613bdc565b905060008683815181106112a4576112a4615101565b6020026020010151826112b79190614fe1565b90506112dd898985815181106112cf576112cf615101565b602002602001015183613c96565b505080806112ea9061508e565b915050611260565b6000806112fe846135ef565b9050600061130b85613df4565b905060006113208360600151610446876127f2565b9050600061132d82611b98565b905060008660ff16600114156113455750825161141e565b8660ff166002141561135c5750602083015161141e565b8660ff16600314156113735750604083015161141e565b8660ff166004141561138a5750606083015161141e565b8660ff16600514156113a15750608083015161141e565b8660ff16600614156113b8575060a083015161141e565b8660ff16600714156113cf575060c083015161141e565b8660ff16600814156113e6575060e083015161141e565b60405162461bcd60e51b815260206004820152600d60248201526c496e76616c6964204974656d2160981b60448201526064016105ed565b6114288183614fe1565b955050505050505b92915050565b6000546001600160a01b031633146114605760405162461bcd60e51b81526004016105ed90614e37565b600d805460ff1916911515919091179055565b6000546001600160a01b0316331461149d5760405162461bcd60e51b81526004016105ed90614e37565b600b8054911515620100000262ff000019909216919091179055565b6001546040516331a9108f60e11b8152600481018690526001600160a01b0390911690636352211e9060240160206040518083038186803b1580156114fd57600080fd5b505afa158015611511573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153591906144b8565b6001600160a01b0316336001600160a01b0316146115655760405162461bcd60e51b81526004016105ed90614ebc565b6000611570856135ef565b9050600061157d86613df4565b60608301516040516369df10ad60e11b815260ff8716600482015291925060009173a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d916387092a9191839063d3be215a9060240160006040518083038186803b1580156115dd57600080fd5b505af41580156115f1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261161991908101906146e9565b6040518363ffffffff1660e01b8152600401611636929190614ef3565b60206040518083038186803b15801561164e57600080fd5b505af4158015611662573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116869190614d9b565b905060006116948387613eae565b604051632cbc38ab60e21b815260ff8416600482015290915073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d9063b2f0e2ac9060240160206040518083038186803b1580156116e457600080fd5b505af41580156116f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171c9190614d9b565b60ff166117298883614fe1565b60ff1611156117895760405162461bcd60e51b815260206004820152602660248201527f5265717565737420746f20757067726164652070617374207570677261646162604482015265696c6974792160d01b60648201526084016105ed565b6000805b8860ff168160ff16101561184e5773a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d6379bcfefb6117bf8386614fe1565b6040516001600160e01b031960e084901b16815260ff909116600482015260240160206040518083038186803b1580156117f857600080fd5b505af415801561180c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118309190614a0e565b61183a9083614fc9565b915080611846816150a9565b91505061178d565b5061185a3382886136a0565b6118633361399f565b608085015160a086015160c0870151604051637332eaed60e01b815260ff909316600484015261ffff918216602484015216604482015260009073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d90637332eaed9060640160206040518083038186803b1580156118d457600080fd5b505af41580156118e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190c9190614a0e565b9050600061191a8a85614fe1565b90506119278b828b613fb7565b604051633f0c9a9160e01b815260ff80871660048301528516602482015260009073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d90633f0c9a919060440160206040518083038186803b15801561197f57600080fd5b505af4158015611993573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b79190614d9b565b604051633f0c9a9160e01b815260ff80891660048301528416602482015273a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d90633f0c9a919060440160206040518083038186803b158015611a0c57600080fd5b505af4158015611a20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a449190614d9b565b611a4e919061501d565b60ff168860c00151611a609190614fa3565b60035460405163232a228960e11b8152600481018f905261ffff831660248201529192506001600160a01b031690634654451290604401600060405180830381600087803b158015611ab157600080fd5b505af1158015611ac5573d6000803e3d6000fd5b50505050608088015160a0890151604051637332eaed60e01b815260ff909216600483015261ffff90811660248301528216604482015260009073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d90637332eaed9060640160206040518083038186803b158015611b3657600080fd5b505af4158015611b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6e9190614a0e565b90506000611b7c8583615006565b9050611b8833826139fa565b5050505050505050505050505050565b6040516375af9d8f60e01b815260ff8216600482015260009073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d906375af9d8f9060240160206040518083038186803b158015611be857600080fd5b505af4158015611bfc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114309190614d9b565b8151835114611c715760405162461bcd60e51b815260206004820152601c60248201527f4d69736d617463686564206c656e677468206f6620617272617973210000000060448201526064016105ed565b60005b8351811015611ccc57611cba848281518110611c9257611c92615101565b6020026020010151848381518110611cac57611cac615101565b602002602001015184613267565b80611cc48161508e565b915050611c74565b50505050565b60405163813fd7fd60e01b815261ffff8216600482015260009073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d9063813fd7fd9060240160206040518083038186803b158015611d2357600080fd5b505af4158015611d37573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114309190614993565b6040516387092a9160e01b815260009073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d906387092a9190611d979086908690600401614ef3565b60206040518083038186803b158015611daf57600080fd5b505af4158015611dc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de79190614d9b565b9392505050565b600080611dfa836135ef565b608081015160a082015160c0830151604051637332eaed60e01b815260ff909316600484015261ffff918216602484015216604482015290915073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d90637332eaed9060640160206040518083038186803b158015611e6b57600080fd5b505af4158015611e7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de79190614a0e565b600b546301000000900460ff16611f065760405162461bcd60e51b815260206004820152602160248201527f4368617261637465722074797065206973206e6f742075706c6f616461626c656044820152602160f81b60648201526084016105ed565b6001546040516331a9108f60e11b8152600481018690526001600160a01b0390911690636352211e9060240160206040518083038186803b158015611f4a57600080fd5b505afa158015611f5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8291906144b8565b6001600160a01b0316336001600160a01b031614611fb25760405162461bcd60e51b81526004016105ed90614ebc565b6001546040516325e3ef0f60e21b81526001600160a01b038581166004830152602482018590529091169063978fbc3c9060440160206040518083038186803b158015611ffe57600080fd5b505afa158015612012573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203691906146cc565b156120955760405162461bcd60e51b815260206004820152602960248201527f54686973206368617261637465722068617320616c7265616479206265656e2060448201526875706c6f616465642160b81b60648201526084016105ed565b6001600160a01b0383166000908152600c6020908152604080832085845290915290205460ff166121195760405162461bcd60e51b815260206004820152602860248201527f54686973206368617261637465722068617320616c7265616479206265656e206044820152671d5c1b1bd859195960c21b60648201526084016105ed565b61212633600954836136a0565b6001600160a01b038381166000818152600c60209081526040808320878452909152808220805460ff191660011790556003549051630da46c0f60e01b8152600481019390935290921690630da46c0f9060240160206040518083038186803b15801561219257600080fd5b505afa1580156121a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ca9190614d9b565b6003546040516369cbb5a560e01b81526004810188905260ff831660248201529192506001600160a01b0316906369cbb5a590604401600060405180830381600087803b15801561221a57600080fd5b505af115801561222e573d6000803e3d6000fd5b505050505050505050565b600d5460ff1661228b5760405162461bcd60e51b815260206004820152601d60248201527f52656e6465722074797065206973206e6f74206368616e6761626c652100000060448201526064016105ed565b600154604051632bd9d53b60e11b815260ff841660048201526001600160a01b03909116906357b3aa769060240160206040518083038186803b1580156122d157600080fd5b505afa1580156122e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230991906146cc565b6123555760405162461bcd60e51b815260206004820152601d60248201527f52656e6465722074797065206973206e6f7420737570706f727465642100000060448201526064016105ed565b6001546040516331a9108f60e11b8152600481018590526001600160a01b0390911690636352211e9060240160206040518083038186803b15801561239957600080fd5b505afa1580156123ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d191906144b8565b6001600160a01b0316336001600160a01b0316146124015760405162461bcd60e51b81526004016105ed90614ebc565b61240e33600954836136a0565b600354604051630fe616bf60e21b81526004810185905260ff841660248201526001600160a01b0390911690633f985afc9060440161102f565b600b5460ff1661249a5760405162461bcd60e51b815260206004820152601760248201527f43686172616374657273206e6f74206e616d61626c652100000000000000000060448201526064016105ed565b6001546040516331a9108f60e11b8152600481018590526001600160a01b0390911690636352211e9060240160206040518083038186803b1580156124de57600080fd5b505afa1580156124f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251691906144b8565b6001600160a01b0316336001600160a01b0316146125465760405162461bcd60e51b81526004016105ed90614ebc565b60405163e1829d2d60e01b815273d17d4b1fc1f25190cce1f0a408380208be70b9009063e1829d2d9061257d908590600401614e24565b60206040518083038186803b15801561259557600080fd5b505af41580156125a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125cd91906146cc565b6126255760405162461bcd60e51b815260206004820152602360248201527f4e616d6520636f6e7461696e7320756e616c6c6f77656420636861726163746560448201526272732160e81b60648201526084016105ed565b8151601410156126885760405162461bcd60e51b815260206004820152602860248201527f4e616d652063616e206f6e6c7920636f6e7461696e2032302063686172616374604482015267657273206d61782160c01b60648201526084016105ed565b61269533600654836136a0565b600354604051637f2ac99560e11b81526001600160a01b039091169063fe55932a9061102f9086908690600401614f10565b6001546040516331a9108f60e11b8152600481018590526001600160a01b0390911690636352211e9060240160206040518083038186803b15801561270b57600080fd5b505afa15801561271f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061274391906144b8565b6001600160a01b0316336001600160a01b0316146127735760405162461bcd60e51b81526004016105ed90614ebc565b600061277e846135ef565b9050600061278b85613af6565b90508160a0015161ffff16836127a083613b99565b6127aa9190614fe1565b60ff1611156127cb5760405162461bcd60e51b81526004016105ed90614e67565b60006127d78286613bdc565b905060006127e58583614fe1565b905061105d878783613c96565b6040516369df10ad60e11b815260ff8216600482015260609073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d9063d3be215a9060240160006040518083038186803b15801561284257600080fd5b505af4158015612856573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261143091908101906146e9565b600b54610100900460ff166128d55760405162461bcd60e51b815260206004820152601d60248201527f43686172616374657273206e6f742062696f206368616e6761626c652100000060448201526064016105ed565b6001546040516331a9108f60e11b8152600481018590526001600160a01b0390911690636352211e9060240160206040518083038186803b15801561291957600080fd5b505afa15801561292d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061295191906144b8565b6001600160a01b0316336001600160a01b0316146129815760405162461bcd60e51b81526004016105ed90614ebc565b60405163e1829d2d60e01b815273d17d4b1fc1f25190cce1f0a408380208be70b9009063e1829d2d906129b8908590600401614e24565b60206040518083038186803b1580156129d057600080fd5b505af41580156129e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0891906146cc565b612a5f5760405162461bcd60e51b815260206004820152602260248201527f42696f20636f6e7461696e7320756e616c6c6f77656420636861726163746572604482015261732160f01b60648201526084016105ed565b612a6c33600754836136a0565b600354604051637ca46dfb60e11b81526001600160a01b039091169063f948dbf69061102f9086908690600401614f10565b6001546040516331a9108f60e11b8152600481018690526001600160a01b0390911690636352211e9060240160206040518083038186803b158015612ae257600080fd5b505afa158015612af6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1a91906144b8565b6001600160a01b0316336001600160a01b031614612b4a5760405162461bcd60e51b81526004016105ed90614ebc565b8151835114612b935760405162461bcd60e51b815260206004820152601560248201527450616972206c656e677468206d69736d617463682160581b60448201526064016105ed565b6000612b9e856135ef565b90506000612bab8661423b565b85519091506000805b8260ff168160ff161015612c755773a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d63a7eb59d1612be68387614fe1565b6040516001600160e01b031960e084901b16815260ff909116600482015260240160206040518083038186803b158015612c1f57600080fd5b505af4158015612c33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c579190614a0e565b612c619083614fc9565b915080612c6d816150a9565b915050612bb4565b50612c813382876136a0565b60005b8260ff168160ff161015612fa25760055488516001600160a01b0390911690636352211e908a9060ff8516908110612cbe57612cbe615101565b60200260200101516040518263ffffffff1660e01b8152600401612ce491815260200190565b60206040518083038186803b158015612cfc57600080fd5b505afa158015612d10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3491906144b8565b6001600160a01b0316336001600160a01b0316148015612e06575060045487516001600160a01b0390911690636352211e90899060ff8516908110612d7b57612d7b615101565b60200260200101516040518263ffffffff1660e01b8152600401612da191815260200190565b60206040518083038186803b158015612db957600080fd5b505afa158015612dcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612df191906144b8565b6001600160a01b0316336001600160a01b0316145b612e475760405162461bcd60e51b81526020600482015260126024820152714e6f74206f776e6572206f6620706169722160701b60448201526064016105ed565b60055488516001600160a01b03909116906323b872dd90339061dead908c9060ff8716908110612e7957612e79615101565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015612ed357600080fd5b505af1158015612ee7573d6000803e3d6000fd5b505060045489516001600160a01b0390911692506323b872dd9150339061dead908b9060ff8716908110612f1d57612f1d615101565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015612f7757600080fd5b505af1158015612f8b573d6000803e3d6000fd5b505050508080612f9a906150a9565b915050612c84565b50612fac3361399f565b60a084015160c0850151604051637332eaed60e01b815260ff8616600482015261ffff92831660248201529116604482015260009073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d90637332eaed9060640160206040518083038186803b15801561301857600080fd5b505af415801561302c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130509190614a0e565b9050600061305e8486614fe1565b600354604051630b76df3560e21b8152600481018d905260ff831660248201529192506001600160a01b031690632ddb7cd490604401600060405180830381600087803b1580156130ae57600080fd5b505af11580156130c2573d6000803e3d6000fd5b5050505060a086015160c0870151604051637332eaed60e01b815260ff8416600482015261ffff92831660248201529116604482015260009073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d90637332eaed9060640160206040518083038186803b15801561313257600080fd5b505af4158015613146573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061316a9190614a0e565b905060006131788483615006565b905061318433826139fa565b505050505050505050505050565b6000546001600160a01b031633146131bc5760405162461bcd60e51b81526004016105ed90614e37565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146132085760405162461bcd60e51b81526004016105ed90614e37565b600180546001600160a01b03199081166001600160a01b03978816179091556002805482169587169590951790945560038054851693861693909317909255600480548416918516919091179055600580549092169216919091179055565b6001546040516331a9108f60e11b8152600481018590526001600160a01b0390911690636352211e9060240160206040518083038186803b1580156132ab57600080fd5b505afa1580156132bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132e391906144b8565b6001600160a01b0316336001600160a01b0316146133135760405162461bcd60e51b81526004016105ed90614ebc565b600061331e846135ef565b9050600061332b856142c2565b90506000805b8561ffff168161ffff1610156133f55773a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d631f84f6e56133658386614fa3565b6040516001600160e01b031960e084901b16815261ffff909116600482015260240160206040518083038186803b15801561339f57600080fd5b505af41580156133b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133d79190614a0e565b6133e19083614fc9565b9150806133ed8161506c565b915050613331565b506134013382866136a0565b61340a3361399f565b608083015160c0840151604051637332eaed60e01b815260ff909216600483015261ffff808516602484015216604482015260009073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d90637332eaed9060640160206040518083038186803b15801561347657600080fd5b505af415801561348a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134ae9190614a0e565b905060006134bc8785614fa3565b60035460405163f0e6327b60e01b8152600481018b905261ffff831660248201529192506001600160a01b03169063f0e6327b90604401600060405180830381600087803b15801561350d57600080fd5b505af1158015613521573d6000803e3d6000fd5b50505050608085015160c0860151604051637332eaed60e01b815260ff909216600483015261ffff808416602484015216604482015260009073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d90637332eaed9060640160206040518083038186803b15801561359157600080fd5b505af41580156135a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135c99190614a0e565b905060006135d78483615006565b90506135e333826139fa565b50505050505050505050565b6040805160e081018252600080825260208201819052818301819052606082018190526080820181905260a0820181905260c08201526003549151634810bc5960e01b81526004810184905290916001600160a01b031690634810bc599060240160e06040518083038186803b15801561366857600080fd5b505afa15801561367c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611430919061475f565b801561389a576002546040516351f8521d60e11b81526001600160a01b0385811660048301529091169063a3f0a43a9060240160206040518083038186803b1580156136eb57600080fd5b505afa1580156136ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137239190614a0e565b82111561377e5760405162461bcd60e51b8152602060048201526024808201527f4e6f7420656e6f756768204d4553206372656469747320746f20646f20616374604482015263696f6e2160e01b60648201526084016105ed565b60025460405163649d35fd60e01b81526001600160a01b0385811660048301529091169063649d35fd9060240160206040518083038186803b1580156137c357600080fd5b505afa1580156137d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137fb9190614a0e565b82106138615760025460405163632447c960e01b81526001600160a01b0385811660048301529091169063632447c990602401600060405180830381600087803b15801561384857600080fd5b505af115801561385c573d6000803e3d6000fd5b505050505b6002546040516382596f0160e01b81526001600160a01b03858116600483015260248201859052909116906382596f019060440161102f565b6002546040516370a0823160e01b81526001600160a01b038581166004830152909116906370a082319060240160206040518083038186803b1580156138df57600080fd5b505afa1580156138f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139179190614a0e565b8211156139665760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f756768204d455320746f20646f20616374696f6e210000000060448201526064016105ed565b600254604051632770a7eb60e21b81526001600160a01b0385811660048301526024820185905290911690639dc29fac9060440161102f565b60025460405163632447c960e01b81526001600160a01b0383811660048301529091169063632447c990602401600060405180830381600087803b1580156139e657600080fd5b505af1158015610cbe573d6000803e3d6000fd5b60025460405163b5862c2560e01b81526001600160a01b038481166004830152602482018490529091169063b5862c2590604401600060405180830381600087803b158015613a4857600080fd5b505af1158015613a5c573d6000803e3d6000fd5b505050505050565b8160ff1660011415613a765760065550565b8160ff1660021415613a885760075550565b8160ff1660031415613a9a5760085550565b8160ff1660041415613aac5760095550565b8160ff1660051415613abe57600a5550565b60405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420547970652160981b60448201526064016105ed565b6040805160a081018252600080825260208201819052818301819052606082018190526080820152600354915163ad217ae560e01b81526004810184905290916001600160a01b03169063ad217ae59060240160a06040518083038186803b158015613b6157600080fd5b505afa158015613b75573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143091906148df565b600081608001518260600151836040015184602001518560000151613bbe9190614fe1565b613bc89190614fe1565b613bd29190614fe1565b6114309190614fe1565b60008160ff1660011415613bf257508151611430565b8160ff1660021415613c0957506020820151611430565b8160ff1660031415613c2057506040820151611430565b8160ff1660041415613c3757506060820151611430565b8160ff1660051415613c4e57506080820151611430565b60405162461bcd60e51b815260206004820152601760248201527f496e76616c69642061747472696275746520747970652100000000000000000060448201526064016105ed565b8160ff1660011415613cdc5760035460405163dfa7dcc360e01b81526004810185905260ff831660248201526001600160a01b039091169063dfa7dcc39060440161102f565b8160ff1660021415613d2257600354604051632ede9e1960e01b81526004810185905260ff831660248201526001600160a01b0390911690632ede9e199060440161102f565b8160ff1660031415613d6857600354604051637367ff3760e11b81526004810185905260ff831660248201526001600160a01b039091169063e6cffe6e9060440161102f565b8160ff1660041415613dae5760035460405163487b8d4f60e01b81526004810185905260ff831660248201526001600160a01b039091169063487b8d4f9060440161102f565b8160ff1660051415613c4e576003546040516309b3dbaf60e01b81526004810185905260ff831660248201526001600160a01b03909116906309b3dbaf9060440161102f565b6040805161010081018252600080825260208201819052818301819052606082018190526080820181905260a0820181905260c0820181905260e082015260035491516305377eb160e51b81526004810184905290916001600160a01b03169063a6efd620906024016101006040518083038186803b158015613e7657600080fd5b505afa158015613e8a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114309190614816565b60008160ff1660011415613ec457508151611430565b8160ff1660021415613edb57506020820151611430565b8160ff1660031415613ef257506040820151611430565b8160ff1660041415613f0957506060820151611430565b8160ff1660051415613f2057506080820151611430565b8160ff1660061415613f37575060a0820151611430565b8160ff1660071415613f4e575060c0820151611430565b8160ff1660081415613f65575060e0820151611430565b60405162461bcd60e51b815260206004820152602160248201527f496e76616c69642045717569706d656e742055706772616465732051756572796044820152602160f81b60648201526084016105ed565b8060ff1660011415613ffd57600354604051631630f08560e11b81526004810185905260ff841660248201526001600160a01b0390911690632c61e10a9060440161102f565b8060ff16600214156140435760035460405163f4dcd77360e01b81526004810185905260ff841660248201526001600160a01b039091169063f4dcd7739060440161102f565b8060ff166003141561408957600354604051636bfc616d60e01b81526004810185905260ff841660248201526001600160a01b0390911690636bfc616d9060440161102f565b8060ff16600414156140cf57600354604051634a1f2c2f60e11b81526004810185905260ff841660248201526001600160a01b039091169063943e585e9060440161102f565b8060ff16600514156141155760035460405163a822043960e01b81526004810185905260ff841660248201526001600160a01b039091169063a82204399060440161102f565b8060ff166006141561415b576003546040516335e64b3360e11b81526004810185905260ff841660248201526001600160a01b0390911690636bcc96669060440161102f565b8060ff16600714156141a157600354604051631f609f9360e31b81526004810185905260ff841660248201526001600160a01b039091169063fb04fc989060440161102f565b8060ff16600814156141e75760035460405163a02a1b4760e01b81526004810185905260ff841660248201526001600160a01b039091169063a02a1b479060440161102f565b60405162461bcd60e51b8152602060048201526024808201527f496e76616c69642045717569706d656e742053657420557067726164652051756044820152636572792160e01b60648201526084016105ed565b600354604051634810bc5960e01b8152600481018390526000916001600160a01b031690634810bc599060240160e06040518083038186803b15801561428057600080fd5b505afa158015614294573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142b8919061475f565b6080015192915050565b600354604051634810bc5960e01b8152600481018390526000916001600160a01b031690634810bc599060240160e06040518083038186803b15801561430757600080fd5b505afa15801561431b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061433f919061475f565b60a0015192915050565b600082601f83011261435a57600080fd5b8135602061436f61436a83614f59565b614f29565b80838252828201915082860187848660051b890101111561438f57600080fd5b60005b858110156143ae57813584529284019290840190600101614392565b5090979650505050505050565b600082601f8301126143cc57600080fd5b813560206143dc61436a83614f59565b80838252828201915082860187848660051b89010111156143fc57600080fd5b60005b858110156143ae57813561441281615163565b845292840192908401906001016143ff565b803561442f81615145565b919050565b600082601f83011261444557600080fd5b813561445361436a82614f7c565b81815284602083860101111561446857600080fd5b816020850160208301376000918101602001919091529392505050565b805161442f81615153565b805161442f81615163565b6000602082840312156144ad57600080fd5b8135611de78161512d565b6000602082840312156144ca57600080fd5b8151611de78161512d565b600080600080600060a086880312156144ed57600080fd5b85356144f88161512d565b945060208601356145088161512d565b935060408601356145188161512d565b925060608601356145288161512d565b915060808601356145388161512d565b809150509295509295909350565b6000806040838503121561455957600080fd5b82356145648161512d565b946020939093013593505050565b60008060006060848603121561458757600080fd5b83356001600160401b038082111561459e57600080fd5b6145aa87838801614349565b94506020915081860135818111156145c157600080fd5b86019050601f810187136145d457600080fd5b80356145e261436a82614f59565b8082825284820191508484018a868560051b870101111561460257600080fd5b600094505b8385101561462e57803561461a81615153565b835260019490940193918501918501614607565b50809650505050505061464360408501614424565b90509250925092565b6000806040838503121561465f57600080fd5b82356001600160401b038082111561467657600080fd5b614682868387016143bb565b9350602085013591508082111561469857600080fd5b506146a585828601614349565b9150509250929050565b6000602082840312156146c157600080fd5b8135611de781615145565b6000602082840312156146de57600080fd5b8151611de781615145565b6000602082840312156146fb57600080fd5b81516001600160401b0381111561471157600080fd5b8201601f8101841361472257600080fd5b805161473061436a82614f7c565b81815285602083850101111561474557600080fd5b614756826020830160208601615040565b95945050505050565b600060e0828403121561477157600080fd5b60405160e081018181106001600160401b038211171561479357614793615117565b60405282516147a181615163565b815260208301516147b181615163565b602082015260408301516147c481615153565b604082015260608301516147d781615153565b60608201526147e860808401614490565b60808201526147f960a08401614485565b60a082015261480a60c08401614485565b60c08201529392505050565b600061010080838503121561482a57600080fd5b604051908101906001600160401b038211818310171561484c5761484c615117565b816040528351915061485d82615163565b81815261486c60208501614490565b602082015261487d60408501614490565b604082015261488e60608501614490565b606082015261489f60808501614490565b60808201526148b060a08501614490565b60a08201526148c160c08501614490565b60c08201526148d260e08501614490565b60e0820152949350505050565b600060a082840312156148f157600080fd5b60405160a081018181106001600160401b038211171561491357614913615117565b604052825161492181615163565b8152602083015161493181615163565b6020820152604083015161494481615163565b6040820152606083015161495781615163565b6060820152608083015161496a81615163565b60808201529392505050565b60006020828403121561498857600080fd5b8135611de781615153565b6000602082840312156149a557600080fd5b8151611de781615153565b600080604083850312156149c357600080fd5b82356149ce81615153565b915060208301356001600160401b038111156149e957600080fd5b6146a585828601614434565b600060208284031215614a0757600080fd5b5035919050565b600060208284031215614a2057600080fd5b5051919050565b60008060008060808587031215614a3d57600080fd5b843593506020850135614a4f8161512d565b9250604085013591506060850135614a6681615145565b939692955090935050565b60008060008060808587031215614a8757600080fd5b8435935060208501356001600160401b0380821115614aa557600080fd5b614ab188838901614349565b94506040870135915080821115614ac757600080fd5b50614ad487828801614349565b9250506060850135614a6681615145565b600080600060608486031215614afa57600080fd5b8335925060208401356001600160401b03811115614b1757600080fd5b614b2386828701614349565b9250506040840135614b3481615145565b809150509250925092565b600080600060608486031215614b5457600080fd5b8335925060208401356001600160401b0380821115614b7257600080fd5b614b7e878388016143bb565b93506040860135915080821115614b9457600080fd5b50614ba1868287016143bb565b9150509250925092565b60008060008060808587031215614bc157600080fd5b8435935060208501356001600160401b0380821115614bdf57600080fd5b614beb888389016143bb565b94506040870135915080821115614c0157600080fd5b50614ad4878288016143bb565b60008060408385031215614c2157600080fd5b823591506020830135614c3381615145565b809150509250929050565b600080600060608486031215614c5357600080fd5b8335925060208401356001600160401b03811115614c7057600080fd5b614b2386828701614434565b600080600060608486031215614c9157600080fd5b833592506020840135614ca381615153565b91506040840135614b3481615145565b60008060408385031215614cc657600080fd5b823591506020830135614c3381615163565b600080600060608486031215614ced57600080fd5b833592506020840135614ca381615163565b600080600060608486031215614d1457600080fd5b833592506020840135614d2681615163565b91506040840135614b3481615163565b60008060008060808587031215614d4c57600080fd5b843593506020850135614d5e81615163565b92506040850135614d6e81615163565b91506060850135614a6681615145565b600060208284031215614d9057600080fd5b8135611de781615163565b600060208284031215614dad57600080fd5b8151611de781615163565b600080600060608486031215614dcd57600080fd5b8335614dd881615163565b92506020840135614de881615153565b91506040840135614b3481615153565b60008151808452614e10816020860160208601615040565b601f01601f19169290920160200192915050565b602081526000611de76020830184614df8565b602080825260169082015275596f7520617265206e6f7420746865206f776e65722160501b604082015260600190565b60208082526035908201527f5265717565737420746f20757067726164652073746174732061626f766520616040820152747661696c61626c65206261736520706f696e74732160581b606082015260800190565b6020808252601d908201527f596f7520646f6e2774206f776e20746869732043686172616374657221000000604082015260600190565b61ffff83168152604060208201526000610d9c6040830184614df8565b828152604060208201526000610d9c6040830184614df8565b604051601f8201601f191681016001600160401b0381118282101715614f5157614f51615117565b604052919050565b60006001600160401b03821115614f7257614f72615117565b5060051b60200190565b60006001600160401b03821115614f9557614f95615117565b50601f01601f191660200190565b600061ffff808316818516808303821115614fc057614fc06150eb565b01949350505050565b60008219821115614fdc57614fdc6150eb565b500190565b600060ff821660ff84168060ff03821115614ffe57614ffe6150eb565b019392505050565b600082821015615018576150186150eb565b500390565b600060ff821660ff841680821015615037576150376150eb565b90039392505050565b60005b8381101561505b578181015183820152602001615043565b83811115611ccc5750506000910152565b600061ffff80831681811415615084576150846150eb565b6001019392505050565b60006000198214156150a2576150a26150eb565b5060010190565b600060ff821660ff8114156150c0576150c06150eb565b60010192915050565b6000826150e657634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461514257600080fd5b50565b801515811461514257600080fd5b61ffff8116811461514257600080fd5b60ff8116811461514257600080fdfea26469706673582212207afa9d86f4e6f8369ca581818d1051491e9c64e545276f3f4d33044bd017347f64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102485760003560e01c806383b2dd8b1161013b578063c16ac06f116100b8578063e2d979341161007c578063e2d9793414610564578063e5b0754214610577578063f5a1f5b41461058a578063f63bf8bd1461059d578063f9bd780a146105b057600080fd5b8063c16ac06f146104f9578063c6bec4531461050c578063d3be215a1461051f578063dbbc5f0a1461053f578063de0657101461055157600080fd5b80639bd8e920116100ff5780639bd8e920146104a0578063a8c16e56146104b3578063a96bbdf5146104c6578063b4ca50a6146104d3578063bc6b1bdf146104e657600080fd5b806383b2dd8b1461042b57806387092a91146104385780638bcd63521461044b5780638da5cb5b1461045f578063978fbc3c1461047257600080fd5b80635f3d7de8116101c9578063699c0f841161018d578063699c0f84146103b95780636d71931b146103cc57806375af9d8f146103df5780637e633e00146103f2578063813fd7fd1461040557600080fd5b80635f3d7de814610348578063602123c61461035b578063639807d01461036e57806365e8659b14610381578063673afa64146103a657600080fd5b8063361617111161021057806336161711146102c35780633ae23cc4146102e45780633fb139a51461030f57806346b088d2146103225780635a1389111461033557600080fd5b806314a8c37b1461024d5780631625a4701461026257806327d217ff1461028a5780632a8586291461029d5780632d819dfc146102b0575b600080fd5b61026061025b3660046146af565b6105c3565b005b600b546102759062010000900460ff1681565b60405190151581526020015b60405180910390f35b610260610298366004614ae5565b610614565b6102606102ab366004614bab565b610c06565b6102606102be3660046146af565b610cc5565b6102d66102d1366004614db8565b610d02565b604051908152602001610281565b6003546102f7906001600160a01b031681565b6040516001600160a01b039091168152602001610281565b61026061031d36600461464c565b610da4565b610260610330366004614c0e565b610e77565b6004546102f7906001600160a01b031681565b6102606103563660046146af565b611066565b610260610369366004614b3f565b6110aa565b6005546102f7906001600160a01b031681565b61039461038f366004614cb3565b6112f2565b60405160ff9091168152602001610281565b6102606103b43660046146af565b611436565b6102606103c73660046146af565b611473565b6102606103da366004614d36565b6114b9565b6103946103ed366004614d7e565b611b98565b610260610400366004614572565b611c20565b610418610413366004614976565b611cd2565b60405161ffff9091168152602001610281565b600d546102759060ff1681565b6103946104463660046149b0565b611d5b565b600b54610275906301000000900460ff1681565b6000546102f7906001600160a01b031681565b610275610480366004614546565b600c60209081526000928352604080842090915290825290205460ff1681565b6102d66104ae3660046149f5565b611dee565b6102606104c1366004614a27565b611ea3565b600b546102759060ff1681565b6102606104e1366004614cd8565b612239565b6102606104f4366004614c3e565b612448565b6001546102f7906001600160a01b031681565b61026061051a366004614cff565b6126c7565b61053261052d366004614d7e565b6127f2565b6040516102819190614e24565b600b5461027590610100900460ff1681565b61026061055f366004614c3e565b61287e565b6002546102f7906001600160a01b031681565b610260610585366004614a71565b612a9e565b61026061059836600461449b565b613192565b6102606105ab3660046144d5565b6131de565b6102606105be366004614c7c565b613267565b6000546001600160a01b031633146105f65760405162461bcd60e51b81526004016105ed90614e37565b60405180910390fd5b600b805491151563010000000263ff00000019909216919091179055565b6001546040516331a9108f60e11b8152600481018590526001600160a01b0390911690636352211e9060240160206040518083038186803b15801561065857600080fd5b505afa15801561066c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069091906144b8565b6001600160a01b0316336001600160a01b0316146106f05760405162461bcd60e51b815260206004820152601d60248201527f596f7520646f6e2774206f776e2074686973206368617261637465722100000060448201526064016105ed565b60006106fb846135ef565b60808101518451919250906000805b8260ff168160ff1610156107cb5773a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d63a7eb59d161073c8387614fe1565b6040516001600160e01b031960e084901b16815260ff909116600482015260240160206040518083038186803b15801561077557600080fd5b505af4158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad9190614a0e565b6107b79083614fc9565b9150806107c3816150a9565b91505061070a565b506107d73382876136a0565b60005b8260ff168160ff161015610a1757868160ff16815181106107fd576107fd615101565b602002602001015188141561085e5760405162461bcd60e51b815260206004820152602160248201527f43616e6e6f74204275726e204175676d656e74696e67204368617261637465726044820152602160f81b60648201526084016105ed565b60015487516001600160a01b0390911690636352211e90899060ff851690811061088a5761088a615101565b60200260200101516040518263ffffffff1660e01b81526004016108b091815260200190565b60206040518083038186803b1580156108c857600080fd5b505afa1580156108dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090091906144b8565b6001600160a01b0316336001600160a01b0316146109605760405162461bcd60e51b815260206004820152601a60248201527f556e6f776e65642043686172616374657220746f204275726e2100000000000060448201526064016105ed565b60015487516001600160a01b03909116906323b872dd90339061dead908b9060ff871690811061099257610992615101565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b1580156109ec57600080fd5b505af1158015610a00573d6000803e3d6000fd5b505050508080610a0f906150a9565b9150506107da565b50610a213361399f565b60a084015160c0850151604051637332eaed60e01b815260ff8616600482015261ffff92831660248201529116604482015260009073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d90637332eaed9060640160206040518083038186803b158015610a8d57600080fd5b505af4158015610aa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac59190614a0e565b90506000610ad38486614fe1565b600354604051630b76df3560e21b8152600481018c905260ff831660248201529192506001600160a01b031690632ddb7cd490604401600060405180830381600087803b158015610b2357600080fd5b505af1158015610b37573d6000803e3d6000fd5b5050505060a086015160c0870151604051637332eaed60e01b815260ff8416600482015261ffff92831660248201529116604482015260009073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d90637332eaed9060640160206040518083038186803b158015610ba757600080fd5b505af4158015610bbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdf9190614a0e565b90506000610bed8483615006565b9050610bf933826139fa565b5050505050505050505050565b8151835114610c625760405162461bcd60e51b815260206004820152602260248201527f416d6f756e747320616e64204974656d73206c656e677468206d69736d617463604482015261682160f01b60648201526084016105ed565b60005b8351811015610cbe57610cac85858381518110610c8457610c84615101565b6020026020010151858481518110610c9e57610c9e615101565b6020026020010151856114b9565b80610cb68161508e565b915050610c65565b5050505050565b6000546001600160a01b03163314610cef5760405162461bcd60e51b81526004016105ed90614e37565b600b805460ff1916911515919091179055565b604051637332eaed60e01b815260ff8416600482015261ffff80841660248301528216604482015260009073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d90637332eaed9060640160206040518083038186803b158015610d6457600080fd5b505af4158015610d78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9c9190614a0e565b949350505050565b6000546001600160a01b03163314610dce5760405162461bcd60e51b81526004016105ed90614e37565b8051825114610e185760405162461bcd60e51b81526020600482015260166024820152754172726179206c656e677468206d69736d617463682160501b60448201526064016105ed565b60005b8151811015610e7257610e60838281518110610e3957610e39615101565b6020026020010151838381518110610e5357610e53615101565b6020026020010151613a64565b80610e6a8161508e565b915050610e1b565b505050565b600b5462010000900460ff16610eda5760405162461bcd60e51b815260206004820152602260248201527f436861726163746572206d6f64656c206973206e6f74207265726f6c6c61626c604482015261652160f01b60648201526084016105ed565b6001546040516331a9108f60e11b8152600481018490526001600160a01b0390911690636352211e9060240160206040518083038186803b158015610f1e57600080fd5b505afa158015610f32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5691906144b8565b6001600160a01b0316336001600160a01b031614610f865760405162461bcd60e51b81526004016105ed90614ebc565b610f9333600854836136a0565b6040516bffffffffffffffffffffffff193360601b16602082015242603482015244605482015260748101839052600090600a906094016040516020818303038152906040528051906020012060001c610fed91906150c9565b610ff8906001614fc9565b6003546040516369cbb5a560e01b81526004810186905260ff831660248201529192506001600160a01b0316906369cbb5a5906044015b600060405180830381600087803b15801561104957600080fd5b505af115801561105d573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031633146110905760405162461bcd60e51b81526004016105ed90614e37565b600b80549115156101000261ff0019909216919091179055565b6001546040516331a9108f60e11b8152600481018590526001600160a01b0390911690636352211e9060240160206040518083038186803b1580156110ee57600080fd5b505afa158015611102573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112691906144b8565b6001600160a01b0316336001600160a01b0316146111565760405162461bcd60e51b81526004016105ed90614ebc565b80518251146111b75760405162461bcd60e51b815260206004820152602760248201527f4174747269627574657320616e6420416d6f756e7473206c656e677468206d69604482015266736d617463682160c81b60648201526084016105ed565b60006111c2846135ef565b905060006111cf85613af6565b90506000805b845181101561121a578481815181106111f0576111f0615101565b602002602001015160ff16826112069190614fa3565b9150806112128161508e565b9150506111d5565b508260a0015161ffff168161122e84613b99565b60ff1661123b9190614fa3565b61ffff16111561125d5760405162461bcd60e51b81526004016105ed90614e67565b60005b845181101561105d57600061128e8488848151811061128157611281615101565b6020026020010151613bdc565b905060008683815181106112a4576112a4615101565b6020026020010151826112b79190614fe1565b90506112dd898985815181106112cf576112cf615101565b602002602001015183613c96565b505080806112ea9061508e565b915050611260565b6000806112fe846135ef565b9050600061130b85613df4565b905060006113208360600151610446876127f2565b9050600061132d82611b98565b905060008660ff16600114156113455750825161141e565b8660ff166002141561135c5750602083015161141e565b8660ff16600314156113735750604083015161141e565b8660ff166004141561138a5750606083015161141e565b8660ff16600514156113a15750608083015161141e565b8660ff16600614156113b8575060a083015161141e565b8660ff16600714156113cf575060c083015161141e565b8660ff16600814156113e6575060e083015161141e565b60405162461bcd60e51b815260206004820152600d60248201526c496e76616c6964204974656d2160981b60448201526064016105ed565b6114288183614fe1565b955050505050505b92915050565b6000546001600160a01b031633146114605760405162461bcd60e51b81526004016105ed90614e37565b600d805460ff1916911515919091179055565b6000546001600160a01b0316331461149d5760405162461bcd60e51b81526004016105ed90614e37565b600b8054911515620100000262ff000019909216919091179055565b6001546040516331a9108f60e11b8152600481018690526001600160a01b0390911690636352211e9060240160206040518083038186803b1580156114fd57600080fd5b505afa158015611511573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153591906144b8565b6001600160a01b0316336001600160a01b0316146115655760405162461bcd60e51b81526004016105ed90614ebc565b6000611570856135ef565b9050600061157d86613df4565b60608301516040516369df10ad60e11b815260ff8716600482015291925060009173a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d916387092a9191839063d3be215a9060240160006040518083038186803b1580156115dd57600080fd5b505af41580156115f1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261161991908101906146e9565b6040518363ffffffff1660e01b8152600401611636929190614ef3565b60206040518083038186803b15801561164e57600080fd5b505af4158015611662573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116869190614d9b565b905060006116948387613eae565b604051632cbc38ab60e21b815260ff8416600482015290915073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d9063b2f0e2ac9060240160206040518083038186803b1580156116e457600080fd5b505af41580156116f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171c9190614d9b565b60ff166117298883614fe1565b60ff1611156117895760405162461bcd60e51b815260206004820152602660248201527f5265717565737420746f20757067726164652070617374207570677261646162604482015265696c6974792160d01b60648201526084016105ed565b6000805b8860ff168160ff16101561184e5773a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d6379bcfefb6117bf8386614fe1565b6040516001600160e01b031960e084901b16815260ff909116600482015260240160206040518083038186803b1580156117f857600080fd5b505af415801561180c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118309190614a0e565b61183a9083614fc9565b915080611846816150a9565b91505061178d565b5061185a3382886136a0565b6118633361399f565b608085015160a086015160c0870151604051637332eaed60e01b815260ff909316600484015261ffff918216602484015216604482015260009073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d90637332eaed9060640160206040518083038186803b1580156118d457600080fd5b505af41580156118e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190c9190614a0e565b9050600061191a8a85614fe1565b90506119278b828b613fb7565b604051633f0c9a9160e01b815260ff80871660048301528516602482015260009073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d90633f0c9a919060440160206040518083038186803b15801561197f57600080fd5b505af4158015611993573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b79190614d9b565b604051633f0c9a9160e01b815260ff80891660048301528416602482015273a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d90633f0c9a919060440160206040518083038186803b158015611a0c57600080fd5b505af4158015611a20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a449190614d9b565b611a4e919061501d565b60ff168860c00151611a609190614fa3565b60035460405163232a228960e11b8152600481018f905261ffff831660248201529192506001600160a01b031690634654451290604401600060405180830381600087803b158015611ab157600080fd5b505af1158015611ac5573d6000803e3d6000fd5b50505050608088015160a0890151604051637332eaed60e01b815260ff909216600483015261ffff90811660248301528216604482015260009073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d90637332eaed9060640160206040518083038186803b158015611b3657600080fd5b505af4158015611b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6e9190614a0e565b90506000611b7c8583615006565b9050611b8833826139fa565b5050505050505050505050505050565b6040516375af9d8f60e01b815260ff8216600482015260009073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d906375af9d8f9060240160206040518083038186803b158015611be857600080fd5b505af4158015611bfc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114309190614d9b565b8151835114611c715760405162461bcd60e51b815260206004820152601c60248201527f4d69736d617463686564206c656e677468206f6620617272617973210000000060448201526064016105ed565b60005b8351811015611ccc57611cba848281518110611c9257611c92615101565b6020026020010151848381518110611cac57611cac615101565b602002602001015184613267565b80611cc48161508e565b915050611c74565b50505050565b60405163813fd7fd60e01b815261ffff8216600482015260009073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d9063813fd7fd9060240160206040518083038186803b158015611d2357600080fd5b505af4158015611d37573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114309190614993565b6040516387092a9160e01b815260009073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d906387092a9190611d979086908690600401614ef3565b60206040518083038186803b158015611daf57600080fd5b505af4158015611dc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de79190614d9b565b9392505050565b600080611dfa836135ef565b608081015160a082015160c0830151604051637332eaed60e01b815260ff909316600484015261ffff918216602484015216604482015290915073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d90637332eaed9060640160206040518083038186803b158015611e6b57600080fd5b505af4158015611e7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de79190614a0e565b600b546301000000900460ff16611f065760405162461bcd60e51b815260206004820152602160248201527f4368617261637465722074797065206973206e6f742075706c6f616461626c656044820152602160f81b60648201526084016105ed565b6001546040516331a9108f60e11b8152600481018690526001600160a01b0390911690636352211e9060240160206040518083038186803b158015611f4a57600080fd5b505afa158015611f5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8291906144b8565b6001600160a01b0316336001600160a01b031614611fb25760405162461bcd60e51b81526004016105ed90614ebc565b6001546040516325e3ef0f60e21b81526001600160a01b038581166004830152602482018590529091169063978fbc3c9060440160206040518083038186803b158015611ffe57600080fd5b505afa158015612012573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203691906146cc565b156120955760405162461bcd60e51b815260206004820152602960248201527f54686973206368617261637465722068617320616c7265616479206265656e2060448201526875706c6f616465642160b81b60648201526084016105ed565b6001600160a01b0383166000908152600c6020908152604080832085845290915290205460ff166121195760405162461bcd60e51b815260206004820152602860248201527f54686973206368617261637465722068617320616c7265616479206265656e206044820152671d5c1b1bd859195960c21b60648201526084016105ed565b61212633600954836136a0565b6001600160a01b038381166000818152600c60209081526040808320878452909152808220805460ff191660011790556003549051630da46c0f60e01b8152600481019390935290921690630da46c0f9060240160206040518083038186803b15801561219257600080fd5b505afa1580156121a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ca9190614d9b565b6003546040516369cbb5a560e01b81526004810188905260ff831660248201529192506001600160a01b0316906369cbb5a590604401600060405180830381600087803b15801561221a57600080fd5b505af115801561222e573d6000803e3d6000fd5b505050505050505050565b600d5460ff1661228b5760405162461bcd60e51b815260206004820152601d60248201527f52656e6465722074797065206973206e6f74206368616e6761626c652100000060448201526064016105ed565b600154604051632bd9d53b60e11b815260ff841660048201526001600160a01b03909116906357b3aa769060240160206040518083038186803b1580156122d157600080fd5b505afa1580156122e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230991906146cc565b6123555760405162461bcd60e51b815260206004820152601d60248201527f52656e6465722074797065206973206e6f7420737570706f727465642100000060448201526064016105ed565b6001546040516331a9108f60e11b8152600481018590526001600160a01b0390911690636352211e9060240160206040518083038186803b15801561239957600080fd5b505afa1580156123ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d191906144b8565b6001600160a01b0316336001600160a01b0316146124015760405162461bcd60e51b81526004016105ed90614ebc565b61240e33600954836136a0565b600354604051630fe616bf60e21b81526004810185905260ff841660248201526001600160a01b0390911690633f985afc9060440161102f565b600b5460ff1661249a5760405162461bcd60e51b815260206004820152601760248201527f43686172616374657273206e6f74206e616d61626c652100000000000000000060448201526064016105ed565b6001546040516331a9108f60e11b8152600481018590526001600160a01b0390911690636352211e9060240160206040518083038186803b1580156124de57600080fd5b505afa1580156124f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251691906144b8565b6001600160a01b0316336001600160a01b0316146125465760405162461bcd60e51b81526004016105ed90614ebc565b60405163e1829d2d60e01b815273d17d4b1fc1f25190cce1f0a408380208be70b9009063e1829d2d9061257d908590600401614e24565b60206040518083038186803b15801561259557600080fd5b505af41580156125a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125cd91906146cc565b6126255760405162461bcd60e51b815260206004820152602360248201527f4e616d6520636f6e7461696e7320756e616c6c6f77656420636861726163746560448201526272732160e81b60648201526084016105ed565b8151601410156126885760405162461bcd60e51b815260206004820152602860248201527f4e616d652063616e206f6e6c7920636f6e7461696e2032302063686172616374604482015267657273206d61782160c01b60648201526084016105ed565b61269533600654836136a0565b600354604051637f2ac99560e11b81526001600160a01b039091169063fe55932a9061102f9086908690600401614f10565b6001546040516331a9108f60e11b8152600481018590526001600160a01b0390911690636352211e9060240160206040518083038186803b15801561270b57600080fd5b505afa15801561271f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061274391906144b8565b6001600160a01b0316336001600160a01b0316146127735760405162461bcd60e51b81526004016105ed90614ebc565b600061277e846135ef565b9050600061278b85613af6565b90508160a0015161ffff16836127a083613b99565b6127aa9190614fe1565b60ff1611156127cb5760405162461bcd60e51b81526004016105ed90614e67565b60006127d78286613bdc565b905060006127e58583614fe1565b905061105d878783613c96565b6040516369df10ad60e11b815260ff8216600482015260609073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d9063d3be215a9060240160006040518083038186803b15801561284257600080fd5b505af4158015612856573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261143091908101906146e9565b600b54610100900460ff166128d55760405162461bcd60e51b815260206004820152601d60248201527f43686172616374657273206e6f742062696f206368616e6761626c652100000060448201526064016105ed565b6001546040516331a9108f60e11b8152600481018590526001600160a01b0390911690636352211e9060240160206040518083038186803b15801561291957600080fd5b505afa15801561292d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061295191906144b8565b6001600160a01b0316336001600160a01b0316146129815760405162461bcd60e51b81526004016105ed90614ebc565b60405163e1829d2d60e01b815273d17d4b1fc1f25190cce1f0a408380208be70b9009063e1829d2d906129b8908590600401614e24565b60206040518083038186803b1580156129d057600080fd5b505af41580156129e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0891906146cc565b612a5f5760405162461bcd60e51b815260206004820152602260248201527f42696f20636f6e7461696e7320756e616c6c6f77656420636861726163746572604482015261732160f01b60648201526084016105ed565b612a6c33600754836136a0565b600354604051637ca46dfb60e11b81526001600160a01b039091169063f948dbf69061102f9086908690600401614f10565b6001546040516331a9108f60e11b8152600481018690526001600160a01b0390911690636352211e9060240160206040518083038186803b158015612ae257600080fd5b505afa158015612af6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1a91906144b8565b6001600160a01b0316336001600160a01b031614612b4a5760405162461bcd60e51b81526004016105ed90614ebc565b8151835114612b935760405162461bcd60e51b815260206004820152601560248201527450616972206c656e677468206d69736d617463682160581b60448201526064016105ed565b6000612b9e856135ef565b90506000612bab8661423b565b85519091506000805b8260ff168160ff161015612c755773a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d63a7eb59d1612be68387614fe1565b6040516001600160e01b031960e084901b16815260ff909116600482015260240160206040518083038186803b158015612c1f57600080fd5b505af4158015612c33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c579190614a0e565b612c619083614fc9565b915080612c6d816150a9565b915050612bb4565b50612c813382876136a0565b60005b8260ff168160ff161015612fa25760055488516001600160a01b0390911690636352211e908a9060ff8516908110612cbe57612cbe615101565b60200260200101516040518263ffffffff1660e01b8152600401612ce491815260200190565b60206040518083038186803b158015612cfc57600080fd5b505afa158015612d10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3491906144b8565b6001600160a01b0316336001600160a01b0316148015612e06575060045487516001600160a01b0390911690636352211e90899060ff8516908110612d7b57612d7b615101565b60200260200101516040518263ffffffff1660e01b8152600401612da191815260200190565b60206040518083038186803b158015612db957600080fd5b505afa158015612dcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612df191906144b8565b6001600160a01b0316336001600160a01b0316145b612e475760405162461bcd60e51b81526020600482015260126024820152714e6f74206f776e6572206f6620706169722160701b60448201526064016105ed565b60055488516001600160a01b03909116906323b872dd90339061dead908c9060ff8716908110612e7957612e79615101565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015612ed357600080fd5b505af1158015612ee7573d6000803e3d6000fd5b505060045489516001600160a01b0390911692506323b872dd9150339061dead908b9060ff8716908110612f1d57612f1d615101565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015612f7757600080fd5b505af1158015612f8b573d6000803e3d6000fd5b505050508080612f9a906150a9565b915050612c84565b50612fac3361399f565b60a084015160c0850151604051637332eaed60e01b815260ff8616600482015261ffff92831660248201529116604482015260009073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d90637332eaed9060640160206040518083038186803b15801561301857600080fd5b505af415801561302c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130509190614a0e565b9050600061305e8486614fe1565b600354604051630b76df3560e21b8152600481018d905260ff831660248201529192506001600160a01b031690632ddb7cd490604401600060405180830381600087803b1580156130ae57600080fd5b505af11580156130c2573d6000803e3d6000fd5b5050505060a086015160c0870151604051637332eaed60e01b815260ff8416600482015261ffff92831660248201529116604482015260009073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d90637332eaed9060640160206040518083038186803b15801561313257600080fd5b505af4158015613146573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061316a9190614a0e565b905060006131788483615006565b905061318433826139fa565b505050505050505050505050565b6000546001600160a01b031633146131bc5760405162461bcd60e51b81526004016105ed90614e37565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146132085760405162461bcd60e51b81526004016105ed90614e37565b600180546001600160a01b03199081166001600160a01b03978816179091556002805482169587169590951790945560038054851693861693909317909255600480548416918516919091179055600580549092169216919091179055565b6001546040516331a9108f60e11b8152600481018590526001600160a01b0390911690636352211e9060240160206040518083038186803b1580156132ab57600080fd5b505afa1580156132bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132e391906144b8565b6001600160a01b0316336001600160a01b0316146133135760405162461bcd60e51b81526004016105ed90614ebc565b600061331e846135ef565b9050600061332b856142c2565b90506000805b8561ffff168161ffff1610156133f55773a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d631f84f6e56133658386614fa3565b6040516001600160e01b031960e084901b16815261ffff909116600482015260240160206040518083038186803b15801561339f57600080fd5b505af41580156133b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133d79190614a0e565b6133e19083614fc9565b9150806133ed8161506c565b915050613331565b506134013382866136a0565b61340a3361399f565b608083015160c0840151604051637332eaed60e01b815260ff909216600483015261ffff808516602484015216604482015260009073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d90637332eaed9060640160206040518083038186803b15801561347657600080fd5b505af415801561348a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134ae9190614a0e565b905060006134bc8785614fa3565b60035460405163f0e6327b60e01b8152600481018b905261ffff831660248201529192506001600160a01b03169063f0e6327b90604401600060405180830381600087803b15801561350d57600080fd5b505af1158015613521573d6000803e3d6000fd5b50505050608085015160c0860151604051637332eaed60e01b815260ff909216600483015261ffff808416602484015216604482015260009073a5f4667ed2fd5c8d3e73a82792da2cb53e90aa4d90637332eaed9060640160206040518083038186803b15801561359157600080fd5b505af41580156135a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135c99190614a0e565b905060006135d78483615006565b90506135e333826139fa565b50505050505050505050565b6040805160e081018252600080825260208201819052818301819052606082018190526080820181905260a0820181905260c08201526003549151634810bc5960e01b81526004810184905290916001600160a01b031690634810bc599060240160e06040518083038186803b15801561366857600080fd5b505afa15801561367c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611430919061475f565b801561389a576002546040516351f8521d60e11b81526001600160a01b0385811660048301529091169063a3f0a43a9060240160206040518083038186803b1580156136eb57600080fd5b505afa1580156136ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137239190614a0e565b82111561377e5760405162461bcd60e51b8152602060048201526024808201527f4e6f7420656e6f756768204d4553206372656469747320746f20646f20616374604482015263696f6e2160e01b60648201526084016105ed565b60025460405163649d35fd60e01b81526001600160a01b0385811660048301529091169063649d35fd9060240160206040518083038186803b1580156137c357600080fd5b505afa1580156137d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137fb9190614a0e565b82106138615760025460405163632447c960e01b81526001600160a01b0385811660048301529091169063632447c990602401600060405180830381600087803b15801561384857600080fd5b505af115801561385c573d6000803e3d6000fd5b505050505b6002546040516382596f0160e01b81526001600160a01b03858116600483015260248201859052909116906382596f019060440161102f565b6002546040516370a0823160e01b81526001600160a01b038581166004830152909116906370a082319060240160206040518083038186803b1580156138df57600080fd5b505afa1580156138f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139179190614a0e565b8211156139665760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f756768204d455320746f20646f20616374696f6e210000000060448201526064016105ed565b600254604051632770a7eb60e21b81526001600160a01b0385811660048301526024820185905290911690639dc29fac9060440161102f565b60025460405163632447c960e01b81526001600160a01b0383811660048301529091169063632447c990602401600060405180830381600087803b1580156139e657600080fd5b505af1158015610cbe573d6000803e3d6000fd5b60025460405163b5862c2560e01b81526001600160a01b038481166004830152602482018490529091169063b5862c2590604401600060405180830381600087803b158015613a4857600080fd5b505af1158015613a5c573d6000803e3d6000fd5b505050505050565b8160ff1660011415613a765760065550565b8160ff1660021415613a885760075550565b8160ff1660031415613a9a5760085550565b8160ff1660041415613aac5760095550565b8160ff1660051415613abe57600a5550565b60405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420547970652160981b60448201526064016105ed565b6040805160a081018252600080825260208201819052818301819052606082018190526080820152600354915163ad217ae560e01b81526004810184905290916001600160a01b03169063ad217ae59060240160a06040518083038186803b158015613b6157600080fd5b505afa158015613b75573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143091906148df565b600081608001518260600151836040015184602001518560000151613bbe9190614fe1565b613bc89190614fe1565b613bd29190614fe1565b6114309190614fe1565b60008160ff1660011415613bf257508151611430565b8160ff1660021415613c0957506020820151611430565b8160ff1660031415613c2057506040820151611430565b8160ff1660041415613c3757506060820151611430565b8160ff1660051415613c4e57506080820151611430565b60405162461bcd60e51b815260206004820152601760248201527f496e76616c69642061747472696275746520747970652100000000000000000060448201526064016105ed565b8160ff1660011415613cdc5760035460405163dfa7dcc360e01b81526004810185905260ff831660248201526001600160a01b039091169063dfa7dcc39060440161102f565b8160ff1660021415613d2257600354604051632ede9e1960e01b81526004810185905260ff831660248201526001600160a01b0390911690632ede9e199060440161102f565b8160ff1660031415613d6857600354604051637367ff3760e11b81526004810185905260ff831660248201526001600160a01b039091169063e6cffe6e9060440161102f565b8160ff1660041415613dae5760035460405163487b8d4f60e01b81526004810185905260ff831660248201526001600160a01b039091169063487b8d4f9060440161102f565b8160ff1660051415613c4e576003546040516309b3dbaf60e01b81526004810185905260ff831660248201526001600160a01b03909116906309b3dbaf9060440161102f565b6040805161010081018252600080825260208201819052818301819052606082018190526080820181905260a0820181905260c0820181905260e082015260035491516305377eb160e51b81526004810184905290916001600160a01b03169063a6efd620906024016101006040518083038186803b158015613e7657600080fd5b505afa158015613e8a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114309190614816565b60008160ff1660011415613ec457508151611430565b8160ff1660021415613edb57506020820151611430565b8160ff1660031415613ef257506040820151611430565b8160ff1660041415613f0957506060820151611430565b8160ff1660051415613f2057506080820151611430565b8160ff1660061415613f37575060a0820151611430565b8160ff1660071415613f4e575060c0820151611430565b8160ff1660081415613f65575060e0820151611430565b60405162461bcd60e51b815260206004820152602160248201527f496e76616c69642045717569706d656e742055706772616465732051756572796044820152602160f81b60648201526084016105ed565b8060ff1660011415613ffd57600354604051631630f08560e11b81526004810185905260ff841660248201526001600160a01b0390911690632c61e10a9060440161102f565b8060ff16600214156140435760035460405163f4dcd77360e01b81526004810185905260ff841660248201526001600160a01b039091169063f4dcd7739060440161102f565b8060ff166003141561408957600354604051636bfc616d60e01b81526004810185905260ff841660248201526001600160a01b0390911690636bfc616d9060440161102f565b8060ff16600414156140cf57600354604051634a1f2c2f60e11b81526004810185905260ff841660248201526001600160a01b039091169063943e585e9060440161102f565b8060ff16600514156141155760035460405163a822043960e01b81526004810185905260ff841660248201526001600160a01b039091169063a82204399060440161102f565b8060ff166006141561415b576003546040516335e64b3360e11b81526004810185905260ff841660248201526001600160a01b0390911690636bcc96669060440161102f565b8060ff16600714156141a157600354604051631f609f9360e31b81526004810185905260ff841660248201526001600160a01b039091169063fb04fc989060440161102f565b8060ff16600814156141e75760035460405163a02a1b4760e01b81526004810185905260ff841660248201526001600160a01b039091169063a02a1b479060440161102f565b60405162461bcd60e51b8152602060048201526024808201527f496e76616c69642045717569706d656e742053657420557067726164652051756044820152636572792160e01b60648201526084016105ed565b600354604051634810bc5960e01b8152600481018390526000916001600160a01b031690634810bc599060240160e06040518083038186803b15801561428057600080fd5b505afa158015614294573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142b8919061475f565b6080015192915050565b600354604051634810bc5960e01b8152600481018390526000916001600160a01b031690634810bc599060240160e06040518083038186803b15801561430757600080fd5b505afa15801561431b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061433f919061475f565b60a0015192915050565b600082601f83011261435a57600080fd5b8135602061436f61436a83614f59565b614f29565b80838252828201915082860187848660051b890101111561438f57600080fd5b60005b858110156143ae57813584529284019290840190600101614392565b5090979650505050505050565b600082601f8301126143cc57600080fd5b813560206143dc61436a83614f59565b80838252828201915082860187848660051b89010111156143fc57600080fd5b60005b858110156143ae57813561441281615163565b845292840192908401906001016143ff565b803561442f81615145565b919050565b600082601f83011261444557600080fd5b813561445361436a82614f7c565b81815284602083860101111561446857600080fd5b816020850160208301376000918101602001919091529392505050565b805161442f81615153565b805161442f81615163565b6000602082840312156144ad57600080fd5b8135611de78161512d565b6000602082840312156144ca57600080fd5b8151611de78161512d565b600080600080600060a086880312156144ed57600080fd5b85356144f88161512d565b945060208601356145088161512d565b935060408601356145188161512d565b925060608601356145288161512d565b915060808601356145388161512d565b809150509295509295909350565b6000806040838503121561455957600080fd5b82356145648161512d565b946020939093013593505050565b60008060006060848603121561458757600080fd5b83356001600160401b038082111561459e57600080fd5b6145aa87838801614349565b94506020915081860135818111156145c157600080fd5b86019050601f810187136145d457600080fd5b80356145e261436a82614f59565b8082825284820191508484018a868560051b870101111561460257600080fd5b600094505b8385101561462e57803561461a81615153565b835260019490940193918501918501614607565b50809650505050505061464360408501614424565b90509250925092565b6000806040838503121561465f57600080fd5b82356001600160401b038082111561467657600080fd5b614682868387016143bb565b9350602085013591508082111561469857600080fd5b506146a585828601614349565b9150509250929050565b6000602082840312156146c157600080fd5b8135611de781615145565b6000602082840312156146de57600080fd5b8151611de781615145565b6000602082840312156146fb57600080fd5b81516001600160401b0381111561471157600080fd5b8201601f8101841361472257600080fd5b805161473061436a82614f7c565b81815285602083850101111561474557600080fd5b614756826020830160208601615040565b95945050505050565b600060e0828403121561477157600080fd5b60405160e081018181106001600160401b038211171561479357614793615117565b60405282516147a181615163565b815260208301516147b181615163565b602082015260408301516147c481615153565b604082015260608301516147d781615153565b60608201526147e860808401614490565b60808201526147f960a08401614485565b60a082015261480a60c08401614485565b60c08201529392505050565b600061010080838503121561482a57600080fd5b604051908101906001600160401b038211818310171561484c5761484c615117565b816040528351915061485d82615163565b81815261486c60208501614490565b602082015261487d60408501614490565b604082015261488e60608501614490565b606082015261489f60808501614490565b60808201526148b060a08501614490565b60a08201526148c160c08501614490565b60c08201526148d260e08501614490565b60e0820152949350505050565b600060a082840312156148f157600080fd5b60405160a081018181106001600160401b038211171561491357614913615117565b604052825161492181615163565b8152602083015161493181615163565b6020820152604083015161494481615163565b6040820152606083015161495781615163565b6060820152608083015161496a81615163565b60808201529392505050565b60006020828403121561498857600080fd5b8135611de781615153565b6000602082840312156149a557600080fd5b8151611de781615153565b600080604083850312156149c357600080fd5b82356149ce81615153565b915060208301356001600160401b038111156149e957600080fd5b6146a585828601614434565b600060208284031215614a0757600080fd5b5035919050565b600060208284031215614a2057600080fd5b5051919050565b60008060008060808587031215614a3d57600080fd5b843593506020850135614a4f8161512d565b9250604085013591506060850135614a6681615145565b939692955090935050565b60008060008060808587031215614a8757600080fd5b8435935060208501356001600160401b0380821115614aa557600080fd5b614ab188838901614349565b94506040870135915080821115614ac757600080fd5b50614ad487828801614349565b9250506060850135614a6681615145565b600080600060608486031215614afa57600080fd5b8335925060208401356001600160401b03811115614b1757600080fd5b614b2386828701614349565b9250506040840135614b3481615145565b809150509250925092565b600080600060608486031215614b5457600080fd5b8335925060208401356001600160401b0380821115614b7257600080fd5b614b7e878388016143bb565b93506040860135915080821115614b9457600080fd5b50614ba1868287016143bb565b9150509250925092565b60008060008060808587031215614bc157600080fd5b8435935060208501356001600160401b0380821115614bdf57600080fd5b614beb888389016143bb565b94506040870135915080821115614c0157600080fd5b50614ad4878288016143bb565b60008060408385031215614c2157600080fd5b823591506020830135614c3381615145565b809150509250929050565b600080600060608486031215614c5357600080fd5b8335925060208401356001600160401b03811115614c7057600080fd5b614b2386828701614434565b600080600060608486031215614c9157600080fd5b833592506020840135614ca381615153565b91506040840135614b3481615145565b60008060408385031215614cc657600080fd5b823591506020830135614c3381615163565b600080600060608486031215614ced57600080fd5b833592506020840135614ca381615163565b600080600060608486031215614d1457600080fd5b833592506020840135614d2681615163565b91506040840135614b3481615163565b60008060008060808587031215614d4c57600080fd5b843593506020850135614d5e81615163565b92506040850135614d6e81615163565b91506060850135614a6681615145565b600060208284031215614d9057600080fd5b8135611de781615163565b600060208284031215614dad57600080fd5b8151611de781615163565b600080600060608486031215614dcd57600080fd5b8335614dd881615163565b92506020840135614de881615153565b91506040840135614b3481615153565b60008151808452614e10816020860160208601615040565b601f01601f19169290920160200192915050565b602081526000611de76020830184614df8565b602080825260169082015275596f7520617265206e6f7420746865206f776e65722160501b604082015260600190565b60208082526035908201527f5265717565737420746f20757067726164652073746174732061626f766520616040820152747661696c61626c65206261736520706f696e74732160581b606082015260800190565b6020808252601d908201527f596f7520646f6e2774206f776e20746869732043686172616374657221000000604082015260600190565b61ffff83168152604060208201526000610d9c6040830184614df8565b828152604060208201526000610d9c6040830184614df8565b604051601f8201601f191681016001600160401b0381118282101715614f5157614f51615117565b604052919050565b60006001600160401b03821115614f7257614f72615117565b5060051b60200190565b60006001600160401b03821115614f9557614f95615117565b50601f01601f191660200190565b600061ffff808316818516808303821115614fc057614fc06150eb565b01949350505050565b60008219821115614fdc57614fdc6150eb565b500190565b600060ff821660ff84168060ff03821115614ffe57614ffe6150eb565b019392505050565b600082821015615018576150186150eb565b500390565b600060ff821660ff841680821015615037576150376150eb565b90039392505050565b60005b8381101561505b578181015183820152602001615043565b83811115611ccc5750506000910152565b600061ffff80831681811415615084576150846150eb565b6001019392505050565b60006000198214156150a2576150a26150eb565b5060010190565b600060ff821660ff8114156150c0576150c06150eb565b60010192915050565b6000826150e657634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461514257600080fd5b50565b801515811461514257600080fd5b61ffff8116811461514257600080fd5b60ff8116811461514257600080fdfea26469706673582212207afa9d86f4e6f8369ca581818d1051491e9c64e545276f3f4d33044bd017347f64736f6c63430008070033

Deployed Bytecode Sourcemap

11955:23242:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31085:93;;;;;;:::i;:::-;;:::i;:::-;;30370:31;;;;;;;;;;;;;;;20806:14:1;;20799:22;20781:41;;20769:2;20754:18;30370:31:0;;;;;;;;16006:1946;;;;;;:::i;:::-;;:::i;24189:374::-;;;;;;:::i;:::-;;:::i;28946:103::-;;;;;;:::i;:::-;;:::i;33103:229::-;;;;;;:::i;:::-;;:::i;:::-;;;34765:25:1;;;34753:2;34738:18;33103:229:0;34619:177:1;12416:13:0;;;;;-1:-1:-1;;;;;12416:13:0;;;;;;-1:-1:-1;;;;;19938:32:1;;;19920:51;;19908:2;19893:18;12416:13:0;19774:203:1;28573:296:0;;;;;;:::i;:::-;;:::i;30513:506::-;;;;;;:::i;:::-;;:::i;12436:17::-;;;;;-1:-1:-1;;;;;12436:17:0;;;29682:101;;;;;;:::i;:::-;;:::i;26662:1230::-;;;;;;:::i;:::-;;:::i;12455:17::-;;;;;-1:-1:-1;;;;;12455:17:0;;;34020:1174;;;;;;:::i;:::-;;:::i;:::-;;;35801:4:1;35789:17;;;35771:36;;35759:2;35744:18;34020:1174:0;35621:192:1;32172:93:0;;;;;;:::i;:::-;;:::i;30408:::-;;;;;;:::i;:::-;;:::i;22034:2149::-;;;;;;:::i;:::-;;:::i;33520:139::-;;;;;;:::i;:::-;;:::i;21542:458::-;;;;;;:::i;:::-;;:::i;33665:155::-;;;;;;:::i;:::-;;:::i;:::-;;;34092:6:1;34080:19;;;34062:38;;34050:2;34035:18;33665:155:0;33910:196:1;32134:31:0;;;;;;;;;33338:176;;;;;;:::i;:::-;;:::i;31047:31::-;;;;;;;;;;;;12010:20;;;;;-1:-1:-1;;;;;12010:20:0;;;31184:82;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;32808:289;;;;;;:::i;:::-;;:::i;31279:820::-;;;;;;:::i;:::-;;:::i;28897:42::-;;;;;;;;;32277:468;;;;;;:::i;:::-;;:::i;29057:550::-;;;;;;:::i;:::-;;:::i;12384:13::-;;;;;-1:-1:-1;;;;;12384:13:0;;;25896:760;;;;;;:::i;:::-;;:::i;33881:133::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;29634:41::-;;;;;;;;;;;;29791:551;;;;;;:::i;:::-;;:::i;12399:15::-;;;;;-1:-1:-1;;;;;12399:15:0;;;17958:2075;;;;;;:::i;:::-;;:::i;12167:79::-;;;;;;:::i;:::-;;:::i;12479:219::-;;;;;;:::i;:::-;;:::i;20070:1466::-;;;;;;:::i;:::-;;:::i;31085:93::-;12123:5;;-1:-1:-1;;;;;12123:5:0;12109:10;:19;12101:54;;;;-1:-1:-1;;;12101:54:0;;;;;;;:::i;:::-;;;;;;;;;31148:19:::1;:27:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;31148:27:0;;::::1;::::0;;;::::1;::::0;;31085:93::o;16006:1946::-;16148:2;;:24;;-1:-1:-1;;;16148:24:0;;;;;34765:25:1;;;-1:-1:-1;;;;;16148:2:0;;;;:10;;34738:18:1;;16148:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;16134:38:0;:10;-1:-1:-1;;;;;16134:38:0;;16126:80;;;;-1:-1:-1;;;16126:80:0;;25302:2:1;16126:80:0;;;25284:21:1;25341:2;25321:18;;;25314:30;25380:31;25360:18;;;25353:59;25429:18;;16126:80:0;25100:353:1;16126:80:0;16219:31;16253:28;16268:12;16253:14;:28::i;:::-;16312:20;;;;16375:24;;16219:62;;-1:-1:-1;16312:20:0;16294:15;;16493:132;16515:17;16511:21;;:1;:21;;;16493:132;;;16575:6;:23;16599:13;16611:1;16599:9;:13;:::i;:::-;16575:38;;-1:-1:-1;;;;;;16575:38:0;;;;;;;35801:4:1;35789:17;;;16575:38:0;;;35771:36:1;35744:18;;16575:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16554:59;;;;:::i;:::-;;-1:-1:-1;16534:3:0;;;;:::i;:::-;;;;16493:132;;;;16688:56;16701:10;16713:17;16732:11;16688:12;:56::i;:::-;16829:7;16824:334;16846:17;16842:21;;:1;:21;;;16824:334;;;16909:17;16927:1;16909:20;;;;;;;;;;:::i;:::-;;;;;;;16893:12;:36;;16885:82;;;;-1:-1:-1;;;16885:82:0;;23492:2:1;16885:82:0;;;23474:21:1;23531:2;23511:18;;;23504:30;23570:34;23550:18;;;23543:62;-1:-1:-1;;;23621:18:1;;;23614:31;23662:19;;16885:82:0;23290:397:1;16885:82:0;17004:2;;17015:20;;-1:-1:-1;;;;;17004:2:0;;;;:10;;17015:17;;:20;;;;;;;;;;:::i;:::-;;;;;;;17004:32;;;;;;;;;;;;;34765:25:1;;34753:2;34738:18;;34619:177;17004:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;16990:46:0;:10;-1:-1:-1;;;;;16990:46:0;;16982:85;;;;-1:-1:-1;;;16982:85:0;;30726:2:1;16982:85:0;;;30708:21:1;30765:2;30745:18;;;30738:30;30804:28;30784:18;;;30777:56;30850:18;;16982:85:0;30524:350:1;16982:85:0;17084:2;;17125:20;;-1:-1:-1;;;;;17084:2:0;;;;:15;;17100:10;;12314:42;;17125:17;;:20;;;;;;;;;;:::i;:::-;;;;;;;;;;;17084:62;;-1:-1:-1;;;;;;17084:62:0;;;;;;;-1:-1:-1;;;;;20240:15:1;;;17084:62:0;;;20222:34:1;20292:15;;;;20272:18;;;20265:43;20324:18;;;20317:34;20157:18;;17084:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16865:3;;;;;:::i;:::-;;;;16824:334;;;;17196:26;17211:10;17196:14;:26::i;:::-;17369:22;;;;17393:31;;;;17329:96;;-1:-1:-1;;;17329:96:0;;36239:4:1;36227:17;;17329:96:0;;;36209:36:1;36264:6;36306:15;;;36286:18;;;36279:43;36358:15;;36338:18;;;36331:43;17301:25:0;;17329:6;;:28;;36182:18:1;;17329:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17301:124;-1:-1:-1;17472:18:0;17493:29;17505:17;17493:9;:29;:::i;:::-;17533:2;;:42;;-1:-1:-1;;;17533:42:0;;;;;35531:25:1;;;35604:4;35592:17;;35572:18;;;35565:45;17472:50:0;;-1:-1:-1;;;;;;17533:2:0;;:14;;35504:18:1;;17533:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;17717:22:0;;;;17741:31;;;;17674:99;;-1:-1:-1;;;17674:99:0;;36239:4:1;36227:17;;17674:99:0;;;36209:36:1;36264:6;36306:15;;;36286:18;;;36279:43;36358:15;;36338:18;;;36331:43;17650:21:0;;17674:6;;:28;;36182:18:1;;17674:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17650:123;-1:-1:-1;17784:27:0;17814:33;17830:17;17650:123;17814:33;:::i;:::-;17784:63;;17897:47;17912:10;17924:19;17897:14;:47::i;:::-;16115:1837;;;;;;;;16006:1946;;;:::o;24189:374::-;24353:6;:13;24334:8;:15;:32;24326:79;;;;-1:-1:-1;;;24326:79:0;;30323:2:1;24326:79:0;;;30305:21:1;30362:2;30342:18;;;30335:30;30401:34;30381:18;;;30374:62;-1:-1:-1;;;30452:18:1;;;30445:32;30494:19;;24326:79:0;30121:398:1;24326:79:0;24421:9;24416:140;24440:8;:15;24436:1;:19;24416:140;;;24477:67;24494:12;24508:8;24517:1;24508:11;;;;;;;;:::i;:::-;;;;;;;24521:6;24528:1;24521:9;;;;;;;;:::i;:::-;;;;;;;24532:11;24477:16;:67::i;:::-;24457:3;;;;:::i;:::-;;;;24416:140;;;;24189:374;;;;:::o;28946:103::-;12123:5;;-1:-1:-1;;;;;12123:5:0;12109:10;:19;12101:54;;;;-1:-1:-1;;;12101:54:0;;;;;;;:::i;:::-;29015:23:::1;:31:::0;;-1:-1:-1;;29015:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;28946:103::o;33103:229::-;33250:74;;-1:-1:-1;;;33250:74:0;;36239:4:1;36227:17;;33250:74:0;;;36209:36:1;36264:6;36306:15;;;36286:18;;;36279:43;36358:15;;36338:18;;;36331:43;33223:7:0;;33250:6;;:28;;36182:18:1;;33250:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33243:81;33103:229;-1:-1:-1;;;;33103:229:0:o;28573:296::-;12123:5;;-1:-1:-1;;;;;12123:5:0;12109:10;:19;12101:54;;;;-1:-1:-1;;;12101:54:0;;;;;;;:::i;:::-;28700:6:::1;:13;28683:6;:13;:30;28675:65;;;::::0;-1:-1:-1;;;28675:65:0;;33761:2:1;28675:65:0::1;::::0;::::1;33743:21:1::0;33800:2;33780:18;;;33773:30;-1:-1:-1;;;33819:18:1;;;33812:52;33881:18;;28675:65:0::1;33559:346:1::0;28675:65:0::1;28756:9;28751:111;28775:6;:13;28771:1;:17;28751:111;;;28810:40;28829:6;28836:1;28829:9;;;;;;;;:::i;:::-;;;;;;;28840:6;28847:1;28840:9;;;;;;;;:::i;:::-;;;;;;;28810:18;:40::i;:::-;28790:3:::0;::::1;::::0;::::1;:::i;:::-;;;;28751:111;;;;28573:296:::0;;:::o;30513:506::-;30599:19;;;;;;;30591:66;;;;-1:-1:-1;;;30591:66:0;;28047:2:1;30591:66:0;;;28029:21:1;28086:2;28066:18;;;28059:30;28125:34;28105:18;;;28098:62;-1:-1:-1;;;28176:18:1;;;28169:32;28218:19;;30591:66:0;27845:398:1;30591:66:0;30690:2;;:24;;-1:-1:-1;;;30690:24:0;;;;;34765:25:1;;;-1:-1:-1;;;;;30690:2:0;;;;:10;;34738:18:1;;30690:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30676:38:0;:10;-1:-1:-1;;;;;30676:38:0;;30668:80;;;;-1:-1:-1;;;30668:80:0;;;;;;;:::i;:::-;30759:53;30772:10;30784:14;;30800:11;30759:12;:53::i;:::-;30863:77;;-1:-1:-1;;30880:10:0;19577:2:1;19573:15;19569:53;30863:77:0;;;19557:66:1;30892:15:0;19639:12:1;;;19632:28;30909:16:0;19676:12:1;;;19669:28;19713:12;;;19706:28;;;30823:11:0;;30945:2;;19750:13:1;;30863:77:0;;;;;;;;;;;;30853:88;;;;;;30845:97;;:102;;;;:::i;:::-;30844:108;;30951:1;30844:108;:::i;:::-;30980:2;;:31;;-1:-1:-1;;;30980:31:0;;;;;35531:25:1;;;35604:4;35592:17;;35572:18;;;35565:45;30823:131:0;;-1:-1:-1;;;;;;30980:2:0;;:10;;35504:18:1;;30980:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30580:439;30513:506;;:::o;29682:101::-;12123:5;;-1:-1:-1;;;;;12123:5:0;12109:10;:19;12101:54;;;;-1:-1:-1;;;12101:54:0;;;;;;;:::i;:::-;29750:22:::1;:30:::0;;;::::1;;;;-1:-1:-1::0;;29750:30:0;;::::1;::::0;;;::::1;::::0;;29682:101::o;26662:1230::-;26810:2;;:24;;-1:-1:-1;;;26810:24:0;;;;;34765:25:1;;;-1:-1:-1;;;;;26810:2:0;;;;:10;;34738:18:1;;26810:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;26796:38:0;:10;-1:-1:-1;;;;;26796:38:0;;26788:80;;;;-1:-1:-1;;;26788:80:0;;;;;;;:::i;:::-;26909:8;:15;26887:11;:18;:37;26879:89;;;;-1:-1:-1;;;26879:89:0;;33353:2:1;26879:89:0;;;33335:21:1;33392:2;33372:18;;;33365:30;33431:34;33411:18;;;33404:62;-1:-1:-1;;;33482:18:1;;;33475:37;33529:19;;26879:89:0;33151:403:1;26879:89:0;27044:31;27078:28;27093:12;27078:14;:28::i;:::-;27044:62;;27117:23;27143:24;27154:12;27143:10;:24::i;:::-;27117:50;-1:-1:-1;27223:19:0;;27253:100;27277:8;:15;27273:1;:19;27253:100;;;27330:8;27339:1;27330:11;;;;;;;;:::i;:::-;;;;;;;27314:27;;;;;;;:::i;:::-;;-1:-1:-1;27294:3:0;;;;:::i;:::-;;;;27253:100;;;;27484:10;:22;;;27435:71;;27468:12;27435:30;27458:6;27435:22;:30::i;:::-;:45;;;;;;:::i;:::-;:71;;;;27427:137;;;;-1:-1:-1;;;27427:137:0;;;;;;;:::i;:::-;27615:9;27610:275;27634:8;:15;27630:1;:19;27610:275;;;27671:19;27693:43;27713:6;27721:11;27733:1;27721:14;;;;;;;;:::i;:::-;;;;;;;27693:19;:43::i;:::-;27671:65;;27751:15;27785:8;27794:1;27785:11;;;;;;;;:::i;:::-;;;;;;;27769:13;:27;;;;:::i;:::-;27751:45;;27813:60;27833:12;27847:11;27859:1;27847:14;;;;;;;;:::i;:::-;;;;;;;27863:9;27813:19;:60::i;:::-;27656:229;;27651:3;;;;;:::i;:::-;;;;27610:275;;34020:1174;34109:5;34127:31;34161:28;34176:12;34161:14;:28::i;:::-;34127:62;;34200:31;34234:28;34249:12;34234:14;:28::i;:::-;34200:62;;34275:13;34291:67;34305:10;:26;;;34333:24;34347:9;34333:13;:24::i;34291:67::-;34275:83;;34369:24;34396:31;34419:7;34396:22;:31::i;:::-;34369:58;;34440:15;34475:9;:14;;34488:1;34475:14;34466:671;;;-1:-1:-1;34505:26:0;;34466:671;;;34553:9;:14;;34566:1;34553:14;34549:588;;;-1:-1:-1;34583:25:0;;;;34549:588;;;34630:9;:14;;34643:1;34630:14;34626:511;;;-1:-1:-1;34660:24:0;;;;34626:511;;;34706:9;:14;;34719:1;34706:14;34702:435;;;-1:-1:-1;34736:24:0;;;;34702:435;;;34782:9;:14;;34795:1;34782:14;34778:359;;;-1:-1:-1;34812:27:0;;;;34778:359;;;34861:9;:14;;34874:1;34861:14;34857:280;;;-1:-1:-1;34891:24:0;;;;34857:280;;;34937:9;:14;;34950:1;34937:14;34933:204;;;-1:-1:-1;34967:28:0;;;;34933:204;;;35017:9;:14;;35030:1;35017:14;35013:124;;;-1:-1:-1;35047:24:0;;;;35013:124;;;35111:23;;-1:-1:-1;;;35111:23:0;;32601:2:1;35111:23:0;;;32583:21:1;32640:2;32620:18;;;32613:30;-1:-1:-1;;;32659:18:1;;;32652:43;32712:18;;35111:23:0;32399:337:1;35013:124:0;35156:30;35177:9;35156:18;:30;:::i;:::-;35149:37;;;;;;;34020:1174;;;;;:::o;32172:93::-;12123:5;;-1:-1:-1;;;;;12123:5:0;12109:10;:19;12101:54;;;;-1:-1:-1;;;12101:54:0;;;;;;;:::i;:::-;32235:19:::1;:27:::0;;-1:-1:-1;;32235:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;32172:93::o;30408:::-;12123:5;;-1:-1:-1;;;;;12123:5:0;12109:10;:19;12101:54;;;;-1:-1:-1;;;12101:54:0;;;;;;;:::i;:::-;30471:19:::1;:27:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;30471:27:0;;::::1;::::0;;;::::1;::::0;;30408:93::o;22034:2149::-;22168:2;;:24;;-1:-1:-1;;;22168:24:0;;;;;34765:25:1;;;-1:-1:-1;;;;;22168:2:0;;;;:10;;34738:18:1;;22168:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;22154:38:0;:10;-1:-1:-1;;;;;22154:38:0;;22146:80;;;;-1:-1:-1;;;22146:80:0;;;;;;;:::i;:::-;22239:31;22273:28;22288:12;22273:14;:28::i;:::-;22239:62;;22312:31;22346:28;22361:12;22346:14;:28::i;:::-;22424:26;;;;22452:27;;-1:-1:-1;;;22452:27:0;;35801:4:1;35789:17;;22452:27:0;;;35771:36:1;22312:62:0;;-1:-1:-1;22387:13:0;;22403:6;;:20;;:6;;22452:20;;35744:18:1;;22452:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22452:27:0;;;;;;;;;;;;:::i;:::-;22403:77;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22387:93;;22491:22;22516:41;22539:10;22551:5;22516:22;:41::i;:::-;22608:43;;-1:-1:-1;;;22608:43:0;;35801:4:1;35789:17;;22608:43:0;;;35771:36:1;22491:66:0;;-1:-1:-1;22608:6:0;;:34;;35744:18:1;;22608:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22578:73;;:26;22597:7;22578:16;:26;:::i;:::-;:73;;;;22570:124;;;;-1:-1:-1;;;22570:124:0;;28450:2:1;22570:124:0;;;28432:21:1;28489:2;28469:18;;;28462:30;28528:34;28508:18;;;28501:62;-1:-1:-1;;;28579:18:1;;;28572:36;28625:19;;22570:124:0;28248:402:1;22570:124:0;22746:20;;22777:133;22799:7;22795:11;;:1;:11;;;22777:133;;;22844:6;:32;22877:20;22896:1;22877:16;:20;:::i;:::-;22844:54;;-1:-1:-1;;;;;;22844:54:0;;;;;;;35801:4:1;35789:17;;;22844:54:0;;;35771:36:1;35744:18;;22844:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22828:70;;;;:::i;:::-;;-1:-1:-1;22808:3:0;;;;:::i;:::-;;;;22777:133;;;;22969:51;22982:10;22994:12;23008:11;22969:12;:51::i;:::-;23059:26;23074:10;23059:14;:26::i;:::-;23216:20;;;;23238:22;;;;23262:31;;;;23187:107;;-1:-1:-1;;;23187:107:0;;36239:4:1;36227:17;;;23187:107:0;;;36209:36:1;36264:6;36306:15;;;36286:18;;;36279:43;36358:15;36338:18;;;36331:43;23159:25:0;;23187:6;;:28;;36182:18:1;;23187:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23159:135;-1:-1:-1;23356:18:0;23377:26;23396:7;23377:16;:26;:::i;:::-;23356:47;;23414:52;23432:12;23446;23460:5;23414:17;:52::i;:::-;23679:55;;-1:-1:-1;;;23679:55:0;;36589:4:1;36577:17;;;23679:55:0;;;36559:36:1;36631:17;;36611:18;;;36604:45;23556:30:0;;23679:6;;:28;;36532:18:1;;23679:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23625:51;;-1:-1:-1;;;23625:51:0;;36589:4:1;36577:17;;;23625:51:0;;;36559:36:1;36631:17;;36611:18;;;36604:45;23625:6:0;;:28;;36532:18:1;;23625:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:109;;;;:::i;:::-;23589:147;;:10;:31;;;:147;;;;:::i;:::-;23747:2;;:64;;-1:-1:-1;;;23747:64:0;;;;;35269:25:1;;;35342:6;35330:19;;35310:18;;;35303:47;23556:180:0;;-1:-1:-1;;;;;;23747:2:0;;:25;;35242:18:1;;23747:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;23925:20:0;;;;23947:22;;;;23896:99;;-1:-1:-1;;;23896:99:0;;36239:4:1;36227:17;;;23896:99:0;;;36209:36:1;36264:6;36306:15;;;36286:18;;;36279:43;36358:15;;36338:18;;;36331:43;23872:21:0;;23896:6;;:28;;36182:18:1;;23896:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23872:123;-1:-1:-1;24006:27:0;24036:33;24052:17;23872:123;24036:33;:::i;:::-;24006:63;;24128:47;24143:10;24155:19;24128:14;:47::i;:::-;22135:2048;;;;;;;;;;22034:2149;;;;:::o;33520:139::-;33613:38;;-1:-1:-1;;;33613:38:0;;35801:4:1;35789:17;;33613:38:0;;;35771:36:1;33588:5:0;;33613:6;;:29;;35744:18:1;;33613:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;21542:458::-;21805:8;:15;21781:13;:20;:39;21773:80;;;;-1:-1:-1;;;21773:80:0;;28857:2:1;21773:80:0;;;28839:21:1;28896:2;28876:18;;;28869:30;28935;28915:18;;;28908:58;28983:18;;21773:80:0;28655:352:1;21773:80:0;21869:9;21864:129;21888:13;:20;21884:1;:24;21864:129;;;21930:51;21938:13;21952:1;21938:16;;;;;;;;:::i;:::-;;;;;;;21956:8;21965:1;21956:11;;;;;;;;:::i;:::-;;;;;;;21969;21930:7;:51::i;:::-;21910:3;;;;:::i;:::-;;;;21864:129;;;;21542:458;;;:::o;33665:155::-;33767:45;;-1:-1:-1;;;33767:45:0;;34092:6:1;34080:19;;33767:45:0;;;34062:38:1;33741:6:0;;33767;;:28;;34035:18:1;;33767:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33338:176::-;33457:49;;-1:-1:-1;;;33457:49:0;;33432:5;;33457:6;;:20;;:49;;33478:15;;33495:10;;33457:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33450:56;33338:176;-1:-1:-1;;;33338:176:0:o;32808:289::-;32882:7;32902:31;32936:28;32951:12;32936:14;:28::i;:::-;33011:20;;;;33033:22;;;;33057:31;;;;32982:107;;-1:-1:-1;;;32982:107:0;;36239:4:1;36227:17;;;32982:107:0;;;36209:36:1;36264:6;36306:15;;;36286:18;;;36279:43;36358:15;36338:18;;;36331:43;32902:62:0;;-1:-1:-1;32982:6:0;;:28;;36182:18:1;;32982:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31279:820::-;31410:19;;;;;;;31402:65;;;;-1:-1:-1;;;31402:65:0;;32199:2:1;31402:65:0;;;32181:21:1;32238:2;32218:18;;;32211:30;32277:34;32257:18;;;32250:62;-1:-1:-1;;;32328:18:1;;;32321:31;32369:19;;31402:65:0;31997:397:1;31402:65:0;31500:2;;:24;;-1:-1:-1;;;31500:24:0;;;;;34765:25:1;;;-1:-1:-1;;;;;31500:2:0;;;;:10;;34738:18:1;;31500:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;31486:38:0;:10;-1:-1:-1;;;;;31486:38:0;;31478:80;;;;-1:-1:-1;;;31478:80:0;;;;;;;:::i;:::-;31578:2;;:62;;-1:-1:-1;;;31578:62:0;;-1:-1:-1;;;;;20554:32:1;;;31578:62:0;;;20536:51:1;20603:18;;;20596:34;;;31578:2:0;;;;:33;;20509:18:1;;31578:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31577:63;31569:117;;;;-1:-1:-1;;;31569:117:0;;32943:2:1;31569:117:0;;;32925:21:1;32982:2;32962:18;;;32955:30;33021:34;33001:18;;;32994:62;-1:-1:-1;;;33072:18:1;;;33065:39;33121:19;;31569:117:0;32741:405:1;31569:117:0;-1:-1:-1;;;;;31716:48:0;;;;;;:30;:48;;;;;;;;:59;;;;;;;;;;;31708:112;;;;-1:-1:-1;;;31708:112:0;;25660:2:1;31708:112:0;;;25642:21:1;25699:2;25679:18;;;25672:30;25738:34;25718:18;;;25711:62;-1:-1:-1;;;25789:18:1;;;25782:38;25837:19;;31708:112:0;25458:404:1;31708:112:0;31855:53;31868:10;31880:14;;31896:11;31855:12;:53::i;:::-;-1:-1:-1;;;;;31921:48:0;;;;;;;:30;:48;;;;;;;;:59;;;;;;;;;:66;;-1:-1:-1;;31921:66:0;31983:4;31921:66;;;32014:2;;:35;;-1:-1:-1;;;32014:35:0;;;;;19920:51:1;;;;31921:48:0;;32014:2;;:17;;19893:18:1;;32014:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32060:2;;:31;;-1:-1:-1;;;32060:31:0;;;;;35531:25:1;;;35604:4;35592:17;;35572:18;;;35565:45;32000:49:0;;-1:-1:-1;;;;;;32060:2:0;;:10;;35504:18:1;;32060:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31391:708;31279:820;;;;:::o;32277:468::-;32388:19;;;;32380:61;;;;-1:-1:-1;;;32380:61:0;;23894:2:1;32380:61:0;;;23876:21:1;23933:2;23913:18;;;23906:30;23972:31;23952:18;;;23945:59;24021:18;;32380:61:0;23692:353:1;32380:61:0;32460:2;;:33;;-1:-1:-1;;;32460:33:0;;35801:4:1;35789:17;;32460:33:0;;;35771:36:1;-1:-1:-1;;;;;32460:2:0;;;;:20;;35744:18:1;;32460:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32452:75;;;;-1:-1:-1;;;32452:75:0;;31841:2:1;32452:75:0;;;31823:21:1;31880:2;31860:18;;;31853:30;31919:31;31899:18;;;31892:59;31968:18;;32452:75:0;31639:353:1;32452:75:0;32560:2;;:24;;-1:-1:-1;;;32560:24:0;;;;;34765:25:1;;;-1:-1:-1;;;;;32560:2:0;;;;:10;;34738:18:1;;32560:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32546:38:0;:10;-1:-1:-1;;;;;32546:38:0;;32538:80;;;;-1:-1:-1;;;32538:80:0;;;;;;;:::i;:::-;32630:53;32643:10;32655:14;;32671:11;32630:12;:53::i;:::-;32694:2;;:43;;-1:-1:-1;;;32694:43:0;;;;;35531:25:1;;;35604:4;35592:17;;35572:18;;;35565:45;-1:-1:-1;;;;;32694:2:0;;;;:16;;35504:18:1;;32694:43:0;35361:255:1;29057:550:0;29164:23;;;;29156:59;;;;-1:-1:-1;;;29156:59:0;;29566:2:1;29156:59:0;;;29548:21:1;29605:2;29585:18;;;29578:30;29644:25;29624:18;;;29617:53;29687:18;;29156:59:0;29364:347:1;29156:59:0;29248:2;;:24;;-1:-1:-1;;;29248:24:0;;;;;34765:25:1;;;-1:-1:-1;;;;;29248:2:0;;;;:10;;34738:18:1;;29248:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29234:38:0;:10;-1:-1:-1;;;;;29234:38:0;;29226:80;;;;-1:-1:-1;;;29226:80:0;;;;;;;:::i;:::-;29325:39;;-1:-1:-1;;;29325:39:0;;:10;;:32;;:39;;29358:5;;29325:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29317:87;;;;-1:-1:-1;;;29317:87:0;;27643:2:1;29317:87:0;;;27625:21:1;27682:2;27662:18;;;27655:30;27721:34;27701:18;;;27694:62;-1:-1:-1;;;27772:18:1;;;27765:33;27815:19;;29317:87:0;27441:399:1;29317:87:0;29435:5;29429:19;29423:2;:25;;29415:78;;;;-1:-1:-1;;;29415:78:0;;27234:2:1;29415:78:0;;;27216:21:1;27273:2;27253:18;;;27246:30;27312:34;27292:18;;;27285:62;-1:-1:-1;;;27363:18:1;;;27356:38;27411:19;;29415:78:0;27032:404:1;29415:78:0;29504:53;29517:10;29529:14;;29545:11;29504:12;:53::i;:::-;29568:2;;:31;;-1:-1:-1;;;29568:31:0;;-1:-1:-1;;;;;29568:2:0;;;;:10;;:31;;29579:12;;29593:5;;29568:31;;;:::i;25896:760::-;26019:2;;:24;;-1:-1:-1;;;26019:24:0;;;;;34765:25:1;;;-1:-1:-1;;;;;26019:2:0;;;;:10;;34738:18:1;;26019:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;26005:38:0;:10;-1:-1:-1;;;;;26005:38:0;;25997:80;;;;-1:-1:-1;;;25997:80:0;;;;;;;:::i;:::-;26090:31;26124:28;26139:12;26124:14;:28::i;:::-;26090:62;;26163:23;26189:24;26200:12;26189:10;:24::i;:::-;26163:50;;26276:10;:22;;;26232:66;;26265:7;26232:30;26255:6;26232:22;:30::i;:::-;:40;;;;:::i;:::-;:66;;;;26224:132;;;;-1:-1:-1;;;26224:132:0;;;;;;;:::i;:::-;26426:19;26448:39;26468:6;26476:10;26448:19;:39::i;:::-;26426:61;-1:-1:-1;26498:15:0;26516:23;26532:7;26426:61;26516:23;:::i;:::-;26498:41;;26592:56;26612:12;26626:10;26638:9;26592:19;:56::i;33881:133::-;33975:31;;-1:-1:-1;;;33975:31:0;;35801:4:1;35789:17;;33975:31:0;;;35771:36:1;33942:13:0;;33975:6;;:20;;35744:18:1;;33975:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33975:31:0;;;;;;;;;;;;:::i;29791:551::-;29896:22;;;;;;;29888:64;;;;-1:-1:-1;;;29888:64:0;;24944:2:1;29888:64:0;;;24926:21:1;24983:2;24963:18;;;24956:30;25022:31;25002:18;;;24995:59;25071:18;;29888:64:0;24742:353:1;29888:64:0;29985:2;;:24;;-1:-1:-1;;;29985:24:0;;;;;34765:25:1;;;-1:-1:-1;;;;;29985:2:0;;;;:10;;34738:18:1;;29985:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29971:38:0;:10;-1:-1:-1;;;;;29971:38:0;;29963:80;;;;-1:-1:-1;;;29963:80:0;;;;;;;:::i;:::-;30062:38;;-1:-1:-1;;;30062:38:0;;:10;;:32;;:38;;30095:4;;30062:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30054:85;;;;-1:-1:-1;;;30054:85:0;;31438:2:1;30054:85:0;;;31420:21:1;31477:2;31457:18;;;31450:30;31516:34;31496:18;;;31489:62;-1:-1:-1;;;31567:18:1;;;31560:32;31609:19;;30054:85:0;31236:398:1;30054:85:0;30242:52;30255:10;30267:13;;30282:11;30242:12;:52::i;:::-;30305:2;;:29;;-1:-1:-1;;;30305:29:0;;-1:-1:-1;;;;;30305:2:0;;;;:9;;:29;;30315:12;;30329:4;;30305:29;;;:::i;17958:2075::-;18137:2;;:24;;-1:-1:-1;;;18137:24:0;;;;;34765:25:1;;;-1:-1:-1;;;;;18137:2:0;;;;:10;;34738:18:1;;18137:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18123:38:0;:10;-1:-1:-1;;;;;18123:38:0;;18115:80;;;;-1:-1:-1;;;18115:80:0;;;;;;;:::i;:::-;18238:14;:21;18214:13;:20;:45;18206:79;;;;-1:-1:-1;;;18206:79:0;;24594:2:1;18206:79:0;;;24576:21:1;24633:2;24613:18;;;24606:30;-1:-1:-1;;;24652:18:1;;;24645:51;24713:18;;18206:79:0;24392:345:1;18206:79:0;18298:31;18332:28;18347:12;18332:14;:28::i;:::-;18298:62;;18373:15;18391:27;18405:12;18391:13;:27::i;:::-;18461:20;;18373:45;;-1:-1:-1;18429:23:0;;18575:132;18597:17;18593:21;;:1;:21;;;18575:132;;;18657:6;:23;18681:13;18693:1;18681:9;:13;:::i;:::-;18657:38;;-1:-1:-1;;;;;;18657:38:0;;;;;;;35801:4:1;35789:17;;;18657:38:0;;;35771:36:1;35744:18;;18657:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18636:59;;;;:::i;:::-;;-1:-1:-1;18616:3:0;;;;:::i;:::-;;;;18575:132;;;;18770:56;18783:10;18795:17;18814:11;18770:12;:56::i;:::-;18902:7;18897:342;18919:17;18915:21;;:1;:21;;;18897:342;;;18980:2;;18991:16;;-1:-1:-1;;;;;18980:2:0;;;;:10;;18991:13;;:16;;;;;;;;;;:::i;:::-;;;;;;;18980:28;;;;;;;;;;;;;34765:25:1;;34753:2;34738:18;;34619:177;18980:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18966:42:0;:10;-1:-1:-1;;;;;18966:42:0;;:89;;;;-1:-1:-1;19026:2:0;;19037:17;;-1:-1:-1;;;;;19026:2:0;;;;:10;;19037:14;;:17;;;;;;;;;;:::i;:::-;;;;;;;19026:29;;;;;;;;;;;;;34765:25:1;;34753:2;34738:18;;34619:177;19026:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19012:43:0;:10;-1:-1:-1;;;;;19012:43:0;;18966:89;18958:120;;;;-1:-1:-1;;;18958:120:0;;22372:2:1;18958:120:0;;;22354:21:1;22411:2;22391:18;;;22384:30;-1:-1:-1;;;22430:18:1;;;22423:48;22488:18;;18958:120:0;22170:342:1;18958:120:0;19095:2;;19136:16;;-1:-1:-1;;;;;19095:2:0;;;;:15;;19111:10;;12314:42;;19136:13;;:16;;;;;;;;;;:::i;:::-;;;;;;;;;;;19095:58;;-1:-1:-1;;;;;;19095:58:0;;;;;;;-1:-1:-1;;;;;20240:15:1;;;19095:58:0;;;20222:34:1;20292:15;;;;20272:18;;;20265:43;20324:18;;;20317:34;20157:18;;19095:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19168:2:0;;19209:17;;-1:-1:-1;;;;;19168:2:0;;;;-1:-1:-1;19168:15:0;;-1:-1:-1;19184:10:0;;12314:42;;19209:14;;:17;;;;;;;;;;:::i;:::-;;;;;;;;;;;19168:59;;-1:-1:-1;;;;;;19168:59:0;;;;;;;-1:-1:-1;;;;;20240:15:1;;;19168:59:0;;;20222:34:1;20292:15;;;;20272:18;;;20265:43;20324:18;;;20317:34;20157:18;;19168:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18938:3;;;;;:::i;:::-;;;;18897:342;;;;19277:26;19292:10;19277:14;:26::i;:::-;19450:22;;;;19474:31;;;;19410:96;;-1:-1:-1;;;19410:96:0;;36239:4:1;36227:17;;19410:96:0;;;36209:36:1;36264:6;36306:15;;;36286:18;;;36279:43;36358:15;;36338:18;;;36331:43;19382:25:0;;19410:6;;:28;;36182:18:1;;19410:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19382:124;-1:-1:-1;19553:18:0;19574:29;19586:17;19574:9;:29;:::i;:::-;19614:2;;:42;;-1:-1:-1;;;19614:42:0;;;;;35531:25:1;;;35604:4;35592:17;;35572:18;;;35565:45;19553:50:0;;-1:-1:-1;;;;;;19614:2:0;;:14;;35504:18:1;;19614:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;19798:22:0;;;;19822:31;;;;19755:99;;-1:-1:-1;;;19755:99:0;;36239:4:1;36227:17;;19755:99:0;;;36209:36:1;36264:6;36306:15;;;36286:18;;;36279:43;36358:15;;36338:18;;;36331:43;19731:21:0;;19755:6;;:28;;36182:18:1;;19755:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19731:123;-1:-1:-1;19865:27:0;19895:33;19911:17;19731:123;19895:33;:::i;:::-;19865:63;;19978:47;19993:10;20005:19;19978:14;:47::i;:::-;18104:1929;;;;;;;;17958:2075;;;;:::o;12167:79::-;12123:5;;-1:-1:-1;;;;;12123:5:0;12109:10;:19;12101:54;;;;-1:-1:-1;;;12101:54:0;;;;;;;:::i;:::-;12227:5:::1;:16:::0;;-1:-1:-1;;;;;;12227:16:0::1;-1:-1:-1::0;;;;;12227:16:0;;;::::1;::::0;;;::::1;::::0;;12167:79::o;12479:219::-;12123:5;;-1:-1:-1;;;;;12123:5:0;12109:10;:19;12101:54;;;;-1:-1:-1;;;12101:54:0;;;;;;;:::i;:::-;12597:2:::1;:13:::0;;-1:-1:-1;;;;;;12597:13:0;;::::1;-1:-1:-1::0;;;;;12597:13:0;;::::1;;::::0;;;12612:3:::1;:16:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;12630:2:::1;:13:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;12654:2:::1;:17:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;12673:2:::1;:17:::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;12479:219::o;20070:1466::-;20183:2;;:24;;-1:-1:-1;;;20183:24:0;;;;;34765:25:1;;;-1:-1:-1;;;;;20183:2:0;;;;:10;;34738:18:1;;20183:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;20169:38:0;:10;-1:-1:-1;;;;;20169:38:0;;20161:80;;;;-1:-1:-1;;;20161:80:0;;;;;;;:::i;:::-;20254:31;20288:28;20303:12;20288:14;:28::i;:::-;20254:62;;20329:25;20357:29;20373:12;20357:15;:29::i;:::-;20329:57;-1:-1:-1;20444:20:0;;20475:137;20498:7;20494:11;;:1;:11;;;20475:137;;;20543:6;:33;20577:22;20598:1;20577:18;:22;:::i;:::-;20543:57;;-1:-1:-1;;;;;;20543:57:0;;;;;;;34092:6:1;34080:19;;;20543:57:0;;;34062:38:1;34035:18;;20543:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20527:73;;;;:::i;:::-;;-1:-1:-1;20507:3:0;;;;:::i;:::-;;;;20475:137;;;;20671:51;20684:10;20696:12;20710:11;20671:12;:51::i;:::-;20761:26;20776:10;20761:14;:26::i;:::-;20937:20;;;;20979:31;;;;20894:117;;-1:-1:-1;;;20894:117:0;;36239:4:1;36227:17;;;20894:117:0;;;36209:36:1;36264:6;36306:15;;;36286:18;;;36279:43;36358:15;36338:18;;;36331:43;20866:25:0;;20894:6;;:28;;36182:18:1;;20894:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20866:145;-1:-1:-1;21056:21:0;21080:28;21101:7;21080:18;:28;:::i;:::-;21119:2;;:46;;-1:-1:-1;;;21119:46:0;;;;;35269:25:1;;;35342:6;35330:19;;35310:18;;;35303:47;21056:52:0;;-1:-1:-1;;;;;;21119:2:0;;:16;;35242:18:1;;21119:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;21287:20:0;;;;21325:31;;;;21244:113;;-1:-1:-1;;;21244:113:0;;36239:4:1;36227:17;;;21244:113:0;;;36209:36:1;36264:6;36306:15;;;36286:18;;;36279:43;36358:15;36338:18;;;36331:43;21220:21:0;;21244:6;;:28;;36182:18:1;;21244:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21220:137;-1:-1:-1;21368:27:0;21398:33;21414:17;21220:137;21398:33;:::i;:::-;21368:63;;21481:47;21496:10;21508:19;21481:14;:47::i;:::-;20150:1386;;;;;;;20070:1466;;;:::o;13560:144::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13669:2:0;;:27;;-1:-1:-1;;;13669:27:0;;;;;34765:25:1;;;-1:-1:-1;;;;;;;13669:2:0;;:13;;34738:18:1;;13669:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;12739:545::-;12838:11;12834:443;;;12885:3;;:37;;-1:-1:-1;;;12885:37:0;;-1:-1:-1;;;;;19938:32:1;;;12885:37:0;;;19920:51:1;12885:3:0;;;;:27;;19893:18:1;;12885:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12874:7;:48;;12866:97;;;;-1:-1:-1;;;12866:97:0;;26471:2:1;12866:97:0;;;26453:21:1;26510:2;26490:18;;;26483:30;26549:34;26529:18;;;26522:62;-1:-1:-1;;;26600:18:1;;;26593:34;26644:19;;12866:97:0;26269:400:1;12866:97:0;12993:3;;:39;;-1:-1:-1;;;12993:39:0;;-1:-1:-1;;;;;19938:32:1;;;12993:39:0;;;19920:51:1;12993:3:0;;;;:29;;19893:18:1;;12993:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12982:7;:50;12978:87;;13036:3;;:26;;-1:-1:-1;;;13036:26:0;;-1:-1:-1;;;;;19938:32:1;;;13036:26:0;;;19920:51:1;13036:3:0;;;;:16;;19893:18:1;;13036:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12978:87;13079:3;;:36;;-1:-1:-1;;;13079:36:0;;-1:-1:-1;;;;;20554:32:1;;;13079:36:0;;;20536:51:1;20603:18;;;20596:34;;;13079:3:0;;;;:17;;20509:18:1;;13079:36:0;20362:274:1;12834:443:0;13167:3;;:23;;-1:-1:-1;;;13167:23:0;;-1:-1:-1;;;;;19938:32:1;;;13167:23:0;;;19920:51:1;13167:3:0;;;;:13;;19893:18:1;;13167:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13156:7;:34;;13148:75;;;;-1:-1:-1;;;13148:75:0;;31081:2:1;13148:75:0;;;31063:21:1;31120:2;31100:18;;;31093:30;31159;31139:18;;;31132:58;31207:18;;13148:75:0;30879:352:1;13148:75:0;13238:3;;:27;;-1:-1:-1;;;13238:27:0;;-1:-1:-1;;;;;20554:32:1;;;13238:27:0;;;20536:51:1;20603:18;;;20596:34;;;13238:3:0;;;;:8;;20509:18:1;;13238:27:0;20362:274:1;13290:96:0;13352:3;;:26;;-1:-1:-1;;;13352:26:0;;-1:-1:-1;;;;;19938:32:1;;;13352:26:0;;;19920:51:1;13352:3:0;;;;:16;;19893:18:1;;13352:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13392:128;13474:3;;:38;;-1:-1:-1;;;13474:38:0;;-1:-1:-1;;;;;20554:32:1;;;13474:38:0;;;20536:51:1;20603:18;;;20596:34;;;13474:3:0;;;;:16;;20509:18:1;;13474:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13392:128;;:::o;28140:427::-;28225:5;:10;;28234:1;28225:10;28216:344;;;28239:14;:22;-1:-1:-1;28140:427:0:o;28216:344::-;28283:5;:10;;28292:1;28283:10;28279:281;;;28297:13;:21;-1:-1:-1;28140:427:0:o;28279:281::-;28340:5;:10;;28349:1;28340:10;28336:224;;;28354:14;:22;-1:-1:-1;28140:427:0:o;28336:224::-;28398:5;:10;;28407:1;28398:10;28394:166;;;28412:14;:22;-1:-1:-1;28140:427:0:o;28394:166::-;28456:5;:10;;28465:1;28456:10;28452:108;;;28470:20;:28;-1:-1:-1;28140:427:0:o;28452:108::-;28534:23;;-1:-1:-1;;;28534:23:0;;24252:2:1;28534:23:0;;;24234:21:1;24291:2;24271:18;;;24264:30;-1:-1:-1;;;24310:18:1;;;24303:43;24363:18;;28534:23:0;24050:337:1;13860:131:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13961:2:0;;:22;;-1:-1:-1;;;13961:22:0;;;;;34765:25:1;;;-1:-1:-1;;;;;;;13961:2:0;;:8;;34738:18:1;;13961:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24595:210::-;24675:5;24783:6;:14;;;24760:6;:20;;;24737:6;:20;;;24719:6;:15;;;24700:6;:16;;;:34;;;;:::i;:::-;:57;;;;:::i;:::-;:80;;;;:::i;:::-;:97;;;;:::i;24811:509::-;24906:5;24933:10;:15;;24947:1;24933:15;24924:389;;;-1:-1:-1;24959:16:0;;24952:23;;24924:389;24997:10;:15;;25011:1;24997:15;24993:320;;;-1:-1:-1;25023:15:0;;;;25016:22;;24993:320;25060:10;:15;;25074:1;25060:15;25056:257;;;-1:-1:-1;25086:20:0;;;;25079:27;;25056:257;25128:10;:15;;25142:1;25128:15;25124:189;;;-1:-1:-1;25154:20:0;;;;25147:27;;25124:189;25196:10;:15;;25210:1;25196:15;25192:121;;;-1:-1:-1;25222:14:0;;;;25215:21;;25192:121;25277:33;;-1:-1:-1;;;25277:33:0;;29214:2:1;25277:33:0;;;29196:21:1;29253:2;29233:18;;;29226:30;29292:25;29272:18;;;29265:53;29335:18;;25277:33:0;29012:347:1;25326:564:0;25438:10;:15;;25452:1;25438:15;25429:454;;;25457:2;;:36;;-1:-1:-1;;;25457:36:0;;;;;35531:25:1;;;35604:4;35592:17;;35572:18;;;35565:45;-1:-1:-1;;;;;25457:2:0;;;;:14;;35504:18:1;;25457:36:0;35361:255:1;25429:454:0;25515:10;:15;;25529:1;25515:15;25511:372;;;25534:2;;:35;;-1:-1:-1;;;25534:35:0;;;;;35531:25:1;;;35604:4;35592:17;;35572:18;;;35565:45;-1:-1:-1;;;;;25534:2:0;;;;:13;;35504:18:1;;25534:35:0;35361:255:1;25511:372:0;25591:10;:15;;25605:1;25591:15;25587:296;;;25610:2;;:40;;-1:-1:-1;;;25610:40:0;;;;;35531:25:1;;;35604:4;35592:17;;35572:18;;;35565:45;-1:-1:-1;;;;;25610:2:0;;;;:18;;35504::1;;25610:40:0;35361:255:1;25587:296:0;25672:10;:15;;25686:1;25672:15;25668:215;;;25691:2;;:40;;-1:-1:-1;;;25691:40:0;;;;;35531:25:1;;;35604:4;35592:17;;35572:18;;;35565:45;-1:-1:-1;;;;;25691:2:0;;;;:18;;35504::1;;25691:40:0;35361:255:1;25668:215:0;25753:10;:15;;25767:1;25753:15;25749:134;;;25772:2;;:34;;-1:-1:-1;;;25772:34:0;;;;;35531:25:1;;;35604:4;35592:17;;35572:18;;;35565:45;-1:-1:-1;;;;;25772:2:0;;;;:12;;35504:18:1;;25772:34:0;35361:255:1;13710:144:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13819:2:0;;:27;;-1:-1:-1;;;13819:27:0;;;;;34765:25:1;;;-1:-1:-1;;;;;;;13819:2:0;;:13;;34738:18:1;;13819:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14334:763::-;14435:5;14462;:10;;14471:1;14462:10;14453:637;;;-1:-1:-1;14483:26:0;;14476:33;;14453:637;14533:5;:10;;14542:1;14533:10;14529:561;;;-1:-1:-1;14554:25:0;;;;14547:32;;14529:561;14604:5;:10;;14613:1;14604:10;14600:490;;;-1:-1:-1;14625:24:0;;;;14618:31;;14600:490;14675:5;:10;;14684:1;14675:10;14671:419;;;-1:-1:-1;14696:24:0;;;;14689:31;;14671:419;14746:5;:10;;14755:1;14746:10;14742:348;;;-1:-1:-1;14767:27:0;;;;14760:34;;14742:348;14817:5;:10;;14826:1;14817:10;14813:277;;;-1:-1:-1;14838:24:0;;;;14831:31;;14813:277;14888:5;:10;;14897:1;14888:10;14884:206;;;-1:-1:-1;14909:28:0;;;;14902:35;;14884:206;14959:5;:10;;14968:1;14959:10;14955:135;;;-1:-1:-1;14980:24:0;;;;14973:31;;14955:135;15044:43;;-1:-1:-1;;;15044:43:0;;26069:2:1;15044:43:0;;;26051:21:1;26108:2;26088:18;;;26081:30;26147:34;26127:18;;;26120:62;-1:-1:-1;;;26198:18:1;;;26191:31;26239:19;;15044:43:0;25867:397:1;15103:869:0;15214:5;:10;;15223:1;15214:10;15205:760;;;15228:2;;:48;;-1:-1:-1;;;15228:48:0;;;;;35531:25:1;;;35604:4;35592:17;;35572:18;;;35565:45;-1:-1:-1;;;;;15228:2:0;;;;:20;;35504:18:1;;15228:48:0;35361:255:1;15205:760:0;15300:5;:10;;15309:1;15300:10;15296:669;;;15314:2;;:47;;-1:-1:-1;;;15314:47:0;;;;;35531:25:1;;;35604:4;35592:17;;35572:18;;;35565:45;-1:-1:-1;;;;;15314:2:0;;;;:19;;35504:18:1;;15314:47:0;35361:255:1;15296:669:0;15386:5;:10;;15395:1;15386:10;15382:583;;;15400:2;;:46;;-1:-1:-1;;;15400:46:0;;;;;35531:25:1;;;35604:4;35592:17;;35572:18;;;35565:45;-1:-1:-1;;;;;15400:2:0;;;;:18;;35504::1;;15400:46:0;35361:255:1;15382:583:0;15472:5;:10;;15481:1;15472:10;15468:497;;;15486:2;;:46;;-1:-1:-1;;;15486:46:0;;;;;35531:25:1;;;35604:4;35592:17;;35572:18;;;35565:45;-1:-1:-1;;;;;15486:2:0;;;;:18;;35504::1;;15486:46:0;35361:255:1;15468:497:0;15558:5;:10;;15567:1;15558:10;15554:411;;;15572:2;;:49;;-1:-1:-1;;;15572:49:0;;;;;35531:25:1;;;35604:4;35592:17;;35572:18;;;35565:45;-1:-1:-1;;;;;15572:2:0;;;;:21;;35504:18:1;;15572:49:0;35361:255:1;15554:411:0;15644:5;:10;;15653:1;15644:10;15640:325;;;15658:2;;:46;;-1:-1:-1;;;15658:46:0;;;;;35531:25:1;;;35604:4;35592:17;;35572:18;;;35565:45;-1:-1:-1;;;;;15658:2:0;;;;:18;;35504::1;;15658:46:0;35361:255:1;15640:325:0;15730:5;:10;;15739:1;15730:10;15726:239;;;15744:2;;:50;;-1:-1:-1;;;15744:50:0;;;;;35531:25:1;;;35604:4;35592:17;;35572:18;;;35565:45;-1:-1:-1;;;;;15744:2:0;;;;:22;;35504:18:1;;15744:50:0;35361:255:1;15726:239:0;15816:5;:10;;15825:1;15816:10;15812:153;;;15830:2;;:46;;-1:-1:-1;;;15830:46:0;;;;;35531:25:1;;;35604:4;35592:17;;35572:18;;;35565:45;-1:-1:-1;;;;;15830:2:0;;;;:18;;35504::1;;15830:46:0;35361:255:1;15812:153:0;15916:46;;-1:-1:-1;;;15916:46:0;;29918:2:1;15916:46:0;;;29900:21:1;29957:2;29937:18;;;29930:30;29996:34;29976:18;;;29969:62;-1:-1:-1;;;30047:18:1;;;30040:34;30091:19;;15916:46:0;29716:400:1;13997:138:0;14090:2;;:27;;-1:-1:-1;;;14090:27:0;;;;;34765:25:1;;;14065:5:0;;-1:-1:-1;;;;;14090:2:0;;:13;;34738:18:1;;14090:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;;;;13997:138;-1:-1:-1;;13997:138:0:o;14141:143::-;14237:2;;:27;;-1:-1:-1;;;14237:27:0;;;;;34765:25:1;;;14211:6:0;;-1:-1:-1;;;;;14237:2:0;;:13;;34738:18:1;;14237:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;;;;14141:143;-1:-1:-1;;14141:143:0:o;14:672:1:-;68:5;121:3;114:4;106:6;102:17;98:27;88:55;;139:1;136;129:12;88:55;175:6;162:20;201:4;225:59;241:42;280:2;241:42;:::i;:::-;225:59;:::i;:::-;306:3;330:2;325:3;318:15;358:2;353:3;349:12;342:19;;393:2;385:6;381:15;445:3;440:2;434;431:1;427:10;419:6;415:23;411:32;408:41;405:61;;;462:1;459;452:12;405:61;484:1;494:163;508:2;505:1;502:9;494:163;;;565:17;;553:30;;603:12;;;;635;;;;526:1;519:9;494:163;;;-1:-1:-1;675:5:1;;14:672;-1:-1:-1;;;;;;;14:672:1:o;691:743::-;743:5;796:3;789:4;781:6;777:17;773:27;763:55;;814:1;811;804:12;763:55;850:6;837:20;876:4;900:59;916:42;955:2;916:42;:::i;900:59::-;981:3;1005:2;1000:3;993:15;1033:2;1028:3;1024:12;1017:19;;1068:2;1060:6;1056:15;1120:3;1115:2;1109;1106:1;1102:10;1094:6;1090:23;1086:32;1083:41;1080:61;;;1137:1;1134;1127:12;1080:61;1159:1;1169:236;1183:2;1180:1;1177:9;1169:236;;;1254:3;1241:17;1271:29;1294:5;1271:29;:::i;:::-;1313:18;;1351:12;;;;1383;;;;1201:1;1194:9;1169:236;;1439:128;1504:20;;1533:28;1504:20;1533:28;:::i;:::-;1439:128;;;:::o;1572:464::-;1615:5;1668:3;1661:4;1653:6;1649:17;1645:27;1635:55;;1686:1;1683;1676:12;1635:55;1722:6;1709:20;1753:49;1769:32;1798:2;1769:32;:::i;1753:49::-;1827:2;1818:7;1811:19;1873:3;1866:4;1861:2;1853:6;1849:15;1845:26;1842:35;1839:55;;;1890:1;1887;1880:12;1839:55;1955:2;1948:4;1940:6;1936:17;1929:4;1920:7;1916:18;1903:55;2003:1;1978:16;;;1996:4;1974:27;1967:38;;;;1982:7;1572:464;-1:-1:-1;;;1572:464:1:o;2041:136::-;2119:13;;2141:30;2119:13;2141:30;:::i;2182:134::-;2259:13;;2281:29;2259:13;2281:29;:::i;2321:247::-;2380:6;2433:2;2421:9;2412:7;2408:23;2404:32;2401:52;;;2449:1;2446;2439:12;2401:52;2488:9;2475:23;2507:31;2532:5;2507:31;:::i;2573:251::-;2643:6;2696:2;2684:9;2675:7;2671:23;2667:32;2664:52;;;2712:1;2709;2702:12;2664:52;2744:9;2738:16;2763:31;2788:5;2763:31;:::i;2829:813::-;2924:6;2932;2940;2948;2956;3009:3;2997:9;2988:7;2984:23;2980:33;2977:53;;;3026:1;3023;3016:12;2977:53;3065:9;3052:23;3084:31;3109:5;3084:31;:::i;:::-;3134:5;-1:-1:-1;3191:2:1;3176:18;;3163:32;3204:33;3163:32;3204:33;:::i;:::-;3256:7;-1:-1:-1;3315:2:1;3300:18;;3287:32;3328:33;3287:32;3328:33;:::i;:::-;3380:7;-1:-1:-1;3439:2:1;3424:18;;3411:32;3452:33;3411:32;3452:33;:::i;:::-;3504:7;-1:-1:-1;3563:3:1;3548:19;;3535:33;3577;3535;3577;:::i;:::-;3629:7;3619:17;;;2829:813;;;;;;;;:::o;3647:315::-;3715:6;3723;3776:2;3764:9;3755:7;3751:23;3747:32;3744:52;;;3792:1;3789;3782:12;3744:52;3831:9;3818:23;3850:31;3875:5;3850:31;:::i;:::-;3900:5;3952:2;3937:18;;;;3924:32;;-1:-1:-1;;;3647:315:1:o;3967:1289::-;4090:6;4098;4106;4159:2;4147:9;4138:7;4134:23;4130:32;4127:52;;;4175:1;4172;4165:12;4127:52;4215:9;4202:23;-1:-1:-1;;;;;4285:2:1;4277:6;4274:14;4271:34;;;4301:1;4298;4291:12;4271:34;4324:61;4377:7;4368:6;4357:9;4353:22;4324:61;:::i;:::-;4314:71;;4404:2;4394:12;;4459:2;4448:9;4444:18;4431:32;4488:2;4478:8;4475:16;4472:36;;;4504:1;4501;4494:12;4472:36;4527:24;;;-1:-1:-1;4582:4:1;4574:13;;4570:27;-1:-1:-1;4560:55:1;;4611:1;4608;4601:12;4560:55;4647:2;4634:16;4670:59;4686:42;4725:2;4686:42;:::i;4670:59::-;4751:3;4775:2;4770:3;4763:15;4803:2;4798:3;4794:12;4787:19;;4834:2;4830;4826:11;4882:7;4877:2;4871;4868:1;4864:10;4860:2;4856:19;4852:28;4849:41;4846:61;;;4903:1;4900;4893:12;4846:61;4925:1;4916:10;;4935:237;4949:2;4946:1;4943:9;4935:237;;;5020:3;5007:17;5037:30;5061:5;5037:30;:::i;:::-;5080:18;;4967:1;4960:9;;;;;5118:12;;;;5150;;4935:237;;;4939:3;5191:5;5181:15;;;;;;;5215:35;5246:2;5235:9;5231:18;5215:35;:::i;:::-;5205:45;;3967:1289;;;;;:::o;5261:591::-;5377:6;5385;5438:2;5426:9;5417:7;5413:23;5409:32;5406:52;;;5454:1;5451;5444:12;5406:52;5494:9;5481:23;-1:-1:-1;;;;;5564:2:1;5556:6;5553:14;5550:34;;;5580:1;5577;5570:12;5550:34;5603:59;5654:7;5645:6;5634:9;5630:22;5603:59;:::i;:::-;5593:69;;5715:2;5704:9;5700:18;5687:32;5671:48;;5744:2;5734:8;5731:16;5728:36;;;5760:1;5757;5750:12;5728:36;;5783:63;5838:7;5827:8;5816:9;5812:24;5783:63;:::i;:::-;5773:73;;;5261:591;;;;;:::o;5857:241::-;5913:6;5966:2;5954:9;5945:7;5941:23;5937:32;5934:52;;;5982:1;5979;5972:12;5934:52;6021:9;6008:23;6040:28;6062:5;6040:28;:::i;6103:245::-;6170:6;6223:2;6211:9;6202:7;6198:23;6194:32;6191:52;;;6239:1;6236;6229:12;6191:52;6271:9;6265:16;6290:28;6312:5;6290:28;:::i;6353:636::-;6433:6;6486:2;6474:9;6465:7;6461:23;6457:32;6454:52;;;6502:1;6499;6492:12;6454:52;6535:9;6529:16;-1:-1:-1;;;;;6560:6:1;6557:30;6554:50;;;6600:1;6597;6590:12;6554:50;6623:22;;6676:4;6668:13;;6664:27;-1:-1:-1;6654:55:1;;6705:1;6702;6695:12;6654:55;6734:2;6728:9;6759:49;6775:32;6804:2;6775:32;:::i;6759:49::-;6831:2;6824:5;6817:17;6871:7;6866:2;6861;6857;6853:11;6849:20;6846:33;6843:53;;;6892:1;6889;6882:12;6843:53;6905:54;6956:2;6951;6944:5;6940:14;6935:2;6931;6927:11;6905:54;:::i;:::-;6978:5;6353:636;-1:-1:-1;;;;;6353:636:1:o;6994:1153::-;7090:6;7143:3;7131:9;7122:7;7118:23;7114:33;7111:53;;;7160:1;7157;7150:12;7111:53;7193:2;7187:9;7235:3;7227:6;7223:16;7305:6;7293:10;7290:22;-1:-1:-1;;;;;7257:10:1;7254:34;7251:62;7248:88;;;7316:18;;:::i;:::-;7352:2;7345:22;7389:16;;7414:29;7389:16;7414:29;:::i;:::-;7452:21;;7518:2;7503:18;;7497:25;7531:31;7497:25;7531:31;:::i;:::-;7590:2;7578:15;;7571:32;7648:2;7633:18;;7627:25;7661:32;7627:25;7661:32;:::i;:::-;7721:2;7709:15;;7702:32;7779:2;7764:18;;7758:25;7792:32;7758:25;7792:32;:::i;:::-;7852:2;7840:15;;7833:32;7899:48;7942:3;7927:19;;7899:48;:::i;:::-;7893:3;7885:6;7881:16;7874:74;7982:49;8026:3;8015:9;8011:19;7982:49;:::i;:::-;7976:3;7968:6;7964:16;7957:75;8066:49;8110:3;8099:9;8095:19;8066:49;:::i;:::-;8060:3;8048:16;;8041:75;8052:6;6994:1153;-1:-1:-1;;;6994:1153:1:o;8152:1105::-;8248:6;8279:3;8323:2;8311:9;8302:7;8298:23;8294:32;8291:52;;;8339:1;8336;8329:12;8291:52;8372:2;8366:9;8402:15;;;;-1:-1:-1;;;;;8432:34:1;;8468:22;;;8429:62;8426:88;;;8494:18;;:::i;:::-;8534:10;8530:2;8523:22;8573:9;8567:16;8554:29;;8592;8615:5;8592:29;:::i;:::-;8645:5;8637:6;8630:21;8684:47;8727:2;8716:9;8712:18;8684:47;:::i;:::-;8679:2;8671:6;8667:15;8660:72;8765:47;8808:2;8797:9;8793:18;8765:47;:::i;:::-;8760:2;8752:6;8748:15;8741:72;8846:47;8889:2;8878:9;8874:18;8846:47;:::i;:::-;8841:2;8833:6;8829:15;8822:72;8928:48;8971:3;8960:9;8956:19;8928:48;:::i;:::-;8922:3;8914:6;8910:16;8903:74;9011:48;9054:3;9043:9;9039:19;9011:48;:::i;:::-;9005:3;8997:6;8993:16;8986:74;9094:48;9137:3;9126:9;9122:19;9094:48;:::i;:::-;9088:3;9080:6;9076:16;9069:74;9177:48;9220:3;9209:9;9205:19;9177:48;:::i;:::-;9171:3;9159:16;;9152:74;9163:6;8152:1105;-1:-1:-1;;;;8152:1105:1:o;9262:1028::-;9354:6;9407:3;9395:9;9386:7;9382:23;9378:33;9375:53;;;9424:1;9421;9414:12;9375:53;9457:2;9451:9;9499:3;9491:6;9487:16;9569:6;9557:10;9554:22;-1:-1:-1;;;;;9521:10:1;9518:34;9515:62;9512:88;;;9580:18;;:::i;:::-;9616:2;9609:22;9653:16;;9678:29;9653:16;9678:29;:::i;:::-;9716:21;;9782:2;9767:18;;9761:25;9795:31;9761:25;9795:31;:::i;:::-;9854:2;9842:15;;9835:32;9912:2;9897:18;;9891:25;9925:31;9891:25;9925:31;:::i;:::-;9984:2;9972:15;;9965:32;10042:2;10027:18;;10021:25;10055:31;10021:25;10055:31;:::i;:::-;10114:2;10102:15;;10095:32;10172:3;10157:19;;10151:26;10186:31;10151:26;10186:31;:::i;:::-;10245:3;10233:16;;10226:33;10237:6;9262:1028;-1:-1:-1;;;9262:1028:1:o;10295:245::-;10353:6;10406:2;10394:9;10385:7;10381:23;10377:32;10374:52;;;10422:1;10419;10412:12;10374:52;10461:9;10448:23;10480:30;10504:5;10480:30;:::i;10545:249::-;10614:6;10667:2;10655:9;10646:7;10642:23;10638:32;10635:52;;;10683:1;10680;10673:12;10635:52;10715:9;10709:16;10734:30;10758:5;10734:30;:::i;10799:455::-;10876:6;10884;10937:2;10925:9;10916:7;10912:23;10908:32;10905:52;;;10953:1;10950;10943:12;10905:52;10992:9;10979:23;11011:30;11035:5;11011:30;:::i;:::-;11060:5;-1:-1:-1;11116:2:1;11101:18;;11088:32;-1:-1:-1;;;;;11132:30:1;;11129:50;;;11175:1;11172;11165:12;11129:50;11198;11240:7;11231:6;11220:9;11216:22;11198:50;:::i;11259:180::-;11318:6;11371:2;11359:9;11350:7;11346:23;11342:32;11339:52;;;11387:1;11384;11377:12;11339:52;-1:-1:-1;11410:23:1;;11259:180;-1:-1:-1;11259:180:1:o;11444:184::-;11514:6;11567:2;11555:9;11546:7;11542:23;11538:32;11535:52;;;11583:1;11580;11573:12;11535:52;-1:-1:-1;11606:16:1;;11444:184;-1:-1:-1;11444:184:1:o;11633:519::-;11716:6;11724;11732;11740;11793:3;11781:9;11772:7;11768:23;11764:33;11761:53;;;11810:1;11807;11800:12;11761:53;11846:9;11833:23;11823:33;;11906:2;11895:9;11891:18;11878:32;11919:31;11944:5;11919:31;:::i;:::-;11969:5;-1:-1:-1;12021:2:1;12006:18;;11993:32;;-1:-1:-1;12077:2:1;12062:18;;12049:32;12090:30;12049:32;12090:30;:::i;:::-;11633:519;;;;-1:-1:-1;11633:519:1;;-1:-1:-1;;11633:519:1:o;12157:793::-;12290:6;12298;12306;12314;12367:3;12355:9;12346:7;12342:23;12338:33;12335:53;;;12384:1;12381;12374:12;12335:53;12420:9;12407:23;12397:33;;12481:2;12470:9;12466:18;12453:32;-1:-1:-1;;;;;12545:2:1;12537:6;12534:14;12531:34;;;12561:1;12558;12551:12;12531:34;12584:61;12637:7;12628:6;12617:9;12613:22;12584:61;:::i;:::-;12574:71;;12698:2;12687:9;12683:18;12670:32;12654:48;;12727:2;12717:8;12714:16;12711:36;;;12743:1;12740;12733:12;12711:36;;12766:63;12821:7;12810:8;12799:9;12795:24;12766:63;:::i;:::-;12756:73;;;12879:2;12868:9;12864:18;12851:32;12892:28;12914:5;12892:28;:::i;12955:545::-;13054:6;13062;13070;13123:2;13111:9;13102:7;13098:23;13094:32;13091:52;;;13139:1;13136;13129:12;13091:52;13175:9;13162:23;13152:33;;13236:2;13225:9;13221:18;13208:32;-1:-1:-1;;;;;13255:6:1;13252:30;13249:50;;;13295:1;13292;13285:12;13249:50;13318:61;13371:7;13362:6;13351:9;13347:22;13318:61;:::i;:::-;13308:71;;;13429:2;13418:9;13414:18;13401:32;13442:28;13464:5;13442:28;:::i;:::-;13489:5;13479:15;;;12955:545;;;;;:::o;13505:655::-;13628:6;13636;13644;13697:2;13685:9;13676:7;13672:23;13668:32;13665:52;;;13713:1;13710;13703:12;13665:52;13749:9;13736:23;13726:33;;13810:2;13799:9;13795:18;13782:32;-1:-1:-1;;;;;13874:2:1;13866:6;13863:14;13860:34;;;13890:1;13887;13880:12;13860:34;13913:59;13964:7;13955:6;13944:9;13940:22;13913:59;:::i;:::-;13903:69;;14025:2;14014:9;14010:18;13997:32;13981:48;;14054:2;14044:8;14041:16;14038:36;;;14070:1;14067;14060:12;14038:36;;14093:61;14146:7;14135:8;14124:9;14120:24;14093:61;:::i;:::-;14083:71;;;13505:655;;;;;:::o;14165:785::-;14294:6;14302;14310;14318;14371:3;14359:9;14350:7;14346:23;14342:33;14339:53;;;14388:1;14385;14378:12;14339:53;14424:9;14411:23;14401:33;;14485:2;14474:9;14470:18;14457:32;-1:-1:-1;;;;;14549:2:1;14541:6;14538:14;14535:34;;;14565:1;14562;14555:12;14535:34;14588:59;14639:7;14630:6;14619:9;14615:22;14588:59;:::i;:::-;14578:69;;14700:2;14689:9;14685:18;14672:32;14656:48;;14729:2;14719:8;14716:16;14713:36;;;14745:1;14742;14735:12;14713:36;;14768:61;14821:7;14810:8;14799:9;14795:24;14768:61;:::i;14955:309::-;15020:6;15028;15081:2;15069:9;15060:7;15056:23;15052:32;15049:52;;;15097:1;15094;15087:12;15049:52;15133:9;15120:23;15110:33;;15193:2;15182:9;15178:18;15165:32;15206:28;15228:5;15206:28;:::i;:::-;15253:5;15243:15;;;14955:309;;;;;:::o;15269:519::-;15353:6;15361;15369;15422:2;15410:9;15401:7;15397:23;15393:32;15390:52;;;15438:1;15435;15428:12;15390:52;15474:9;15461:23;15451:33;;15535:2;15524:9;15520:18;15507:32;-1:-1:-1;;;;;15554:6:1;15551:30;15548:50;;;15594:1;15591;15584:12;15548:50;15617;15659:7;15650:6;15639:9;15635:22;15617:50;:::i;15793:448::-;15866:6;15874;15882;15935:2;15923:9;15914:7;15910:23;15906:32;15903:52;;;15951:1;15948;15941:12;15903:52;15987:9;15974:23;15964:33;;16047:2;16036:9;16032:18;16019:32;16060:30;16084:5;16060:30;:::i;:::-;16109:5;-1:-1:-1;16166:2:1;16151:18;;16138:32;16179:30;16138:32;16179:30;:::i;16246:311::-;16312:6;16320;16373:2;16361:9;16352:7;16348:23;16344:32;16341:52;;;16389:1;16386;16379:12;16341:52;16425:9;16412:23;16402:33;;16485:2;16474:9;16470:18;16457:32;16498:29;16521:5;16498:29;:::i;16562:446::-;16634:6;16642;16650;16703:2;16691:9;16682:7;16678:23;16674:32;16671:52;;;16719:1;16716;16709:12;16671:52;16755:9;16742:23;16732:33;;16815:2;16804:9;16800:18;16787:32;16828:29;16851:5;16828:29;:::i;17013:448::-;17086:6;17094;17102;17155:2;17143:9;17134:7;17130:23;17126:32;17123:52;;;17171:1;17168;17161:12;17123:52;17207:9;17194:23;17184:33;;17267:2;17256:9;17252:18;17239:32;17280:29;17303:5;17280:29;:::i;:::-;17328:5;-1:-1:-1;17385:2:1;17370:18;;17357:32;17398:31;17357:32;17398:31;:::i;17466:584::-;17545:6;17553;17561;17569;17622:3;17610:9;17601:7;17597:23;17593:33;17590:53;;;17639:1;17636;17629:12;17590:53;17675:9;17662:23;17652:33;;17735:2;17724:9;17720:18;17707:32;17748:29;17771:5;17748:29;:::i;:::-;17796:5;-1:-1:-1;17853:2:1;17838:18;;17825:32;17866:31;17825:32;17866:31;:::i;:::-;17916:7;-1:-1:-1;17975:2:1;17960:18;;17947:32;17988:30;17947:32;17988:30;:::i;18055:243::-;18112:6;18165:2;18153:9;18144:7;18140:23;18136:32;18133:52;;;18181:1;18178;18171:12;18133:52;18220:9;18207:23;18239:29;18262:5;18239:29;:::i;18303:247::-;18371:6;18424:2;18412:9;18403:7;18399:23;18395:32;18392:52;;;18440:1;18437;18430:12;18392:52;18472:9;18466:16;18491:29;18514:5;18491:29;:::i;18555:521::-;18628:6;18636;18644;18697:2;18685:9;18676:7;18672:23;18668:32;18665:52;;;18713:1;18710;18703:12;18665:52;18752:9;18739:23;18771:29;18794:5;18771:29;:::i;:::-;18819:5;-1:-1:-1;18876:2:1;18861:18;;18848:32;18889;18848;18889;:::i;:::-;18940:7;-1:-1:-1;18999:2:1;18984:18;;18971:32;19012;18971;19012;:::i;19081:258::-;19123:3;19161:5;19155:12;19188:6;19183:3;19176:19;19204:63;19260:6;19253:4;19248:3;19244:14;19237:4;19230:5;19226:16;19204:63;:::i;:::-;19321:2;19300:15;-1:-1:-1;;19296:29:1;19287:39;;;;19328:4;19283:50;;19081:258;-1:-1:-1;;19081:258:1:o;21712:228::-;21869:2;21858:9;21851:21;21832:4;21889:45;21930:2;21919:9;21915:18;21907:6;21889:45;:::i;22517:346::-;22719:2;22701:21;;;22758:2;22738:18;;;22731:30;-1:-1:-1;;;22792:2:1;22777:18;;22770:52;22854:2;22839:18;;22517:346::o;22868:417::-;23070:2;23052:21;;;23109:2;23089:18;;;23082:30;23148:34;23143:2;23128:18;;23121:62;-1:-1:-1;;;23214:2:1;23199:18;;23192:51;23275:3;23260:19;;22868:417::o;26674:353::-;26876:2;26858:21;;;26915:2;26895:18;;;26888:30;26954:31;26949:2;26934:18;;26927:59;27018:2;27003:18;;26674:353::o;34304:310::-;34499:6;34491;34487:19;34476:9;34469:38;34543:2;34538;34527:9;34523:18;34516:30;34450:4;34563:45;34604:2;34593:9;34589:18;34581:6;34563:45;:::i;34801:291::-;34978:6;34967:9;34960:25;35021:2;35016;35005:9;35001:18;34994:30;34941:4;35041:45;35082:2;35071:9;35067:18;35059:6;35041:45;:::i;36660:275::-;36731:2;36725:9;36796:2;36777:13;;-1:-1:-1;;36773:27:1;36761:40;;-1:-1:-1;;;;;36816:34:1;;36852:22;;;36813:62;36810:88;;;36878:18;;:::i;:::-;36914:2;36907:22;36660:275;;-1:-1:-1;36660:275:1:o;36940:182::-;36999:4;-1:-1:-1;;;;;37024:6:1;37021:30;37018:56;;;37054:18;;:::i;:::-;-1:-1:-1;37099:1:1;37095:14;37111:4;37091:25;;36940:182::o;37127:187::-;37176:4;-1:-1:-1;;;;;37201:6:1;37198:30;37195:56;;;37231:18;;:::i;:::-;-1:-1:-1;37297:2:1;37276:15;-1:-1:-1;;37272:29:1;37303:4;37268:40;;37127:187::o;37319:224::-;37358:3;37386:6;37419:2;37416:1;37412:10;37449:2;37446:1;37442:10;37480:3;37476:2;37472:12;37467:3;37464:21;37461:47;;;37488:18;;:::i;:::-;37524:13;;37319:224;-1:-1:-1;;;;37319:224:1:o;37548:128::-;37588:3;37619:1;37615:6;37612:1;37609:13;37606:39;;;37625:18;;:::i;:::-;-1:-1:-1;37661:9:1;;37548:128::o;37681:204::-;37719:3;37755:4;37752:1;37748:12;37787:4;37784:1;37780:12;37822:3;37816:4;37812:14;37807:3;37804:23;37801:49;;;37830:18;;:::i;:::-;37866:13;;37681:204;-1:-1:-1;;;37681:204:1:o;37890:125::-;37930:4;37958:1;37955;37952:8;37949:34;;;37963:18;;:::i;:::-;-1:-1:-1;38000:9:1;;37890:125::o;38020:195::-;38058:4;38095;38092:1;38088:12;38127:4;38124:1;38120:12;38152:3;38147;38144:12;38141:38;;;38159:18;;:::i;:::-;38196:13;;;38020:195;-1:-1:-1;;;38020:195:1:o;38220:258::-;38292:1;38302:113;38316:6;38313:1;38310:13;38302:113;;;38392:11;;;38386:18;38373:11;;;38366:39;38338:2;38331:10;38302:113;;;38433:6;38430:1;38427:13;38424:48;;;-1:-1:-1;;38468:1:1;38450:16;;38443:27;38220:258::o;38483:197::-;38521:3;38549:6;38590:2;38583:5;38579:14;38617:2;38608:7;38605:15;38602:41;;;38623:18;;:::i;:::-;38672:1;38659:15;;38483:197;-1:-1:-1;;;38483:197:1:o;38685:135::-;38724:3;-1:-1:-1;;38745:17:1;;38742:43;;;38765:18;;:::i;:::-;-1:-1:-1;38812:1:1;38801:13;;38685:135::o;38825:175::-;38862:3;38906:4;38899:5;38895:16;38935:4;38926:7;38923:17;38920:43;;;38943:18;;:::i;:::-;38992:1;38979:15;;38825:175;-1:-1:-1;;38825:175:1:o;39005:209::-;39037:1;39063;39053:132;;39107:10;39102:3;39098:20;39095:1;39088:31;39142:4;39139:1;39132:15;39170:4;39167:1;39160:15;39053:132;-1:-1:-1;39199:9:1;;39005:209::o;39219:127::-;39280:10;39275:3;39271:20;39268:1;39261:31;39311:4;39308:1;39301:15;39335:4;39332:1;39325:15;39351:127;39412:10;39407:3;39403:20;39400:1;39393:31;39443:4;39440:1;39433:15;39467:4;39464:1;39457:15;39483:127;39544:10;39539:3;39535:20;39532:1;39525:31;39575:4;39572:1;39565:15;39599:4;39596:1;39589:15;39615:131;-1:-1:-1;;;;;39690:31:1;;39680:42;;39670:70;;39736:1;39733;39726:12;39670:70;39615:131;:::o;39751:118::-;39837:5;39830:13;39823:21;39816:5;39813:32;39803:60;;39859:1;39856;39849:12;39874:117;39959:6;39952:5;39948:18;39941:5;39938:29;39928:57;;39981:1;39978;39971:12;39996:114;40080:4;40073:5;40069:16;40062:5;40059:27;40049:55;;40100:1;40097;40090:12

Swarm Source

ipfs://7afa9d86f4e6f8369ca581818d1051491e9c64e545276f3f4d33044bd017347f

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ 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.