Turing completeness, a concept rooted in computer science, refers to a system’s ability to simulate any other computer system or Turing machine, given enough time and resources. This term has gained prominence in the realm of cryptocurrencies due to its association with smart contracts and blockchain platforms. A Turing complete blockchain, like Ethereum, can execute any conceivable program or smart contract, no matter how complex, as long as it has sufficient computational power and time. This flexibility allows for the creation of intricate decentralized applications (DApps) and multifaceted smart contracts, expanding the potential use cases of the blockchain.
However, with this power comes challenges. Turing complete systems in crypto can inadvertently run into infinite loops, leading to issues like the “halting problem.” This poses potential vulnerabilities, as bugs or malicious code can exploit these loops, causing security breaches or consuming excessive computational resources. Moreover, the broader and more flexible the system, the higher the risk of unforeseen vulnerabilities, making it a double-edged sword.
In summary, Turing completeness in the crypto context signifies a blockchain’s capability to handle any computational task, paving the way for advanced applications and smart contracts. While it offers immense potential, it also brings forth challenges in security and efficiency that developers and the crypto community continually strive to address.
In computational theory, the term “Turing completeness” is named after the British mathematician and logician, Alan Turing. Turing introduced the concept of a universal machine, known today as the Turing machine, in 1936. This machine is a mathematical model that manipulates symbols on a strip of tape based on a set of rules. Despite its abstract nature, the Turing machine was groundbreaking as it could simulate the logic of any computer algorithm, given enough time and resources.
Turing’s work laid the foundation for understanding the limits and capabilities of computation. His idea was that if a system or language is Turing complete, it can perform any computation that can be described algorithmically. Theoretically, such a system can compute anything computationally feasible, given the necessary time and memory.
The significance of Turing’s completeness extends beyond just theoretical computation. Many modern programming languages and systems, from Python to Java and even hardware architectures like x86, are considered Turing complete. This classification indicates their potential to tackle any computational problem.
Another pivotal concept linked to Turing’s work is the Church-Turing thesis. This hypothesis, named after both Alan Turing and Alonzo Church, posits that a function is computable if and only if a Turing machine can compute it. Both Turing and Church, working independently, introduced models—the Turing machine and lambda calculus, respectively—that were later proven to have equivalent computational power. This thesis further solidified the foundational role of Turing completeness in understanding the nature and boundaries of computation.
Smart contracts are digital protocols intended to facilitate, verify, or enforce credible transactions without third parties. These contracts run on blockchain platforms, and their execution is governed by the code embedded within them. Turing completeness plays a crucial role in the potential and versatility of these smart contracts. A Turing complete blockchain, such as Ethereum, has the computational capability to execute any conceivable program or smart contract, no matter how intricate. This means that the range of operations, conditions, and functionalities that can be encoded into a smart contract on such a platform is virtually limitless.
The inherent flexibility of Turing complete systems allows developers to craft smart contracts that can handle complex operations and multi-step processes. For instance, beyond simple transactions, a smart contract on a Turing complete platform could manage intricate financial derivatives, operate decentralized autonomous organizations, or even run entire games. The code can be designed to respond to a myriad of conditions, inputs, or triggers, making these contracts dynamic and adaptable.
However, the very feature that grants smart contracts on Turing complete platforms their power also introduces challenges. The ability to execute any code means there’s a risk of contracts running into infinite loops or encountering the “halting problem.” Issues can consume vast amounts of computational resources and potentially disrupt the operation of the entire blockchain. Moreover, the broader and more flexible the smart contract, the higher the potential for bugs or vulnerabilities, which malicious actors might exploit.
The correlation between Turing completeness and smart contracts is profound in the world of cryptocurrencies and blockchain. Turing completeness offers smart contracts unparalleled flexibility and potential, enabling various applications and functionalities. However, with this potential comes the responsibility of ensuring that the contracts are secure, efficient, and free from vulnerabilities. The crypto community’s ongoing challenge is harnessing the power of Turing completeness in smart contracts while ensuring their safe and reliable execution.
Turing completeness signifies that a system can handle any computational task, given enough time and resources. A Turing complete blockchain can execute any program or smart contract, regardless of its complexity, offering a vast landscape of computational possibilities.
Turing complete blockchains, like Ethereum, can support the creation of highly complex smart contracts. These contracts can be designed to manage intricate operations, multi-step processes, and complex conditions, allowing for a wide range of applications beyond simple transactions.
Smart contracts on Turing complete platforms can be designed to execute dynamic logic. This includes conditional statements, loops, and custom functions, making these contracts adaptable and responsive to various inputs and scenarios.
Turing completeness allows for developing DApps with advanced functionalities. These applications can offer services, governance models, and other features that leverage the power of complex smart contracts, providing users with diverse and innovative solutions.
One of the challenges of Turing completeness is the potential for infinite loops in smart contracts. This means a contract could run indefinitely, consuming resources and potentially disrupting the blockchain’s operation. Developers need to be cautious and implement safeguards to prevent such scenarios.
Turing complete platforms provide developers with a wide canvas to design and implement their solutions. This freedom encourages innovation, as the platform’s capabilities don’t restrict developers and can explore a myriad of functionalities and applications.
Smart contracts on Turing complete blockchains can be designed to interact with other contracts. This interactivity allows for the creation of complex ecosystems where contracts can trigger, communicate with, or rely on other contracts, leading to multifunctional platforms.
Turing completeness offers a high degree of customizability. Developers can create user-defined operations, design custom transaction types, and even introduce new functionalities tailored to specific needs, making the platform adaptable to various use cases.
Smart contracts are self-executing contracts with terms directly written into code. With Turing completeness, these contracts can be designed to handle intricate operations, multi-step processes, and complex conditions. This allows for various applications, from simple peer-to-peer transactions to advanced financial agreements.
Turing completeness enables the development of advanced decentralized applications that offer myriad services. The vast possibilities allow developers to create solutions tailored to specific user needs, from decentralized exchanges and lending platforms to gaming applications.
DAOs are organizations that operate autonomously based on pre-set rules encoded into smart contracts. With Turing completeness, these rules can be multifaceted, allowing for dynamic decision-making processes, voting systems, and operational structures without human intervention.
Using smart contracts, the crypto space can replicate traditional financial instruments like options, futures, and swaps. Turing completeness ensures these contracts can handle the complexities of such instruments, from conditional executions to multi-party agreements.
Beyond standard cryptocurrency tokens, Turing completeness allows for the creation of tokens with unique features, behaviors, and rules. This includes tokens with built-in staking mechanisms, burn functions, or even tokens that change characteristics based on external factors.
Turing complete platforms can be designed to communicate and interact with multiple blockchains or systems. This interoperability ensures seamless data and value transfer across different networks, enhancing the overall utility of the blockchain ecosystem.
Turing completeness allows for the implementation of dynamic governance models on the blockchain. Stakeholders can participate in decision-making processes, propose changes, or vote on proposals, all governed by smart contracts that automatically execute outcomes based on predefined conditions.
Blockchain can revolutionize supply chain management by providing transparent and tamper-proof tracking. With Turing completeness, every stage of a product’s journey can be verified using complex logic, ensuring authenticity and accountability.
Prediction markets allow users to bet on the outcomes of future events. Turing completeness ensures these platforms can handle various scenarios, from sports outcomes to financial market movements, with payouts and conditions managed by smart contracts.
NFTs represent unique digital assets on the blockchain. With Turing completeness, NFTs can be designed to change or evolve based on certain conditions, triggers, or timelines, adding layers of interactivity and dynamism to these digital collectibles.
The discussion around Turing completeness in the blockchain world gained traction when Ethereum entered the scene, marketing itself with the claim that, unlike Bitcoin’s blockchain, Ethereum is Turing complete. Ethereum was designed as a platform for decentralized applications, meaning these applications run on multiple computers without a central server, making them resistant to shutdowns. The applications on Ethereum are powered by smart contracts, primarily written in a language called Solidity. Being Turing complete, Solidity allows for loops in its programming, a feature that Bitcoin’s scripting language lacks. This distinction was highlighted by Ethereum’s founder, Vitalik Buterin, who defined a Turing complete programming language as one that supports loops. In Solidity, a task can be looped, but the same task would need to be manually repeated in Bitcoin’s scripting language.
However, Bitcoin’s decision to exclude loops from its scripting language was intentional. The primary reason was to safeguard against potential spam attacks. In a blockchain environment, loops can be risky. A piece of code requiring millions of executions could overwhelm the network. Ethereum addressed this risk by introducing operation fees, known as “gas.” The more operations a task requires, the higher the associated fee. On the other hand, Bitcoin was crafted with simplicity in mind, primarily functioning as a cryptocurrency for value transfers.
Contrary to popular belief, Bitcoin’s blockchain can be considered Turing complete. Turing completeness isn’t strictly about the ability to loop; it’s more about a system’s capability to solve any given problem, regardless of its complexity. There are multiple methods to achieve Turing completeness within the Bitcoin blockchain. For instance, while Bitcoin’s scripting language might not support traditional loops, it does allow for the repetition of a group of statements, mimicking the function of a loop. And while an infinite loop is theoretically possible, it wouldn’t be practical in real-world scenarios due to constraints like power consumption. Nevertheless, Bitcoin’s vast network of connected systems offers immense computational power, enabling it to tackle complex problems. Another approach to achieve Turing completeness on Bitcoin’s blockchain is by creating new payment channels that use the output of one block as the input for the next, allowing for continuous block creation.
Ethereum emerged as the pioneering blockchain with Turing complete capabilities, enabling the programming of smart contracts and decentralized applications (dApps). This distinction was achieved through Ethereum’s unique design. Its smart contracts are crafted using Solidity, a versatile Turing complete language tailored for Ethereum. Secondly, the Ethereum Virtual Machine (EVM) that runs these smart contracts is itself a Turing complete entity. This means the EVM can handle any smart contract configuration, even those not yet imagined. This innovation expanded the horizons of blockchain technology, moving it beyond a set number of applications to an expansive realm of possibilities.
However, while Ethereum boasts Turing completeness in theory, practical considerations temper this claim. Every action on Ethereum, including smart contract execution, incurs a gas fee. If a smart contract were to enter an infinite loop, a scenario plausible in Turing machines, it would deplete its gas reserves. This inherent constraint is intentional. Allowing numerous smart contracts to operate endlessly would strain a public blockchain network with limited processing power. Each Ethereum transaction is assigned a gas limit to mitigate this, determining the maximum computational effort it can utilize. Transactions that exceed this limit are halted. Notably, only a small fraction of Ethereum smart contracts leverage the full extent of Turing complete capabilities, such as recursive loops.
Turing complete systems, with their boundless programmability, offer immense potential. However, this very strength can sometimes be a double-edged sword, especially in public blockchains where the code is transparent to everyone. Such openness can expose the code to potential disruptions, like smart contract bugs, or unforeseen uses that might hinder the protocol’s intended operation. The vast computational possibilities in Turing complete systems mean that not every outcome can be predicted.
In centralized systems, the owning entity can swiftly address unexpected issues through patches. But in blockchain ecosystems, rectifying unforeseen problems can be more challenging. This is because any modifications require consensus from the community, making the process lengthier.
A notable instance highlighting this challenge was The DAO event on Ethereum in 2016. Designed as a decentralized venture capital fund, The DAO became the target of an individual who exploited a vulnerability in its code. This person managed to siphon off over $150 million of investments. While many label this as a “hack,” it was more of an exploitation of a coding oversight, leading to a reentrancy attack. The aftermath of this event was significant, prompting a contentious decision to revert the Ethereum blockchain to retrieve the stolen funds, which subsequently caused the Ethereum Classic fork.
Post the DAO debacle, there have been improvements in coding practices to prevent such vulnerabilities. Yet, the ever-evolving nature of Turing complete systems, with continuous code innovations, means that new vulnerabilities might still emerge.
Turing completeness, a foundational concept in computer science, has found significant relevance in the world of cryptocurrencies, particularly in the design and functionality of blockchains like Ethereum. This capability, which allows a system to simulate any other computational system, has paved the way for the development of intricate smart contracts and decentralized applications, expanding the horizons of blockchain technology. However, as the events surrounding The DAO have shown, the vast potential of Turing complete systems also brings with it inherent challenges, especially in the realm of security and unforeseen vulnerabilities. While Ethereum and other Turing complete blockchains offer unprecedented flexibility and potential in the crypto space, they also underscore the importance of robust security measures and continuous vigilance. As the crypto landscape continues to evolve, striking a balance between harnessing the power of Turing completeness and ensuring the security and reliability of blockchain platforms remains a paramount challenge for developers and the broader community.
Turing completeness, a concept rooted in computer science, refers to a system’s ability to simulate any other computer system or Turing machine, given enough time and resources. This term has gained prominence in the realm of cryptocurrencies due to its association with smart contracts and blockchain platforms. A Turing complete blockchain, like Ethereum, can execute any conceivable program or smart contract, no matter how complex, as long as it has sufficient computational power and time. This flexibility allows for the creation of intricate decentralized applications (DApps) and multifaceted smart contracts, expanding the potential use cases of the blockchain.
However, with this power comes challenges. Turing complete systems in crypto can inadvertently run into infinite loops, leading to issues like the “halting problem.” This poses potential vulnerabilities, as bugs or malicious code can exploit these loops, causing security breaches or consuming excessive computational resources. Moreover, the broader and more flexible the system, the higher the risk of unforeseen vulnerabilities, making it a double-edged sword.
In summary, Turing completeness in the crypto context signifies a blockchain’s capability to handle any computational task, paving the way for advanced applications and smart contracts. While it offers immense potential, it also brings forth challenges in security and efficiency that developers and the crypto community continually strive to address.
In computational theory, the term “Turing completeness” is named after the British mathematician and logician, Alan Turing. Turing introduced the concept of a universal machine, known today as the Turing machine, in 1936. This machine is a mathematical model that manipulates symbols on a strip of tape based on a set of rules. Despite its abstract nature, the Turing machine was groundbreaking as it could simulate the logic of any computer algorithm, given enough time and resources.
Turing’s work laid the foundation for understanding the limits and capabilities of computation. His idea was that if a system or language is Turing complete, it can perform any computation that can be described algorithmically. Theoretically, such a system can compute anything computationally feasible, given the necessary time and memory.
The significance of Turing’s completeness extends beyond just theoretical computation. Many modern programming languages and systems, from Python to Java and even hardware architectures like x86, are considered Turing complete. This classification indicates their potential to tackle any computational problem.
Another pivotal concept linked to Turing’s work is the Church-Turing thesis. This hypothesis, named after both Alan Turing and Alonzo Church, posits that a function is computable if and only if a Turing machine can compute it. Both Turing and Church, working independently, introduced models—the Turing machine and lambda calculus, respectively—that were later proven to have equivalent computational power. This thesis further solidified the foundational role of Turing completeness in understanding the nature and boundaries of computation.
Smart contracts are digital protocols intended to facilitate, verify, or enforce credible transactions without third parties. These contracts run on blockchain platforms, and their execution is governed by the code embedded within them. Turing completeness plays a crucial role in the potential and versatility of these smart contracts. A Turing complete blockchain, such as Ethereum, has the computational capability to execute any conceivable program or smart contract, no matter how intricate. This means that the range of operations, conditions, and functionalities that can be encoded into a smart contract on such a platform is virtually limitless.
The inherent flexibility of Turing complete systems allows developers to craft smart contracts that can handle complex operations and multi-step processes. For instance, beyond simple transactions, a smart contract on a Turing complete platform could manage intricate financial derivatives, operate decentralized autonomous organizations, or even run entire games. The code can be designed to respond to a myriad of conditions, inputs, or triggers, making these contracts dynamic and adaptable.
However, the very feature that grants smart contracts on Turing complete platforms their power also introduces challenges. The ability to execute any code means there’s a risk of contracts running into infinite loops or encountering the “halting problem.” Issues can consume vast amounts of computational resources and potentially disrupt the operation of the entire blockchain. Moreover, the broader and more flexible the smart contract, the higher the potential for bugs or vulnerabilities, which malicious actors might exploit.
The correlation between Turing completeness and smart contracts is profound in the world of cryptocurrencies and blockchain. Turing completeness offers smart contracts unparalleled flexibility and potential, enabling various applications and functionalities. However, with this potential comes the responsibility of ensuring that the contracts are secure, efficient, and free from vulnerabilities. The crypto community’s ongoing challenge is harnessing the power of Turing completeness in smart contracts while ensuring their safe and reliable execution.
Turing completeness signifies that a system can handle any computational task, given enough time and resources. A Turing complete blockchain can execute any program or smart contract, regardless of its complexity, offering a vast landscape of computational possibilities.
Turing complete blockchains, like Ethereum, can support the creation of highly complex smart contracts. These contracts can be designed to manage intricate operations, multi-step processes, and complex conditions, allowing for a wide range of applications beyond simple transactions.
Smart contracts on Turing complete platforms can be designed to execute dynamic logic. This includes conditional statements, loops, and custom functions, making these contracts adaptable and responsive to various inputs and scenarios.
Turing completeness allows for developing DApps with advanced functionalities. These applications can offer services, governance models, and other features that leverage the power of complex smart contracts, providing users with diverse and innovative solutions.
One of the challenges of Turing completeness is the potential for infinite loops in smart contracts. This means a contract could run indefinitely, consuming resources and potentially disrupting the blockchain’s operation. Developers need to be cautious and implement safeguards to prevent such scenarios.
Turing complete platforms provide developers with a wide canvas to design and implement their solutions. This freedom encourages innovation, as the platform’s capabilities don’t restrict developers and can explore a myriad of functionalities and applications.
Smart contracts on Turing complete blockchains can be designed to interact with other contracts. This interactivity allows for the creation of complex ecosystems where contracts can trigger, communicate with, or rely on other contracts, leading to multifunctional platforms.
Turing completeness offers a high degree of customizability. Developers can create user-defined operations, design custom transaction types, and even introduce new functionalities tailored to specific needs, making the platform adaptable to various use cases.
Smart contracts are self-executing contracts with terms directly written into code. With Turing completeness, these contracts can be designed to handle intricate operations, multi-step processes, and complex conditions. This allows for various applications, from simple peer-to-peer transactions to advanced financial agreements.
Turing completeness enables the development of advanced decentralized applications that offer myriad services. The vast possibilities allow developers to create solutions tailored to specific user needs, from decentralized exchanges and lending platforms to gaming applications.
DAOs are organizations that operate autonomously based on pre-set rules encoded into smart contracts. With Turing completeness, these rules can be multifaceted, allowing for dynamic decision-making processes, voting systems, and operational structures without human intervention.
Using smart contracts, the crypto space can replicate traditional financial instruments like options, futures, and swaps. Turing completeness ensures these contracts can handle the complexities of such instruments, from conditional executions to multi-party agreements.
Beyond standard cryptocurrency tokens, Turing completeness allows for the creation of tokens with unique features, behaviors, and rules. This includes tokens with built-in staking mechanisms, burn functions, or even tokens that change characteristics based on external factors.
Turing complete platforms can be designed to communicate and interact with multiple blockchains or systems. This interoperability ensures seamless data and value transfer across different networks, enhancing the overall utility of the blockchain ecosystem.
Turing completeness allows for the implementation of dynamic governance models on the blockchain. Stakeholders can participate in decision-making processes, propose changes, or vote on proposals, all governed by smart contracts that automatically execute outcomes based on predefined conditions.
Blockchain can revolutionize supply chain management by providing transparent and tamper-proof tracking. With Turing completeness, every stage of a product’s journey can be verified using complex logic, ensuring authenticity and accountability.
Prediction markets allow users to bet on the outcomes of future events. Turing completeness ensures these platforms can handle various scenarios, from sports outcomes to financial market movements, with payouts and conditions managed by smart contracts.
NFTs represent unique digital assets on the blockchain. With Turing completeness, NFTs can be designed to change or evolve based on certain conditions, triggers, or timelines, adding layers of interactivity and dynamism to these digital collectibles.
The discussion around Turing completeness in the blockchain world gained traction when Ethereum entered the scene, marketing itself with the claim that, unlike Bitcoin’s blockchain, Ethereum is Turing complete. Ethereum was designed as a platform for decentralized applications, meaning these applications run on multiple computers without a central server, making them resistant to shutdowns. The applications on Ethereum are powered by smart contracts, primarily written in a language called Solidity. Being Turing complete, Solidity allows for loops in its programming, a feature that Bitcoin’s scripting language lacks. This distinction was highlighted by Ethereum’s founder, Vitalik Buterin, who defined a Turing complete programming language as one that supports loops. In Solidity, a task can be looped, but the same task would need to be manually repeated in Bitcoin’s scripting language.
However, Bitcoin’s decision to exclude loops from its scripting language was intentional. The primary reason was to safeguard against potential spam attacks. In a blockchain environment, loops can be risky. A piece of code requiring millions of executions could overwhelm the network. Ethereum addressed this risk by introducing operation fees, known as “gas.” The more operations a task requires, the higher the associated fee. On the other hand, Bitcoin was crafted with simplicity in mind, primarily functioning as a cryptocurrency for value transfers.
Contrary to popular belief, Bitcoin’s blockchain can be considered Turing complete. Turing completeness isn’t strictly about the ability to loop; it’s more about a system’s capability to solve any given problem, regardless of its complexity. There are multiple methods to achieve Turing completeness within the Bitcoin blockchain. For instance, while Bitcoin’s scripting language might not support traditional loops, it does allow for the repetition of a group of statements, mimicking the function of a loop. And while an infinite loop is theoretically possible, it wouldn’t be practical in real-world scenarios due to constraints like power consumption. Nevertheless, Bitcoin’s vast network of connected systems offers immense computational power, enabling it to tackle complex problems. Another approach to achieve Turing completeness on Bitcoin’s blockchain is by creating new payment channels that use the output of one block as the input for the next, allowing for continuous block creation.
Ethereum emerged as the pioneering blockchain with Turing complete capabilities, enabling the programming of smart contracts and decentralized applications (dApps). This distinction was achieved through Ethereum’s unique design. Its smart contracts are crafted using Solidity, a versatile Turing complete language tailored for Ethereum. Secondly, the Ethereum Virtual Machine (EVM) that runs these smart contracts is itself a Turing complete entity. This means the EVM can handle any smart contract configuration, even those not yet imagined. This innovation expanded the horizons of blockchain technology, moving it beyond a set number of applications to an expansive realm of possibilities.
However, while Ethereum boasts Turing completeness in theory, practical considerations temper this claim. Every action on Ethereum, including smart contract execution, incurs a gas fee. If a smart contract were to enter an infinite loop, a scenario plausible in Turing machines, it would deplete its gas reserves. This inherent constraint is intentional. Allowing numerous smart contracts to operate endlessly would strain a public blockchain network with limited processing power. Each Ethereum transaction is assigned a gas limit to mitigate this, determining the maximum computational effort it can utilize. Transactions that exceed this limit are halted. Notably, only a small fraction of Ethereum smart contracts leverage the full extent of Turing complete capabilities, such as recursive loops.
Turing complete systems, with their boundless programmability, offer immense potential. However, this very strength can sometimes be a double-edged sword, especially in public blockchains where the code is transparent to everyone. Such openness can expose the code to potential disruptions, like smart contract bugs, or unforeseen uses that might hinder the protocol’s intended operation. The vast computational possibilities in Turing complete systems mean that not every outcome can be predicted.
In centralized systems, the owning entity can swiftly address unexpected issues through patches. But in blockchain ecosystems, rectifying unforeseen problems can be more challenging. This is because any modifications require consensus from the community, making the process lengthier.
A notable instance highlighting this challenge was The DAO event on Ethereum in 2016. Designed as a decentralized venture capital fund, The DAO became the target of an individual who exploited a vulnerability in its code. This person managed to siphon off over $150 million of investments. While many label this as a “hack,” it was more of an exploitation of a coding oversight, leading to a reentrancy attack. The aftermath of this event was significant, prompting a contentious decision to revert the Ethereum blockchain to retrieve the stolen funds, which subsequently caused the Ethereum Classic fork.
Post the DAO debacle, there have been improvements in coding practices to prevent such vulnerabilities. Yet, the ever-evolving nature of Turing complete systems, with continuous code innovations, means that new vulnerabilities might still emerge.
Turing completeness, a foundational concept in computer science, has found significant relevance in the world of cryptocurrencies, particularly in the design and functionality of blockchains like Ethereum. This capability, which allows a system to simulate any other computational system, has paved the way for the development of intricate smart contracts and decentralized applications, expanding the horizons of blockchain technology. However, as the events surrounding The DAO have shown, the vast potential of Turing complete systems also brings with it inherent challenges, especially in the realm of security and unforeseen vulnerabilities. While Ethereum and other Turing complete blockchains offer unprecedented flexibility and potential in the crypto space, they also underscore the importance of robust security measures and continuous vigilance. As the crypto landscape continues to evolve, striking a balance between harnessing the power of Turing completeness and ensuring the security and reliability of blockchain platforms remains a paramount challenge for developers and the broader community.