{
  "_format": "hh-sol-artifact-1",
  "contractName": "ERC721WarperController",
  "sourceName": "contracts/warper/ERC721/v1-controller/ERC721WarperController.sol",
  "abi": [
    {
      "inputs": [],
      "name": "AlreadyRented",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "provided",
          "type": "bytes4"
        },
        {
          "internalType": "bytes4",
          "name": "required",
          "type": "bytes4"
        }
      ],
      "name": "AssetClassMismatch",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "expected",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "actual",
          "type": "address"
        }
      ],
      "name": "AssetCollectionMismatch",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "AssetIsNotRentable",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "left",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "right",
          "type": "uint256"
        }
      ],
      "name": "AssetOrderMismatch",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "FunctionMustBeCalledThroughDelegatecall",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "asset",
          "type": "address"
        }
      ],
      "name": "IncompatibleAsset",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "IncompatibleWarperInterface",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "warper",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "asset",
          "type": "address"
        }
      ],
      "name": "InvalidAssetForWarper",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "InvalidERC721Value",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "RentingHookError",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "currentTime",
          "type": "uint256"
        },
        {
          "internalType": "uint32",
          "name": "availabilityPeriodStart",
          "type": "uint32"
        },
        {
          "internalType": "uint32",
          "name": "availabilityPeriodEnd",
          "type": "uint32"
        }
      ],
      "name": "WarperIsNotAvailableForRenting",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "requestedRentalPeriod",
          "type": "uint32"
        },
        {
          "internalType": "uint32",
          "name": "minRentalPeriod",
          "type": "uint32"
        },
        {
          "internalType": "uint32",
          "name": "maxRentalPeriod",
          "type": "uint32"
        }
      ],
      "name": "WarperRentalPeriodIsOutOfRange",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "components": [
            {
              "components": [
                {
                  "internalType": "bytes4",
                  "name": "class",
                  "type": "bytes4"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "internalType": "struct Assets.AssetId",
              "name": "id",
              "type": "tuple"
            },
            {
              "internalType": "uint256",
              "name": "value",
              "type": "uint256"
            }
          ],
          "indexed": false,
          "internalType": "struct Assets.Asset",
          "name": "asset",
          "type": "tuple"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "AssetTransfer",
      "type": "event"
    },
    {
      "stateMutability": "nonpayable",
      "type": "fallback"
    },
    {
      "inputs": [],
      "name": "assetClass",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "components": [
                {
                  "internalType": "bytes4",
                  "name": "class",
                  "type": "bytes4"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "internalType": "struct Assets.AssetId",
              "name": "id",
              "type": "tuple"
            },
            {
              "internalType": "uint256",
              "name": "value",
              "type": "uint256"
            }
          ],
          "internalType": "struct Assets.Asset[]",
          "name": "assets",
          "type": "tuple[]"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "listingId",
              "type": "uint256"
            },
            {
              "internalType": "address",
              "name": "warper",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "renter",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "rentalPeriod",
              "type": "uint32"
            },
            {
              "internalType": "address",
              "name": "paymentToken",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "listingTermsId",
              "type": "uint256"
            },
            {
              "components": [
                {
                  "internalType": "bytes4",
                  "name": "strategyId",
                  "type": "bytes4"
                },
                {
                  "internalType": "bytes",
                  "name": "strategyData",
                  "type": "bytes"
                }
              ],
              "internalType": "struct IListingTermsRegistry.ListingTerms",
              "name": "selectedConfiguratorListingTerms",
              "type": "tuple"
            }
          ],
          "internalType": "struct Rentings.Params",
          "name": "rentingParams",
          "type": "tuple"
        },
        {
          "internalType": "uint256",
          "name": "universeFee",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "listerFee",
          "type": "uint256"
        }
      ],
      "name": "calculatePremiums",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "universePremiumTotal",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "listerPremiumTotal",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "warper",
          "type": "address"
        }
      ],
      "name": "checkCompatibleWarper",
      "outputs": [],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "bytes4",
              "name": "class",
              "type": "bytes4"
            },
            {
              "internalType": "bytes",
              "name": "data",
              "type": "bytes"
            }
          ],
          "internalType": "struct Assets.AssetId",
          "name": "assetId",
          "type": "tuple"
        }
      ],
      "name": "collectionId",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "bytes4",
              "name": "class",
              "type": "bytes4"
            },
            {
              "internalType": "bytes",
              "name": "data",
              "type": "bytes"
            }
          ],
          "internalType": "struct Assets.AssetId[]",
          "name": "assetIds",
          "type": "tuple[]"
        }
      ],
      "name": "ensureSorted",
      "outputs": [],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "rentalId",
          "type": "uint256"
        },
        {
          "components": [
            {
              "components": [
                {
                  "components": [
                    {
                      "internalType": "bytes4",
                      "name": "class",
                      "type": "bytes4"
                    },
                    {
                      "internalType": "bytes",
                      "name": "data",
                      "type": "bytes"
                    }
                  ],
                  "internalType": "struct Assets.AssetId",
                  "name": "id",
                  "type": "tuple"
                },
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct Assets.Asset[]",
              "name": "warpedAssets",
              "type": "tuple[]"
            },
            {
              "internalType": "uint256",
              "name": "universeId",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "collectionId",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "listingId",
              "type": "uint256"
            },
            {
              "internalType": "address",
              "name": "renter",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "startTime",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "endTime",
              "type": "uint32"
            },
            {
              "components": [
                {
                  "components": [
                    {
                      "internalType": "bytes4",
                      "name": "strategyId",
                      "type": "bytes4"
                    },
                    {
                      "internalType": "bytes",
                      "name": "strategyData",
                      "type": "bytes"
                    }
                  ],
                  "internalType": "struct IListingTermsRegistry.ListingTerms",
                  "name": "listingTerms",
                  "type": "tuple"
                },
                {
                  "components": [
                    {
                      "internalType": "bytes4",
                      "name": "strategyId",
                      "type": "bytes4"
                    },
                    {
                      "internalType": "bytes",
                      "name": "strategyData",
                      "type": "bytes"
                    }
                  ],
                  "internalType": "struct ITaxTermsRegistry.TaxTerms",
                  "name": "universeTaxTerms",
                  "type": "tuple"
                },
                {
                  "components": [
                    {
                      "internalType": "bytes4",
                      "name": "strategyId",
                      "type": "bytes4"
                    },
                    {
                      "internalType": "bytes",
                      "name": "strategyData",
                      "type": "bytes"
                    }
                  ],
                  "internalType": "struct ITaxTermsRegistry.TaxTerms",
                  "name": "protocolTaxTerms",
                  "type": "tuple"
                },
                {
                  "components": [
                    {
                      "internalType": "address",
                      "name": "paymentToken",
                      "type": "address"
                    },
                    {
                      "internalType": "uint256",
                      "name": "paymentTokenQuote",
                      "type": "uint256"
                    }
                  ],
                  "internalType": "struct ITokenQuote.PaymentTokenData",
                  "name": "paymentTokenData",
                  "type": "tuple"
                }
              ],
              "internalType": "struct Rentings.AgreementTerms",
              "name": "agreementTerms",
              "type": "tuple"
            }
          ],
          "internalType": "struct Rentings.Agreement",
          "name": "rentalAgreement",
          "type": "tuple"
        },
        {
          "components": [
            {
              "components": [
                {
                  "internalType": "enum IPaymentManager.EarningType",
                  "name": "earningType",
                  "type": "uint8"
                },
                {
                  "internalType": "bool",
                  "name": "isLister",
                  "type": "bool"
                },
                {
                  "internalType": "address",
                  "name": "account",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                }
              ],
              "internalType": "struct Accounts.UserEarning[]",
              "name": "userEarnings",
              "type": "tuple[]"
            },
            {
              "components": [
                {
                  "internalType": "enum IPaymentManager.EarningType",
                  "name": "earningType",
                  "type": "uint8"
                },
                {
                  "internalType": "uint256",
                  "name": "universeId",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                }
              ],
              "internalType": "struct Accounts.UniverseEarning",
              "name": "universeEarning",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "enum IPaymentManager.EarningType",
                  "name": "earningType",
                  "type": "uint8"
                },
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                }
              ],
              "internalType": "struct Accounts.ProtocolEarning",
              "name": "protocolEarning",
              "type": "tuple"
            }
          ],
          "internalType": "struct Accounts.RentalEarnings",
          "name": "rentalEarnings",
          "type": "tuple"
        }
      ],
      "name": "executeRentingHooks",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "warper",
          "type": "address"
        }
      ],
      "name": "isCompatibleWarper",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "metahub",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "warper",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "renter",
          "type": "address"
        }
      ],
      "name": "rentalBalance",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "metahub",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "warper",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "rentalStatus",
      "outputs": [
        {
          "internalType": "enum Rentings.RentalStatus",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "components": [
                {
                  "internalType": "bytes4",
                  "name": "class",
                  "type": "bytes4"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "internalType": "struct Assets.AssetId",
              "name": "id",
              "type": "tuple"
            },
            {
              "internalType": "uint256",
              "name": "value",
              "type": "uint256"
            }
          ],
          "internalType": "struct Assets.Asset",
          "name": "asset",
          "type": "tuple"
        },
        {
          "internalType": "address",
          "name": "vault",
          "type": "address"
        }
      ],
      "name": "returnAssetFromVault",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "components": [
                {
                  "internalType": "bytes4",
                  "name": "class",
                  "type": "bytes4"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "internalType": "struct Assets.AssetId",
              "name": "id",
              "type": "tuple"
            },
            {
              "internalType": "uint256",
              "name": "value",
              "type": "uint256"
            }
          ],
          "internalType": "struct Assets.Asset",
          "name": "asset",
          "type": "tuple"
        },
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "transfer",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "components": [
                {
                  "internalType": "bytes4",
                  "name": "class",
                  "type": "bytes4"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "internalType": "struct Assets.AssetId",
              "name": "id",
              "type": "tuple"
            },
            {
              "internalType": "uint256",
              "name": "value",
              "type": "uint256"
            }
          ],
          "internalType": "struct Assets.Asset",
          "name": "asset",
          "type": "tuple"
        },
        {
          "internalType": "address",
          "name": "assetOwner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "vault",
          "type": "address"
        }
      ],
      "name": "transferAssetToVault",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "bytes4",
              "name": "assetClass",
              "type": "bytes4"
            },
            {
              "internalType": "address",
              "name": "original",
              "type": "address"
            },
            {
              "internalType": "bool",
              "name": "paused",
              "type": "bool"
            },
            {
              "internalType": "contract IWarperController",
              "name": "controller",
              "type": "address"
            },
            {
              "internalType": "string",
              "name": "name",
              "type": "string"
            },
            {
              "internalType": "uint256",
              "name": "universeId",
              "type": "uint256"
            }
          ],
          "internalType": "struct Warpers.Warper",
          "name": "warper",
          "type": "tuple"
        },
        {
          "components": [
            {
              "components": [
                {
                  "internalType": "bytes4",
                  "name": "class",
                  "type": "bytes4"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "internalType": "struct Assets.AssetId",
              "name": "id",
              "type": "tuple"
            },
            {
              "internalType": "uint256",
              "name": "value",
              "type": "uint256"
            }
          ],
          "internalType": "struct Assets.Asset[]",
          "name": "assets",
          "type": "tuple[]"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "listingId",
              "type": "uint256"
            },
            {
              "internalType": "address",
              "name": "warper",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "renter",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "rentalPeriod",
              "type": "uint32"
            },
            {
              "internalType": "address",
              "name": "paymentToken",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "listingTermsId",
              "type": "uint256"
            },
            {
              "components": [
                {
                  "internalType": "bytes4",
                  "name": "strategyId",
                  "type": "bytes4"
                },
                {
                  "internalType": "bytes",
                  "name": "strategyData",
                  "type": "bytes"
                }
              ],
              "internalType": "struct IListingTermsRegistry.ListingTerms",
              "name": "selectedConfiguratorListingTerms",
              "type": "tuple"
            }
          ],
          "internalType": "struct Rentings.Params",
          "name": "rentingParams",
          "type": "tuple"
        }
      ],
      "name": "validateRentingParams",
      "outputs": [],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "components": [
                {
                  "internalType": "bytes4",
                  "name": "class",
                  "type": "bytes4"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "internalType": "struct Assets.AssetId",
              "name": "id",
              "type": "tuple"
            },
            {
              "internalType": "uint256",
              "name": "value",
              "type": "uint256"
            }
          ],
          "internalType": "struct Assets.Asset[]",
          "name": "assets",
          "type": "tuple[]"
        },
        {
          "internalType": "address",
          "name": "warper",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        }
      ],
      "name": "warp",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "warpedCollectionId",
          "type": "bytes32"
        },
        {
          "components": [
            {
              "components": [
                {
                  "internalType": "bytes4",
                  "name": "class",
                  "type": "bytes4"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "internalType": "struct Assets.AssetId",
              "name": "id",
              "type": "tuple"
            },
            {
              "internalType": "uint256",
              "name": "value",
              "type": "uint256"
            }
          ],
          "internalType": "struct Assets.Asset[]",
          "name": "warpedAssets",
          "type": "tuple[]"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x60a06040523060805234801561001457600080fd5b50608051612ae961004c6000396000818161046e0152818161054b015281816108840152818161125201526113f40152612ae96000f3fe608060405234801561001057600080fd5b50600436106100ec5760003560e01c806395dc4d8311610091578063bfe0af9911610063578063bfe0af991461021b578063e4a1731d1461022e578063e4f75ad314610241578063f55383ae1461025457005b806395dc4d83146101ac578063abe590e5146101d4578063b42ca9e3146101e7578063b7cc2e7b146101fa57005b806369bdbd0e116100ca57806369bdbd0e146101495780637752c0fd1461015c57806386c9de051461017d57806389897ace1461019957005b806301ffc9a7146100ee5780633f09518c1461011657806360a50f2114610136575b005b6101016100fc3660046117d6565b610267565b60405190151581526020015b60405180910390f35b610129610124366004611818565b610292565b60405161010d919061186f565b6100ec610144366004611889565b610333565b6100ec6101573660046118fd565b610464565b61016f61016a366004611c3f565b61053d565b60405161010d929190611da0565b600080516020612a9483398151915260405161010d9190611db9565b6100ec6101a7366004611dce565b61087a565b6101bf6101ba366004611e72565b6108d5565b6040805192835260208301919091520161010d565b6100ec6101e2366004611ef3565b610ac9565b6101016101f5366004611ffe565b61104f565b61020d61020836600461201b565b6110c6565b60405190815260200161010d565b61020d61022936600461204f565b611132565b6100ec61023c36600461233e565b611248565b6100ec61024f366004612444565b6113ea565b6100ec610262366004611ffe565b611453565b60006001600160e01b031982166380e9fe1560e01b148061028c575061028c8261147c565b92915050565b600061032b846001600160a01b031663e3dedd6b7f9b4d0cb4e76b932bf6c979cd152d23fb4da2bb167c72cceed92f670a5328c4c36040518263ffffffff1660e01b81526004016102e39190611db9565b602060405180830381865afa158015610300573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610324919061247b565b84846114b1565b949350505050565b6002811015610340575050565b60008060008061037c8686600081811061035c5761035c612498565b905060200281019061036e91906124ae565b610377906124ce565b611529565b909250905060015b8581101561045b576103a187878381811061035c5761035c612498565b90955093506001600160a01b0380861690841611156103eb57604051631ff4af7560e01b81526001600160a01b038085166004830152861660248201526044015b60405180910390fd5b846001600160a01b0316836001600160a01b031614801561040c5750838210155b1561044357604051636b51722b60e01b81526001600160a01b038616600482015260248101839052604481018590526064016103e2565b84925083915080610453816124f0565b915050610384565b50505050505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036104ad57604051637170f3db60e01b815260040160405180910390fd5b6104be6104b983612509565b61154d565b6000806104ce61036e85806124ae565b60405163be2b9a7960e01b81526001600160a01b038084166004830152602482018390529294509092509084169063be2b9a7990604401600060405180830381600087803b15801561051f57600080fd5b505af1158015610533573d6000803e3d6000fd5b5050505050505050565b600060606001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361058a57604051637170f3db60e01b815260040160405180910390fd5b610593846115ab565b915084516001600160401b038111156105ae576105ae611953565b60405190808252806020026020018201604052801561060157816020015b604080516080810182526000918101828152606080830152815260208101919091528152602001906001900390816105cc5790505b50905060005b85518110156108715761063286828151811061062557610625612498565b602002602001015161154d565b60008061065b88848151811061064a5761064a612498565b602002602001015160000151611529565b91509150866001600160a01b031663f46c73c66040518163ffffffff1660e01b8152600401602060405180830381865afa15801561069d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c1919061247b565b6001600160a01b0316826001600160a01b031614610705576040516307a3e91560e41b81526001600160a01b038089166004830152831660248201526044016103e2565b604051806040016040528061071a89846115df565b815260200189858151811061073157610731612498565b60200260200101516020015181525084848151811061075257610752612498565b6020908102919091010152600061076a3089846114b1565b600281111561077b5761077b611859565b036107f457604080516000815260208101918290526394d008ef60e01b9091526001600160a01b038816906394d008ef906107bd908990859060248101612515565b600060405180830381600087803b1580156107d757600080fd5b505af11580156107eb573d6000803e3d6000fd5b5050505061085c565b61085c84848151811061080957610809612498565b6020026020010151308860006001600160401b0381111561082c5761082c611953565b6040519080825280601f01601f191660200182016040528015610856576020820181803683370190505b5061165c565b50508080610869906124f0565b915050610607565b50935093915050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036108c357604051637170f3db60e01b815260040160405180910390fd5b6108cf8484848461165c565b50505050565b60008060005b8651811015610abf576108f987828151811061062557610625612498565b6109096040870160208801611ffe565b6001600160a01b03166301ffc9a7633573c0bd60e21b6040518263ffffffff1660e01b815260040161093b9190611db9565b602060405180830381865afa158015610958573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097c9190612545565b15610aad57600061099888838151811061064a5761064a612498565b915060009050806109af60408a0160208b01611ffe565b6001600160a01b031663d5cf02f46109cd60608c0160408d01611ffe565b858d88815181106109e0576109e0612498565b6020026020010151602001518d60600160208101906109ff9190612562565b6040516001600160e01b031960e087901b1681526001600160a01b0390941660048501526024840192909252604483015263ffffffff166064820152608481018b905260a481018a905260c4016040805180830381865afa158015610a68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8c919061257f565b9092509050610a9b82876125a3565b9550610aa781866125a3565b94505050505b80610ab7816124f0565b9150506108db565b5094509492505050565b60005b82518110156108cf57610b01838281518110610aea57610aea612498565b60200260200101518561173390919063ffffffff16565b610b1683828151811061062557610625612498565b6000610b286040840160208501611ffe565b90506000610b4185848151811061064a5761064a612498565b915060029050610bb3836001600160a01b0316635a70a2836040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bac919061247b565b8484610292565b6002811115610bc457610bc4611859565b03610be257604051633c42e29760e11b815260040160405180910390fd5b60408051600380825260808201909252600091602082016060803683370190505090506370c8db7160e01b81600081518110610c2057610c20612498565b60200260200101906001600160e01b03191690816001600160e01b0319168152505063331f761f60e01b81600181518110610c5d57610c5d612498565b60200260200101906001600160e01b03191690816001600160e01b0319168152505063ca7cee2f60e01b81600281518110610c9a57610c9a612498565b6001600160e01b0319909216602092830291909101909101526040516307e78cc160e21b81526000906001600160a01b03851690631f9e330490610ce29085906004016125bb565b600060405180830381865afa158015610cff573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d279190810190612609565b905080600081518110610d3c57610d3c612498565b602002602001015115610e2057600080856001600160a01b031663d1958f2c6040518163ffffffff1660e01b81526004016040805180830381865afa158015610d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dad91906126a2565b915091508163ffffffff16421080610de9575063ffffffff8116610dd760808a0160608b01612562565b610de79063ffffffff16426125a3565b115b15610e1d5760405163a01a0f1b60e01b815242600482015263ffffffff8084166024830152821660448201526064016103e2565b50505b80600181518110610e3357610e33612498565b602002602001015115610f3557600080856001600160a01b031662eb6ac76040518163ffffffff1660e01b81526004016040805180830381865afa158015610e7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea391906126a2565b909250905063ffffffff8216610ebf60808a0160608b01612562565b63ffffffff161080610eeb575063ffffffff8116610ee360808a0160608b01612562565b63ffffffff16115b15610f3257610f006080890160608a01612562565b60405163420ba8b160e11b815263ffffffff9182166004820152818416602482015290821660448201526064016103e2565b50505b80600281518110610f4857610f48612498565b602002602001015115611038576000806001600160a01b03861663ca7cee2f610f7760608b0160408c01611ffe565b878c8b81518110610f8a57610f8a612498565b60209081029190910181015101516040516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091526044820152606401600060405180830381865afa158015610fe9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261101191908101906126d1565b9150915081611035578060405163b0df8c7b60e01b81526004016103e2919061275d565b50505b505050508080611047906124f0565b915050610acc565b6040516301ffc9a760e01b81526000906001600160a01b038316906301ffc9a790611085906394d008ef60e01b90600401611db9565b602060405180830381865afa1580156110a2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061028c9190612545565b80516000906001600160e01b0319166339d690a360e11b14611121578151600080516020612a948339815191525b604051632e82eea160e11b81526001600160e01b03199283166004820152911660248201526044016103e2565b61028c61112d83611781565b6115ab565b60405163e3dedd6b60e01b81526000906001600160a01b0385169063e3dedd6b90611181907f9b4d0cb4e76b932bf6c979cd152d23fb4da2bb167c72cceed92f670a5328c4c390600401611db9565b602060405180830381865afa15801561119e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c2919061247b565b6001600160a01b0316631e3478786111d9856115ab565b6040516001600160e01b031960e084901b16815260048101919091526001600160a01b0385166024820152604401602060405180830381865afa158015611224573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061032b9190612770565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361129157604051637170f3db60e01b815260040160405180910390fd5b6112ab826000015160008151811061062557610625612498565b60006112c7836000015160008151811061064a5761064a612498565b506040516301ffc9a760e01b81529091506001600160a01b038216906301ffc9a7906112fe906332cc51a360e21b90600401611db9565b602060405180830381865afa15801561131b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133f9190612545565b156108cf57600080826001600160a01b031663cb31468c8787876040518463ffffffff1660e01b81526004016113779392919061291e565b6000604051808303816000875af1158015611396573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113be91908101906126d1565b91509150816113e2578060405163b65087ad60e01b81526004016103e2919061275d565b505050505050565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361143357604051637170f3db60e01b815260040160405180910390fd5b61144e8383836040518060200160405280600081525061165c565b505050565b61145c8161104f565b611479576040516347ac7e5360e11b815260040160405180910390fd5b50565b60006001600160e01b03198216631558d89360e21b148061028c57506301ffc9a760e01b6001600160e01b031983161461028c565b6000836001600160a01b03166333a932036114cc85856115df565b6040518263ffffffff1660e01b81526004016114e891906129d9565b602060405180830381865afa158015611505573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061032b91906129ec565b60008082602001518060200190518101906115449190612a0d565b91509150915091565b8051516001600160e01b0319166339d690a360e11b1461157e57805151600080516020612a948339815191526110f4565b80602001516001146114795780602001516040516383f261dd60e01b81526004016103e291815260200190565b604080516001600160a01b038316602082015260009101604051602081830303815290604052805190602001209050919050565b6040805180820190915260008152606060208201526040518060400160405280611614600080516020612a9483398151915290565b6001600160e01b0319168152604080516001600160a01b03871660208281019190915291810186905291019060600160408051601f1981840301815291905290529392505050565b6116658461154d565b6000806116758660000151611529565b604051635c46a7ef60e11b815291935091506001600160a01b0383169063b88d4fde906116ac908890889086908990600401612a3b565b600060405180830381600087803b1580156116c657600080fd5b505af11580156116da573d6000803e3d6000fd5b50505050836001600160a01b0316856001600160a01b03167ff65cd7509f02971efd9615ae50140cecf872cd4a266e3f6cac29f9b091fb32c78886604051611723929190612a6e565b60405180910390a3505050505050565b600061173e8261179b565b9050806001600160a01b031683602001516001600160a01b03161461144e576040516323b390eb60e21b81526001600160a01b03821660048201526024016103e2565b6000816020015180602001905181019061028c919061247b565b600081600001516020015180602001905181019061028c919061247b565b80356001600160e01b0319811681146117d157600080fd5b919050565b6000602082840312156117e857600080fd5b6117f1826117b9565b9392505050565b6001600160a01b038116811461147957600080fd5b80356117d1816117f8565b60008060006060848603121561182d57600080fd5b8335611838816117f8565b92506020840135611848816117f8565b929592945050506040919091013590565b634e487b7160e01b600052602160045260246000fd5b602081016003831061188357611883611859565b91905290565b6000806020838503121561189c57600080fd5b82356001600160401b03808211156118b357600080fd5b818501915085601f8301126118c757600080fd5b8135818111156118d657600080fd5b8660208260051b85010111156118eb57600080fd5b60209290920196919550909350505050565b6000806040838503121561191057600080fd5b82356001600160401b0381111561192657600080fd5b83016040818603121561193857600080fd5b91506020830135611948816117f8565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171561198b5761198b611953565b60405290565b60405160c081016001600160401b038111828210171561198b5761198b611953565b604051608081016001600160401b038111828210171561198b5761198b611953565b604051606081016001600160401b038111828210171561198b5761198b611953565b60405160a081016001600160401b038111828210171561198b5761198b611953565b60405161010081016001600160401b038111828210171561198b5761198b611953565b604051601f8201601f191681016001600160401b0381118282101715611a6457611a64611953565b604052919050565b60006001600160401b03821115611a8557611a85611953565b5060051b60200190565b60006001600160401b03821115611aa857611aa8611953565b50601f01601f191660200190565b600082601f830112611ac757600080fd5b8135611ada611ad582611a8f565b611a3c565b818152846020838601011115611aef57600080fd5b816020850160208301376000918101602001919091529392505050565b600060408284031215611b1e57600080fd5b611b26611969565b9050611b31826117b9565b815260208201356001600160401b03811115611b4c57600080fd5b611b5884828501611ab6565b60208301525092915050565b600060408284031215611b7657600080fd5b611b7e611969565b905081356001600160401b03811115611b9657600080fd5b611ba284828501611b0c565b8252506020820135602082015292915050565b600082601f830112611bc657600080fd5b81356020611bd6611ad583611a6c565b82815260059290921b84018101918181019086841115611bf557600080fd5b8286015b84811015611c345780356001600160401b03811115611c185760008081fd5b611c268986838b0101611b64565b845250918301918301611bf9565b509695505050505050565b600080600060608486031215611c5457600080fd5b83356001600160401b03811115611c6a57600080fd5b611c7686828701611bb5565b9350506020840135611c87816117f8565b91506040840135611c97816117f8565b809150509250925092565b60005b83811015611cbd578181015183820152602001611ca5565b838111156108cf5750506000910152565b60008151808452611ce6816020860160208601611ca2565b601f01601f19169290920160200192915050565b63ffffffff60e01b8151168252600060208201516040602085015261032b6040850182611cce565b6000815160408452611d376040850182611cfa565b602093840151949093019390935250919050565b600081518084526020808501808196508360051b8101915082860160005b85811015611d93578284038952611d81848351611d22565b98850198935090840190600101611d69565b5091979650505050505050565b82815260406020820152600061032b6040830184611d4b565b6001600160e01b031991909116815260200190565b60008060008060808587031215611de457600080fd5b84356001600160401b0380821115611dfb57600080fd5b611e0788838901611b64565b955060208701359150611e19826117f8565b909350604086013590611e2b826117f8565b90925060608601359080821115611e4157600080fd5b50611e4e87828801611ab6565b91505092959194509250565b600060e08284031215611e6c57600080fd5b50919050565b60008060008060808587031215611e8857600080fd5b84356001600160401b0380821115611e9f57600080fd5b611eab88838901611bb5565b95506020870135915080821115611ec157600080fd5b50611ece87828801611e5a565b949794965050505060408301359260600135919050565b801515811461147957600080fd5b600080600060608486031215611f0857600080fd5b83356001600160401b0380821115611f1f57600080fd5b9085019060c08288031215611f3357600080fd5b611f3b611991565b611f44836117b9565b81526020830135611f54816117f8565b60208201526040830135611f6781611ee5565b60408201526060830135611f7a816117f8565b6060820152608083013582811115611f9157600080fd5b611f9d89828601611ab6565b60808301525060a083013560a0820152809550506020860135915080821115611fc557600080fd5b611fd187838801611bb5565b93506040860135915080821115611fe757600080fd5b50611ff486828701611e5a565b9150509250925092565b60006020828403121561201057600080fd5b81356117f1816117f8565b60006020828403121561202d57600080fd5b81356001600160401b0381111561204357600080fd5b61032b84828501611b0c565b60008060006060848603121561206457600080fd5b833561206f816117f8565b92506020840135611c87816117f8565b63ffffffff8116811461147957600080fd5b80356117d18161207f565b600081830360a08112156120af57600080fd5b6120b76119b3565b915082356001600160401b03808211156120d057600080fd5b6120dc86838701611b0c565b845260208501359150808211156120f257600080fd5b6120fe86838701611b0c565b6020850152604085013591508082111561211757600080fd5b5061212485828601611b0c565b6040840152506040605f198201121561213c57600080fd5b50612145611969565b6060830135612153816117f8565b80825250608083013560208201528060608301525092915050565b8035600781106117d157600080fd5b60006080828403121561218f57600080fd5b6121976119b3565b90506121a28261216e565b8152602082013560208201526040820135604082015260608201356121c6816117f8565b606082015292915050565b6000606082840312156121e357600080fd5b6121eb6119d5565b90506121f68261216e565b8152602082013560208201526040820135612210816117f8565b604082015292915050565b6000610100828403121561222e57600080fd5b6122366119d5565b905081356001600160401b0381111561224e57600080fd5b8201601f8101841361225f57600080fd5b8035602061226f611ad583611a6c565b82815260a0928302840182019282820191908885111561228e57600080fd5b948301945b8486101561230e5780868a0312156122ab5760008081fd5b6122b36119f7565b6122bc8761216e565b8152848701356122cb81611ee5565b818601526040878101356122de816117f8565b90820152606087810135908201526080808801356122fb816117f8565b9082015283529485019491830191612293565b81875261231d89858a0161217d565b8488015261232d89828a016121d1565b604088015250505050505092915050565b60008060006060848603121561235357600080fd5b8335925060208401356001600160401b038082111561237157600080fd5b90850190610100828803121561238657600080fd5b61238e611a19565b82358281111561239d57600080fd5b6123a989828601611bb5565b8252506020830135602082015260408301356040820152606083013560608201526123d66080840161180d565b60808201526123e760a08401612091565b60a08201526123f860c08401612091565b60c082015260e08301358281111561240f57600080fd5b61241b8982860161209c565b60e0830152509350604086013591508082111561243757600080fd5b50611ff48682870161221b565b60008060006060848603121561245957600080fd5b83356001600160401b0381111561246f57600080fd5b611c7686828701611b64565b60006020828403121561248d57600080fd5b81516117f1816117f8565b634e487b7160e01b600052603260045260246000fd5b60008235603e198336030181126124c457600080fd5b9190910192915050565b600061028c3683611b0c565b634e487b7160e01b600052601160045260246000fd5b600060018201612502576125026124da565b5060010190565b600061028c3683611b64565b60018060a01b038416815282602082015260606040820152600061253c6060830184611cce565b95945050505050565b60006020828403121561255757600080fd5b81516117f181611ee5565b60006020828403121561257457600080fd5b81356117f18161207f565b6000806040838503121561259257600080fd5b505080516020909101519092909150565b600082198211156125b6576125b66124da565b500190565b6020808252825182820181905260009190848201906040850190845b818110156125fd5783516001600160e01b031916835292840192918401916001016125d7565b50909695505050505050565b6000602080838503121561261c57600080fd5b82516001600160401b0381111561263257600080fd5b8301601f8101851361264357600080fd5b8051612651611ad582611a6c565b81815260059190911b8201830190838101908783111561267057600080fd5b928401925b8284101561269757835161268881611ee5565b82529284019290840190612675565b979650505050505050565b600080604083850312156126b557600080fd5b82516126c08161207f565b60208401519092506119488161207f565b600080604083850312156126e457600080fd5b82516126ef81611ee5565b60208401519092506001600160401b0381111561270b57600080fd5b8301601f8101851361271c57600080fd5b805161272a611ad582611a8f565b81815286602083850101111561273f57600080fd5b612750826020830160208601611ca2565b8093505050509250929050565b6020815260006117f16020830184611cce565b60006020828403121561278257600080fd5b5051919050565b6000815160a0845261279e60a0850182611cfa565b9050602083015184820360208601526127b78282611cfa565b915050604083015184820360408601526127d18282611cfa565b60609485015180516001600160a01b031695870195909552602090940151608090950194909452509092915050565b6007811061281057612810611859565b9052565b61281f828251612800565b60208181015190830152604080820151908301526060908101516001600160a01b0316910152565b612852828251612800565b602081810151908301526040908101516001600160a01b0316910152565b80516101008084528151908401819052600091610120850191602091820190845b818110156128ef5782516128a6868251612800565b808501511515868601526040808201516001600160a01b039081169188019190915260608083015190880152608091820151169086015260a09094019391830191600101612891565b5050508084015161290282870182612814565b5050604083015161291660a0860182612847565b509392505050565b8381526060602082015260008351610100806060850152612943610160850183611d4b565b915060208601516080850152604086015160a0850152606086015160c085015260018060a01b0360808701511660e085015260a086015161298b8286018263ffffffff169052565b505060c085015163ffffffff1661012084015260e0850151838203605f19016101408501526129ba8282612789565b91505082810360408401526129cf8185612870565b9695505050505050565b6020815260006117f16020830184611cfa565b6000602082840312156129fe57600080fd5b8151600381106117f157600080fd5b60008060408385031215612a2057600080fd5b8251612a2b816117f8565b6020939093015192949293505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906129cf90830184611cce565b604081526000612a816040830185611d22565b828103602084015261253c8185611cce56fe73ad2146b3d3a286642c794379d750360a2d53a3459a11b3e5d6cc900f55f44aa26469706673582212203fc6360b176a102b986d42120b4126caaf0bf565091d99e61b26c956cdc5f50364736f6c634300080d0033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100ec5760003560e01c806395dc4d8311610091578063bfe0af9911610063578063bfe0af991461021b578063e4a1731d1461022e578063e4f75ad314610241578063f55383ae1461025457005b806395dc4d83146101ac578063abe590e5146101d4578063b42ca9e3146101e7578063b7cc2e7b146101fa57005b806369bdbd0e116100ca57806369bdbd0e146101495780637752c0fd1461015c57806386c9de051461017d57806389897ace1461019957005b806301ffc9a7146100ee5780633f09518c1461011657806360a50f2114610136575b005b6101016100fc3660046117d6565b610267565b60405190151581526020015b60405180910390f35b610129610124366004611818565b610292565b60405161010d919061186f565b6100ec610144366004611889565b610333565b6100ec6101573660046118fd565b610464565b61016f61016a366004611c3f565b61053d565b60405161010d929190611da0565b600080516020612a9483398151915260405161010d9190611db9565b6100ec6101a7366004611dce565b61087a565b6101bf6101ba366004611e72565b6108d5565b6040805192835260208301919091520161010d565b6100ec6101e2366004611ef3565b610ac9565b6101016101f5366004611ffe565b61104f565b61020d61020836600461201b565b6110c6565b60405190815260200161010d565b61020d61022936600461204f565b611132565b6100ec61023c36600461233e565b611248565b6100ec61024f366004612444565b6113ea565b6100ec610262366004611ffe565b611453565b60006001600160e01b031982166380e9fe1560e01b148061028c575061028c8261147c565b92915050565b600061032b846001600160a01b031663e3dedd6b7f9b4d0cb4e76b932bf6c979cd152d23fb4da2bb167c72cceed92f670a5328c4c36040518263ffffffff1660e01b81526004016102e39190611db9565b602060405180830381865afa158015610300573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610324919061247b565b84846114b1565b949350505050565b6002811015610340575050565b60008060008061037c8686600081811061035c5761035c612498565b905060200281019061036e91906124ae565b610377906124ce565b611529565b909250905060015b8581101561045b576103a187878381811061035c5761035c612498565b90955093506001600160a01b0380861690841611156103eb57604051631ff4af7560e01b81526001600160a01b038085166004830152861660248201526044015b60405180910390fd5b846001600160a01b0316836001600160a01b031614801561040c5750838210155b1561044357604051636b51722b60e01b81526001600160a01b038616600482015260248101839052604481018590526064016103e2565b84925083915080610453816124f0565b915050610384565b50505050505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036104ad57604051637170f3db60e01b815260040160405180910390fd5b6104be6104b983612509565b61154d565b6000806104ce61036e85806124ae565b60405163be2b9a7960e01b81526001600160a01b038084166004830152602482018390529294509092509084169063be2b9a7990604401600060405180830381600087803b15801561051f57600080fd5b505af1158015610533573d6000803e3d6000fd5b5050505050505050565b600060606001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361058a57604051637170f3db60e01b815260040160405180910390fd5b610593846115ab565b915084516001600160401b038111156105ae576105ae611953565b60405190808252806020026020018201604052801561060157816020015b604080516080810182526000918101828152606080830152815260208101919091528152602001906001900390816105cc5790505b50905060005b85518110156108715761063286828151811061062557610625612498565b602002602001015161154d565b60008061065b88848151811061064a5761064a612498565b602002602001015160000151611529565b91509150866001600160a01b031663f46c73c66040518163ffffffff1660e01b8152600401602060405180830381865afa15801561069d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c1919061247b565b6001600160a01b0316826001600160a01b031614610705576040516307a3e91560e41b81526001600160a01b038089166004830152831660248201526044016103e2565b604051806040016040528061071a89846115df565b815260200189858151811061073157610731612498565b60200260200101516020015181525084848151811061075257610752612498565b6020908102919091010152600061076a3089846114b1565b600281111561077b5761077b611859565b036107f457604080516000815260208101918290526394d008ef60e01b9091526001600160a01b038816906394d008ef906107bd908990859060248101612515565b600060405180830381600087803b1580156107d757600080fd5b505af11580156107eb573d6000803e3d6000fd5b5050505061085c565b61085c84848151811061080957610809612498565b6020026020010151308860006001600160401b0381111561082c5761082c611953565b6040519080825280601f01601f191660200182016040528015610856576020820181803683370190505b5061165c565b50508080610869906124f0565b915050610607565b50935093915050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036108c357604051637170f3db60e01b815260040160405180910390fd5b6108cf8484848461165c565b50505050565b60008060005b8651811015610abf576108f987828151811061062557610625612498565b6109096040870160208801611ffe565b6001600160a01b03166301ffc9a7633573c0bd60e21b6040518263ffffffff1660e01b815260040161093b9190611db9565b602060405180830381865afa158015610958573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097c9190612545565b15610aad57600061099888838151811061064a5761064a612498565b915060009050806109af60408a0160208b01611ffe565b6001600160a01b031663d5cf02f46109cd60608c0160408d01611ffe565b858d88815181106109e0576109e0612498565b6020026020010151602001518d60600160208101906109ff9190612562565b6040516001600160e01b031960e087901b1681526001600160a01b0390941660048501526024840192909252604483015263ffffffff166064820152608481018b905260a481018a905260c4016040805180830381865afa158015610a68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8c919061257f565b9092509050610a9b82876125a3565b9550610aa781866125a3565b94505050505b80610ab7816124f0565b9150506108db565b5094509492505050565b60005b82518110156108cf57610b01838281518110610aea57610aea612498565b60200260200101518561173390919063ffffffff16565b610b1683828151811061062557610625612498565b6000610b286040840160208501611ffe565b90506000610b4185848151811061064a5761064a612498565b915060029050610bb3836001600160a01b0316635a70a2836040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bac919061247b565b8484610292565b6002811115610bc457610bc4611859565b03610be257604051633c42e29760e11b815260040160405180910390fd5b60408051600380825260808201909252600091602082016060803683370190505090506370c8db7160e01b81600081518110610c2057610c20612498565b60200260200101906001600160e01b03191690816001600160e01b0319168152505063331f761f60e01b81600181518110610c5d57610c5d612498565b60200260200101906001600160e01b03191690816001600160e01b0319168152505063ca7cee2f60e01b81600281518110610c9a57610c9a612498565b6001600160e01b0319909216602092830291909101909101526040516307e78cc160e21b81526000906001600160a01b03851690631f9e330490610ce29085906004016125bb565b600060405180830381865afa158015610cff573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d279190810190612609565b905080600081518110610d3c57610d3c612498565b602002602001015115610e2057600080856001600160a01b031663d1958f2c6040518163ffffffff1660e01b81526004016040805180830381865afa158015610d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dad91906126a2565b915091508163ffffffff16421080610de9575063ffffffff8116610dd760808a0160608b01612562565b610de79063ffffffff16426125a3565b115b15610e1d5760405163a01a0f1b60e01b815242600482015263ffffffff8084166024830152821660448201526064016103e2565b50505b80600181518110610e3357610e33612498565b602002602001015115610f3557600080856001600160a01b031662eb6ac76040518163ffffffff1660e01b81526004016040805180830381865afa158015610e7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea391906126a2565b909250905063ffffffff8216610ebf60808a0160608b01612562565b63ffffffff161080610eeb575063ffffffff8116610ee360808a0160608b01612562565b63ffffffff16115b15610f3257610f006080890160608a01612562565b60405163420ba8b160e11b815263ffffffff9182166004820152818416602482015290821660448201526064016103e2565b50505b80600281518110610f4857610f48612498565b602002602001015115611038576000806001600160a01b03861663ca7cee2f610f7760608b0160408c01611ffe565b878c8b81518110610f8a57610f8a612498565b60209081029190910181015101516040516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091526044820152606401600060405180830381865afa158015610fe9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261101191908101906126d1565b9150915081611035578060405163b0df8c7b60e01b81526004016103e2919061275d565b50505b505050508080611047906124f0565b915050610acc565b6040516301ffc9a760e01b81526000906001600160a01b038316906301ffc9a790611085906394d008ef60e01b90600401611db9565b602060405180830381865afa1580156110a2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061028c9190612545565b80516000906001600160e01b0319166339d690a360e11b14611121578151600080516020612a948339815191525b604051632e82eea160e11b81526001600160e01b03199283166004820152911660248201526044016103e2565b61028c61112d83611781565b6115ab565b60405163e3dedd6b60e01b81526000906001600160a01b0385169063e3dedd6b90611181907f9b4d0cb4e76b932bf6c979cd152d23fb4da2bb167c72cceed92f670a5328c4c390600401611db9565b602060405180830381865afa15801561119e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c2919061247b565b6001600160a01b0316631e3478786111d9856115ab565b6040516001600160e01b031960e084901b16815260048101919091526001600160a01b0385166024820152604401602060405180830381865afa158015611224573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061032b9190612770565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361129157604051637170f3db60e01b815260040160405180910390fd5b6112ab826000015160008151811061062557610625612498565b60006112c7836000015160008151811061064a5761064a612498565b506040516301ffc9a760e01b81529091506001600160a01b038216906301ffc9a7906112fe906332cc51a360e21b90600401611db9565b602060405180830381865afa15801561131b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133f9190612545565b156108cf57600080826001600160a01b031663cb31468c8787876040518463ffffffff1660e01b81526004016113779392919061291e565b6000604051808303816000875af1158015611396573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113be91908101906126d1565b91509150816113e2578060405163b65087ad60e01b81526004016103e2919061275d565b505050505050565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361143357604051637170f3db60e01b815260040160405180910390fd5b61144e8383836040518060200160405280600081525061165c565b505050565b61145c8161104f565b611479576040516347ac7e5360e11b815260040160405180910390fd5b50565b60006001600160e01b03198216631558d89360e21b148061028c57506301ffc9a760e01b6001600160e01b031983161461028c565b6000836001600160a01b03166333a932036114cc85856115df565b6040518263ffffffff1660e01b81526004016114e891906129d9565b602060405180830381865afa158015611505573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061032b91906129ec565b60008082602001518060200190518101906115449190612a0d565b91509150915091565b8051516001600160e01b0319166339d690a360e11b1461157e57805151600080516020612a948339815191526110f4565b80602001516001146114795780602001516040516383f261dd60e01b81526004016103e291815260200190565b604080516001600160a01b038316602082015260009101604051602081830303815290604052805190602001209050919050565b6040805180820190915260008152606060208201526040518060400160405280611614600080516020612a9483398151915290565b6001600160e01b0319168152604080516001600160a01b03871660208281019190915291810186905291019060600160408051601f1981840301815291905290529392505050565b6116658461154d565b6000806116758660000151611529565b604051635c46a7ef60e11b815291935091506001600160a01b0383169063b88d4fde906116ac908890889086908990600401612a3b565b600060405180830381600087803b1580156116c657600080fd5b505af11580156116da573d6000803e3d6000fd5b50505050836001600160a01b0316856001600160a01b03167ff65cd7509f02971efd9615ae50140cecf872cd4a266e3f6cac29f9b091fb32c78886604051611723929190612a6e565b60405180910390a3505050505050565b600061173e8261179b565b9050806001600160a01b031683602001516001600160a01b03161461144e576040516323b390eb60e21b81526001600160a01b03821660048201526024016103e2565b6000816020015180602001905181019061028c919061247b565b600081600001516020015180602001905181019061028c919061247b565b80356001600160e01b0319811681146117d157600080fd5b919050565b6000602082840312156117e857600080fd5b6117f1826117b9565b9392505050565b6001600160a01b038116811461147957600080fd5b80356117d1816117f8565b60008060006060848603121561182d57600080fd5b8335611838816117f8565b92506020840135611848816117f8565b929592945050506040919091013590565b634e487b7160e01b600052602160045260246000fd5b602081016003831061188357611883611859565b91905290565b6000806020838503121561189c57600080fd5b82356001600160401b03808211156118b357600080fd5b818501915085601f8301126118c757600080fd5b8135818111156118d657600080fd5b8660208260051b85010111156118eb57600080fd5b60209290920196919550909350505050565b6000806040838503121561191057600080fd5b82356001600160401b0381111561192657600080fd5b83016040818603121561193857600080fd5b91506020830135611948816117f8565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171561198b5761198b611953565b60405290565b60405160c081016001600160401b038111828210171561198b5761198b611953565b604051608081016001600160401b038111828210171561198b5761198b611953565b604051606081016001600160401b038111828210171561198b5761198b611953565b60405160a081016001600160401b038111828210171561198b5761198b611953565b60405161010081016001600160401b038111828210171561198b5761198b611953565b604051601f8201601f191681016001600160401b0381118282101715611a6457611a64611953565b604052919050565b60006001600160401b03821115611a8557611a85611953565b5060051b60200190565b60006001600160401b03821115611aa857611aa8611953565b50601f01601f191660200190565b600082601f830112611ac757600080fd5b8135611ada611ad582611a8f565b611a3c565b818152846020838601011115611aef57600080fd5b816020850160208301376000918101602001919091529392505050565b600060408284031215611b1e57600080fd5b611b26611969565b9050611b31826117b9565b815260208201356001600160401b03811115611b4c57600080fd5b611b5884828501611ab6565b60208301525092915050565b600060408284031215611b7657600080fd5b611b7e611969565b905081356001600160401b03811115611b9657600080fd5b611ba284828501611b0c565b8252506020820135602082015292915050565b600082601f830112611bc657600080fd5b81356020611bd6611ad583611a6c565b82815260059290921b84018101918181019086841115611bf557600080fd5b8286015b84811015611c345780356001600160401b03811115611c185760008081fd5b611c268986838b0101611b64565b845250918301918301611bf9565b509695505050505050565b600080600060608486031215611c5457600080fd5b83356001600160401b03811115611c6a57600080fd5b611c7686828701611bb5565b9350506020840135611c87816117f8565b91506040840135611c97816117f8565b809150509250925092565b60005b83811015611cbd578181015183820152602001611ca5565b838111156108cf5750506000910152565b60008151808452611ce6816020860160208601611ca2565b601f01601f19169290920160200192915050565b63ffffffff60e01b8151168252600060208201516040602085015261032b6040850182611cce565b6000815160408452611d376040850182611cfa565b602093840151949093019390935250919050565b600081518084526020808501808196508360051b8101915082860160005b85811015611d93578284038952611d81848351611d22565b98850198935090840190600101611d69565b5091979650505050505050565b82815260406020820152600061032b6040830184611d4b565b6001600160e01b031991909116815260200190565b60008060008060808587031215611de457600080fd5b84356001600160401b0380821115611dfb57600080fd5b611e0788838901611b64565b955060208701359150611e19826117f8565b909350604086013590611e2b826117f8565b90925060608601359080821115611e4157600080fd5b50611e4e87828801611ab6565b91505092959194509250565b600060e08284031215611e6c57600080fd5b50919050565b60008060008060808587031215611e8857600080fd5b84356001600160401b0380821115611e9f57600080fd5b611eab88838901611bb5565b95506020870135915080821115611ec157600080fd5b50611ece87828801611e5a565b949794965050505060408301359260600135919050565b801515811461147957600080fd5b600080600060608486031215611f0857600080fd5b83356001600160401b0380821115611f1f57600080fd5b9085019060c08288031215611f3357600080fd5b611f3b611991565b611f44836117b9565b81526020830135611f54816117f8565b60208201526040830135611f6781611ee5565b60408201526060830135611f7a816117f8565b6060820152608083013582811115611f9157600080fd5b611f9d89828601611ab6565b60808301525060a083013560a0820152809550506020860135915080821115611fc557600080fd5b611fd187838801611bb5565b93506040860135915080821115611fe757600080fd5b50611ff486828701611e5a565b9150509250925092565b60006020828403121561201057600080fd5b81356117f1816117f8565b60006020828403121561202d57600080fd5b81356001600160401b0381111561204357600080fd5b61032b84828501611b0c565b60008060006060848603121561206457600080fd5b833561206f816117f8565b92506020840135611c87816117f8565b63ffffffff8116811461147957600080fd5b80356117d18161207f565b600081830360a08112156120af57600080fd5b6120b76119b3565b915082356001600160401b03808211156120d057600080fd5b6120dc86838701611b0c565b845260208501359150808211156120f257600080fd5b6120fe86838701611b0c565b6020850152604085013591508082111561211757600080fd5b5061212485828601611b0c565b6040840152506040605f198201121561213c57600080fd5b50612145611969565b6060830135612153816117f8565b80825250608083013560208201528060608301525092915050565b8035600781106117d157600080fd5b60006080828403121561218f57600080fd5b6121976119b3565b90506121a28261216e565b8152602082013560208201526040820135604082015260608201356121c6816117f8565b606082015292915050565b6000606082840312156121e357600080fd5b6121eb6119d5565b90506121f68261216e565b8152602082013560208201526040820135612210816117f8565b604082015292915050565b6000610100828403121561222e57600080fd5b6122366119d5565b905081356001600160401b0381111561224e57600080fd5b8201601f8101841361225f57600080fd5b8035602061226f611ad583611a6c565b82815260a0928302840182019282820191908885111561228e57600080fd5b948301945b8486101561230e5780868a0312156122ab5760008081fd5b6122b36119f7565b6122bc8761216e565b8152848701356122cb81611ee5565b818601526040878101356122de816117f8565b90820152606087810135908201526080808801356122fb816117f8565b9082015283529485019491830191612293565b81875261231d89858a0161217d565b8488015261232d89828a016121d1565b604088015250505050505092915050565b60008060006060848603121561235357600080fd5b8335925060208401356001600160401b038082111561237157600080fd5b90850190610100828803121561238657600080fd5b61238e611a19565b82358281111561239d57600080fd5b6123a989828601611bb5565b8252506020830135602082015260408301356040820152606083013560608201526123d66080840161180d565b60808201526123e760a08401612091565b60a08201526123f860c08401612091565b60c082015260e08301358281111561240f57600080fd5b61241b8982860161209c565b60e0830152509350604086013591508082111561243757600080fd5b50611ff48682870161221b565b60008060006060848603121561245957600080fd5b83356001600160401b0381111561246f57600080fd5b611c7686828701611b64565b60006020828403121561248d57600080fd5b81516117f1816117f8565b634e487b7160e01b600052603260045260246000fd5b60008235603e198336030181126124c457600080fd5b9190910192915050565b600061028c3683611b0c565b634e487b7160e01b600052601160045260246000fd5b600060018201612502576125026124da565b5060010190565b600061028c3683611b64565b60018060a01b038416815282602082015260606040820152600061253c6060830184611cce565b95945050505050565b60006020828403121561255757600080fd5b81516117f181611ee5565b60006020828403121561257457600080fd5b81356117f18161207f565b6000806040838503121561259257600080fd5b505080516020909101519092909150565b600082198211156125b6576125b66124da565b500190565b6020808252825182820181905260009190848201906040850190845b818110156125fd5783516001600160e01b031916835292840192918401916001016125d7565b50909695505050505050565b6000602080838503121561261c57600080fd5b82516001600160401b0381111561263257600080fd5b8301601f8101851361264357600080fd5b8051612651611ad582611a6c565b81815260059190911b8201830190838101908783111561267057600080fd5b928401925b8284101561269757835161268881611ee5565b82529284019290840190612675565b979650505050505050565b600080604083850312156126b557600080fd5b82516126c08161207f565b60208401519092506119488161207f565b600080604083850312156126e457600080fd5b82516126ef81611ee5565b60208401519092506001600160401b0381111561270b57600080fd5b8301601f8101851361271c57600080fd5b805161272a611ad582611a8f565b81815286602083850101111561273f57600080fd5b612750826020830160208601611ca2565b8093505050509250929050565b6020815260006117f16020830184611cce565b60006020828403121561278257600080fd5b5051919050565b6000815160a0845261279e60a0850182611cfa565b9050602083015184820360208601526127b78282611cfa565b915050604083015184820360408601526127d18282611cfa565b60609485015180516001600160a01b031695870195909552602090940151608090950194909452509092915050565b6007811061281057612810611859565b9052565b61281f828251612800565b60208181015190830152604080820151908301526060908101516001600160a01b0316910152565b612852828251612800565b602081810151908301526040908101516001600160a01b0316910152565b80516101008084528151908401819052600091610120850191602091820190845b818110156128ef5782516128a6868251612800565b808501511515868601526040808201516001600160a01b039081169188019190915260608083015190880152608091820151169086015260a09094019391830191600101612891565b5050508084015161290282870182612814565b5050604083015161291660a0860182612847565b509392505050565b8381526060602082015260008351610100806060850152612943610160850183611d4b565b915060208601516080850152604086015160a0850152606086015160c085015260018060a01b0360808701511660e085015260a086015161298b8286018263ffffffff169052565b505060c085015163ffffffff1661012084015260e0850151838203605f19016101408501526129ba8282612789565b91505082810360408401526129cf8185612870565b9695505050505050565b6020815260006117f16020830184611cfa565b6000602082840312156129fe57600080fd5b8151600381106117f157600080fd5b60008060408385031215612a2057600080fd5b8251612a2b816117f8565b6020939093015192949293505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906129cf90830184611cce565b604081526000612a816040830185611d22565b828103602084015261253c8185611cce56fe73ad2146b3d3a286642c794379d750360a2d53a3459a11b3e5d6cc900f55f44aa26469706673582212203fc6360b176a102b986d42120b4126caaf0bf565091d99e61b26c956cdc5f50364736f6c634300080d0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
