`_withdrawFromPlugin()` will revert when `_withdrawalValues[i] == 0`
When `_withdrawalValues[i] == 0` in `rebalancePlugins()`, it means NOT to rebalance this plugin.\\nHowever, the current implementation still tries to withdraw 0 from the plugin.\\nThis will revert in AaveV2Plugin as Aave V2's `validateWithdraw()` does not allow `0` withdrawals:\\n```\\n  function validateWithdraw(\\n    address reserveAddress,\\n    uint256 amount,\\n    uint256 userBalance,\\n    mapping(address => DataTypes.ReserveData) storage reservesData,\\n    DataTypes.UserConfigurationMap storage userConfig,\\n    mapping(uint256 => address) storage reserves,\\n    uint256 reservesCount,\\n    address oracle\\n  ) external view {\\n    require(amount != 0, Errors.VL_INVALID_AMOUNT);\\n```\\n\\n`removePlugin()` will also always `_withdrawFromPlugin()` even if the plugin's balance is 0, as it will also tries to withdraw 0 in that case (balance is 0).
Only call `_withdrawFromPlugin()` when IPlugin(pluginAddr).balance() > 0:\\n```\\nfunction removePlugin(uint256 _index) external onlyOwner {\\n    require(_index < pluginCount, "Index out of bounds");\\n    address pluginAddr = plugins[_index];\\n    if (IPlugin(pluginAddr).balance() > 0){\\n        _withdrawFromPlugin(pluginAddr, IPlugin(pluginAddr).balance());\\n    }\\n    uint256 pointer = _index;\\n    while (pointer < pluginCount - 1) {\\n        plugins[pointer] = plugins[pointer + 1];\\n        pointer++;\\n    }\\n    delete plugins[pluginCount - 1];\\n    pluginCount--;\\n\\n    IERC20(LINK).approve(pluginAddr, 0);\\n\\n    emit PluginRemoved(pluginAddr);\\n}\\n```\\n\\n```\\nfunction rebalancePlugins(uint256[] memory _withdrawalValues) external onlyOwner {\\n    require(_withdrawalValues.length == pluginCount, "Invalid withdrawal values");\\n    for (uint256 i = 0; i < pluginCount; i++) {\\n        if (_withdrawalValues[i] > 0)\\n            _withdrawFromPlugin(plugins[i], _withdrawalValues[i]);\\n    }\\n    _distributeToPlugins();\\n}\\n```\\n
For AaveV2Plugin (and any future plugins that dont allow withdraw 0):\\nIn every rebalance call, it must at least withdraw 1 wei from the plugin for the rebalance to work.\\nThe plugin can not be removed or rebalanced when there is no balance in it.\\nIf such a plugin can not deposit for some reason (paused by gov, AaveV2Plugin may face that), this will further cause the whole system unable to be rebalanced until the deposit resumes for that plugin.
```\\n  function validateWithdraw(\\n    address reserveAddress,\\n    uint256 amount,\\n    uint256 userBalance,\\n    mapping(address => DataTypes.ReserveData) storage reservesData,\\n    DataTypes.UserConfigurationMap storage userConfig,\\n    mapping(uint256 => address) storage reserves,\\n    uint256 reservesCount,\\n    address oracle\\n  ) external view {\\n    require(amount != 0, Errors.VL_INVALID_AMOUNT);\\n```\\n