diff --git a/.gitattributes b/.gitattributes index 745d764..dc37cdc 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3,7 +3,7 @@ # and leave all files detected as binary untouched. * text=auto # Force the following filetypes to have unix eols and encoding, so that Windows does not break them. -# If a file is going to be used on linux and windows, we want it invariant, +# If a file is going to be used on linux and windows, we want it invariant, # rather than automatically translated, because automatic translation always screw things up. .gitignore text eol=lf encoding=utf-8 whitespace=trailing-space,space-before-tab,tabwidth=4 .gitattributes text eol=lf encoding=utf-8 whitespace=trailing-space,space-before-tab,tabwidth=4 diff --git a/.gitconfig b/.gitconfig index afde232..b82a964 100644 --- a/.gitconfig +++ b/.gitconfig @@ -10,23 +10,24 @@ graph = log --max-count=18 --graph --pretty=format:'%C(auto)%h %s %Cgreen(%cr) %C(bold blue)%cn %G?%Creset' --abbrev-commit alias = ! git config --get-regexp ^alias\\. | sed -e s/^alias\\.// -e s/\\ /\\ =\\ / | grep -v ^'alias ' | sort fixws = !"\ - if (! git diff-files --quiet .) && \ - (! git diff-index --quiet --cached HEAD) ; then \ - git commit -m FIXWS_SAVE_INDEX && \ - git add -u :/ && \ - git commit -m Fix_whitespace && \ - git rebase --whitespace=fix HEAD~2 && \ - git reset HEAD~ && \ - git reset --soft HEAD~ ; \ - elif (! git diff-files --quiet .) ; then \ - git add -u :/ && \ - git commit -m Fix_whitespace && \ - git rebase --whitespace=fix HEAD~ && \ - git reset HEAD~ ; \ - elif (! git diff-index --quiet --cached HEAD) ; then \ - git commit -m FIXWS_SAVE_INDEX && \ - git rebase --whitespace=fix HEAD~ && \ - git reset --soft HEAD~ ; \ - fi" + if (! git diff-files --quiet .) && \ + (! git diff-index --quiet --cached HEAD) ; then \ + git commit -m FIXWS_SAVE_INDEX && \ + git add -u :/ && \ + git commit -m Fix_whitespace && \ + git rebase --whitespace=fix HEAD~2 && \ + git reset HEAD~ && \ + git reset --soft HEAD~ ; \ + elif (! git diff-files --quiet .) ; then \ + git add -u :/ && \ + git commit -m Fix_whitespace && \ + git rebase --whitespace=fix HEAD~ && \ + git reset HEAD~ ; \ + elif (! git diff-index --quiet --cached HEAD) ; then \ + git commit -m FIXWS_SAVE_INDEX && \ + git rebase --whitespace=fix HEAD~ && \ + git reset --soft HEAD~ ; \ + fi" + check-whitespace = !"git diff --check $(git hash-object -t tree /dev/null) HEAD" [commit] gpgSign = true diff --git a/.gitignore b/.gitignore index 9edb00c..d4630ae 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,7 @@ *.sln.docstates *.exe *.idb -*.vcxproj.filters +*.vcxproj.filters *.html *.htm wallet.cppcheck diff --git a/ILog.cpp b/ILog.cpp index 572015a..42c492f 100644 --- a/ILog.cpp +++ b/ILog.cpp @@ -20,7 +20,7 @@ void ILogVerbose(const char* sz) { void ILogDebug(const char* sz) { wxLogDebug(_wx("%s"), _wx(sz)); } //is the right function for debug output. It only does anything at all in the - //debug mode(when the preprocessor symbol WXDEBUG is defined) and expands to + //debug mode(when the preprocessor symbol WXDEBUG is defined) and expands to //nothing in release mode(otherwise).Note that under Windows, you must either //run the program under debugger or use a 3rd party program such as DebugView @@ -38,4 +38,3 @@ void queue_fatal_error(const char* psz) { queue_error_message(psz); singletonFrame->Close(); } - diff --git a/ISqlite3.h b/ISqlite3.h index 74f21c4..87a2750 100644 --- a/ISqlite3.h +++ b/ISqlite3.h @@ -93,4 +93,3 @@ void sqlite3_init(); extern "C" { int sqlite3_shutdown(void); } - diff --git a/LICENSE.html b/LICENSE.html index 19631fa..33f7174 100644 --- a/LICENSE.html +++ b/LICENSE.html @@ -6,39 +6,39 @@ LICENSE - - - + + +
diff --git a/LICENSE.md b/LICENSE.md index 697eb22..1b4b09c 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,5 +1,4 @@ --- -generator: title: LICENSE --- Copyright © 2021 reaction.la gpg key 154588427F2709CD9D7146B01C99BB982002C39F diff --git a/NOTICE.html b/NOTICE.html index 74b53dc..4af90c4 100644 --- a/NOTICE.html +++ b/NOTICE.html @@ -6,39 +6,39 @@ NOTICE - - - + + +
diff --git a/README.html b/README.html index 22a88fd..2bbaceb 100644 --- a/README.html +++ b/README.html @@ -87,7 +87,7 @@ margin-left: 1em; } p.center {text-align:center;} - + table { border-collapse: collapse; } @@ -101,7 +101,6 @@ } -
@@ -121,20 +120,7 @@ build the program and run unit test for the first time, launch the Visual Studio X64 native tools command prompt in the cloned directory, then:

winConfigure.bat

winConfigure.bat also configures the repository you just created to use -<<<<<<< HEAD -.gitconfig in the repository, causing git to rquire to implement gpg signed -commits – because cryptographic software is under attack from NSA, -entryists, and shills, who seek to introduce backdoors.

-

This may be inconvenient if you do not have gpg installed and set up.

-

It adds several git aliases:

-
    -
  1. git lg to display the gpg trust information for the las three commits. -For this to be useful you need to import the repository public key -public_key.gpg` into gpg, and locally sign that key.
  2. -
  3. git fixws to standardise white space to the project standards
  4. -
  5. git graph to graph the commit tree, and git alias to display the git aliases.
  6. -======= -.gitconfig in the repository, causing git to require to implement GPG signed +.gitconfig in the repository, causing git to to implement GPG signed commits – because cryptographic software is under attack from NSA entryists, and shills, who seek to introduce backdoors.

    This may be inconvenient if you do not have gpg installed and set up.

    @@ -146,13 +132,12 @@ For this to be useful you need to import the repository public key
  7. git fixws to standardise white space to the project standards
  8. git graph to graph the commit tree
  9. git alias to display the git aliases.
  10. ->>>>>>> origin/master
-
# To verify that the signature on future pulls is unchanged.  
+
# To verify that the signature on future pulls is unchanged.
 gpg --import  public_key.gpg
 gpg --lsign 096EAE16FB8D62E75D243199BC4482E49673711C
 # We ignore the Gpg Web of Trust model and instead use
-# the Zooko identity model. 
+# the Zooko identity model.
 # We use Gpg signatures to verify that remote repository
 # code is coming from an unchanging entity, not for
 # Gpg Web of Trust.  Web of Trust is too complicated
@@ -165,7 +150,7 @@ For this to be useful you need to import the repository public key
 # or the email of someone whom you do not like.

To build the documentation in its intended html form from the markdown files, execute the bash script file docs/mkdocs.sh, in an environment where -pandoc is available. On Windows, if Git Bash and Pandoc has bee +pandoc is available. On Windows, if Git Bash and Pandoc has been installed, you should be able to run a shell file in bash by double clicking on it.

Pre alpha release, which means it does not yet work even well enough for it to be apparent what it would do if it did work.

diff --git a/README.md b/README.md index 6fc6828..1a28457 100644 --- a/README.md +++ b/README.md @@ -48,11 +48,11 @@ This may be inconvenient if you do not have `gpg` installed and set up. 1. `git alias` to display the git aliases. ```bash -# To verify that the signature on future pulls is unchanged. +# To verify that the signature on future pulls is unchanged. gpg --import public_key.gpg gpg --lsign 096EAE16FB8D62E75D243199BC4482E49673711C # We ignore the Gpg Web of Trust model and instead use -# the Zooko identity model. +# the Zooko identity model. # We use Gpg signatures to verify that remote repository # code is coming from an unchanging entity, not for # Gpg Web of Trust. Web of Trust is too complicated diff --git a/RELEASE_NOTES.html b/RELEASE_NOTES.html index b330f9a..239beb0 100644 --- a/RELEASE_NOTES.html +++ b/RELEASE_NOTES.html @@ -6,39 +6,39 @@ Release Notes - - - + + +
diff --git a/bit_hacks.h b/bit_hacks.h index 8e84b7e..21a4673 100644 --- a/bit_hacks.h +++ b/bit_hacks.h @@ -73,30 +73,3 @@ inline auto trailing_zero_bits(uint64_t v) { } return c; } - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/display_wallet.h b/display_wallet.h index bc5a9b6..d3ded93 100644 --- a/display_wallet.h +++ b/display_wallet.h @@ -10,7 +10,3 @@ private: wxBoxSizer* m_lSizer; wxBoxSizer* m_rSizer; }; - - - - diff --git a/docs/Massive_Parallelism.html b/docs/Massive_Parallelism.html index acca1f1..67ec696 100644 --- a/docs/Massive_Parallelism.html +++ b/docs/Massive_Parallelism.html @@ -1,40 +1,40 @@ - - - - Massive Parallelism + + Massive Parallelism

Digital Ocean, Docker, microservices, Rest, Json and protocol buffers.

- + The world is drifting towards handling massive parallelism through https microservices.

Typically you have an nginx reverse proxy distributing https requests to a swarm of docker instances of node.js

These communicate by rest, which means that http get and post map to wrapped database operations. On the wire the data is represented as JSON, protocol buffers, or ASN.1.

- + JSON being by far the most popular, despite its inefficiency. It is a strictly text format, that is in principle human readable, though YAML is JSON variant that is far more human readable.

- + Numerous docker instances keep in agreement through the Mongo database, which handles the syncrhonization of massive parallelism, possibly through a sharded cluster. Mongo communicates in binary, but everyone wants to talk to it in JSON, so it has a sort of bastard binary JSON, and can also talk real JSON.

- + The great use of Mongo is coordinating numerous instances, which rapidly runs into scaling problems. Mongo is shardable, albeit sharding it is non trivial.

- + Each instance of these massively parallel applications are contained in docker containers, which are themselves contained in VMs. A docker container is a sort of lightweight VM, which always represents a live, fully configured, running machine, which provides various services over the network, and any permanent effects are stored on a database that is apt to be external to the docker container, so that the virtual machine can be casually destroyed and restarted.

- + To provide private keys to the docker container, have a volume that only one local user has access to, and mount it to the docker container. It then uses that key to get all the other secret keys, possibly by using crypt. But this seems kind of stupid. How about it generates its own unique private key, and then gets that key blessed – in the process of accepting the authority of the blessing key.

- + When launched, hits up a service to get its key blessed and register its availability, and thereafter accepts whatever commands are issued on the key chain issued when first it showed up.

These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

+Commons Attribution-Share Alike 3.0 License

diff --git a/docs/May_scale_of_monetary_hardness.html b/docs/May_scale_of_monetary_hardness.html index a8d4d8c..952c0de 100644 --- a/docs/May_scale_of_monetary_hardness.html +++ b/docs/May_scale_of_monetary_hardness.html @@ -1,8 +1,8 @@ - - - - Bitrot, Protocol Negotiation, and the Confused Deputy Problem + + Bitrot, Protocol Negotiation, and the Confused Deputy Problem -

To Home page

-

Bitrot and Protocol Negotiation

+

To Home page

+

Bitrot and Protocol Negotiation

The problem

One particular case of the bitrot problem was the Microsoft Windows - problem known as “DLL Hell”, DLLs being binary dynamically linked - libraries in Microsoft Windows. 

- -

Over time these libraries tended to be upgraded, improved, and changed, - and programs written for the old libraries would develop bugs with the new - libraries, sometimes these bugs were crash and burn bugs, “bitrot”, - sometimes there were unexpected interactions between programs using the - same library, which caused one program to accidentally foul up another, or - enabled one program to maliciously manipulate another.

- -

This problem was solved. The solution was “COM”.  In COM, dynamic - linking necessarily involves version negotiation.  Mandatory version - negotiation largely relieves bitrot. 

- -

In COM, in accordance with Zooko’s triangle, each version of a library’s - behavior, each library interface, has three names. Describing those names - and their behavior from the point of view of Zooko’s triangle, which is - not how most Microsoft programmers would describe them or think about - them:

- -
    + problem known as “DLL Hell”, DLLs being binary dynamically linked + libraries in Microsoft Windows. 

    + +

    Over time these libraries tended to be upgraded, improved, and changed, + and programs written for the old libraries would develop bugs with the new + libraries, sometimes these bugs were crash and burn bugs, “bitrot”, + sometimes there were unexpected interactions between programs using the + same library, which caused one program to accidentally foul up another, or + enabled one program to maliciously manipulate another.

    + +

    This problem was solved. The solution was “COM”.  In COM, dynamic + linking necessarily involves version negotiation.  Mandatory version + negotiation largely relieves bitrot. 

    + +

    In COM, in accordance with Zooko’s triangle, each version of a library’s + behavior, each library interface, has three names. Describing those names + and their behavior from the point of view of Zooko’s triangle, which is + not how most Microsoft programmers would describe them or think about + them:

    + +
    1. The GUID, the globally unique identifier, a very large random number, - a number so large that it was unlikely that any two libraries or two - versions would randomly choose the same number. Compiled software - interacts with other compiled software using this identifier.
    2. - + a number so large that it was unlikely that any two libraries or two + versions would randomly choose the same number. Compiled software + interacts with other compiled software using this identifier. +
    3. The nickname, a human readable user friendly name and version number, - which is not necessarily globally unique.  “Nickname” is Zooko’s - terminology, not what Microsoft calls them. Humans writing code to be - interpreted may use the nickname, though the correct behavior would be - for the code writer to use the petname, and for the development - environment to insert the appropriate GUID, if no GUID is specified, and - adjust the petname to its local value if the GUID is specified.
    4. - + which is not necessarily globally unique.  “Nickname” is Zooko’s + terminology, not what Microsoft calls them. Humans writing code to be + interpreted may use the nickname, though the correct behavior would be + for the code writer to use the petname, and for the development + environment to insert the appropriate GUID, if no GUID is specified, and + adjust the petname to its local value if the GUID is specified. +
    5. It may, and should, have a petname, its registry key, a humanly readable user friendly local name which is guaranteed unique on the - particular computer on which the library (ActiveX object) has been - installed, but is not necessarily meaningful to the world at large, - though this is not quite implemented.  Again, petname is Zooko’s - terminology, not what Microsoft calls them.  The petname, if it - exists, is automatically generated from the nickname.  Error - messages should use the petname, though they tend to use the nickname.
    6. -
    - -

    In order for a program to connect to any COM library (what Microsoft - calls an ActiveX object), it has to do protocol negotiation in order to - get an interface, has to ask for the interface by its globally unique - identifier, so the library always knows what version of the library the - program expects, and will provide that behavior, or, if it cannot provide - that behavior, the program will fail immediately with an error message - explaining the problem. 

    - -

    This solution worked. It solved DLL hell, solved bitrot.  -

    - -

    Windows implementation of this solution was less successful in dealing - with another problem – library calls often cross thread and process - boundaries. They provided a general purpose threading solution, also part - of COM, which was hideously complicated and failed dismally.  But - they fixed bitrot. 

    - -

    Cross thread and cross process interactions usually wind up being - implemented as message streams and message queues.  The correct - approach is to make this explicit, to define the interface as a message - protocol, rather than attempting to hide the underlying message queue - behavior as Microsoft did and pretend it is an ordinary synchronous object - method.  Where COM runs on top of message queues, as it does whenever - a call crosses thread or process boundaries, the result is intolerable - obscurity, complexity, and inefficiency – which is still a lot better than - the bitrot that it fixed. 

    - + particular computer on which the library (ActiveX object) has been + installed, but is not necessarily meaningful to the world at large, + though this is not quite implemented.  Again, petname is Zooko’s + terminology, not what Microsoft calls them.  The petname, if it + exists, is automatically generated from the nickname.  Error + messages should use the petname, though they tend to use the nickname. +
+ +

In order for a program to connect to any COM library (what Microsoft + calls an ActiveX object), it has to do protocol negotiation in order to + get an interface, has to ask for the interface by its globally unique + identifier, so the library always knows what version of the library the + program expects, and will provide that behavior, or, if it cannot provide + that behavior, the program will fail immediately with an error message + explaining the problem. 

+ +

This solution worked. It solved DLL hell, solved bitrot.  +

+ +

Windows implementation of this solution was less successful in dealing + with another problem – library calls often cross thread and process + boundaries. They provided a general purpose threading solution, also part + of COM, which was hideously complicated and failed dismally.  But + they fixed bitrot. 

+ +

Cross thread and cross process interactions usually wind up being + implemented as message streams and message queues.  The correct + approach is to make this explicit, to define the interface as a message + protocol, rather than attempting to hide the underlying message queue + behavior as Microsoft did and pretend it is an ordinary synchronous object + method.  Where COM runs on top of message queues, as it does whenever + a call crosses thread or process boundaries, the result is intolerable + obscurity, complexity, and inefficiency – which is still a lot better than + the bitrot that it fixed. 

+

The blockchain solution

- + A pool is a shared collection of transactions with a single schema and protocol, but no global transaction order.

- + A blockchain is a shared collection of transactions with a single schema and protocol with a global order and a sequence number for every transaction. Every blockchain has a pool, and transactions are added from the pool to the blockchain by a process for constructing consensus on order.

- + There will be many blockchains, though we would prefer only one. One is likely to emerge supreme, but there will always be forks and competing blockchains, and forks and competition have to be lived with until they are resolved, which is apt to take a long time.

- + Because establishing a global order is costly, there will be many pools without blockchains. If you don’t need a global order on transactions, don’t pay the costs of constructing one. Usenet was an immensely valuable pool without global order, and it was a great pity that it died. I want to replace it.

- + There will be necessarily be many schemas and many protocols. A blockchain should assign a globally unique arbitrary precision number to each pool, schema, and protocol, but there will be more than one blockchain, and pools outside any one blockchain.

- + Although the number is in principle arbitrary precision, each peer, host, and client will have an arbitrary limit to the precision of the identifiers that they will handle. They have to be able to handle at least sixty three bits, often sixty four bits, and have to be able to fail gracefully with identifiers that exceed their precision. Anything with an identifier that exceeds their precision limit will not exist for them. In practice, most identifiers are likely to less than eight bits.

- + A peer continually checks in full that its blockchain follows or follows from the blockchain of its peers, an operation that is costly. It terminates communication with any peer that is forking. A client treats its host peer’s version of the blockchain is the authoritative one true version of the blockchain.

- + A client necessarily has communications with many peer hosts. If one of its peer hosts has a block number and root hash for that block of the blockchain that is different from that of another peer host, it has to terminate communications with one peer host or the other, and terminate interactions concerning that blockchain with other clients that rely on a peer host with discrepant block for what is purportedly the same blockchain.

- + Every blockchain, every pool, every schema, and every protocol has a short human readable name, but this name is not necessarily globally unique. Indeed, for schemas and protocols, certainly not globally unique, because schemas and protocols are always being updated, and we don’t want to change the name every time, and pools are continually being updated, with no two peers on a pool necessarily having exactly the same pool.

- + A blockchain on one peer is the same as the blockchain on another peer if its root hash is the same, or follows, or follows from, the root hash on the other peer, but for pools, we have no definition of a pool being the same that a computer can check. But a pool has a schema and a protocol, and that the computer can check.

- + Schemas and protocols have version numbers, which are deweydecimal sequences of arbitrary precision integers, but even these are not guaranteed to be globally unique, though any one blockchain may choose to ensure that the list of schemas and protocols for which it provides unique arbitrary precision identifers have globally unique names and deweydecimal numbers.

- + The globally unique identifier of a schema or protocol is a thirty two byte probabilistically unique number, which may be the twenty byte globally unique identifier of a git commit, preceded by as much of the start of the name and the trailing end of the dewey decimal sequence as fits, albeit likely not much fits in twelve bytes.

- + When establishing communication, the setup relies on a hash value that employs the globally unique identifiers of everything relevant to the communication, so that communication will immediately and gracefully fail if the parties establishing communication are in disagreement about what protocols and and schemas they are employing. But first they have to figure out what protocols and schemas the other party is using, relying on identifiers that could potentially have conflicting meanings.

- + When establishing communication in a blockchain context, they rely on blockchain unique arbitrary precision integer identifying the schema or protocol. But there may be no such agreed context, or they may be communicating about a pool that is not on the blockchain, or not on any blockchain, for example a transient pool set up to establish a shared multiparty transaction to mingle crypto currency, which requires a blockchain context, but will not be identified by the blockchain, though it will rely on a schema and protocol that is identified by the blockchain.

- + A transient pool set up to organize a multiparty transaction has a nickname, petname, and deweydecimal number, which deweydecimal is likely to be the number of pools of that name the entity starting the pool has attempted, hence highly likely to not be globally unique, or even blockchain unique. Maybe not even unique to that entity.

- + To identify a pool, a schema, or a protocol in a context where there is no authortative guarantee of unique integer identifier, the parties send a fragment of the probabilistically unique thirty two byte identifier, consisting of a four bit multiple of sixteen bits of offset into that identifier, and sixty bits of the intentifier. Thus each full 256 bit identifier has sixteen possible 64 bit identifers. The parties systematically or randomly change which of the sixteen they use, in order to escape collisions.

- + The parties look up a hash table of recently used 64 bit identifiers, and if that fails, an associative array of sixty four bit identifers. If there is a collision between sixty four bit identifiers, neither of the colliding sixty four bit entries are entered into the associative array, but when a twofiftysix bit identifier is used that was not found in the hash table, all sixteen sixty four bit identifiers go into the hash table, so that a seldom used two hundred and fifty six bit identifier that has a colliding sixty four bit identifier has its colliding identifier masked by a frequently used two hundred and fifty six bit identifier.

- + In the unlikely event that a collision exists in the space of all sixtyfour bit identifiers known to a particular entity in the associative array, it cannot collide in the space of sixtyfour bit recently used identifiers in the hash table.

- + Thus a pool, a schema, a blockchain, or a protocol is identified by its far from unique nickname and petname, its name plus its usually but not necessarily unique deweydecimal number, its globally unique 256 bit identifier, and sixteen sixty four bit identifiers, which are overwhelmingly likely to be unique, but can fail (very very rarely). If the sixtyfour bit identifier fails then the communication fails that one time, but will succeed, with at least fifteen sixteenths probability, another time.

- + In the highly unlikely event that an identifier has a sixty four bit collision with a commonly used identifier, this is a a problem for the less commonly used identifier, since one in sixteen connections will fail. If a hash table has eight thousand entries, corresponding to five hundred commonly used entities, the likelihood of any one randomly generated long identifier having a collision of one of its sixteen short identiers with a commonly used identifier is one in 100 000 000 000 000, which is too low to worry about. Potential collisions between two rarely used identifiers do not matter, because if someone is using a rarely used identifier, it likely to be commonly used identifier for him and the people he is communicating with.

- + The worst case is a collision between two commonly used identifiers, but the more restrictively we define "common" the less likely such a collision. If a group of people are commonly using fifty entities, then the chance that two of those entities have a collision in one of their sixty four bit identifers, resulting in one of their entities leading to communication failure one sixteenth of the time, is one in 30 000 000 000 0000.

- + When setting up a pool for a multi party transaction, the parties initially communicate with each other in a namespace controlled by a single blockchain, hence have blockchain unique identifiers for protocols and schemas, hence the only collision possible is between pools, and there will not be all that many multiparty transactions going at any one time among the people a party is interacting with, though the number of possible multiparty transactions being organized at any one time is potentially very large.

- + If the user is looking for subscrbers to a particular pool among subscribers to a hundred thousand pools, each subscriber subscribing to a hundred pools, it will be enormously rare for him to misidentify a subscriber to a different pool as a subscriber to his own pool and then attempt to communicate with that subscriber, and such misidentification will merely slow things down imperceptibly, not halt things. The communication with that subscriber will simply fail. Failure for other reasons is enormously more probable.

- + Sixtyfour bit identifiers suffice for most practical purposes, provided that the communication protocol is such that misidentification of the corresponding twohundredfiftysix bit identifier results in immediate graceful communication failure.

- + There are some cases where sixty four bits do not suffice, for example identifying a transaction on the blockchain. In such cases, we use the blockchain transaction sequence number, which is globally unique to the blockchain, or the full twofiftysix bit identifier, which is proabilistically unique. An entity in the context of a blockchain is identified by its transaction number, and its output/input number within the transaction, though the blockchain itself is identified merely by a short human readable string, which in the presence of forks and competition, is likely to cause potential misidentification. The sequence number of inputs to a transaction follows, rather than precedes, the sequence number of inputs, which resolves potential ambiguity at an average waste of one bit in the rare case that one references an input, rather than an output.

- +

Fully general solution

- + If there was a consensus on what identifiers were common, we could get away with variable length identifiers. But this leads to the TLA problem. Hard to establish a consensus, hard to know what it is. If you have a system that drifts towards consensus, such as the english language, what drives the drift is that collision problems happen. But you don’t want collision problems to happen, because then you need rather complex code for handling that case, and a complex data structure to describe estimates of what the consensus likely is.

- + So, we have an identifer that establishes an explicit context, a map of probabilistically unique twofiftysix bit identifiers to indefinite precision integers and to short human readable strings. The blockchain provides such a mapping, and the pool references the blockchain. But a pool cannot contain such a mapping, unless it has its own blockchain.

- - + +

These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

+Commons Attribution-Share Alike 3.0 License

diff --git a/docs/block_google_analytics.html b/docs/block_google_analytics.html index a5e2def..6505959 100644 --- a/docs/block_google_analytics.html +++ b/docs/block_google_analytics.html @@ -1,22 +1,22 @@ - - - - Block Google Analytics + + Block Google Analytics To Home page

Block Google Analytics

Most internet sites use Google Analytics, which downloads an enormous pile of javascript on your browser, which systematically probes your system for one thousand and one privacy holes and weaknesses and reports back to Google Analytics, which then shares some of their spy data with the site that surreptitiously downloaded their enormous pile of hostile spy attack code onto your computer.

- + Modify your hosts file to include the following lines:

 0.0.0.0 google-analytics.com
 0.0.0.0 www.google-analytics.com
diff --git a/docs/blockdag_consensus.md b/docs/blockdag_consensus.md
index 02f1294..522a753 100644
--- a/docs/blockdag_consensus.md
+++ b/docs/blockdag_consensus.md
@@ -303,7 +303,7 @@ For a bunch of algorithms that plausibly claim to approach the upload
 limit, see:
 
 * [Scalable and probabilistic leaderless bft consensus through metastability](https://files.avalabs.org/papers/consensus.pdf)
-  
+
   This explains the underlying concept, that a peer looks at the dag,
   make its best guess as to which way consensus is going, and joins
   the seeming consensus, which make it more likely to become the
@@ -361,7 +361,7 @@ limit, see:
   Another blockdag algorithm, but one whose performance has been tested.  Can handle high bandwidth, lots of transactions, and achieves fast Byzantine fault resistant total order consensus in time $O(6λ)$, where λ is the upper bound of the network’s gossip period.
 
 * [Blockchai–free cryptocurrencies: A framework for truly decentralised fast transactions](https://eprint.iacr.org/2016/871.pdf)
-  
+
   These transactions are indeed truly decentralized, fast, and free from
   blocks, assuming all participants download the entire set of
   transactions all the time.
@@ -404,7 +404,7 @@ understood as academic illustrations of the idea of the general algorithm
 for fast and massive blockdag consensus, and not necessarily intended as
 ready to roll implementations of that idea.
 
-Here is an even more vague outline of my variant of this idea, I name 
+Here is an even more vague outline of my variant of this idea, I name
 Yabca “Yet another blockdag consensus algorithm”,
 
 I propose proof of stake.  The stake of a peer is not the stake it owns, but
diff --git a/docs/byzantine_paxos.md b/docs/byzantine_paxos.md
new file mode 100644
index 0000000..000e043
--- /dev/null
+++ b/docs/byzantine_paxos.md
@@ -0,0 +1,644 @@
+---
+# katex
+# notmine
+title: >-
+	Practical Byzantine Fault Tolerance
+---
+
+::: centre
+Appears in the Proceedings of the Third Symposium on Operating Systems Design and Implementation, New Orleans, USA, February 1999
+
+Miguel Castro and Barbara Liskov
+
+Laboratory for Computer Science, Massachusetts Institute of Technology, 545
+
+Technology Square, Cambridge, MA 02139
+:::
+
+# Abstract
+
+This paper describes a new replication algorithm that is able to tolerate Byzantine faults. We believe that Byzantine-fault-tolerant algorithms will be increasingly important in the future because malicious attacks and software errors are increasingly common and can cause faulty nodes to exhibit arbitrary behavior. Whereas previous algorithms assumed a synchronous system or were too slow to be used in practice, the algorithm described in this paper is practical: it works in asynchronous environments like the Internet and incorporates several important optimizations that improve the response time of previous algorithms by more than an order of magnitude. We implemented a Byzantine-fault-tolerant NFS service using our algorithm and measured its performance. The results show that our service is only 3% slower than a standard unreplicated NFS.
+
+# Introduction
+Malicious attacks and software errors are increasingly common. The growing reliance of industry and government on online information services makes malicious attacks more attractive and makes the consequences of successful attacks more serious. In addition, the number of software errors is increasing due to the growth in size and complexity of software. Since malicious attacks and software errors can cause faulty nodes to exhibit Byzantine (i.e., arbitrary) behavior, Byzantine-fault-tolerant algorithms are increasingly important.
+
+This paper presents a new, *practical* algorithm for state machine replication [17, 34] that tolerates Byzantine faults. The algorithm offers both liveness and safety
+provided at most $\lfloor\frac{(n-1)}{3}\rfloor$ out of a total of $n$
+replicas are simultaneously faulty. This means that clients eventually receive replies to their requests and those replies are correct according to linearizability [14, 4]. The algorithm works in asynchronous systems like the Internet and it incorporates important optimizations that enable it to perform efficiently. \
+
+There is a significant body of work on agreement and replication techniques that tolerate Byzantine faults (starting with [19]). However, most earlier work (e.g., [3, 24, 10]) either concerns techniques designed to demonstrate theoretical feasibility that are too inefficient to be used in practice, or assumes synchrony, i.e., relies on known bounds on message delays and process speeds. The systems closest to ours, Rampart [30] and SecureRing [16], were designed to be practical, but they rely on the synchrony assumption for correctness, which is dangerous in the presence of malicious attacks. An attacker may compromise the safety of a service by delaying non-faulty nodes or the communication between them until they are tagged as faulty and excluded from the replica group. Such a denial-of-service attack is generally easier than gaining control over a non-faulty node.
+
+Our algorithm is not vulnerable to this type of attack because it does not rely on synchrony for safety. In addition, it improves the performance of Rampart and SecureRing by more than an order of magnitude as explained in Section 7. It uses only one message round trip to execute read-only operations and two to execute read-write operations. Also, it uses an efficient authentication scheme based on message authentication codes during normal operation; public-key cryptography, which was cited as the major latency [29] and throughput [22] bottleneck in Rampart, is used only when there are faults.
+
+To evaluate our approach, we implemented a replication library and used it to implement a real service: a Byzantine-fault-tolerant distributed file system that supports the NFS protocol. We used the Andrew benchmark [15] to evaluate the performance of our system. The results show that our system is only 3% slower than the standard NFS daemon in the Digital Unix kernel during normal-case operation.
+
+Thus, the paper makes the following contributions:
+
+* It describes the first state-machine replication protocol that correctly survives Byzantine faults in asynchronous networks.
+
+* It describes a number of important optimizations that allow the algorithm to perform well so that it can be used in real systems.
+
+* It describes the implementation of a Byzantine-fault�tolerant distributed file system.
+
+* It provides experimental results that quantify the cost of the replication technique.
+
+The remainder of the paper is organized as follows. We begin by describing our system model, including our failure assumptions. Section 3 describes the problem solved by the algorithm and states correctness conditions. The algorithm is described in Section 4 and some important optimizations are described in Section 5. Section 6 describes our replication library and how we used it to implement a Byzantine-fault-tolerant NFS. Section 7 presents the results of our experiments. Section 8 discusses related work. We conclude with a summary of what we have accomplished and a discussion of future research directions.
+
+# System Model
+
+We assume an asynchronous distributed system where nodes are connected by a network. The network may fail to deliver messages, delay them, duplicate them, or deliver them out of order.
+
+We use a Byzantine failure model, i.e., faulty nodes may behave arbitrarily, subject only to the restriction mentioned below. We assume independent node failures. For this assumption to be true in the presence of malicious attacks, some steps need to be taken, e.g., each node should run different implementations of the service code and operating system and should have a different root password and a different administrator. It is possible to obtain different implementations from the same code base [28] and for low degrees of replication one can buy operating systems from different vendors. N-version programming, i.e., different teams of programmers produce different implementations, is another option for some services.
+
+We use cryptographic techniques to prevent spoofing and replays and to detect corrupted messages. Our messages contain public-key signatures [33], message authentication codes [36], and message digests produced by collision-resistant hash functions [32]. We denote a message $m$ signed by node $i$ as $\{m\}σ_i$
+and the digest of message $m$ by $D(m)$ . We follow the common practice of signing a digest of a message and appending it to the plaintext of the message rather than signing the full message $(\{m\}σ_i)$ should be interpreted in this way$)$. All replicas know the others' public keys to verify signatures.
+
+We allow for a very strong adversary that can coordinate faulty nodes, delay communication, or delay correct nodes in order to cause the most damage to the replicated service. We do assume that the adversary cannot delay correct nodes indefinitely. We also assume that the adversary (and the faulty nodes it controls) are computationally bound so that (with very high probability) it is unable to subvert the cryptographic techniques mentioned above. For example, the adversary cannot produce a valid signature of a non-faulty node, compute the information summarized by a digest from the digest, or fnd two messages with the same digest. The cryptographic techniques we use are thought to have these properties [33, 36, 32].
+
+# Service Properties
+
+Our algorithm can be used to implement any deterministic replicated *service* with a *state* and some *operations*. The operations are not restricted to simple reads or writes of portions of the service state; they can perform arbitrary deterministic computations using the state and operation arguments. Clients issue requests to the replicated service to invoke operations and block waiting for a reply. The replicated service is implemented by $n$ replicas. Clients and replicas are non-faulty if they follow the algorithm in Section 4 and if no attacker can forge their signature.
+
+The algorithm provides both *safety* and *liveness* assuming no more than
+ $\lfloor\frac{(n-1)}{3}\rfloor$ replicas are faulty. Safety means that the replicated service satisfes linearizability [14] (modified to account for Byzantine-faulty clients [4]): it behaves like a centralized implementation that executes operations atomically one at a time. Safety requires the bound on the number of faulty replicas because a faulty replica can behave arbitrarily, e.g., it can destroy its state.
+
+ Safety is provided regardless of how many faulty clients are using the service (even if they collude with faulty replicas): all operations performed by faulty clients are observed in a consistent way by non-faulty clients. In particular, if the service operations are designed to preserve some invariants on the service state, faulty clients cannot break those invariants.
+
+The safety property is insufficient to guard against faulty clients, e.g., in a file system a faulty client can write garbage data to some shared file. However, we limit the amount of damage a faulty client can do by providing access control: we authenticate clients and deny access if the client issuing a request does not have the right to invoke the operation. Also, services may provide operations to change the access permissions for a client. Since the algorithm ensures that the effects of access revocation operations are observed consistently by all clients, this provides a powerful mechanism to recover from attacks by faulty clients.
+
+The algorithm does not rely on synchrony to provide safety. Therefore, it must rely on synchrony to provide liveness; otherwise it could be used to implement consensus in an asynchronous system, which is not possible [9]. We guarantee liveness, i.e., clients eventually receive replies to their requests, provided at most $\lfloor\frac{(n-1)}{3}\rfloor$ replicas are faulty and $delay(t)$  does not grow faster than $t$ indefinitely. Here, delay is the time between the moment when a message is sent for the first time and the moment when it is received by its destination (assuming the sender keeps retransmitting the message until it is received). (A more precise definition can be found in [4].) This is a rather weak synchrony assumption that is likely to be true in any real system provided network faults are eventually repaired, yet it enables us to circumvent the impossibility result in [9].
+
+The resiliency of our algorithm is optimal: $3f+1$ is the minimum number of replicas that allow an asynchronous system to provide the safety and liveness properties when up to $f$ replicas are faulty (see [2] for a proof). This many replicas are needed because it must be possible to proceed after communicating with $n-f$ replicas, since $f$ replicas might be faulty and not responding. However, it is possible that the replicas that did not respond are not faulty and, therefore, $f$ of those that responded might be faulty. Even so, there must still be enough responses that those from non-faulty replicas outnumber those from faulty ones, i.e., $n-2f>f$. Therefore $n>3f$.
+
+The algorithm does not address the problem of fault-tolerant privacy: a faulty replica may leak information to an attacker. It is not feasible to offer fault-tolerant privacy in the general case because service operations may perform arbitrary computations using their arguments and the service state; replicas need this information in the clear to execute such operations efficiently. It is possible to use secret sharing schemes [35] to obtain privacy even in the presence of a threshold of malicious replicas [13] for the arguments and portions of the state that are opaque to the service operations. We plan to investigate these techniques in the future.
+
+# The Algorithm
+
+Our algorithm is a form of ${state}\, {machine}$ replication [17, 34]: the service is modelled as a state machine that is replicated across different nodes in a distributed system. Each state machine replica maintains the service state and implements the service operations. We denote the set of replicas by $R$ and identify each replica using an integer in $\{0, ..., |R|-1\}$. For simplicity, we assume
+$|R|=3f+1$
+where $f$ is the maximum number of replicas that may be faulty; although there could be more than $3f+1$
+replicas, the additional replicas degrade performance (since more and bigger messages are being exchanged) without providing improved resiliency.
+
+The replicas move through a succession of configurations called views. In a view one replica is the primary and the others are backups. Views are numbered consecutively. The primary of a view is replica $p$ such that $p=v\mod|R|$, where $v$
+is the view number. View changes are carried out when it appears that the primary has failed. View stamped Replication [26] and Paxos [18] used a similar approach to tolerate benign faults (as discussed in Section 8.)
+
+The algorithm works roughly as follows:
+
+1. A client sends a request to invoke a service operation to the primary
+
+1. The primary multicasts the request to the backups
+
+1. Replicas execute the request and send a reply to the client
+
+1. The client waits for $f+1$ replies from different replicas with the same result; this is the result of the operation.
+
+Like all state machine replication techniques [34], we impose two requirements on replicas: they must be *deterministic* (i.e., the execution of an operation in a given state and with a given set of arguments must always produce the same result) and they must start in the same state. Given these two requirements, the algorithm ensures the safety property by guaranteeing that *all non-faulty replicas agree on a total order for the execution of requests despite failures*.
+
+The remainder of this section describes a simplified version of the algorithm. We omit discussion of how nodes recover from faults due to lack of space. We also omit details related to message retransmissions. Furthermore, we assume that message authentication is achieved using digital signatures rather than the more efficient scheme based on message authentication codes; Section 5 discusses this issue further. A detailed formalization of the algorithm using the I/O automaton model [21] is presented in [4].
+
+## The Client
+
+A client  $c$ requests the execution of state machine operation $o$ by sending\
+$\{$REQUEST$,o,t,c\}σ_i$
+message to the primary. Timestamp $t$
+is used to ensure *exactly-once* semantics for the execution of client requests. Timestamps for
+$c$'s requests are totally ordered such that later requests have higher timestamps than earlier ones; for example, the timestamp could be the value of the client's local clock when the request is issued.
+
+Each message sent by the replicas to the client includes the current view number, allowing the client to track the view and hence the current primary. A client sends a request to what it believes is the current primary using a point-to-point message. The primary atomically multicasts the request to all the backups using the protocol described in the next section.
+
+A replica sends the reply to the request directly to the client. The reply has the form\
+$\{$REPLY$, v, t, c, i, r\}σ_i$ where $v$
+is the current view number,
+$t$ is the timestamp of the corresponding request,
+$i$ is the replica number, and
+$r$ is the result of executing the requested operation.
+
+The client waits for
+$f+1$ replies with valid signatures from different replicas, and with the same $t$ and $r$ before accepting the result $r$. This ensures that the result is valid, since at most $f$ replicas can be faulty.
+
+If the client does not receive replies soon enough, it broadcasts the request to all replicas. If the request has already been processed, the replicas simply re-send the reply; replicas remember the last reply message they sent to each client. Otherwise, if the replica is not the primary, it relays the request to the primary. If the primary does not multicast the request to the group, it will eventually be suspected to be faulty by enough replicas to cause a view change.
+
+In this paper we assume that the client waits for one request to complete before sending the next one. But we can allow a client to make asynchronous requests, yet preserve ordering constraints on them.
+
+## Normal-Case Operation
+
+The state of each replica includes the state of the service, a $message\,log$ containing messages the replica has accepted, and an integer denoting the replica's current view. We describe how to truncate the log in Section 5.3.
+
+When the primary, $p$
+, receives a client request, $m$
+, it starts a three-phase protocol to atomically multicast the request to the replicas. The primary starts the protocol immediately unless the number of messages for which the protocol is in progress exceeds a given maximum. In this case, it buffers the request. Buffered requests are multicast later as a group to cut down on message traffic and CPU overheads under heavy load;this optimization is similar to a group commit in transactional systems [11]. For simplicity, we ignore this optimization in the description below.
+
+The three phases are *pre-prepare, prepare*, and *commit*. The pre-prepare and prepare phases are used to totally order requests sent in the same view even when the primary, which proposes the ordering of requests, is faulty. The prepare and commit phases are used to ensure that requests that commit are totally ordered across views.
+
+In the pre-prepare phase, the primary assigns a sequence number, $n$
+, to the request, multicasts a pre-prepare message with $m$
+piggybacked to all the backups, and appends the message to its log. The message has the form $\{\{$PRE-PREPARE$, v, n, d\}σ_i,m\}$, where $v$ indicates the view in which the message is being sent,
+$m$ is the client's request message, and
+is $d$ is $m$'s digest.
+
+Requests are not included in pre-prepare messages to keep them small. This is important because pre-prepare messages are used as a proof that the request was assigned sequence number $n$
+in view $v$
+in view changes. Additionally, it decouples the protocol to totally order requests from the protocol to transmit the request to the replicas; allowing us to use a transport optimized for small messages for protocol messages and a transport optimized for large messages for large requests.
+
+A backup accepts a pre-prepare message provided:
+
+* the signatures in the request and the pre-prepare message are correct and
+$d$ is the digest for $m$:
+* it is in view $v$:
+* it has not accepted a pre-prepare message for view $v$ and sequence number $n$
+containing a different digest;
+* the sequence number in the pre-prepare message is between a low water mark, $h$
+, and a high water mark, $H$.
+
+The last condition prevents a faulty primary from exhausting the space of sequence numbers by selecting a very large one. We discuss how $H$ and $h$
+advance in Section 5.3.
+
+If backup $i$
+accepts the $\{$PRE-PREPARE$, v, n, d\}σ_i,m\}$
+message, it enters the prepare phase by multicasting a\
+$\{$PREPARE$,v,n,d,i\}σ_i$
+message to all other replicas and adds both messages to its log. Otherwise, it does nothing.
+
+A replica (including the primary) accepts prepare messages and adds them to its log provided their signatures are correct, their view number equals the replica's current view, and their sequence number is between $h$
+and $H$.
+
+We define the predicate *prepared*$(m,v,n,i)$
+to be true if and only if replica $i$
+has inserted in its log: the request $m$, a pre-prepare for $m$
+in view $v$
+with sequence number $n$
+, and $2f$
+prepares from different backups that match the pre-prepare. The replicas verify whether the prepares match the pre-prepare by checking that they have the same view, sequence number, and digest.
+
+The pre-prepare and prepare phases of the algorithm guarantee that non-faulty replicas agree on a total order for the requests within a view. More precisely, they ensure the following invariant: if *prepared*$(m,v,n,i)$
+is true then *prepared*$(m',v,n,j)$
+is false for any non-faulty replica $j$
+(including $i=j$) and any $m'$
+such that  $D(m')\not =D(m)$. This is true because prepared  *prepared*$(m,v,n,i)$
+and $|R|=3f+1$ imply that at least $f+1$ non-faulty replicas have sent a pre-prepare or prepare for $m$
+in view $v$
+with sequence number $n$. Thus, for *prepared*$(m',v,n,j)$ to be true at least one of these replicas needs to have sent two conflicting prepares (or pre-prepares if it is the primary for $v$), i.e., two prepares with the same view and sequence number and a different digest. But this is not possible because the replica is not faulty. Finally, our assumption about the strength of message digests ensures that the probability that $m\not=m'$ and $D(m)=D(m')$
+is negligible.
+
+Replica $i$ multicasts a $\{$COMMIT$,v,n,D(m),i\}σ_i$ to the other replicas when *prepared*$(m',v,n,i)$ becomes true. This starts the commit phase. Replicas accept commit messages and insert them in their log provided they are properly signed, the view number in the message is equal to the replica's current view, and the sequence number is between $h$ and $H$.
+
+We define the *committed* and *committed-local* predicates as follows: *committed*$(m,v,n,i)$
+is true if and only if *prepared*$(m,v,n,i)$
+is true for all $i$
+in some set of $f+1$ non-faulty replicas; and *committed-local*$(m,v,n,i)$ is true if and only if *prepared*$(m,v,n,i)$
+is true and $i$
+has accepted $2f+1$ commits (possibly including its own) from different replicas that match the pre-prepare for
+$m$; a commit matches a pre-prepare if they have the same view, sequence number, and digest.
+
+The commit phase ensures the following invariant: if *committed-local*$(m,v,n,i)$
+is true for some non-faulty $i$ then *committed*$(m,v,n,i)$
+is true. This invariant and the view-change protocol described in Section 5.4 ensure that non-faulty replicas agree on the sequence numbers of requests that commit locally even if they commit in different views at each replica. Furthermore, it ensures that any request that commits locally at a non-faulty replica will commit at
+$f+1$ or more non-faulty replicas eventually.
+
+Each replica $i$
+executes the operation requested by $m$ after *committed-local*$(m,v,n,i)$
+is true and
+$i$'s state reflects the sequential execution of all requests with lower sequence numbers. This ensures that all non-faulty replicas execute requests in the same order as required to provide the safety property. After executing the requested operation, replicas send a reply to the client. Replicas discard requests whose timestamp is lower than the timestamp in the last reply they sent to the client to guarantee exactly-once semantics.
+
+We do not rely on ordered message delivery, and therefore it is possible for a replica to commit requests out of order. This does not matter since it keeps the pre-prepare, prepare, and commit messages logged until the corresponding request can be executed.
+
+Figure 1 shows the operation of the algorithm in the normal case of no primary faults. Replica 0 is the primary,
+
+![Normal Case Operation](./images/practical_byzantine_consensus_fig_1.webp){width=100%}
+
+## Garbage Collection
+
+This section discusses the mechanism used to discard messages from the log. For the safety condition to hold, messages must be kept in a replica's log until it knows that the requests they concern have been executed by at least $f+1$ non-faulty replicas and it can prove this to others in view changes. In addition, if some replica misses messages that were discarded by all non-faulty replicas, it will need to be brought up to date by transferring all or a portion of the service state. Therefore, replicas also need some proof that the state is correct.
+
+Generating
+these proofs after executing every operation would be expensive. Instead, they are generated periodically, when a request with a sequence number divisible by some constant (e.g., 100) is executed. We will refer to the states produced by the execution of these requests as *checkpoints* and we will say that a checkpoint with a proof is a *stable checkpoint*.
+
+A replica maintains several logical copies of the service state: the last stable checkpoint, zero or more checkpoints that are not stable, and a current state. Copy-on-write techniques can be used to reduce the space overhead to store the extra copies of the state, as discussed in Section 7.3.
+
+The proof of correctness for a checkpoint is generated as follows. When a replica
+produces a checkpoint, it multicasts a message
+$\{$CHECKPOINT$,n,d,i\}σ_i$
+to the other replicas, where $n$ is the sequence number of the last request whose execution is reflected in the state and $d$
+is the digest of the state. Each replica collects checkpoint messages in its log until it has $2f+1$ of them for sequence number $n$
+with the same digest signed by different replicas (including possibly its own such message). These $2f+1$ messages are the proof of correctness for the checkpoint.
+
+A checkpoint with a proof becomes stable and the replica discards all pre-prepare, prepare, and commit messages with sequence number less than or equal to
+$n$ from its log; it also discards all earlier checkpoints and checkpoint messages.
+requests.
+
+Computing the proofs is efficient because the digest
+can be computed using incremental cryptography [1] as
+discussed in Section 7.3, and proofs are generated rarely.
+The checkpoint protocol is used to advance the low
+and high water marks (which limit what messages will
+be accepted). The low-water mark $h$ is equal to the
+sequence number of the last stable checkpoint. The high
+water mark , $H=h+k$, where $k$ is big enough so that
+replicas do not stall waiting for a checkpoint to become
+stable. For example, if checkpoints are taken every 100
+requests, $k$ might be 200.
+
+## View Changes
+
+The view-change protocol provides liveness by allowing the system to make progress when the primary fails. View changes are triggered by timeouts that prevent backups from waiting indefinitely for requests to execute. A backup is *waiting* for a request if it received a valid request and has not executed it. A backup starts a timer when it receives a request and the timer is not already running. It stops the timer when it is no longer waiting to execute the request, but restarts it if at that point it is waiting to execute some other request.
+
+If the timer of backup $i$ expires in view $v$, the backup starts a view change to move the system to view $v+1$. It stops accepting messages (other than checkpoint, view-change, and new-view messages) and multicasts a $\{$VIEW-CHANGE$,v+1,n,C,P,i\}σ_i$ message to all replicas. Here $n$ is the sequence number of the last stable checkpoint $s$ known to , $C$ is a set of $2f+1$ valid checkpoint messages proving the correctness of , and $P$
+is a set containing a set $P_m$ for each request that $m$ prepared at $i$ with a sequence number higher than $n$. Each set $P_m$  contains a valid pre-prepare message (without the corresponding client message) and $2f$ matching, valid prepare messages signed by different backups with the same view, sequence number, and the digest of  $m$.
+
+When the primary  $p$ of view  $v+1$ receives $2f$  valid
+view-change messages for view  $v+1$ from other replicas,
+it multicasts a   $\{$NEW-VIEW$,v+1,n,V,O\}σ_i$  message to all
+other replicas, where $V$ is a set containing the valid view-change messages received by the primary plus the view-change message for $v+1$ the primary sent (or would have sent), and $O$ is a set of pre-prepare messages (without the piggybacked request). $O$is computed as follows:
+
+1. The primary determines the sequence number *min-s* of the latest stable checkpoint in $V$ and the highest sequence number *max-s* in a prepare message in .
+
+1. The primary creates a new pre-prepare message for view $v+1$ for each sequence number $n$ between *min-s* and *max-s*. There are two cases: (1) there is at least one set in the $P$ component of some view-change message in $V$with sequence number , or (2) there is no such set. In the first case, the primary creates a new message $\{$ PRE-PREPARE,v+1,n,d\}σ_p$, where $d$
+is the request digest in the pre-prepare message for sequence number $n$ with the highest view number in $V$. In the second case, it creates a new pre-prepare message $\{$ PRE-PREPARE$,v+1,n,d^{null}\}σ_p$, where $d^{null}$ is the digest of a special *null* request; a null request goes through the protocol like other requests, but its execution is a no-op. (Paxos [18] used a similar technique to fill in gaps.)
+
+Next the primary appends the messages in $O$ to its log. If *min-s* is greater than the sequence number of its latest stable checkpoint, the primary also inserts the proof of stability for the checkpoint with sequence number *min-s* in its log, and discards information from the log as discussed in Section 5.3. Then it enters view $v+1$: at this point it is able to accept messages for view $v+1$.
+
+A backup accepts a new-view message for view $v+1$ if it is signed properly, if the view-change messages it contains are valid for view $v+1$, and if the set
+is correct; it verifies the correctness of $O$
+by performing a computation similar to the one used by the primary to create $O$.
+Then it adds the new information to its log as described for the primary, multicasts a prepare for each message in $O$
+to all the other replicas, adds these prepares to its log, and enters view $v+1$.
+
+Thereafter, the protocol proceeds as described in Section 5.2. Replicas
+redo the protocol for messages between *min-s* and *max-s* but they avoid
+re-executing client requests (by using their stored information about the
+last reply sent to each client).
+
+ A replica may be missing some request message $m$ or a stable checkpoint (since these are not sent in new-view messages.) It can obtain missing information from another replica. For example, replica $i$
+can obtain a missing checkpoint state $S$
+from one of the replicas whose checkpoint messages certified its correctness
+in $V$. Since
+$f+$1 of those replicas are correct, replica $i$
+will always obtain $S$
+or a later certified stable checkpoint. We can avoid sending the entire checkpoint by partitioning the state and stamping each partition with the sequence number of the last request that modified it. To bring a replica up to date, it is only necessary to send it the partitions where it is out of date, rather than the whole checkpoint.
+
+## Correctness
+This section sketches the proof that the algorithm provides safety and liveness; details can be found in [4].
+
+### Safety
+
+As discussed earlier, the algorithm provides safety if all non-faulty replicas agree on the sequence numbers of requests that commit locally.
+
+In Section 5.2, we showed that if *prepared*$(m,v,n,i)$ is true,
+*prepared*$(m',v,n,j)$
+is false for any non-faulty replica $j$
+(including $i=j$) and any $m'$
+such that $D(m')\not=D(m)$. This implies that two non-faulty replicas agree on the sequence number of requests that commit locally in the same view at the two replicas.
+
+The view-change protocol ensures that non-faulty replicas also agree on the sequence number of requests that commit locally in different views at different replicas. A request $m$
+commits locally at a non-faulty replica with sequence number $n$
+in view $v$
+only if *committed*$(m,v,n)$ is true. This means that there is a set $R_1$
+containing at least 1 non-faulty replicas such that *prepared*$(m,v,n,i)$ is true for every replica
+in the set.
+
+Non-faulty replicas will not accept a pre-prepare for view $v'\gt v$
+without having received a new-view message for
+(since only at that point do they enter the view). But any correct new-view message for view $v'\gt v$
+contains correct view-change messages from every replica $i$
+in a
+set
+$R_2$ of $2f+1$ replicas. Since there are $3f+1$ replicas, $R_1$ and
+$R_2$ must intersect in at least one replica $k$
+that is not faulty.
+$k$'s view-change message will ensure that the fact that
+prepared in a previous view is propagated to subsequent views, unless the new-view message contains a view-change message with a stable checkpoint with a sequence number higher than $n$.
+In the first case, the algorithm redoes the three phases of the atomic multicast protocol for $m$
+with the same sequence number $n$
+and the new view number. This is important because it prevents any different request that was assigned the sequence number $n$
+in a previous view from ever committing. In the second case no replica in the new view will accept any message with sequence number lower than $n$.
+In either case, the replicas will agree on the request that commits locally with sequence number $n$.
+
+### Liveness
+
+To provide liveness, replicas must move to a new view if they are unable to execute a request. But it is important to maximize the period of time when at least $2f+1$ non-faulty replicas are in the same view, and to ensure that this period of time increases exponentially until some requested operation executes. We achieve these goals by three means.
+
+First, to avoid starting a view change too soon, a replica that multicasts
+a view-change message for view $v+1 waits for $2f+1$ view-change messages for view $v+1$ and then starts its timer to expire after some time $T$.
+If the timer expires before it receives a valid new-view message for
+$v+1$ or before it executes a request in the new view that it had not executed previously, it starts the view change for view $v+2$
+but this time it will wait $2T$ before starting a view change for view
+$v+3$.
+
+Second, if a replica receives a set of $f+1$ valid view-change messages from other replicas for views greater than its current view, it sends a view-change message for the smallest view in the set, even if its timer has not expired; this prevents it from starting the next view change too late.
+
+Third, faulty replicas are unable to impede progress by forcing frequent view changes. A faulty replica cannot cause a view change by sending a view-change message, because a view change will happen only if at least
+$f+1$ replicas send view-change messages, but it can cause a view change when it is the primary (by not sending messages or sending bad messages). However, because the primary of view $v$
+is the replica $p$
+such that $p=v\mod|R|$, the primary cannot be faulty for more than
+consecutive $f$ views.
+
+These three techniques guarantee liveness unless message delays grow faster than the timeout period indefinitely, which is unlikely in a real system.
+
+## Non-Determinism
+
+State machine replicas must be deterministic but many services involve some form of non-determinism. For example, the time-last-modified in NFS is set by reading the server's local clock; if this were done independently at each replica, the states of non-faulty replicas would diverge. Therefore, some mechanism to ensure that all replicas select the same value is needed. In general, the client cannot select the value because it does not have enough information; for example, it does not know how its request will be ordered relative to concurrent requests by other clients. Instead, the primary needs to select the value either independently or based on values provided by the backups.
+
+If the primary selects the non-deterministic value independently, it concatenates the value with the associated request and executes the three phase protocol to ensure that non-faulty replicas agree on a sequence number for the request and value. This prevents a faulty primary from causing replica state to diverge by sending different values to different replicas. However, a faulty primary might send the same, incorrect, value to all replicas. Therefore, replicas must be able to decide deterministically whether the value is correct (and what to do if it is not) based only on the service state.
+
+This protocol is adequate for most services (including NFS) but
+occasionally replicas must participate in selecting the value to satisfy a
+service's specification. This can be accomplished by adding an extra phase
+to the protocol: the primary obtains authenticated values proposed by the
+backups, concatenates $2f+1$ of them with the associated request, and
+starts the three phase protocol for the concatenated message. Replicas
+choose the value by a deterministic computation on the $2f+1$ value and
+their state, e.g., taking the median. The extra phase can be optimized away
+in the common case. For example, if replicas need a value that is "close enough" to that of their local clock, the extra phase can be avoided when their clocks are synchronized within some delta.
+
+# Optimizations
+
+This section describes some optimizations that improve the performance of the algorithm during normal-case operation. All the optimizations preserve the liveness and safety properties.
+
+## Reducing Communication
+
+We use three optimizations to reduce the cost of communication. The first avoids sending most large replies. A client request designates a replica to send the result; all other replicas send replies containing just the digest of the result. The digests allow the client to check the correctness of the result while reducing network bandwidth consumption and CPU overhead significantly for large replies. If the client does not receive a correct result from the designated replica, it retransmits the request as usual, requesting all replicas to send full replies.
+
+The second optimization reduces the number of message delays for an operation invocation from 5 to 4. Replicas execute a request *tentatively* as soon as the prepared predicate holds for the request, their state reflects the execution of all requests with lower sequence number, and these requests are all known to have committed. After executing the request, the replicas send tentative replies to the client. The client waits for $2f+1$ matching tentative replies. If it receives this
+many, the request is guaranteed to commit eventually. Otherwise, the client retransmits the request and waits for $f+1$ non-tentative replies.
+
+A request that has executed tentatively may abort if there is a view change and it is replaced by a null request. In this case the replica reverts its state to the last stable checkpoint in the new-view message or to its last checkpointed state (depending on which one has the higher sequence number).
+
+The third optimization improves the performance of read-only operations that do not modify the service state. A client multicasts a read-only request to all replicas. Replicas execute the request immediately in their tentative state after checking that the request is properly authenticated, that the client has access, and that the request is in fact read-only. They send the reply only after all requests refected in the tentative state have committed; this is necessary to prevent the client from observing uncommitted state. The client waits for $2f+1$ replies from different replicas with the same result.
+The client may be unable to collect $2f+1$ such replies if there are concurrent writes to data that affect the result; in this case, it retransmits the request as a regular read-write request after its retransmission timer expires.
+
+## Cryptography
+
+In Section 5, we described an algorithm that uses digital signatures to authenticate all messages. However, we actually use digital signatures only for view-change and new-view messages, which are sent rarely, and authenticate all other messages using message authentication codes (MACs). This eliminates the main performance bottleneck in previous systems [29, 22].
+
+However, MACs have a fundamental limitation relative to digital signatures -- the inability to prove that a message is authentic to a third party. The algorithm in Section 5 and previous Byzantine-fault-tolerant algorithms [31, 16] for state machine replication rely on the extra power of digital signatures. We modified our algorithm to circumvent the problem by taking advantage of specific invariants, e.g, the invariant
+that no two different requests prepare with the same view and sequence number at two non-faulty replicas.
+The modified algorithm is described in [5]. Here we sketch the main implications of using MACs.
+
+MACs can be computed three orders of magnitude faster than digital signatures. For example, a 200MHz Pentium Pro takes 43ms to generate a 1024-bit modulus RSA signature of an MD5 digest and 0.6ms to verify the signature [37], whereas it takes only 10.3µs
+s to compute the MAC of a 64-byte message on the same hardware in our implementation. There are other public-key cryptosystems that generate signatures faster, e.g., elliptic curve public-key cryptosystems, but signature verification is slower [37] and in our algorithm each signature is verified many times.
+
+Each node (including active clients) shares a 16-byte secret session key with each replica. We compute message authentication codes by applying MD5 to the concatenation of the message with the secret key. Rather than using the 16 bytes of the final MD5 digest, we use only the 10 least significant bytes. This truncation has the obvious advantage of reducing the size of MACs and it also improves their resilience to certain attacks [27]. This is a variant of the secret suffix method [36], which is secure as long as MD5 is collision resistant [27, 8].
+
+The digital signature in a reply message is replaced by a single MAC, which is sufficient because these messages have a single intended recipient. The signatures in all other messages (including client requests but excluding view changes) are replaced by vectors of MACs that we call authenticators. An authenticator has an entry for every replica other than the sender; each entry is the MAC computed with the key shared by the sender and the replica corresponding to the entry.
+
+The time to verify an authenticator is constant but the time to generate one grows linearly with the number of replicas. This is not a problem because we do not expect to have a large number of replicas and there is a huge performance gap between MAC and digital signature computation. Furthermore, we compute authenticators efficiently; MD5 is applied to the message once and the resulting context is used to compute each vector entry by applying MD5 to the corresponding session key. For example, in a system with 37 replicas (i.e., a system that can tolerate 12 simultaneous faults) an authenticator can still be computed much more than two orders of magnitude faster than a 1024-bit modulus RSA signature.
+
+The size of authenticators grows linearly with the number of replicas but it grows slowly: it is equal to $30*\lfloor\frac{n-1)}{3}\rfloor$ bytes. An authenticator is
+smaller than an RSA signature with a 1024-bit modulus for
+$n\le13$ (i.e., systems that can tolerate up to 4 simultaneous faults), which we expect to be true in most configurations.
+
+# Implementation
+
+This section describes our implementation. First we discuss the replication library, which can be used as a basis for any replicated service. In Section 7.2 we describe how we implemented a replicated NFS on top of the replication library. Then we describe how we maintain checkpoints and compute checkpoint digests efficiently.
+
+## The Replication Library
+
+The client interface to the replication library consists of a single procedure, *invoke*, with one argument, an input buffer containing a request to invoke a state machine operation. The *invoke* procedure uses our protocol to execute the requested operation at the replicas and select the correct reply from among the replies of the individual replicas. It returns a pointer to a buffer containing the operation result.
+
+On the server side, the replication code makes a number of upcalls to procedures that the server part of the application must implement. There are procedures to execute requests (*execute*), to maintain checkpoints of the service state (*make checkpoint, delete checkpoint)8, to obtain the digest of a specifIed checkpoint (*get digest*), and to obtain missing information (*get checkpoint, set checkpoint*).
+The *execute* procedure receives as input a buffer containing the requested operation, executes the operation, and places the result in an output buffer. The other procedures are discussed further in Sections 7.3 and 7.4.
+
+Point-to-point communication between nodes is implemented using UDP, and multicast to the group of replicas is implemented using UDP over IP multicast [7]. There is a single IP multicast group for each service, which contains all the replicas. These communication protocols are unreliable; they may duplicate or lose messages or deliver them out of order.
+
+The algorithm tolerates out-of-order delivery and rejects duplicates. View changes can be used to recover from lost messages, but this is expensive and therefore it is important to perform retransmissions. During normal operation recovery from lost messages is driven by the receiver: backups send negative acknowledgments to the primary when they are out of date and the primary retransmits pre-prepare messages after a long timeout. A reply to a negative acknowledgment may include both a portion of a stable checkpoint and missing messages. During view changes, replicas retransmit view-change messages until they receive a matching new-view message or they move on to a later view.
+
+The replication library does not implement view changes or retransmissions at present. This does not compromise the accuracy of the results given in Section 7 because the rest of the algorithm is completely implemented (including the manipulation of the timers that trigger view changes) and because we have formalized the complete algorithm and proved its correctness [4].
+
+## BFS: A Byzantine-Fault-tolerant File System
+
+We implemented BFS, a Byzantine-fault-tolerant NFS service, using the replication library. Figure 2 shows the architecture of BFS. We opted not to modify the kernel NFS client and server because we did not have the sources for the Digital Unix kernel.
+
+A file system exported by the fault-tolerant NFS service is mounted on the client machine like any regular NFS file system. Application processes run unmodified and interact with the mounted file system through the NFS client in the kernel. We rely on user level relay processes to mediate communication between the standard NFS client and the replicas. A relay receives NFS protocol requests, calls the invoke procedure of our replication library, and sends the result back to the NFS client.
+
+![Replicated File System Architecture](./images/practical_byzantine_consensus_fig_2.webp){width=100%}
+
+Each replica runs a user-level process with the replication library and our NFS V2 daemon, which we will refer to as *snfsd* (for simple *nfsd*). The replication library receives requests from the relay, interacts with *snfsd* by making upcalls, and packages NFS replies into replication protocol replies that it sends to the relay.
+
+We implemented *snfsd* using a fixed-size memory-mapped file. All the file system data structures, e.g., inodes, blocks and their free lists, are in the mapped file. We rely on the operating system to manage the cache of memory-mapped file pages and to write modified pages to disk asynchronously. The current implementation uses 8KB blocks and inodes contain the NFS status information plus 256 bytes of data, which is used to store directory entries in directories, pointers to blocks in files, and text in symbolic links. Directories and files may also use indirect blocks in a way similar to Unix.
+
+Our implementation ensures that all state machine replicas start in the same initial state and are deterministic, which are necessary conditions for the correctness of a service implemented using our protocol. The primary proposes the values for time-last-modified and time-last-accessed, and replicas select the larger of the proposed value and one greater than the maximum of all values selected for earlier requests. We do not require synchronous writes to implement NFS V2 protocol semantics because BFS achieves stability of modified data and meta-data through replication [20].
+
+## Maintaining Checkpoints
+
+This section describes how *snfsd* maintains checkpoints of the file system state. Recall that each replica maintains several logical copies of the state: the current state, some number of checkpoints that are not yet stable, and the last stable checkpoint.
+
+*snfsd* executes file system operations directly in the memory mapped file to preserve locality,and it uses copy-on-write to reduce the space and time overhead associated with maintaining checkpoints. *snfsd* maintains a copy-on-write bit for every 512-byte block in the memory mapped file. When the replication code invokes the *make_checkpoint* upcall, *snfsd* sets all the copy-on-write bits and creates a (volatile) checkpoint record, containing the current sequence number, which it receives as an argument to the upcall, and a list of blocks. This list contains the copies of the blocks that were modified since the checkpoint was taken, and therefore, it is initially empty. The record also contains the digest of the current state; we discuss how the digest is computed in Section 7.4.
+
+When a block of the memory mapped file is modified while executing a client request, *snfsd* checks the copy-on-write bit for the block and, if it is set, stores the block's current contents and its identifier in the checkpoint record for the last checkpoint. Then, it overwrites the block with its new value and resets its copy-on-write bit. *snfsd* retains a checkpoint record until told to discard it via a delete checkpoint upcall, which is made by the replication code when a later checkpoint becomes stable.
+
+If the replication code requires a checkpoint to send to another replica, it calls the get checkpoint upcall. To obtain the value for a block, *snfsd* first searches for the block in the checkpoint record of the stable checkpoint, and then searches the checkpoint records of any later checkpoints. If the block is not in any checkpoint record, it returns the value from the current state.
+The use of the copy-on-write technique and the fact that we keep at most 2 checkpoints ensure that the space and time overheads of keeping several logical copies of the state are low. For example, in the Andrew benchmark experiments described in Section 7, the average checkpoint record size is only 182 blocks with a maximum of 500.
+
+## Computing Checkpoint Digests
+
+*snfsd* computes a digest of a checkpoint state as part of a make checkpoint upcall. Although checkpoints are only taken occasionally, it is important to compute the state digest incrementally because the state may be large. *snfsd* uses an incremental collision-resistant one-way hash function called AdHash [1]. This function divides the state into fixed-size blocks and uses some other hash function (e.g., MD5) to compute the digest of the string obtained by concatenating the block index with the block value for each block. The digest of the state is the sum of the digests of the blocks modulo some large integer. In our current implementation, we use the 512-byte blocks from the copy-on-write technique and compute their digest using MD5.
+
+To compute the digest for the state incrementally, *snfsd* maintains a table with a hash value for each 512-byte block. This hash value is obtained by applying MD5 to the block index concatenated with the block value at the time of the last checkpoint. When make checkpoint is called, *snfsd* obtains the digest $d$
+for the previous checkpoint state (from the associated checkpoint record). It computes new hash values for each block whose copy-on-write bit is reset by applying MD5 to the block index concatenated with the current block value. Then, it adds the new hash value to $d$, subtracts the old hash value from $d$, and updates the table to contain the new hash value. This process is efficient provided the number of modified blocks is small; as mentioned above, on average 182 blocks are modified per checkpoint for the Andrew benchmark.
+
+# Performance Evaluation
+
+This section evaluates the performance of our system using two benchmarks: a micro-benchmark and the Andrew benchmark [15]. The micro-benchmark provides a service-independent evaluation of the performance of the replication library; it measures the latency to invoke a null operation, i.e., an operation that does nothing.
+
+The Andrew benchmark is used to compare BFS with two other file systems: one is the NFS V2 implementation in Digital Unix, and the other is identical to BFS except without replication. The first comparison demonstrates that our system is practical by showing that its latency is similar to the latency of a commercial system that is used daily by many users. The second comparison allows us to evaluate the overhead of our algorithm accurately within an implementation of a real service.
+
+## Experimental Setup
+
+The experiments measure normal-case behavior (i.e., there are no view changes), because this is the behavior that determines the performance of the system. All experiments ran with one client running two relay processes, and four replicas. Four replicas can tolerate one Byzantine fault; we expect this reliability level to suffice for most applications. The replicas and the client ran on identical DEC 3000/400 Alpha workstations. These workstations have a 133 MHz Alpha 21064 processor, 128 MB of memory, and run Digital Unix version 4.0. The file system was stored by each replica on a DEC RZ26 disk. All the workstations were connected by a 10Mbit/s switched Ethernet and had DEC LANCE Ethernet interfaces. The switch was a DEC EtherWORKS 8T/TX. The experiments were run on an isolated network.
+
+The interval between checkpoints was 128 requests, which causes garbage collection to occur several times in any of the experiments. The maximum sequence number accepted by replicas in pre-prepare messages was 256 plus the sequence number of the last stable checkpoint.
+
+## Micro-Benchmark
+
+The micro-benchmark measures the latency to invoke a null operation. It evaluates the performance of two implementations of a simple service with no state that implements null operations with arguments and results of different sizes. The first implementation is replicated using our library and the second is unreplicated and uses UDP directly. Table 1 reports the response times measured at the client for both read-only and read-write operations. They were obtained by timing 10,000 operation invocations in three separate runs and we report the median value of the three runs. The maximum deviation from the median was always below 0.3% of the reported value. We denote each operation by a/b, where a and b are the sizes of the operation argument and result in KBytes.
+
++---------+-------------------+------------+------------+
+|arg./res | replicated        | replicated | without    |
+|(KB)     | read write        | read-only  | replication|
++:=======:+==================:+===========:+===========:+
+|  0/0    |   3.35 (309%)     |  1.62 (98%)|   0.82     |
++---------+-------------------+------------+------------+
+| 4/0     |  14.19 (207%)     | 6.98 (51%) |   4.62     |
++---------+-------------------+------------+------------+
+|  0/4    |8.01 ( 72%)          | 5.94 (27%) | 4.66     |
++---------+-------------------+------------+------------+
+
+Table 1: Micro-benchmark results (in milliseconds); the percentage overhead is relative to the unreplicated case.
+
+The overhead introduced by the replication library is due to extra computation and communication. For example, the computation overhead for the read-write 0/0 operation is approximately 1.06ms, which includes 0.55ms spent executing cryptographic operations. The remaining 1.47ms of overhead are due to extra communication; the replication library introduces an extra message round-trip, it sends larger messages, and it increases the number of messages received by each node relative to the service without replication.
+
+The overhead for read-only operations is significantly lower because the optimization discussed in Section 5.1 reduces both computation and communication overheads. For example, the computation overhead for the read-only 0/0 operation is approximately 0.43ms, which includes 0.23ms spent executing cryptographic operations, and the communication overhead is only 0.37ms because the protocol to execute read-only operations uses a single round-trip.
+
+Table 1 shows that the relative overhead is lower for the 4/0 and 0/4 operations. This is because a significant fraction of the overhead introduced by the replication library is independent of the size of operation arguments and results. For example, in the read-write 0/4 operation, the large message (the reply) goes over the network only once (as discussed in Section 5.1) and only the cryptographic overhead to process the reply message is increased. The overhead is higher for the read-write 4/0 operation because the large message (the request) goes over the network twice and increases the cryptographic overhead for processing both request and pre-prepare messages.
+
+It is important to note that this micro-benchmark represents the worst case overhead for our algorithm because the operations perform no work and the unreplicated server provides very weak guarantees. Most services will require stronger guarantees, e.g., authenticated connections, and the overhead introduced by our algorithm relative to a server that implements these guarantees will be lower. For example, the overhead of the replication library relative to a version of the unreplicated service that uses MACs for authentication is only 243% for the read-write 0/0 operation and 4% for the read-only 4/0 operation.
+
+We can estimate a rough lower bound on the performance gain afforded by our algorithm relative to Rampart [30]. Reiter reports that Rampart has a latency of 45ms for a multi-RPC of a null message in a 10 Mbit/s Ethernet network of 4 SparcStation 10s [30]. The multi-RPC is sufficient for the primary to invoke a state machine operation but for an arbitrary client to invoke an operation it would be necessary to add an extra message delay and an extra RSA signature and verification to authenticate the client; this would lead to a latency of at least 65ms (using the RSA timings reported in [29].) Even if we divide this latency by 1.7, the ratio of the SPECint92 ratings of the DEC 3000/400 and the SparcStation 10, our algorithm still reduces the latency to invoke the read-write and read-only 0/0 operations by factors of more than 10 and 20, respectively. Note that this scaling is conservative because the network accounts for a significant fraction of Rampart's latency [29] and Rampart's results were obtained using 300-bit modulus RSA signatures, which are not considered secure today unless the keys used to generate them are refreshed very frequently.
+
+There are no published performance numbers for SecureRing [16] but it would be slower than Rampart because its algorithm has more message delays and signature operations in the critical path.
+
+## Andrew Benchmark
+
+The Andrew benchmark [15] emulates a software development workload. It has fve phases: (1) creates subdirectories recursively; (2) copies a source tree; (3) examines the status of all the files in the tree without examining their data; (4) examines every byte of data in all the files; and (5) compiles and links the files.
+
+We use the Andrew benchmark to compare BFS with two other file system configurations: NFS-std, which is the NFS V2 implementation in Digital Unix, and BFS-nr, which is identical to BFS but with no replication. BFS-nr ran two simple UDP relays on the client, and on the server it ran a thin veneer linked with a version of *snfsd* from which all the checkpoint management code was removed. This configuration does not write modified file system state to disk before replying to the client. Therefore, it does not implement NFS V2 protocol semantics, whereas both BFS and NFS-std do.
+
+Out of the 18 operations in the NFS V2 protocol only getattr is read-only because the time-last-accessed attribute of files and directories is set by operations that would otherwise be read-only, e.g., read and lookup. The result is that our optimization for read-only operations can rarely be used. To show the impact of this optimization, we also ran the Andrew benchmark on a second version of BFS that modifies the lookup operation to be read-only. This modification violates strict Unix file system semantics but is unlikely to have adverse effects in practice.
+
+For all configurations, the actual benchmark code ran at the client workstation using the standard NFS client implementation in the Digital Unix kernel with the same mount options. The most relevant of these options for the benchmark are: UDP transport, 4096-byte read and write buffers, allowing asynchronous client writes, and allowing attribute caching.
+
+We report the mean of 10 runs of the benchmark for each configuration. The sample standard deviation for the total time to run the benchmark was always below 2.6% of the reported value but it was as high as 14% for the individual times of the first four phases. This high variance was also present in the NFS-std configuration. The estimated error for the reported mean was below 4.5% for the individual phases and 0.8% for the total.
+
+Table 2 shows the results for BFS and BFS-nr. The comparison between BFS-strict and BFS-nr shows that the overhead of Byzantine fault tolerance for this service is low -- BFS-strict takes only 26% more time to run Table 2: Andrew benchmark: BFS vs BFS-nr. The times are in seconds.
+
++---------+------------+-----------+---------+
+| phase   |BFS strict  | BFS r/o   | NFS-std |
+|         |            | lookup    |         |
++:=======:+===========:+==========:+========:+
+| 1       | 0.55 (57%) |0.47 (34%) |  0.35   |
++---------+------------+-----------+---------+
+| 2       | 9.24 (82%) |7.91 (56%) |  5.08   |
++---------+------------+-----------+---------+
+|   3     |7.24 (18%)  |6.45 (6%)  | 6.11    |
++---------+------------+-----------+---------+
+|   4     | 8.77 (18%) | 7.87 (6%) |  7.41   |
++---------+------------+-----------+---------+
+|  5      |38.68 (20%) |38.38 (19%)|  32.12  |
++---------+------------+-----------+---------+
+| total   | 64.48 (26%)|61.07 (20%)|  51.07  |
++---------+------------+-----------+---------+
+
+the complete benchmark. The overhead is lower than what was observed for the micro-benchmarks because the client spends a significant fraction of the elapsed time computing between operations, i.e., between receiving the reply to an operation and issuing the next request, and operations at the server perform some computation. But the overhead is not uniform across the benchmark phases. The main reason for this is a variation in the amount of time the client spends computing between operations; the first two phases have a higher relative overhead because the client spends approximately 40% of the total time computing between operations, whereas it spends approximately 70% during the last three phases.
+
+The table shows that applying the read-only optimization to lookup improves the performance of BFS significantly and reduces the overhead relative to BFS-nr to 20%. This optimization has a significant impact in the first four phases because the time spent waiting for lookup operations to complete in BFS-strict is at least 20% of the elapsed time for these phases, whereas it is less than 5% of the elapsed time for the last phase.
+
++---------+------------+-----------+---------+
+| phase   |BFS strict  | BFS r/o   | NFS-std |
+|         |            | lookup    |         |
++:=======:+===========:+==========:+========:+
+| 1       |0.55 (-69%) |0.47 (-73%)|  1.75   |
++---------+------------+-----------+---------+
+| 2       |9.24 ( -2%) |7.91 (-16%)|  9.46   |
++---------+------------+-----------+---------+
+|   3     |7.24 (35%)  | 6.45 (20%)|  5.36   |
++---------+------------+-----------+---------+
+|   4     |8.77 (32%)  |7.87 (19%) | 6.60    |
++---------+------------+-----------+---------+
+|  5      |38.68 (-2%) |38.38 (-2%)|  39.35  |
++---------+------------+-----------+---------+
+| total   |64.48 (3%)  |61.07 (-2%)|  62.52  |
++---------+------------+-----------+---------+
+
+Table 3: Andrew benchmark: BFS vs NFS-std. The times are in seconds.
+
+Table 3 shows the results for BFS vs NFS-std. These results show that BFS can be used in practice -- BFS-strict takes only 3% more time to run the complete benchmark. Thus, one could replace the NFS V2 implementation in Digital Unix, which is used daily by many users, by BFS without affecting the latency perceived by those users. Furthermore, BFS with the read-only optimization for the *lookup* operation is actually 2% faster than NFS-std.
+
+The overhead of BFS relative to NFS-std is not the same for all phases. Both versions of BFS are faster than NFS-std for phases 1, 2, and 5 but slower for the other phases. This is because during phases 1, 2, and 5 a large fraction (between 21% and 40%) of the operations issued by the client are *synchronous*, i.e., operations that require the NFS implementation to ensure stability of modified file system state before replying to the client. NFS-std achieves stability by writing modified state to disk whereas BFS achieves stability with lower latency using replication (as in Harp [20]). NFS-std is faster than BFS (and BFS-nr) in phases 3 and 4 because the client issues no synchronous operations during these phases.
+
+# Related Work
+
+Most previous work on replication techniques ignored Byzantine faults or assumed a synchronous system model (e.g., [17, 26, 18, 34, 6, 10]). View stamped replication [26] and Paxos [18] use views with a primary and backups to tolerate benign faults in an asynchronous system. Tolerating Byzantine faults requires a much more complex protocol with cryptographic authentication, an extra pre-prepare phase, and a different technique to trigger view changes and select primaries. Furthermore, our system uses view changes only to select a new primary but never to select a different set of replicas to form the new view as in [26, 18].
+
+Some agreement and consensus algorithms tolerate Byzantine faults in asynchronous systems (e.g,[2, 3, 24]). However, they do not provide a complete solution for state machine replication, and furthermore, most of them were designed to demonstrate theoretical feasibility and are too slow to be used in practice. Our algorithm during normal-case operation is similar to the Byzantine agreement algorithm in [2] but that algorithm is unable to survive primary failures.
+
+The two systems that are most closely related to our work are Rampart [29, 30, 31, 22] and SecureRing [16]. They implement state machine replication but are more than an order of magnitude slower than our system and, most importantly, they rely on synchrony assumptions.
+
+Both Rampart and SecureRing must exclude faulty replicas from the group to make progress (e.g., to remove a faulty primary and elect a new one), and to perform garbage collection. They rely on failure detectors to determine which replicas are faulty. However, failure detectors cannot be accurate in an asynchronous system [21], i.e., they may misclassify a replica as faulty. Since correctness requires that fewer than $\frac13$ of group members be faulty, a misclassification can compromise correctness by removing a non-faulty replica from the group. This opens an avenue of attack: an attacker gains control over a single replica but does not change its behavior in any detectable way; then it slows correct replicas or the communication between them until enough are excluded from the group.
+
+To reduce the probability of misclassification, failure detectors can be calibrated to delay classifying a replica as faulty. However, for the probability to be negligible the delay must be very large, which is undesirable. For example, if the primary has actually failed, the group will be unable to process client requests until the delay has expired. Our algorithm is not vulnerable to this problem because it never needs to exclude replicas from the group.
+
+Phalanx [23, 25] applies quorum replication techniques [12] to achieve Byzantine fault-tolerance in asynchronous systems. This work does not provide generic state machine replication; instead, it offers a data repository with operations to read and write individual variables and to acquire locks. The semantics it provides for read and write operations are weaker than those offered by our algorithm; we can implement arbitrary operations that access any number of variables,whereas in Phalanx it would be necessary to acquire and release locks to execute such operations. There are no published performance numbers for Phalanx but we believe our algorithm is faster because it has fewer message delays in the critical path and because of our use of MACs rather than public key cryptography. The approach in Phalanx offers the potential for improved scalability; each operation is processed by only a subset of replicas. But this approach to scalability is expensive: it requires $n\gt4f+1$ to tolerate faults; each replica needs a copy of the state; and the load on each replica decreases slowly with $n$
+(it is $\bigcirc(1/\sqrt{n})$.
+
+# Conclusions
+
+This paper has described a new state-machine replication algorithm that is able to tolerate Byzantine faults and can be used in practice: it is the first to work correctly in an asynchronous system like the Internet and it improves the performance of previous algorithms by more than an order of magnitude.
+
+The paper also described BFS, a Byzantine-fault tolerant implementation of NFS. BFS demonstrates that it is possible to use our algorithm to implement real services with performance close to that of an unreplicated service -- the performance of BFS is only 3% worse than that of the standard NFS implementation in Digital Unix. This good performance is due to a number of important optimizations, including replacing public-key signatures by vectors of message authentication codes, reducing the size and number of messages, and the incremental checkpoint-management techniques.
+
+One reason why Byzantine-fault-tolerant algorithms will be important in the future is that they can allow systems to continue to work correctly even when there are software errors. Not all errors are survivable; our approach cannot mask a software error that occurs at all replicas. However, it can mask errors that occur independently at different replicas, including nondeterministic software errors, which are the most problematic and persistent errors since they are the hardest to detect. In fact, we encountered such a software bug while running our system, and our algorithm was able to continue running correctly in spite of it.
+
+There is still much work to do on improving our system. One problem of special interest is reducing the amount of resources required to implement our algorithm. The number of replicas can be reduced by using
+replicas as witnesses that are involved in the protocol only when some full replica fails. We also believe that it is possible to reduce the number of copies of the state to
+1 but the details remain to be worked out.
+
+# Acknowledgments
+
+We would like to thank Atul Adya, Chandrasekhar Boyapati, Nancy Lynch, Sape Mullender, Andrew Myers, Liuba Shrira, and the anonymous referees for their helpful comments on drafts of this paper.
+
+# References
+
+[1] M. Bellare and D. Micciancio. A New Paradigm for Collision-free Hashing: Incrementality at Reduced Cost. In Advances in Cryptology -- Eurocrypt 97, 1997.
+
+[2] G. Bracha and S. Toueg. Asynchronous Consensus and Broadcast Protocols. Journal of the ACM, 32(4), 1995.
+
+[3] R. Canneti and T. Rabin. Optimal Asynchronous Byzantine Agreement. Technical Report #92-15, Computer Science Department, Hebrew University, 1992.
+
+[4] M. Castro and B. Liskov. A Correctness Proof for a Practical Byzantine-Fault-Tolerant Replication Algorithm. Technical Memo MIT/LCS/TM-590, MIT Laboratory for Computer Science, 1999.
+
+[5] M. Castro and B. Liskov. Authenticated Byzantine Fault Tolerance Without Public-Key Cryptography. Technical Memo MIT/LCS/TM-589, MIT Laboratory for Computer Science, 1999.
+
+[6] F. Cristian, H. Aghili, H. Strong, and D. Dolev. Atomic Broadcast: From Simple Message Diffusion to Byzantine Agreement. In International Conference on Fault Tolerant Computing, 1985.
+
+[7] S. Deering and D. Cheriton. Multicast Routing in Datagram Internetworks and Extended LANs. ACM Transactions on Computer Systems, 8(2), 1990.
+
+[8] H. Dobbertin. The Status of MD5 After a Recent Attack. RSA Laboratories' CryptoBytes, 2(2), 1996.
+
+[9] M. Fischer, N. Lynch, and M. Paterson. Impossibility of Distributed Consensus With One Faulty Process. Journal of the ACM, 32(2), 1985.
+
+[10] J. Garay and Y. Moses. Fully Polynomial Byzantine Agreement for n
+3t Processors in t+1 Rounds. SIAM Journal of Computing, 27(1), 1998.
+
+[11] D. Gawlick and D. Kinkade. Varieties of Concurrency Control in IMS/VS Fast Path. Database Engineering, 8(2), 1985.
+
+[12] D. Gifford. Weighted Voting for Replicated Data. In Symposium on Operating Systems Principles, 1979.
+
+[13] M. Herlihy and J. Tygar. How to make replicated data secure. Advances in Cryptology (LNCS 293), 1988.
+
+[14] M. Herlihy and J. Wing. Axioms for Concurrent Objects. In ACM Symposium on Principles of Programming Languages, 1987.
+
+[15] J. Howard et al. Scale and performance in a distributed file system. ACM Transactions on Computer Systems, 6(1), 1988.
+
+[16] K. Kihlstrom, L. Moser, and P. Melliar-Smith. The SecureRing Protocols for Securing Group Communication. In Hawaii International Conference on System Sciences, 1998.
+
+[17] L. Lamport. Time, Clocks, and the Ordering of Events in a Distributed System. Commun. ACM, 21(7), 1978.
+
+[18] L. Lamport. The Part-Time Parliament. Technical Report 49, DEC Systems Research Center, 1989.
+
+[19] L. Lamport, R. Shostak, and M. Pease. The Byzantine Generals Problem. ACM Transactions on Programming Languages and Systems, 4(3), 1982.
+
+[20] B. Liskov et al. Replication in the Harp File System. In ACM Symposium on Operating System Principles, 1991.
+
+[21] N. Lynch. Distributed Algorithms. Morgan Kaufmann Publishers, 1996.
+
+[22] D. Malkhi and M. Reiter. A High-Throughput Secure Reliable Multicast Protocol. In Computer Security Foundations Workshop, 1996.
+
+[23] D. Malkhi and M. Reiter. Byzantine Quorum Systems. In ACM Symposium on Theory of Computing, 1997.
+
+[24] D. Malkhi and M. Reiter. Unreliable Intrusion Detection in Distributed Computations. In Computer Security Foundations Workshop, 1997.
+
+[25] D. Malkhi and M. Reiter. Secure and Scalable Replication in Phalanx. In IEEE Symposium on Reliable Distributed Systems, 1998.
+
+[26] B. Oki and B. Liskov. Viewstamped Replication: A New Primary Copy Method to Support Highly-Available Distributed Systems. In ACM Symposium on Principles of Distributed Computing, 1988.
+
+[27] B. Preneel and P. Oorschot. MDx-MAC and Building Fast MACs from Hash Functions. In Crypto 95, 1995.
+
+[28] C. Pu, A. Black, C. Cowan, and J. Walpole. A Specialization Toolkit to Increase the Diversity of Operating Systems. In ICMAS Workshop on Immunity-Based Systems, 1996.
+
+[29] M. Reiter. Secure Agreement Protocols. In ACM Conference on Computer and Communication Security, 1994.
+
+[30] M. Reiter. The Rampart Toolkit for Building High-Integrity Services. Theory and Practice in Distributed Systems (LNCS 938), 1995.
+
+[31] M. Reiter. A Secure Group Membership Protocol. IEEE Transactions on Software Engineering, 22(1), 1996.
+
+[32] R. Rivest. The MD5 Message-Digest Algorithm. Internet RFC--1321, 1992.
+
+[33] R. Rivest, A. Shamir, and L. Adleman. A Method for Obtaining Digital Signatures and Public-Key Cryptosystems. Communications of the ACM, 21(2), 1978.
+
+[34] F. Schneider. Implementing Fault-Tolerant Services Using The State Machine Approach: A Tutorial. ACM Computing Surveys, 22(4), 1990.
+
+[35] A. Shamir. How to share a secret. Communications of the ACM, 22(11), 1979.
+
+[36] G. Tsudik. Message Authentication with One-Way Hash Functions. ACM Computer Communications Review, 22(5), 1992.
+
+[37] M. Wiener. Performance Comparison of Public-Key Cryptosystems. RSA Laboratories' CryptoBytes, 4(1), 1998.
diff --git a/docs/byzantine_paxos.pdf b/docs/byzantine_paxos.pdf
deleted file mode 100644
index 5b21a43..0000000
--- a/docs/byzantine_paxos.pdf
+++ /dev/null
@@ -1,46117 +0,0 @@
-%PDF-1.1
-3 0 obj
-<< /Type /Font /Name /R3 /Subtype /Type1 /BaseFont /Times-Roman >>
-endobj
-4 0 obj
-<< /Length 5 0 R >>
-stream
-q
-BT
-/R3 8 Tf
-1 0 0 1 84.12 740.76 Tm
-(Appears) Tj
-1 0 0 1 112.68 740.76 Tm
-(in) Tj
-1 0 0 1 120.84 740.76 Tm
-(the) Tj
-ET
-endstream
-endobj
-5 0 obj
-121
-endobj
-6 0 obj
-<< /Type /Font /Name /R6 /Subtype /Type1 /BaseFont /Times-Italic >>
-endobj
-7 0 obj
-<< /Length 8 0 R >>
-stream
-BT
-/R6 8 Tf
-1 0 0 1 132.6 740.76 Tm
-(Pr) Tj
-1 0 0 1 140.28 740.76 Tm
-(oceedings) Tj
-1 0 0 1 174.12 740.76 Tm
-(of) Tj
-1 0 0 1 182.28 740.76 Tm
-(the) Tj
-1 0 0 1 194.039 740.76 Tm
-(Thir) Tj
-1 0 0 1 207.479 740.76 Tm
-(d) Tj
-1 0 0 1 213.479 740.76 Tm
-(Symposium) Tj
-1 0 0 1 251.759 740.76 Tm
-(on) Tj
-1 0 0 1 261.719 740.76 Tm
-(Oper) Tj
-1 0 0 1 277.919 740.76 Tm
-(ating) Tj
-1 0 0 1 296.399 740.76 Tm
-(Systems) Tj
-1 0 0 1 323.519 740.76 Tm
-(Design) Tj
-1 0 0 1 348.119 740.76 Tm
-(and) Tj
-1 0 0 1 362.039 740.76 Tm
-(Implementation,) Tj
-1 0 0 1 416.159 740.76 Tm
-(Ne) Tj
-1 0 0 1 424.799 740.76 Tm
-(w) Tj
-1 0 0 1 432.119 740.76 Tm
-(Orleans,) Tj
-1 0 0 1 461.758 740.76 Tm
-(USA,) Tj
-1 0 0 1 480.358 740.76 Tm
-(F) Tj
-1 0 0 1 484.678 740.76 Tm
-(ebruary) Tj
-1 0 0 1 511.918 740.76 Tm
-(1999) Tj
-ET
-endstream
-endobj
-8 0 obj
-781
-endobj
-9 0 obj
-<< /Type /Font /Name /R9 /Subtype /Type1 /BaseFont /Times-Bold >>
-endobj
-10 0 obj
-<< /Length 11 0 R >>
-stream
-BT
-/R9 14 Tf
-1 0 0 1 199.32 702.96 Tm
-(Practical) Tj
-1 0 0 1 256.2 702.96 Tm
-(Byzantine) Tj
-1 0 0 1 319.44 702.96 Tm
-(F) Tj
-1 0 0 1 327.6 702.96 Tm
-(ault) Tj
-1 0 0 1 354.36 702.96 Tm
-(T) Tj
-1 0 0 1 362.4 702.96 Tm
-(olerance) Tj
-/R3 12 Tf
-1 0 0 1 223.08 669.12 Tm
-(Miguel) Tj
-1 0 0 1 260.64 669.12 Tm
-(Castro) Tj
-1 0 0 1 294.84 669.12 Tm
-(and) Tj
-1 0 0 1 315.12 669.12 Tm
-(Barbara) Tj
-1 0 0 1 355.919 669.12 Tm
-(Lisk) Tj
-1 0 0 1 377.159 669.12 Tm
-(o) Tj
-1 0 0 1 383.039 669.12 Tm
-(v) Tj
-/R6 12 Tf
-1 0 0 1 223.8 655.2 Tm
-(Labor) Tj
-1 0 0 1 252.96 655.2 Tm
-(atory) Tj
-1 0 0 1 281.04 655.2 Tm
-(for) Tj
-1 0 0 1 297.96 655.2 Tm
-(Computer) Tj
-1 0 0 1 348.839 655.2 Tm
-(Science) Tj
-1 0 0 1 385.199 655.2 Tm
-(,) Tj
-1 0 0 1 214.08 641.16 Tm
-(Massac) Tj
-1 0 0 1 250.56 641.16 Tm
-(husetts) Tj
-1 0 0 1 286.68 641.16 Tm
-(Institute) Tj
-1 0 0 1 328.799 641.16 Tm
-(of) Tj
-1 0 0 1 341.159 641.16 Tm
-(T) Tj
-1 0 0 1 346.679 641.16 Tm
-(ec) Tj
-1 0 0 1 357.119 641.16 Tm
-(hnolo) Tj
-1 0 0 1 384.359 641.16 Tm
-(gy) Tj
-1 0 0 1 395.039 641.16 Tm
-(,) Tj
-1 0 0 1 192.36 627.24 Tm
-(545) Tj
-1 0 0 1 213.24 627.24 Tm
-(T) Tj
-1 0 0 1 218.76 627.24 Tm
-(ec) Tj
-1 0 0 1 229.2 627.24 Tm
-(hnolo) Tj
-1 0 0 1 256.44 627.24 Tm
-(gy) Tj
-1 0 0 1 270.72 627.24 Tm
-(Squar) Tj
-1 0 0 1 298.92 627.24 Tm
-(e) Tj
-1 0 0 1 304.079 627.24 Tm
-(,) Tj
-1 0 0 1 309.959 627.24 Tm
-(Cambridg) Tj
-1 0 0 1 358.439 627.24 Tm
-(e) Tj
-1 0 0 1 363.599 627.24 Tm
-(,) Tj
-1 0 0 1 369.479 627.24 Tm
-(MA) Tj
-1 0 0 1 389.759 627.24 Tm
-(02139) Tj
-ET
-Q
-q
-W
-0 0 612 792 re
-n
-endstream
-endobj
-11 0 obj
-1497
-endobj
-12 0 obj
-<< /Type /XObject /Name /R12 /Subtype /Image /Length 13 0 R
-/ImageMask true /Width 39 /Height 100 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 39 /BlackIs1 true >>]
->>
-stream
-+CYskJO*-9kn*)Wn:LN:
-s8W-!s8W-!s4?PIKnQ+Ne;bBe<0A()%X^A[(i\@1^OQ:`s8W-!s8W,ur&u1hf`^Jj+bNVe!tYGt"9~>
-endstream
-endobj
-13 0 obj
-101
-endobj
-14 0 obj
-<< /Length 15 0 R >>
-stream
-q
-3.9 0 0 -10 226.8 620.8 cm
-/R12 Do
-Q
-endstream
-endobj
-15 0 obj
-39
-endobj
-16 0 obj
-<< /Type /Font /Name /R16 /Subtype /Type1 /BaseFont /Courier >>
-endobj
-17 0 obj
-<< /Length 18 0 R >>
-stream
-BT
-/R16 10 Tf
-1 0 0 1 231.36 613.32 Tm
-(castro,liskov) Tj
-ET
-endstream
-endobj
-18 0 obj
-61
-endobj
-19 0 obj
-<< /Type /XObject /Name /R19 /Subtype /Image /Length 20 0 R
-/ImageMask true /Width 39 /Height 100 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 39 /BlackIs1 true >>]
->>
-stream
-,DhM)&Fel!i:(XA
-\*s@ss8W-!s8W-!hhT+`nDT#4)$`#/'GV2X"UH\]_@,]0s8W-!s8W-!s'MeW#sg*k*#HKf&-r8$"9~>
-endstream
-endobj
-20 0 obj
-96
-endobj
-21 0 obj
-<< /Length 22 0 R >>
-stream
-q
-3.9 0 0 -10 309.9 620.8 cm
-/R19 Do
-Q
-BT
-1 0 0 1 314.4 613.32 Tm
-(@lcs.mit.edu) Tj
-/R9 12 Tf
-1 0 0 1 72 568.68 Tm
-(Abstract) Tj
-/R3 9 Tf
-1 0 0 1 72 552.6 Tm
-(This) Tj
-1 0 0 1 91.1999 552.6 Tm
-(paper) Tj
-1 0 0 1 114.36 552.6 Tm
-(describes) Tj
-1 0 0 1 151.08 552.6 Tm
-(a) Tj
-1 0 0 1 158.28 552.6 Tm
-(ne) Tj
-1 0 0 1 166.44 552.6 Tm
-(w) Tj
-1 0 0 1 176.28 552.6 Tm
-(replication) Tj
-1 0 0 1 217.919 552.6 Tm
-(algorithm) Tj
-1 0 0 1 256.079 552.6 Tm
-(that) Tj
-1 0 0 1 272.759 552.6 Tm
-(is) Tj
-1 0 0 1 282.119 552.6 Tm
-(able) Tj
-1 0 0 1 72 541.68 Tm
-(to) Tj
-1 0 0 1 84.12 541.68 Tm
-(tolerate) Tj
-1 0 0 1 116.16 541.68 Tm
-(Byzantine) Tj
-1 0 0 1 157.56 541.68 Tm
-(f) Tj
-1 0 0 1 160.44 541.68 Tm
-(aults.) Tj
-1 0 0 1 191.52 541.68 Tm
-(W) Tj
-1 0 0 1 199.32 541.68 Tm
-(e) Tj
-1 0 0 1 208.44 541.68 Tm
-(belie) Tj
-1 0 0 1 225.6 541.68 Tm
-(v) Tj
-1 0 0 1 229.92 541.68 Tm
-(e) Tj
-1 0 0 1 239.039 541.68 Tm
-(that) Tj
-1 0 0 1 257.639 541.68 Tm
-(Byzantine-) Tj
-1 0 0 1 72 530.64 Tm
-(f) Tj
-1 0 0 1 74.88 530.64 Tm
-(ault-tolerant) Tj
-1 0 0 1 124.08 530.64 Tm
-(algorithms) Tj
-1 0 0 1 167.64 530.64 Tm
-(will) Tj
-1 0 0 1 186.96 530.64 Tm
-(be) Tj
-1 0 0 1 200.76 530.64 Tm
-(increasingly) Tj
-1 0 0 1 249.839 530.64 Tm
-(important) Tj
-1 0 0 1 290.039 530.64 Tm
-(in) Tj
-1 0 0 1 72 519.72 Tm
-(the) Tj
-1 0 0 1 86.5199 519.72 Tm
-(future) Tj
-1 0 0 1 111.6 519.72 Tm
-(because) Tj
-1 0 0 1 143.64 519.72 Tm
-(malicious) Tj
-1 0 0 1 182.04 519.72 Tm
-(attacks) Tj
-1 0 0 1 210.6 519.72 Tm
-(and) Tj
-1 0 0 1 227.159 519.72 Tm
-(softw) Tj
-1 0 0 1 246.959 519.72 Tm
-(are) Tj
-1 0 0 1 261.479 519.72 Tm
-(errors) Tj
-1 0 0 1 286.079 519.72 Tm
-(are) Tj
-1 0 0 1 72 508.8 Tm
-(increasingly) Tj
-1 0 0 1 119.76 508.8 Tm
-(common) Tj
-1 0 0 1 154.92 508.8 Tm
-(and) Tj
-1 0 0 1 171.72 508.8 Tm
-(can) Tj
-1 0 0 1 188.04 508.8 Tm
-(cause) Tj
-1 0 0 1 211.919 508.8 Tm
-(f) Tj
-1 0 0 1 214.799 508.8 Tm
-(aulty) Tj
-1 0 0 1 236.639 508.8 Tm
-(nodes) Tj
-1 0 0 1 261.359 508.8 Tm
-(to) Tj
-1 0 0 1 272.279 508.8 Tm
-(e) Tj
-1 0 0 1 276.119 508.8 Tm
-(xhibit) Tj
-1 0 0 1 72 497.76 Tm
-(arbitrary) Tj
-1 0 0 1 106.56 497.76 Tm
-(beha) Tj
-1 0 0 1 123.24 497.76 Tm
-(vior) Tj
-1 0 0 1 137.16 497.76 Tm
-(.) Tj
-1 0 0 1 147 497.76 Tm
-(Whereas) Tj
-1 0 0 1 182.04 497.76 Tm
-(pre) Tj
-1 0 0 1 193.2 497.76 Tm
-(vious) Tj
-1 0 0 1 216.479 497.76 Tm
-(algorithms) Tj
-1 0 0 1 258.479 497.76 Tm
-(assumed) Tj
-1 0 0 1 293.039 497.76 Tm
-(a) Tj
-1 0 0 1 72 486.84 Tm
-(synchronous) Tj
-1 0 0 1 120.6 486.84 Tm
-(system) Tj
-1 0 0 1 148.68 486.84 Tm
-(or) Tj
-1 0 0 1 159.36 486.84 Tm
-(were) Tj
-1 0 0 1 180 486.84 Tm
-(too) Tj
-1 0 0 1 194.64 486.84 Tm
-(slo) Tj
-1 0 0 1 204.84 486.84 Tm
-(w) Tj
-1 0 0 1 214.679 486.84 Tm
-(to) Tj
-1 0 0 1 224.879 486.84 Tm
-(be) Tj
-1 0 0 1 236.519 486.84 Tm
-(used) Tj
-1 0 0 1 256.199 486.84 Tm
-(in) Tj
-1 0 0 1 266.399 486.84 Tm
-(practice,) Tj
-1 0 0 1 72 475.92 Tm
-(the) Tj
-1 0 0 1 85.9199 475.92 Tm
-(algorithm) Tj
-1 0 0 1 123.84 475.92 Tm
-(described) Tj
-1 0 0 1 161.16 475.92 Tm
-(in) Tj
-1 0 0 1 171.24 475.92 Tm
-(this) Tj
-1 0 0 1 187.2 475.92 Tm
-(paper) Tj
-1 0 0 1 210.119 475.92 Tm
-(is) Tj
-1 0 0 1 219.119 475.92 Tm
-(practical:) Tj
-1 0 0 1 257.159 475.92 Tm
-(it) Tj
-1 0 0 1 265.199 475.92 Tm
-(w) Tj
-1 0 0 1 271.559 475.92 Tm
-(orks) Tj
-1 0 0 1 290.039 475.92 Tm
-(in) Tj
-1 0 0 1 72 464.88 Tm
-(asynchronous) Tj
-1 0 0 1 124.32 464.88 Tm
-(en) Tj
-1 0 0 1 132.36 464.88 Tm
-(vironments) Tj
-1 0 0 1 175.68 464.88 Tm
-(lik) Tj
-1 0 0 1 185.04 464.88 Tm
-(e) Tj
-1 0 0 1 192 464.88 Tm
-(the) Tj
-1 0 0 1 205.92 464.88 Tm
-(Internet) Tj
-1 0 0 1 236.759 464.88 Tm
-(and) Tj
-1 0 0 1 252.719 464.88 Tm
-(incorporates) Tj
-1 0 0 1 72 453.96 Tm
-(se) Tj
-1 0 0 1 79.2 453.96 Tm
-(v) Tj
-1 0 0 1 83.5199 453.96 Tm
-(eral) Tj
-1 0 0 1 99.1198 453.96 Tm
-(important) Tj
-1 0 0 1 136.2 453.96 Tm
-(optimizations) Tj
-1 0 0 1 187.08 453.96 Tm
-(that) Tj
-1 0 0 1 202.68 453.96 Tm
-(impro) Tj
-1 0 0 1 223.919 453.96 Tm
-(v) Tj
-1 0 0 1 228.239 453.96 Tm
-(e) Tj
-1 0 0 1 234.479 453.96 Tm
-(the) Tj
-1 0 0 1 247.559 453.96 Tm
-(response) Tj
-1 0 0 1 281.039 453.96 Tm
-(time) Tj
-1 0 0 1 72 443.04 Tm
-(of) Tj
-1 0 0 1 81.2399 443.04 Tm
-(pre) Tj
-1 0 0 1 92.3999 443.04 Tm
-(vious) Tj
-1 0 0 1 113.64 443.04 Tm
-(algorithms) Tj
-1 0 0 1 153.84 443.04 Tm
-(by) Tj
-1 0 0 1 164.52 443.04 Tm
-(more) Tj
-1 0 0 1 184.68 443.04 Tm
-(than) Tj
-1 0 0 1 201.959 443.04 Tm
-(an) Tj
-1 0 0 1 212.159 443.04 Tm
-(order) Tj
-1 0 0 1 232.799 443.04 Tm
-(of) Tj
-1 0 0 1 242.039 443.04 Tm
-(magnitude.) Tj
-1 0 0 1 285.239 443.04 Tm
-(W) Tj
-1 0 0 1 293.039 443.04 Tm
-(e) Tj
-1 0 0 1 72 432 Tm
-(implemented) Tj
-1 0 0 1 121.32 432 Tm
-(a) Tj
-1 0 0 1 127.8 432 Tm
-(Byzantine-f) Tj
-1 0 0 1 169.92 432 Tm
-(ault-tolerant) Tj
-1 0 0 1 216.359 432 Tm
-(NFS) Tj
-1 0 0 1 235.199 432 Tm
-(service) Tj
-1 0 0 1 263.159 432 Tm
-(using) Tj
-1 0 0 1 284.999 432 Tm
-(our) Tj
-1 0 0 1 72 421.08 Tm
-(algorithm) Tj
-1 0 0 1 108.84 421.08 Tm
-(and) Tj
-1 0 0 1 123.84 421.08 Tm
-(measured) Tj
-1 0 0 1 160.2 421.08 Tm
-(its) Tj
-1 0 0 1 170.76 421.08 Tm
-(performance.) Tj
-1 0 0 1 221.399 421.08 Tm
-(The) Tj
-1 0 0 1 237.359 421.08 Tm
-(results) Tj
-1 0 0 1 262.799 421.08 Tm
-(sho) Tj
-1 0 0 1 274.919 421.08 Tm
-(w) Tj
-1 0 0 1 283.559 421.08 Tm
-(that) Tj
-1 0 0 1 72 410.16 Tm
-(our) Tj
-1 0 0 1 85.6799 410.16 Tm
-(service) Tj
-1 0 0 1 112.8 410.16 Tm
-(is) Tj
-1 0 0 1 120.48 410.16 Tm
-(only) Tj
-1 0 0 1 138.24 410.16 Tm
-(3%) Tj
-1 0 0 1 151.92 410.16 Tm
-(slo) Tj
-1 0 0 1 162.12 410.16 Tm
-(wer) Tj
-1 0 0 1 177.24 410.16 Tm
-(than) Tj
-1 0 0 1 194.399 410.16 Tm
-(a) Tj
-1 0 0 1 200.159 410.16 Tm
-(standard) Tj
-1 0 0 1 232.319 410.16 Tm
-(unreplicated) Tj
-1 0 0 1 278.279 410.16 Tm
-(NFS.) Tj
-/R9 12 Tf
-1 0 0 1 72 383.04 Tm
-(1) Tj
-1 0 0 1 89.8799 383.04 Tm
-(Intr) Tj
-1 0 0 1 110.16 383.04 Tm
-(oduction) Tj
-/R3 10 Tf
-1 0 0 1 72 365.88 Tm
-(Malicious) Tj
-1 0 0 1 116.04 365.88 Tm
-(attacks) Tj
-1 0 0 1 147.84 365.88 Tm
-(and) Tj
-1 0 0 1 166.32 365.88 Tm
-(softw) Tj
-1 0 0 1 188.4 365.88 Tm
-(are) Tj
-1 0 0 1 204.6 365.88 Tm
-(errors) Tj
-1 0 0 1 231.96 365.88 Tm
-(are) Tj
-1 0 0 1 248.279 365.88 Tm
-(increasingly) Tj
-1 0 0 1 72 354 Tm
-(common.) Tj
-1 0 0 1 118.2 354 Tm
-(The) Tj
-1 0 0 1 137.88 354 Tm
-(gro) Tj
-1 0 0 1 151.08 354 Tm
-(wing) Tj
-1 0 0 1 175.08 354 Tm
-(reliance) Tj
-1 0 0 1 210.84 354 Tm
-(of) Tj
-1 0 0 1 223.44 354 Tm
-(industry) Tj
-1 0 0 1 260.28 354 Tm
-(and) Tj
-1 0 0 1 278.879 354 Tm
-(go) Tj
-1 0 0 1 288.839 354 Tm
-(v-) Tj
-1 0 0 1 72 342 Tm
-(ernment) Tj
-1 0 0 1 107.04 342 Tm
-(on) Tj
-1 0 0 1 119.4 342 Tm
-(online) Tj
-1 0 0 1 146.64 342 Tm
-(information) Tj
-1 0 0 1 196.08 342 Tm
-(services) Tj
-1 0 0 1 230.52 342 Tm
-(mak) Tj
-1 0 0 1 247.679 342 Tm
-(es) Tj
-1 0 0 1 258.239 342 Tm
-(malicious) Tj
-1 0 0 1 72 330.12 Tm
-(attacks) Tj
-1 0 0 1 103.32 330.12 Tm
-(more) Tj
-1 0 0 1 127.32 330.12 Tm
-(attracti) Tj
-1 0 0 1 154.8 330.12 Tm
-(v) Tj
-1 0 0 1 159.72 330.12 Tm
-(e) Tj
-1 0 0 1 167.64 330.12 Tm
-(and) Tj
-1 0 0 1 185.64 330.12 Tm
-(mak) Tj
-1 0 0 1 202.8 330.12 Tm
-(es) Tj
-1 0 0 1 214.56 330.12 Tm
-(the) Tj
-1 0 0 1 230.279 330.12 Tm
-(consequences) Tj
-1 0 0 1 288.719 330.12 Tm
-(of) Tj
-1 0 0 1 72 318.12 Tm
-(successful) Tj
-1 0 0 1 115.56 318.12 Tm
-(attacks) Tj
-1 0 0 1 145.68 318.12 Tm
-(more) Tj
-1 0 0 1 168.72 318.12 Tm
-(serious.) Tj
-1 0 0 1 203.28 318.12 Tm
-(In) Tj
-1 0 0 1 214.079 318.12 Tm
-(addition,) Tj
-1 0 0 1 251.879 318.12 Tm
-(the) Tj
-1 0 0 1 266.519 318.12 Tm
-(number) Tj
-1 0 0 1 72 306.24 Tm
-(of) Tj
-1 0 0 1 82.92 306.24 Tm
-(softw) Tj
-1 0 0 1 105 306.24 Tm
-(are) Tj
-1 0 0 1 119.76 306.24 Tm
-(errors) Tj
-1 0 0 1 145.56 306.24 Tm
-(is) Tj
-1 0 0 1 154.8 306.24 Tm
-(increasing) Tj
-1 0 0 1 198.36 306.24 Tm
-(due) Tj
-1 0 0 1 215.4 306.24 Tm
-(to) Tj
-1 0 0 1 225.719 306.24 Tm
-(the) Tj
-1 0 0 1 240.599 306.24 Tm
-(gro) Tj
-1 0 0 1 253.799 306.24 Tm
-(wth) Tj
-1 0 0 1 271.199 306.24 Tm
-(in) Tj
-1 0 0 1 281.519 306.24 Tm
-(size) Tj
-1 0 0 1 72 294.24 Tm
-(and) Tj
-1 0 0 1 88.8 294.24 Tm
-(comple) Tj
-1 0 0 1 118.2 294.24 Tm
-(xity) Tj
-1 0 0 1 135.84 294.24 Tm
-(of) Tj
-1 0 0 1 146.64 294.24 Tm
-(softw) Tj
-1 0 0 1 168.72 294.24 Tm
-(are.) Tj
-1 0 0 1 186.84 294.24 Tm
-(Since) Tj
-1 0 0 1 211.44 294.24 Tm
-(malicious) Tj
-1 0 0 1 252.599 294.24 Tm
-(attacks) Tj
-1 0 0 1 282.599 294.24 Tm
-(and) Tj
-1 0 0 1 72 282.36 Tm
-(softw) Tj
-1 0 0 1 94.0799 282.36 Tm
-(are) Tj
-1 0 0 1 108.84 282.36 Tm
-(errors) Tj
-1 0 0 1 134.76 282.36 Tm
-(can) Tj
-1 0 0 1 151.2 282.36 Tm
-(cause) Tj
-1 0 0 1 175.92 282.36 Tm
-(f) Tj
-1 0 0 1 179.16 282.36 Tm
-(aulty) Tj
-1 0 0 1 201.72 282.36 Tm
-(nodes) Tj
-1 0 0 1 227.64 282.36 Tm
-(to) Tj
-1 0 0 1 238.079 282.36 Tm
-(e) Tj
-1 0 0 1 242.399 282.36 Tm
-(xhibit) Tj
-1 0 0 1 268.199 282.36 Tm
-(Byzan-) Tj
-1 0 0 1 72 270.36 Tm
-(tine) Tj
-1 0 0 1 89.2799 270.36 Tm
-(\(i.e.,) Tj
-1 0 0 1 109.56 270.36 Tm
-(arbitrary\)) Tj
-1 0 0 1 149.52 270.36 Tm
-(beha) Tj
-1 0 0 1 168.24 270.36 Tm
-(vior) Tj
-1 0 0 1 184.08 270.36 Tm
-(,) Tj
-1 0 0 1 188.52 270.36 Tm
-(Byzantine-f) Tj
-1 0 0 1 235.679 270.36 Tm
-(ault-tolerant) Tj
-1 0 0 1 286.439 270.36 Tm
-(al-) Tj
-1 0 0 1 72 258.48 Tm
-(gorithms) Tj
-1 0 0 1 109.92 258.48 Tm
-(are) Tj
-1 0 0 1 124.56 258.48 Tm
-(increasingly) Tj
-1 0 0 1 175.8 258.48 Tm
-(important.) Tj
-1 0 0 1 81.96 246.12 Tm
-(This) Tj
-1 0 0 1 104.4 246.12 Tm
-(paper) Tj
-1 0 0 1 131.28 246.12 Tm
-(presents) Tj
-1 0 0 1 168.72 246.12 Tm
-(a) Tj
-1 0 0 1 177.84 246.12 Tm
-(ne) Tj
-1 0 0 1 187.08 246.12 Tm
-(w) Tj
-1 0 0 1 193.68 246.12 Tm
-(,) Tj
-/R6 10 Tf
-1 0 0 1 201.36 246.12 Tm
-(pr) Tj
-1 0 0 1 210.12 246.12 Tm
-(actical) Tj
-/R3 10 Tf
-1 0 0 1 241.92 246.12 Tm
-(algorithm) Tj
-1 0 0 1 285.359 246.12 Tm
-(for) Tj
-1 0 0 1 72 234.24 Tm
-(state) Tj
-1 0 0 1 92.0399 234.24 Tm
-(machine) Tj
-1 0 0 1 127.56 234.24 Tm
-(replication) Tj
-1 0 0 1 171.84 234.24 Tm
-([17) Tj
-1 0 0 1 185.16 234.24 Tm
-(,) Tj
-1 0 0 1 189.36 234.24 Tm
-(34) Tj
-1 0 0 1 199.32 234.24 Tm
-(]) Tj
-1 0 0 1 204.36 234.24 Tm
-(that) Tj
-1 0 0 1 221.159 234.24 Tm
-(tolerates) Tj
-1 0 0 1 256.559 234.24 Tm
-(Byzantine) Tj
-1 0 0 1 72 222.24 Tm
-(f) Tj
-1 0 0 1 75.24 222.24 Tm
-(aults.) Tj
-1 0 0 1 105.84 222.24 Tm
-(The) Tj
-1 0 0 1 125.76 222.24 Tm
-(algorithm) Tj
-1 0 0 1 168.84 222.24 Tm
-(of) Tj
-1 0 0 1 177 222.24 Tm
-(fers) Tj
-1 0 0 1 196.2 222.24 Tm
-(both) Tj
-1 0 0 1 218.28 222.24 Tm
-(li) Tj
-1 0 0 1 223.56 222.24 Tm
-(v) Tj
-1 0 0 1 228.48 222.24 Tm
-(eness) Tj
-1 0 0 1 254.399 222.24 Tm
-(and) Tj
-1 0 0 1 273.239 222.24 Tm
-(safety) Tj
-1 0 0 1 72 210.36 Tm
-(pro) Tj
-1 0 0 1 85.32 210.36 Tm
-(vided) Tj
-1 0 0 1 110.64 210.36 Tm
-(at) Tj
-1 0 0 1 121.08 210.36 Tm
-(most) Tj
-ET
-endstream
-endobj
-22 0 obj
-10155
-endobj
-23 0 obj
-<< /Type /XObject /Name /R23 /Subtype /Image /Length 24 0 R
-/ImageMask true /Width 26 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 26 /BlackIs1 true >>]
->>
-stream
-/da'+AAiuts8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!qbR:n&-~>
-endstream
-endobj
-24 0 obj
-60
-endobj
-25 0 obj
-<< /Length 26 0 R >>
-stream
-q
-2.6 0 0 -9.9 145.5 217.9 cm
-/R23 Do
-Q
-endstream
-endobj
-26 0 obj
-40
-endobj
-27 0 obj
-<< /Type /XObject /Name /R27 /Subtype /Image /Length 28 0 R
-/ImageMask true /Width 43 /Height 33 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 43 /BlackIs1 true >>]
->>
-stream
-366ZtBKi$Kj)nf1pi$0"h;="Vq3Z%=rV-?Z\+qmGnGV5SiW&fRKsuPqJ89Nq=JdRb$l@h'!$D~>
-endstream
-endobj
-28 0 obj
-76
-endobj
-29 0 obj
-<< /Length 30 0 R >>
-stream
-q
-4.3 0 0 -3.3 149.8 217.4 cm
-/R27 Do
-Q
-endstream
-endobj
-30 0 obj
-40
-endobj
-31 0 obj
-<< /Type /XObject /Name /R31 /Subtype /Image /Length 32 0 R
-/ImageMask true /Width 47 /Height 5 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 47 /BlackIs1 true >>]
->>
-stream
--D7RA!$D=~>
-endstream
-endobj
-32 0 obj
-12
-endobj
-33 0 obj
-<< /Length 34 0 R >>
-stream
-q
-4.7 0 0 -0.5 155.1 216.2 cm
-/R31 Do
-Q
-BT
-/R3 7 Tf
-1 0 0 1 160.68 214.2 Tm
-(1) Tj
-ET
-q
-14.64 0 0 -0.48 149.508 213.012 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 155.04 206.88 Tm
-(3) Tj
-ET
-endstream
-endobj
-34 0 obj
-213
-endobj
-35 0 obj
-<< /Type /XObject /Name /R35 /Subtype /Image /Length 36 0 R
-/ImageMask true /Width 26 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 26 /BlackIs1 true >>]
->>
-stream
-,Ct/ij?\:qs8W-!s8W-!s8W-!s8W-!s8W-!s+[0J!$D~>
-endstream
-endobj
-36 0 obj
-46
-endobj
-37 0 obj
-<< /Length 38 0 R >>
-stream
-q
-2.6 0 0 -9.9 165.3 217.9 cm
-/R35 Do
-Q
-BT
-/R3 10 Tf
-1 0 0 1 173.04 210.36 Tm
-(out) Tj
-1 0 0 1 189.12 210.36 Tm
-(of) Tj
-1 0 0 1 200.76 210.36 Tm
-(a) Tj
-1 0 0 1 208.56 210.36 Tm
-(total) Tj
-1 0 0 1 229.56 210.36 Tm
-(of) Tj
-ET
-endstream
-endobj
-38 0 obj
-224
-endobj
-39 0 obj
-<< /Type /XObject /Name /R39 /Subtype /Image /Length 40 0 R
-/ImageMask true /Width 54 /Height 46 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 54 /BlackIs1 true >>]
->>
-stream
-4N]t,$m>7rl/"o@d!re,
-pYTohhg]lis4_o!aocV_^Yur>rVsXfR^`8
-endstream
-endobj
-40 0 obj
-102
-endobj
-41 0 obj
-<< /Length 42 0 R >>
-stream
-q
-5.4 0 0 -4.6 241.4 214.9 cm
-/R39 Do
-Q
-BT
-1 0 0 1 250.56 210.36 Tm
-(replicas) Tj
-1 0 0 1 284.88 210.36 Tm
-(are) Tj
-1 0 0 1 72 198.36 Tm
-(simultaneously) Tj
-1 0 0 1 134.52 198.36 Tm
-(f) Tj
-1 0 0 1 137.76 198.36 Tm
-(aulty) Tj
-1 0 0 1 157.2 198.36 Tm
-(.) Tj
-1 0 0 1 162.96 198.36 Tm
-(This) Tj
-1 0 0 1 182.88 198.36 Tm
-(means) Tj
-1 0 0 1 210.6 198.36 Tm
-(that) Tj
-1 0 0 1 227.64 198.36 Tm
-(clients) Tj
-1 0 0 1 255.839 198.36 Tm
-(e) Tj
-1 0 0 1 260.039 198.36 Tm
-(v) Tj
-1 0 0 1 264.959 198.36 Tm
-(entually) Tj
-1 0 0 1 72 186.48 Tm
-(recei) Tj
-1 0 0 1 91.2 186.48 Tm
-(v) Tj
-1 0 0 1 96.1199 186.48 Tm
-(e) Tj
-1 0 0 1 105 186.48 Tm
-(replies) Tj
-1 0 0 1 136.2 186.48 Tm
-(to) Tj
-1 0 0 1 148.68 186.48 Tm
-(their) Tj
-1 0 0 1 171.6 186.48 Tm
-(requests) Tj
-1 0 0 1 208.92 186.48 Tm
-(and) Tj
-1 0 0 1 227.879 186.48 Tm
-(those) Tj
-1 0 0 1 253.559 186.48 Tm
-(replies) Tj
-1 0 0 1 284.879 186.48 Tm
-(are) Tj
-1 0 0 1 72 174.48 Tm
-(correct) Tj
-1 0 0 1 101.4 174.48 Tm
-(according) Tj
-1 0 0 1 142.56 174.48 Tm
-(to) Tj
-1 0 0 1 152.04 174.48 Tm
-(linearizability) Tj
-1 0 0 1 209.28 174.48 Tm
-([14) Tj
-1 0 0 1 222.48 174.48 Tm
-(,) Tj
-1 0 0 1 226.799 174.48 Tm
-(4].) Tj
-1 0 0 1 240.959 174.48 Tm
-(The) Tj
-1 0 0 1 258.239 174.48 Tm
-(algorithm) Tj
-1 0 0 1 72 162.48 Tm
-(w) Tj
-1 0 0 1 79.08 162.48 Tm
-(orks) Tj
-1 0 0 1 99.8399 162.48 Tm
-(in) Tj
-1 0 0 1 111.24 162.48 Tm
-(asynchronous) Tj
-1 0 0 1 169.56 162.48 Tm
-(systems) Tj
-1 0 0 1 204.72 162.48 Tm
-(lik) Tj
-1 0 0 1 215.16 162.48 Tm
-(e) Tj
-1 0 0 1 223.2 162.48 Tm
-(the) Tj
-1 0 0 1 238.919 162.48 Tm
-(Internet) Tj
-1 0 0 1 273.479 162.48 Tm
-(and) Tj
-1 0 0 1 291.479 162.48 Tm
-(it) Tj
-1 0 0 1 72 150.6 Tm
-(incorporates) Tj
-1 0 0 1 126 150.6 Tm
-(important) Tj
-1 0 0 1 169.44 150.6 Tm
-(optimizations) Tj
-1 0 0 1 228.48 150.6 Tm
-(that) Tj
-1 0 0 1 248.159 150.6 Tm
-(enable) Tj
-1 0 0 1 278.999 150.6 Tm
-(it) Tj
-1 0 0 1 289.199 150.6 Tm
-(to) Tj
-1 0 0 1 72 138.6 Tm
-(perform) Tj
-1 0 0 1 106.56 138.6 Tm
-(ef) Tj
-1 0 0 1 114.12 138.6 Tm
-(\256ciently) Tj
-1 0 0 1 146.28 138.6 Tm
-(.) Tj
-1 0 0 1 81.96 126.36 Tm
-(There) Tj
-1 0 0 1 110.04 126.36 Tm
-(is) Tj
-1 0 0 1 121.68 126.36 Tm
-(a) Tj
-1 0 0 1 130.92 126.36 Tm
-(signi\256cant) Tj
-1 0 0 1 177.36 126.36 Tm
-(body) Tj
-1 0 0 1 202.2 126.36 Tm
-(of) Tj
-1 0 0 1 215.4 126.36 Tm
-(w) Tj
-1 0 0 1 222.48 126.36 Tm
-(ork) Tj
-1 0 0 1 240.599 126.36 Tm
-(on) Tj
-1 0 0 1 255.479 126.36 Tm
-(agreement) Tj
-ET
-q
-90 0 0 -0.48 71.988 116.892 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-/R3 8 Tf
-1 0 0 1 72 108.84 Tm
-(This) Tj
-1 0 0 1 87.3599 108.84 Tm
-(research) Tj
-1 0 0 1 114.84 108.84 Tm
-(w) Tj
-1 0 0 1 120.48 108.84 Tm
-(as) Tj
-1 0 0 1 128.28 108.84 Tm
-(supported) Tj
-1 0 0 1 160.679 108.84 Tm
-(in) Tj
-1 0 0 1 167.999 108.84 Tm
-(p) Tj
-1 0 0 1 172.079 108.84 Tm
-(art) Tj
-1 0 0 1 181.679 108.84 Tm
-(by) Tj
-1 0 0 1 190.799 108.84 Tm
-(D) Tj
-1 0 0 1 196.319 108.84 Tm
-(ARP) Tj
-1 0 0 1 211.079 108.84 Tm
-(A) Tj
-1 0 0 1 218.039 108.84 Tm
-(unde) Tj
-1 0 0 1 233.519 108.84 Tm
-(r) Tj
-1 0 0 1 237.359 108.84 Tm
-(c) Tj
-1 0 0 1 240.959 108.84 Tm
-(ont) Tj
-1 0 0 1 251.159 108.84 Tm
-(rac) Tj
-1 0 0 1 260.879 108.84 Tm
-(t) Tj
-1 0 0 1 264.239 108.84 Tm
-(D) Tj
-1 0 0 1 269.759 108.84 Tm
-(ABT63-) Tj
-1 0 0 1 72 99.36 Tm
-(95-C-005,) Tj
-1 0 0 1 108.72 99.36 Tm
-(monitored) Tj
-1 0 0 1 145.2 99.36 Tm
-(by) Tj
-1 0 0 1 156.96 99.36 Tm
-(Army) Tj
-1 0 0 1 179.28 99.36 Tm
-(F) Tj
-1 0 0 1 183.6 99.36 Tm
-(ort) Tj
-1 0 0 1 196.2 99.36 Tm
-(Huachuca,) Tj
-1 0 0 1 234.239 99.36 Tm
-(and) Tj
-1 0 0 1 249.479 99.36 Tm
-(under) Tj
-1 0 0 1 271.319 99.36 Tm
-(contract) Tj
-1 0 0 1 72 89.88 Tm
-(F30602-98-1-0237,) Tj
-1 0 0 1 136.8 89.88 Tm
-(monitored) Tj
-1 0 0 1 172.08 89.88 Tm
-(by) Tj
-1 0 0 1 182.52 89.88 Tm
-(the) Tj
-1 0 0 1 194.759 89.88 Tm
-(Air) Tj
-1 0 0 1 207.839 89.88 Tm
-(F) Tj
-1 0 0 1 212.159 89.88 Tm
-(orce) Tj
-1 0 0 1 228.359 89.88 Tm
-(Research) Tj
-1 0 0 1 260.159 89.88 Tm
-(Laboratory) Tj
-1 0 0 1 294.839 89.88 Tm
-(,) Tj
-1 0 0 1 72 80.52 Tm
-(and) Tj
-1 0 0 1 84.5999 80.52 Tm
-(in) Tj
-1 0 0 1 91.9198 80.52 Tm
-(part) Tj
-1 0 0 1 105.36 80.52 Tm
-(by) Tj
-1 0 0 1 114.48 80.52 Tm
-(NEC.) Tj
-1 0 0 1 133.68 80.52 Tm
-(Miguel) Tj
-1 0 0 1 157.799 80.52 Tm
-(Ca) Tj
-1 0 0 1 166.679 80.52 Tm
-(stro) Tj
-1 0 0 1 179.879 80.52 Tm
-(w) Tj
-1 0 0 1 185.519 80.52 Tm
-(a) Tj
-1 0 0 1 189.119 80.52 Tm
-(s) Tj
-1 0 0 1 193.439 80.52 Tm
-(pa) Tj
-1 0 0 1 200.999 80.52 Tm
-(rti) Tj
-1 0 0 1 208.079 80.52 Tm
-(al) Tj
-1 0 0 1 213.839 80.52 Tm
-(ly) Tj
-1 0 0 1 221.279 80.52 Tm
-(suppor) Tj
-1 0 0 1 242.999 80.52 Tm
-(ted) Tj
-1 0 0 1 253.919 80.52 Tm
-(by) Tj
-1 0 0 1 263.159 80.52 Tm
-(a) Tj
-1 0 0 1 267.959 80.52 Tm
-(PRAXIS) Tj
-1 0 0 1 72 71.04 Tm
-(XXI) Tj
-1 0 0 1 88.1999 71.04 Tm
-(fello) Tj
-1 0 0 1 102.36 71.04 Tm
-(wship.) Tj
-/R3 10 Tf
-1 0 0 1 315 568.68 Tm
-(and) Tj
-1 0 0 1 332.4 568.68 Tm
-(replication) Tj
-1 0 0 1 378 568.68 Tm
-(techniques) Tj
-1 0 0 1 423.72 568.68 Tm
-(that) Tj
-1 0 0 1 441.6 568.68 Tm
-(tolerate) Tj
-1 0 0 1 474.599 568.68 Tm
-(Byzantine) Tj
-1 0 0 1 517.919 568.68 Tm
-(f) Tj
-1 0 0 1 521.159 568.68 Tm
-(aults) Tj
-1 0 0 1 315 556.8 Tm
-(\(starting) Tj
-1 0 0 1 351.72 556.8 Tm
-(with) Tj
-1 0 0 1 372.96 556.8 Tm
-([19) Tj
-1 0 0 1 386.28 556.8 Tm
-(]\).) Tj
-1 0 0 1 402.24 556.8 Tm
-(Ho) Tj
-1 0 0 1 414.24 556.8 Tm
-(we) Tj
-1 0 0 1 425.64 556.8 Tm
-(v) Tj
-1 0 0 1 430.56 556.8 Tm
-(er) Tj
-1 0 0 1 438 556.8 Tm
-(,) Tj
-1 0 0 1 444 556.8 Tm
-(most) Tj
-1 0 0 1 466.92 556.8 Tm
-(earlier) Tj
-1 0 0 1 495.839 556.8 Tm
-(w) Tj
-1 0 0 1 502.919 556.8 Tm
-(ork) Tj
-1 0 0 1 519.839 556.8 Tm
-(\(e.g.,) Tj
-1 0 0 1 315 544.8 Tm
-([3) Tj
-1 0 0 1 323.28 544.8 Tm
-(,) Tj
-1 0 0 1 331.68 544.8 Tm
-(24) Tj
-1 0 0 1 341.64 544.8 Tm
-(,) Tj
-1 0 0 1 350.04 544.8 Tm
-(10) Tj
-1 0 0 1 360 544.8 Tm
-(]\)) Tj
-1 0 0 1 372.48 544.8 Tm
-(either) Tj
-1 0 0 1 401.16 544.8 Tm
-(concerns) Tj
-1 0 0 1 442.44 544.8 Tm
-(techniques) Tj
-1 0 0 1 490.919 544.8 Tm
-(designed) Tj
-1 0 0 1 532.199 544.8 Tm
-(to) Tj
-1 0 0 1 315 532.92 Tm
-(demonstrate) Tj
-1 0 0 1 366.12 532.92 Tm
-(theoretical) Tj
-1 0 0 1 410.52 532.92 Tm
-(feasibility) Tj
-1 0 0 1 452.76 532.92 Tm
-(that) Tj
-1 0 0 1 470.159 532.92 Tm
-(are) Tj
-1 0 0 1 484.679 532.92 Tm
-(too) Tj
-1 0 0 1 499.799 532.92 Tm
-(inef) Tj
-1 0 0 1 515.159 532.92 Tm
-(\256cient) Tj
-1 0 0 1 315 520.92 Tm
-(to) Tj
-1 0 0 1 328.56 520.92 Tm
-(be) Tj
-1 0 0 1 343.8 520.92 Tm
-(used) Tj
-1 0 0 1 367.92 520.92 Tm
-(in) Tj
-1 0 0 1 381.6 520.92 Tm
-(practice,) Tj
-1 0 0 1 422.28 520.92 Tm
-(or) Tj
-1 0 0 1 436.44 520.92 Tm
-(assumes) Tj
-1 0 0 1 475.44 520.92 Tm
-(synchron) Tj
-1 0 0 1 512.159 520.92 Tm
-(y) Tj
-1 0 0 1 516.599 520.92 Tm
-(,) Tj
-1 0 0 1 525.359 520.92 Tm
-(i.e.,) Tj
-1 0 0 1 315 509.04 Tm
-(relies) Tj
-1 0 0 1 339.6 509.04 Tm
-(on) Tj
-1 0 0 1 352.68 509.04 Tm
-(kno) Tj
-1 0 0 1 367.56 509.04 Tm
-(wn) Tj
-1 0 0 1 382.56 509.04 Tm
-(bounds) Tj
-1 0 0 1 414.36 509.04 Tm
-(on) Tj
-1 0 0 1 427.44 509.04 Tm
-(message) Tj
-1 0 0 1 464.159 509.04 Tm
-(delays) Tj
-1 0 0 1 492.719 509.04 Tm
-(and) Tj
-1 0 0 1 510.119 509.04 Tm
-(process) Tj
-1 0 0 1 315 497.04 Tm
-(speeds.) Tj
-1 0 0 1 350.04 497.04 Tm
-(The) Tj
-1 0 0 1 368.76 497.04 Tm
-(systems) Tj
-1 0 0 1 403.56 497.04 Tm
-(closest) Tj
-1 0 0 1 434.04 497.04 Tm
-(to) Tj
-1 0 0 1 445.08 497.04 Tm
-(ours,) Tj
-1 0 0 1 468.119 497.04 Tm
-(Rampart) Tj
-1 0 0 1 505.679 497.04 Tm
-([30) Tj
-1 0 0 1 518.999 497.04 Tm
-(]) Tj
-1 0 0 1 525.599 497.04 Tm
-(and) Tj
-1 0 0 1 315 485.16 Tm
-(SecureRing) Tj
-1 0 0 1 364.08 485.16 Tm
-([16) Tj
-1 0 0 1 377.4 485.16 Tm
-(],) Tj
-1 0 0 1 385.92 485.16 Tm
-(were) Tj
-1 0 0 1 407.88 485.16 Tm
-(designed) Tj
-1 0 0 1 445.92 485.16 Tm
-(to) Tj
-1 0 0 1 456.36 485.16 Tm
-(be) Tj
-1 0 0 1 468.36 485.16 Tm
-(practical,) Tj
-1 0 0 1 507.839 485.16 Tm
-(b) Tj
-1 0 0 1 512.639 485.16 Tm
-(ut) Tj
-1 0 0 1 522.959 485.16 Tm
-(the) Tj
-1 0 0 1 535.079 485.16 Tm
-(y) Tj
-1 0 0 1 315 473.16 Tm
-(rely) Tj
-1 0 0 1 333 473.16 Tm
-(on) Tj
-1 0 0 1 345.36 473.16 Tm
-(the) Tj
-1 0 0 1 360.12 473.16 Tm
-(synchron) Tj
-1 0 0 1 396.84 473.16 Tm
-(y) Tj
-1 0 0 1 403.92 473.16 Tm
-(assumption) Tj
-1 0 0 1 451.8 473.16 Tm
-(for) Tj
-1 0 0 1 465.84 473.16 Tm
-(correctness,) Tj
-1 0 0 1 515.639 473.16 Tm
-(which) Tj
-1 0 0 1 315 461.28 Tm
-(is) Tj
-1 0 0 1 325.32 461.28 Tm
-(dangerous) Tj
-1 0 0 1 369.96 461.28 Tm
-(in) Tj
-1 0 0 1 381.48 461.28 Tm
-(the) Tj
-1 0 0 1 397.32 461.28 Tm
-(presence) Tj
-1 0 0 1 435.96 461.28 Tm
-(of) Tj
-1 0 0 1 447.96 461.28 Tm
-(malicious) Tj
-1 0 0 1 490.439 461.28 Tm
-(attacks.) Tj
-1 0 0 1 527.879 461.28 Tm
-(An) Tj
-1 0 0 1 315 449.28 Tm
-(attack) Tj
-1 0 0 1 338.76 449.28 Tm
-(er) Tj
-1 0 0 1 351.48 449.28 Tm
-(may) Tj
-1 0 0 1 373.68 449.28 Tm
-(compromise) Tj
-1 0 0 1 427.92 449.28 Tm
-(the) Tj
-1 0 0 1 445.2 449.28 Tm
-(safety) Tj
-1 0 0 1 474 449.28 Tm
-(of) Tj
-1 0 0 1 487.319 449.28 Tm
-(a) Tj
-1 0 0 1 496.799 449.28 Tm
-(service) Tj
-1 0 0 1 530.039 449.28 Tm
-(by) Tj
-1 0 0 1 315 437.28 Tm
-(delaying) Tj
-1 0 0 1 351 437.28 Tm
-(non-f) Tj
-1 0 0 1 372.72 437.28 Tm
-(aulty) Tj
-1 0 0 1 394.2 437.28 Tm
-(nodes) Tj
-1 0 0 1 419.16 437.28 Tm
-(or) Tj
-1 0 0 1 429.24 437.28 Tm
-(the) Tj
-1 0 0 1 443.04 437.28 Tm
-(communication) Tj
-1 0 0 1 506.759 437.28 Tm
-(between) Tj
-1 0 0 1 315 425.4 Tm
-(them) Tj
-1 0 0 1 336.72 425.4 Tm
-(until) Tj
-1 0 0 1 356.76 425.4 Tm
-(the) Tj
-1 0 0 1 368.88 425.4 Tm
-(y) Tj
-1 0 0 1 375.6 425.4 Tm
-(are) Tj
-1 0 0 1 389.52 425.4 Tm
-(tagged) Tj
-1 0 0 1 417.84 425.4 Tm
-(as) Tj
-1 0 0 1 427.92 425.4 Tm
-(f) Tj
-1 0 0 1 431.16 425.4 Tm
-(aulty) Tj
-1 0 0 1 452.879 425.4 Tm
-(and) Tj
-1 0 0 1 469.079 425.4 Tm
-(e) Tj
-1 0 0 1 473.399 425.4 Tm
-(xcluded) Tj
-1 0 0 1 506.639 425.4 Tm
-(from) Tj
-1 0 0 1 527.879 425.4 Tm
-(the) Tj
-1 0 0 1 315 413.4 Tm
-(replica) Tj
-1 0 0 1 343.8 413.4 Tm
-(group.) Tj
-1 0 0 1 372.72 413.4 Tm
-(Such) Tj
-1 0 0 1 394.32 413.4 Tm
-(a) Tj
-1 0 0 1 400.32 413.4 Tm
-(denial-of-service) Tj
-1 0 0 1 469.799 413.4 Tm
-(attack) Tj
-1 0 0 1 495.239 413.4 Tm
-(is) Tj
-1 0 0 1 503.399 413.4 Tm
-(generally) Tj
-1 0 0 1 315 401.52 Tm
-(easier) Tj
-1 0 0 1 340.68 401.52 Tm
-(than) Tj
-1 0 0 1 360.36 401.52 Tm
-(gaining) Tj
-1 0 0 1 392.64 401.52 Tm
-(control) Tj
-1 0 0 1 423.36 401.52 Tm
-(o) Tj
-1 0 0 1 428.28 401.52 Tm
-(v) Tj
-1 0 0 1 433.2 401.52 Tm
-(er) Tj
-1 0 0 1 443.279 401.52 Tm
-(a) Tj
-1 0 0 1 450.24 401.52 Tm
-(non-f) Tj
-1 0 0 1 471.959 401.52 Tm
-(aulty) Tj
-1 0 0 1 494.159 401.52 Tm
-(node.) Tj
-1 0 0 1 324.96 389.04 Tm
-(Our) Tj
-1 0 0 1 346.92 389.04 Tm
-(algorithm) Tj
-1 0 0 1 392.16 389.04 Tm
-(is) Tj
-1 0 0 1 405.24 389.04 Tm
-(not) Tj
-1 0 0 1 424.44 389.04 Tm
-(vulnerable) Tj
-1 0 0 1 473.04 389.04 Tm
-(to) Tj
-1 0 0 1 487.2 389.04 Tm
-(this) Tj
-1 0 0 1 508.079 389.04 Tm
-(type) Tj
-1 0 0 1 531.719 389.04 Tm
-(of) Tj
-1 0 0 1 315 377.04 Tm
-(attack) Tj
-1 0 0 1 345.6 377.04 Tm
-(because) Tj
-1 0 0 1 384 377.04 Tm
-(it) Tj
-1 0 0 1 396.36 377.04 Tm
-(does) Tj
-1 0 0 1 421.44 377.04 Tm
-(not) Tj
-1 0 0 1 441 377.04 Tm
-(rely) Tj
-1 0 0 1 463.44 377.04 Tm
-(on) Tj
-1 0 0 1 480.24 377.04 Tm
-(synchron) Tj
-1 0 0 1 516.959 377.04 Tm
-(y) Tj
-1 0 0 1 528.359 377.04 Tm
-(for) Tj
-1 0 0 1 315 365.16 Tm
-(safety) Tj
-1 0 0 1 338.28 365.16 Tm
-(.) Tj
-1 0 0 1 352.08 365.16 Tm
-(In) Tj
-1 0 0 1 365.52 365.16 Tm
-(addition,) Tj
-1 0 0 1 406.44 365.16 Tm
-(it) Tj
-1 0 0 1 417.12 365.16 Tm
-(impro) Tj
-1 0 0 1 441 365.16 Tm
-(v) Tj
-1 0 0 1 445.92 365.16 Tm
-(es) Tj
-1 0 0 1 458.999 365.16 Tm
-(the) Tj
-1 0 0 1 476.279 365.16 Tm
-(performance) Tj
-1 0 0 1 531.719 365.16 Tm
-(of) Tj
-1 0 0 1 315 353.16 Tm
-(Rampart) Tj
-1 0 0 1 354.72 353.16 Tm
-(and) Tj
-1 0 0 1 374.52 353.16 Tm
-(SecureRing) Tj
-1 0 0 1 426.48 353.16 Tm
-(by) Tj
-1 0 0 1 441.84 353.16 Tm
-(more) Tj
-1 0 0 1 467.76 353.16 Tm
-(than) Tj
-1 0 0 1 490.44 353.16 Tm
-(an) Tj
-1 0 0 1 505.199 353.16 Tm
-(order) Tj
-1 0 0 1 531.719 353.16 Tm
-(of) Tj
-1 0 0 1 315 341.28 Tm
-(magnitude) Tj
-1 0 0 1 360.6 341.28 Tm
-(as) Tj
-1 0 0 1 372.48 341.28 Tm
-(e) Tj
-1 0 0 1 376.8 341.28 Tm
-(xplained) Tj
-1 0 0 1 414.72 341.28 Tm
-(in) Tj
-1 0 0 1 426 341.28 Tm
-(Section) Tj
-1 0 0 1 459.48 341.28 Tm
-(7.) Tj
-1 0 0 1 473.879 341.28 Tm
-(It) Tj
-1 0 0 1 483.599 341.28 Tm
-(uses) Tj
-1 0 0 1 504.359 341.28 Tm
-(only) Tj
-1 0 0 1 525.599 341.28 Tm
-(one) Tj
-1 0 0 1 315 329.28 Tm
-(message) Tj
-1 0 0 1 351.96 329.28 Tm
-(round) Tj
-1 0 0 1 378.36 329.28 Tm
-(trip) Tj
-1 0 0 1 395.4 329.28 Tm
-(to) Tj
-1 0 0 1 406.32 329.28 Tm
-(e) Tj
-1 0 0 1 410.64 329.28 Tm
-(x) Tj
-1 0 0 1 415.56 329.28 Tm
-(ecute) Tj
-1 0 0 1 439.56 329.28 Tm
-(read-only) Tj
-1 0 0 1 480.959 329.28 Tm
-(operations) Tj
-1 0 0 1 525.599 329.28 Tm
-(and) Tj
-1 0 0 1 315 317.4 Tm
-(tw) Tj
-1 0 0 1 324.84 317.4 Tm
-(o) Tj
-1 0 0 1 335.04 317.4 Tm
-(to) Tj
-1 0 0 1 347.88 317.4 Tm
-(e) Tj
-1 0 0 1 352.2 317.4 Tm
-(x) Tj
-1 0 0 1 357.12 317.4 Tm
-(ecute) Tj
-1 0 0 1 383.28 317.4 Tm
-(read-write) Tj
-1 0 0 1 429.36 317.4 Tm
-(operations.) Tj
-1 0 0 1 485.039 317.4 Tm
-(Also,) Tj
-1 0 0 1 512.159 317.4 Tm
-(it) Tj
-1 0 0 1 522.839 317.4 Tm
-(uses) Tj
-1 0 0 1 315 305.4 Tm
-(an) Tj
-1 0 0 1 329.52 305.4 Tm
-(ef) Tj
-1 0 0 1 337.08 305.4 Tm
-(\256cient) Tj
-1 0 0 1 366.96 305.4 Tm
-(authentication) Tj
-1 0 0 1 428.52 305.4 Tm
-(scheme) Tj
-1 0 0 1 463.44 305.4 Tm
-(based) Tj
-1 0 0 1 491.159 305.4 Tm
-(on) Tj
-1 0 0 1 506.279 305.4 Tm
-(message) Tj
-1 0 0 1 315 293.52 Tm
-(authentication) Tj
-1 0 0 1 373.2 293.52 Tm
-(codes) Tj
-1 0 0 1 397.56 293.52 Tm
-(during) Tj
-1 0 0 1 425.28 293.52 Tm
-(normal) Tj
-1 0 0 1 455.28 293.52 Tm
-(operation;) Tj
-1 0 0 1 497.639 293.52 Tm
-(public-k) Tj
-1 0 0 1 530.999 293.52 Tm
-(e) Tj
-1 0 0 1 535.319 293.52 Tm
-(y) Tj
-1 0 0 1 315 281.52 Tm
-(cryptography) Tj
-1 0 0 1 368.04 281.52 Tm
-(,) Tj
-1 0 0 1 372.72 281.52 Tm
-(which) Tj
-1 0 0 1 399.84 281.52 Tm
-(w) Tj
-1 0 0 1 406.92 281.52 Tm
-(as) Tj
-1 0 0 1 417.96 281.52 Tm
-(cited) Tj
-1 0 0 1 440.04 281.52 Tm
-(as) Tj
-1 0 0 1 451.08 281.52 Tm
-(the) Tj
-1 0 0 1 466.079 281.52 Tm
-(major) Tj
-1 0 0 1 491.999 281.52 Tm
-(latenc) Tj
-1 0 0 1 515.759 281.52 Tm
-(y) Tj
-1 0 0 1 523.439 281.52 Tm
-([29) Tj
-1 0 0 1 536.639 281.52 Tm
-(]) Tj
-1 0 0 1 315 269.64 Tm
-(and) Tj
-1 0 0 1 332.04 269.64 Tm
-(throughput) Tj
-1 0 0 1 378.48 269.64 Tm
-([22) Tj
-1 0 0 1 391.8 269.64 Tm
-(]) Tj
-1 0 0 1 397.8 269.64 Tm
-(bottleneck) Tj
-1 0 0 1 441.96 269.64 Tm
-(in) Tj
-1 0 0 1 452.4 269.64 Tm
-(Rampart,) Tj
-1 0 0 1 491.999 269.64 Tm
-(is) Tj
-1 0 0 1 501.359 269.64 Tm
-(used) Tj
-1 0 0 1 522.239 269.64 Tm
-(only) Tj
-1 0 0 1 315 257.64 Tm
-(when) Tj
-1 0 0 1 339.12 257.64 Tm
-(there) Tj
-1 0 0 1 361.44 257.64 Tm
-(are) Tj
-1 0 0 1 376.08 257.64 Tm
-(f) Tj
-1 0 0 1 379.32 257.64 Tm
-(aults.) Tj
-1 0 0 1 324.96 245.16 Tm
-(T) Tj
-1 0 0 1 330.24 245.16 Tm
-(o) Tj
-1 0 0 1 338.28 245.16 Tm
-(e) Tj
-1 0 0 1 342.48 245.16 Tm
-(v) Tj
-1 0 0 1 347.28 245.16 Tm
-(aluate) Tj
-1 0 0 1 373.92 245.16 Tm
-(our) Tj
-1 0 0 1 390.24 245.16 Tm
-(approach,) Tj
-1 0 0 1 432.48 245.16 Tm
-(we) Tj
-1 0 0 1 447.12 245.16 Tm
-(implemented) Tj
-1 0 0 1 502.079 245.16 Tm
-(a) Tj
-1 0 0 1 509.519 245.16 Tm
-(replica-) Tj
-1 0 0 1 315 233.16 Tm
-(tion) Tj
-1 0 0 1 334.2 233.16 Tm
-(library) Tj
-1 0 0 1 364.56 233.16 Tm
-(and) Tj
-1 0 0 1 382.68 233.16 Tm
-(used) Tj
-1 0 0 1 404.64 233.16 Tm
-(it) Tj
-1 0 0 1 413.88 233.16 Tm
-(to) Tj
-1 0 0 1 425.4 233.16 Tm
-(implement) Tj
-1 0 0 1 471.719 233.16 Tm
-(a) Tj
-1 0 0 1 479.879 233.16 Tm
-(real) Tj
-1 0 0 1 498.479 233.16 Tm
-(service:) Tj
-1 0 0 1 535.559 233.16 Tm
-(a) Tj
-1 0 0 1 315 221.28 Tm
-(Byzantine-f) Tj
-1 0 0 1 362.16 221.28 Tm
-(ault-tolerant) Tj
-1 0 0 1 413.52 221.28 Tm
-(distrib) Tj
-1 0 0 1 438.84 221.28 Tm
-(uted) Tj
-1 0 0 1 458.879 221.28 Tm
-(\256le) Tj
-1 0 0 1 474.479 221.28 Tm
-(system) Tj
-1 0 0 1 504.959 221.28 Tm
-(that) Tj
-1 0 0 1 522.839 221.28 Tm
-(sup-) Tj
-1 0 0 1 315 209.28 Tm
-(ports) Tj
-1 0 0 1 339 209.28 Tm
-(the) Tj
-1 0 0 1 355.2 209.28 Tm
-(NFS) Tj
-1 0 0 1 377.52 209.28 Tm
-(protocol.) Tj
-1 0 0 1 421.44 209.28 Tm
-(W) Tj
-1 0 0 1 429.96 209.28 Tm
-(e) Tj
-1 0 0 1 438.48 209.28 Tm
-(used) Tj
-1 0 0 1 460.8 209.28 Tm
-(the) Tj
-1 0 0 1 476.999 209.28 Tm
-(Andre) Tj
-1 0 0 1 501.839 209.28 Tm
-(w) Tj
-1 0 0 1 512.879 209.28 Tm
-(bench-) Tj
-1 0 0 1 315 197.4 Tm
-(mark) Tj
-1 0 0 1 337.32 197.4 Tm
-([15) Tj
-1 0 0 1 350.52 197.4 Tm
-(]) Tj
-1 0 0 1 355.68 197.4 Tm
-(to) Tj
-1 0 0 1 365.16 197.4 Tm
-(e) Tj
-1 0 0 1 369.36 197.4 Tm
-(v) Tj
-1 0 0 1 374.16 197.4 Tm
-(aluate) Tj
-1 0 0 1 399.72 197.4 Tm
-(the) Tj
-1 0 0 1 413.64 197.4 Tm
-(performance) Tj
-1 0 0 1 465.84 197.4 Tm
-(of) Tj
-1 0 0 1 475.919 197.4 Tm
-(our) Tj
-1 0 0 1 490.919 197.4 Tm
-(system.) Tj
-1 0 0 1 524.519 197.4 Tm
-(The) Tj
-1 0 0 1 315 185.4 Tm
-(results) Tj
-1 0 0 1 343.92 185.4 Tm
-(sho) Tj
-1 0 0 1 357.6 185.4 Tm
-(w) Tj
-1 0 0 1 367.56 185.4 Tm
-(that) Tj
-1 0 0 1 385.44 185.4 Tm
-(our) Tj
-1 0 0 1 401.64 185.4 Tm
-(system) Tj
-1 0 0 1 432.24 185.4 Tm
-(is) Tj
-1 0 0 1 441.72 185.4 Tm
-(only) Tj
-1 0 0 1 462.359 185.4 Tm
-(3%) Tj
-1 0 0 1 478.559 185.4 Tm
-(slo) Tj
-1 0 0 1 489.959 185.4 Tm
-(wer) Tj
-1 0 0 1 507.719 185.4 Tm
-(than) Tj
-1 0 0 1 527.879 185.4 Tm
-(the) Tj
-1 0 0 1 315 173.52 Tm
-(standard) Tj
-1 0 0 1 351.6 173.52 Tm
-(NFS) Tj
-1 0 0 1 372.84 173.52 Tm
-(daemon) Tj
-1 0 0 1 407.28 173.52 Tm
-(in) Tj
-1 0 0 1 417.84 173.52 Tm
-(the) Tj
-1 0 0 1 432.96 173.52 Tm
-(Digital) Tj
-1 0 0 1 463.44 173.52 Tm
-(Unix) Tj
-1 0 0 1 486.359 173.52 Tm
-(k) Tj
-1 0 0 1 491.279 173.52 Tm
-(ernel) Tj
-1 0 0 1 513.959 173.52 Tm
-(during) Tj
-1 0 0 1 315 161.52 Tm
-(normal-case) Tj
-1 0 0 1 366.12 161.52 Tm
-(operation.) Tj
-1 0 0 1 324.96 149.04 Tm
-(Thus,) Tj
-1 0 0 1 349.92 149.04 Tm
-(the) Tj
-1 0 0 1 364.56 149.04 Tm
-(paper) Tj
-1 0 0 1 389.16 149.04 Tm
-(mak) Tj
-1 0 0 1 406.32 149.04 Tm
-(es) Tj
-1 0 0 1 417 149.04 Tm
-(the) Tj
-1 0 0 1 431.64 149.04 Tm
-(follo) Tj
-1 0 0 1 450.36 149.04 Tm
-(wing) Tj
-1 0 0 1 472.679 149.04 Tm
-(contrib) Tj
-1 0 0 1 500.879 149.04 Tm
-(utions:) Tj
-ET
-endstream
-endobj
-42 0 obj
-17137
-endobj
-43 0 obj
-<< /Type /XObject /Name /R43 /Subtype /Image /Length 44 0 R
-/ImageMask true /Width 39 /Height 39 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 39 /BlackIs1 true >>]
->>
-stream
-3f*u*F9LP-kW3[R5O&26s8VF=rNC"SR~>
-endstream
-endobj
-44 0 obj
-48
-endobj
-45 0 obj
-<< /Length 46 0 R >>
-stream
-q
-3.9 0 0 -3.9 320.5 138.1 cm
-/R43 Do
-Q
-BT
-1 0 0 1 330 133.56 Tm
-(It) Tj
-1 0 0 1 338.88 133.56 Tm
-(describes) Tj
-1 0 0 1 378.72 133.56 Tm
-(the) Tj
-1 0 0 1 393.72 133.56 Tm
-(\256rst) Tj
-1 0 0 1 412.08 133.56 Tm
-(state-machine) Tj
-1 0 0 1 470.16 133.56 Tm
-(replication) Tj
-1 0 0 1 515.639 133.56 Tm
-(proto-) Tj
-1 0 0 1 330 121.56 Tm
-(col) Tj
-1 0 0 1 345.36 121.56 Tm
-(that) Tj
-1 0 0 1 363.6 121.56 Tm
-(correctly) Tj
-1 0 0 1 402.36 121.56 Tm
-(survi) Tj
-1 0 0 1 422.16 121.56 Tm
-(v) Tj
-1 0 0 1 427.08 121.56 Tm
-(es) Tj
-1 0 0 1 438.36 121.56 Tm
-(Byzantine) Tj
-1 0 0 1 482.04 121.56 Tm
-(f) Tj
-1 0 0 1 485.279 121.56 Tm
-(aults) Tj
-1 0 0 1 507.359 121.56 Tm
-(in) Tj
-1 0 0 1 518.399 121.56 Tm
-(asyn-) Tj
-1 0 0 1 330 109.56 Tm
-(chronous) Tj
-1 0 0 1 369 109.56 Tm
-(netw) Tj
-1 0 0 1 388.32 109.56 Tm
-(orks.) Tj
-ET
-q
-3.9 0 0 -3.9 320.5 99.4 cm
-/R43 Do
-Q
-BT
-1 0 0 1 330 94.92 Tm
-(It) Tj
-1 0 0 1 338.28 94.92 Tm
-(describes) Tj
-1 0 0 1 377.64 94.92 Tm
-(a) Tj
-1 0 0 1 384.24 94.92 Tm
-(number) Tj
-1 0 0 1 417 94.92 Tm
-(of) Tj
-1 0 0 1 427.56 94.92 Tm
-(important) Tj
-1 0 0 1 468.599 94.92 Tm
-(optimizations) Tj
-1 0 0 1 524.999 94.92 Tm
-(that) Tj
-1 0 0 1 330 82.92 Tm
-(allo) Tj
-1 0 0 1 344.76 82.92 Tm
-(w) Tj
-1 0 0 1 354.6 82.92 Tm
-(the) Tj
-1 0 0 1 369.6 82.92 Tm
-(algorithm) Tj
-1 0 0 1 411 82.92 Tm
-(to) Tj
-1 0 0 1 421.56 82.92 Tm
-(perform) Tj
-1 0 0 1 456.48 82.92 Tm
-(well) Tj
-1 0 0 1 476.4 82.92 Tm
-(so) Tj
-1 0 0 1 487.919 82.92 Tm
-(that) Tj
-1 0 0 1 505.679 82.92 Tm
-(it) Tj
-1 0 0 1 513.959 82.92 Tm
-(can) Tj
-1 0 0 1 530.639 82.92 Tm
-(be) Tj
-1 0 0 1 330 71.04 Tm
-(used) Tj
-1 0 0 1 350.64 71.04 Tm
-(in) Tj
-1 0 0 1 360.96 71.04 Tm
-(real) Tj
-1 0 0 1 378.36 71.04 Tm
-(systems.) Tj
-1 0 0 1 303.48 35.16 Tm
-(1) Tj
-ET
-Q
-endstream
-endobj
-46 0 obj
-1695
-endobj
-47 0 obj
-<<
-/Type /Page
-/MediaBox [0 0 612 792]
-/Parent 2 0 R
-/Resources << /ProcSet [/PDF /ImageB /Text]
-/Font <<
-/R16 16 0 R
-/R9 9 0 R
-/R6 6 0 R
-/R3 3 0 R
->>
-/XObject <<
-/R43 43 0 R
-/R39 39 0 R
-/R35 35 0 R
-/R31 31 0 R
-/R27 27 0 R
-/R23 23 0 R
-/R19 19 0 R
-/R12 12 0 R
->>
->>
-/Contents [
-4 0 R
-7 0 R
-10 0 R
-14 0 R
-17 0 R
-21 0 R
-25 0 R
-29 0 R
-33 0 R
-37 0 R
-41 0 R
-45 0 R
-]
->>
-endobj
-48 0 obj
-<< /Length 49 0 R >>
-stream
-q
-Q
-q
-W
-0 0 612 792 re
-n
-endstream
-endobj
-49 0 obj
-25
-endobj
-50 0 obj
-<< /Type /XObject /Name /R50 /Subtype /Image /Length 51 0 R
-/ImageMask true /Width 39 /Height 39 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 39 /BlackIs1 true >>]
->>
-stream
-3f*u*F9LP-kW3[R5O&26s8VF=rNC"SR~>
-endstream
-endobj
-51 0 obj
-48
-endobj
-52 0 obj
-<< /Length 53 0 R >>
-stream
-q
-3.9 0 0 -3.9 77.5 713.6 cm
-/R50 Do
-Q
-endstream
-endobj
-53 0 obj
-39
-endobj
-54 0 obj
-<< /Type /Font /Name /R54 /Subtype /Type1 /BaseFont /Times-Roman >>
-endobj
-55 0 obj
-<< /Length 56 0 R >>
-stream
-BT
-/R54 10 Tf
-1 0 0 1 87 709.08 Tm
-(It) Tj
-1 0 0 1 95.3999 709.08 Tm
-(describes) Tj
-1 0 0 1 134.88 709.08 Tm
-(the) Tj
-1 0 0 1 149.4 709.08 Tm
-(implementation) Tj
-1 0 0 1 214.32 709.08 Tm
-(of) Tj
-1 0 0 1 225 709.08 Tm
-(a) Tj
-1 0 0 1 231.839 709.08 Tm
-(Byzantine-f) Tj
-1 0 0 1 278.999 709.08 Tm
-(ault-) Tj
-1 0 0 1 87 697.08 Tm
-(tolerant) Tj
-1 0 0 1 119.88 697.08 Tm
-(distrib) Tj
-1 0 0 1 145.2 697.08 Tm
-(uted) Tj
-1 0 0 1 164.76 697.08 Tm
-(\256le) Tj
-1 0 0 1 180 697.08 Tm
-(system.) Tj
-ET
-q
-3.9 0 0 -3.9 77.5 687.2 cm
-/R50 Do
-Q
-BT
-1 0 0 1 87 682.68 Tm
-(It) Tj
-1 0 0 1 95.2799 682.68 Tm
-(pro) Tj
-1 0 0 1 108.6 682.68 Tm
-(vides) Tj
-1 0 0 1 131.64 682.68 Tm
-(e) Tj
-1 0 0 1 135.96 682.68 Tm
-(xperimental) Tj
-1 0 0 1 185.76 682.68 Tm
-(results) Tj
-1 0 0 1 213.96 682.68 Tm
-(that) Tj
-1 0 0 1 231.12 682.68 Tm
-(quantify) Tj
-1 0 0 1 266.519 682.68 Tm
-(the) Tj
-1 0 0 1 280.919 682.68 Tm
-(cost) Tj
-1 0 0 1 87 670.8 Tm
-(of) Tj
-1 0 0 1 97.6799 670.8 Tm
-(the) Tj
-1 0 0 1 112.44 670.8 Tm
-(replication) Tj
-1 0 0 1 157.44 670.8 Tm
-(technique.) Tj
-1 0 0 1 81.96 653.76 Tm
-(The) Tj
-1 0 0 1 101.28 653.76 Tm
-(remainder) Tj
-1 0 0 1 145.44 653.76 Tm
-(of) Tj
-1 0 0 1 157.56 653.76 Tm
-(the) Tj
-1 0 0 1 173.52 653.76 Tm
-(paper) Tj
-1 0 0 1 199.44 653.76 Tm
-(is) Tj
-1 0 0 1 209.88 653.76 Tm
-(or) Tj
-1 0 0 1 218.16 653.76 Tm
-(ganized) Tj
-1 0 0 1 252.719 653.76 Tm
-(as) Tj
-1 0 0 1 264.839 653.76 Tm
-(follo) Tj
-1 0 0 1 283.559 653.76 Tm
-(ws.) Tj
-1 0 0 1 72 641.88 Tm
-(W) Tj
-1 0 0 1 80.52 641.88 Tm
-(e) Tj
-1 0 0 1 87.48 641.88 Tm
-(be) Tj
-1 0 0 1 96.8399 641.88 Tm
-(gin) Tj
-1 0 0 1 111.84 641.88 Tm
-(by) Tj
-1 0 0 1 124.2 641.88 Tm
-(describing) Tj
-1 0 0 1 168.12 641.88 Tm
-(our) Tj
-1 0 0 1 183.84 641.88 Tm
-(system) Tj
-1 0 0 1 213.84 641.88 Tm
-(model,) Tj
-1 0 0 1 243.719 641.88 Tm
-(including) Tj
-1 0 0 1 283.679 641.88 Tm
-(our) Tj
-1 0 0 1 72 629.88 Tm
-(f) Tj
-1 0 0 1 75.24 629.88 Tm
-(ailure) Tj
-1 0 0 1 102.12 629.88 Tm
-(assumptions.) Tj
-1 0 0 1 162.72 629.88 Tm
-(Section) Tj
-1 0 0 1 196.8 629.88 Tm
-(3) Tj
-1 0 0 1 206.04 629.88 Tm
-(describes) Tj
-1 0 0 1 247.439 629.88 Tm
-(the) Tj
-1 0 0 1 263.759 629.88 Tm
-(problem) Tj
-1 0 0 1 72 618 Tm
-(solv) Tj
-1 0 0 1 88.56 618 Tm
-(ed) Tj
-1 0 0 1 99.7199 618 Tm
-(by) Tj
-1 0 0 1 111.48 618 Tm
-(the) Tj
-1 0 0 1 125.52 618 Tm
-(algorithm) Tj
-1 0 0 1 166.08 618 Tm
-(and) Tj
-1 0 0 1 182.4 618 Tm
-(states) Tj
-1 0 0 1 206.279 618 Tm
-(correctness) Tj
-1 0 0 1 252.959 618 Tm
-(conditions.) Tj
-1 0 0 1 72 606 Tm
-(The) Tj
-1 0 0 1 93.4799 606 Tm
-(algorithm) Tj
-1 0 0 1 138.24 606 Tm
-(is) Tj
-1 0 0 1 150.84 606 Tm
-(described) Tj
-1 0 0 1 195 606 Tm
-(in) Tj
-1 0 0 1 208.8 606 Tm
-(Section) Tj
-1 0 0 1 244.679 606 Tm
-(4) Tj
-1 0 0 1 255.599 606 Tm
-(and) Tj
-1 0 0 1 275.999 606 Tm
-(some) Tj
-1 0 0 1 72 594.12 Tm
-(important) Tj
-1 0 0 1 116.88 594.12 Tm
-(optimizations) Tj
-1 0 0 1 177.12 594.12 Tm
-(are) Tj
-1 0 0 1 195.48 594.12 Tm
-(described) Tj
-1 0 0 1 239.76 594.12 Tm
-(in) Tj
-1 0 0 1 253.559 594.12 Tm
-(Section) Tj
-1 0 0 1 289.559 594.12 Tm
-(5.) Tj
-1 0 0 1 72 582.12 Tm
-(Section) Tj
-1 0 0 1 107.52 582.12 Tm
-(6) Tj
-1 0 0 1 118.08 582.12 Tm
-(describes) Tj
-1 0 0 1 160.8 582.12 Tm
-(our) Tj
-1 0 0 1 179.64 582.12 Tm
-(replication) Tj
-1 0 0 1 227.88 582.12 Tm
-(library) Tj
-1 0 0 1 260.039 582.12 Tm
-(and) Tj
-1 0 0 1 280.079 582.12 Tm
-(ho) Tj
-1 0 0 1 289.919 582.12 Tm
-(w) Tj
-1 0 0 1 72 570.24 Tm
-(we) Tj
-1 0 0 1 90.1199 570.24 Tm
-(used) Tj
-1 0 0 1 114.96 570.24 Tm
-(it) Tj
-1 0 0 1 126.96 570.24 Tm
-(to) Tj
-1 0 0 1 141.24 570.24 Tm
-(implement) Tj
-1 0 0 1 190.44 570.24 Tm
-(a) Tj
-1 0 0 1 201.36 570.24 Tm
-(Byzantine-f) Tj
-1 0 0 1 248.519 570.24 Tm
-(ault-tolerant) Tj
-1 0 0 1 72 558.24 Tm
-(NFS.) Tj
-1 0 0 1 96 558.24 Tm
-(Section) Tj
-1 0 0 1 129.12 558.24 Tm
-(7) Tj
-1 0 0 1 137.4 558.24 Tm
-(presents) Tj
-1 0 0 1 173.28 558.24 Tm
-(the) Tj
-1 0 0 1 188.64 558.24 Tm
-(results) Tj
-1 0 0 1 217.92 558.24 Tm
-(of) Tj
-1 0 0 1 229.44 558.24 Tm
-(our) Tj
-1 0 0 1 246 558.24 Tm
-(e) Tj
-1 0 0 1 250.32 558.24 Tm
-(xperiments.) Tj
-1 0 0 1 72 546.24 Tm
-(Section) Tj
-1 0 0 1 105.48 546.24 Tm
-(8) Tj
-1 0 0 1 114 546.24 Tm
-(discusses) Tj
-1 0 0 1 154.68 546.24 Tm
-(related) Tj
-1 0 0 1 185.4 546.24 Tm
-(w) Tj
-1 0 0 1 192.48 546.24 Tm
-(ork.) Tj
-1 0 0 1 215.16 546.24 Tm
-(W) Tj
-1 0 0 1 223.68 546.24 Tm
-(e) Tj
-1 0 0 1 231.72 546.24 Tm
-(conclude) Tj
-1 0 0 1 271.319 546.24 Tm
-(with) Tj
-1 0 0 1 292.559 546.24 Tm
-(a) Tj
-1 0 0 1 72 534.36 Tm
-(summary) Tj
-1 0 0 1 111 534.36 Tm
-(of) Tj
-1 0 0 1 121.2 534.36 Tm
-(what) Tj
-1 0 0 1 142.44 534.36 Tm
-(we) Tj
-1 0 0 1 155.88 534.36 Tm
-(ha) Tj
-1 0 0 1 165.12 534.36 Tm
-(v) Tj
-1 0 0 1 170.04 534.36 Tm
-(e) Tj
-1 0 0 1 176.28 534.36 Tm
-(accomplished) Tj
-1 0 0 1 232.92 534.36 Tm
-(and) Tj
-1 0 0 1 249.119 534.36 Tm
-(a) Tj
-1 0 0 1 255.479 534.36 Tm
-(discussion) Tj
-1 0 0 1 72 522.36 Tm
-(of) Tj
-1 0 0 1 82.8 522.36 Tm
-(future) Tj
-1 0 0 1 109.08 522.36 Tm
-(research) Tj
-1 0 0 1 144.72 522.36 Tm
-(directions.) Tj
-ET
-endstream
-endobj
-56 0 obj
-4797
-endobj
-57 0 obj
-<< /Type /Font /Name /R57 /Subtype /Type1 /BaseFont /Times-Bold >>
-endobj
-58 0 obj
-<< /Length 59 0 R >>
-stream
-BT
-/R57 12 Tf
-1 0 0 1 72 495.24 Tm
-(2) Tj
-1 0 0 1 89.8799 495.24 Tm
-(System) Tj
-1 0 0 1 129.48 495.24 Tm
-(Model) Tj
-/R54 10 Tf
-1 0 0 1 72 478.2 Tm
-(W) Tj
-1 0 0 1 80.52 478.2 Tm
-(e) Tj
-1 0 0 1 89.04 478.2 Tm
-(assume) Tj
-1 0 0 1 122.4 478.2 Tm
-(an) Tj
-1 0 0 1 135.72 478.2 Tm
-(asynchronous) Tj
-1 0 0 1 194.52 478.2 Tm
-(distrib) Tj
-1 0 0 1 219.84 478.2 Tm
-(uted) Tj
-1 0 0 1 240.96 478.2 Tm
-(system) Tj
-1 0 0 1 272.639 478.2 Tm
-(where) Tj
-1 0 0 1 72 466.2 Tm
-(nodes) Tj
-1 0 0 1 99.1199 466.2 Tm
-(are) Tj
-1 0 0 1 115.08 466.2 Tm
-(connected) Tj
-1 0 0 1 159.36 466.2 Tm
-(by) Tj
-1 0 0 1 173.16 466.2 Tm
-(a) Tj
-1 0 0 1 181.44 466.2 Tm
-(netw) Tj
-1 0 0 1 200.76 466.2 Tm
-(ork.) Tj
-1 0 0 1 224.16 466.2 Tm
-(The) Tj
-1 0 0 1 243.48 466.2 Tm
-(netw) Tj
-1 0 0 1 262.799 466.2 Tm
-(ork) Tj
-1 0 0 1 279.839 466.2 Tm
-(may) Tj
-1 0 0 1 72 454.32 Tm
-(f) Tj
-1 0 0 1 75.24 454.32 Tm
-(ail) Tj
-1 0 0 1 88.3199 454.32 Tm
-(to) Tj
-1 0 0 1 99.1199 454.32 Tm
-(deli) Tj
-1 0 0 1 113.88 454.32 Tm
-(v) Tj
-1 0 0 1 118.8 454.32 Tm
-(er) Tj
-1 0 0 1 129.6 454.32 Tm
-(messages,) Tj
-1 0 0 1 172.92 454.32 Tm
-(delay) Tj
-1 0 0 1 197.64 454.32 Tm
-(them,) Tj
-1 0 0 1 223.32 454.32 Tm
-(duplicate) Tj
-1 0 0 1 263.039 454.32 Tm
-(them,) Tj
-1 0 0 1 288.719 454.32 Tm
-(or) Tj
-1 0 0 1 72 442.32 Tm
-(deli) Tj
-1 0 0 1 86.76 442.32 Tm
-(v) Tj
-1 0 0 1 91.68 442.32 Tm
-(er) Tj
-1 0 0 1 101.76 442.32 Tm
-(them) Tj
-1 0 0 1 124.2 442.32 Tm
-(out) Tj
-1 0 0 1 139.44 442.32 Tm
-(of) Tj
-1 0 0 1 150.24 442.32 Tm
-(order) Tj
-1 0 0 1 170.88 442.32 Tm
-(.) Tj
-1 0 0 1 81.96 430.08 Tm
-(W) Tj
-1 0 0 1 90.48 430.08 Tm
-(e) Tj
-1 0 0 1 98.64 430.08 Tm
-(use) Tj
-1 0 0 1 115.56 430.08 Tm
-(a) Tj
-1 0 0 1 123.6 430.08 Tm
-(Byzantine) Tj
-1 0 0 1 167.64 430.08 Tm
-(f) Tj
-1 0 0 1 170.88 430.08 Tm
-(ailure) Tj
-1 0 0 1 197.16 430.08 Tm
-(model,) Tj
-1 0 0 1 228.359 430.08 Tm
-(i.e.,) Tj
-1 0 0 1 246.959 430.08 Tm
-(f) Tj
-1 0 0 1 250.199 430.08 Tm
-(aulty) Tj
-1 0 0 1 273.719 430.08 Tm
-(nodes) Tj
-1 0 0 1 72 418.08 Tm
-(may) Tj
-1 0 0 1 93.6 418.08 Tm
-(beha) Tj
-1 0 0 1 112.32 418.08 Tm
-(v) Tj
-1 0 0 1 117.24 418.08 Tm
-(e) Tj
-1 0 0 1 126 418.08 Tm
-(arbitrarily) Tj
-1 0 0 1 165.48 418.08 Tm
-(,) Tj
-1 0 0 1 172.68 418.08 Tm
-(subject) Tj
-1 0 0 1 205.44 418.08 Tm
-(only) Tj
-1 0 0 1 227.64 418.08 Tm
-(to) Tj
-1 0 0 1 239.88 418.08 Tm
-(the) Tj
-1 0 0 1 256.559 418.08 Tm
-(restriction) Tj
-1 0 0 1 72 406.08 Tm
-(mentioned) Tj
-1 0 0 1 116.28 406.08 Tm
-(belo) Tj
-1 0 0 1 133.32 406.08 Tm
-(w) Tj
-1 0 0 1 139.92 406.08 Tm
-(.) Tj
-1 0 0 1 145.68 406.08 Tm
-(W) Tj
-1 0 0 1 154.2 406.08 Tm
-(e) Tj
-1 0 0 1 160.8 406.08 Tm
-(assume) Tj
-1 0 0 1 192.36 406.08 Tm
-(independent) Tj
-1 0 0 1 243.24 406.08 Tm
-(node) Tj
-1 0 0 1 264.719 406.08 Tm
-(f) Tj
-1 0 0 1 267.959 406.08 Tm
-(ailures.) Tj
-1 0 0 1 72 394.2 Tm
-(F) Tj
-1 0 0 1 77.4 394.2 Tm
-(or) Tj
-1 0 0 1 87.3599 394.2 Tm
-(this) Tj
-1 0 0 1 103.44 394.2 Tm
-(assumption) Tj
-1 0 0 1 150.6 394.2 Tm
-(to) Tj
-1 0 0 1 160.08 394.2 Tm
-(be) Tj
-1 0 0 1 171.12 394.2 Tm
-(true) Tj
-1 0 0 1 188.4 394.2 Tm
-(in) Tj
-1 0 0 1 197.76 394.2 Tm
-(the) Tj
-1 0 0 1 211.679 394.2 Tm
-(presence) Tj
-1 0 0 1 248.279 394.2 Tm
-(of) Tj
-1 0 0 1 258.239 394.2 Tm
-(malicious) Tj
-1 0 0 1 72 382.2 Tm
-(attacks,) Tj
-1 0 0 1 106.8 382.2 Tm
-(some) Tj
-1 0 0 1 132.12 382.2 Tm
-(steps) Tj
-1 0 0 1 156.24 382.2 Tm
-(need) Tj
-1 0 0 1 179.28 382.2 Tm
-(to) Tj
-1 0 0 1 191.28 382.2 Tm
-(be) Tj
-1 0 0 1 204.96 382.2 Tm
-(tak) Tj
-1 0 0 1 217.08 382.2 Tm
-(en,) Tj
-1 0 0 1 233.64 382.2 Tm
-(e.g.,) Tj
-1 0 0 1 255.119 382.2 Tm
-(each) Tj
-1 0 0 1 277.679 382.2 Tm
-(node) Tj
-1 0 0 1 72 370.32 Tm
-(should) Tj
-1 0 0 1 101.04 370.32 Tm
-(run) Tj
-1 0 0 1 116.76 370.32 Tm
-(dif) Tj
-1 0 0 1 127.68 370.32 Tm
-(ferent) Tj
-1 0 0 1 153.24 370.32 Tm
-(implementations) Tj
-1 0 0 1 222.12 370.32 Tm
-(of) Tj
-1 0 0 1 232.919 370.32 Tm
-(the) Tj
-1 0 0 1 247.559 370.32 Tm
-(service) Tj
-1 0 0 1 278.159 370.32 Tm
-(code) Tj
-1 0 0 1 72 358.32 Tm
-(and) Tj
-1 0 0 1 90.36 358.32 Tm
-(operating) Tj
-1 0 0 1 131.88 358.32 Tm
-(system) Tj
-1 0 0 1 163.44 358.32 Tm
-(and) Tj
-1 0 0 1 181.8 358.32 Tm
-(should) Tj
-1 0 0 1 212.28 358.32 Tm
-(ha) Tj
-1 0 0 1 221.52 358.32 Tm
-(v) Tj
-1 0 0 1 226.44 358.32 Tm
-(e) Tj
-1 0 0 1 234.6 358.32 Tm
-(a) Tj
-1 0 0 1 243 358.32 Tm
-(dif) Tj
-1 0 0 1 253.92 358.32 Tm
-(ferent) Tj
-1 0 0 1 280.919 358.32 Tm
-(root) Tj
-1 0 0 1 72 346.44 Tm
-(passw) Tj
-1 0 0 1 96.2399 346.44 Tm
-(ord) Tj
-1 0 0 1 113.76 346.44 Tm
-(and) Tj
-1 0 0 1 132.36 346.44 Tm
-(a) Tj
-1 0 0 1 141 346.44 Tm
-(dif) Tj
-1 0 0 1 151.92 346.44 Tm
-(ferent) Tj
-1 0 0 1 179.28 346.44 Tm
-(administrator) Tj
-1 0 0 1 232.08 346.44 Tm
-(.) Tj
-1 0 0 1 243.119 346.44 Tm
-(It) Tj
-1 0 0 1 253.439 346.44 Tm
-(is) Tj
-1 0 0 1 264.359 346.44 Tm
-(possible) Tj
-1 0 0 1 72 334.44 Tm
-(to) Tj
-1 0 0 1 82.8 334.44 Tm
-(obtain) Tj
-1 0 0 1 110.64 334.44 Tm
-(dif) Tj
-1 0 0 1 121.56 334.44 Tm
-(ferent) Tj
-1 0 0 1 147.72 334.44 Tm
-(implementations) Tj
-1 0 0 1 217.2 334.44 Tm
-(from) Tj
-1 0 0 1 239.519 334.44 Tm
-(the) Tj
-1 0 0 1 254.759 334.44 Tm
-(same) Tj
-1 0 0 1 278.159 334.44 Tm
-(code) Tj
-1 0 0 1 72 322.56 Tm
-(base) Tj
-1 0 0 1 92.2799 322.56 Tm
-([28) Tj
-1 0 0 1 105.6 322.56 Tm
-(]) Tj
-1 0 0 1 111.48 322.56 Tm
-(and) Tj
-1 0 0 1 128.4 322.56 Tm
-(for) Tj
-1 0 0 1 142.68 322.56 Tm
-(lo) Tj
-1 0 0 1 150.24 322.56 Tm
-(w) Tj
-1 0 0 1 159.96 322.56 Tm
-(de) Tj
-1 0 0 1 169.32 322.56 Tm
-(grees) Tj
-1 0 0 1 192.84 322.56 Tm
-(of) Tj
-1 0 0 1 203.64 322.56 Tm
-(replication) Tj
-1 0 0 1 248.879 322.56 Tm
-(one) Tj
-1 0 0 1 265.799 322.56 Tm
-(can) Tj
-1 0 0 1 282.239 322.56 Tm
-(b) Tj
-1 0 0 1 287.039 322.56 Tm
-(uy) Tj
-1 0 0 1 72 310.56 Tm
-(operating) Tj
-1 0 0 1 114.36 310.56 Tm
-(systems) Tj
-1 0 0 1 150.48 310.56 Tm
-(from) Tj
-1 0 0 1 174.6 310.56 Tm
-(dif) Tj
-1 0 0 1 185.52 310.56 Tm
-(ferent) Tj
-1 0 0 1 213.24 310.56 Tm
-(v) Tj
-1 0 0 1 218.16 310.56 Tm
-(endors.) Tj
-1 0 0 1 257.279 310.56 Tm
-(N-v) Tj
-1 0 0 1 272.759 310.56 Tm
-(ersion) Tj
-1 0 0 1 72 298.68 Tm
-(programming,) Tj
-1 0 0 1 136.32 298.68 Tm
-(i.e.,) Tj
-1 0 0 1 158.52 298.68 Tm
-(dif) Tj
-1 0 0 1 169.44 298.68 Tm
-(ferent) Tj
-1 0 0 1 199.2 298.68 Tm
-(teams) Tj
-1 0 0 1 228.96 298.68 Tm
-(of) Tj
-1 0 0 1 243.84 298.68 Tm
-(programmers) Tj
-1 0 0 1 72 286.68 Tm
-(produce) Tj
-1 0 0 1 106.8 286.68 Tm
-(dif) Tj
-1 0 0 1 117.72 286.68 Tm
-(ferent) Tj
-1 0 0 1 143.52 286.68 Tm
-(implementations,) Tj
-1 0 0 1 215.28 286.68 Tm
-(is) Tj
-1 0 0 1 224.64 286.68 Tm
-(another) Tj
-1 0 0 1 257.159 286.68 Tm
-(option) Tj
-1 0 0 1 285.359 286.68 Tm
-(for) Tj
-1 0 0 1 72 274.8 Tm
-(some) Tj
-1 0 0 1 95.5199 274.8 Tm
-(services.) Tj
-1 0 0 1 81.96 262.44 Tm
-(W) Tj
-1 0 0 1 90.48 262.44 Tm
-(e) Tj
-1 0 0 1 98.16 262.44 Tm
-(use) Tj
-1 0 0 1 114.72 262.44 Tm
-(cryptographic) Tj
-1 0 0 1 173.28 262.44 Tm
-(techniques) Tj
-1 0 0 1 219 262.44 Tm
-(to) Tj
-1 0 0 1 230.04 262.44 Tm
-(pre) Tj
-1 0 0 1 242.64 262.44 Tm
-(v) Tj
-1 0 0 1 247.56 262.44 Tm
-(ent) Tj
-1 0 0 1 262.679 262.44 Tm
-(spoo\256ng) Tj
-1 0 0 1 72 250.56 Tm
-(and) Tj
-1 0 0 1 91.44 250.56 Tm
-(replays) Tj
-1 0 0 1 125.4 250.56 Tm
-(and) Tj
-1 0 0 1 144.84 250.56 Tm
-(to) Tj
-1 0 0 1 157.8 250.56 Tm
-(detect) Tj
-1 0 0 1 186.6 250.56 Tm
-(corrupted) Tj
-1 0 0 1 229.92 250.56 Tm
-(messages.) Tj
-1 0 0 1 281.519 250.56 Tm
-(Our) Tj
-1 0 0 1 72 238.56 Tm
-(messages) Tj
-1 0 0 1 114 238.56 Tm
-(contain) Tj
-1 0 0 1 147.72 238.56 Tm
-(public-k) Tj
-1 0 0 1 181.08 238.56 Tm
-(e) Tj
-1 0 0 1 185.4 238.56 Tm
-(y) Tj
-1 0 0 1 194.52 238.56 Tm
-(signatures) Tj
-1 0 0 1 239.279 238.56 Tm
-([33) Tj
-1 0 0 1 252.599 238.56 Tm
-(],) Tj
-1 0 0 1 263.279 238.56 Tm
-(message) Tj
-1 0 0 1 72 226.68 Tm
-(authentication) Tj
-1 0 0 1 130.8 226.68 Tm
-(codes) Tj
-1 0 0 1 155.76 226.68 Tm
-([36) Tj
-1 0 0 1 169.08 226.68 Tm
-(],) Tj
-1 0 0 1 177.24 226.68 Tm
-(and) Tj
-1 0 0 1 193.92 226.68 Tm
-(message) Tj
-1 0 0 1 229.92 226.68 Tm
-(digests) Tj
-1 0 0 1 259.919 226.68 Tm
-(produced) Tj
-1 0 0 1 72 214.68 Tm
-(by) Tj
-1 0 0 1 85.2 214.68 Tm
-(collision-resistant) Tj
-1 0 0 1 159.36 214.68 Tm
-(hash) Tj
-1 0 0 1 180.96 214.68 Tm
-(functions) Tj
-1 0 0 1 221.28 214.68 Tm
-([32) Tj
-1 0 0 1 234.6 214.68 Tm
-(].) Tj
-1 0 0 1 246.359 214.68 Tm
-(W) Tj
-1 0 0 1 254.879 214.68 Tm
-(e) Tj
-1 0 0 1 262.679 214.68 Tm
-(denote) Tj
-1 0 0 1 292.559 214.68 Tm
-(a) Tj
-1 0 0 1 72 202.68 Tm
-(message) Tj
-ET
-endstream
-endobj
-59 0 obj
-7978
-endobj
-60 0 obj
-<< /Type /XObject /Name /R60 /Subtype /Image /Length 61 0 R
-/ImageMask true /Width 81 /Height 46 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 81 /BlackIs1 true >>]
->>
-stream
-4N`CV%M3$8612U>:Ag"NnFZb
-endstream
-endobj
-61 0 obj
-139
-endobj
-62 0 obj
-<< /Length 63 0 R >>
-stream
-q
-8.1 0 0 -4.6 108.9 207.2 cm
-/R60 Do
-Q
-BT
-1 0 0 1 120.36 202.68 Tm
-(signed) Tj
-1 0 0 1 149.28 202.68 Tm
-(by) Tj
-1 0 0 1 162.12 202.68 Tm
-(node) Tj
-ET
-endstream
-endobj
-63 0 obj
-151
-endobj
-64 0 obj
-<< /Type /XObject /Name /R64 /Subtype /Image /Length 65 0 R
-/ImageMask true /Width 26 /Height 69 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 26 /BlackIs1 true >>]
->>
-stream
--R^*Zl/YrmIf:DfhtVWo^UNqc%K6'1s*addX2"DHrSQB/+4u(tp(mUa[G\kks2oQE"5iR%(OubkJ,~>
-endstream
-endobj
-65 0 obj
-80
-endobj
-66 0 obj
-<< /Length 67 0 R >>
-stream
-q
-2.6 0 0 -6.9 184.6 209.5 cm
-/R64 Do
-Q
-BT
-1 0 0 1 190.68 202.68 Tm
-(as) Tj
-ET
-endstream
-endobj
-67 0 obj
-79
-endobj
-68 0 obj
-<< /Type /XObject /Name /R68 /Subtype /Image /Length 69 0 R
-/ImageMask true /Width 24 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 24 /BlackIs1 true >>]
->>
-stream
-+t-07X8N5#0B"SKInTVGqHrM(f3_PN_YUJ4L&^prs)7cFqg[B")ufa0GPC"Nr'(,Kmt^kVHo1m8!<~>
-endstream
-endobj
-69 0 obj
-80
-endobj
-70 0 obj
-<< /Length 71 0 R >>
-stream
-q
-2.4 0 0 -9.9 202.9 210.2 cm
-/R68 Do
-Q
-q
-8.1 0 0 -4.6 206 207.2 cm
-/R60 Do
-Q
-endstream
-endobj
-71 0 obj
-78
-endobj
-72 0 obj
-<< /Type /XObject /Name /R72 /Subtype /Image /Length 73 0 R
-/ImageMask true /Width 24 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 24 /BlackIs1 true >>]
->>
-stream
-02pd&htA/cs0qnbrP.\`mJhV5_u&o]hqrq@J+[15ImJQWpe1HjlFsc8R~>
-endstream
-endobj
-73 0 obj
-78
-endobj
-74 0 obj
-<< /Length 75 0 R >>
-stream
-q
-2.4 0 0 -9.9 215 210.2 cm
-/R72 Do
-Q
-endstream
-endobj
-75 0 obj
-38
-endobj
-76 0 obj
-<< /Type /XObject /Name /R76 /Subtype /Image /Length 77 0 R
-/ImageMask true /Width 42 /Height 31 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 42 /BlackIs1 true >>]
->>
-stream
-1`R)4"qZ&4%Y>/aKS+]fJ#a+Sp>>oFIt)n@>7^\DYeoBbLCXeP2$%q%J-Z~>
-endstream
-endobj
-77 0 obj
-61
-endobj
-78 0 obj
-<< /Length 79 0 R >>
-stream
-q
-4.2 0 0 -3.1 218.6 204.2 cm
-/R76 Do
-Q
-endstream
-endobj
-79 0 obj
-40
-endobj
-80 0 obj
-<< /Type /XObject /Name /R80 /Subtype /Image /Length 81 0 R
-/ImageMask true /Width 17 /Height 35 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 17 /BlackIs1 true >>]
->>
-stream
-4B*=`S,;]mpj7Y*s1(">iS6Nohi?6cs!N02p(RKl"9~>
-endstream
-endobj
-81 0 obj
-45
-endobj
-82 0 obj
-<< /Length 83 0 R >>
-stream
-q
-1.7 0 0 -3.5 223.3 203.8 cm
-/R80 Do
-Q
-BT
-1 0 0 1 229.56 202.68 Tm
-(and) Tj
-1 0 0 1 246.96 202.68 Tm
-(the) Tj
-1 0 0 1 261.96 202.68 Tm
-(digest) Tj
-1 0 0 1 288.72 202.68 Tm
-(of) Tj
-1 0 0 1 72 190.8 Tm
-(message) Tj
-ET
-q
-8.1 0 0 -4.6 109.2 195.3 cm
-/R60 Do
-Q
-BT
-1 0 0 1 120.84 190.8 Tm
-(by) Tj
-ET
-endstream
-endobj
-83 0 obj
-295
-endobj
-84 0 obj
-<< /Type /XObject /Name /R84 /Subtype /Image /Length 85 0 R
-/ImageMask true /Width 75 /Height 69 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 75 /BlackIs1 true >>]
->>
-stream
--D@i/="t3q:)'T:EY'Q7@JfCQK73IN
-DqmDb@DDO(rqCj@Fs$I.iOf--It,63^V:<:qnMn*^\@b0s+Zm:ht=@d?EiAlYY3Kq%(IruTE5*9~>
-endstream
-endobj
-85 0 obj
-109
-endobj
-86 0 obj
-<< /Length 87 0 R >>
-stream
-q
-7.5 0 0 -6.9 134.2 197.7 cm
-/R84 Do
-Q
-endstream
-endobj
-87 0 obj
-40
-endobj
-88 0 obj
-<< /Type /XObject /Name /R88 /Subtype /Image /Length 89 0 R
-/ImageMask true /Width 24 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 24 /BlackIs1 true >>]
->>
-stream
-+rF]%*LO8IHL@*j8[taqp!<~>
-endstream
-endobj
-89 0 obj
-80
-endobj
-90 0 obj
-<< /Length 91 0 R >>
-stream
-q
-2.4 0 0 -9.9 143.3 198.3 cm
-/R88 Do
-Q
-q
-8.1 0 0 -4.6 146.5 195.3 cm
-/R60 Do
-Q
-endstream
-endobj
-91 0 obj
-80
-endobj
-92 0 obj
-<< /Type /XObject /Name /R92 /Subtype /Image /Length 93 0 R
-/ImageMask true /Width 24 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 24 /BlackIs1 true >>]
->>
-stream
-,JEO$loTRL4niC`hqS$`rnmKps6nkFp\Y!js6KW5s0(&RK)W@\(KK(`l\2@U?Bm&k<5,",!$D~>
-endstream
-endobj
-93 0 obj
-76
-endobj
-94 0 obj
-<< /Length 95 0 R >>
-stream
-q
-2.4 0 0 -9.9 155.4 198.3 cm
-/R92 Do
-Q
-BT
-1 0 0 1 158.88 190.8 Tm
-(.) Tj
-1 0 0 1 167.04 190.8 Tm
-(W) Tj
-1 0 0 1 175.56 190.8 Tm
-(e) Tj
-1 0 0 1 183.24 190.8 Tm
-(follo) Tj
-1 0 0 1 201.96 190.8 Tm
-(w) Tj
-1 0 0 1 212.16 190.8 Tm
-(the) Tj
-1 0 0 1 227.4 190.8 Tm
-(common) Tj
-1 0 0 1 265.44 190.8 Tm
-(practice) Tj
-1 0 0 1 72 178.8 Tm
-(of) Tj
-1 0 0 1 84.6 178.8 Tm
-(signing) Tj
-1 0 0 1 118.32 178.8 Tm
-(a) Tj
-1 0 0 1 127.08 178.8 Tm
-(digest) Tj
-1 0 0 1 155.28 178.8 Tm
-(of) Tj
-1 0 0 1 167.88 178.8 Tm
-(a) Tj
-1 0 0 1 176.64 178.8 Tm
-(message) Tj
-1 0 0 1 214.8 178.8 Tm
-(and) Tj
-1 0 0 1 233.519 178.8 Tm
-(appending) Tj
-1 0 0 1 279.359 178.8 Tm
-(it) Tj
-1 0 0 1 289.199 178.8 Tm
-(to) Tj
-1 0 0 1 72 166.92 Tm
-(the) Tj
-1 0 0 1 87.3599 166.92 Tm
-(plainte) Tj
-1 0 0 1 114.48 166.92 Tm
-(xt) Tj
-1 0 0 1 125.16 166.92 Tm
-(of) Tj
-1 0 0 1 136.56 166.92 Tm
-(the) Tj
-1 0 0 1 151.92 166.92 Tm
-(message) Tj
-1 0 0 1 188.76 166.92 Tm
-(rather) Tj
-1 0 0 1 215.159 166.92 Tm
-(than) Tj
-1 0 0 1 235.439 166.92 Tm
-(signing) Tj
-1 0 0 1 267.839 166.92 Tm
-(the) Tj
-1 0 0 1 283.199 166.92 Tm
-(full) Tj
-1 0 0 1 72 154.92 Tm
-(message) Tj
-1 0 0 1 108.84 154.92 Tm
-(\() Tj
-ET
-q
-2.4 0 0 -9.9 113.1 162.4 cm
-/R68 Do
-Q
-q
-8.1 0 0 -4.6 116.2 159.4 cm
-/R60 Do
-Q
-q
-2.4 0 0 -9.9 125.2 162.4 cm
-/R72 Do
-Q
-q
-4.2 0 0 -3.1 128.8 156.5 cm
-/R76 Do
-Q
-q
-1.7 0 0 -3.5 133.5 156 cm
-/R80 Do
-Q
-BT
-1 0 0 1 140.04 154.92 Tm
-(should) Tj
-1 0 0 1 169.68 154.92 Tm
-(be) Tj
-1 0 0 1 182.16 154.92 Tm
-(interpreted) Tj
-1 0 0 1 228.36 154.92 Tm
-(in) Tj
-1 0 0 1 239.16 154.92 Tm
-(this) Tj
-1 0 0 1 256.68 154.92 Tm
-(w) Tj
-1 0 0 1 263.76 154.92 Tm
-(ay\).) Tj
-1 0 0 1 284.279 154.92 Tm
-(All) Tj
-1 0 0 1 72 143.04 Tm
-(replicas) Tj
-1 0 0 1 104.88 143.04 Tm
-(kno) Tj
-1 0 0 1 119.76 143.04 Tm
-(w) Tj
-1 0 0 1 128.64 143.04 Tm
-(the) Tj
-1 0 0 1 142.68 143.04 Tm
-(others') Tj
-1 0 0 1 172.2 143.04 Tm
-(public) Tj
-1 0 0 1 199.079 143.04 Tm
-(k) Tj
-1 0 0 1 203.999 143.04 Tm
-(e) Tj
-1 0 0 1 208.319 143.04 Tm
-(ys) Tj
-1 0 0 1 218.999 143.04 Tm
-(to) Tj
-1 0 0 1 228.599 143.04 Tm
-(v) Tj
-1 0 0 1 233.519 143.04 Tm
-(erify) Tj
-1 0 0 1 254.159 143.04 Tm
-(signatures.) Tj
-1 0 0 1 81.96 130.68 Tm
-(W) Tj
-1 0 0 1 90.48 130.68 Tm
-(e) Tj
-1 0 0 1 101.76 130.68 Tm
-(allo) Tj
-1 0 0 1 116.52 130.68 Tm
-(w) Tj
-1 0 0 1 130.44 130.68 Tm
-(for) Tj
-1 0 0 1 148.8 130.68 Tm
-(a) Tj
-1 0 0 1 160.08 130.68 Tm
-(v) Tj
-1 0 0 1 165 130.68 Tm
-(ery) Tj
-1 0 0 1 184.44 130.68 Tm
-(strong) Tj
-1 0 0 1 216.12 130.68 Tm
-(adv) Tj
-1 0 0 1 230.52 130.68 Tm
-(ersary) Tj
-1 0 0 1 261.479 130.68 Tm
-(that) Tj
-1 0 0 1 283.199 130.68 Tm
-(can) Tj
-1 0 0 1 72 118.8 Tm
-(coordinate) Tj
-1 0 0 1 117 118.8 Tm
-(f) Tj
-1 0 0 1 120.24 118.8 Tm
-(aulty) Tj
-1 0 0 1 143.16 118.8 Tm
-(nodes,) Tj
-1 0 0 1 171.96 118.8 Tm
-(delay) Tj
-1 0 0 1 196.56 118.8 Tm
-(communication,) Tj
-1 0 0 1 264.119 118.8 Tm
-(or) Tj
-1 0 0 1 275.399 118.8 Tm
-(delay) Tj
-1 0 0 1 72 106.8 Tm
-(correct) Tj
-1 0 0 1 102.96 106.8 Tm
-(nodes) Tj
-1 0 0 1 129.48 106.8 Tm
-(in) Tj
-1 0 0 1 140.52 106.8 Tm
-(order) Tj
-1 0 0 1 164.88 106.8 Tm
-(to) Tj
-1 0 0 1 175.92 106.8 Tm
-(cause) Tj
-1 0 0 1 201.36 106.8 Tm
-(the) Tj
-1 0 0 1 216.84 106.8 Tm
-(most) Tj
-1 0 0 1 239.52 106.8 Tm
-(damage) Tj
-1 0 0 1 273.72 106.8 Tm
-(to) Tj
-1 0 0 1 284.879 106.8 Tm
-(the) Tj
-1 0 0 1 72 94.92 Tm
-(replicated) Tj
-1 0 0 1 115.8 94.92 Tm
-(service.) Tj
-1 0 0 1 156.24 94.92 Tm
-(W) Tj
-1 0 0 1 164.76 94.92 Tm
-(e) Tj
-1 0 0 1 173.88 94.92 Tm
-(do) Tj
-1 0 0 1 188.4 94.92 Tm
-(assume) Tj
-1 0 0 1 222.24 94.92 Tm
-(that) Tj
-1 0 0 1 241.68 94.92 Tm
-(the) Tj
-1 0 0 1 258.479 94.92 Tm
-(adv) Tj
-1 0 0 1 272.879 94.92 Tm
-(ersary) Tj
-1 0 0 1 72 82.92 Tm
-(cannot) Tj
-1 0 0 1 101.28 82.92 Tm
-(delay) Tj
-1 0 0 1 125.52 82.92 Tm
-(correct) Tj
-1 0 0 1 155.88 82.92 Tm
-(nodes) Tj
-1 0 0 1 181.8 82.92 Tm
-(inde\256nitely) Tj
-1 0 0 1 226.8 82.92 Tm
-(.) Tj
-1 0 0 1 233.16 82.92 Tm
-(W) Tj
-1 0 0 1 241.68 82.92 Tm
-(e) Tj
-1 0 0 1 248.88 82.92 Tm
-(also) Tj
-1 0 0 1 267.719 82.92 Tm
-(assume) Tj
-1 0 0 1 72 71.04 Tm
-(that) Tj
-1 0 0 1 92.1599 71.04 Tm
-(the) Tj
-1 0 0 1 109.68 71.04 Tm
-(adv) Tj
-1 0 0 1 124.08 71.04 Tm
-(ersary) Tj
-1 0 0 1 153.48 71.04 Tm
-(\(and) Tj
-1 0 0 1 176.4 71.04 Tm
-(the) Tj
-1 0 0 1 193.92 71.04 Tm
-(f) Tj
-1 0 0 1 197.16 71.04 Tm
-(aulty) Tj
-1 0 0 1 222.24 71.04 Tm
-(nodes) Tj
-1 0 0 1 250.799 71.04 Tm
-(it) Tj
-1 0 0 1 261.599 71.04 Tm
-(controls\)) Tj
-1 0 0 1 315 709.08 Tm
-(are) Tj
-1 0 0 1 333.36 709.08 Tm
-(computationally) Tj
-1 0 0 1 404.28 709.08 Tm
-(bound) Tj
-1 0 0 1 435.24 709.08 Tm
-(so) Tj
-1 0 0 1 450.24 709.08 Tm
-(that) Tj
-1 0 0 1 471.36 709.08 Tm
-(\(with) Tj
-1 0 0 1 498.6 709.08 Tm
-(v) Tj
-1 0 0 1 503.52 709.08 Tm
-(ery) Tj
-1 0 0 1 522.239 709.08 Tm
-(high) Tj
-1 0 0 1 315 697.08 Tm
-(probability\)) Tj
-1 0 0 1 367.08 697.08 Tm
-(it) Tj
-1 0 0 1 377.52 697.08 Tm
-(is) Tj
-1 0 0 1 389.16 697.08 Tm
-(unable) Tj
-1 0 0 1 420.72 697.08 Tm
-(to) Tj
-1 0 0 1 433.44 697.08 Tm
-(sub) Tj
-1 0 0 1 447.24 697.08 Tm
-(v) Tj
-1 0 0 1 452.159 697.08 Tm
-(ert) Tj
-1 0 0 1 467.519 697.08 Tm
-(the) Tj
-1 0 0 1 484.679 697.08 Tm
-(cryptographic) Tj
-1 0 0 1 315 685.2 Tm
-(techniques) Tj
-1 0 0 1 359.64 685.2 Tm
-(mentioned) Tj
-1 0 0 1 403.8 685.2 Tm
-(abo) Tj
-1 0 0 1 418.2 685.2 Tm
-(v) Tj
-1 0 0 1 423.12 685.2 Tm
-(e.) Tj
-1 0 0 1 433.2 685.2 Tm
-(F) Tj
-1 0 0 1 438.6 685.2 Tm
-(or) Tj
-1 0 0 1 448.92 685.2 Tm
-(e) Tj
-1 0 0 1 453.24 685.2 Tm
-(xample,) Tj
-1 0 0 1 487.199 685.2 Tm
-(the) Tj
-1 0 0 1 501.479 685.2 Tm
-(adv) Tj
-1 0 0 1 515.879 685.2 Tm
-(ersary) Tj
-1 0 0 1 315 673.2 Tm
-(cannot) Tj
-1 0 0 1 345.24 673.2 Tm
-(produce) Tj
-1 0 0 1 381.12 673.2 Tm
-(a) Tj
-1 0 0 1 389.28 673.2 Tm
-(v) Tj
-1 0 0 1 394.08 673.2 Tm
-(alid) Tj
-1 0 0 1 412.68 673.2 Tm
-(signature) Tj
-1 0 0 1 452.879 673.2 Tm
-(of) Tj
-1 0 0 1 464.879 673.2 Tm
-(a) Tj
-1 0 0 1 473.039 673.2 Tm
-(non-f) Tj
-1 0 0 1 494.759 673.2 Tm
-(aulty) Tj
-1 0 0 1 518.159 673.2 Tm
-(node,) Tj
-1 0 0 1 315 661.32 Tm
-(compute) Tj
-1 0 0 1 352.92 661.32 Tm
-(the) Tj
-1 0 0 1 368.64 661.32 Tm
-(information) Tj
-1 0 0 1 419.28 661.32 Tm
-(summarized) Tj
-1 0 0 1 471.6 661.32 Tm
-(by) Tj
-1 0 0 1 485.16 661.32 Tm
-(a) Tj
-1 0 0 1 493.199 661.32 Tm
-(digest) Tj
-1 0 0 1 520.679 661.32 Tm
-(from) Tj
-1 0 0 1 315 649.32 Tm
-(the) Tj
-1 0 0 1 330.84 649.32 Tm
-(digest,) Tj
-1 0 0 1 361.2 649.32 Tm
-(or) Tj
-1 0 0 1 373.2 649.32 Tm
-(\256nd) Tj
-1 0 0 1 392.4 649.32 Tm
-(tw) Tj
-1 0 0 1 402.24 649.32 Tm
-(o) Tj
-1 0 0 1 410.88 649.32 Tm
-(messages) Tj
-1 0 0 1 452.279 649.32 Tm
-(with) Tj
-1 0 0 1 473.639 649.32 Tm
-(the) Tj
-1 0 0 1 489.479 649.32 Tm
-(same) Tj
-1 0 0 1 513.719 649.32 Tm
-(digest.) Tj
-1 0 0 1 315 637.44 Tm
-(The) Tj
-1 0 0 1 332.76 637.44 Tm
-(cryptographic) Tj
-1 0 0 1 390.24 637.44 Tm
-(techniques) Tj
-1 0 0 1 435.12 637.44 Tm
-(we) Tj
-1 0 0 1 448.92 637.44 Tm
-(use) Tj
-1 0 0 1 464.52 637.44 Tm
-(are) Tj
-1 0 0 1 478.919 637.44 Tm
-(thought) Tj
-1 0 0 1 511.559 637.44 Tm
-(to) Tj
-1 0 0 1 521.519 637.44 Tm
-(ha) Tj
-1 0 0 1 530.759 637.44 Tm
-(v) Tj
-1 0 0 1 535.679 637.44 Tm
-(e) Tj
-1 0 0 1 315 625.44 Tm
-(these) Tj
-1 0 0 1 337.92 625.44 Tm
-(properties) Tj
-1 0 0 1 380.28 625.44 Tm
-([33) Tj
-1 0 0 1 393.6 625.44 Tm
-(,) Tj
-1 0 0 1 398.52 625.44 Tm
-(36) Tj
-1 0 0 1 408.48 625.44 Tm
-(,) Tj
-1 0 0 1 413.52 625.44 Tm
-(32) Tj
-1 0 0 1 423.48 625.44 Tm
-(].) Tj
-/R57 12 Tf
-1 0 0 1 315 600.96 Tm
-(3) Tj
-1 0 0 1 332.88 600.96 Tm
-(Ser) Tj
-1 0 0 1 349.92 600.96 Tm
-(vice) Tj
-1 0 0 1 372.96 600.96 Tm
-(Pr) Tj
-1 0 0 1 385.32 600.96 Tm
-(operties) Tj
-/R54 10 Tf
-1 0 0 1 315 584.52 Tm
-(Our) Tj
-1 0 0 1 332.16 584.52 Tm
-(algorithm) Tj
-1 0 0 1 372.72 584.52 Tm
-(can) Tj
-1 0 0 1 388.2 584.52 Tm
-(be) Tj
-1 0 0 1 399.24 584.52 Tm
-(used) Tj
-1 0 0 1 419.16 584.52 Tm
-(to) Tj
-1 0 0 1 428.52 584.52 Tm
-(implemen) Tj
-1 0 0 1 468.48 584.52 Tm
-(t) Tj
-1 0 0 1 472.8 584.52 Tm
-(an) Tj
-1 0 0 1 482.16 584.52 Tm
-(y) Tj
-1 0 0 1 488.639 584.52 Tm
-(deter) Tj
-1 0 0 1 508.559 584.52 Tm
-(ministic) Tj
-1 0 0 1 315 572.64 Tm
-(replicated) Tj
-ET
-endstream
-endobj
-95 0 obj
-7671
-endobj
-96 0 obj
-<< /Type /Font /Name /R96 /Subtype /Type1 /BaseFont /Times-Italic >>
-endobj
-97 0 obj
-<< /Length 98 0 R >>
-stream
-BT
-/R96 10 Tf
-1 0 0 1 356.76 572.64 Tm
-(service) Tj
-/R54 10 Tf
-1 0 0 1 387.36 572.64 Tm
-(with) Tj
-1 0 0 1 407.52 572.64 Tm
-(a) Tj
-/R96 10 Tf
-1 0 0 1 414.36 572.64 Tm
-(state) Tj
-/R54 10 Tf
-1 0 0 1 435.72 572.64 Tm
-(and) Tj
-1 0 0 1 452.52 572.64 Tm
-(some) Tj
-/R96 10 Tf
-1 0 0 1 475.919 572.64 Tm
-(oper) Tj
-1 0 0 1 494.159 572.64 Tm
-(ations) Tj
-/R54 10 Tf
-1 0 0 1 518.639 572.64 Tm
-(.) Tj
-1 0 0 1 524.519 572.64 Tm
-(The) Tj
-1 0 0 1 315 560.64 Tm
-(operations) Tj
-1 0 0 1 359.28 560.64 Tm
-(are) Tj
-1 0 0 1 374.28 560.64 Tm
-(not) Tj
-1 0 0 1 389.76 560.64 Tm
-(restricted) Tj
-1 0 0 1 429.72 560.64 Tm
-(to) Tj
-1 0 0 1 440.28 560.64 Tm
-(simple) Tj
-1 0 0 1 469.56 560.64 Tm
-(reads) Tj
-1 0 0 1 493.439 560.64 Tm
-(or) Tj
-1 0 0 1 504.599 560.64 Tm
-(writes) Tj
-1 0 0 1 531.719 560.64 Tm
-(of) Tj
-1 0 0 1 315 548.76 Tm
-(portions) Tj
-1 0 0 1 350.76 548.76 Tm
-(of) Tj
-1 0 0 1 362.28 548.76 Tm
-(the) Tj
-1 0 0 1 377.52 548.76 Tm
-(service) Tj
-1 0 0 1 408.84 548.76 Tm
-(state;) Tj
-1 0 0 1 433.32 548.76 Tm
-(the) Tj
-1 0 0 1 445.44 548.76 Tm
-(y) Tj
-1 0 0 1 453.479 548.76 Tm
-(can) Tj
-1 0 0 1 470.519 548.76 Tm
-(perform) Tj
-1 0 0 1 505.679 548.76 Tm
-(arbitrary) Tj
-1 0 0 1 315 536.76 Tm
-(deterministic) Tj
-1 0 0 1 369.6 536.76 Tm
-(computations) Tj
-1 0 0 1 425.76 536.76 Tm
-(using) Tj
-1 0 0 1 449.88 536.76 Tm
-(the) Tj
-1 0 0 1 464.64 536.76 Tm
-(state) Tj
-1 0 0 1 485.399 536.76 Tm
-(and) Tj
-1 0 0 1 502.319 536.76 Tm
-(operation) Tj
-1 0 0 1 315 524.88 Tm
-(ar) Tj
-1 0 0 1 322.68 524.88 Tm
-(guments.) Tj
-1 0 0 1 362.16 524.88 Tm
-(Clients) Tj
-1 0 0 1 391.92 524.88 Tm
-(issue) Tj
-1 0 0 1 413.4 524.88 Tm
-(requests) Tj
-1 0 0 1 447.72 524.88 Tm
-(to) Tj
-1 0 0 1 457.079 524.88 Tm
-(the) Tj
-1 0 0 1 470.879 524.88 Tm
-(replicated) Tj
-1 0 0 1 511.919 524.88 Tm
-(service) Tj
-1 0 0 1 315 512.88 Tm
-(to) Tj
-1 0 0 1 325.8 512.88 Tm
-(in) Tj
-1 0 0 1 333.24 512.88 Tm
-(v) Tj
-1 0 0 1 338.04 512.88 Tm
-(ok) Tj
-1 0 0 1 348 512.88 Tm
-(e) Tj
-1 0 0 1 355.2 512.88 Tm
-(operations) Tj
-1 0 0 1 399.72 512.88 Tm
-(and) Tj
-1 0 0 1 417.12 512.88 Tm
-(block) Tj
-1 0 0 1 442.2 512.88 Tm
-(w) Tj
-1 0 0 1 449.279 512.88 Tm
-(aiting) Tj
-1 0 0 1 474.959 512.88 Tm
-(for) Tj
-1 0 0 1 489.599 512.88 Tm
-(a) Tj
-1 0 0 1 497.039 512.88 Tm
-(reply) Tj
-1 0 0 1 517.079 512.88 Tm
-(.) Tj
-1 0 0 1 524.519 512.88 Tm
-(The) Tj
-1 0 0 1 315 501 Tm
-(replicated) Tj
-1 0 0 1 357.12 501 Tm
-(service) Tj
-1 0 0 1 388.08 501 Tm
-(is) Tj
-1 0 0 1 397.44 501 Tm
-(implemented) Tj
-1 0 0 1 452.28 501 Tm
-(by) Tj
-ET
-endstream
-endobj
-98 0 obj
-2414
-endobj
-99 0 obj
-<< /Type /XObject /Name /R99 /Subtype /Image /Length 100 0 R
-/ImageMask true /Width 54 /Height 46 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 54 /BlackIs1 true >>]
->>
-stream
-4N]t,$m>7rl/"o@d!re,
-pYTohhg]lis4_o!aocV_^Yur>rVsXfR^`8
-endstream
-endobj
-100 0 obj
-102
-endobj
-101 0 obj
-<< /Length 102 0 R >>
-stream
-q
-5.4 0 0 -4.6 465.2 505.5 cm
-/R99 Do
-Q
-BT
-1 0 0 1 473.76 501 Tm
-(replicas.) Tj
-1 0 0 1 511.799 501 Tm
-(Clients) Tj
-1 0 0 1 315 489 Tm
-(and) Tj
-1 0 0 1 332.64 489 Tm
-(replicas) Tj
-1 0 0 1 366.96 489 Tm
-(are) Tj
-1 0 0 1 382.44 489 Tm
-(non-f) Tj
-1 0 0 1 404.16 489 Tm
-(aulty) Tj
-1 0 0 1 427.08 489 Tm
-(if) Tj
-1 0 0 1 436.44 489 Tm
-(the) Tj
-1 0 0 1 448.559 489 Tm
-(y) Tj
-1 0 0 1 456.719 489 Tm
-(follo) Tj
-1 0 0 1 475.439 489 Tm
-(w) Tj
-1 0 0 1 485.759 489 Tm
-(the) Tj
-1 0 0 1 501.239 489 Tm
-(algorithm) Tj
-1 0 0 1 315 477.12 Tm
-(in) Tj
-1 0 0 1 325.2 477.12 Tm
-(Section) Tj
-1 0 0 1 357.6 477.12 Tm
-(4) Tj
-1 0 0 1 365.04 477.12 Tm
-(and) Tj
-1 0 0 1 381.96 477.12 Tm
-(if) Tj
-1 0 0 1 390.6 477.12 Tm
-(no) Tj
-1 0 0 1 402.96 477.12 Tm
-(attack) Tj
-1 0 0 1 426.72 477.12 Tm
-(er) Tj
-1 0 0 1 436.919 477.12 Tm
-(can) Tj
-1 0 0 1 453.239 477.12 Tm
-(for) Tj
-1 0 0 1 464.879 477.12 Tm
-(ge) Tj
-1 0 0 1 476.519 477.12 Tm
-(their) Tj
-1 0 0 1 497.279 477.12 Tm
-(signature.) Tj
-1 0 0 1 324.96 465.12 Tm
-(The) Tj
-1 0 0 1 342.24 465.12 Tm
-(algorithm) Tj
-1 0 0 1 382.92 465.12 Tm
-(pro) Tj
-1 0 0 1 396.24 465.12 Tm
-(vides) Tj
-1 0 0 1 419.04 465.12 Tm
-(b) Tj
-1 0 0 1 423.96 465.12 Tm
-(oth) Tj
-/R96 10 Tf
-1 0 0 1 438.36 465.12 Tm
-(safety) Tj
-/R54 10 Tf
-1 0 0 1 463.319 465.12 Tm
-(a) Tj
-1 0 0 1 467.64 465.12 Tm
-(nd) Tj
-/R96 10 Tf
-1 0 0 1 479.279 465.12 Tm
-(livene) Tj
-1 0 0 1 503.039 465.12 Tm
-(ss) Tj
-/R54 10 Tf
-1 0 0 1 512.399 465.12 Tm
-(assum-) Tj
-1 0 0 1 315 453.24 Tm
-(ing) Tj
-1 0 0 1 329.76 453.24 Tm
-(no) Tj
-1 0 0 1 341.76 453.24 Tm
-(more) Tj
-1 0 0 1 364.32 453.24 Tm
-(than) Tj
-ET
-endstream
-endobj
-102 0 obj
-1556
-endobj
-103 0 obj
-<< /Type /XObject /Name /R103 /Subtype /Image /Length 104 0 R
-/ImageMask true /Width 26 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 26 /BlackIs1 true >>]
->>
-stream
-/da'+AAiuts8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!qbR:n&-~>
-endstream
-endobj
-104 0 obj
-60
-endobj
-105 0 obj
-<< /Length 106 0 R >>
-stream
-q
-2.6 0 0 -9.9 385.1 460.7 cm
-/R103 Do
-Q
-endstream
-endobj
-106 0 obj
-41
-endobj
-107 0 obj
-<< /Type /XObject /Name /R107 /Subtype /Image /Length 108 0 R
-/ImageMask true /Width 43 /Height 33 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 43 /BlackIs1 true >>]
->>
-stream
-366ZtBKi$Kj)nf1pi$0"h;="Vq3Z%=rV-?Z\+qmGnGV5SiW&fRKsuPqJ89Nq=JdRb$l@h'!$D~>
-endstream
-endobj
-108 0 obj
-76
-endobj
-109 0 obj
-<< /Length 110 0 R >>
-stream
-q
-4.3 0 0 -3.3 389.5 460.3 cm
-/R107 Do
-Q
-endstream
-endobj
-110 0 obj
-41
-endobj
-111 0 obj
-<< /Type /XObject /Name /R111 /Subtype /Image /Length 112 0 R
-/ImageMask true /Width 47 /Height 5 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 47 /BlackIs1 true >>]
->>
-stream
--D7RA!$D=~>
-endstream
-endobj
-112 0 obj
-12
-endobj
-113 0 obj
-<< /Length 114 0 R >>
-stream
-q
-4.7 0 0 -0.5 394.8 459.1 cm
-/R111 Do
-Q
-BT
-/R54 7 Tf
-1 0 0 1 400.32 457.08 Tm
-(1) Tj
-ET
-q
-14.64 0 0 -0.48 389.028 455.892 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 394.68 449.76 Tm
-(3) Tj
-ET
-endstream
-endobj
-114 0 obj
-216
-endobj
-115 0 obj
-<< /Type /XObject /Name /R115 /Subtype /Image /Length 116 0 R
-/ImageMask true /Width 26 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 26 /BlackIs1 true >>]
->>
-stream
-,Ct/ij?\:qs8W-!s8W-!s8W-!s8W-!s8W-!s+[0J!$D~>
-endstream
-endobj
-116 0 obj
-46
-endobj
-117 0 obj
-<< /Length 118 0 R >>
-stream
-q
-2.6 0 0 -9.9 405 460.7 cm
-/R115 Do
-Q
-BT
-/R54 10 Tf
-1 0 0 1 411.36 453.24 Tm
-(replicas) Tj
-1 0 0 1 444.36 453.24 Tm
-(are) Tj
-1 0 0 1 458.64 453.24 Tm
-(f) Tj
-1 0 0 1 461.88 453.24 Tm
-(aulty) Tj
-1 0 0 1 481.32 453.24 Tm
-(.) Tj
-1 0 0 1 487.08 453.24 Tm
-(Safety) Tj
-1 0 0 1 514.56 453.24 Tm
-(means) Tj
-1 0 0 1 315 441.24 Tm
-(that) Tj
-1 0 0 1 334.44 441.24 Tm
-(the) Tj
-1 0 0 1 351.12 441.24 Tm
-(replicated) Tj
-1 0 0 1 394.8 441.24 Tm
-(service) Tj
-1 0 0 1 427.56 441.24 Tm
-(satis\256es) Tj
-1 0 0 1 463.559 441.24 Tm
-(linearizability) Tj
-1 0 0 1 523.439 441.24 Tm
-([14) Tj
-1 0 0 1 536.639 441.24 Tm
-(]) Tj
-1 0 0 1 315 429.24 Tm
-(\(modi\256ed) Tj
-1 0 0 1 356.4 429.24 Tm
-(to) Tj
-1 0 0 1 366.84 429.24 Tm
-(account) Tj
-1 0 0 1 400.44 429.24 Tm
-(for) Tj
-1 0 0 1 414.72 429.24 Tm
-(Byzantine-f) Tj
-1 0 0 1 461.88 429.24 Tm
-(aulty) Tj
-1 0 0 1 484.199 429.24 Tm
-(clients) Tj
-1 0 0 1 512.879 429.24 Tm
-([4) Tj
-1 0 0 1 521.159 429.24 Tm
-(]\):) Tj
-1 0 0 1 534.479 429.24 Tm
-(it) Tj
-1 0 0 1 315 417.36 Tm
-(beha) Tj
-1 0 0 1 333.72 417.36 Tm
-(v) Tj
-1 0 0 1 338.64 417.36 Tm
-(es) Tj
-1 0 0 1 349.92 417.36 Tm
-(lik) Tj
-1 0 0 1 360.36 417.36 Tm
-(e) Tj
-1 0 0 1 367.8 417.36 Tm
-(a) Tj
-1 0 0 1 375.36 417.36 Tm
-(centralized) Tj
-1 0 0 1 422.28 417.36 Tm
-(implementation) Tj
-1 0 0 1 487.919 417.36 Tm
-(that) Tj
-1 0 0 1 506.039 417.36 Tm
-(e) Tj
-1 0 0 1 510.359 417.36 Tm
-(x) Tj
-1 0 0 1 515.279 417.36 Tm
-(ecutes) Tj
-1 0 0 1 315 405.36 Tm
-(operations) Tj
-1 0 0 1 359.4 405.36 Tm
-(atomically) Tj
-1 0 0 1 404.4 405.36 Tm
-(one) Tj
-1 0 0 1 421.8 405.36 Tm
-(at) Tj
-1 0 0 1 431.88 405.36 Tm
-(a) Tj
-1 0 0 1 439.32 405.36 Tm
-(time.) Tj
-1 0 0 1 464.399 405.36 Tm
-(Safety) Tj
-1 0 0 1 492.839 405.36 Tm
-(requires) Tj
-1 0 0 1 527.879 405.36 Tm
-(the) Tj
-1 0 0 1 315 393.48 Tm
-(bound) Tj
-1 0 0 1 342.84 393.48 Tm
-(on) Tj
-1 0 0 1 355.68 393.48 Tm
-(the) Tj
-1 0 0 1 370.68 393.48 Tm
-(number) Tj
-1 0 0 1 404.04 393.48 Tm
-(of) Tj
-1 0 0 1 415.2 393.48 Tm
-(f) Tj
-1 0 0 1 418.44 393.48 Tm
-(aulty) Tj
-1 0 0 1 441.24 393.48 Tm
-(replicas) Tj
-1 0 0 1 475.079 393.48 Tm
-(because) Tj
-1 0 0 1 509.519 393.48 Tm
-(a) Tj
-1 0 0 1 516.839 393.48 Tm
-(f) Tj
-1 0 0 1 520.079 393.48 Tm
-(aulty) Tj
-1 0 0 1 315 381.48 Tm
-(replica) Tj
-1 0 0 1 344.16 381.48 Tm
-(can) Tj
-1 0 0 1 360.12 381.48 Tm
-(beha) Tj
-1 0 0 1 378.84 381.48 Tm
-(v) Tj
-1 0 0 1 383.76 381.48 Tm
-(e) Tj
-1 0 0 1 390 381.48 Tm
-(arbitrarily) Tj
-1 0 0 1 429.48 381.48 Tm
-(,) Tj
-1 0 0 1 433.92 381.48 Tm
-(e.g.,) Tj
-1 0 0 1 452.879 381.48 Tm
-(it) Tj
-1 0 0 1 460.559 381.48 Tm
-(can) Tj
-1 0 0 1 476.399 381.48 Tm
-(destro) Tj
-1 0 0 1 500.759 381.48 Tm
-(y) Tj
-1 0 0 1 507.719 381.48 Tm
-(its) Tj
-1 0 0 1 519.239 381.48 Tm
-(state.) Tj
-1 0 0 1 324.96 369.6 Tm
-(Safety) Tj
-1 0 0 1 355.68 369.6 Tm
-(is) Tj
-1 0 0 1 367.68 369.6 Tm
-(pro) Tj
-1 0 0 1 381 369.6 Tm
-(vided) Tj
-1 0 0 1 408.24 369.6 Tm
-(re) Tj
-1 0 0 1 415.92 369.6 Tm
-(gardless) Tj
-1 0 0 1 453.72 369.6 Tm
-(of) Tj
-1 0 0 1 467.4 369.6 Tm
-(ho) Tj
-1 0 0 1 477.24 369.6 Tm
-(w) Tj
-1 0 0 1 489.599 369.6 Tm
-(man) Tj
-1 0 0 1 506.759 369.6 Tm
-(y) Tj
-1 0 0 1 516.839 369.6 Tm
-(f) Tj
-1 0 0 1 520.079 369.6 Tm
-(aulty) Tj
-1 0 0 1 315 357.6 Tm
-(clients) Tj
-1 0 0 1 344.64 357.6 Tm
-(are) Tj
-1 0 0 1 360.48 357.6 Tm
-(using) Tj
-1 0 0 1 385.8 357.6 Tm
-(the) Tj
-1 0 0 1 401.64 357.6 Tm
-(service) Tj
-1 0 0 1 433.44 357.6 Tm
-(\(e) Tj
-1 0 0 1 440.999 357.6 Tm
-(v) Tj
-1 0 0 1 445.919 357.6 Tm
-(en) Tj
-1 0 0 1 458.879 357.6 Tm
-(if) Tj
-1 0 0 1 468.599 357.6 Tm
-(the) Tj
-1 0 0 1 480.719 357.6 Tm
-(y) Tj
-1 0 0 1 489.239 357.6 Tm
-(collude) Tj
-1 0 0 1 522.239 357.6 Tm
-(with) Tj
-1 0 0 1 315 345.72 Tm
-(f) Tj
-1 0 0 1 318.24 345.72 Tm
-(aulty) Tj
-1 0 0 1 339.84 345.72 Tm
-(replicas\):) Tj
-1 0 0 1 379.92 345.72 Tm
-(all) Tj
-1 0 0 1 391.44 345.72 Tm
-(operations) Tj
-1 0 0 1 434.76 345.72 Tm
-(performed) Tj
-1 0 0 1 478.199 345.72 Tm
-(by) Tj
-1 0 0 1 489.839 345.72 Tm
-(f) Tj
-1 0 0 1 493.079 345.72 Tm
-(aulty) Tj
-1 0 0 1 514.679 345.72 Tm
-(clients) Tj
-1 0 0 1 315 333.72 Tm
-(are) Tj
-1 0 0 1 330.72 333.72 Tm
-(observ) Tj
-1 0 0 1 357.36 333.72 Tm
-(ed) Tj
-1 0 0 1 370.08 333.72 Tm
-(in) Tj
-1 0 0 1 381.48 333.72 Tm
-(a) Tj
-1 0 0 1 389.52 333.72 Tm
-(consistent) Tj
-1 0 0 1 432.84 333.72 Tm
-(w) Tj
-1 0 0 1 439.92 333.72 Tm
-(ay) Tj
-1 0 0 1 452.999 333.72 Tm
-(by) Tj
-1 0 0 1 466.559 333.72 Tm
-(non-f) Tj
-1 0 0 1 488.279 333.72 Tm
-(aulty) Tj
-1 0 0 1 511.439 333.72 Tm
-(clients.) Tj
-1 0 0 1 315 321.84 Tm
-(In) Tj
-1 0 0 1 327.36 321.84 Tm
-(particular) Tj
-1 0 0 1 365.4 321.84 Tm
-(,) Tj
-1 0 0 1 372.12 321.84 Tm
-(if) Tj
-1 0 0 1 382.32 321.84 Tm
-(the) Tj
-1 0 0 1 398.64 321.84 Tm
-(service) Tj
-1 0 0 1 430.92 321.84 Tm
-(operations) Tj
-1 0 0 1 476.519 321.84 Tm
-(are) Tj
-1 0 0 1 492.719 321.84 Tm
-(designed) Tj
-1 0 0 1 532.199 321.84 Tm
-(to) Tj
-1 0 0 1 315 309.84 Tm
-(preserv) Tj
-1 0 0 1 344.4 309.84 Tm
-(e) Tj
-1 0 0 1 353.88 309.84 Tm
-(some) Tj
-1 0 0 1 380.16 309.84 Tm
-(in) Tj
-1 0 0 1 387.6 309.84 Tm
-(v) Tj
-1 0 0 1 392.4 309.84 Tm
-(ariants) Tj
-1 0 0 1 424.08 309.84 Tm
-(on) Tj
-1 0 0 1 439.2 309.84 Tm
-(the) Tj
-1 0 0 1 456.72 309.84 Tm
-(service) Tj
-1 0 0 1 490.199 309.84 Tm
-(state,) Tj
-1 0 0 1 516.839 309.84 Tm
-(f) Tj
-1 0 0 1 520.079 309.84 Tm
-(aulty) Tj
-1 0 0 1 315 297.96 Tm
-(clients) Tj
-1 0 0 1 343.56 297.96 Tm
-(cannot) Tj
-1 0 0 1 372.6 297.96 Tm
-(break) Tj
-1 0 0 1 397.2 297.96 Tm
-(those) Tj
-1 0 0 1 420.72 297.96 Tm
-(in) Tj
-1 0 0 1 428.16 297.96 Tm
-(v) Tj
-1 0 0 1 432.96 297.96 Tm
-(ariants.) Tj
-1 0 0 1 324.96 285.96 Tm
-(The) Tj
-1 0 0 1 345 285.96 Tm
-(safety) Tj
-1 0 0 1 373.44 285.96 Tm
-(property) Tj
-1 0 0 1 411.84 285.96 Tm
-(is) Tj
-1 0 0 1 423 285.96 Tm
-(insuf) Tj
-1 0 0 1 442.8 285.96 Tm
-(\256cient) Tj
-1 0 0 1 472.199 285.96 Tm
-(to) Tj
-1 0 0 1 484.559 285.96 Tm
-(guard) Tj
-1 0 0 1 511.799 285.96 Tm
-(against) Tj
-1 0 0 1 315 274.08 Tm
-(f) Tj
-1 0 0 1 318.24 274.08 Tm
-(aulty) Tj
-1 0 0 1 342.12 274.08 Tm
-(clients,) Tj
-1 0 0 1 374.88 274.08 Tm
-(e.g.,) Tj
-1 0 0 1 396.12 274.08 Tm
-(in) Tj
-1 0 0 1 407.88 274.08 Tm
-(a) Tj
-1 0 0 1 416.28 274.08 Tm
-(\256le) Tj
-1 0 0 1 432.959 274.08 Tm
-(system) Tj
-1 0 0 1 464.639 274.08 Tm
-(a) Tj
-1 0 0 1 472.919 274.08 Tm
-(f) Tj
-1 0 0 1 476.159 274.08 Tm
-(aulty) Tj
-1 0 0 1 500.039 274.08 Tm
-(client) Tj
-1 0 0 1 526.199 274.08 Tm
-(can) Tj
-1 0 0 1 315 262.08 Tm
-(write) Tj
-1 0 0 1 339.48 262.08 Tm
-(garbage) Tj
-1 0 0 1 375 262.08 Tm
-(data) Tj
-1 0 0 1 395.64 262.08 Tm
-(to) Tj
-1 0 0 1 407.4 262.08 Tm
-(some) Tj
-1 0 0 1 432.48 262.08 Tm
-(shared) Tj
-1 0 0 1 462.6 262.08 Tm
-(\256le.) Tj
-1 0 0 1 485.999 262.08 Tm
-(Ho) Tj
-1 0 0 1 497.999 262.08 Tm
-(we) Tj
-1 0 0 1 509.399 262.08 Tm
-(v) Tj
-1 0 0 1 514.319 262.08 Tm
-(er) Tj
-1 0 0 1 521.759 262.08 Tm
-(,) Tj
-1 0 0 1 528.359 262.08 Tm
-(we) Tj
-1 0 0 1 315 250.2 Tm
-(limit) Tj
-1 0 0 1 337.92 250.2 Tm
-(the) Tj
-1 0 0 1 354.24 250.2 Tm
-(amount) Tj
-1 0 0 1 388.32 250.2 Tm
-(of) Tj
-1 0 0 1 400.68 250.2 Tm
-(damage) Tj
-1 0 0 1 435.84 250.2 Tm
-(a) Tj
-1 0 0 1 444.36 250.2 Tm
-(f) Tj
-1 0 0 1 447.6 250.2 Tm
-(aulty) Tj
-1 0 0 1 471.719 250.2 Tm
-(client) Tj
-1 0 0 1 497.999 250.2 Tm
-(can) Tj
-1 0 0 1 515.879 250.2 Tm
-(do) Tj
-1 0 0 1 530.039 250.2 Tm
-(by) Tj
-1 0 0 1 315 238.2 Tm
-(pro) Tj
-1 0 0 1 328.32 238.2 Tm
-(viding) Tj
-1 0 0 1 358.08 238.2 Tm
-(access) Tj
-1 0 0 1 387.96 238.2 Tm
-(control:) Tj
-1 0 0 1 426.48 238.2 Tm
-(we) Tj
-1 0 0 1 442.56 238.2 Tm
-(authenticate) Tj
-1 0 0 1 495.119 238.2 Tm
-(clients) Tj
-1 0 0 1 525.599 238.2 Tm
-(and) Tj
-1 0 0 1 315 226.32 Tm
-(den) Tj
-1 0 0 1 329.4 226.32 Tm
-(y) Tj
-1 0 0 1 337.08 226.32 Tm
-(access) Tj
-1 0 0 1 365.52 226.32 Tm
-(if) Tj
-1 0 0 1 374.52 226.32 Tm
-(the) Tj
-1 0 0 1 389.52 226.32 Tm
-(client) Tj
-1 0 0 1 414.6 226.32 Tm
-(issuing) Tj
-1 0 0 1 445.68 226.32 Tm
-(a) Tj
-1 0 0 1 453 226.32 Tm
-(request) Tj
-1 0 0 1 484.679 226.32 Tm
-(does) Tj
-1 0 0 1 505.919 226.32 Tm
-(not) Tj
-1 0 0 1 521.519 226.32 Tm
-(ha) Tj
-1 0 0 1 530.759 226.32 Tm
-(v) Tj
-1 0 0 1 535.679 226.32 Tm
-(e) Tj
-1 0 0 1 315 214.32 Tm
-(the) Tj
-1 0 0 1 331.2 214.32 Tm
-(right) Tj
-1 0 0 1 354.12 214.32 Tm
-(to) Tj
-1 0 0 1 365.88 214.32 Tm
-(in) Tj
-1 0 0 1 373.32 214.32 Tm
-(v) Tj
-1 0 0 1 378.12 214.32 Tm
-(ok) Tj
-1 0 0 1 388.08 214.32 Tm
-(e) Tj
-1 0 0 1 396.36 214.32 Tm
-(the) Tj
-1 0 0 1 412.56 214.32 Tm
-(operation.) Tj
-1 0 0 1 460.919 214.32 Tm
-(Also,) Tj
-1 0 0 1 486.719 214.32 Tm
-(services) Tj
-1 0 0 1 522.839 214.32 Tm
-(may) Tj
-1 0 0 1 315 202.32 Tm
-(pro) Tj
-1 0 0 1 328.32 202.32 Tm
-(vide) Tj
-1 0 0 1 348.24 202.32 Tm
-(operations) Tj
-1 0 0 1 392.64 202.32 Tm
-(to) Tj
-1 0 0 1 403.32 202.32 Tm
-(change) Tj
-1 0 0 1 434.4 202.32 Tm
-(the) Tj
-1 0 0 1 449.52 202.32 Tm
-(access) Tj
-1 0 0 1 477.839 202.32 Tm
-(permissions) Tj
-1 0 0 1 528.359 202.32 Tm
-(for) Tj
-1 0 0 1 315 190.44 Tm
-(a) Tj
-1 0 0 1 322.68 190.44 Tm
-(client.) Tj
-1 0 0 1 352.92 190.44 Tm
-(Since) Tj
-1 0 0 1 378.24 190.44 Tm
-(the) Tj
-1 0 0 1 393.72 190.44 Tm
-(algorithm) Tj
-1 0 0 1 435.6 190.44 Tm
-(ensures) Tj
-1 0 0 1 468.719 190.44 Tm
-(that) Tj
-1 0 0 1 486.839 190.44 Tm
-(the) Tj
-1 0 0 1 502.199 190.44 Tm
-(ef) Tj
-1 0 0 1 509.759 190.44 Tm
-(fects) Tj
-1 0 0 1 531.719 190.44 Tm
-(of) Tj
-1 0 0 1 315 178.44 Tm
-(access) Tj
-1 0 0 1 342.24 178.44 Tm
-(re) Tj
-1 0 0 1 349.8 178.44 Tm
-(v) Tj
-1 0 0 1 354.6 178.44 Tm
-(ocation) Tj
-1 0 0 1 385.68 178.44 Tm
-(operations) Tj
-1 0 0 1 429 178.44 Tm
-(are) Tj
-1 0 0 1 443.04 178.44 Tm
-(observ) Tj
-1 0 0 1 469.679 178.44 Tm
-(ed) Tj
-1 0 0 1 480.599 178.44 Tm
-(consistently) Tj
-1 0 0 1 530.039 178.44 Tm
-(by) Tj
-1 0 0 1 315 166.56 Tm
-(all) Tj
-1 0 0 1 326.88 166.56 Tm
-(clients,) Tj
-1 0 0 1 357.36 166.56 Tm
-(this) Tj
-1 0 0 1 373.56 166.56 Tm
-(pro) Tj
-1 0 0 1 386.88 166.56 Tm
-(vides) Tj
-1 0 0 1 409.68 166.56 Tm
-(a) Tj
-1 0 0 1 415.92 166.56 Tm
-(po) Tj
-1 0 0 1 425.76 166.56 Tm
-(werful) Tj
-1 0 0 1 453.599 166.56 Tm
-(mechanism) Tj
-1 0 0 1 500.759 166.56 Tm
-(to) Tj
-1 0 0 1 510.479 166.56 Tm
-(reco) Tj
-1 0 0 1 527.639 166.56 Tm
-(v) Tj
-1 0 0 1 532.559 166.56 Tm
-(er) Tj
-1 0 0 1 315 154.56 Tm
-(from) Tj
-1 0 0 1 336.84 154.56 Tm
-(attacks) Tj
-1 0 0 1 366.96 154.56 Tm
-(by) Tj
-1 0 0 1 379.44 154.56 Tm
-(f) Tj
-1 0 0 1 382.68 154.56 Tm
-(aulty) Tj
-1 0 0 1 405.12 154.56 Tm
-(clients.) Tj
-1 0 0 1 324.96 142.68 Tm
-(The) Tj
-1 0 0 1 343.56 142.68 Tm
-(algorithm) Tj
-1 0 0 1 385.44 142.68 Tm
-(does) Tj
-1 0 0 1 406.8 142.68 Tm
-(not) Tj
-1 0 0 1 422.64 142.68 Tm
-(rely) Tj
-1 0 0 1 441.24 142.68 Tm
-(on) Tj
-1 0 0 1 454.319 142.68 Tm
-(synchron) Tj
-1 0 0 1 491.039 142.68 Tm
-(y) Tj
-1 0 0 1 498.839 142.68 Tm
-(to) Tj
-1 0 0 1 509.759 142.68 Tm
-(pro) Tj
-1 0 0 1 523.079 142.68 Tm
-(vide) Tj
-1 0 0 1 315 130.68 Tm
-(safety) Tj
-1 0 0 1 338.28 130.68 Tm
-(.) Tj
-1 0 0 1 346.2 130.68 Tm
-(Therefore,) Tj
-1 0 0 1 391.32 130.68 Tm
-(it) Tj
-1 0 0 1 399.96 130.68 Tm
-(must) Tj
-1 0 0 1 422.52 130.68 Tm
-(rely) Tj
-1 0 0 1 441.24 130.68 Tm
-(on) Tj
-1 0 0 1 454.319 130.68 Tm
-(synchron) Tj
-1 0 0 1 491.039 130.68 Tm
-(y) Tj
-1 0 0 1 498.839 130.68 Tm
-(to) Tj
-1 0 0 1 509.759 130.68 Tm
-(pro) Tj
-1 0 0 1 523.079 130.68 Tm
-(vide) Tj
-1 0 0 1 315 118.8 Tm
-(li) Tj
-1 0 0 1 320.28 118.8 Tm
-(v) Tj
-1 0 0 1 325.2 118.8 Tm
-(eness;) Tj
-1 0 0 1 357.72 118.8 Tm
-(otherwise) Tj
-1 0 0 1 402.72 118.8 Tm
-(it) Tj
-1 0 0 1 414.6 118.8 Tm
-(could) Tj
-1 0 0 1 443.04 118.8 Tm
-(be) Tj
-1 0 0 1 458.76 118.8 Tm
-(used) Tj
-1 0 0 1 483.36 118.8 Tm
-(to) Tj
-1 0 0 1 497.399 118.8 Tm
-(implement) Tj
-1 0 0 1 315 106.8 Tm
-(consensus) Tj
-1 0 0 1 360.84 106.8 Tm
-(in) Tj
-1 0 0 1 374.04 106.8 Tm
-(an) Tj
-1 0 0 1 388.8 106.8 Tm
-(asynchronous) Tj
-1 0 0 1 449.04 106.8 Tm
-(system,) Tj
-1 0 0 1 485.4 106.8 Tm
-(which) Tj
-1 0 0 1 515.159 106.8 Tm
-(is) Tj
-1 0 0 1 527.279 106.8 Tm
-(not) Tj
-1 0 0 1 315 94.92 Tm
-(possible) Tj
-1 0 0 1 354.36 94.92 Tm
-([9) Tj
-1 0 0 1 362.64 94.92 Tm
-(].) Tj
-1 0 0 1 384.6 94.92 Tm
-(W) Tj
-1 0 0 1 393.12 94.92 Tm
-(e) Tj
-1 0 0 1 404.28 94.92 Tm
-(guarantee) Tj
-1 0 0 1 449.64 94.92 Tm
-(li) Tj
-1 0 0 1 454.92 94.92 Tm
-(v) Tj
-1 0 0 1 459.84 94.92 Tm
-(eness,) Tj
-1 0 0 1 491.64 94.92 Tm
-(i.e.,) Tj
-1 0 0 1 513.959 94.92 Tm
-(clients) Tj
-1 0 0 1 315 82.92 Tm
-(e) Tj
-1 0 0 1 319.2 82.92 Tm
-(v) Tj
-1 0 0 1 324.12 82.92 Tm
-(entually) Tj
-1 0 0 1 359.64 82.92 Tm
-(recei) Tj
-1 0 0 1 378.84 82.92 Tm
-(v) Tj
-1 0 0 1 383.76 82.92 Tm
-(e) Tj
-1 0 0 1 391.68 82.92 Tm
-(replies) Tj
-1 0 0 1 421.8 82.92 Tm
-(to) Tj
-1 0 0 1 433.079 82.92 Tm
-(their) Tj
-1 0 0 1 454.919 82.92 Tm
-(requests,) Tj
-1 0 0 1 493.919 82.92 Tm
-(pro) Tj
-1 0 0 1 507.239 82.92 Tm
-(vided) Tj
-1 0 0 1 532.799 82.92 Tm
-(at) Tj
-1 0 0 1 315 71.04 Tm
-(most) Tj
-ET
-q
-2.6 0 0 -9.9 340.4 78.5 cm
-/R103 Do
-Q
-q
-4.3 0 0 -3.3 344.7 78.1 cm
-/R107 Do
-Q
-q
-4.7 0 0 -0.5 350 76.9 cm
-/R111 Do
-Q
-BT
-/R54 7 Tf
-1 0 0 1 355.56 74.88 Tm
-(1) Tj
-ET
-q
-14.64 0 0 -0.48 344.388 73.692 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 349.92 67.56 Tm
-(3) Tj
-ET
-q
-2.6 0 0 -9.9 360.3 78.5 cm
-/R115 Do
-Q
-BT
-/R54 10 Tf
-1 0 0 1 369 71.04 Tm
-(replicas) Tj
-1 0 0 1 404.4 71.04 Tm
-(are) Tj
-1 0 0 1 420.96 71.04 Tm
-(f) Tj
-1 0 0 1 424.2 71.04 Tm
-(aulty) Tj
-1 0 0 1 448.56 71.04 Tm
-(and) Tj
-/R96 10 Tf
-1 0 0 1 467.28 71.04 Tm
-(delay) Tj
-ET
-q
-2.4 0 0 -9.9 489.8 78.5 cm
-/R88 Do
-Q
-endstream
-endobj
-118 0 obj
-12699
-endobj
-119 0 obj
-<< /Type /XObject /Name /R119 /Subtype /Image /Length 120 0 R
-/ImageMask true /Width 31 /Height 64 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 31 /BlackIs1 true >>]
->>
-stream
--R^*Z*BGB0H4Soj^)si_^$kpon\=tqs*c'f5C`EWjO>)lnj&fHn&,0\n,L/,TE5*9~>
-endstream
-endobj
-120 0 obj
-68
-endobj
-121 0 obj
-<< /Length 122 0 R >>
-stream
-q
-3.1 0 0 -6.4 492.9 77.3 cm
-/R119 Do
-Q
-q
-2.4 0 0 -9.9 496.7 78.5 cm
-/R92 Do
-Q
-BT
-/R54 10 Tf
-1 0 0 1 504.6 71.04 Tm
-(does) Tj
-1 0 0 1 527.279 71.04 Tm
-(not) Tj
-1 0 0 1 303.48 35.16 Tm
-(2) Tj
-ET
-Q
-endstream
-endobj
-122 0 obj
-196
-endobj
-123 0 obj
-<<
-/Type /Page
-/MediaBox [0 0 612 792]
-/Parent 2 0 R
-/Resources << /ProcSet [/PDF /ImageB /Text]
-/Font <<
-/R96 96 0 R
-/R57 57 0 R
-/R54 54 0 R
->>
-/XObject <<
-/R92 92 0 R
-/R119 119 0 R
-/R88 88 0 R
-/R115 115 0 R
-/R111 111 0 R
-/R107 107 0 R
-/R103 103 0 R
-/R99 99 0 R
-/R80 80 0 R
-/R76 76 0 R
-/R72 72 0 R
-/R60 60 0 R
-/R68 68 0 R
-/R84 84 0 R
-/R64 64 0 R
-/R50 50 0 R
->>
->>
-/Contents [
-48 0 R
-52 0 R
-55 0 R
-58 0 R
-62 0 R
-66 0 R
-70 0 R
-74 0 R
-78 0 R
-82 0 R
-86 0 R
-90 0 R
-94 0 R
-97 0 R
-101 0 R
-105 0 R
-109 0 R
-113 0 R
-117 0 R
-121 0 R
-]
->>
-endobj
-124 0 obj
-<< /Type /Font /Name /R124 /Subtype /Type1 /BaseFont /Times-Roman >>
-endobj
-125 0 obj
-<< /Length 126 0 R >>
-stream
-q
-BT
-/R124 10 Tf
-1 0 0 1 72 709.08 Tm
-(gro) Tj
-1 0 0 1 85.2 709.08 Tm
-(w) Tj
-1 0 0 1 96.7199 709.08 Tm
-(f) Tj
-1 0 0 1 99.9599 709.08 Tm
-(aster) Tj
-1 0 0 1 123.12 709.08 Tm
-(than) Tj
-ET
-Q
-q
-W
-0 0 612 792 re
-n
-endstream
-endobj
-126 0 obj
-208
-endobj
-127 0 obj
-<< /Type /XObject /Name /R127 /Subtype /Image /Length 128 0 R
-/ImageMask true /Width 31 /Height 64 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 31 /BlackIs1 true >>]
->>
-stream
--R^*Z*BGB0H4Soj^)si_^$kpon\=tqs*c'f5C`EWjO>)lnj&fHn&,0\n,L/,TE5*9~>
-endstream
-endobj
-128 0 obj
-68
-endobj
-129 0 obj
-<< /Length 130 0 R >>
-stream
-q
-3.1 0 0 -6.4 144.9 715.4 cm
-/R127 Do
-Q
-BT
-/R124 10 Tf
-1 0 0 1 152.88 709.08 Tm
-(inde\256nitely) Tj
-1 0 0 1 197.88 709.08 Tm
-(.) Tj
-1 0 0 1 209.52 709.08 Tm
-(Here,) Tj
-ET
-endstream
-endobj
-130 0 obj
-172
-endobj
-131 0 obj
-<< /Type /Font /Name /R131 /Subtype /Type1 /BaseFont /Times-Italic >>
-endobj
-132 0 obj
-<< /Length 133 0 R >>
-stream
-BT
-/R131 10 Tf
-1 0 0 1 236.4 709.08 Tm
-(delay) Tj
-ET
-endstream
-endobj
-133 0 obj
-53
-endobj
-134 0 obj
-<< /Type /XObject /Name /R134 /Subtype /Image /Length 135 0 R
-/ImageMask true /Width 24 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 24 /BlackIs1 true >>]
->>
-stream
-+rF]%*LO8IHL@*j8[taqp!<~>
-endstream
-endobj
-135 0 obj
-80
-endobj
-136 0 obj
-<< /Length 137 0 R >>
-stream
-q
-2.4 0 0 -9.9 258.8 716.6 cm
-/R134 Do
-Q
-q
-3.1 0 0 -6.4 261.9 715.4 cm
-/R127 Do
-Q
-endstream
-endobj
-137 0 obj
-82
-endobj
-138 0 obj
-<< /Type /XObject /Name /R138 /Subtype /Image /Length 139 0 R
-/ImageMask true /Width 24 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 24 /BlackIs1 true >>]
->>
-stream
-,JEO$loTRL4niC`hqS$`rnmKps6nkFp\Y!js6KW5s0(&RK)W@\(KK(`l\2@U?Bm&k<5,",!$D~>
-endstream
-endobj
-139 0 obj
-76
-endobj
-140 0 obj
-<< /Length 141 0 R >>
-stream
-q
-2.4 0 0 -9.9 265.7 716.6 cm
-/R138 Do
-Q
-BT
-/R124 10 Tf
-1 0 0 1 273.719 709.08 Tm
-(is) Tj
-1 0 0 1 284.879 709.08 Tm
-(the) Tj
-1 0 0 1 72 697.08 Tm
-(time) Tj
-1 0 0 1 92.8799 697.08 Tm
-(between) Tj
-1 0 0 1 129.24 697.08 Tm
-(the) Tj
-1 0 0 1 144.6 697.08 Tm
-(moment) Tj
-ET
-q
-3.1 0 0 -6.4 180.6 703.4 cm
-/R127 Do
-Q
-BT
-1 0 0 1 187.08 697.08 Tm
-(when) Tj
-1 0 0 1 211.92 697.08 Tm
-(a) Tj
-1 0 0 1 219.48 697.08 Tm
-(message) Tj
-1 0 0 1 256.32 697.08 Tm
-(is) Tj
-1 0 0 1 266.159 697.08 Tm
-(sent) Tj
-1 0 0 1 285.359 697.08 Tm
-(for) Tj
-1 0 0 1 72 685.2 Tm
-(the) Tj
-1 0 0 1 87.2399 685.2 Tm
-(\256rst) Tj
-1 0 0 1 105.84 685.2 Tm
-(time) Tj
-1 0 0 1 126.6 685.2 Tm
-(and) Tj
-1 0 0 1 144.12 685.2 Tm
-(the) Tj
-1 0 0 1 159.36 685.2 Tm
-(moment) Tj
-1 0 0 1 195.12 685.2 Tm
-(when) Tj
-1 0 0 1 219.72 685.2 Tm
-(it) Tj
-1 0 0 1 228.359 685.2 Tm
-(is) Tj
-1 0 0 1 238.079 685.2 Tm
-(recei) Tj
-1 0 0 1 257.279 685.2 Tm
-(v) Tj
-1 0 0 1 262.199 685.2 Tm
-(ed) Tj
-1 0 0 1 274.559 685.2 Tm
-(by) Tj
-1 0 0 1 287.639 685.2 Tm
-(its) Tj
-1 0 0 1 72 673.2 Tm
-(destination) Tj
-1 0 0 1 117.6 673.2 Tm
-(\(assuming) Tj
-1 0 0 1 160.56 673.2 Tm
-(the) Tj
-1 0 0 1 174.6 673.2 Tm
-(sender) Tj
-1 0 0 1 202.56 673.2 Tm
-(k) Tj
-1 0 0 1 207.479 673.2 Tm
-(eeps) Tj
-1 0 0 1 227.039 673.2 Tm
-(retransmitting) Tj
-1 0 0 1 284.879 673.2 Tm
-(the) Tj
-1 0 0 1 72 661.32 Tm
-(message) Tj
-1 0 0 1 108.6 661.32 Tm
-(until) Tj
-1 0 0 1 129.6 661.32 Tm
-(it) Tj
-1 0 0 1 138 661.32 Tm
-(is) Tj
-1 0 0 1 147.48 661.32 Tm
-(recei) Tj
-1 0 0 1 166.68 661.32 Tm
-(v) Tj
-1 0 0 1 171.6 661.32 Tm
-(ed\).) Tj
-1 0 0 1 191.16 661.32 Tm
-(\(A) Tj
-1 0 0 1 204.48 661.32 Tm
-(more) Tj
-1 0 0 1 227.76 661.32 Tm
-(precise) Tj
-1 0 0 1 258.839 661.32 Tm
-(de\256nition) Tj
-1 0 0 1 72 649.32 Tm
-(can) Tj
-1 0 0 1 89.4 649.32 Tm
-(be) Tj
-1 0 0 1 102.36 649.32 Tm
-(found) Tj
-1 0 0 1 129.24 649.32 Tm
-(in) Tj
-1 0 0 1 140.52 649.32 Tm
-([4) Tj
-1 0 0 1 148.8 649.32 Tm
-(].\)) Tj
-1 0 0 1 164.76 649.32 Tm
-(This) Tj
-1 0 0 1 186 649.32 Tm
-(is) Tj
-1 0 0 1 196.2 649.32 Tm
-(a) Tj
-1 0 0 1 204.24 649.32 Tm
-(rather) Tj
-1 0 0 1 230.999 649.32 Tm
-(weak) Tj
-1 0 0 1 255.599 649.32 Tm
-(synchron) Tj
-1 0 0 1 292.319 649.32 Tm
-(y) Tj
-1 0 0 1 72 637.44 Tm
-(assumption) Tj
-1 0 0 1 121.2 637.44 Tm
-(that) Tj
-1 0 0 1 139.92 637.44 Tm
-(is) Tj
-1 0 0 1 150.48 637.44 Tm
-(lik) Tj
-1 0 0 1 160.92 637.44 Tm
-(ely) Tj
-1 0 0 1 176.88 637.44 Tm
-(to) Tj
-1 0 0 1 188.4 637.44 Tm
-(be) Tj
-1 0 0 1 201.6 637.44 Tm
-(true) Tj
-1 0 0 1 220.92 637.44 Tm
-(in) Tj
-1 0 0 1 232.56 637.44 Tm
-(an) Tj
-1 0 0 1 241.92 637.44 Tm
-(y) Tj
-1 0 0 1 250.559 637.44 Tm
-(real) Tj
-1 0 0 1 269.279 637.44 Tm
-(system) Tj
-1 0 0 1 72 625.44 Tm
-(pro) Tj
-1 0 0 1 85.32 625.44 Tm
-(vided) Tj
-1 0 0 1 111.36 625.44 Tm
-(netw) Tj
-1 0 0 1 130.68 625.44 Tm
-(ork) Tj
-1 0 0 1 147.96 625.44 Tm
-(f) Tj
-1 0 0 1 151.2 625.44 Tm
-(aults) Tj
-1 0 0 1 174.12 625.44 Tm
-(are) Tj
-1 0 0 1 190.44 625.44 Tm
-(e) Tj
-1 0 0 1 194.64 625.44 Tm
-(v) Tj
-1 0 0 1 199.56 625.44 Tm
-(entually) Tj
-1 0 0 1 235.56 625.44 Tm
-(repaired,) Tj
-1 0 0 1 275.159 625.44 Tm
-(yet) Tj
-1 0 0 1 291.479 625.44 Tm
-(it) Tj
-1 0 0 1 72 613.44 Tm
-(enables) Tj
-1 0 0 1 104.4 613.44 Tm
-(us) Tj
-1 0 0 1 115.68 613.44 Tm
-(to) Tj
-1 0 0 1 126 613.44 Tm
-(circumv) Tj
-1 0 0 1 158.76 613.44 Tm
-(ent) Tj
-1 0 0 1 173.16 613.44 Tm
-(the) Tj
-1 0 0 1 187.8 613.44 Tm
-(impossibility) Tj
-1 0 0 1 242.279 613.44 Tm
-(result) Tj
-1 0 0 1 266.999 613.44 Tm
-(in) Tj
-1 0 0 1 277.199 613.44 Tm
-([9) Tj
-1 0 0 1 285.479 613.44 Tm
-(].) Tj
-1 0 0 1 81.96 601.56 Tm
-(The) Tj
-1 0 0 1 99.2399 601.56 Tm
-(resilienc) Tj
-1 0 0 1 132.96 601.56 Tm
-(y) Tj
-1 0 0 1 139.56 601.56 Tm
-(of) Tj
-1 0 0 1 149.52 601.56 Tm
-(our) Tj
-1 0 0 1 164.64 601.56 Tm
-(algorithm) Tj
-1 0 0 1 205.08 601.56 Tm
-(is) Tj
-1 0 0 1 213.479 601.56 Tm
-(optimal:) Tj
-1 0 0 1 249.959 601.56 Tm
-(3) Tj
-ET
-endstream
-endobj
-141 0 obj
-3700
-endobj
-142 0 obj
-<< /Type /XObject /Name /R142 /Subtype /Image /Length 143 0 R
-/ImageMask true /Width 50 /Height 92 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 50 /BlackIs1 true >>]
->>
-stream
-5$eL7-b:K3p0<%?
-h1u#R]2'Mug].5is7$!eqtL-hqu?EZs5/V3iQXZVs7/ihqu?EZs4QRbJe-ans*o2/4DdB_@6aqq5Q~>
-endstream
-endobj
-143 0 obj
-96
-endobj
-144 0 obj
-<< /Length 145 0 R >>
-stream
-q
-5 0 0 -9.2 255.4 608.7 cm
-/R142 Do
-Q
-endstream
-endobj
-145 0 obj
-39
-endobj
-146 0 obj
-<< /Type /XObject /Name /R146 /Subtype /Image /Length 147 0 R
-/ImageMask true /Width 66 /Height 65 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 66 /BlackIs1 true >>]
->>
-stream
-,BZ6Ns8W-!s8W-!s-Eq9Iaj?!s8W-!s8W-!s8Uf'#QTA~>
-endstream
-endobj
-147 0 obj
-47
-endobj
-148 0 obj
-<< /Length 149 0 R >>
-stream
-q
-6.6 0 0 -6.5 262.1 607.4 cm
-/R146 Do
-Q
-BT
-1 0 0 1 269.999 601.56 Tm
-(1) Tj
-1 0 0 1 276.479 601.56 Tm
-(is) Tj
-1 0 0 1 284.879 601.56 Tm
-(the) Tj
-1 0 0 1 72 589.56 Tm
-(minimum) Tj
-1 0 0 1 112.92 589.56 Tm
-(number) Tj
-1 0 0 1 145.68 589.56 Tm
-(of) Tj
-1 0 0 1 156.12 589.56 Tm
-(replicas) Tj
-1 0 0 1 189.36 589.56 Tm
-(that) Tj
-1 0 0 1 206.52 589.56 Tm
-(allo) Tj
-1 0 0 1 221.28 589.56 Tm
-(w) Tj
-1 0 0 1 230.64 589.56 Tm
-(an) Tj
-1 0 0 1 242.159 589.56 Tm
-(asynchronous) Tj
-1 0 0 1 72 577.68 Tm
-(system) Tj
-1 0 0 1 101.64 577.68 Tm
-(to) Tj
-1 0 0 1 111.36 577.68 Tm
-(pro) Tj
-1 0 0 1 124.68 577.68 Tm
-(vide) Tj
-1 0 0 1 143.64 577.68 Tm
-(the) Tj
-1 0 0 1 157.8 577.68 Tm
-(safety) Tj
-1 0 0 1 183.6 577.68 Tm
-(and) Tj
-1 0 0 1 199.92 577.68 Tm
-(li) Tj
-1 0 0 1 205.2 577.68 Tm
-(v) Tj
-1 0 0 1 210.12 577.68 Tm
-(eness) Tj
-1 0 0 1 233.64 577.68 Tm
-(properties) Tj
-1 0 0 1 275.399 577.68 Tm
-(when) Tj
-1 0 0 1 72 565.68 Tm
-(up) Tj
-1 0 0 1 85.8 565.68 Tm
-(to) Tj
-ET
-q
-5 0 0 -9.2 97.8 572.8 cm
-/R142 Do
-Q
-BT
-1 0 0 1 107.28 565.68 Tm
-(replicas) Tj
-1 0 0 1 142.08 565.68 Tm
-(are) Tj
-1 0 0 1 158.04 565.68 Tm
-(f) Tj
-1 0 0 1 161.28 565.68 Tm
-(aulty) Tj
-1 0 0 1 185.04 565.68 Tm
-(\(see) Tj
-1 0 0 1 204.96 565.68 Tm
-([2) Tj
-1 0 0 1 213.24 565.68 Tm
-(]) Tj
-1 0 0 1 220.44 565.68 Tm
-(for) Tj
-1 0 0 1 235.919 565.68 Tm
-(a) Tj
-1 0 0 1 244.199 565.68 Tm
-(proof\).) Tj
-1 0 0 1 279.239 565.68 Tm
-(This) Tj
-1 0 0 1 72 553.8 Tm
-(man) Tj
-1 0 0 1 89.16 553.8 Tm
-(y) Tj
-1 0 0 1 96.8399 553.8 Tm
-(replicas) Tj
-1 0 0 1 130.56 553.8 Tm
-(are) Tj
-1 0 0 1 145.56 553.8 Tm
-(needed) Tj
-1 0 0 1 176.64 553.8 Tm
-(because) Tj
-1 0 0 1 210.96 553.8 Tm
-(it) Tj
-1 0 0 1 219.36 553.8 Tm
-(must) Tj
-1 0 0 1 241.559 553.8 Tm
-(be) Tj
-1 0 0 1 253.799 553.8 Tm
-(possible) Tj
-1 0 0 1 289.199 553.8 Tm
-(to) Tj
-1 0 0 1 72 541.8 Tm
-(proceed) Tj
-1 0 0 1 106.32 541.8 Tm
-(after) Tj
-1 0 0 1 127.44 541.8 Tm
-(communicating) Tj
-1 0 0 1 192.24 541.8 Tm
-(with) Tj
-ET
-endstream
-endobj
-149 0 obj
-1895
-endobj
-150 0 obj
-<< /Type /XObject /Name /R150 /Subtype /Image /Length 151 0 R
-/ImageMask true /Width 54 /Height 46 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 54 /BlackIs1 true >>]
->>
-stream
-4N]t,$m>7rl/"o@d!re,
-pYTohhg]lis4_o!aocV_^Yur>rVsXfR^`8
-endstream
-endobj
-151 0 obj
-102
-endobj
-152 0 obj
-<< /Length 153 0 R >>
-stream
-q
-5.4 0 0 -4.6 213 546.3 cm
-/R150 Do
-Q
-endstream
-endobj
-153 0 obj
-39
-endobj
-154 0 obj
-<< /Type /XObject /Name /R154 /Subtype /Image /Length 155 0 R
-/ImageMask true /Width 61 /Height 5 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 61 /BlackIs1 true >>]
->>
-stream
-,Cs,bC&f@X~>
-endstream
-endobj
-155 0 obj
-13
-endobj
-156 0 obj
-<< /Length 157 0 R >>
-stream
-q
-6.1 0 0 -0.5 222 544.6 cm
-/R154 Do
-Q
-q
-5 0 0 -9.2 231.8 548.9 cm
-/R142 Do
-Q
-BT
-1 0 0 1 240.12 541.8 Tm
-(replicas,) Tj
-1 0 0 1 276.479 541.8 Tm
-(since) Tj
-ET
-q
-5 0 0 -9.2 72.4 537 cm
-/R142 Do
-Q
-BT
-1 0 0 1 80.4 529.92 Tm
-(replicas) Tj
-1 0 0 1 113.76 529.92 Tm
-(might) Tj
-1 0 0 1 139.44 529.92 Tm
-(be) Tj
-1 0 0 1 151.2 529.92 Tm
-(f) Tj
-1 0 0 1 154.44 529.92 Tm
-(aulty) Tj
-1 0 0 1 176.76 529.92 Tm
-(and) Tj
-1 0 0 1 193.56 529.92 Tm
-(not) Tj
-1 0 0 1 208.68 529.92 Tm
-(responding.) Tj
-1 0 0 1 259.079 529.92 Tm
-(Ho) Tj
-1 0 0 1 271.079 529.92 Tm
-(we) Tj
-1 0 0 1 282.479 529.92 Tm
-(v) Tj
-1 0 0 1 287.399 529.92 Tm
-(er) Tj
-1 0 0 1 294.839 529.92 Tm
-(,) Tj
-1 0 0 1 72 517.92 Tm
-(it) Tj
-1 0 0 1 80.4 517.92 Tm
-(is) Tj
-1 0 0 1 89.9999 517.92 Tm
-(possible) Tj
-1 0 0 1 125.52 517.92 Tm
-(that) Tj
-1 0 0 1 143.4 517.92 Tm
-(the) Tj
-ET
-q
-5 0 0 -9.2 158.9 525 cm
-/R142 Do
-Q
-BT
-1 0 0 1 167.4 517.92 Tm
-(replicas) Tj
-1 0 0 1 201.24 517.92 Tm
-(that) Tj
-1 0 0 1 219.119 517.92 Tm
-(did) Tj
-1 0 0 1 234.719 517.92 Tm
-(not) Tj
-1 0 0 1 250.439 517.92 Tm
-(respond) Tj
-1 0 0 1 284.879 517.92 Tm
-(are) Tj
-1 0 0 1 72 506.04 Tm
-(not) Tj
-1 0 0 1 86.88 506.04 Tm
-(f) Tj
-1 0 0 1 90.1199 506.04 Tm
-(aulty) Tj
-1 0 0 1 112.2 506.04 Tm
-(and,) Tj
-1 0 0 1 131.28 506.04 Tm
-(therefore,) Tj
-ET
-q
-5 0 0 -9.2 172.2 513.1 cm
-/R142 Do
-Q
-BT
-1 0 0 1 180 506.04 Tm
-(of) Tj
-1 0 0 1 190.44 506.04 Tm
-(those) Tj
-1 0 0 1 213.6 506.04 Tm
-(that) Tj
-1 0 0 1 230.639 506.04 Tm
-(responded) Tj
-1 0 0 1 273.719 506.04 Tm
-(might) Tj
-1 0 0 1 72 494.04 Tm
-(be) Tj
-1 0 0 1 84.2399 494.04 Tm
-(f) Tj
-1 0 0 1 87.4799 494.04 Tm
-(aulty) Tj
-1 0 0 1 106.92 494.04 Tm
-(.) Tj
-1 0 0 1 113.76 494.04 Tm
-(Ev) Tj
-1 0 0 1 124.8 494.04 Tm
-(en) Tj
-1 0 0 1 136.92 494.04 Tm
-(so,) Tj
-1 0 0 1 151.2 494.04 Tm
-(there) Tj
-1 0 0 1 173.88 494.04 Tm
-(must) Tj
-1 0 0 1 196.08 494.04 Tm
-(still) Tj
-1 0 0 1 213.84 494.04 Tm
-(be) Tj
-1 0 0 1 226.079 494.04 Tm
-(enough) Tj
-1 0 0 1 258.239 494.04 Tm
-(responses) Tj
-1 0 0 1 72 482.16 Tm
-(that) Tj
-1 0 0 1 88.9199 482.16 Tm
-(those) Tj
-1 0 0 1 111.84 482.16 Tm
-(from) Tj
-1 0 0 1 133.2 482.16 Tm
-(non-f) Tj
-1 0 0 1 154.92 482.16 Tm
-(aulty) Tj
-1 0 0 1 176.52 482.16 Tm
-(replicas) Tj
-1 0 0 1 209.52 482.16 Tm
-(outnumber) Tj
-1 0 0 1 254.639 482.16 Tm
-(those) Tj
-1 0 0 1 277.679 482.16 Tm
-(from) Tj
-1 0 0 1 72 470.16 Tm
-(f) Tj
-1 0 0 1 75.24 470.16 Tm
-(aulty) Tj
-1 0 0 1 97.6799 470.16 Tm
-(ones,) Tj
-1 0 0 1 120.84 470.16 Tm
-(i.e.,) Tj
-ET
-q
-5.4 0 0 -4.6 138.2 474.7 cm
-/R150 Do
-Q
-q
-6.1 0 0 -0.5 147.1 473 cm
-/R154 Do
-Q
-BT
-1 0 0 1 156.24 470.16 Tm
-(2) Tj
-ET
-q
-5 0 0 -9.2 161.7 477.3 cm
-/R142 Do
-Q
-endstream
-endobj
-157 0 obj
-2543
-endobj
-158 0 obj
-<< /Type /XObject /Name /R158 /Subtype /Image /Length 159 0 R
-/ImageMask true /Width 61 /Height 61 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 61 /BlackIs1 true >>]
->>
-stream
-,Ld57i8DMjL(5&>G[TII_hJX
-endstream
-endobj
-159 0 obj
-114
-endobj
-160 0 obj
-<< /Length 161 0 R >>
-stream
-q
-6.1 0 0 -6.1 170.7 475.8 cm
-/R158 Do
-Q
-q
-5 0 0 -9.2 180.8 477.3 cm
-/R142 Do
-Q
-BT
-1 0 0 1 186.36 470.16 Tm
-(.) Tj
-1 0 0 1 192.48 470.16 Tm
-(Therefore) Tj
-ET
-q
-5.4 0 0 -4.6 234.4 474.7 cm
-/R150 Do
-Q
-q
-6.1 0 0 -6.1 243.8 475.8 cm
-/R158 Do
-Q
-BT
-1 0 0 1 253.439 470.16 Tm
-(3) Tj
-ET
-q
-5 0 0 -9.2 258.9 477.3 cm
-/R142 Do
-Q
-BT
-1 0 0 1 264.479 470.16 Tm
-(.) Tj
-1 0 0 1 81.96 458.28 Tm
-(The) Tj
-1 0 0 1 100.56 458.28 Tm
-(algorithm) Tj
-1 0 0 1 142.44 458.28 Tm
-(does) Tj
-1 0 0 1 163.8 458.28 Tm
-(not) Tj
-1 0 0 1 179.52 458.28 Tm
-(address) Tj
-1 0 0 1 212.52 458.28 Tm
-(the) Tj
-1 0 0 1 227.879 458.28 Tm
-(problem) Tj
-1 0 0 1 264.119 458.28 Tm
-(of) Tj
-1 0 0 1 275.519 458.28 Tm
-(f) Tj
-1 0 0 1 278.759 458.28 Tm
-(ault-) Tj
-1 0 0 1 72 446.28 Tm
-(tolerant) Tj
-1 0 0 1 104.76 446.28 Tm
-(pri) Tj
-1 0 0 1 115.68 446.28 Tm
-(v) Tj
-1 0 0 1 120.48 446.28 Tm
-(ac) Tj
-1 0 0 1 129.24 446.28 Tm
-(y:) Tj
-1 0 0 1 140.16 446.28 Tm
-(a) Tj
-1 0 0 1 146.88 446.28 Tm
-(f) Tj
-1 0 0 1 150.12 446.28 Tm
-(aulty) Tj
-1 0 0 1 172.32 446.28 Tm
-(replica) Tj
-1 0 0 1 201.6 446.28 Tm
-(may) Tj
-1 0 0 1 221.039 446.28 Tm
-(leak) Tj
-1 0 0 1 239.999 446.28 Tm
-(information) Tj
-1 0 0 1 289.199 446.28 Tm
-(to) Tj
-1 0 0 1 72 434.4 Tm
-(an) Tj
-1 0 0 1 83.1599 434.4 Tm
-(attack) Tj
-1 0 0 1 106.92 434.4 Tm
-(er) Tj
-1 0 0 1 114.12 434.4 Tm
-(.) Tj
-1 0 0 1 120 434.4 Tm
-(It) Tj
-1 0 0 1 127.8 434.4 Tm
-(is) Tj
-1 0 0 1 136.32 434.4 Tm
-(not) Tj
-1 0 0 1 150.84 434.4 Tm
-(feasible) Tj
-1 0 0 1 183.6 434.4 Tm
-(to) Tj
-1 0 0 1 193.2 434.4 Tm
-(of) Tj
-1 0 0 1 201.359 434.4 Tm
-(fer) Tj
-1 0 0 1 214.079 434.4 Tm
-(f) Tj
-1 0 0 1 217.319 434.4 Tm
-(ault-tolerant) Tj
-1 0 0 1 267.719 434.4 Tm
-(pri) Tj
-1 0 0 1 278.639 434.4 Tm
-(v) Tj
-1 0 0 1 283.439 434.4 Tm
-(ac) Tj
-1 0 0 1 292.199 434.4 Tm
-(y) Tj
-1 0 0 1 72 422.4 Tm
-(in) Tj
-1 0 0 1 85.44 422.4 Tm
-(the) Tj
-1 0 0 1 103.44 422.4 Tm
-(general) Tj
-1 0 0 1 138.48 422.4 Tm
-(case) Tj
-1 0 0 1 161.4 422.4 Tm
-(because) Tj
-1 0 0 1 198.6 422.4 Tm
-(service) Tj
-1 0 0 1 232.56 422.4 Tm
-(operations) Tj
-1 0 0 1 279.839 422.4 Tm
-(may) Tj
-1 0 0 1 72 410.52 Tm
-(perform) Tj
-1 0 0 1 105.96 410.52 Tm
-(arbitrary) Tj
-1 0 0 1 142.08 410.52 Tm
-(compu) Tj
-1 0 0 1 169.32 410.52 Tm
-(tation) Tj
-1 0 0 1 192 410.52 Tm
-(s) Tj
-1 0 0 1 197.4 410.52 Tm
-(using) Tj
-1 0 0 1 220.68 410.52 Tm
-(th) Tj
-1 0 0 1 228.36 410.52 Tm
-(eir) Tj
-1 0 0 1 240.479 410.52 Tm
-(ar) Tj
-1 0 0 1 248.039 410.52 Tm
-(g) Tj
-1 0 0 1 252.959 410.52 Tm
-(um) Tj
-1 0 0 1 265.679 410.52 Tm
-(ents) Tj
-1 0 0 1 283.319 410.52 Tm
-(an) Tj
-1 0 0 1 292.679 410.52 Tm
-(d) Tj
-1 0 0 1 72 398.52 Tm
-(the) Tj
-1 0 0 1 88.0799 398.52 Tm
-(service) Tj
-1 0 0 1 120.36 398.52 Tm
-(state;) Tj
-1 0 0 1 146.04 398.52 Tm
-(replicas) Tj
-1 0 0 1 180.96 398.52 Tm
-(need) Tj
-1 0 0 1 203.76 398.52 Tm
-(this) Tj
-1 0 0 1 222.12 398.52 Tm
-(information) Tj
-1 0 0 1 273.119 398.52 Tm
-(in) Tj
-1 0 0 1 284.879 398.52 Tm
-(the) Tj
-1 0 0 1 72 386.52 Tm
-(clear) Tj
-1 0 0 1 93.8399 386.52 Tm
-(to) Tj
-1 0 0 1 103.92 386.52 Tm
-(e) Tj
-1 0 0 1 108.24 386.52 Tm
-(x) Tj
-1 0 0 1 113.16 386.52 Tm
-(ecute) Tj
-1 0 0 1 136.56 386.52 Tm
-(such) Tj
-1 0 0 1 157.2 386.52 Tm
-(operations) Tj
-1 0 0 1 201.12 386.52 Tm
-(ef) Tj
-1 0 0 1 208.68 386.52 Tm
-(\256ciently) Tj
-1 0 0 1 240.839 386.52 Tm
-(.) Tj
-1 0 0 1 246.719 386.52 Tm
-(It) Tj
-1 0 0 1 255.239 386.52 Tm
-(is) Tj
-1 0 0 1 264.359 386.52 Tm
-(possible) Tj
-1 0 0 1 72 374.64 Tm
-(to) Tj
-1 0 0 1 82.08 374.64 Tm
-(use) Tj
-1 0 0 1 97.6799 374.64 Tm
-(secret) Tj
-1 0 0 1 123.24 374.64 Tm
-(sharing) Tj
-1 0 0 1 154.8 374.64 Tm
-(schemes) Tj
-1 0 0 1 190.92 374.64 Tm
-([35) Tj
-1 0 0 1 204.12 374.64 Tm
-(]) Tj
-1 0 0 1 209.76 374.64 Tm
-(to) Tj
-1 0 0 1 219.84 374.64 Tm
-(obtain) Tj
-1 0 0 1 247.079 374.64 Tm
-(pri) Tj
-1 0 0 1 257.999 374.64 Tm
-(v) Tj
-1 0 0 1 262.799 374.64 Tm
-(ac) Tj
-1 0 0 1 271.559 374.64 Tm
-(y) Tj
-1 0 0 1 278.639 374.64 Tm
-(e) Tj
-1 0 0 1 282.839 374.64 Tm
-(v) Tj
-1 0 0 1 287.759 374.64 Tm
-(en) Tj
-1 0 0 1 72 362.64 Tm
-(in) Tj
-1 0 0 1 82.56 362.64 Tm
-(the) Tj
-1 0 0 1 97.6799 362.64 Tm
-(presence) Tj
-1 0 0 1 135.36 362.64 Tm
-(of) Tj
-1 0 0 1 146.52 362.64 Tm
-(a) Tj
-1 0 0 1 153.84 362.64 Tm
-(threshold) Tj
-1 0 0 1 193.8 362.64 Tm
-(of) Tj
-1 0 0 1 204.96 362.64 Tm
-(malicious) Tj
-1 0 0 1 246.599 362.64 Tm
-(replicas) Tj
-1 0 0 1 280.439 362.64 Tm
-([13) Tj
-1 0 0 1 293.639 362.64 Tm
-(]) Tj
-1 0 0 1 72 350.76 Tm
-(for) Tj
-1 0 0 1 85.4399 350.76 Tm
-(the) Tj
-1 0 0 1 99.4799 350.76 Tm
-(ar) Tj
-1 0 0 1 107.16 350.76 Tm
-(guments) Tj
-1 0 0 1 142.56 350.76 Tm
-(and) Tj
-1 0 0 1 158.76 350.76 Tm
-(portions) Tj
-1 0 0 1 193.32 350.76 Tm
-(of) Tj
-1 0 0 1 203.4 350.76 Tm
-(the) Tj
-1 0 0 1 217.439 350.76 Tm
-(state) Tj
-1 0 0 1 237.479 350.76 Tm
-(that) Tj
-1 0 0 1 254.279 350.76 Tm
-(are) Tj
-1 0 0 1 268.199 350.76 Tm
-(opaque) Tj
-1 0 0 1 72 338.76 Tm
-(to) Tj
-1 0 0 1 83.28 338.76 Tm
-(the) Tj
-1 0 0 1 99.1199 338.76 Tm
-(service) Tj
-1 0 0 1 130.92 338.76 Tm
-(operations.) Tj
-1 0 0 1 181.68 338.76 Tm
-(W) Tj
-1 0 0 1 190.2 338.76 Tm
-(e) Tj
-1 0 0 1 198.36 338.76 Tm
-(plan) Tj
-1 0 0 1 218.999 338.76 Tm
-(to) Tj
-1 0 0 1 230.399 338.76 Tm
-(in) Tj
-1 0 0 1 237.839 338.76 Tm
-(v) Tj
-1 0 0 1 242.759 338.76 Tm
-(estigate) Tj
-1 0 0 1 276.479 338.76 Tm
-(these) Tj
-1 0 0 1 72 326.88 Tm
-(techniques) Tj
-1 0 0 1 117.12 326.88 Tm
-(in) Tj
-1 0 0 1 127.32 326.88 Tm
-(the) Tj
-1 0 0 1 141.96 326.88 Tm
-(future.) Tj
-ET
-endstream
-endobj
-161 0 obj
-5184
-endobj
-162 0 obj
-<< /Type /Font /Name /R162 /Subtype /Type1 /BaseFont /Times-Bold >>
-endobj
-163 0 obj
-<< /Length 164 0 R >>
-stream
-BT
-/R162 12 Tf
-1 0 0 1 72 302.4 Tm
-(4) Tj
-1 0 0 1 89.8799 302.4 Tm
-(The) Tj
-1 0 0 1 112.8 302.4 Tm
-(Algorithm) Tj
-/R124 10 Tf
-1 0 0 1 72 285.96 Tm
-(Our) Tj
-1 0 0 1 89.8799 285.96 Tm
-(algorithm) Tj
-1 0 0 1 130.92 285.96 Tm
-(is) Tj
-1 0 0 1 139.92 285.96 Tm
-(a) Tj
-1 0 0 1 146.76 285.96 Tm
-(form) Tj
-1 0 0 1 168.48 285.96 Tm
-(of) Tj
-/R131 10 Tf
-1 0 0 1 179.16 285.96 Tm
-(state) Tj
-1 0 0 1 200.279 285.96 Tm
-(mac) Tj
-1 0 0 1 216.839 285.96 Tm
-(hine) Tj
-/R124 10 Tf
-1 0 0 1 236.279 285.96 Tm
-(replication) Tj
-1 0 0 1 281.279 285.96 Tm
-([17) Tj
-1 0 0 1 294.479 285.96 Tm
-(,) Tj
-1 0 0 1 72 274.08 Tm
-(34) Tj
-1 0 0 1 81.96 274.08 Tm
-(]:) Tj
-1 0 0 1 94.4399 274.08 Tm
-(the) Tj
-1 0 0 1 110.52 274.08 Tm
-(service) Tj
-1 0 0 1 142.56 274.08 Tm
-(is) Tj
-1 0 0 1 153.12 274.08 Tm
-(modeled) Tj
-1 0 0 1 191.28 274.08 Tm
-(as) Tj
-1 0 0 1 203.4 274.08 Tm
-(a) Tj
-1 0 0 1 211.8 274.08 Tm
-(state) Tj
-1 0 0 1 233.879 274.08 Tm
-(machine) Tj
-1 0 0 1 271.559 274.08 Tm
-(that) Tj
-1 0 0 1 290.399 274.08 Tm
-(is) Tj
-1 0 0 1 72 262.08 Tm
-(replicated) Tj
-1 0 0 1 114 262.08 Tm
-(across) Tj
-1 0 0 1 141.6 262.08 Tm
-(dif) Tj
-1 0 0 1 152.52 262.08 Tm
-(ferent) Tj
-1 0 0 1 178.32 262.08 Tm
-(nodes) Tj
-1 0 0 1 204.24 262.08 Tm
-(in) Tj
-1 0 0 1 214.68 262.08 Tm
-(a) Tj
-1 0 0 1 221.76 262.08 Tm
-(distrib) Tj
-1 0 0 1 247.079 262.08 Tm
-(uted) Tj
-1 0 0 1 266.879 262.08 Tm
-(system.) Tj
-1 0 0 1 72 250.2 Tm
-(Each) Tj
-1 0 0 1 96 250.2 Tm
-(state) Tj
-1 0 0 1 118.32 250.2 Tm
-(machine) Tj
-1 0 0 1 156.12 250.2 Tm
-(replica) Tj
-1 0 0 1 187.32 250.2 Tm
-(maintains) Tj
-1 0 0 1 230.16 250.2 Tm
-(the) Tj
-1 0 0 1 246.479 250.2 Tm
-(service) Tj
-1 0 0 1 278.759 250.2 Tm
-(state) Tj
-1 0 0 1 72 238.2 Tm
-(and) Tj
-1 0 0 1 89.88 238.2 Tm
-(implements) Tj
-1 0 0 1 139.92 238.2 Tm
-(the) Tj
-1 0 0 1 155.64 238.2 Tm
-(service) Tj
-1 0 0 1 187.44 238.2 Tm
-(operations.) Tj
-1 0 0 1 238.2 238.2 Tm
-(W) Tj
-1 0 0 1 246.719 238.2 Tm
-(e) Tj
-1 0 0 1 254.759 238.2 Tm
-(denote) Tj
-1 0 0 1 284.879 238.2 Tm
-(the) Tj
-1 0 0 1 72 226.32 Tm
-(set) Tj
-1 0 0 1 86.5199 226.32 Tm
-(of) Tj
-1 0 0 1 98.2799 226.32 Tm
-(replicas) Tj
-1 0 0 1 132.72 226.32 Tm
-(by) Tj
-ET
-endstream
-endobj
-164 0 obj
-2073
-endobj
-165 0 obj
-<< /Type /XObject /Name /R165 /Subtype /Image /Length 166 0 R
-/ImageMask true /Width 82 /Height 72 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 82 /BlackIs1 true >>]
->>
-stream
--Y/ktlnh'J_1WlVIN>d;OF5k,Do-F.&+/,KrBCW.%mf0XjHsl[XfmH0hq-EWKY$j0J0P"&G5OH\
-%NI1uW$_fE0RLEdqg:VHE;eVks1FCucp-FBHiJ$ama`KH4`C&`>7V$N*[EFX"s^Mb8oRjd(Qr1T!"]/~>
-endstream
-endobj
-166 0 obj
-158
-endobj
-167 0 obj
-<< /Length 168 0 R >>
-stream
-q
-8.2 0 0 -7.2 146.3 233.2 cm
-/R165 Do
-Q
-BT
-1 0 0 1 158.04 226.32 Tm
-(and) Tj
-1 0 0 1 175.8 226.32 Tm
-(identify) Tj
-1 0 0 1 210.239 226.32 Tm
-(each) Tj
-1 0 0 1 231.959 226.32 Tm
-(replica) Tj
-1 0 0 1 262.559 226.32 Tm
-(using) Tj
-1 0 0 1 287.639 226.32 Tm
-(an) Tj
-1 0 0 1 72 214.32 Tm
-(inte) Tj
-1 0 0 1 86.88 214.32 Tm
-(ger) Tj
-1 0 0 1 103.2 214.32 Tm
-(in) Tj
-ET
-endstream
-endobj
-168 0 obj
-361
-endobj
-169 0 obj
-<< /Type /XObject /Name /R169 /Subtype /Image /Length 170 0 R
-/ImageMask true /Width 39 /Height 100 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 39 /BlackIs1 true >>]
->>
-stream
-+CYskJO*-9kn*)Wn:LN:
-s8W-!s8W-!s4?PIKnQ+Ne;bBe<0A()%X^A[(i\@1^OQ:`s8W-!s8W,ur&u1hf`^Jj+bNVe!tYGt"9~>
-endstream
-endobj
-170 0 obj
-101
-endobj
-171 0 obj
-<< /Length 172 0 R >>
-stream
-q
-3.9 0 0 -10 115.2 221.8 cm
-/R169 Do
-Q
-BT
-1 0 0 1 119.76 214.32 Tm
-(0) Tj
-ET
-endstream
-endobj
-172 0 obj
-78
-endobj
-173 0 obj
-<< /Type /XObject /Name /R173 /Subtype /Image /Length 174 0 R
-/ImageMask true /Width 13 /Height 30 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 13 /BlackIs1 true >>]
->>
-stream
-0g^A/h=&*equ,LR2Xj(@lh_"t-iec'~>
-endstream
-endobj
-174 0 obj
-33
-endobj
-175 0 obj
-<< /Length 176 0 R >>
-stream
-q
-1.3 0 0 -3 125.6 215.4 cm
-/R173 Do
-Q
-endstream
-endobj
-176 0 obj
-39
-endobj
-177 0 obj
-<< /Type /XObject /Name /R177 /Subtype /Image /Length 178 0 R
-/ImageMask true /Width 12 /Height 11 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 12 /BlackIs1 true >>]
->>
-stream
-2W04\s8@WU'ECB$~>
-endstream
-endobj
-178 0 obj
-18
-endobj
-179 0 obj
-<< /Length 180 0 R >>
-stream
-q
-1.2 0 0 -1.1 130 215.4 cm
-/R177 Do
-Q
-q
-1.2 0 0 -1.1 132.8 215.4 cm
-/R177 Do
-Q
-q
-1.2 0 0 -1.1 135.6 215.4 cm
-/R177 Do
-Q
-q
-1.3 0 0 -3 138.3 215.4 cm
-/R173 Do
-Q
-endstream
-endobj
-180 0 obj
-160
-endobj
-181 0 obj
-<< /Type /XObject /Name /R181 /Subtype /Image /Length 182 0 R
-/ImageMask true /Width 6 /Height 100 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 6 /BlackIs1 true >>]
->>
-stream
-02qoNs8W-!s8W-!s8W-!s8W-!s8W-!s8Uf'#QTA~>
-endstream
-endobj
-182 0 obj
-42
-endobj
-183 0 obj
-<< /Length 184 0 R >>
-stream
-q
-0.6 0 0 -10 143 221.8 cm
-/R181 Do
-Q
-q
-8.2 0 0 -7.2 144.8 221.2 cm
-/R165 Do
-Q
-q
-0.6 0 0 -10 154.1 221.8 cm
-/R181 Do
-Q
-q
-6.1 0 0 -0.5 159.6 217.1 cm
-/R154 Do
-Q
-BT
-1 0 0 1 169.44 214.32 Tm
-(1) Tj
-ET
-endstream
-endobj
-184 0 obj
-198
-endobj
-185 0 obj
-<< /Type /XObject /Name /R185 /Subtype /Image /Length 186 0 R
-/ImageMask true /Width 39 /Height 100 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 39 /BlackIs1 true >>]
->>
-stream
-,DhM)&Fel!i:(XA
-\*s@ss8W-!s8W-!hhT+`nDT#4)$`#/'GV2X"UH\]_@,]0s8W-!s8W-!s'MeW#sg*k*#HKf&-r8$"9~>
-endstream
-endobj
-186 0 obj
-96
-endobj
-187 0 obj
-<< /Length 188 0 R >>
-stream
-q
-3.9 0 0 -10 175 221.8 cm
-/R185 Do
-Q
-BT
-1 0 0 1 179.52 214.32 Tm
-(.) Tj
-1 0 0 1 189.12 214.32 Tm
-(F) Tj
-1 0 0 1 194.52 214.32 Tm
-(or) Tj
-1 0 0 1 206.519 214.32 Tm
-(simplicity) Tj
-1 0 0 1 245.879 214.32 Tm
-(,) Tj
-1 0 0 1 252.359 214.32 Tm
-(we) Tj
-1 0 0 1 267.719 214.32 Tm
-(assume) Tj
-ET
-q
-0.6 0 0 -10 73 209.8 cm
-/R181 Do
-Q
-q
-8.2 0 0 -7.2 74.9 209.2 cm
-/R165 Do
-Q
-q
-0.6 0 0 -10 84.2 209.8 cm
-/R181 Do
-Q
-endstream
-endobj
-188 0 obj
-404
-endobj
-189 0 obj
-<< /Type /XObject /Name /R189 /Subtype /Image /Length 190 0 R
-/ImageMask true /Width 66 /Height 27 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 66 /BlackIs1 true >>]
->>
-stream
-/e%CP4)j*Wq&BoPm6CdS5Q~>
-endstream
-endobj
-190 0 obj
-25
-endobj
-191 0 obj
-<< /Length 192 0 R >>
-stream
-q
-6.6 0 0 -2.7 92.3 206.2 cm
-/R189 Do
-Q
-BT
-1 0 0 1 105.36 202.32 Tm
-(3) Tj
-ET
-q
-5 0 0 -9.2 110.8 209.4 cm
-/R142 Do
-Q
-q
-6.6 0 0 -6.5 120.3 208.1 cm
-/R146 Do
-Q
-BT
-1 0 0 1 130.92 202.32 Tm
-(1) Tj
-1 0 0 1 140.64 202.32 Tm
-(where) Tj
-ET
-q
-5 0 0 -9.2 170.1 209.4 cm
-/R142 Do
-Q
-BT
-1 0 0 1 180.24 202.32 Tm
-(is) Tj
-1 0 0 1 191.64 202.32 Tm
-(the) Tj
-1 0 0 1 208.44 202.32 Tm
-(maximum) Tj
-1 0 0 1 253.56 202.32 Tm
-(number) Tj
-1 0 0 1 288.719 202.32 Tm
-(of) Tj
-1 0 0 1 72 190.44 Tm
-(replicas) Tj
-1 0 0 1 107.88 190.44 Tm
-(that) Tj
-1 0 0 1 127.68 190.44 Tm
-(may) Tj
-1 0 0 1 149.76 190.44 Tm
-(be) Tj
-1 0 0 1 164.04 190.44 Tm
-(f) Tj
-1 0 0 1 167.28 190.44 Tm
-(aulty;) Tj
-1 0 0 1 196.08 190.44 Tm
-(although) Tj
-1 0 0 1 235.799 190.44 Tm
-(there) Tj
-1 0 0 1 260.519 190.44 Tm
-(could) Tj
-1 0 0 1 287.639 190.44 Tm
-(be) Tj
-1 0 0 1 72 178.44 Tm
-(more) Tj
-1 0 0 1 94.4399 178.44 Tm
-(than) Tj
-1 0 0 1 113.52 178.44 Tm
-(3) Tj
-ET
-q
-5 0 0 -9.2 119 185.5 cm
-/R142 Do
-Q
-q
-6.6 0 0 -6.5 126 184.2 cm
-/R146 Do
-Q
-BT
-1 0 0 1 134.4 178.44 Tm
-(1) Tj
-1 0 0 1 141.24 178.44 Tm
-(replicas,) Tj
-1 0 0 1 176.76 178.44 Tm
-(the) Tj
-1 0 0 1 190.92 178.44 Tm
-(additional) Tj
-1 0 0 1 232.679 178.44 Tm
-(replicas) Tj
-1 0 0 1 265.559 178.44 Tm
-(de) Tj
-1 0 0 1 274.919 178.44 Tm
-(grade) Tj
-1 0 0 1 72 166.56 Tm
-(performance) Tj
-1 0 0 1 125.04 166.56 Tm
-(\(since) Tj
-1 0 0 1 151.44 166.56 Tm
-(more) Tj
-1 0 0 1 174.6 166.56 Tm
-(and) Tj
-1 0 0 1 191.64 166.56 Tm
-(bigger) Tj
-1 0 0 1 219.72 166.56 Tm
-(messages) Tj
-1 0 0 1 260.039 166.56 Tm
-(are) Tj
-1 0 0 1 274.919 166.56 Tm
-(being) Tj
-1 0 0 1 72 154.56 Tm
-(e) Tj
-1 0 0 1 76.32 154.56 Tm
-(xchanged\)) Tj
-1 0 0 1 120.24 154.56 Tm
-(without) Tj
-1 0 0 1 153.24 154.56 Tm
-(pro) Tj
-1 0 0 1 166.56 154.56 Tm
-(viding) Tj
-1 0 0 1 194.28 154.56 Tm
-(impro) Tj
-1 0 0 1 218.16 154.56 Tm
-(v) Tj
-1 0 0 1 223.079 154.56 Tm
-(ed) Tj
-1 0 0 1 234.599 154.56 Tm
-(resilienc) Tj
-1 0 0 1 268.319 154.56 Tm
-(y) Tj
-1 0 0 1 272.759 154.56 Tm
-(.) Tj
-1 0 0 1 81.96 142.68 Tm
-(The) Tj
-1 0 0 1 100.2 142.68 Tm
-(replicas) Tj
-1 0 0 1 134.04 142.68 Tm
-(mo) Tj
-1 0 0 1 146.76 142.68 Tm
-(v) Tj
-1 0 0 1 151.68 142.68 Tm
-(e) Tj
-1 0 0 1 158.64 142.68 Tm
-(through) Tj
-1 0 0 1 192.36 142.68 Tm
-(a) Tj
-1 0 0 1 199.56 142.68 Tm
-(succession) Tj
-1 0 0 1 244.92 142.68 Tm
-(of) Tj
-1 0 0 1 256.079 142.68 Tm
-(con\256gura-) Tj
-1 0 0 1 72 130.68 Tm
-(tions) Tj
-1 0 0 1 94.4399 130.68 Tm
-(called) Tj
-/R131 10 Tf
-1 0 0 1 121.32 130.68 Tm
-(vie) Tj
-1 0 0 1 132.84 130.68 Tm
-(ws) Tj
-/R124 10 Tf
-1 0 0 1 143.28 130.68 Tm
-(.) Tj
-1 0 0 1 151.2 130.68 Tm
-(In) Tj
-1 0 0 1 162.6 130.68 Tm
-(a) Tj
-1 0 0 1 170.04 130.68 Tm
-(vie) Tj
-1 0 0 1 182.04 130.68 Tm
-(w) Tj
-1 0 0 1 192.239 130.68 Tm
-(one) Tj
-1 0 0 1 209.759 130.68 Tm
-(replica) Tj
-1 0 0 1 239.879 130.68 Tm
-(is) Tj
-1 0 0 1 249.599 130.68 Tm
-(the) Tj
-/R131 10 Tf
-1 0 0 1 264.959 130.68 Tm
-(primary) Tj
-/R124 10 Tf
-1 0 0 1 72 118.8 Tm
-(and) Tj
-1 0 0 1 90 118.8 Tm
-(the) Tj
-1 0 0 1 105.84 118.8 Tm
-(others) Tj
-1 0 0 1 133.92 118.8 Tm
-(are) Tj
-/R131 10 Tf
-1 0 0 1 149.64 118.8 Tm
-(bac) Tj
-1 0 0 1 163.92 118.8 Tm
-(kups) Tj
-/R124 10 Tf
-1 0 0 1 182.28 118.8 Tm
-(.) Tj
-1 0 0 1 191.76 118.8 Tm
-(V) Tj
-1 0 0 1 198.36 118.8 Tm
-(ie) Tj
-1 0 0 1 205.32 118.8 Tm
-(ws) Tj
-1 0 0 1 219.96 118.8 Tm
-(are) Tj
-1 0 0 1 235.8 118.8 Tm
-(numbered) Tj
-1 0 0 1 279.239 118.8 Tm
-(con-) Tj
-1 0 0 1 72 106.8 Tm
-(secuti) Tj
-1 0 0 1 95.0399 106.8 Tm
-(v) Tj
-1 0 0 1 99.9599 106.8 Tm
-(ely) Tj
-1 0 0 1 111.6 106.8 Tm
-(.) Tj
-1 0 0 1 119.04 106.8 Tm
-(The) Tj
-1 0 0 1 137.52 106.8 Tm
-(primary) Tj
-1 0 0 1 172.08 106.8 Tm
-(of) Tj
-1 0 0 1 183.36 106.8 Tm
-(a) Tj
-1 0 0 1 190.8 106.8 Tm
-(vie) Tj
-1 0 0 1 202.8 106.8 Tm
-(w) Tj
-1 0 0 1 213 106.8 Tm
-(is) Tj
-1 0 0 1 222.599 106.8 Tm
-(replica) Tj
-ET
-endstream
-endobj
-192 0 obj
-3645
-endobj
-193 0 obj
-<< /Type /XObject /Name /R193 /Subtype /Image /Length 194 0 R
-/ImageMask true /Width 54 /Height 64 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 54 /BlackIs1 true >>]
->>
-stream
--D98r4=0b"4s0Orro]!o&:3^Ke&7l2
-[/(7*rS^,RIfB4oLV,SG]>+(NrPSU5I/eEj^Aki-s4fFGn+Z5e95',@28).TTZ(Ru?\8Ii-iec'~>
-endstream
-endobj
-194 0 obj
-109
-endobj
-195 0 obj
-<< /Length 196 0 R >>
-stream
-q
-5.4 0 0 -6.4 252.3 111.3 cm
-/R193 Do
-Q
-BT
-1 0 0 1 260.759 106.8 Tm
-(such) Tj
-1 0 0 1 281.999 106.8 Tm
-(that) Tj
-ET
-q
-5.4 0 0 -6.4 71.6 99.4 cm
-/R193 Do
-Q
-q
-6.6 0 0 -2.7 82.5 98.8 cm
-/R189 Do
-Q
-endstream
-endobj
-196 0 obj
-195
-endobj
-197 0 obj
-<< /Type /XObject /Name /R197 /Subtype /Image /Length 198 0 R
-/ImageMask true /Width 44 /Height 46 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 44 /BlackIs1 true >>]
->>
-stream
-2$jBq
-&9R,hkFhTE_G0fRqg[T's0obU5O\AciSX+=pUN/*r',Z@_Z&BgfC8fKf@@X?]DE=DTC?6WJ-Z.*~>
-endstream
-endobj
-198 0 obj
-84
-endobj
-199 0 obj
-<< /Length 200 0 R >>
-stream
-q
-4.4 0 0 -4.6 94.9 99.4 cm
-/R197 Do
-Q
-BT
-/R131 10 Tf
-1 0 0 1 104.76 94.92 Tm
-(mod) Tj
-ET
-q
-0.6 0 0 -10 127.8 102.4 cm
-/R181 Do
-Q
-q
-8.2 0 0 -7.2 129.7 101.8 cm
-/R165 Do
-Q
-q
-0.6 0 0 -10 139 102.4 cm
-/R181 Do
-Q
-BT
-/R124 10 Tf
-1 0 0 1 140.76 94.92 Tm
-(,) Tj
-1 0 0 1 147.84 94.92 Tm
-(where) Tj
-ET
-q
-4.4 0 0 -4.6 176.4 99.4 cm
-/R197 Do
-Q
-BT
-1 0 0 1 185.52 94.92 Tm
-(is) Tj
-1 0 0 1 196.2 94.92 Tm
-(the) Tj
-1 0 0 1 212.4 94.92 Tm
-(vie) Tj
-1 0 0 1 224.4 94.92 Tm
-(w) Tj
-1 0 0 1 235.559 94.92 Tm
-(number) Tj
-1 0 0 1 265.679 94.92 Tm
-(.) Tj
-1 0 0 1 276.239 94.92 Tm
-(V) Tj
-1 0 0 1 282.839 94.92 Tm
-(ie) Tj
-1 0 0 1 289.799 94.92 Tm
-(w) Tj
-1 0 0 1 72 82.92 Tm
-(changes) Tj
-1 0 0 1 106.8 82.92 Tm
-(are) Tj
-1 0 0 1 121.68 82.92 Tm
-(carried) Tj
-1 0 0 1 151.92 82.92 Tm
-(out) Tj
-1 0 0 1 167.4 82.92 Tm
-(when) Tj
-1 0 0 1 191.64 82.92 Tm
-(it) Tj
-1 0 0 1 199.92 82.92 Tm
-(appears) Tj
-1 0 0 1 232.92 82.92 Tm
-(that) Tj
-1 0 0 1 250.559 82.92 Tm
-(the) Tj
-1 0 0 1 265.439 82.92 Tm
-(primary) Tj
-1 0 0 1 72 71.04 Tm
-(has) Tj
-1 0 0 1 87.24 71.04 Tm
-(f) Tj
-1 0 0 1 90.48 71.04 Tm
-(ailed.) Tj
-1 0 0 1 115.8 71.04 Tm
-(V) Tj
-1 0 0 1 122.4 71.04 Tm
-(ie) Tj
-1 0 0 1 129.36 71.04 Tm
-(wstamped) Tj
-1 0 0 1 171.72 71.04 Tm
-(Replication) Tj
-1 0 0 1 219.72 71.04 Tm
-([26) Tj
-1 0 0 1 233.04 71.04 Tm
-(]) Tj
-1 0 0 1 238.32 71.04 Tm
-(and) Tj
-1 0 0 1 254.759 71.04 Tm
-(P) Tj
-1 0 0 1 260.159 71.04 Tm
-(axos) Tj
-1 0 0 1 280.439 71.04 Tm
-([18) Tj
-1 0 0 1 293.639 71.04 Tm
-(]) Tj
-1 0 0 1 315 709.08 Tm
-(used) Tj
-1 0 0 1 336 709.08 Tm
-(a) Tj
-1 0 0 1 343.2 709.08 Tm
-(similar) Tj
-1 0 0 1 373.68 709.08 Tm
-(approach) Tj
-1 0 0 1 412.92 709.08 Tm
-(to) Tj
-1 0 0 1 423.36 709.08 Tm
-(tolerate) Tj
-1 0 0 1 456 709.08 Tm
-(benign) Tj
-1 0 0 1 485.879 709.08 Tm
-(f) Tj
-1 0 0 1 489.119 709.08 Tm
-(aults) Tj
-1 0 0 1 510.719 709.08 Tm
-(\(as) Tj
-1 0 0 1 524.999 709.08 Tm
-(dis-) Tj
-1 0 0 1 315 697.08 Tm
-(cussed) Tj
-1 0 0 1 344.04 697.08 Tm
-(in) Tj
-1 0 0 1 354.24 697.08 Tm
-(Section) Tj
-1 0 0 1 386.64 697.08 Tm
-(8.\)) Tj
-1 0 0 1 324.96 685.2 Tm
-(The) Tj
-1 0 0 1 342.96 685.2 Tm
-(algorithm) Tj
-1 0 0 1 384.24 685.2 Tm
-(w) Tj
-1 0 0 1 391.32 685.2 Tm
-(orks) Tj
-1 0 0 1 410.88 685.2 Tm
-(roughly) Tj
-1 0 0 1 444.36 685.2 Tm
-(as) Tj
-1 0 0 1 455.16 685.2 Tm
-(follo) Tj
-1 0 0 1 473.879 685.2 Tm
-(ws:) Tj
-1 0 0 1 317.52 673.92 Tm
-(1.) Tj
-1 0 0 1 330 673.92 Tm
-(A) Tj
-1 0 0 1 339.48 673.92 Tm
-(client) Tj
-1 0 0 1 363.96 673.92 Tm
-(sends) Tj
-1 0 0 1 388.44 673.92 Tm
-(a) Tj
-1 0 0 1 395.16 673.92 Tm
-(request) Tj
-1 0 0 1 426.24 673.92 Tm
-(to) Tj
-1 0 0 1 436.32 673.92 Tm
-(in) Tj
-1 0 0 1 443.759 673.92 Tm
-(v) Tj
-1 0 0 1 448.559 673.92 Tm
-(ok) Tj
-1 0 0 1 458.519 673.92 Tm
-(e) Tj
-1 0 0 1 465.119 673.92 Tm
-(a) Tj
-1 0 0 1 471.839 673.92 Tm
-(service) Tj
-1 0 0 1 502.319 673.92 Tm
-(operation) Tj
-1 0 0 1 330 662.04 Tm
-(to) Tj
-1 0 0 1 340.2 662.04 Tm
-(the) Tj
-1 0 0 1 354.84 662.04 Tm
-(primary) Tj
-1 0 0 1 317.52 648.48 Tm
-(2.) Tj
-1 0 0 1 330 648.48 Tm
-(The) Tj
-1 0 0 1 347.88 648.48 Tm
-(primary) Tj
-1 0 0 1 381.96 648.48 Tm
-(multicasts) Tj
-1 0 0 1 424.8 648.48 Tm
-(the) Tj
-1 0 0 1 439.56 648.48 Tm
-(request) Tj
-1 0 0 1 470.759 648.48 Tm
-(to) Tj
-1 0 0 1 481.079 648.48 Tm
-(the) Tj
-1 0 0 1 495.719 648.48 Tm
-(backups) Tj
-1 0 0 1 317.52 635.04 Tm
-(3.) Tj
-1 0 0 1 330 635.04 Tm
-(Replicas) Tj
-1 0 0 1 367.32 635.04 Tm
-(e) Tj
-1 0 0 1 371.64 635.04 Tm
-(x) Tj
-1 0 0 1 376.56 635.04 Tm
-(ecute) Tj
-1 0 0 1 400.44 635.04 Tm
-(the) Tj
-1 0 0 1 415.68 635.04 Tm
-(request) Tj
-1 0 0 1 447.359 635.04 Tm
-(and) Tj
-1 0 0 1 464.879 635.04 Tm
-(send) Tj
-1 0 0 1 486.119 635.04 Tm
-(a) Tj
-1 0 0 1 493.559 635.04 Tm
-(reply) Tj
-1 0 0 1 517.079 635.04 Tm
-(to) Tj
-1 0 0 1 527.879 635.04 Tm
-(the) Tj
-1 0 0 1 330 623.04 Tm
-(client) Tj
-1 0 0 1 317.52 609.6 Tm
-(4.) Tj
-1 0 0 1 330 609.6 Tm
-(The) Tj
-1 0 0 1 350.28 609.6 Tm
-(client) Tj
-1 0 0 1 377.28 609.6 Tm
-(w) Tj
-1 0 0 1 384.36 609.6 Tm
-(aits) Tj
-1 0 0 1 403.08 609.6 Tm
-(for) Tj
-ET
-q
-5 0 0 -9.2 420 616.7 cm
-/R142 Do
-Q
-q
-6.6 0 0 -6.5 429.6 615.4 cm
-/R146 Do
-Q
-BT
-1 0 0 1 440.4 609.6 Tm
-(1) Tj
-1 0 0 1 450.24 609.6 Tm
-(replies) Tj
-1 0 0 1 481.679 609.6 Tm
-(from) Tj
-1 0 0 1 505.919 609.6 Tm
-(dif) Tj
-1 0 0 1 516.839 609.6 Tm
-(ferent) Tj
-1 0 0 1 330 597.6 Tm
-(replicas) Tj
-1 0 0 1 365.28 597.6 Tm
-(with) Tj
-1 0 0 1 387.36 597.6 Tm
-(the) Tj
-1 0 0 1 403.92 597.6 Tm
-(same) Tj
-1 0 0 1 428.76 597.6 Tm
-(result;) Tj
-1 0 0 1 458.88 597.6 Tm
-(this) Tj
-1 0 0 1 477.719 597.6 Tm
-(is) Tj
-1 0 0 1 488.639 597.6 Tm
-(the) Tj
-1 0 0 1 505.199 597.6 Tm
-(result) Tj
-1 0 0 1 531.719 597.6 Tm
-(of) Tj
-1 0 0 1 330 585.72 Tm
-(the) Tj
-1 0 0 1 344.64 585.72 Tm
-(operation.) Tj
-1 0 0 1 324.96 571.44 Tm
-(Lik) Tj
-1 0 0 1 338.76 571.44 Tm
-(e) Tj
-1 0 0 1 348.24 571.44 Tm
-(all) Tj
-1 0 0 1 363.24 571.44 Tm
-(state) Tj
-1 0 0 1 386.64 571.44 Tm
-(machine) Tj
-1 0 0 1 425.52 571.44 Tm
-(replication) Tj
-1 0 0 1 473.159 571.44 Tm
-(techniques) Tj
-1 0 0 1 520.919 571.44 Tm
-([34) Tj
-1 0 0 1 534.239 571.44 Tm
-(],) Tj
-1 0 0 1 315 559.56 Tm
-(we) Tj
-1 0 0 1 331.44 559.56 Tm
-(impose) Tj
-1 0 0 1 365.16 559.56 Tm
-(tw) Tj
-1 0 0 1 375 559.56 Tm
-(o) Tj
-1 0 0 1 384.84 559.56 Tm
-(requirements) Tj
-1 0 0 1 441.72 559.56 Tm
-(on) Tj
-1 0 0 1 456.6 559.56 Tm
-(replicas:) Tj
-1 0 0 1 498.719 559.56 Tm
-(the) Tj
-1 0 0 1 510.839 559.56 Tm
-(y) Tj
-1 0 0 1 520.679 559.56 Tm
-(must) Tj
-1 0 0 1 315 547.56 Tm
-(be) Tj
-/R131 10 Tf
-1 0 0 1 328.32 547.56 Tm
-(deterministic) Tj
-/R124 10 Tf
-1 0 0 1 384.36 547.56 Tm
-(\(i.e.,) Tj
-1 0 0 1 406.56 547.56 Tm
-(the) Tj
-1 0 0 1 422.76 547.56 Tm
-(e) Tj
-1 0 0 1 427.08 547.56 Tm
-(x) Tj
-1 0 0 1 432 547.56 Tm
-(ecution) Tj
-1 0 0 1 465.119 547.56 Tm
-(of) Tj
-1 0 0 1 477.359 547.56 Tm
-(an) Tj
-1 0 0 1 490.679 547.56 Tm
-(operation) Tj
-1 0 0 1 532.199 547.56 Tm
-(in) Tj
-1 0 0 1 315 535.68 Tm
-(a) Tj
-1 0 0 1 323.64 535.68 Tm
-(gi) Tj
-1 0 0 1 331.2 535.68 Tm
-(v) Tj
-1 0 0 1 336.12 535.68 Tm
-(en) Tj
-1 0 0 1 349.56 535.68 Tm
-(state) Tj
-1 0 0 1 372.12 535.68 Tm
-(and) Tj
-1 0 0 1 390.72 535.68 Tm
-(with) Tj
-1 0 0 1 412.68 535.68 Tm
-(a) Tj
-1 0 0 1 421.32 535.68 Tm
-(gi) Tj
-1 0 0 1 428.879 535.68 Tm
-(v) Tj
-1 0 0 1 433.8 535.68 Tm
-(en) Tj
-1 0 0 1 447.239 535.68 Tm
-(set) Tj
-1 0 0 1 462.599 535.68 Tm
-(of) Tj
-1 0 0 1 475.079 535.68 Tm
-(ar) Tj
-1 0 0 1 482.759 535.68 Tm
-(guments) Tj
-1 0 0 1 520.679 535.68 Tm
-(must) Tj
-1 0 0 1 315 523.68 Tm
-(al) Tj
-1 0 0 1 322.08 523.68 Tm
-(w) Tj
-1 0 0 1 329.16 523.68 Tm
-(ays) Tj
-1 0 0 1 344.4 523.68 Tm
-(produce) Tj
-1 0 0 1 378.48 523.68 Tm
-(the) Tj
-1 0 0 1 392.52 523.68 Tm
-(same) Tj
-1 0 0 1 414.96 523.68 Tm
-(result\)) Tj
-1 0 0 1 442.44 523.68 Tm
-(and) Tj
-1 0 0 1 458.759 523.68 Tm
-(the) Tj
-1 0 0 1 470.879 523.68 Tm
-(y) Tj
-1 0 0 1 477.719 523.68 Tm
-(must) Tj
-1 0 0 1 499.079 523.68 Tm
-(start) Tj
-1 0 0 1 518.159 523.68 Tm
-(in) Tj
-1 0 0 1 527.879 523.68 Tm
-(the) Tj
-1 0 0 1 315 511.8 Tm
-(same) Tj
-1 0 0 1 338.04 511.8 Tm
-(state.) Tj
-1 0 0 1 362.52 511.8 Tm
-(Gi) Tj
-1 0 0 1 372.24 511.8 Tm
-(v) Tj
-1 0 0 1 377.16 511.8 Tm
-(en) Tj
-1 0 0 1 389.04 511.8 Tm
-(these) Tj
-1 0 0 1 412.08 511.8 Tm
-(tw) Tj
-1 0 0 1 421.92 511.8 Tm
-(o) Tj
-1 0 0 1 429.48 511.8 Tm
-(requirements,) Tj
-1 0 0 1 486.479 511.8 Tm
-(the) Tj
-1 0 0 1 501.239 511.8 Tm
-(algorithm) Tj
-1 0 0 1 315 499.8 Tm
-(ensures) Tj
-1 0 0 1 347.4 499.8 Tm
-(the) Tj
-1 0 0 1 362.16 499.8 Tm
-(safety) Tj
-1 0 0 1 388.44 499.8 Tm
-(property) Tj
-1 0 0 1 424.68 499.8 Tm
-(by) Tj
-1 0 0 1 437.279 499.8 Tm
-(guaranteeing) Tj
-1 0 0 1 491.159 499.8 Tm
-(that) Tj
-/R131 10 Tf
-1 0 0 1 508.679 499.8 Tm
-(all) Tj
-1 0 0 1 521.759 499.8 Tm
-(non-) Tj
-1 0 0 1 315 487.92 Tm
-(faulty) Tj
-1 0 0 1 340.08 487.92 Tm
-(r) Tj
-1 0 0 1 343.56 487.92 Tm
-(eplicas) Tj
-1 0 0 1 374.16 487.92 Tm
-(a) Tj
-1 0 0 1 379.08 487.92 Tm
-(gr) Tj
-1 0 0 1 387.6 487.92 Tm
-(ee) Tj
-1 0 0 1 398.76 487.92 Tm
-(on) Tj
-1 0 0 1 411.12 487.92 Tm
-(a) Tj
-1 0 0 1 418.56 487.92 Tm
-(total) Tj
-1 0 0 1 439.199 487.92 Tm
-(or) Tj
-1 0 0 1 447.719 487.92 Tm
-(der) Tj
-1 0 0 1 463.319 487.92 Tm
-(for) Tj
-1 0 0 1 477.359 487.92 Tm
-(the) Tj
-1 0 0 1 491.879 487.92 Tm
-(e) Tj
-1 0 0 1 496.079 487.92 Tm
-(xecution) Tj
-1 0 0 1 532.199 487.92 Tm
-(of) Tj
-1 0 0 1 315 475.92 Tm
-(r) Tj
-1 0 0 1 318.48 475.92 Tm
-(equests) Tj
-1 0 0 1 350.28 475.92 Tm
-(despite) Tj
-1 0 0 1 381 475.92 Tm
-(failur) Tj
-1 0 0 1 402.84 475.92 Tm
-(es) Tj
-/R124 10 Tf
-1 0 0 1 411.12 475.92 Tm
-(.) Tj
-1 0 0 1 324.96 464.04 Tm
-(The) Tj
-1 0 0 1 344.28 464.04 Tm
-(remainder) Tj
-1 0 0 1 388.56 464.04 Tm
-(of) Tj
-1 0 0 1 400.68 464.04 Tm
-(this) Tj
-1 0 0 1 418.92 464.04 Tm
-(section) Tj
-1 0 0 1 450.96 464.04 Tm
-(describes) Tj
-1 0 0 1 491.879 464.04 Tm
-(a) Tj
-1 0 0 1 500.159 464.04 Tm
-(simpli\256ed) Tj
-1 0 0 1 315 452.04 Tm
-(v) Tj
-1 0 0 1 319.92 452.04 Tm
-(ersion) Tj
-1 0 0 1 348.12 452.04 Tm
-(of) Tj
-1 0 0 1 360.48 452.04 Tm
-(the) Tj
-1 0 0 1 376.68 452.04 Tm
-(algorithm.) Tj
-1 0 0 1 426 452.04 Tm
-(W) Tj
-1 0 0 1 434.52 452.04 Tm
-(e) Tj
-1 0 0 1 443.04 452.04 Tm
-(omit) Tj
-1 0 0 1 465.24 452.04 Tm
-(discussion) Tj
-1 0 0 1 510.839 452.04 Tm
-(of) Tj
-1 0 0 1 523.079 452.04 Tm
-(ho) Tj
-1 0 0 1 532.919 452.04 Tm
-(w) Tj
-1 0 0 1 315 440.16 Tm
-(nodes) Tj
-1 0 0 1 342.84 440.16 Tm
-(reco) Tj
-1 0 0 1 360 440.16 Tm
-(v) Tj
-1 0 0 1 364.92 440.16 Tm
-(er) Tj
-1 0 0 1 376.92 440.16 Tm
-(from) Tj
-1 0 0 1 400.8 440.16 Tm
-(f) Tj
-1 0 0 1 404.04 440.16 Tm
-(aults) Tj
-1 0 0 1 427.44 440.16 Tm
-(due) Tj
-1 0 0 1 446.28 440.16 Tm
-(to) Tj
-1 0 0 1 458.64 440.16 Tm
-(lack) Tj
-1 0 0 1 479.759 440.16 Tm
-(of) Tj
-1 0 0 1 492.599 440.16 Tm
-(space.) Tj
-1 0 0 1 526.919 440.16 Tm
-(W) Tj
-1 0 0 1 535.439 440.16 Tm
-(e) Tj
-1 0 0 1 315 428.16 Tm
-(also) Tj
-1 0 0 1 336.36 428.16 Tm
-(omit) Tj
-1 0 0 1 359.88 428.16 Tm
-(details) Tj
-1 0 0 1 391.08 428.16 Tm
-(related) Tj
-1 0 0 1 423.48 428.16 Tm
-(to) Tj
-1 0 0 1 436.56 428.16 Tm
-(message) Tj
-1 0 0 1 475.559 428.16 Tm
-(retransmissions.) Tj
-1 0 0 1 315 416.28 Tm
-(Furthermore,) Tj
-1 0 0 1 370.8 416.28 Tm
-(we) Tj
-1 0 0 1 385.68 416.28 Tm
-(assume) Tj
-1 0 0 1 418.32 416.28 Tm
-(that) Tj
-1 0 0 1 436.56 416.28 Tm
-(message) Tj
-1 0 0 1 473.64 416.28 Tm
-(authentication) Tj
-1 0 0 1 533.399 416.28 Tm
-(is) Tj
-1 0 0 1 315 404.28 Tm
-(achie) Tj
-1 0 0 1 335.88 404.28 Tm
-(v) Tj
-1 0 0 1 340.8 404.28 Tm
-(ed) Tj
-1 0 0 1 354.24 404.28 Tm
-(using) Tj
-1 0 0 1 380.04 404.28 Tm
-(digital) Tj
-1 0 0 1 409.68 404.28 Tm
-(signatures) Tj
-1 0 0 1 454.32 404.28 Tm
-(rather) Tj
-1 0 0 1 481.799 404.28 Tm
-(than) Tj
-1 0 0 1 503.159 404.28 Tm
-(the) Tj
-1 0 0 1 519.479 404.28 Tm
-(more) Tj
-1 0 0 1 315 392.4 Tm
-(ef) Tj
-1 0 0 1 322.56 392.4 Tm
-(\256cient) Tj
-1 0 0 1 349.8 392.4 Tm
-(scheme) Tj
-1 0 0 1 382.08 392.4 Tm
-(based) Tj
-1 0 0 1 407.16 392.4 Tm
-(on) Tj
-1 0 0 1 419.52 392.4 Tm
-(message) Tj
-1 0 0 1 455.64 392.4 Tm
-(authentication) Tj
-1 0 0 1 514.559 392.4 Tm
-(codes;) Tj
-1 0 0 1 315 380.4 Tm
-(Section) Tj
-1 0 0 1 351 380.4 Tm
-(5) Tj
-1 0 0 1 362.04 380.4 Tm
-(discusses) Tj
-1 0 0 1 405.24 380.4 Tm
-(this) Tj
-1 0 0 1 425.76 380.4 Tm
-(issue) Tj
-1 0 0 1 451.68 380.4 Tm
-(further) Tj
-1 0 0 1 478.439 380.4 Tm
-(.) Tj
-1 0 0 1 495.119 380.4 Tm
-(A) Tj
-1 0 0 1 508.439 380.4 Tm
-(detailed) Tj
-1 0 0 1 315 368.4 Tm
-(formalization) Tj
-1 0 0 1 372 368.4 Tm
-(of) Tj
-1 0 0 1 383.52 368.4 Tm
-(the) Tj
-1 0 0 1 399 368.4 Tm
-(algorithm) Tj
-1 0 0 1 441 368.4 Tm
-(using) Tj
-1 0 0 1 465.96 368.4 Tm
-(the) Tj
-1 0 0 1 481.319 368.4 Tm
-(I/O) Tj
-1 0 0 1 497.879 368.4 Tm
-(automaton) Tj
-1 0 0 1 315 356.52 Tm
-(model) Tj
-1 0 0 1 342.36 356.52 Tm
-([21) Tj
-1 0 0 1 355.68 356.52 Tm
-(]) Tj
-1 0 0 1 361.44 356.52 Tm
-(is) Tj
-1 0 0 1 370.68 356.52 Tm
-(presented) Tj
-1 0 0 1 411.24 356.52 Tm
-(in) Tj
-1 0 0 1 421.56 356.52 Tm
-([4) Tj
-1 0 0 1 429.84 356.52 Tm
-(].) Tj
-/R162 10 Tf
-1 0 0 1 315 336 Tm
-(4.1) Tj
-1 0 0 1 337.44 336 Tm
-(The) Tj
-1 0 0 1 356.52 336 Tm
-(Client) Tj
-/R124 10 Tf
-1 0 0 1 315 321.84 Tm
-(A) Tj
-1 0 0 1 328.2 321.84 Tm
-(client) Tj
-ET
-endstream
-endobj
-200 0 obj
-11470
-endobj
-201 0 obj
-<< /Type /XObject /Name /R201 /Subtype /Image /Length 202 0 R
-/ImageMask true /Width 39 /Height 46 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 39 /BlackIs1 true >>]
->>
-stream
-,R&cB5lcJ_F@&^\*D2E$qfTOoCb+sSa7''-+,BlFrn/.V#X.#4LY-rlHOLpI:jTBC_X\*\!'gY~>
-endstream
-endobj
-202 0 obj
-77
-endobj
-203 0 obj
-<< /Length 204 0 R >>
-stream
-q
-3.9 0 0 -4.6 356.6 326.3 cm
-/R201 Do
-Q
-BT
-1 0 0 1 366.6 321.84 Tm
-(requests) Tj
-1 0 0 1 405.24 321.84 Tm
-(the) Tj
-1 0 0 1 423.36 321.84 Tm
-(e) Tj
-1 0 0 1 427.68 321.84 Tm
-(x) Tj
-1 0 0 1 432.6 321.84 Tm
-(ecution) Tj
-1 0 0 1 467.759 321.84 Tm
-(of) Tj
-1 0 0 1 482.039 321.84 Tm
-(state) Tj
-1 0 0 1 506.279 321.84 Tm
-(machine) Tj
-1 0 0 1 315 309.84 Tm
-(operation) Tj
-ET
-endstream
-endobj
-204 0 obj
-367
-endobj
-205 0 obj
-<< /Type /XObject /Name /R205 /Subtype /Image /Length 206 0 R
-/ImageMask true /Width 44 /Height 46 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 44 /BlackIs1 true >>]
->>
-stream
-,RFT>
-EI`ineN+j94Q'iSTFbqu-P3hnIY1ojRRBhdNX>"JG7c
-endstream
-endobj
-206 0 obj
-87
-endobj
-207 0 obj
-<< /Length 208 0 R >>
-stream
-q
-4.4 0 0 -4.6 357.1 314.3 cm
-/R205 Do
-Q
-BT
-1 0 0 1 365.76 309.84 Tm
-(by) Tj
-1 0 0 1 379.92 309.84 Tm
-(sending) Tj
-1 0 0 1 415.08 309.84 Tm
-(a) Tj
-ET
-endstream
-endobj
-208 0 obj
-150
-endobj
-209 0 obj
-<< /Type /XObject /Name /R209 /Subtype /Image /Length 210 0 R
-/ImageMask true /Width 24 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 24 /BlackIs1 true >>]
->>
-stream
-+t-07X8N5#0B"SKInTVGqHrM(f3_PN_YUJ4L&^prs)7cFqg[B")ufa0GPC"Nr'(,Kmt^kVHo1m8!<~>
-endstream
-endobj
-210 0 obj
-80
-endobj
-211 0 obj
-<< /Length 212 0 R >>
-stream
-q
-2.4 0 0 -9.9 424.6 317.3 cm
-/R209 Do
-Q
-BT
-/R124 8 Tf
-1 0 0 1 427.56 309.84 Tm
-(REQ) Tj
-1 0 0 1 443.4 309.84 Tm
-(UEST) Tj
-ET
-q
-1.3 0 0 -3 464.1 310.9 cm
-/R173 Do
-Q
-q
-4.4 0 0 -4.6 468.1 314.3 cm
-/R205 Do
-Q
-q
-1.3 0 0 -3 473.4 310.9 cm
-/R173 Do
-Q
-q
-3.1 0 0 -6.4 477.2 316.1 cm
-/R127 Do
-Q
-q
-1.3 0 0 -3 481.4 310.9 cm
-/R173 Do
-Q
-q
-3.9 0 0 -4.6 485.3 314.3 cm
-/R201 Do
-Q
-endstream
-endobj
-212 0 obj
-366
-endobj
-213 0 obj
-<< /Type /XObject /Name /R213 /Subtype /Image /Length 214 0 R
-/ImageMask true /Width 24 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 24 /BlackIs1 true >>]
->>
-stream
-02pd&htA/cs0qnbrP.\`mJhV5_u&o]hqrq@J+[15ImJQWpe1HjlFsc8R~>
-endstream
-endobj
-214 0 obj
-78
-endobj
-215 0 obj
-<< /Length 216 0 R >>
-stream
-q
-2.4 0 0 -9.9 489.8 317.3 cm
-/R213 Do
-Q
-endstream
-endobj
-216 0 obj
-41
-endobj
-217 0 obj
-<< /Type /XObject /Name /R217 /Subtype /Image /Length 218 0 R
-/ImageMask true /Width 42 /Height 31 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 42 /BlackIs1 true >>]
->>
-stream
-1`R)4"qZ&4%Y>/aKS+]fJ#a+Sp>>oFIt)n@>7^\DYeoBbLCXeP2$%q%J-Z~>
-endstream
-endobj
-218 0 obj
-61
-endobj
-219 0 obj
-<< /Length 220 0 R >>
-stream
-q
-4.2 0 0 -3.1 493.4 311.4 cm
-/R217 Do
-Q
-endstream
-endobj
-220 0 obj
-41
-endobj
-221 0 obj
-<< /Type /XObject /Name /R221 /Subtype /Image /Length 222 0 R
-/ImageMask true /Width 24 /Height 22 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 24 /BlackIs1 true >>]
->>
-stream
-4q\,A"/8b:&%,:7s)7KqYh&c]_[`rh_Z^#O!<~>
-endstream
-endobj
-222 0 obj
-40
-endobj
-223 0 obj
-<< /Length 224 0 R >>
-stream
-q
-2.4 0 0 -2.2 498.2 309.6 cm
-/R221 Do
-Q
-BT
-/R124 10 Tf
-1 0 0 1 506.28 309.84 Tm
-(message) Tj
-1 0 0 1 315 297.96 Tm
-(to) Tj
-1 0 0 1 326.16 297.96 Tm
-(the) Tj
-1 0 0 1 341.76 297.96 Tm
-(primary) Tj
-1 0 0 1 372.96 297.96 Tm
-(.) Tj
-1 0 0 1 381.48 297.96 Tm
-(T) Tj
-1 0 0 1 387.24 297.96 Tm
-(imestamp) Tj
-ET
-q
-3.1 0 0 -6.4 429.6 304.3 cm
-/R127 Do
-Q
-BT
-1 0 0 1 436.32 297.96 Tm
-(is) Tj
-1 0 0 1 446.4 297.96 Tm
-(used) Tj
-1 0 0 1 468.119 297.96 Tm
-(to) Tj
-1 0 0 1 479.279 297.96 Tm
-(ensure) Tj
-/R131 10 Tf
-1 0 0 1 508.679 297.96 Tm
-(e) Tj
-1 0 0 1 512.879 297.96 Tm
-(xactly-) Tj
-1 0 0 1 315 285.96 Tm
-(once) Tj
-/R124 10 Tf
-1 0 0 1 339.36 285.96 Tm
-(semantics) Tj
-1 0 0 1 384.24 285.96 Tm
-(for) Tj
-1 0 0 1 401.52 285.96 Tm
-(the) Tj
-1 0 0 1 419.28 285.96 Tm
-(e) Tj
-1 0 0 1 423.6 285.96 Tm
-(x) Tj
-1 0 0 1 428.52 285.96 Tm
-(ecution) Tj
-1 0 0 1 463.2 285.96 Tm
-(of) Tj
-1 0 0 1 477.119 285.96 Tm
-(client) Tj
-1 0 0 1 504.839 285.96 Tm
-(requests.) Tj
-1 0 0 1 315 274.08 Tm
-(T) Tj
-1 0 0 1 320.76 274.08 Tm
-(imestamps) Tj
-1 0 0 1 365.88 274.08 Tm
-(for) Tj
-ET
-q
-3.9 0 0 -4.6 380.3 278.6 cm
-/R201 Do
-Q
-BT
-1 0 0 1 384.36 274.08 Tm
-(') Tj
-1 0 0 1 387.12 274.08 Tm
-(s) Tj
-1 0 0 1 393.48 274.08 Tm
-(requests) Tj
-1 0 0 1 428.64 274.08 Tm
-(are) Tj
-1 0 0 1 443.4 274.08 Tm
-(totally) Tj
-1 0 0 1 471.359 274.08 Tm
-(ordered) Tj
-1 0 0 1 504.239 274.08 Tm
-(such) Tj
-1 0 0 1 524.999 274.08 Tm
-(that) Tj
-1 0 0 1 315 262.08 Tm
-(later) Tj
-1 0 0 1 335.76 262.08 Tm
-(requests) Tj
-1 0 0 1 371.52 262.08 Tm
-(ha) Tj
-1 0 0 1 380.76 262.08 Tm
-(v) Tj
-1 0 0 1 385.68 262.08 Tm
-(e) Tj
-1 0 0 1 393.12 262.08 Tm
-(higher) Tj
-1 0 0 1 421.68 262.08 Tm
-(timestamps) Tj
-1 0 0 1 470.159 262.08 Tm
-(than) Tj
-1 0 0 1 490.439 262.08 Tm
-(earlier) Tj
-1 0 0 1 518.999 262.08 Tm
-(ones;) Tj
-1 0 0 1 315 250.2 Tm
-(for) Tj
-1 0 0 1 330.84 250.2 Tm
-(e) Tj
-1 0 0 1 335.16 250.2 Tm
-(xample,) Tj
-1 0 0 1 371.52 250.2 Tm
-(the) Tj
-1 0 0 1 387.84 250.2 Tm
-(timestamp) Tj
-1 0 0 1 433.56 250.2 Tm
-(could) Tj
-1 0 0 1 459.84 250.2 Tm
-(be) Tj
-1 0 0 1 473.52 250.2 Tm
-(the) Tj
-1 0 0 1 489.839 250.2 Tm
-(v) Tj
-1 0 0 1 494.639 250.2 Tm
-(alue) Tj
-1 0 0 1 515.399 250.2 Tm
-(of) Tj
-1 0 0 1 527.879 250.2 Tm
-(the) Tj
-1 0 0 1 315 238.2 Tm
-(client') Tj
-1 0 0 1 339.96 238.2 Tm
-(s) Tj
-1 0 0 1 346.32 238.2 Tm
-(local) Tj
-1 0 0 1 368.16 238.2 Tm
-(clock) Tj
-1 0 0 1 392.16 238.2 Tm
-(when) Tj
-1 0 0 1 416.28 238.2 Tm
-(the) Tj
-1 0 0 1 430.92 238.2 Tm
-(request) Tj
-1 0 0 1 462.239 238.2 Tm
-(is) Tj
-1 0 0 1 471.359 238.2 Tm
-(issued.) Tj
-1 0 0 1 324.96 226.32 Tm
-(Each) Tj
-1 0 0 1 346.8 226.32 Tm
-(message) Tj
-1 0 0 1 382.44 226.32 Tm
-(sent) Tj
-1 0 0 1 400.32 226.32 Tm
-(by) Tj
-1 0 0 1 412.2 226.32 Tm
-(the) Tj
-1 0 0 1 426.24 226.32 Tm
-(replicas) Tj
-1 0 0 1 459.119 226.32 Tm
-(to) Tj
-1 0 0 1 468.719 226.32 Tm
-(the) Tj
-1 0 0 1 482.759 226.32 Tm
-(client) Tj
-1 0 0 1 506.759 226.32 Tm
-(includes) Tj
-1 0 0 1 315 214.32 Tm
-(the) Tj
-1 0 0 1 329.88 214.32 Tm
-(current) Tj
-1 0 0 1 360.72 214.32 Tm
-(vie) Tj
-1 0 0 1 372.72 214.32 Tm
-(w) Tj
-1 0 0 1 382.56 214.32 Tm
-(number) Tj
-1 0 0 1 412.92 214.32 Tm
-(,) Tj
-1 0 0 1 417.84 214.32 Tm
-(allo) Tj
-1 0 0 1 432.6 214.32 Tm
-(wing) Tj
-1 0 0 1 455.16 214.32 Tm
-(the) Tj
-1 0 0 1 469.92 214.32 Tm
-(client) Tj
-1 0 0 1 494.759 214.32 Tm
-(to) Tj
-1 0 0 1 505.199 214.32 Tm
-(track) Tj
-1 0 0 1 527.879 214.32 Tm
-(the) Tj
-1 0 0 1 315 202.32 Tm
-(vie) Tj
-1 0 0 1 327 202.32 Tm
-(w) Tj
-1 0 0 1 338.76 202.32 Tm
-(and) Tj
-1 0 0 1 357.84 202.32 Tm
-(hence) Tj
-1 0 0 1 385.8 202.32 Tm
-(the) Tj
-1 0 0 1 402.72 202.32 Tm
-(current) Tj
-1 0 0 1 435.6 202.32 Tm
-(primary) Tj
-1 0 0 1 466.8 202.32 Tm
-(.) Tj
-1 0 0 1 479.16 202.32 Tm
-(A) Tj
-1 0 0 1 491.04 202.32 Tm
-(client) Tj
-1 0 0 1 517.919 202.32 Tm
-(sends) Tj
-1 0 0 1 315 190.44 Tm
-(a) Tj
-1 0 0 1 324.84 190.44 Tm
-(request) Tj
-1 0 0 1 358.92 190.44 Tm
-(to) Tj
-1 0 0 1 372 190.44 Tm
-(what) Tj
-1 0 0 1 396.84 190.44 Tm
-(it) Tj
-1 0 0 1 407.64 190.44 Tm
-(belie) Tj
-1 0 0 1 426.84 190.44 Tm
-(v) Tj
-1 0 0 1 431.76 190.44 Tm
-(es) Tj
-1 0 0 1 445.32 190.44 Tm
-(is) Tj
-1 0 0 1 457.319 190.44 Tm
-(the) Tj
-1 0 0 1 474.839 190.44 Tm
-(current) Tj
-1 0 0 1 508.439 190.44 Tm
-(primary) Tj
-1 0 0 1 315 178.44 Tm
-(using) Tj
-1 0 0 1 339.36 178.44 Tm
-(a) Tj
-1 0 0 1 346.56 178.44 Tm
-(point-to-point) Tj
-1 0 0 1 404.64 178.44 Tm
-(message.) Tj
-1 0 0 1 445.32 178.44 Tm
-(The) Tj
-1 0 0 1 463.68 178.44 Tm
-(primary) Tj
-1 0 0 1 497.879 178.44 Tm
-(atomically) Tj
-1 0 0 1 315 166.56 Tm
-(multicasts) Tj
-1 0 0 1 357 166.56 Tm
-(the) Tj
-1 0 0 1 370.8 166.56 Tm
-(request) Tj
-1 0 0 1 401.28 166.56 Tm
-(to) Tj
-1 0 0 1 410.64 166.56 Tm
-(all) Tj
-1 0 0 1 422.16 166.56 Tm
-(the) Tj
-1 0 0 1 435.96 166.56 Tm
-(backups) Tj
-1 0 0 1 470.399 166.56 Tm
-(using) Tj
-1 0 0 1 493.679 166.56 Tm
-(the) Tj
-1 0 0 1 507.479 166.56 Tm
-(pr) Tj
-1 0 0 1 515.759 166.56 Tm
-(otoc) Tj
-1 0 0 1 532.919 166.56 Tm
-(ol) Tj
-1 0 0 1 315 154.56 Tm
-(described) Tj
-1 0 0 1 355.68 154.56 Tm
-(in) Tj
-1 0 0 1 365.88 154.56 Tm
-(the) Tj
-1 0 0 1 380.52 154.56 Tm
-(ne) Tj
-1 0 0 1 389.88 154.56 Tm
-(xt) Tj
-1 0 0 1 400.08 154.56 Tm
-(section.) Tj
-1 0 0 1 324.96 142.68 Tm
-(A) Tj
-1 0 0 1 336.48 142.68 Tm
-(replica) Tj
-1 0 0 1 367.92 142.68 Tm
-(sends) Tj
-1 0 0 1 394.44 142.68 Tm
-(the) Tj
-1 0 0 1 410.88 142.68 Tm
-(reply) Tj
-1 0 0 1 435.72 142.68 Tm
-(to) Tj
-1 0 0 1 447.84 142.68 Tm
-(the) Tj
-1 0 0 1 464.399 142.68 Tm
-(request) Tj
-1 0 0 1 497.519 142.68 Tm
-(directly) Tj
-1 0 0 1 532.199 142.68 Tm
-(to) Tj
-1 0 0 1 315 130.68 Tm
-(the) Tj
-1 0 0 1 330.24 130.68 Tm
-(client.) Tj
-1 0 0 1 360.12 130.68 Tm
-(The) Tj
-1 0 0 1 378.6 130.68 Tm
-(reply) Tj
-1 0 0 1 402.12 130.68 Tm
-(has) Tj
-1 0 0 1 418.44 130.68 Tm
-(the) Tj
-1 0 0 1 433.68 130.68 Tm
-(form) Tj
-ET
-q
-2.4 0 0 -9.9 457 138.2 cm
-/R209 Do
-Q
-BT
-/R124 8 Tf
-1 0 0 1 459.959 130.68 Tm
-(REPL) Tj
-1 0 0 1 478.679 130.68 Tm
-(Y) Tj
-ET
-q
-1.3 0 0 -3 485.2 131.8 cm
-/R173 Do
-Q
-q
-4.4 0 0 -4.6 489.1 135.2 cm
-/R197 Do
-Q
-q
-1.3 0 0 -3 494.8 131.8 cm
-/R173 Do
-Q
-q
-3.1 0 0 -6.4 498.7 137 cm
-/R127 Do
-Q
-q
-1.3 0 0 -3 502.9 131.8 cm
-/R173 Do
-Q
-q
-3.9 0 0 -4.6 506.8 135.2 cm
-/R201 Do
-Q
-q
-1.3 0 0 -3 511.6 131.8 cm
-/R173 Do
-Q
-endstream
-endobj
-224 0 obj
-5932
-endobj
-225 0 obj
-<< /Type /XObject /Name /R225 /Subtype /Image /Length 226 0 R
-/ImageMask true /Width 26 /Height 69 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 26 /BlackIs1 true >>]
->>
-stream
--R^*Zl/YrmIf:DfhtVWo^UNqc%K6'1s*addX2"DHrSQB/+4u(tp(mUa[G\kks2oQE"5iR%(OubkJ,~>
-endstream
-endobj
-226 0 obj
-80
-endobj
-227 0 obj
-<< /Length 228 0 R >>
-stream
-q
-2.6 0 0 -6.9 515.5 137.5 cm
-/R225 Do
-Q
-q
-1.3 0 0 -3 519.6 131.8 cm
-/R173 Do
-Q
-endstream
-endobj
-228 0 obj
-80
-endobj
-229 0 obj
-<< /Type /XObject /Name /R229 /Subtype /Image /Length 230 0 R
-/ImageMask true /Width 39 /Height 46 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 39 /BlackIs1 true >>]
->>
-stream
-4Q-O[J+rF2n,E5LpjW83afBpkfg4TU#MZ`fmdT`'^@/Es*&)T7Ft&
-endstream
-endobj
-230 0 obj
-68
-endobj
-231 0 obj
-<< /Length 232 0 R >>
-stream
-q
-3.9 0 0 -4.6 523.4 135.2 cm
-/R229 Do
-Q
-q
-2.4 0 0 -9.9 528.3 138.2 cm
-/R213 Do
-Q
-q
-4.2 0 0 -3.1 531.9 132.2 cm
-/R217 Do
-Q
-endstream
-endobj
-232 0 obj
-123
-endobj
-233 0 obj
-<< /Type /XObject /Name /R233 /Subtype /Image /Length 234 0 R
-/ImageMask true /Width 17 /Height 35 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 17 /BlackIs1 true >>]
->>
-stream
-4B*=`S,;]mpj7Y*s1(">iS6Nohi?6cs!N02p(RKl"9~>
-endstream
-endobj
-234 0 obj
-45
-endobj
-235 0 obj
-<< /Length 236 0 R >>
-stream
-q
-1.7 0 0 -3.5 536.6 131.8 cm
-/R233 Do
-Q
-BT
-/R124 10 Tf
-1 0 0 1 315 118.8 Tm
-(where) Tj
-ET
-q
-4.4 0 0 -4.6 341.7 123.3 cm
-/R197 Do
-Q
-BT
-1 0 0 1 348.96 118.8 Tm
-(is) Tj
-1 0 0 1 357.84 118.8 Tm
-(the) Tj
-1 0 0 1 372.24 118.8 Tm
-(current) Tj
-1 0 0 1 402.72 118.8 Tm
-(vie) Tj
-1 0 0 1 414.72 118.8 Tm
-(w) Tj
-1 0 0 1 424.08 118.8 Tm
-(number) Tj
-1 0 0 1 454.44 118.8 Tm
-(,) Tj
-ET
-q
-3.1 0 0 -6.4 459.1 125.1 cm
-/R127 Do
-Q
-BT
-1 0 0 1 464.639 118.8 Tm
-(is) Tj
-1 0 0 1 473.519 118.8 Tm
-(the) Tj
-1 0 0 1 487.919 118.8 Tm
-(timestamp) Tj
-1 0 0 1 531.719 118.8 Tm
-(of) Tj
-1 0 0 1 315 106.8 Tm
-(the) Tj
-1 0 0 1 329.76 106.8 Tm
-(corresponding) Tj
-1 0 0 1 389.4 106.8 Tm
-(request,) Tj
-ET
-q
-2.6 0 0 -6.9 423.4 113.6 cm
-/R225 Do
-Q
-BT
-1 0 0 1 429.36 106.8 Tm
-(is) Tj
-1 0 0 1 438.6 106.8 Tm
-(the) Tj
-1 0 0 1 453.36 106.8 Tm
-(replica) Tj
-1 0 0 1 483.119 106.8 Tm
-(number) Tj
-1 0 0 1 513.479 106.8 Tm
-(,) Tj
-1 0 0 1 518.279 106.8 Tm
-(and) Tj
-ET
-q
-3.9 0 0 -4.6 535.4 111.3 cm
-/R229 Do
-Q
-BT
-1 0 0 1 315 94.92 Tm
-(is) Tj
-1 0 0 1 324.12 94.92 Tm
-(the) Tj
-1 0 0 1 338.76 94.92 Tm
-(result) Tj
-1 0 0 1 363.48 94.92 Tm
-(of) Tj
-1 0 0 1 374.16 94.92 Tm
-(e) Tj
-1 0 0 1 378.48 94.92 Tm
-(x) Tj
-1 0 0 1 383.4 94.92 Tm
-(ecuting) Tj
-1 0 0 1 415.2 94.92 Tm
-(the) Tj
-1 0 0 1 429.84 94.92 Tm
-(requested) Tj
-1 0 0 1 470.519 94.92 Tm
-(operation.) Tj
-1 0 0 1 324.96 82.92 Tm
-(The) Tj
-1 0 0 1 342.72 82.92 Tm
-(client) Tj
-1 0 0 1 367.2 82.92 Tm
-(w) Tj
-1 0 0 1 374.28 82.92 Tm
-(aits) Tj
-1 0 0 1 390.36 82.92 Tm
-(for) Tj
-ET
-q
-5 0 0 -9.2 404.7 90 cm
-/R142 Do
-Q
-q
-6.6 0 0 -6.5 412.5 88.7 cm
-/R146 Do
-Q
-BT
-1 0 0 1 421.56 82.92 Tm
-(1) Tj
-1 0 0 1 428.76 82.92 Tm
-(replies) Tj
-1 0 0 1 457.679 82.92 Tm
-(with) Tj
-1 0 0 1 477.599 82.92 Tm
-(v) Tj
-1 0 0 1 482.399 82.92 Tm
-(alid) Tj
-1 0 0 1 499.559 82.92 Tm
-(signatures) Tj
-1 0 0 1 315 71.04 Tm
-(from) Tj
-1 0 0 1 336.6 71.04 Tm
-(dif) Tj
-1 0 0 1 347.52 71.04 Tm
-(ferent) Tj
-1 0 0 1 372.96 71.04 Tm
-(replicas,) Tj
-1 0 0 1 408.72 71.04 Tm
-(and) Tj
-1 0 0 1 425.4 71.04 Tm
-(with) Tj
-1 0 0 1 445.32 71.04 Tm
-(the) Tj
-1 0 0 1 459.719 71.04 Tm
-(same) Tj
-ET
-q
-3.1 0 0 -6.4 482.7 77.3 cm
-/R127 Do
-Q
-BT
-1 0 0 1 488.399 71.04 Tm
-(and) Tj
-ET
-q
-3.9 0 0 -4.6 505.2 75.5 cm
-/R229 Do
-Q
-BT
-1 0 0 1 509.639 71.04 Tm
-(,) Tj
-1 0 0 1 514.559 71.04 Tm
-(before) Tj
-1 0 0 1 303.48 35.16 Tm
-(3) Tj
-ET
-Q
-endstream
-endobj
-236 0 obj
-2265
-endobj
-237 0 obj
-<<
-/Type /Page
-/MediaBox [0 0 612 792]
-/Parent 2 0 R
-/Resources << /ProcSet [/PDF /ImageB /Text]
-/Font <<
-/R162 162 0 R
-/R131 131 0 R
-/R124 124 0 R
->>
-/XObject <<
-/R229 229 0 R
-/R127 127 0 R
-/R146 146 0 R
-/R142 142 0 R
-/R225 225 0 R
-/R197 197 0 R
-/R233 233 0 R
-/R217 217 0 R
-/R213 213 0 R
-/R173 173 0 R
-/R201 201 0 R
-/R209 209 0 R
-/R221 221 0 R
-/R205 205 0 R
-/R181 181 0 R
-/R165 165 0 R
-/R189 189 0 R
-/R193 193 0 R
-/R185 185 0 R
-/R154 154 0 R
-/R177 177 0 R
-/R169 169 0 R
-/R158 158 0 R
-/R150 150 0 R
-/R138 138 0 R
-/R134 134 0 R
->>
->>
-/Contents [
-125 0 R
-129 0 R
-132 0 R
-136 0 R
-140 0 R
-144 0 R
-148 0 R
-152 0 R
-156 0 R
-160 0 R
-163 0 R
-167 0 R
-171 0 R
-175 0 R
-179 0 R
-183 0 R
-187 0 R
-191 0 R
-195 0 R
-199 0 R
-203 0 R
-207 0 R
-211 0 R
-215 0 R
-219 0 R
-223 0 R
-227 0 R
-231 0 R
-235 0 R
-]
->>
-endobj
-238 0 obj
-<< /Type /Font /Name /R238 /Subtype /Type1 /BaseFont /Times-Roman >>
-endobj
-239 0 obj
-<< /Length 240 0 R >>
-stream
-q
-BT
-/R238 10 Tf
-1 0 0 1 72 709.08 Tm
-(accepting) Tj
-1 0 0 1 111.96 709.08 Tm
-(the) Tj
-1 0 0 1 126 709.08 Tm
-(result) Tj
-ET
-Q
-q
-W
-0 0 612 792 re
-n
-endstream
-endobj
-240 0 obj
-147
-endobj
-241 0 obj
-<< /Type /XObject /Name /R241 /Subtype /Image /Length 242 0 R
-/ImageMask true /Width 39 /Height 46 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 39 /BlackIs1 true >>]
->>
-stream
-4Q-O[J+rF2n,E5LpjW83afBpkfg4TU#MZ`fmdT`'^@/Es*&)T7Ft&
-endstream
-endobj
-242 0 obj
-68
-endobj
-243 0 obj
-<< /Length 244 0 R >>
-stream
-q
-3.9 0 0 -4.6 150.1 713.6 cm
-/R241 Do
-Q
-BT
-/R238 10 Tf
-1 0 0 1 154.56 709.08 Tm
-(.) Tj
-1 0 0 1 160.56 709.08 Tm
-(This) Tj
-1 0 0 1 180 709.08 Tm
-(ensures) Tj
-1 0 0 1 211.679 709.08 Tm
-(that) Tj
-1 0 0 1 228.479 709.08 Tm
-(the) Tj
-1 0 0 1 242.399 709.08 Tm
-(result) Tj
-1 0 0 1 266.399 709.08 Tm
-(is) Tj
-1 0 0 1 274.799 709.08 Tm
-(v) Tj
-1 0 0 1 279.599 709.08 Tm
-(alid,) Tj
-1 0 0 1 72 697.08 Tm
-(since) Tj
-1 0 0 1 94.9199 697.08 Tm
-(at) Tj
-1 0 0 1 104.64 697.08 Tm
-(most) Tj
-ET
-endstream
-endobj
-244 0 obj
-475
-endobj
-245 0 obj
-<< /Type /XObject /Name /R245 /Subtype /Image /Length 246 0 R
-/ImageMask true /Width 50 /Height 92 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 50 /BlackIs1 true >>]
->>
-stream
-5$eL7-b:K3p0<%?
-h1u#R]2'Mug].5is7$!eqtL-hqu?EZs5/V3iQXZVs7/ihqu?EZs4QRbJe-ans*o2/4DdB_@6aqq5Q~>
-endstream
-endobj
-246 0 obj
-96
-endobj
-247 0 obj
-<< /Length 248 0 R >>
-stream
-q
-5 0 0 -9.2 126.9 704.2 cm
-/R245 Do
-Q
-BT
-1 0 0 1 135 697.08 Tm
-(replicas) Tj
-1 0 0 1 168.48 697.08 Tm
-(can) Tj
-1 0 0 1 184.8 697.08 Tm
-(be) Tj
-1 0 0 1 196.68 697.08 Tm
-(f) Tj
-1 0 0 1 199.92 697.08 Tm
-(aulty) Tj
-1 0 0 1 219.359 697.08 Tm
-(.) Tj
-1 0 0 1 81.96 684.72 Tm
-(If) Tj
-1 0 0 1 92.1599 684.72 Tm
-(the) Tj
-1 0 0 1 107.88 684.72 Tm
-(client) Tj
-1 0 0 1 133.44 684.72 Tm
-(does) Tj
-1 0 0 1 155.28 684.72 Tm
-(not) Tj
-1 0 0 1 171.48 684.72 Tm
-(recei) Tj
-1 0 0 1 190.68 684.72 Tm
-(v) Tj
-1 0 0 1 195.6 684.72 Tm
-(e) Tj
-1 0 0 1 203.4 684.72 Tm
-(replies) Tj
-1 0 0 1 233.519 684.72 Tm
-(soon) Tj
-1 0 0 1 255.839 684.72 Tm
-(enough,) Tj
-1 0 0 1 291.479 684.72 Tm
-(it) Tj
-1 0 0 1 72 672.72 Tm
-(broadcasts) Tj
-1 0 0 1 117.12 672.72 Tm
-(the) Tj
-1 0 0 1 132.36 672.72 Tm
-(request) Tj
-1 0 0 1 164.28 672.72 Tm
-(to) Tj
-1 0 0 1 175.08 672.72 Tm
-(all) Tj
-1 0 0 1 188.039 672.72 Tm
-(replicas.) Tj
-1 0 0 1 226.919 672.72 Tm
-(If) Tj
-1 0 0 1 236.639 672.72 Tm
-(the) Tj
-1 0 0 1 251.879 672.72 Tm
-(request) Tj
-1 0 0 1 283.679 672.72 Tm
-(has) Tj
-1 0 0 1 72 660.84 Tm
-(already) Tj
-1 0 0 1 104.64 660.84 Tm
-(been) Tj
-1 0 0 1 126.72 660.84 Tm
-(processed,) Tj
-1 0 0 1 171.96 660.84 Tm
-(the) Tj
-1 0 0 1 187.44 660.84 Tm
-(replicas) Tj
-1 0 0 1 221.76 660.84 Tm
-(simply) Tj
-1 0 0 1 252.24 660.84 Tm
-(re-send) Tj
-1 0 0 1 284.879 660.84 Tm
-(the) Tj
-1 0 0 1 72 648.84 Tm
-(reply;) Tj
-1 0 0 1 97.4399 648.84 Tm
-(replicas) Tj
-1 0 0 1 130.56 648.84 Tm
-(remember) Tj
-1 0 0 1 173.16 648.84 Tm
-(the) Tj
-1 0 0 1 187.44 648.84 Tm
-(last) Tj
-1 0 0 1 203.4 648.84 Tm
-(reply) Tj
-1 0 0 1 225.96 648.84 Tm
-(message) Tj
-1 0 0 1 261.839 648.84 Tm
-(the) Tj
-1 0 0 1 273.959 648.84 Tm
-(y) Tj
-1 0 0 1 280.919 648.84 Tm
-(sent) Tj
-1 0 0 1 72 636.96 Tm
-(to) Tj
-1 0 0 1 81.6 636.96 Tm
-(each) Tj
-1 0 0 1 101.76 636.96 Tm
-(client.) Tj
-1 0 0 1 129.84 636.96 Tm
-(Otherwise,) Tj
-1 0 0 1 175.32 636.96 Tm
-(if) Tj
-1 0 0 1 183.24 636.96 Tm
-(the) Tj
-1 0 0 1 197.4 636.96 Tm
-(replica) Tj
-1 0 0 1 226.319 636.96 Tm
-(is) Tj
-1 0 0 1 234.959 636.96 Tm
-(not) Tj
-1 0 0 1 249.479 636.96 Tm
-(the) Tj
-1 0 0 1 263.639 636.96 Tm
-(primary) Tj
-1 0 0 1 294.839 636.96 Tm
-(,) Tj
-1 0 0 1 72 624.96 Tm
-(it) Tj
-1 0 0 1 80.64 624.96 Tm
-(relays) Tj
-1 0 0 1 107.4 624.96 Tm
-(the) Tj
-1 0 0 1 122.64 624.96 Tm
-(request) Tj
-1 0 0 1 154.56 624.96 Tm
-(to) Tj
-1 0 0 1 165.36 624.96 Tm
-(the) Tj
-1 0 0 1 180.48 624.96 Tm
-(primary) Tj
-1 0 0 1 211.679 624.96 Tm
-(.) Tj
-1 0 0 1 219.239 624.96 Tm
-(If) Tj
-1 0 0 1 228.959 624.96 Tm
-(the) Tj
-1 0 0 1 244.199 624.96 Tm
-(primary) Tj
-1 0 0 1 278.759 624.96 Tm
-(does) Tj
-1 0 0 1 72 613.08 Tm
-(not) Tj
-1 0 0 1 87.7199 613.08 Tm
-(multicast) Tj
-1 0 0 1 127.2 613.08 Tm
-(the) Tj
-1 0 0 1 142.44 613.08 Tm
-(request) Tj
-1 0 0 1 174.12 613.08 Tm
-(to) Tj
-1 0 0 1 184.92 613.08 Tm
-(the) Tj
-1 0 0 1 200.04 613.08 Tm
-(group,) Tj
-1 0 0 1 228.84 613.08 Tm
-(it) Tj
-1 0 0 1 237.359 613.08 Tm
-(will) Tj
-1 0 0 1 255.839 613.08 Tm
-(e) Tj
-1 0 0 1 260.039 613.08 Tm
-(v) Tj
-1 0 0 1 264.959 613.08 Tm
-(entually) Tj
-1 0 0 1 72 601.08 Tm
-(be) Tj
-1 0 0 1 84.6 601.08 Tm
-(suspected) Tj
-1 0 0 1 126.48 601.08 Tm
-(to) Tj
-1 0 0 1 137.52 601.08 Tm
-(be) Tj
-1 0 0 1 150.12 601.08 Tm
-(f) Tj
-1 0 0 1 153.36 601.08 Tm
-(aulty) Tj
-1 0 0 1 176.4 601.08 Tm
-(by) Tj
-1 0 0 1 189.6 601.08 Tm
-(enough) Tj
-1 0 0 1 222.119 601.08 Tm
-(replicas) Tj
-1 0 0 1 256.319 601.08 Tm
-(to) Tj
-1 0 0 1 267.239 601.08 Tm
-(cause) Tj
-1 0 0 1 292.559 601.08 Tm
-(a) Tj
-1 0 0 1 72 589.2 Tm
-(vie) Tj
-1 0 0 1 84 589.2 Tm
-(w) Tj
-1 0 0 1 93.5999 589.2 Tm
-(change.) Tj
-1 0 0 1 81.96 576.84 Tm
-(In) Tj
-1 0 0 1 93.5999 576.84 Tm
-(this) Tj
-1 0 0 1 111.24 576.84 Tm
-(paper) Tj
-1 0 0 1 136.68 576.84 Tm
-(we) Tj
-1 0 0 1 151.68 576.84 Tm
-(assume) Tj
-1 0 0 1 184.32 576.84 Tm
-(that) Tj
-1 0 0 1 202.56 576.84 Tm
-(the) Tj
-1 0 0 1 218.04 576.84 Tm
-(client) Tj
-1 0 0 1 243.479 576.84 Tm
-(w) Tj
-1 0 0 1 250.559 576.84 Tm
-(aits) Tj
-1 0 0 1 267.719 576.84 Tm
-(for) Tj
-1 0 0 1 282.599 576.84 Tm
-(one) Tj
-1 0 0 1 72 564.84 Tm
-(request) Tj
-1 0 0 1 103.2 564.84 Tm
-(to) Tj
-1 0 0 1 113.52 564.84 Tm
-(complete) Tj
-1 0 0 1 152.52 564.84 Tm
-(before) Tj
-1 0 0 1 180.36 564.84 Tm
-(sending) Tj
-1 0 0 1 213.84 564.84 Tm
-(the) Tj
-1 0 0 1 228.599 564.84 Tm
-(ne) Tj
-1 0 0 1 237.959 564.84 Tm
-(xt) Tj
-1 0 0 1 248.039 564.84 Tm
-(one.) Tj
-1 0 0 1 268.559 564.84 Tm
-(But) Tj
-1 0 0 1 285.359 564.84 Tm
-(we) Tj
-1 0 0 1 72 552.96 Tm
-(can) Tj
-1 0 0 1 89.76 552.96 Tm
-(allo) Tj
-1 0 0 1 104.52 552.96 Tm
-(w) Tj
-1 0 0 1 115.44 552.96 Tm
-(a) Tj
-1 0 0 1 123.84 552.96 Tm
-(client) Tj
-1 0 0 1 149.76 552.96 Tm
-(to) Tj
-1 0 0 1 161.4 552.96 Tm
-(mak) Tj
-1 0 0 1 178.56 552.96 Tm
-(e) Tj
-1 0 0 1 186.84 552.96 Tm
-(asynchronous) Tj
-1 0 0 1 245.4 552.96 Tm
-(requests,) Tj
-1 0 0 1 284.879 552.96 Tm
-(yet) Tj
-1 0 0 1 72 540.96 Tm
-(preserv) Tj
-1 0 0 1 101.4 540.96 Tm
-(e) Tj
-1 0 0 1 108.12 540.96 Tm
-(ordering) Tj
-1 0 0 1 144.36 540.96 Tm
-(constraints) Tj
-1 0 0 1 189.96 540.96 Tm
-(on) Tj
-1 0 0 1 202.44 540.96 Tm
-(them.) Tj
-ET
-endstream
-endobj
-248 0 obj
-4845
-endobj
-249 0 obj
-<< /Type /Font /Name /R249 /Subtype /Type1 /BaseFont /Times-Bold >>
-endobj
-250 0 obj
-<< /Length 251 0 R >>
-stream
-BT
-/R249 10 Tf
-1 0 0 1 72 517.68 Tm
-(4.2) Tj
-1 0 0 1 94.4399 517.68 Tm
-(Normal-Case) Tj
-1 0 0 1 153.36 517.68 Tm
-(Operation) Tj
-/R238 10 Tf
-1 0 0 1 72 502.68 Tm
-(The) Tj
-1 0 0 1 93.4799 502.68 Tm
-(state) Tj
-1 0 0 1 117.6 502.68 Tm
-(of) Tj
-1 0 0 1 131.88 502.68 Tm
-(each) Tj
-1 0 0 1 156.12 502.68 Tm
-(replica) Tj
-1 0 0 1 189.12 502.68 Tm
-(includes) Tj
-1 0 0 1 228.24 502.68 Tm
-(the) Tj
-1 0 0 1 246.359 502.68 Tm
-(state) Tj
-1 0 0 1 270.599 502.68 Tm
-(of) Tj
-1 0 0 1 284.879 502.68 Tm
-(the) Tj
-1 0 0 1 72 490.8 Tm
-(service,) Tj
-1 0 0 1 106.44 490.8 Tm
-(a) Tj
-ET
-endstream
-endobj
-251 0 obj
-559
-endobj
-252 0 obj
-<< /Type /Font /Name /R252 /Subtype /Type1 /BaseFont /Times-Italic >>
-endobj
-253 0 obj
-<< /Length 254 0 R >>
-stream
-BT
-/R252 10 Tf
-1 0 0 1 114.36 490.8 Tm
-(messa) Tj
-1 0 0 1 138.6 490.8 Tm
-(g) Tj
-1 0 0 1 143.52 490.8 Tm
-(e) Tj
-1 0 0 1 151.44 490.8 Tm
-(lo) Tj
-1 0 0 1 159.12 490.8 Tm
-(g) Tj
-/R238 10 Tf
-1 0 0 1 167.52 490.8 Tm
-(containing) Tj
-1 0 0 1 213.12 490.8 Tm
-(messages) Tj
-1 0 0 1 254.279 490.8 Tm
-(the) Tj
-1 0 0 1 269.879 490.8 Tm
-(replica) Tj
-1 0 0 1 72 478.8 Tm
-(has) Tj
-1 0 0 1 87 478.8 Tm
-(accepted,) Tj
-1 0 0 1 126.24 478.8 Tm
-(and) Tj
-1 0 0 1 142.32 478.8 Tm
-(an) Tj
-1 0 0 1 153.48 478.8 Tm
-(inte) Tj
-1 0 0 1 168.36 478.8 Tm
-(ger) Tj
-1 0 0 1 182.76 478.8 Tm
-(denoting) Tj
-1 0 0 1 219.36 478.8 Tm
-(the) Tj
-1 0 0 1 233.279 478.8 Tm
-(replica') Tj
-1 0 0 1 263.279 478.8 Tm
-(s) Tj
-1 0 0 1 268.799 478.8 Tm
-(current) Tj
-1 0 0 1 72 466.8 Tm
-(vie) Tj
-1 0 0 1 84 466.8 Tm
-(w) Tj
-1 0 0 1 90.6 466.8 Tm
-(.) Tj
-1 0 0 1 96.48 466.8 Tm
-(W) Tj
-1 0 0 1 105 466.8 Tm
-(e) Tj
-1 0 0 1 111.72 466.8 Tm
-(describe) Tj
-1 0 0 1 147.12 466.8 Tm
-(ho) Tj
-1 0 0 1 156.96 466.8 Tm
-(w) Tj
-1 0 0 1 166.32 466.8 Tm
-(to) Tj
-1 0 0 1 176.28 466.8 Tm
-(truncate) Tj
-1 0 0 1 210.6 466.8 Tm
-(the) Tj
-1 0 0 1 225 466.8 Tm
-(log) Tj
-1 0 0 1 239.999 466.8 Tm
-(in) Tj
-1 0 0 1 249.959 466.8 Tm
-(Section) Tj
-1 0 0 1 281.999 466.8 Tm
-(4.3.) Tj
-1 0 0 1 81.96 454.44 Tm
-(When) Tj
-1 0 0 1 110.16 454.44 Tm
-(the) Tj
-1 0 0 1 126.84 454.44 Tm
-(primary) Tj
-1 0 0 1 158.04 454.44 Tm
-(,) Tj
-ET
-endstream
-endobj
-254 0 obj
-1335
-endobj
-255 0 obj
-<< /Type /XObject /Name /R255 /Subtype /Image /Length 256 0 R
-/ImageMask true /Width 54 /Height 64 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 54 /BlackIs1 true >>]
->>
-stream
--D98r4=0b"4s0Orro]!o&:3^Ke&7l2
-[/(7*rS^,RIfB4oLV,SG]>+(NrPSU5I/eEj^Aki-s4fFGn+Z5e95',@28).TTZ(Ru?\8Ii-iec'~>
-endstream
-endobj
-256 0 obj
-109
-endobj
-257 0 obj
-<< /Length 258 0 R >>
-stream
-q
-5.4 0 0 -6.4 164.7 458.9 cm
-/R255 Do
-Q
-BT
-1 0 0 1 170.16 454.44 Tm
-(,) Tj
-1 0 0 1 177.48 454.44 Tm
-(recei) Tj
-1 0 0 1 196.68 454.44 Tm
-(v) Tj
-1 0 0 1 201.6 454.44 Tm
-(es) Tj
-1 0 0 1 214.2 454.44 Tm
-(a) Tj
-1 0 0 1 223.08 454.44 Tm
-(client) Tj
-1 0 0 1 249.6 454.44 Tm
-(request,) Tj
-ET
-endstream
-endobj
-258 0 obj
-285
-endobj
-259 0 obj
-<< /Type /XObject /Name /R259 /Subtype /Image /Length 260 0 R
-/ImageMask true /Width 81 /Height 46 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 81 /BlackIs1 true >>]
->>
-stream
-4N`CV%M3$8612U>:Ag"NnFZb
-endstream
-endobj
-260 0 obj
-139
-endobj
-261 0 obj
-<< /Length 262 0 R >>
-stream
-q
-8.1 0 0 -4.6 285.9 458.9 cm
-/R259 Do
-Q
-BT
-1 0 0 1 294.479 454.44 Tm
-(,) Tj
-1 0 0 1 72 442.56 Tm
-(it) Tj
-1 0 0 1 81.6 442.56 Tm
-(starts) Tj
-1 0 0 1 106.68 442.56 Tm
-(a) Tj
-1 0 0 1 115.2 442.56 Tm
-(three-phase) Tj
-1 0 0 1 165.24 442.56 Tm
-(protocol) Tj
-1 0 0 1 202.56 442.56 Tm
-(to) Tj
-1 0 0 1 214.319 442.56 Tm
-(atomically) Tj
-1 0 0 1 260.519 442.56 Tm
-(multicast) Tj
-1 0 0 1 72 430.56 Tm
-(the) Tj
-1 0 0 1 89.6399 430.56 Tm
-(request) Tj
-1 0 0 1 123.84 430.56 Tm
-(to) Tj
-1 0 0 1 137.04 430.56 Tm
-(the) Tj
-1 0 0 1 154.56 430.56 Tm
-(replicas.) Tj
-1 0 0 1 200.52 430.56 Tm
-(The) Tj
-1 0 0 1 221.4 430.56 Tm
-(primary) Tj
-1 0 0 1 258.359 430.56 Tm
-(starts) Tj
-1 0 0 1 284.879 430.56 Tm
-(the) Tj
-1 0 0 1 72 418.68 Tm
-(protocol) Tj
-1 0 0 1 109.92 418.68 Tm
-(immediately) Tj
-1 0 0 1 164.52 418.68 Tm
-(unless) Tj
-1 0 0 1 194.16 418.68 Tm
-(the) Tj
-1 0 0 1 211.08 418.68 Tm
-(number) Tj
-1 0 0 1 246.359 418.68 Tm
-(of) Tj
-1 0 0 1 259.319 418.68 Tm
-(messages) Tj
-1 0 0 1 72 406.68 Tm
-(for) Tj
-1 0 0 1 87.8399 406.68 Tm
-(which) Tj
-1 0 0 1 116.4 406.68 Tm
-(the) Tj
-1 0 0 1 132.84 406.68 Tm
-(protocol) Tj
-1 0 0 1 170.16 406.68 Tm
-(is) Tj
-1 0 0 1 181.08 406.68 Tm
-(in) Tj
-1 0 0 1 193.08 406.68 Tm
-(progress) Tj
-1 0 0 1 230.999 406.68 Tm
-(e) Tj
-1 0 0 1 235.319 406.68 Tm
-(xceeds) Tj
-1 0 0 1 266.639 406.68 Tm
-(a) Tj
-1 0 0 1 275.279 406.68 Tm
-(gi) Tj
-1 0 0 1 282.839 406.68 Tm
-(v) Tj
-1 0 0 1 287.759 406.68 Tm
-(en) Tj
-1 0 0 1 72 394.8 Tm
-(maximum.) Tj
-1 0 0 1 119.88 394.8 Tm
-(In) Tj
-1 0 0 1 131.16 394.8 Tm
-(this) Tj
-1 0 0 1 148.56 394.8 Tm
-(case,) Tj
-1 0 0 1 171.24 394.8 Tm
-(it) Tj
-1 0 0 1 179.76 394.8 Tm
-(b) Tj
-1 0 0 1 184.56 394.8 Tm
-(uf) Tj
-1 0 0 1 192.72 394.8 Tm
-(fers) Tj
-1 0 0 1 210.48 394.8 Tm
-(the) Tj
-1 0 0 1 225.6 394.8 Tm
-(request.) Tj
-1 0 0 1 261.839 394.8 Tm
-(Buf) Tj
-1 0 0 1 276.599 394.8 Tm
-(fered) Tj
-1 0 0 1 72 382.8 Tm
-(requests) Tj
-1 0 0 1 108.48 382.8 Tm
-(are) Tj
-1 0 0 1 124.44 382.8 Tm
-(multicast) Tj
-1 0 0 1 164.76 382.8 Tm
-(later) Tj
-1 0 0 1 186.36 382.8 Tm
-(as) Tj
-1 0 0 1 198.48 382.8 Tm
-(a) Tj
-1 0 0 1 206.64 382.8 Tm
-(group) Tj
-1 0 0 1 233.76 382.8 Tm
-(to) Tj
-1 0 0 1 245.279 382.8 Tm
-(cut) Tj
-1 0 0 1 261.359 382.8 Tm
-(do) Tj
-1 0 0 1 271.199 382.8 Tm
-(wn) Tj
-1 0 0 1 287.039 382.8 Tm
-(on) Tj
-1 0 0 1 72 370.92 Tm
-(message) Tj
-1 0 0 1 107.52 370.92 Tm
-(traf) Tj
-1 0 0 1 121.2 370.92 Tm
-(\256c) Tj
-1 0 0 1 132.84 370.92 Tm
-(and) Tj
-1 0 0 1 149.04 370.92 Tm
-(CPU) Tj
-1 0 0 1 169.92 370.92 Tm
-(o) Tj
-1 0 0 1 174.84 370.92 Tm
-(v) Tj
-1 0 0 1 179.76 370.92 Tm
-(erheads) Tj
-1 0 0 1 211.92 370.92 Tm
-(un) Tj
-1 0 0 1 221.88 370.92 Tm
-(der) Tj
-1 0 0 1 236.28 370.92 Tm
-(h) Tj
-1 0 0 1 241.199 370.92 Tm
-(ea) Tj
-1 0 0 1 249.839 370.92 Tm
-(vy) Tj
-1 0 0 1 261.479 370.92 Tm
-(load) Tj
-1 0 0 1 278.639 370.92 Tm
-(;) Tj
-1 0 0 1 282.599 370.92 Tm
-(this) Tj
-1 0 0 1 72 358.92 Tm
-(optimization) Tj
-1 0 0 1 124.32 358.92 Tm
-(is) Tj
-1 0 0 1 132.96 358.92 Tm
-(similar) Tj
-1 0 0 1 162.6 358.92 Tm
-(to) Tj
-1 0 0 1 172.32 358.92 Tm
-(a) Tj
-1 0 0 1 178.68 358.92 Tm
-(group) Tj
-1 0 0 1 204 358.92 Tm
-(commit) Tj
-1 0 0 1 236.4 358.92 Tm
-(in) Tj
-1 0 0 1 246.119 358.92 Tm
-(transactional) Tj
-1 0 0 1 72 347.04 Tm
-(systems) Tj
-1 0 0 1 105.84 347.04 Tm
-([11) Tj
-1 0 0 1 119.04 347.04 Tm
-(].) Tj
-1 0 0 1 128.4 347.04 Tm
-(F) Tj
-1 0 0 1 133.8 347.04 Tm
-(or) Tj
-1 0 0 1 144.36 347.04 Tm
-(simplicity) Tj
-1 0 0 1 183.72 347.04 Tm
-(,) Tj
-1 0 0 1 188.4 347.04 Tm
-(we) Tj
-1 0 0 1 202.2 347.04 Tm
-(ignore) Tj
-1 0 0 1 229.919 347.04 Tm
-(this) Tj
-1 0 0 1 246.599 347.04 Tm
-(optimization) Tj
-1 0 0 1 72 335.04 Tm
-(in) Tj
-1 0 0 1 82.2 335.04 Tm
-(the) Tj
-1 0 0 1 96.9599 335.04 Tm
-(description) Tj
-1 0 0 1 143.64 335.04 Tm
-(belo) Tj
-1 0 0 1 160.68 335.04 Tm
-(w) Tj
-1 0 0 1 167.28 335.04 Tm
-(.) Tj
-1 0 0 1 81.96 322.68 Tm
-(The) Tj
-1 0 0 1 99.1199 322.68 Tm
-(three) Tj
-1 0 0 1 120.72 322.68 Tm
-(phases) Tj
-1 0 0 1 148.92 322.68 Tm
-(are) Tj
-/R252 10 Tf
-1 0 0 1 162.84 322.68 Tm
-(pr) Tj
-1 0 0 1 171.36 322.68 Tm
-(e-pr) Tj
-1 0 0 1 187.68 322.68 Tm
-(epar) Tj
-1 0 0 1 205.68 322.68 Tm
-(e) Tj
-1 0 0 1 210 322.68 Tm
-(,) Tj
-1 0 0 1 214.08 322.68 Tm
-(pr) Tj
-1 0 0 1 222.599 322.68 Tm
-(epar) Tj
-1 0 0 1 240.599 322.68 Tm
-(e) Tj
-1 0 0 1 244.919 322.68 Tm
-(,) Tj
-/R238 10 Tf
-1 0 0 1 249.119 322.68 Tm
-(and) Tj
-/R252 10 Tf
-1 0 0 1 265.199 322.68 Tm
-(commit) Tj
-/R238 10 Tf
-1 0 0 1 294.599 322.68 Tm
-(.) Tj
-1 0 0 1 72 310.68 Tm
-(The) Tj
-1 0 0 1 91.0799 310.68 Tm
-(pre-prepare) Tj
-1 0 0 1 140.64 310.68 Tm
-(and) Tj
-1 0 0 1 158.76 310.68 Tm
-(prepare) Tj
-1 0 0 1 192.24 310.68 Tm
-(phases) Tj
-1 0 0 1 222.48 310.68 Tm
-(are) Tj
-1 0 0 1 238.2 310.68 Tm
-(used) Tj
-1 0 0 1 260.159 310.68 Tm
-(to) Tj
-1 0 0 1 271.559 310.68 Tm
-(totally) Tj
-1 0 0 1 72 298.8 Tm
-(order) Tj
-1 0 0 1 97.9199 298.8 Tm
-(requests) Tj
-1 0 0 1 135.36 298.8 Tm
-(sent) Tj
-1 0 0 1 156.24 298.8 Tm
-(in) Tj
-1 0 0 1 168.84 298.8 Tm
-(the) Tj
-1 0 0 1 185.88 298.8 Tm
-(same) Tj
-1 0 0 1 211.2 298.8 Tm
-(vie) Tj
-1 0 0 1 223.199 298.8 Tm
-(w) Tj
-1 0 0 1 235.199 298.8 Tm
-(e) Tj
-1 0 0 1 239.399 298.8 Tm
-(v) Tj
-1 0 0 1 244.319 298.8 Tm
-(en) Tj
-1 0 0 1 258.359 298.8 Tm
-(when) Tj
-1 0 0 1 284.879 298.8 Tm
-(the) Tj
-1 0 0 1 72 286.8 Tm
-(primary) Tj
-1 0 0 1 103.2 286.8 Tm
-(,) Tj
-1 0 0 1 111 286.8 Tm
-(which) Tj
-1 0 0 1 140.28 286.8 Tm
-(proposes) Tj
-1 0 0 1 180.6 286.8 Tm
-(the) Tj
-1 0 0 1 197.76 286.8 Tm
-(ordering) Tj
-1 0 0 1 236.4 286.8 Tm
-(of) Tj
-1 0 0 1 249.599 286.8 Tm
-(requests,) Tj
-1 0 0 1 290.399 286.8 Tm
-(is) Tj
-1 0 0 1 72 274.92 Tm
-(f) Tj
-1 0 0 1 75.24 274.92 Tm
-(aulty) Tj
-1 0 0 1 94.6799 274.92 Tm
-(.) Tj
-1 0 0 1 100.44 274.92 Tm
-(The) Tj
-1 0 0 1 117.84 274.92 Tm
-(prepare) Tj
-1 0 0 1 149.64 274.92 Tm
-(and) Tj
-1 0 0 1 166.08 274.92 Tm
-(commit) Tj
-1 0 0 1 198.48 274.92 Tm
-(phases) Tj
-1 0 0 1 226.92 274.92 Tm
-(are) Tj
-1 0 0 1 241.079 274.92 Tm
-(used) Tj
-1 0 0 1 261.239 274.92 Tm
-(to) Tj
-1 0 0 1 270.959 274.92 Tm
-(ensure) Tj
-1 0 0 1 72 262.92 Tm
-(that) Tj
-1 0 0 1 88.6799 262.92 Tm
-(requests) Tj
-1 0 0 1 123 262.92 Tm
-(that) Tj
-1 0 0 1 139.68 262.92 Tm
-(commit) Tj
-1 0 0 1 171.72 262.92 Tm
-(are) Tj
-1 0 0 1 185.64 262.92 Tm
-(totally) Tj
-1 0 0 1 212.759 262.92 Tm
-(ordered) Tj
-1 0 0 1 244.919 262.92 Tm
-(across) Tj
-1 0 0 1 271.559 262.92 Tm
-(vie) Tj
-1 0 0 1 283.559 262.92 Tm
-(ws.) Tj
-1 0 0 1 81.96 250.56 Tm
-(In) Tj
-1 0 0 1 96.7199 250.56 Tm
-(the) Tj
-1 0 0 1 115.44 250.56 Tm
-(pre-prepare) Tj
-1 0 0 1 167.88 250.56 Tm
-(phase,) Tj
-1 0 0 1 200.52 250.56 Tm
-(the) Tj
-1 0 0 1 219.24 250.56 Tm
-(primary) Tj
-1 0 0 1 257.279 250.56 Tm
-(assigns) Tj
-1 0 0 1 292.559 250.56 Tm
-(a) Tj
-1 0 0 1 72 238.68 Tm
-(sequence) Tj
-1 0 0 1 112.8 238.68 Tm
-(number) Tj
-1 0 0 1 143.16 238.68 Tm
-(,) Tj
-ET
-endstream
-endobj
-262 0 obj
-6490
-endobj
-263 0 obj
-<< /Type /XObject /Name /R263 /Subtype /Image /Length 264 0 R
-/ImageMask true /Width 54 /Height 46 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 54 /BlackIs1 true >>]
->>
-stream
-4N]t,$m>7rl/"o@d!re,
-pYTohhg]lis4_o!aocV_^Yur>rVsXfR^`8
-endstream
-endobj
-264 0 obj
-102
-endobj
-265 0 obj
-<< /Length 266 0 R >>
-stream
-q
-5.4 0 0 -4.6 150.2 243.2 cm
-/R263 Do
-Q
-BT
-1 0 0 1 156 238.68 Tm
-(,) Tj
-1 0 0 1 163.2 238.68 Tm
-(to) Tj
-1 0 0 1 175.2 238.68 Tm
-(the) Tj
-1 0 0 1 191.64 238.68 Tm
-(request,) Tj
-1 0 0 1 227.64 238.68 Tm
-(multicasts) Tj
-1 0 0 1 272.279 238.68 Tm
-(a) Tj
-1 0 0 1 280.919 238.68 Tm
-(pre-) Tj
-1 0 0 1 72 226.68 Tm
-(prepare) Tj
-1 0 0 1 104.28 226.68 Tm
-(message) Tj
-1 0 0 1 140.4 226.68 Tm
-(with) Tj
-ET
-q
-8.1 0 0 -4.6 160.6 231.2 cm
-/R259 Do
-Q
-BT
-1 0 0 1 171.6 226.68 Tm
-(piggyback) Tj
-1 0 0 1 213.36 226.68 Tm
-(ed) Tj
-1 0 0 1 224.76 226.68 Tm
-(to) Tj
-1 0 0 1 234.96 226.68 Tm
-(all) Tj
-1 0 0 1 247.319 226.68 Tm
-(the) Tj
-1 0 0 1 261.839 226.68 Tm
-(backups,) Tj
-1 0 0 1 72 214.8 Tm
-(and) Tj
-1 0 0 1 88.8 214.8 Tm
-(appends) Tj
-1 0 0 1 123.84 214.8 Tm
-(the) Tj
-1 0 0 1 138.36 214.8 Tm
-(message) Tj
-1 0 0 1 174.48 214.8 Tm
-(to) Tj
-1 0 0 1 184.56 214.8 Tm
-(its) Tj
-1 0 0 1 196.44 214.8 Tm
-(log.) Tj
-1 0 0 1 215.16 214.8 Tm
-(The) Tj
-1 0 0 1 233.04 214.8 Tm
-(message) Tj
-1 0 0 1 269.159 214.8 Tm
-(has) Tj
-1 0 0 1 284.879 214.8 Tm
-(the) Tj
-1 0 0 1 72 202.8 Tm
-(form) Tj
-ET
-endstream
-endobj
-266 0 obj
-1058
-endobj
-267 0 obj
-<< /Type /XObject /Name /R267 /Subtype /Image /Length 268 0 R
-/ImageMask true /Width 24 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 24 /BlackIs1 true >>]
->>
-stream
-+t-07X8N5#0B"SKInTVGqHrM(f3_PN_YUJ4L&^prs)7cFqg[B")ufa0GPC"Nr'(,Kmt^kVHo1m8!<~>
-endstream
-endobj
-268 0 obj
-80
-endobj
-269 0 obj
-<< /Length 270 0 R >>
-stream
-q
-2.4 0 0 -9.9 96.8 210.3 cm
-/R267 Do
-Q
-q
-2.4 0 0 -9.9 100.6 210.3 cm
-/R267 Do
-Q
-BT
-/R238 8 Tf
-1 0 0 1 103.56 202.8 Tm
-(PRE) Tj
-/R238 10 Tf
-1 0 0 1 118.2 202.8 Tm
-(-) Tj
-/R238 8 Tf
-1 0 0 1 121.56 202.8 Tm
-(PREP) Tj
-1 0 0 1 139.92 202.8 Tm
-(ARE) Tj
-ET
-endstream
-endobj
-270 0 obj
-251
-endobj
-271 0 obj
-<< /Type /XObject /Name /R271 /Subtype /Image /Length 272 0 R
-/ImageMask true /Width 13 /Height 30 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 13 /BlackIs1 true >>]
->>
-stream
-0g^A/h=&*equ,LR2Xj(@lh_"t-iec'~>
-endstream
-endobj
-272 0 obj
-33
-endobj
-273 0 obj
-<< /Length 274 0 R >>
-stream
-q
-1.3 0 0 -3 156.6 203.9 cm
-/R271 Do
-Q
-endstream
-endobj
-274 0 obj
-39
-endobj
-275 0 obj
-<< /Type /XObject /Name /R275 /Subtype /Image /Length 276 0 R
-/ImageMask true /Width 44 /Height 46 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 44 /BlackIs1 true >>]
->>
-stream
-2$jBq
-&9R,hkFhTE_G0fRqg[T's0obU5O\AciSX+=pUN/*r',Z@_Z&BgfC8fKf@@X?]DE=DTC?6WJ-Z.*~>
-endstream
-endobj
-276 0 obj
-84
-endobj
-277 0 obj
-<< /Length 278 0 R >>
-stream
-q
-4.4 0 0 -4.6 160.4 207.3 cm
-/R275 Do
-Q
-q
-1.3 0 0 -3 166.2 203.9 cm
-/R271 Do
-Q
-q
-5.4 0 0 -4.6 170 207.3 cm
-/R263 Do
-Q
-q
-1.3 0 0 -3 176.6 203.9 cm
-/R271 Do
-Q
-endstream
-endobj
-278 0 obj
-158
-endobj
-279 0 obj
-<< /Type /XObject /Name /R279 /Subtype /Image /Length 280 0 R
-/ImageMask true /Width 49 /Height 71 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 49 /BlackIs1 true >>]
->>
-stream
--PYiBJV"+0)UN3G',i&VcojQ(@sYoeKmuDG
-s)&q9s*o7jJ)C$Fpj^'QJ%rnUr&sfAs+VQL0)H)pV[&D-@^p.P-,mCns*qra5O\@FpQ6S*nl.";J-Z~>
-endstream
-endobj
-280 0 obj
-117
-endobj
-281 0 obj
-<< /Length 282 0 R >>
-stream
-q
-4.9 0 0 -7.1 180.5 209.8 cm
-/R279 Do
-Q
-endstream
-endobj
-282 0 obj
-41
-endobj
-283 0 obj
-<< /Type /XObject /Name /R283 /Subtype /Image /Length 284 0 R
-/ImageMask true /Width 24 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 24 /BlackIs1 true >>]
->>
-stream
-02pd&htA/cs0qnbrP.\`mJhV5_u&o]hqrq@J+[15ImJQWpe1HjlFsc8R~>
-endstream
-endobj
-284 0 obj
-78
-endobj
-285 0 obj
-<< /Length 286 0 R >>
-stream
-q
-2.4 0 0 -9.9 185.8 210.3 cm
-/R283 Do
-Q
-endstream
-endobj
-286 0 obj
-41
-endobj
-287 0 obj
-<< /Type /XObject /Name /R287 /Subtype /Image /Length 288 0 R
-/ImageMask true /Width 42 /Height 31 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 42 /BlackIs1 true >>]
->>
-stream
-1`R)4"qZ&4%Y>/aKS+]fJ#a+Sp>>oFIt)n@>7^\DYeoBbLCXeP2$%q%J-Z~>
-endstream
-endobj
-288 0 obj
-61
-endobj
-289 0 obj
-<< /Length 290 0 R >>
-stream
-q
-4.2 0 0 -3.1 189.4 204.4 cm
-/R287 Do
-Q
-endstream
-endobj
-290 0 obj
-41
-endobj
-291 0 obj
-<< /Type /XObject /Name /R291 /Subtype /Image /Length 292 0 R
-/ImageMask true /Width 31 /Height 32 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 31 /BlackIs1 true >>]
->>
-stream
--D:A;E<"bo0Kp%mK
-endstream
-endobj
-292 0 obj
-58
-endobj
-293 0 obj
-<< /Length 294 0 R >>
-stream
-q
-3.1 0 0 -3.2 193.9 202.6 cm
-/R291 Do
-Q
-q
-1.3 0 0 -3 199.4 203.9 cm
-/R271 Do
-Q
-q
-8.1 0 0 -4.6 203.2 207.3 cm
-/R259 Do
-Q
-q
-2.4 0 0 -9.9 212.2 210.3 cm
-/R283 Do
-Q
-BT
-/R238 10 Tf
-1 0 0 1 215.64 202.8 Tm
-(,) Tj
-1 0 0 1 223.08 202.8 Tm
-(where) Tj
-ET
-q
-4.4 0 0 -4.6 252.1 207.3 cm
-/R275 Do
-Q
-BT
-1 0 0 1 261.6 202.8 Tm
-(indicates) Tj
-1 0 0 1 72 190.92 Tm
-(the) Tj
-1 0 0 1 87.8399 190.92 Tm
-(vie) Tj
-1 0 0 1 99.8399 190.92 Tm
-(w) Tj
-1 0 0 1 110.64 190.92 Tm
-(in) Tj
-1 0 0 1 122.04 190.92 Tm
-(which) Tj
-1 0 0 1 150.12 190.92 Tm
-(the) Tj
-1 0 0 1 165.96 190.92 Tm
-(message) Tj
-1 0 0 1 203.4 190.92 Tm
-(is) Tj
-1 0 0 1 213.719 190.92 Tm
-(being) Tj
-1 0 0 1 239.519 190.92 Tm
-(sent,) Tj
-ET
-q
-8.1 0 0 -4.6 262.3 195.4 cm
-/R259 Do
-Q
-BT
-1 0 0 1 274.439 190.92 Tm
-(is) Tj
-1 0 0 1 284.879 190.92 Tm
-(the) Tj
-1 0 0 1 72 178.92 Tm
-(client') Tj
-1 0 0 1 96.9599 178.92 Tm
-(s) Tj
-1 0 0 1 103.32 178.92 Tm
-(request) Tj
-1 0 0 1 134.52 178.92 Tm
-(message,) Tj
-1 0 0 1 173.28 178.92 Tm
-(and) Tj
-ET
-q
-4.9 0 0 -7.1 190.5 185.9 cm
-/R279 Do
-Q
-BT
-1 0 0 1 197.88 178.92 Tm
-(is) Tj
-ET
-q
-8.1 0 0 -4.6 207.2 183.4 cm
-/R259 Do
-Q
-BT
-1 0 0 1 215.76 178.92 Tm
-(') Tj
-1 0 0 1 218.52 178.92 Tm
-(s) Tj
-1 0 0 1 224.88 178.92 Tm
-(digest.) Tj
-1 0 0 1 81.96 166.56 Tm
-(Requests) Tj
-1 0 0 1 122.64 166.56 Tm
-(are) Tj
-1 0 0 1 139.68 166.56 Tm
-(not) Tj
-1 0 0 1 157.08 166.56 Tm
-(included) Tj
-1 0 0 1 196.2 166.56 Tm
-(in) Tj
-1 0 0 1 208.68 166.56 Tm
-(pre-prepare) Tj
-1 0 0 1 259.319 166.56 Tm
-(messages) Tj
-1 0 0 1 72 154.56 Tm
-(to) Tj
-1 0 0 1 84.48 154.56 Tm
-(k) Tj
-1 0 0 1 89.3999 154.56 Tm
-(eep) Tj
-1 0 0 1 108 154.56 Tm
-(them) Tj
-1 0 0 1 132.72 154.56 Tm
-(small.) Tj
-1 0 0 1 167.28 154.56 Tm
-(This) Tj
-1 0 0 1 189.72 154.56 Tm
-(is) Tj
-1 0 0 1 201.12 154.56 Tm
-(important) Tj
-1 0 0 1 244.679 154.56 Tm
-(because) Tj
-1 0 0 1 280.919 154.56 Tm
-(pre-) Tj
-1 0 0 1 72 142.68 Tm
-(prepare) Tj
-1 0 0 1 104.04 142.68 Tm
-(messages) Tj
-1 0 0 1 143.76 142.68 Tm
-(are) Tj
-1 0 0 1 158.16 142.68 Tm
-(used) Tj
-1 0 0 1 178.56 142.68 Tm
-(as) Tj
-1 0 0 1 189 142.68 Tm
-(a) Tj
-1 0 0 1 195.6 142.68 Tm
-(proof) Tj
-1 0 0 1 219.24 142.68 Tm
-(that) Tj
-1 0 0 1 236.399 142.68 Tm
-(the) Tj
-1 0 0 1 250.679 142.68 Tm
-(request) Tj
-1 0 0 1 281.639 142.68 Tm
-(w) Tj
-1 0 0 1 288.719 142.68 Tm
-(as) Tj
-1 0 0 1 72 130.68 Tm
-(assigned) Tj
-1 0 0 1 108.96 130.68 Tm
-(sequence) Tj
-1 0 0 1 148.2 130.68 Tm
-(number) Tj
-ET
-q
-5.4 0 0 -4.6 181.5 135.2 cm
-/R263 Do
-Q
-BT
-1 0 0 1 189.96 130.68 Tm
-(in) Tj
-1 0 0 1 200.52 130.68 Tm
-(vie) Tj
-1 0 0 1 212.52 130.68 Tm
-(w) Tj
-ET
-q
-4.4 0 0 -4.6 222.4 135.2 cm
-/R275 Do
-Q
-BT
-1 0 0 1 230.16 130.68 Tm
-(in) Tj
-1 0 0 1 240.6 130.68 Tm
-(vie) Tj
-1 0 0 1 252.6 130.68 Tm
-(w) Tj
-1 0 0 1 262.439 130.68 Tm
-(changes.) Tj
-1 0 0 1 72 118.8 Tm
-(Additionally) Tj
-1 0 0 1 122.04 118.8 Tm
-(,) Tj
-1 0 0 1 128.52 118.8 Tm
-(it) Tj
-1 0 0 1 138 118.8 Tm
-(decouples) Tj
-1 0 0 1 181.68 118.8 Tm
-(the) Tj
-1 0 0 1 197.76 118.8 Tm
-(protocol) Tj
-1 0 0 1 234.96 118.8 Tm
-(to) Tj
-1 0 0 1 246.599 118.8 Tm
-(totally) Tj
-1 0 0 1 275.999 118.8 Tm
-(order) Tj
-1 0 0 1 72 106.8 Tm
-(requests) Tj
-1 0 0 1 107.52 106.8 Tm
-(from) Tj
-1 0 0 1 129.84 106.8 Tm
-(the) Tj
-1 0 0 1 144.96 106.8 Tm
-(protocol) Tj
-1 0 0 1 181.08 106.8 Tm
-(to) Tj
-1 0 0 1 191.76 106.8 Tm
-(transmit) Tj
-1 0 0 1 227.399 106.8 Tm
-(the) Tj
-1 0 0 1 242.399 106.8 Tm
-(request) Tj
-1 0 0 1 274.199 106.8 Tm
-(to) Tj
-1 0 0 1 284.879 106.8 Tm
-(the) Tj
-1 0 0 1 72 94.92 Tm
-(replicas;) Tj
-1 0 0 1 111 94.92 Tm
-(allo) Tj
-1 0 0 1 125.76 94.92 Tm
-(wing) Tj
-1 0 0 1 149.88 94.92 Tm
-(us) Tj
-1 0 0 1 163.08 94.92 Tm
-(to) Tj
-1 0 0 1 175.2 94.92 Tm
-(use) Tj
-1 0 0 1 192.72 94.92 Tm
-(a) Tj
-1 0 0 1 201.48 94.92 Tm
-(transport) Tj
-1 0 0 1 241.199 94.92 Tm
-(optimized) Tj
-1 0 0 1 285.359 94.92 Tm
-(for) Tj
-1 0 0 1 72 82.92 Tm
-(small) Tj
-1 0 0 1 97.7999 82.92 Tm
-(messages) Tj
-1 0 0 1 139.56 82.92 Tm
-(for) Tj
-1 0 0 1 155.28 82.92 Tm
-(protocol) Tj
-1 0 0 1 192.72 82.92 Tm
-(messages) Tj
-1 0 0 1 234.48 82.92 Tm
-(and) Tj
-1 0 0 1 252.959 82.92 Tm
-(a) Tj
-1 0 0 1 261.599 82.92 Tm
-(transport) Tj
-1 0 0 1 72 71.04 Tm
-(optimized) Tj
-1 0 0 1 114.36 71.04 Tm
-(for) Tj
-1 0 0 1 128.4 71.04 Tm
-(lar) Tj
-1 0 0 1 138.84 71.04 Tm
-(ge) Tj
-1 0 0 1 150.72 71.04 Tm
-(messages) Tj
-1 0 0 1 190.8 71.04 Tm
-(for) Tj
-1 0 0 1 204.96 71.04 Tm
-(lar) Tj
-1 0 0 1 215.399 71.04 Tm
-(ge) Tj
-1 0 0 1 227.159 71.04 Tm
-(requests.) Tj
-1 0 0 1 324.96 709.08 Tm
-(A) Tj
-1 0 0 1 334.68 709.08 Tm
-(backup) Tj
-1 0 0 1 365.88 709.08 Tm
-(accepts) Tj
-1 0 0 1 397.68 709.08 Tm
-(a) Tj
-1 0 0 1 404.64 709.08 Tm
-(pre-prepare) Tj
-1 0 0 1 453 709.08 Tm
-(message) Tj
-1 0 0 1 489.239 709.08 Tm
-(pro) Tj
-1 0 0 1 502.559 709.08 Tm
-(vided:) Tj
-ET
-endstream
-endobj
-294 0 obj
-4543
-endobj
-295 0 obj
-<< /Type /XObject /Name /R295 /Subtype /Image /Length 296 0 R
-/ImageMask true /Width 39 /Height 39 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 39 /BlackIs1 true >>]
->>
-stream
-3f*u*F9LP-kW3[R5O&26s8VF=rNC"SR~>
-endstream
-endobj
-296 0 obj
-48
-endobj
-297 0 obj
-<< /Length 298 0 R >>
-stream
-q
-3.9 0 0 -3.9 320.5 700.9 cm
-/R295 Do
-Q
-BT
-1 0 0 1 330 696.36 Tm
-(the) Tj
-1 0 0 1 347.28 696.36 Tm
-(signatures) Tj
-1 0 0 1 392.88 696.36 Tm
-(in) Tj
-1 0 0 1 405.84 696.36 Tm
-(the) Tj
-1 0 0 1 423.24 696.36 Tm
-(request) Tj
-1 0 0 1 457.2 696.36 Tm
-(and) Tj
-1 0 0 1 476.76 696.36 Tm
-(the) Tj
-1 0 0 1 494.039 696.36 Tm
-(pre-prepare) Tj
-1 0 0 1 330 684.36 Tm
-(message) Tj
-1 0 0 1 366.24 684.36 Tm
-(are) Tj
-1 0 0 1 380.88 684.36 Tm
-(correct) Tj
-1 0 0 1 411 684.36 Tm
-(and) Tj
-ET
-q
-4.9 0 0 -7.1 428.2 691.4 cm
-/R279 Do
-Q
-BT
-1 0 0 1 435.6 684.36 Tm
-(is) Tj
-1 0 0 1 444.72 684.36 Tm
-(the) Tj
-1 0 0 1 459.36 684.36 Tm
-(digest) Tj
-1 0 0 1 485.639 684.36 Tm
-(for) Tj
-ET
-q
-8.1 0 0 -4.6 500 688.9 cm
-/R259 Do
-Q
-BT
-1 0 0 1 508.559 684.36 Tm
-(;) Tj
-ET
-q
-3.9 0 0 -3.9 320.5 675.8 cm
-/R295 Do
-Q
-BT
-1 0 0 1 330 671.28 Tm
-(it) Tj
-1 0 0 1 337.92 671.28 Tm
-(is) Tj
-1 0 0 1 347.16 671.28 Tm
-(in) Tj
-1 0 0 1 357.36 671.28 Tm
-(vie) Tj
-1 0 0 1 369.36 671.28 Tm
-(w) Tj
-ET
-q
-4.4 0 0 -4.6 379.2 675.8 cm
-/R275 Do
-Q
-BT
-1 0 0 1 384.12 671.28 Tm
-(;) Tj
-ET
-q
-3.9 0 0 -3.9 320.5 662.7 cm
-/R295 Do
-Q
-BT
-1 0 0 1 330 658.2 Tm
-(it) Tj
-1 0 0 1 338.16 658.2 Tm
-(has) Tj
-1 0 0 1 354 658.2 Tm
-(not) Tj
-1 0 0 1 369.36 658.2 Tm
-(accepted) Tj
-1 0 0 1 406.8 658.2 Tm
-(a) Tj
-1 0 0 1 413.88 658.2 Tm
-(pre-prepare) Tj
-1 0 0 1 462.479 658.2 Tm
-(message) Tj
-1 0 0 1 498.839 658.2 Tm
-(for) Tj
-1 0 0 1 513.119 658.2 Tm
-(vie) Tj
-1 0 0 1 525.119 658.2 Tm
-(w) Tj
-ET
-q
-4.4 0 0 -4.6 535 662.7 cm
-/R275 Do
-Q
-BT
-1 0 0 1 330 646.2 Tm
-(and) Tj
-1 0 0 1 346.56 646.2 Tm
-(sequence) Tj
-1 0 0 1 385.32 646.2 Tm
-(number) Tj
-ET
-q
-5.4 0 0 -4.6 418.2 650.7 cm
-/R263 Do
-Q
-BT
-1 0 0 1 426.24 646.2 Tm
-(containing) Tj
-1 0 0 1 470.52 646.2 Tm
-(a) Tj
-1 0 0 1 477.12 646.2 Tm
-(dif) Tj
-1 0 0 1 488.04 646.2 Tm
-(ferent) Tj
-1 0 0 1 513.479 646.2 Tm
-(digest;) Tj
-ET
-q
-3.9 0 0 -3.9 320.5 637.6 cm
-/R295 Do
-Q
-BT
-1 0 0 1 330 633.12 Tm
-(the) Tj
-1 0 0 1 345.6 633.12 Tm
-(sequence) Tj
-1 0 0 1 385.68 633.12 Tm
-(number) Tj
-1 0 0 1 419.64 633.12 Tm
-(in) Tj
-1 0 0 1 430.92 633.12 Tm
-(the) Tj
-1 0 0 1 446.64 633.12 Tm
-(pre-prepare) Tj
-1 0 0 1 496.079 633.12 Tm
-(message) Tj
-1 0 0 1 533.399 633.12 Tm
-(is) Tj
-1 0 0 1 330 621.12 Tm
-(between) Tj
-1 0 0 1 365.4 621.12 Tm
-(a) Tj
-1 0 0 1 372.12 621.12 Tm
-(lo) Tj
-1 0 0 1 379.68 621.12 Tm
-(w) Tj
-1 0 0 1 389.16 621.12 Tm
-(w) Tj
-1 0 0 1 396.24 621.12 Tm
-(ater) Tj
-1 0 0 1 413.4 621.12 Tm
-(mark,) Tj
-ET
-endstream
-endobj
-298 0 obj
-2351
-endobj
-299 0 obj
-<< /Type /XObject /Name /R299 /Subtype /Image /Length 300 0 R
-/ImageMask true /Width 50 /Height 71 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 50 /BlackIs1 true >>]
->>
-stream
-0Zl\u@0_OZ#Wp,3rBJ3g^\>2:
-rV-&ursUj$gmgWn*E:5fO9!_pbg-FlJ[WfIqQ^[&,mZcqtL,7s*eVhs5pRo!WX>~>
-endstream
-endobj
-300 0 obj
-108
-endobj
-301 0 obj
-<< /Length 302 0 R >>
-stream
-q
-5 0 0 -7.1 439.1 628.1 cm
-/R299 Do
-Q
-BT
-1 0 0 1 444.48 621.12 Tm
-(,) Tj
-1 0 0 1 449.28 621.12 Tm
-(and) Tj
-1 0 0 1 465.96 621.12 Tm
-(a) Tj
-1 0 0 1 472.679 621.12 Tm
-(high) Tj
-1 0 0 1 492.719 621.12 Tm
-(w) Tj
-1 0 0 1 499.799 621.12 Tm
-(ater) Tj
-1 0 0 1 517.079 621.12 Tm
-(mark,) Tj
-ET
-endstream
-endobj
-302 0 obj
-285
-endobj
-303 0 obj
-<< /Type /XObject /Name /R303 /Subtype /Image /Length 304 0 R
-/ImageMask true /Width 84 /Height 69 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 84 /BlackIs1 true >>]
->>
-stream
--D8e7)F+8D_$Y]c$*6AK
-mN;?)rZ1b5h;A,.rpTgb+7B0HrVjk:r%\j3J,S4'^YeJZhr4S'r'0*,+8c$9*VY&PJY_cls1
-endstream
-endobj
-304 0 obj
-102
-endobj
-305 0 obj
-<< /Length 306 0 R >>
-stream
-q
-8.4 0 0 -6.9 330.3 616.1 cm
-/R303 Do
-Q
-BT
-1 0 0 1 339.12 609.24 Tm
-(.) Tj
-1 0 0 1 315 596.52 Tm
-(The) Tj
-1 0 0 1 337.08 596.52 Tm
-(last) Tj
-1 0 0 1 357.48 596.52 Tm
-(condition) Tj
-1 0 0 1 401.76 596.52 Tm
-(pre) Tj
-1 0 0 1 414.36 596.52 Tm
-(v) Tj
-1 0 0 1 419.28 596.52 Tm
-(ents) Tj
-1 0 0 1 441.72 596.52 Tm
-(a) Tj
-1 0 0 1 452.76 596.52 Tm
-(f) Tj
-1 0 0 1 456 596.52 Tm
-(aulty) Tj
-1 0 0 1 482.519 596.52 Tm
-(primary) Tj
-1 0 0 1 520.679 596.52 Tm
-(from) Tj
-1 0 0 1 315 584.52 Tm
-(e) Tj
-1 0 0 1 319.32 584.52 Tm
-(xhausting) Tj
-1 0 0 1 361.32 584.52 Tm
-(the) Tj
-1 0 0 1 376.8 584.52 Tm
-(space) Tj
-1 0 0 1 402.24 584.52 Tm
-(of) Tj
-1 0 0 1 413.88 584.52 Tm
-(sequence) Tj
-1 0 0 1 453.72 584.52 Tm
-(numbers) Tj
-1 0 0 1 491.279 584.52 Tm
-(by) Tj
-1 0 0 1 504.599 584.52 Tm
-(selecting) Tj
-1 0 0 1 315 572.64 Tm
-(a) Tj
-1 0 0 1 322.68 572.64 Tm
-(v) Tj
-1 0 0 1 327.6 572.64 Tm
-(ery) Tj
-1 0 0 1 343.44 572.64 Tm
-(lar) Tj
-1 0 0 1 353.88 572.64 Tm
-(ge) Tj
-1 0 0 1 366.48 572.64 Tm
-(one.) Tj
-1 0 0 1 389.16 572.64 Tm
-(W) Tj
-1 0 0 1 397.68 572.64 Tm
-(e) Tj
-1 0 0 1 405.48 572.64 Tm
-(discuss) Tj
-1 0 0 1 437.52 572.64 Tm
-(ho) Tj
-1 0 0 1 447.36 572.64 Tm
-(w) Tj
-ET
-q
-8.4 0 0 -6.9 458 579.5 cm
-/R303 Do
-Q
-BT
-1 0 0 1 470.04 572.64 Tm
-(and) Tj
-ET
-q
-5 0 0 -7.1 488.1 579.6 cm
-/R299 Do
-Q
-BT
-1 0 0 1 496.559 572.64 Tm
-(adv) Tj
-1 0 0 1 510.839 572.64 Tm
-(ance) Tj
-1 0 0 1 532.199 572.64 Tm
-(in) Tj
-1 0 0 1 315 560.64 Tm
-(Section) Tj
-1 0 0 1 347.4 560.64 Tm
-(4.3.) Tj
-1 0 0 1 324.96 548.76 Tm
-(If) Tj
-1 0 0 1 334.56 548.76 Tm
-(backup) Tj
-ET
-endstream
-endobj
-306 0 obj
-1512
-endobj
-307 0 obj
-<< /Type /XObject /Name /R307 /Subtype /Image /Length 308 0 R
-/ImageMask true /Width 26 /Height 69 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 26 /BlackIs1 true >>]
->>
-stream
--R^*Zl/YrmIf:DfhtVWo^UNqc%K6'1s*addX2"DHrSQB/+4u(tp(mUa[G\kks2oQE"5iR%(OubkJ,~>
-endstream
-endobj
-308 0 obj
-80
-endobj
-309 0 obj
-<< /Length 310 0 R >>
-stream
-q
-2.6 0 0 -6.9 366.6 555.6 cm
-/R307 Do
-Q
-BT
-1 0 0 1 372.72 548.76 Tm
-(accepts) Tj
-1 0 0 1 405 548.76 Tm
-(the) Tj
-ET
-q
-2.4 0 0 -9.9 421.1 556.3 cm
-/R267 Do
-Q
-q
-2.4 0 0 -9.9 425 556.3 cm
-/R267 Do
-Q
-BT
-/R238 8 Tf
-1 0 0 1 427.92 548.76 Tm
-(PRE) Tj
-/R238 10 Tf
-1 0 0 1 442.56 548.76 Tm
-(-) Tj
-/R238 8 Tf
-1 0 0 1 445.92 548.76 Tm
-(PREP) Tj
-1 0 0 1 464.279 548.76 Tm
-(ARE) Tj
-ET
-q
-1.3 0 0 -3 480.9 549.9 cm
-/R271 Do
-Q
-q
-4.4 0 0 -4.6 484.8 553.3 cm
-/R275 Do
-Q
-q
-1.3 0 0 -3 490.5 549.9 cm
-/R271 Do
-Q
-q
-5.4 0 0 -4.6 494.4 553.3 cm
-/R263 Do
-Q
-q
-1.3 0 0 -3 501 549.9 cm
-/R271 Do
-Q
-q
-4.9 0 0 -7.1 504.9 555.8 cm
-/R279 Do
-Q
-q
-2.4 0 0 -9.9 510.2 556.3 cm
-/R283 Do
-Q
-q
-4.2 0 0 -3.1 513.8 550.3 cm
-/R287 Do
-Q
-q
-3.1 0 0 -3.2 518.3 548.6 cm
-/R291 Do
-Q
-q
-1.3 0 0 -3 523.8 549.9 cm
-/R271 Do
-Q
-q
-8.1 0 0 -4.6 527.6 553.3 cm
-/R259 Do
-Q
-q
-2.4 0 0 -9.9 536.6 556.3 cm
-/R283 Do
-Q
-BT
-/R238 10 Tf
-1 0 0 1 315 536.76 Tm
-(message,) Tj
-1 0 0 1 355.32 536.76 Tm
-(it) Tj
-1 0 0 1 364.56 536.76 Tm
-(enters) Tj
-1 0 0 1 392.04 536.76 Tm
-(the) Tj
-/R252 10 Tf
-1 0 0 1 408 536.76 Tm
-(pr) Tj
-1 0 0 1 416.52 536.76 Tm
-(epar) Tj
-1 0 0 1 434.52 536.76 Tm
-(e) Tj
-/R238 10 Tf
-1 0 0 1 442.44 536.76 Tm
-(phase) Tj
-1 0 0 1 468.84 536.76 Tm
-(by) Tj
-1 0 0 1 482.639 536.76 Tm
-(multicasting) Tj
-1 0 0 1 535.559 536.76 Tm
-(a) Tj
-ET
-q
-2.4 0 0 -9.9 315.9 532.4 cm
-/R267 Do
-Q
-BT
-/R238 8 Tf
-1 0 0 1 318.84 524.88 Tm
-(PREP) Tj
-1 0 0 1 337.2 524.88 Tm
-(ARE) Tj
-ET
-q
-1.3 0 0 -3 354 526 cm
-/R271 Do
-Q
-q
-4.4 0 0 -4.6 357.8 529.4 cm
-/R275 Do
-Q
-q
-1.3 0 0 -3 363.6 526 cm
-/R271 Do
-Q
-q
-5.4 0 0 -4.6 367.4 529.4 cm
-/R263 Do
-Q
-q
-1.3 0 0 -3 374 526 cm
-/R271 Do
-Q
-q
-4.9 0 0 -7.1 377.9 531.9 cm
-/R279 Do
-Q
-q
-1.3 0 0 -3 383.6 526 cm
-/R271 Do
-Q
-q
-2.6 0 0 -6.9 387.4 531.7 cm
-/R307 Do
-Q
-q
-2.4 0 0 -9.9 391.1 532.4 cm
-/R283 Do
-Q
-q
-4.2 0 0 -3.1 394.8 526.4 cm
-/R287 Do
-Q
-endstream
-endobj
-310 0 obj
-1795
-endobj
-311 0 obj
-<< /Type /XObject /Name /R311 /Subtype /Image /Length 312 0 R
-/ImageMask true /Width 17 /Height 35 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 17 /BlackIs1 true >>]
->>
-stream
-4B*=`S,;]mpj7Y*s1(">iS6Nohi?6cs!N02p(RKl"9~>
-endstream
-endobj
-312 0 obj
-45
-endobj
-313 0 obj
-<< /Length 314 0 R >>
-stream
-q
-1.7 0 0 -3.5 399.4 526 cm
-/R311 Do
-Q
-BT
-/R238 10 Tf
-1 0 0 1 406.08 524.88 Tm
-(message) Tj
-1 0 0 1 443.16 524.88 Tm
-(to) Tj
-1 0 0 1 454.2 524.88 Tm
-(all) Tj
-1 0 0 1 467.52 524.88 Tm
-(other) Tj
-1 0 0 1 491.28 524.88 Tm
-(replicas) Tj
-1 0 0 1 525.6 524.88 Tm
-(and) Tj
-1 0 0 1 315 512.88 Tm
-(adds) Tj
-1 0 0 1 335.16 512.88 Tm
-(both) Tj
-1 0 0 1 354.84 512.88 Tm
-(messages) Tj
-1 0 0 1 394.32 512.88 Tm
-(to) Tj
-1 0 0 1 404.04 512.88 Tm
-(its) Tj
-1 0 0 1 415.32 512.88 Tm
-(log.) Tj
-1 0 0 1 433.92 512.88 Tm
-(Otherwise,) Tj
-1 0 0 1 479.399 512.88 Tm
-(it) Tj
-1 0 0 1 486.839 512.88 Tm
-(does) Tj
-1 0 0 1 507.119 512.88 Tm
-(nothing.) Tj
-1 0 0 1 324.96 501 Tm
-(A) Tj
-1 0 0 1 337.8 501 Tm
-(replica) Tj
-1 0 0 1 370.44 501 Tm
-(\(including) Tj
-1 0 0 1 417 501 Tm
-(the) Tj
-1 0 0 1 434.76 501 Tm
-(primary\)) Tj
-1 0 0 1 475.2 501 Tm
-(accepts) Tj
-1 0 0 1 510.119 501 Tm
-(prepare) Tj
-1 0 0 1 315 489 Tm
-(messages) Tj
-1 0 0 1 359.04 489 Tm
-(and) Tj
-1 0 0 1 379.8 489 Tm
-(adds) Tj
-1 0 0 1 404.52 489 Tm
-(them) Tj
-1 0 0 1 430.92 489 Tm
-(to) Tj
-1 0 0 1 445.08 489 Tm
-(its) Tj
-1 0 0 1 460.92 489 Tm
-(log) Tj
-1 0 0 1 479.999 489 Tm
-(pro) Tj
-1 0 0 1 493.319 489 Tm
-(vided) Tj
-1 0 0 1 521.759 489 Tm
-(their) Tj
-1 0 0 1 315 477.12 Tm
-(signatures) Tj
-1 0 0 1 360.6 477.12 Tm
-(are) Tj
-1 0 0 1 377.88 477.12 Tm
-(correct,) Tj
-1 0 0 1 413.88 477.12 Tm
-(their) Tj
-1 0 0 1 437.28 477.12 Tm
-(vie) Tj
-1 0 0 1 449.28 477.12 Tm
-(w) Tj
-1 0 0 1 461.64 477.12 Tm
-(number) Tj
-1 0 0 1 497.159 477.12 Tm
-(equals) Tj
-1 0 0 1 527.879 477.12 Tm
-(the) Tj
-1 0 0 1 315 465.12 Tm
-(replica') Tj
-1 0 0 1 345 465.12 Tm
-(s) Tj
-1 0 0 1 353.76 465.12 Tm
-(current) Tj
-1 0 0 1 387 465.12 Tm
-(vie) Tj
-1 0 0 1 399 465.12 Tm
-(w) Tj
-1 0 0 1 405.6 465.12 Tm
-(,) Tj
-1 0 0 1 413.64 465.12 Tm
-(and) Tj
-1 0 0 1 433.08 465.12 Tm
-(their) Tj
-1 0 0 1 456.36 465.12 Tm
-(sequence) Tj
-1 0 0 1 497.879 465.12 Tm
-(number) Tj
-1 0 0 1 533.399 465.12 Tm
-(is) Tj
-1 0 0 1 315 453.24 Tm
-(between) Tj
-ET
-q
-5 0 0 -7.1 351 460.2 cm
-/R299 Do
-Q
-BT
-1 0 0 1 358.92 453.24 Tm
-(and) Tj
-ET
-q
-8.4 0 0 -6.9 376.1 460.1 cm
-/R303 Do
-Q
-BT
-1 0 0 1 384.96 453.24 Tm
-(.) Tj
-1 0 0 1 324.96 441.24 Tm
-(W) Tj
-1 0 0 1 333.48 441.24 Tm
-(e) Tj
-1 0 0 1 340.32 441.24 Tm
-(de\256ne) Tj
-1 0 0 1 366.96 441.24 Tm
-(the) Tj
-1 0 0 1 381.48 441.24 Tm
-(predicate) Tj
-/R252 10 Tf
-1 0 0 1 420.24 441.24 Tm
-(pr) Tj
-1 0 0 1 428.76 441.24 Tm
-(epar) Tj
-1 0 0 1 446.76 441.24 Tm
-(ed) Tj
-ET
-endstream
-endobj
-314 0 obj
-2362
-endobj
-315 0 obj
-<< /Type /XObject /Name /R315 /Subtype /Image /Length 316 0 R
-/ImageMask true /Width 24 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 24 /BlackIs1 true >>]
->>
-stream
-+rF]%*LO8IHL@*j8[taqp!<~>
-endstream
-endobj
-316 0 obj
-80
-endobj
-317 0 obj
-<< /Length 318 0 R >>
-stream
-q
-2.4 0 0 -9.9 457.1 448.7 cm
-/R315 Do
-Q
-q
-8.1 0 0 -4.6 460.3 445.7 cm
-/R259 Do
-Q
-q
-1.3 0 0 -3 469.6 442.3 cm
-/R271 Do
-Q
-q
-4.4 0 0 -4.6 473.5 445.7 cm
-/R275 Do
-Q
-q
-1.3 0 0 -3 479.2 442.3 cm
-/R271 Do
-Q
-q
-5.4 0 0 -4.6 483.1 445.7 cm
-/R263 Do
-Q
-q
-1.3 0 0 -3 489.7 442.3 cm
-/R271 Do
-Q
-q
-2.6 0 0 -6.9 493.5 448 cm
-/R307 Do
-Q
-endstream
-endobj
-318 0 obj
-320
-endobj
-319 0 obj
-<< /Type /XObject /Name /R319 /Subtype /Image /Length 320 0 R
-/ImageMask true /Width 24 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 24 /BlackIs1 true >>]
->>
-stream
-,JEO$loTRL4niC`hqS$`rnmKps6nkFp\Y!js6KW5s0(&RK)W@\(KK(`l\2@U?Bm&k<5,",!$D~>
-endstream
-endobj
-320 0 obj
-76
-endobj
-321 0 obj
-<< /Length 322 0 R >>
-stream
-q
-2.4 0 0 -9.9 497.2 448.7 cm
-/R319 Do
-Q
-BT
-/R238 10 Tf
-1 0 0 1 502.679 441.24 Tm
-(to) Tj
-1 0 0 1 512.759 441.24 Tm
-(be) Tj
-1 0 0 1 524.519 441.24 Tm
-(true) Tj
-1 0 0 1 315 429.24 Tm
-(if) Tj
-1 0 0 1 323.64 429.24 Tm
-(and) Tj
-1 0 0 1 340.56 429.24 Tm
-(only) Tj
-1 0 0 1 360.84 429.24 Tm
-(if) Tj
-1 0 0 1 369.48 429.24 Tm
-(replica) Tj
-ET
-q
-2.6 0 0 -6.9 399.3 436 cm
-/R307 Do
-Q
-BT
-1 0 0 1 405.12 429.24 Tm
-(has) Tj
-1 0 0 1 420.96 429.24 Tm
-(inserted) Tj
-1 0 0 1 455.039 429.24 Tm
-(in) Tj
-1 0 0 1 465.359 429.24 Tm
-(its) Tj
-1 0 0 1 477.239 429.24 Tm
-(log:) Tj
-1 0 0 1 496.559 429.24 Tm
-(the) Tj
-1 0 0 1 511.199 429.24 Tm
-(request) Tj
-ET
-q
-8.1 0 0 -4.6 315.2 421.9 cm
-/R259 Do
-Q
-BT
-1 0 0 1 323.76 417.36 Tm
-(,) Tj
-1 0 0 1 328.92 417.36 Tm
-(a) Tj
-1 0 0 1 336 417.36 Tm
-(pre-prepare) Tj
-1 0 0 1 384.48 417.36 Tm
-(for) Tj
-ET
-q
-8.1 0 0 -4.6 399 421.9 cm
-/R259 Do
-Q
-BT
-1 0 0 1 410.16 417.36 Tm
-(in) Tj
-1 0 0 1 420.48 417.36 Tm
-(vie) Tj
-1 0 0 1 432.48 417.36 Tm
-(w) Tj
-ET
-q
-4.4 0 0 -4.6 442.4 421.9 cm
-/R275 Do
-Q
-BT
-1 0 0 1 450.12 417.36 Tm
-(with) Tj
-1 0 0 1 470.399 417.36 Tm
-(sequence) Tj
-1 0 0 1 509.519 417.36 Tm
-(number) Tj
-ET
-q
-5.4 0 0 -4.6 315.2 409.9 cm
-/R263 Do
-Q
-BT
-1 0 0 1 321 405.36 Tm
-(,) Tj
-1 0 0 1 327.84 405.36 Tm
-(and) Tj
-1 0 0 1 346.2 405.36 Tm
-(2) Tj
-ET
-q
-5 0 0 -9.2 351.6 412.5 cm
-/R245 Do
-Q
-BT
-1 0 0 1 361.08 405.36 Tm
-(prepares) Tj
-1 0 0 1 398.76 405.36 Tm
-(from) Tj
-1 0 0 1 422.16 405.36 Tm
-(dif) Tj
-1 0 0 1 433.08 405.36 Tm
-(ferent) Tj
-1 0 0 1 460.08 405.36 Tm
-(backups) Tj
-1 0 0 1 496.679 405.36 Tm
-(that) Tj
-1 0 0 1 515.639 405.36 Tm
-(match) Tj
-1 0 0 1 315 393.48 Tm
-(the) Tj
-1 0 0 1 329.28 393.48 Tm
-(pre-prepare.) Tj
-1 0 0 1 381.24 393.48 Tm
-(The) Tj
-1 0 0 1 398.76 393.48 Tm
-(replicas) Tj
-1 0 0 1 431.88 393.48 Tm
-(v) Tj
-1 0 0 1 436.8 393.48 Tm
-(erify) Tj
-1 0 0 1 457.68 393.48 Tm
-(whether) Tj
-1 0 0 1 492 393.48 Tm
-(the) Tj
-1 0 0 1 506.279 393.48 Tm
-(prepares) Tj
-1 0 0 1 315 381.48 Tm
-(match) Tj
-1 0 0 1 343.56 381.48 Tm
-(the) Tj
-1 0 0 1 360 381.48 Tm
-(pre-prepare) Tj
-1 0 0 1 410.16 381.48 Tm
-(by) Tj
-1 0 0 1 424.44 381.48 Tm
-(checking) Tj
-1 0 0 1 464.64 381.48 Tm
-(that) Tj
-1 0 0 1 483.839 381.48 Tm
-(the) Tj
-1 0 0 1 495.959 381.48 Tm
-(y) Tj
-1 0 0 1 505.079 381.48 Tm
-(ha) Tj
-1 0 0 1 514.319 381.48 Tm
-(v) Tj
-1 0 0 1 519.239 381.48 Tm
-(e) Tj
-1 0 0 1 527.879 381.48 Tm
-(the) Tj
-1 0 0 1 315 369.6 Tm
-(same) Tj
-1 0 0 1 337.92 369.6 Tm
-(vie) Tj
-1 0 0 1 349.92 369.6 Tm
-(w) Tj
-1 0 0 1 356.52 369.6 Tm
-(,) Tj
-1 0 0 1 361.44 369.6 Tm
-(sequence) Tj
-1 0 0 1 400.44 369.6 Tm
-(number) Tj
-1 0 0 1 430.8 369.6 Tm
-(,) Tj
-1 0 0 1 435.48 369.6 Tm
-(and) Tj
-1 0 0 1 452.28 369.6 Tm
-(digest.) Tj
-1 0 0 1 324.96 357.6 Tm
-(The) Tj
-1 0 0 1 343.8 357.6 Tm
-(pre-prepare) Tj
-1 0 0 1 393.12 357.6 Tm
-(and) Tj
-1 0 0 1 410.88 357.6 Tm
-(prepare) Tj
-1 0 0 1 444.12 357.6 Tm
-(phases) Tj
-1 0 0 1 473.999 357.6 Tm
-(of) Tj
-1 0 0 1 485.759 357.6 Tm
-(the) Tj
-1 0 0 1 501.239 357.6 Tm
-(algorithm) Tj
-1 0 0 1 315 345.72 Tm
-(guarantee) Tj
-1 0 0 1 356.76 345.72 Tm
-(that) Tj
-1 0 0 1 374.76 345.72 Tm
-(non-f) Tj
-1 0 0 1 396.48 345.72 Tm
-(aulty) Tj
-1 0 0 1 419.16 345.72 Tm
-(replicas) Tj
-1 0 0 1 453.24 345.72 Tm
-(agree) Tj
-1 0 0 1 477.839 345.72 Tm
-(on) Tj
-1 0 0 1 490.799 345.72 Tm
-(a) Tj
-1 0 0 1 498.239 345.72 Tm
-(total) Tj
-1 0 0 1 518.999 345.72 Tm
-(order) Tj
-1 0 0 1 315 333.72 Tm
-(for) Tj
-1 0 0 1 331.08 333.72 Tm
-(the) Tj
-1 0 0 1 347.76 333.72 Tm
-(requests) Tj
-1 0 0 1 384.84 333.72 Tm
-(within) Tj
-1 0 0 1 414.84 333.72 Tm
-(a) Tj
-1 0 0 1 423.72 333.72 Tm
-(vie) Tj
-1 0 0 1 435.72 333.72 Tm
-(w) Tj
-1 0 0 1 442.32 333.72 Tm
-(.) Tj
-1 0 0 1 454.2 333.72 Tm
-(More) Tj
-1 0 0 1 480.239 333.72 Tm
-(precisely) Tj
-1 0 0 1 515.759 333.72 Tm
-(,) Tj
-1 0 0 1 522.959 333.72 Tm
-(the) Tj
-1 0 0 1 535.079 333.72 Tm
-(y) Tj
-1 0 0 1 315 321.84 Tm
-(ensure) Tj
-1 0 0 1 343.8 321.84 Tm
-(the) Tj
-1 0 0 1 358.68 321.84 Tm
-(follo) Tj
-1 0 0 1 377.4 321.84 Tm
-(wing) Tj
-1 0 0 1 399.96 321.84 Tm
-(in) Tj
-1 0 0 1 407.4 321.84 Tm
-(v) Tj
-1 0 0 1 412.2 321.84 Tm
-(ariant:) Tj
-1 0 0 1 441.6 321.84 Tm
-(if) Tj
-/R252 10 Tf
-1 0 0 1 450.48 321.84 Tm
-(pr) Tj
-1 0 0 1 459 321.84 Tm
-(epar) Tj
-1 0 0 1 476.999 321.84 Tm
-(ed) Tj
-ET
-q
-2.4 0 0 -9.9 487.4 329.3 cm
-/R315 Do
-Q
-q
-8.1 0 0 -4.6 490.5 326.3 cm
-/R259 Do
-Q
-q
-1.3 0 0 -3 499.9 322.9 cm
-/R271 Do
-Q
-q
-4.4 0 0 -4.6 503.7 326.3 cm
-/R275 Do
-Q
-q
-1.3 0 0 -3 509.5 322.9 cm
-/R271 Do
-Q
-q
-5.4 0 0 -4.6 513.3 326.3 cm
-/R263 Do
-Q
-q
-1.3 0 0 -3 519.9 322.9 cm
-/R271 Do
-Q
-q
-2.6 0 0 -6.9 523.8 328.6 cm
-/R307 Do
-Q
-q
-2.4 0 0 -9.9 527.4 329.3 cm
-/R319 Do
-Q
-BT
-/R238 10 Tf
-1 0 0 1 533.399 321.84 Tm
-(is) Tj
-1 0 0 1 315 309.84 Tm
-(true) Tj
-1 0 0 1 332.76 309.84 Tm
-(then) Tj
-/R252 10 Tf
-1 0 0 1 352.08 309.84 Tm
-(pr) Tj
-1 0 0 1 360.6 309.84 Tm
-(epar) Tj
-1 0 0 1 378.6 309.84 Tm
-(ed) Tj
-ET
-q
-2.4 0 0 -9.9 389 317.3 cm
-/R315 Do
-Q
-q
-8.1 0 0 -4.6 392.1 314.3 cm
-/R259 Do
-Q
-endstream
-endobj
-322 0 obj
-4746
-endobj
-323 0 obj
-<< /Type /XObject /Name /R323 /Subtype /Image /Length 324 0 R
-/ImageMask true /Width 17 /Height 37 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 17 /BlackIs1 true >>]
->>
-stream
-2p&%Irsf"qs+g(;pODr+p\l"Z@=(fO!"]~>
-endstream
-endobj
-324 0 obj
-36
-endobj
-325 0 obj
-<< /Length 326 0 R >>
-stream
-q
-1.7 0 0 -3.7 401 317.3 cm
-/R323 Do
-Q
-q
-1.3 0 0 -3 404.1 310.9 cm
-/R271 Do
-Q
-q
-4.4 0 0 -4.6 408 314.3 cm
-/R275 Do
-Q
-q
-1.3 0 0 -3 413.7 310.9 cm
-/R271 Do
-Q
-q
-5.4 0 0 -4.6 417.6 314.3 cm
-/R263 Do
-Q
-q
-1.3 0 0 -3 424.2 310.9 cm
-/R271 Do
-Q
-endstream
-endobj
-326 0 obj
-236
-endobj
-327 0 obj
-<< /Type /XObject /Name /R327 /Subtype /Image /Length 328 0 R
-/ImageMask true /Width 41 /Height 89 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 41 /BlackIs1 true >>]
->>
-stream
-3%oqNe0+KR
-8.TS3gNRT8m0C&=*WH)RhtR$Is*qrFs*qfPpZ+:-rpTR[p\3
-endstream
-endobj
-328 0 obj
-92
-endobj
-329 0 obj
-<< /Length 330 0 R >>
-stream
-q
-4.1 0 0 -8.9 427.6 316.6 cm
-/R327 Do
-Q
-q
-2.4 0 0 -9.9 432.9 317.3 cm
-/R319 Do
-Q
-BT
-/R238 10 Tf
-1 0 0 1 438.48 309.84 Tm
-(is) Tj
-1 0 0 1 447.36 309.84 Tm
-(f) Tj
-1 0 0 1 450.6 309.84 Tm
-(alse) Tj
-1 0 0 1 468.36 309.84 Tm
-(for) Tj
-1 0 0 1 482.16 309.84 Tm
-(an) Tj
-1 0 0 1 491.52 309.84 Tm
-(y) Tj
-1 0 0 1 498.6 309.84 Tm
-(non-f) Tj
-1 0 0 1 520.319 309.84 Tm
-(aulty) Tj
-1 0 0 1 315 297.96 Tm
-(replica) Tj
-ET
-q
-4.1 0 0 -8.9 343.7 304.8 cm
-/R327 Do
-Q
-BT
-1 0 0 1 350.28 297.96 Tm
-(\(including) Tj
-ET
-q
-2.6 0 0 -6.9 393.2 304.8 cm
-/R307 Do
-Q
-endstream
-endobj
-330 0 obj
-535
-endobj
-331 0 obj
-<< /Type /XObject /Name /R331 /Subtype /Image /Length 332 0 R
-/ImageMask true /Width 66 /Height 27 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 66 /BlackIs1 true >>]
->>
-stream
-/e%CP4)j*Wq&BoPm6CdS5Q~>
-endstream
-endobj
-332 0 obj
-25
-endobj
-333 0 obj
-<< /Length 334 0 R >>
-stream
-q
-6.6 0 0 -2.7 399.7 301.9 cm
-/R331 Do
-Q
-q
-4.1 0 0 -8.9 409.5 304.8 cm
-/R327 Do
-Q
-BT
-1 0 0 1 414.36 297.96 Tm
-(\)) Tj
-1 0 0 1 419.52 297.96 Tm
-(and) Tj
-1 0 0 1 435.599 297.96 Tm
-(an) Tj
-1 0 0 1 444.959 297.96 Tm
-(y) Tj
-ET
-q
-8.1 0 0 -4.6 451.9 302.5 cm
-/R259 Do
-Q
-q
-1.7 0 0 -3.7 460.7 305.5 cm
-/R323 Do
-Q
-BT
-1 0 0 1 464.88 297.96 Tm
-(such) Tj
-1 0 0 1 484.92 297.96 Tm
-(that) Tj
-ET
-endstream
-endobj
-334 0 obj
-380
-endobj
-335 0 obj
-<< /Type /XObject /Name /R335 /Subtype /Image /Length 336 0 R
-/ImageMask true /Width 75 /Height 69 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 75 /BlackIs1 true >>]
->>
-stream
--D@i/="t3q:)'T:EY'Q7@JfCQK73IN
-DqmDb@DDO(rqCj@Fs$I.iOf--It,63^V:<:qnMn*^\@b0s+Zm:ht=@d?EiAlYY3Kq%(IruTE5*9~>
-endstream
-endobj
-336 0 obj
-109
-endobj
-337 0 obj
-<< /Length 338 0 R >>
-stream
-q
-7.5 0 0 -6.9 502 304.9 cm
-/R335 Do
-Q
-q
-2.4 0 0 -9.9 511.1 305.5 cm
-/R315 Do
-Q
-q
-8.1 0 0 -4.6 514.3 302.5 cm
-/R259 Do
-Q
-q
-1.7 0 0 -3.7 523.1 305.5 cm
-/R323 Do
-Q
-q
-2.4 0 0 -9.9 526 305.5 cm
-/R319 Do
-Q
-endstream
-endobj
-338 0 obj
-201
-endobj
-339 0 obj
-<< /Type /XObject /Name /R339 /Subtype /Image /Length 340 0 R
-/ImageMask true /Width 51 /Height 94 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 51 /BlackIs1 true >>]
->>
-stream
-,Ll]7
-h=lC.rSQ7WGMW0U^L?$SqnImbmtZC2mf"1&^)d0e]D-=4pilH2n):tW%fYAApCHZh48XMGLM?f3!W~>
-endstream
-endobj
-340 0 obj
-86
-endobj
-341 0 obj
-<< /Length 342 0 R >>
-stream
-q
-5.1 0 0 -9.4 533.5 305.2 cm
-/R339 Do
-Q
-q
-6.6 0 0 -2.7 532.7 301.9 cm
-/R331 Do
-Q
-q
-7.5 0 0 -6.9 315.3 292.9 cm
-/R335 Do
-Q
-q
-2.4 0 0 -9.9 324.4 293.5 cm
-/R315 Do
-Q
-q
-8.1 0 0 -4.6 327.6 290.5 cm
-/R259 Do
-Q
-q
-2.4 0 0 -9.9 336.5 293.5 cm
-/R319 Do
-Q
-BT
-1 0 0 1 339.96 285.96 Tm
-(.) Tj
-1 0 0 1 351.96 285.96 Tm
-(This) Tj
-1 0 0 1 374.04 285.96 Tm
-(is) Tj
-1 0 0 1 385.08 285.96 Tm
-(true) Tj
-1 0 0 1 405.12 285.96 Tm
-(because) Tj
-/R252 10 Tf
-1 0 0 1 441 285.96 Tm
-(pr) Tj
-1 0 0 1 449.52 285.96 Tm
-(epar) Tj
-1 0 0 1 467.52 285.96 Tm
-(ed) Tj
-ET
-q
-2.4 0 0 -9.9 477.9 293.5 cm
-/R315 Do
-Q
-q
-8.1 0 0 -4.6 481 290.5 cm
-/R259 Do
-Q
-q
-1.3 0 0 -3 490.4 287.1 cm
-/R271 Do
-Q
-q
-4.4 0 0 -4.6 494.2 290.5 cm
-/R275 Do
-Q
-q
-1.3 0 0 -3 500 287.1 cm
-/R271 Do
-Q
-q
-5.4 0 0 -4.6 503.8 290.5 cm
-/R263 Do
-Q
-q
-1.3 0 0 -3 510.4 287.1 cm
-/R271 Do
-Q
-q
-2.6 0 0 -6.9 514.3 292.8 cm
-/R307 Do
-Q
-q
-2.4 0 0 -9.9 518 293.5 cm
-/R319 Do
-Q
-BT
-/R238 10 Tf
-1 0 0 1 525.599 285.96 Tm
-(and) Tj
-ET
-endstream
-endobj
-342 0 obj
-945
-endobj
-343 0 obj
-<< /Type /XObject /Name /R343 /Subtype /Image /Length 344 0 R
-/ImageMask true /Width 6 /Height 100 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 6 /BlackIs1 true >>]
->>
-stream
-02qoNs8W-!s8W-!s8W-!s8W-!s8W-!s8Uf'#QTA~>
-endstream
-endobj
-344 0 obj
-42
-endobj
-345 0 obj
-<< /Length 346 0 R >>
-stream
-q
-0.6 0 0 -10 316 281.6 cm
-/R343 Do
-Q
-endstream
-endobj
-346 0 obj
-38
-endobj
-347 0 obj
-<< /Type /XObject /Name /R347 /Subtype /Image /Length 348 0 R
-/ImageMask true /Width 82 /Height 72 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 82 /BlackIs1 true >>]
->>
-stream
--Y/ktlnh'J_1WlVIN>d;OF5k,Do-F.&+/,KrBCW.%mf0XjHsl[XfmH0hq-EWKY$j0J0P"&G5OH\
-%NI1uW$_fE0RLEdqg:VHE;eVks1FCucp-FBHiJ$ama`KH4`C&`>7V$N*[EFX"s^Mb8oRjd(Qr1T!"]/~>
-endstream
-endobj
-348 0 obj
-158
-endobj
-349 0 obj
-<< /Length 350 0 R >>
-stream
-q
-8.2 0 0 -7.2 317.9 281 cm
-/R347 Do
-Q
-q
-0.6 0 0 -10 327.2 281.6 cm
-/R343 Do
-Q
-q
-6.6 0 0 -2.7 332.3 278 cm
-/R331 Do
-Q
-BT
-1 0 0 1 342.24 274.08 Tm
-(3) Tj
-ET
-q
-5 0 0 -9.2 347.7 281.2 cm
-/R245 Do
-Q
-endstream
-endobj
-350 0 obj
-195
-endobj
-351 0 obj
-<< /Type /XObject /Name /R351 /Subtype /Image /Length 352 0 R
-/ImageMask true /Width 66 /Height 65 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 66 /BlackIs1 true >>]
->>
-stream
-,BZ6Ns8W-!s8W-!s-Eq9Iaj?!s8W-!s8W-!s8Uf'#QTA~>
-endstream
-endobj
-352 0 obj
-47
-endobj
-353 0 obj
-<< /Length 354 0 R >>
-stream
-q
-6.6 0 0 -6.5 355 279.9 cm
-/R351 Do
-Q
-BT
-1 0 0 1 363.48 274.08 Tm
-(1) Tj
-1 0 0 1 370.44 274.08 Tm
-(imply) Tj
-1 0 0 1 395.76 274.08 Tm
-(that) Tj
-1 0 0 1 412.8 274.08 Tm
-(at) Tj
-1 0 0 1 422.04 274.08 Tm
-(least) Tj
-ET
-q
-5 0 0 -9.2 442.7 281.2 cm
-/R245 Do
-Q
-q
-6.6 0 0 -6.5 450 279.9 cm
-/R351 Do
-Q
-BT
-1 0 0 1 458.519 274.08 Tm
-(1) Tj
-1 0 0 1 465.599 274.08 Tm
-(non-f) Tj
-1 0 0 1 487.319 274.08 Tm
-(aulty) Tj
-1 0 0 1 509.039 274.08 Tm
-(replicas) Tj
-1 0 0 1 315 262.08 Tm
-(ha) Tj
-1 0 0 1 324.24 262.08 Tm
-(v) Tj
-1 0 0 1 329.16 262.08 Tm
-(e) Tj
-1 0 0 1 336.36 262.08 Tm
-(sent) Tj
-1 0 0 1 355.32 262.08 Tm
-(a) Tj
-1 0 0 1 362.64 262.08 Tm
-(pre-prepare) Tj
-1 0 0 1 411.48 262.08 Tm
-(or) Tj
-1 0 0 1 422.64 262.08 Tm
-(prepare) Tj
-1 0 0 1 455.399 262.08 Tm
-(for) Tj
-ET
-q
-8.1 0 0 -4.6 470.1 266.6 cm
-/R259 Do
-Q
-BT
-1 0 0 1 481.559 262.08 Tm
-(in) Tj
-1 0 0 1 492.239 262.08 Tm
-(vie) Tj
-1 0 0 1 504.239 262.08 Tm
-(w) Tj
-ET
-q
-4.4 0 0 -4.6 514.4 266.6 cm
-/R275 Do
-Q
-BT
-1 0 0 1 522.239 262.08 Tm
-(with) Tj
-1 0 0 1 315 250.2 Tm
-(sequence) Tj
-1 0 0 1 356.4 250.2 Tm
-(number) Tj
-ET
-q
-5.4 0 0 -4.6 392 254.7 cm
-/R263 Do
-Q
-BT
-1 0 0 1 397.8 250.2 Tm
-(.) Tj
-1 0 0 1 411.24 250.2 Tm
-(Thus,) Tj
-1 0 0 1 439.2 250.2 Tm
-(for) Tj
-/R252 10 Tf
-1 0 0 1 455.76 250.2 Tm
-(pr) Tj
-1 0 0 1 464.28 250.2 Tm
-(epar) Tj
-1 0 0 1 482.28 250.2 Tm
-(ed) Tj
-ET
-q
-2.4 0 0 -9.9 492.7 257.7 cm
-/R315 Do
-Q
-q
-8.1 0 0 -4.6 495.8 254.7 cm
-/R259 Do
-Q
-q
-1.7 0 0 -3.7 504.7 257.7 cm
-/R323 Do
-Q
-q
-1.3 0 0 -3 507.8 251.3 cm
-/R271 Do
-Q
-q
-4.4 0 0 -4.6 511.6 254.7 cm
-/R275 Do
-Q
-q
-1.3 0 0 -3 517.4 251.3 cm
-/R271 Do
-Q
-q
-5.4 0 0 -4.6 521.2 254.7 cm
-/R263 Do
-Q
-q
-1.3 0 0 -3 527.8 251.3 cm
-/R271 Do
-Q
-q
-4.1 0 0 -8.9 531.3 257 cm
-/R327 Do
-Q
-q
-2.4 0 0 -9.9 536.6 257.7 cm
-/R319 Do
-Q
-BT
-/R238 10 Tf
-1 0 0 1 315 238.2 Tm
-(to) Tj
-1 0 0 1 326.76 238.2 Tm
-(be) Tj
-1 0 0 1 340.08 238.2 Tm
-(true) Tj
-1 0 0 1 359.64 238.2 Tm
-(at) Tj
-1 0 0 1 370.8 238.2 Tm
-(least) Tj
-1 0 0 1 393 238.2 Tm
-(one) Tj
-1 0 0 1 411.36 238.2 Tm
-(of) Tj
-1 0 0 1 423.72 238.2 Tm
-(these) Tj
-1 0 0 1 448.2 238.2 Tm
-(replicas) Tj
-1 0 0 1 483.119 238.2 Tm
-(needs) Tj
-1 0 0 1 509.759 238.2 Tm
-(to) Tj
-1 0 0 1 521.519 238.2 Tm
-(ha) Tj
-1 0 0 1 530.759 238.2 Tm
-(v) Tj
-1 0 0 1 535.679 238.2 Tm
-(e) Tj
-1 0 0 1 315 226.32 Tm
-(sent) Tj
-1 0 0 1 333.96 226.32 Tm
-(tw) Tj
-1 0 0 1 343.8 226.32 Tm
-(o) Tj
-1 0 0 1 351.6 226.32 Tm
-(con\257icting) Tj
-1 0 0 1 397.2 226.32 Tm
-(prepares) Tj
-1 0 0 1 433.8 226.32 Tm
-(\(or) Tj
-1 0 0 1 448.319 226.32 Tm
-(pre-prepares) Tj
-1 0 0 1 500.879 226.32 Tm
-(if) Tj
-1 0 0 1 509.879 226.32 Tm
-(it) Tj
-1 0 0 1 518.279 226.32 Tm
-(is) Tj
-1 0 0 1 527.879 226.32 Tm
-(the) Tj
-1 0 0 1 315 214.32 Tm
-(primary) Tj
-1 0 0 1 350.64 214.32 Tm
-(for) Tj
-ET
-q
-4.4 0 0 -4.6 366.7 218.8 cm
-/R275 Do
-Q
-BT
-1 0 0 1 371.64 214.32 Tm
-(\),) Tj
-1 0 0 1 381.96 214.32 Tm
-(i.e.,) Tj
-1 0 0 1 401.16 214.32 Tm
-(tw) Tj
-1 0 0 1 411 214.32 Tm
-(o) Tj
-1 0 0 1 420.24 214.32 Tm
-(prepares) Tj
-1 0 0 1 458.04 214.32 Tm
-(with) Tj
-1 0 0 1 479.999 214.32 Tm
-(the) Tj
-1 0 0 1 496.319 214.32 Tm
-(same) Tj
-1 0 0 1 520.919 214.32 Tm
-(vie) Tj
-1 0 0 1 532.919 214.32 Tm
-(w) Tj
-1 0 0 1 315 202.32 Tm
-(and) Tj
-1 0 0 1 332.4 202.32 Tm
-(sequence) Tj
-1 0 0 1 371.88 202.32 Tm
-(number) Tj
-1 0 0 1 405.36 202.32 Tm
-(and) Tj
-1 0 0 1 422.76 202.32 Tm
-(a) Tj
-1 0 0 1 430.08 202.32 Tm
-(dif) Tj
-1 0 0 1 441 202.32 Tm
-(ferent) Tj
-1 0 0 1 467.159 202.32 Tm
-(digest.) Tj
-1 0 0 1 498.599 202.32 Tm
-(But) Tj
-1 0 0 1 515.999 202.32 Tm
-(this) Tj
-1 0 0 1 533.399 202.32 Tm
-(is) Tj
-1 0 0 1 315 190.44 Tm
-(not) Tj
-1 0 0 1 329.88 190.44 Tm
-(possible) Tj
-1 0 0 1 364.8 190.44 Tm
-(because) Tj
-1 0 0 1 398.52 190.44 Tm
-(the) Tj
-1 0 0 1 412.8 190.44 Tm
-(replica) Tj
-1 0 0 1 442.2 190.44 Tm
-(is) Tj
-1 0 0 1 450.959 190.44 Tm
-(not) Tj
-1 0 0 1 465.959 190.44 Tm
-(f) Tj
-1 0 0 1 469.199 190.44 Tm
-(aulty) Tj
-1 0 0 1 488.639 190.44 Tm
-(.) Tj
-1 0 0 1 494.399 190.44 Tm
-(Finally) Tj
-1 0 0 1 522.119 190.44 Tm
-(,) Tj
-1 0 0 1 526.679 190.44 Tm
-(our) Tj
-1 0 0 1 315 178.44 Tm
-(assumption) Tj
-1 0 0 1 362.28 178.44 Tm
-(about) Tj
-1 0 0 1 386.4 178.44 Tm
-(the) Tj
-1 0 0 1 400.56 178.44 Tm
-(strength) Tj
-1 0 0 1 434.52 178.44 Tm
-(of) Tj
-1 0 0 1 444.84 178.44 Tm
-(message) Tj
-1 0 0 1 480.479 178.44 Tm
-(digests) Tj
-1 0 0 1 510.119 178.44 Tm
-(ensures) Tj
-1 0 0 1 315 166.56 Tm
-(that) Tj
-1 0 0 1 332.52 166.56 Tm
-(the) Tj
-1 0 0 1 347.28 166.56 Tm
-(probability) Tj
-1 0 0 1 393.6 166.56 Tm
-(that) Tj
-ET
-q
-8.1 0 0 -4.6 411.3 171.1 cm
-/R259 Do
-Q
-q
-5.1 0 0 -9.4 424.1 173.8 cm
-/R339 Do
-Q
-q
-6.6 0 0 -2.7 423.3 170.5 cm
-/R331 Do
-Q
-q
-8.1 0 0 -4.6 433.5 171.1 cm
-/R259 Do
-Q
-q
-1.7 0 0 -3.7 442.4 174.1 cm
-/R323 Do
-Q
-BT
-1 0 0 1 447.48 166.56 Tm
-(and) Tj
-ET
-q
-7.5 0 0 -6.9 464.7 173.5 cm
-/R335 Do
-Q
-q
-2.4 0 0 -9.9 473.8 174.1 cm
-/R315 Do
-Q
-q
-8.1 0 0 -4.6 477 171.1 cm
-/R259 Do
-Q
-q
-2.4 0 0 -9.9 485.9 174.1 cm
-/R319 Do
-Q
-q
-6.6 0 0 -2.7 492.9 170.5 cm
-/R331 Do
-Q
-q
-7.5 0 0 -6.9 503.2 173.5 cm
-/R335 Do
-Q
-q
-2.4 0 0 -9.9 512.3 174.1 cm
-/R315 Do
-Q
-q
-8.1 0 0 -4.6 515.5 171.1 cm
-/R259 Do
-Q
-q
-1.7 0 0 -3.7 524.3 174.1 cm
-/R323 Do
-Q
-q
-2.4 0 0 -9.9 527.3 174.1 cm
-/R319 Do
-Q
-BT
-1 0 0 1 533.4 166.56 Tm
-(is) Tj
-1 0 0 1 315 154.56 Tm
-(ne) Tj
-1 0 0 1 324.36 154.56 Tm
-(gligible.) Tj
-1 0 0 1 324.96 142.68 Tm
-(Replica) Tj
-ET
-q
-2.6 0 0 -6.9 357.3 149.5 cm
-/R307 Do
-Q
-BT
-1 0 0 1 362.28 142.68 Tm
-(multicasts) Tj
-1 0 0 1 404.4 142.68 Tm
-(a) Tj
-ET
-q
-2.4 0 0 -9.9 411.4 150.2 cm
-/R267 Do
-Q
-BT
-/R238 8 Tf
-1 0 0 1 414.36 142.68 Tm
-(COMMIT) Tj
-ET
-q
-1.3 0 0 -3 447.9 143.8 cm
-/R271 Do
-Q
-q
-4.4 0 0 -4.6 451.8 147.2 cm
-/R275 Do
-Q
-q
-1.3 0 0 -3 457.5 143.8 cm
-/R271 Do
-Q
-q
-5.4 0 0 -4.6 461.4 147.2 cm
-/R263 Do
-Q
-q
-1.3 0 0 -3 468 143.8 cm
-/R271 Do
-Q
-q
-7.5 0 0 -6.9 471.9 149.6 cm
-/R335 Do
-Q
-q
-2.4 0 0 -9.9 481 150.2 cm
-/R315 Do
-Q
-q
-8.1 0 0 -4.6 484.2 147.2 cm
-/R259 Do
-Q
-q
-2.4 0 0 -9.9 493.1 150.2 cm
-/R319 Do
-Q
-q
-1.3 0 0 -3 497.4 143.8 cm
-/R271 Do
-Q
-q
-2.6 0 0 -6.9 501.2 149.5 cm
-/R307 Do
-Q
-q
-2.4 0 0 -9.9 504.9 150.2 cm
-/R283 Do
-Q
-q
-4.2 0 0 -3.1 508.5 144.2 cm
-/R287 Do
-Q
-q
-1.7 0 0 -3.5 513.2 143.8 cm
-/R311 Do
-Q
-BT
-/R238 10 Tf
-1 0 0 1 518.4 142.68 Tm
-(to) Tj
-1 0 0 1 527.88 142.68 Tm
-(the) Tj
-1 0 0 1 315 130.68 Tm
-(other) Tj
-1 0 0 1 339.24 130.68 Tm
-(replicas) Tj
-1 0 0 1 374.04 130.68 Tm
-(when) Tj
-/R252 10 Tf
-1 0 0 1 399.36 130.68 Tm
-(pr) Tj
-1 0 0 1 407.88 130.68 Tm
-(epar) Tj
-1 0 0 1 425.88 130.68 Tm
-(ed) Tj
-ET
-q
-2.4 0 0 -9.9 436.3 138.2 cm
-/R315 Do
-Q
-q
-8.1 0 0 -4.6 439.4 135.2 cm
-/R259 Do
-Q
-q
-1.3 0 0 -3 448.8 131.8 cm
-/R271 Do
-Q
-q
-4.4 0 0 -4.6 452.6 135.2 cm
-/R275 Do
-Q
-q
-1.3 0 0 -3 458.4 131.8 cm
-/R271 Do
-Q
-q
-5.4 0 0 -4.6 462.2 135.2 cm
-/R263 Do
-Q
-q
-1.3 0 0 -3 468.8 131.8 cm
-/R271 Do
-Q
-q
-2.6 0 0 -6.9 472.6 137.5 cm
-/R307 Do
-Q
-q
-2.4 0 0 -9.9 476.3 138.2 cm
-/R319 Do
-Q
-BT
-/R238 10 Tf
-1 0 0 1 483.359 130.68 Tm
-(becomes) Tj
-1 0 0 1 521.999 130.68 Tm
-(true.) Tj
-1 0 0 1 315 118.8 Tm
-(This) Tj
-1 0 0 1 336.24 118.8 Tm
-(starts) Tj
-1 0 0 1 360.84 118.8 Tm
-(the) Tj
-1 0 0 1 376.68 118.8 Tm
-(commit) Tj
-1 0 0 1 410.64 118.8 Tm
-(phase.) Tj
-1 0 0 1 442.68 118.8 Tm
-(Replicas) Tj
-1 0 0 1 480.479 118.8 Tm
-(accept) Tj
-1 0 0 1 509.519 118.8 Tm
-(commit) Tj
-1 0 0 1 315 106.8 Tm
-(messages) Tj
-1 0 0 1 355.68 106.8 Tm
-(and) Tj
-1 0 0 1 373.2 106.8 Tm
-(insert) Tj
-1 0 0 1 398.4 106.8 Tm
-(them) Tj
-1 0 0 1 421.44 106.8 Tm
-(in) Tj
-1 0 0 1 432.24 106.8 Tm
-(their) Tj
-1 0 0 1 453.599 106.8 Tm
-(log) Tj
-1 0 0 1 469.439 106.8 Tm
-(pro) Tj
-1 0 0 1 482.759 106.8 Tm
-(vided) Tj
-1 0 0 1 507.719 106.8 Tm
-(the) Tj
-1 0 0 1 519.839 106.8 Tm
-(y) Tj
-1 0 0 1 527.879 106.8 Tm
-(are) Tj
-1 0 0 1 315 94.92 Tm
-(properly) Tj
-1 0 0 1 350.88 94.92 Tm
-(signed,) Tj
-1 0 0 1 381.6 94.92 Tm
-(the) Tj
-1 0 0 1 395.88 94.92 Tm
-(vie) Tj
-1 0 0 1 407.88 94.92 Tm
-(w) Tj
-1 0 0 1 417.12 94.92 Tm
-(number) Tj
-1 0 0 1 449.64 94.92 Tm
-(in) Tj
-1 0 0 1 459.479 94.92 Tm
-(the) Tj
-1 0 0 1 473.759 94.92 Tm
-(message) Tj
-1 0 0 1 509.639 94.92 Tm
-(is) Tj
-1 0 0 1 518.399 94.92 Tm
-(equal) Tj
-1 0 0 1 315 82.92 Tm
-(to) Tj
-1 0 0 1 325.2 82.92 Tm
-(the) Tj
-1 0 0 1 339.84 82.92 Tm
-(replica') Tj
-1 0 0 1 369.84 82.92 Tm
-(s) Tj
-1 0 0 1 375.96 82.92 Tm
-(current) Tj
-1 0 0 1 406.68 82.92 Tm
-(vie) Tj
-1 0 0 1 418.68 82.92 Tm
-(w) Tj
-1 0 0 1 425.28 82.92 Tm
-(,) Tj
-1 0 0 1 430.08 82.92 Tm
-(and) Tj
-1 0 0 1 446.879 82.92 Tm
-(the) Tj
-1 0 0 1 461.519 82.92 Tm
-(sequence) Tj
-1 0 0 1 500.519 82.92 Tm
-(number) Tj
-1 0 0 1 533.399 82.92 Tm
-(is) Tj
-1 0 0 1 315 71.04 Tm
-(between) Tj
-ET
-q
-5 0 0 -7.1 351 78 cm
-/R299 Do
-Q
-BT
-1 0 0 1 358.92 71.04 Tm
-(and) Tj
-ET
-q
-8.4 0 0 -6.9 376.1 77.9 cm
-/R303 Do
-Q
-BT
-1 0 0 1 303.48 35.16 Tm
-(4) Tj
-ET
-Q
-endstream
-endobj
-354 0 obj
-8348
-endobj
-355 0 obj
-<<
-/Type /Page
-/MediaBox [0 0 612 792]
-/Parent 2 0 R
-/Resources << /ProcSet [/PDF /ImageB /Text]
-/Font <<
-/R252 252 0 R
-/R249 249 0 R
-/R238 238 0 R
->>
-/XObject <<
-/R303 303 0 R
-/R299 299 0 R
-/R319 319 0 R
-/R307 307 0 R
-/R271 271 0 R
-/R263 263 0 R
-/R275 275 0 R
-/R259 259 0 R
-/R315 315 0 R
-/R311 311 0 R
-/R287 287 0 R
-/R283 283 0 R
-/R335 335 0 R
-/R267 267 0 R
-/R323 323 0 R
-/R331 331 0 R
-/R339 339 0 R
-/R327 327 0 R
-/R351 351 0 R
-/R245 245 0 R
-/R343 343 0 R
-/R347 347 0 R
-/R279 279 0 R
-/R291 291 0 R
-/R295 295 0 R
-/R255 255 0 R
-/R241 241 0 R
->>
->>
-/Contents [
-239 0 R
-243 0 R
-247 0 R
-250 0 R
-253 0 R
-257 0 R
-261 0 R
-265 0 R
-269 0 R
-273 0 R
-277 0 R
-281 0 R
-285 0 R
-289 0 R
-293 0 R
-297 0 R
-301 0 R
-305 0 R
-309 0 R
-313 0 R
-317 0 R
-321 0 R
-325 0 R
-329 0 R
-333 0 R
-337 0 R
-341 0 R
-345 0 R
-349 0 R
-353 0 R
-]
->>
-endobj
-356 0 obj
-<< /Type /Font /Name /R356 /Subtype /Type1 /BaseFont /Times-Roman >>
-endobj
-357 0 obj
-<< /Length 358 0 R >>
-stream
-q
-BT
-/R356 10 Tf
-1 0 0 1 81.96 709.08 Tm
-(W) Tj
-1 0 0 1 90.48 709.08 Tm
-(e) Tj
-1 0 0 1 98.5199 709.08 Tm
-(de\256ne) Tj
-1 0 0 1 126.36 709.08 Tm
-(the) Tj
-ET
-endstream
-endobj
-358 0 obj
-156
-endobj
-359 0 obj
-<< /Type /Font /Name /R359 /Subtype /Type1 /BaseFont /Times-Italic >>
-endobj
-360 0 obj
-<< /Length 361 0 R >>
-stream
-BT
-/R359 10 Tf
-1 0 0 1 142.08 709.08 Tm
-(committed) Tj
-/R356 10 Tf
-1 0 0 1 187.08 709.08 Tm
-(and) Tj
-/R359 10 Tf
-1 0 0 1 204.96 709.08 Tm
-(committed-local) Tj
-/R356 10 Tf
-1 0 0 1 273.239 709.08 Tm
-(predi-) Tj
-1 0 0 1 72 697.08 Tm
-(cates) Tj
-1 0 0 1 94.9199 697.08 Tm
-(as) Tj
-1 0 0 1 106.32 697.08 Tm
-(follo) Tj
-1 0 0 1 125.04 697.08 Tm
-(ws:) Tj
-/R359 10 Tf
-1 0 0 1 143.4 697.08 Tm
-(committed) Tj
-ET
-Q
-q
-W
-0 0 612 792 re
-n
-endstream
-endobj
-361 0 obj
-422
-endobj
-362 0 obj
-<< /Type /XObject /Name /R362 /Subtype /Image /Length 363 0 R
-/ImageMask true /Width 24 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 24 /BlackIs1 true >>]
->>
-stream
-+rF]%*LO8IHL@*j8[taqp!<~>
-endstream
-endobj
-363 0 obj
-80
-endobj
-364 0 obj
-<< /Length 365 0 R >>
-stream
-q
-2.4 0 0 -9.9 185.9 704.6 cm
-/R362 Do
-Q
-endstream
-endobj
-365 0 obj
-41
-endobj
-366 0 obj
-<< /Type /XObject /Name /R366 /Subtype /Image /Length 367 0 R
-/ImageMask true /Width 81 /Height 46 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 81 /BlackIs1 true >>]
->>
-stream
-4N`CV%M3$8612U>:Ag"NnFZb
-endstream
-endobj
-367 0 obj
-139
-endobj
-368 0 obj
-<< /Length 369 0 R >>
-stream
-q
-8.1 0 0 -4.6 189.1 701.6 cm
-/R366 Do
-Q
-endstream
-endobj
-369 0 obj
-41
-endobj
-370 0 obj
-<< /Type /XObject /Name /R370 /Subtype /Image /Length 371 0 R
-/ImageMask true /Width 13 /Height 30 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 13 /BlackIs1 true >>]
->>
-stream
-0g^A/h=&*equ,LR2Xj(@lh_"t-iec'~>
-endstream
-endobj
-371 0 obj
-33
-endobj
-372 0 obj
-<< /Length 373 0 R >>
-stream
-q
-1.3 0 0 -3 198.4 698.2 cm
-/R370 Do
-Q
-endstream
-endobj
-373 0 obj
-39
-endobj
-374 0 obj
-<< /Type /XObject /Name /R374 /Subtype /Image /Length 375 0 R
-/ImageMask true /Width 44 /Height 46 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 44 /BlackIs1 true >>]
->>
-stream
-2$jBq
-&9R,hkFhTE_G0fRqg[T's0obU5O\AciSX+=pUN/*r',Z@_Z&BgfC8fKf@@X?]DE=DTC?6WJ-Z.*~>
-endstream
-endobj
-375 0 obj
-84
-endobj
-376 0 obj
-<< /Length 377 0 R >>
-stream
-q
-4.4 0 0 -4.6 202.3 701.6 cm
-/R374 Do
-Q
-q
-1.3 0 0 -3 208 698.2 cm
-/R370 Do
-Q
-endstream
-endobj
-377 0 obj
-78
-endobj
-378 0 obj
-<< /Type /XObject /Name /R378 /Subtype /Image /Length 379 0 R
-/ImageMask true /Width 54 /Height 46 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 54 /BlackIs1 true >>]
->>
-stream
-4N]t,$m>7rl/"o@d!re,
-pYTohhg]lis4_o!aocV_^Yur>rVsXfR^`8
-endstream
-endobj
-379 0 obj
-102
-endobj
-380 0 obj
-<< /Length 381 0 R >>
-stream
-q
-5.4 0 0 -4.6 211.9 701.6 cm
-/R378 Do
-Q
-endstream
-endobj
-381 0 obj
-41
-endobj
-382 0 obj
-<< /Type /XObject /Name /R382 /Subtype /Image /Length 383 0 R
-/ImageMask true /Width 24 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 24 /BlackIs1 true >>]
->>
-stream
-,JEO$loTRL4niC`hqS$`rnmKps6nkFp\Y!js6KW5s0(&RK)W@\(KK(`l\2@U?Bm&k<5,",!$D~>
-endstream
-endobj
-383 0 obj
-76
-endobj
-384 0 obj
-<< /Length 385 0 R >>
-stream
-q
-2.4 0 0 -9.9 218.1 704.6 cm
-/R382 Do
-Q
-BT
-/R356 10 Tf
-1 0 0 1 224.519 697.08 Tm
-(is) Tj
-1 0 0 1 234.239 697.08 Tm
-(true) Tj
-1 0 0 1 252.719 697.08 Tm
-(if) Tj
-1 0 0 1 261.839 697.08 Tm
-(and) Tj
-1 0 0 1 279.239 697.08 Tm
-(only) Tj
-1 0 0 1 72 685.2 Tm
-(if) Tj
-/R359 10 Tf
-1 0 0 1 82.44 685.2 Tm
-(pr) Tj
-1 0 0 1 90.9599 685.2 Tm
-(epar) Tj
-1 0 0 1 108.96 685.2 Tm
-(ed) Tj
-ET
-q
-2.4 0 0 -9.9 119.3 692.7 cm
-/R362 Do
-Q
-q
-8.1 0 0 -4.6 122.5 689.7 cm
-/R366 Do
-Q
-q
-1.3 0 0 -3 131.8 686.3 cm
-/R370 Do
-Q
-q
-4.4 0 0 -4.6 135.7 689.7 cm
-/R374 Do
-Q
-q
-1.3 0 0 -3 141.4 686.3 cm
-/R370 Do
-Q
-q
-5.4 0 0 -4.6 145.3 689.7 cm
-/R378 Do
-Q
-q
-1.3 0 0 -3 151.9 686.3 cm
-/R370 Do
-Q
-endstream
-endobj
-385 0 obj
-653
-endobj
-386 0 obj
-<< /Type /XObject /Name /R386 /Subtype /Image /Length 387 0 R
-/ImageMask true /Width 26 /Height 69 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 26 /BlackIs1 true >>]
->>
-stream
--R^*Zl/YrmIf:DfhtVWo^UNqc%K6'1s*addX2"DHrSQB/+4u(tp(mUa[G\kks2oQE"5iR%(OubkJ,~>
-endstream
-endobj
-387 0 obj
-80
-endobj
-388 0 obj
-<< /Length 389 0 R >>
-stream
-q
-2.6 0 0 -6.9 155.7 692 cm
-/R386 Do
-Q
-q
-2.4 0 0 -9.9 159.4 692.7 cm
-/R382 Do
-Q
-BT
-/R356 10 Tf
-1 0 0 1 166.92 685.2 Tm
-(is) Tj
-1 0 0 1 177.96 685.2 Tm
-(true) Tj
-1 0 0 1 197.76 685.2 Tm
-(for) Tj
-1 0 0 1 213.719 685.2 Tm
-(all) Tj
-ET
-q
-2.6 0 0 -6.9 228.2 692 cm
-/R386 Do
-Q
-BT
-1 0 0 1 235.799 685.2 Tm
-(in) Tj
-1 0 0 1 247.919 685.2 Tm
-(some) Tj
-1 0 0 1 273.239 685.2 Tm
-(set) Tj
-1 0 0 1 288.719 685.2 Tm
-(of) Tj
-ET
-endstream
-endobj
-389 0 obj
-411
-endobj
-390 0 obj
-<< /Type /XObject /Name /R390 /Subtype /Image /Length 391 0 R
-/ImageMask true /Width 50 /Height 92 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 50 /BlackIs1 true >>]
->>
-stream
-5$eL7-b:K3p0<%?
-h1u#R]2'Mug].5is7$!eqtL-hqu?EZs5/V3iQXZVs7/ihqu?EZs4QRbJe-ans*o2/4DdB_@6aqq5Q~>
-endstream
-endobj
-391 0 obj
-96
-endobj
-392 0 obj
-<< /Length 393 0 R >>
-stream
-q
-5 0 0 -9.2 72.4 680.3 cm
-/R390 Do
-Q
-endstream
-endobj
-393 0 obj
-38
-endobj
-394 0 obj
-<< /Type /XObject /Name /R394 /Subtype /Image /Length 395 0 R
-/ImageMask true /Width 66 /Height 65 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 66 /BlackIs1 true >>]
->>
-stream
-,BZ6Ns8W-!s8W-!s-Eq9Iaj?!s8W-!s8W-!s8Uf'#QTA~>
-endstream
-endobj
-395 0 obj
-47
-endobj
-396 0 obj
-<< /Length 397 0 R >>
-stream
-q
-6.6 0 0 -6.5 78.9 679 cm
-/R394 Do
-Q
-BT
-1 0 0 1 86.5199 673.2 Tm
-(1) Tj
-1 0 0 1 93.2399 673.2 Tm
-(non-f) Tj
-1 0 0 1 114.96 673.2 Tm
-(aulty) Tj
-1 0 0 1 136.68 673.2 Tm
-(replicas;) Tj
-1 0 0 1 171.84 673.2 Tm
-(and) Tj
-/R359 10 Tf
-1 0 0 1 188.04 673.2 Tm
-(committed-local) Tj
-ET
-q
-2.4 0 0 -9.9 254 680.7 cm
-/R362 Do
-Q
-q
-8.1 0 0 -4.6 257.1 677.7 cm
-/R366 Do
-Q
-q
-1.3 0 0 -3 266.5 674.3 cm
-/R370 Do
-Q
-q
-4.4 0 0 -4.6 270.3 677.7 cm
-/R374 Do
-Q
-q
-1.3 0 0 -3 276.1 674.3 cm
-/R370 Do
-Q
-q
-5.4 0 0 -4.6 279.9 677.7 cm
-/R378 Do
-Q
-q
-1.3 0 0 -3 286.5 674.3 cm
-/R370 Do
-Q
-q
-2.6 0 0 -6.9 290.4 680 cm
-/R386 Do
-Q
-q
-2.4 0 0 -9.9 294 680.7 cm
-/R382 Do
-Q
-BT
-/R356 10 Tf
-1 0 0 1 72 661.32 Tm
-(is) Tj
-1 0 0 1 80.88 661.32 Tm
-(true) Tj
-1 0 0 1 98.7599 661.32 Tm
-(if) Tj
-1 0 0 1 107.04 661.32 Tm
-(and) Tj
-1 0 0 1 123.72 661.32 Tm
-(only) Tj
-1 0 0 1 143.76 661.32 Tm
-(if) Tj
-/R359 10 Tf
-1 0 0 1 152.16 661.32 Tm
-(pr) Tj
-1 0 0 1 160.68 661.32 Tm
-(epar) Tj
-1 0 0 1 178.68 661.32 Tm
-(ed) Tj
-ET
-q
-2.4 0 0 -9.9 189.1 668.8 cm
-/R362 Do
-Q
-q
-8.1 0 0 -4.6 192.2 665.8 cm
-/R366 Do
-Q
-q
-1.3 0 0 -3 201.6 662.4 cm
-/R370 Do
-Q
-q
-4.4 0 0 -4.6 205.4 665.8 cm
-/R374 Do
-Q
-q
-1.3 0 0 -3 211.2 662.4 cm
-/R370 Do
-Q
-q
-5.4 0 0 -4.6 215 665.8 cm
-/R378 Do
-Q
-q
-1.3 0 0 -3 221.6 662.4 cm
-/R370 Do
-Q
-q
-2.6 0 0 -6.9 225.4 668.1 cm
-/R386 Do
-Q
-q
-2.4 0 0 -9.9 229.1 668.8 cm
-/R382 Do
-Q
-BT
-/R356 10 Tf
-1 0 0 1 234.599 661.32 Tm
-(is) Tj
-1 0 0 1 243.479 661.32 Tm
-(true) Tj
-1 0 0 1 261.359 661.32 Tm
-(and) Tj
-ET
-q
-2.6 0 0 -6.9 278.2 668.1 cm
-/R386 Do
-Q
-BT
-1 0 0 1 283.679 661.32 Tm
-(has) Tj
-1 0 0 1 72 649.32 Tm
-(accepted) Tj
-1 0 0 1 110.64 649.32 Tm
-(2) Tj
-ET
-q
-5 0 0 -9.2 116.1 656.4 cm
-/R390 Do
-Q
-q
-6.6 0 0 -6.5 124.9 655.1 cm
-/R394 Do
-Q
-BT
-1 0 0 1 135.12 649.32 Tm
-(1) Tj
-1 0 0 1 143.88 649.32 Tm
-(commits) Tj
-1 0 0 1 181.92 649.32 Tm
-(\(possibly) Tj
-1 0 0 1 222.24 649.32 Tm
-(including) Tj
-1 0 0 1 263.639 649.32 Tm
-(its) Tj
-1 0 0 1 276.719 649.32 Tm
-(o) Tj
-1 0 0 1 281.519 649.32 Tm
-(wn\)) Tj
-1 0 0 1 72 637.44 Tm
-(from) Tj
-1 0 0 1 93.8399 637.44 Tm
-(dif) Tj
-1 0 0 1 104.76 637.44 Tm
-(ferent) Tj
-1 0 0 1 130.44 637.44 Tm
-(replicas) Tj
-1 0 0 1 163.92 637.44 Tm
-(that) Tj
-1 0 0 1 181.44 637.44 Tm
-(match) Tj
-1 0 0 1 208.2 637.44 Tm
-(the) Tj
-1 0 0 1 222.959 637.44 Tm
-(pre-prepare) Tj
-1 0 0 1 271.319 637.44 Tm
-(for) Tj
-ET
-q
-8.1 0 0 -4.6 285.7 641.9 cm
-/R366 Do
-Q
-BT
-1 0 0 1 294.239 637.44 Tm
-(;) Tj
-1 0 0 1 72 625.44 Tm
-(a) Tj
-1 0 0 1 80.0399 625.44 Tm
-(commit) Tj
-1 0 0 1 114.24 625.44 Tm
-(matches) Tj
-1 0 0 1 150.48 625.44 Tm
-(a) Tj
-1 0 0 1 158.64 625.44 Tm
-(pre-prepare) Tj
-1 0 0 1 208.2 625.44 Tm
-(if) Tj
-1 0 0 1 217.92 625.44 Tm
-(the) Tj
-1 0 0 1 230.04 625.44 Tm
-(y) Tj
-1 0 0 1 238.559 625.44 Tm
-(ha) Tj
-1 0 0 1 247.799 625.44 Tm
-(v) Tj
-1 0 0 1 252.719 625.44 Tm
-(e) Tj
-1 0 0 1 260.639 625.44 Tm
-(the) Tj
-1 0 0 1 276.479 625.44 Tm
-(same) Tj
-1 0 0 1 72 613.44 Tm
-(vie) Tj
-1 0 0 1 84 613.44 Tm
-(w) Tj
-1 0 0 1 90.6 613.44 Tm
-(,) Tj
-1 0 0 1 95.4 613.44 Tm
-(sequence) Tj
-1 0 0 1 134.4 613.44 Tm
-(number) Tj
-1 0 0 1 164.76 613.44 Tm
-(,) Tj
-1 0 0 1 169.44 613.44 Tm
-(and) Tj
-1 0 0 1 186.36 613.44 Tm
-(digest.) Tj
-1 0 0 1 81.96 601.56 Tm
-(The) Tj
-1 0 0 1 100.44 601.56 Tm
-(commit) Tj
-1 0 0 1 133.8 601.56 Tm
-(phase) Tj
-1 0 0 1 159.48 601.56 Tm
-(ensures) Tj
-1 0 0 1 192.24 601.56 Tm
-(the) Tj
-1 0 0 1 207.36 601.56 Tm
-(follo) Tj
-1 0 0 1 226.08 601.56 Tm
-(wing) Tj
-1 0 0 1 248.879 601.56 Tm
-(in) Tj
-1 0 0 1 256.319 601.56 Tm
-(v) Tj
-1 0 0 1 261.119 601.56 Tm
-(ariant:) Tj
-1 0 0 1 290.879 601.56 Tm
-(if) Tj
-/R359 10 Tf
-1 0 0 1 72 589.56 Tm
-(committed-local) Tj
-ET
-q
-2.4 0 0 -9.9 137.9 597.1 cm
-/R362 Do
-Q
-q
-8.1 0 0 -4.6 141.1 594.1 cm
-/R366 Do
-Q
-q
-1.3 0 0 -3 150.4 590.7 cm
-/R370 Do
-Q
-q
-4.4 0 0 -4.6 154.3 594.1 cm
-/R374 Do
-Q
-q
-1.3 0 0 -3 160 590.7 cm
-/R370 Do
-Q
-q
-5.4 0 0 -4.6 163.9 594.1 cm
-/R378 Do
-Q
-q
-1.3 0 0 -3 170.5 590.7 cm
-/R370 Do
-Q
-q
-2.6 0 0 -6.9 174.3 596.4 cm
-/R386 Do
-Q
-q
-2.4 0 0 -9.9 178 597.1 cm
-/R382 Do
-Q
-BT
-/R356 10 Tf
-1 0 0 1 185.04 589.56 Tm
-(is) Tj
-1 0 0 1 195.6 589.56 Tm
-(true) Tj
-1 0 0 1 215.039 589.56 Tm
-(for) Tj
-1 0 0 1 230.639 589.56 Tm
-(some) Tj
-1 0 0 1 255.599 589.56 Tm
-(non-f) Tj
-1 0 0 1 277.319 589.56 Tm
-(aulty) Tj
-ET
-q
-2.6 0 0 -6.9 72.2 584.5 cm
-/R386 Do
-Q
-BT
-1 0 0 1 79.68 577.68 Tm
-(then) Tj
-/R359 10 Tf
-1 0 0 1 101.16 577.68 Tm
-(committed) Tj
-ET
-q
-2.4 0 0 -9.9 143.7 585.2 cm
-/R362 Do
-Q
-q
-8.1 0 0 -4.6 146.8 582.2 cm
-/R366 Do
-Q
-q
-1.3 0 0 -3 156.2 578.8 cm
-/R370 Do
-Q
-q
-4.4 0 0 -4.6 160 582.2 cm
-/R374 Do
-Q
-q
-1.3 0 0 -3 165.8 578.8 cm
-/R370 Do
-Q
-q
-5.4 0 0 -4.6 169.6 582.2 cm
-/R378 Do
-Q
-q
-2.4 0 0 -9.9 175.8 585.2 cm
-/R382 Do
-Q
-BT
-/R356 10 Tf
-1 0 0 1 183.48 577.68 Tm
-(is) Tj
-1 0 0 1 194.52 577.68 Tm
-(true.) Tj
-1 0 0 1 221.519 577.68 Tm
-(This) Tj
-1 0 0 1 243.479 577.68 Tm
-(in) Tj
-1 0 0 1 250.919 577.68 Tm
-(v) Tj
-1 0 0 1 255.719 577.68 Tm
-(ariant) Tj
-1 0 0 1 282.599 577.68 Tm
-(and) Tj
-1 0 0 1 72 565.68 Tm
-(the) Tj
-1 0 0 1 86.2799 565.68 Tm
-(vie) Tj
-1 0 0 1 98.2799 565.68 Tm
-(w-change) Tj
-1 0 0 1 139.08 565.68 Tm
-(protocol) Tj
-1 0 0 1 174.36 565.68 Tm
-(described) Tj
-1 0 0 1 214.56 565.68 Tm
-(in) Tj
-1 0 0 1 224.399 565.68 Tm
-(Section) Tj
-1 0 0 1 256.439 565.68 Tm
-(4.4) Tj
-1 0 0 1 270.959 565.68 Tm
-(ensure) Tj
-1 0 0 1 72 553.8 Tm
-(that) Tj
-1 0 0 1 90.2399 553.8 Tm
-(non-f) Tj
-1 0 0 1 111.96 553.8 Tm
-(aulty) Tj
-1 0 0 1 135 553.8 Tm
-(replicas) Tj
-1 0 0 1 169.2 553.8 Tm
-(agree) Tj
-1 0 0 1 194.16 553.8 Tm
-(on) Tj
-1 0 0 1 207.36 553.8 Tm
-(the) Tj
-1 0 0 1 222.84 553.8 Tm
-(sequence) Tj
-1 0 0 1 262.679 553.8 Tm
-(numbers) Tj
-1 0 0 1 72 541.8 Tm
-(of) Tj
-1 0 0 1 83.88 541.8 Tm
-(requests) Tj
-1 0 0 1 120 541.8 Tm
-(that) Tj
-1 0 0 1 138.48 541.8 Tm
-(commit) Tj
-1 0 0 1 172.44 541.8 Tm
-(locally) Tj
-1 0 0 1 203.16 541.8 Tm
-(e) Tj
-1 0 0 1 207.36 541.8 Tm
-(v) Tj
-1 0 0 1 212.28 541.8 Tm
-(en) Tj
-1 0 0 1 225.12 541.8 Tm
-(if) Tj
-1 0 0 1 234.72 541.8 Tm
-(the) Tj
-1 0 0 1 246.839 541.8 Tm
-(y) Tj
-1 0 0 1 255.239 541.8 Tm
-(commit) Tj
-1 0 0 1 289.199 541.8 Tm
-(in) Tj
-1 0 0 1 72 529.92 Tm
-(dif) Tj
-1 0 0 1 82.9199 529.92 Tm
-(ferent) Tj
-1 0 0 1 109.32 529.92 Tm
-(vie) Tj
-1 0 0 1 121.32 529.92 Tm
-(ws) Tj
-1 0 0 1 135.48 529.92 Tm
-(at) Tj
-1 0 0 1 145.92 529.92 Tm
-(each) Tj
-1 0 0 1 167.28 529.92 Tm
-(replica.) Tj
-1 0 0 1 202.68 529.92 Tm
-(Furthermore,) Tj
-1 0 0 1 258.359 529.92 Tm
-(it) Tj
-1 0 0 1 267.119 529.92 Tm
-(ensures) Tj
-1 0 0 1 72 517.92 Tm
-(that) Tj
-1 0 0 1 91.6799 517.92 Tm
-(an) Tj
-1 0 0 1 101.04 517.92 Tm
-(y) Tj
-1 0 0 1 110.64 517.92 Tm
-(request) Tj
-1 0 0 1 144.12 517.92 Tm
-(that) Tj
-1 0 0 1 163.68 517.92 Tm
-(commits) Tj
-1 0 0 1 202.8 517.92 Tm
-(locally) Tj
-1 0 0 1 234.599 517.92 Tm
-(at) Tj
-1 0 0 1 246.479 517.92 Tm
-(a) Tj
-1 0 0 1 255.599 517.92 Tm
-(non-f) Tj
-1 0 0 1 277.319 517.92 Tm
-(aulty) Tj
-1 0 0 1 72 506.04 Tm
-(replica) Tj
-1 0 0 1 101.64 506.04 Tm
-(will) Tj
-1 0 0 1 119.76 506.04 Tm
-(commit) Tj
-1 0 0 1 152.76 506.04 Tm
-(at) Tj
-ET
-q
-5 0 0 -9.2 162.9 513.1 cm
-/R390 Do
-Q
-q
-6.6 0 0 -6.5 171.1 511.8 cm
-/R394 Do
-Q
-BT
-1 0 0 1 180.6 506.04 Tm
-(1) Tj
-1 0 0 1 188.16 506.04 Tm
-(or) Tj
-1 0 0 1 199.08 506.04 Tm
-(more) Tj
-1 0 0 1 222 506.04 Tm
-(non-f) Tj
-1 0 0 1 243.719 506.04 Tm
-(aulty) Tj
-1 0 0 1 266.039 506.04 Tm
-(replicas) Tj
-1 0 0 1 72 494.04 Tm
-(e) Tj
-1 0 0 1 76.2 494.04 Tm
-(v) Tj
-1 0 0 1 81.1199 494.04 Tm
-(entually) Tj
-1 0 0 1 112.8 494.04 Tm
-(.) Tj
-1 0 0 1 81.96 482.16 Tm
-(Each) Tj
-1 0 0 1 106.56 482.16 Tm
-(replica) Tj
-ET
-q
-2.6 0 0 -6.9 138.6 489 cm
-/R386 Do
-Q
-BT
-1 0 0 1 146.4 482.16 Tm
-(e) Tj
-1 0 0 1 150.72 482.16 Tm
-(x) Tj
-1 0 0 1 155.64 482.16 Tm
-(ecutes) Tj
-1 0 0 1 185.04 482.16 Tm
-(the) Tj
-1 0 0 1 201.96 482.16 Tm
-(operation) Tj
-1 0 0 1 244.199 482.16 Tm
-(requested) Tj
-1 0 0 1 287.039 482.16 Tm
-(by) Tj
-ET
-q
-8.1 0 0 -4.6 72.2 474.7 cm
-/R366 Do
-Q
-BT
-1 0 0 1 84.12 470.16 Tm
-(after) Tj
-/R359 10 Tf
-1 0 0 1 105.84 470.16 Tm
-(committed-local) Tj
-ET
-q
-2.4 0 0 -9.9 171.8 477.7 cm
-/R362 Do
-Q
-q
-8.1 0 0 -4.6 174.9 474.7 cm
-/R366 Do
-Q
-q
-1.3 0 0 -3 184.3 471.3 cm
-/R370 Do
-Q
-q
-4.4 0 0 -4.6 188.1 474.7 cm
-/R374 Do
-Q
-q
-1.3 0 0 -3 193.9 471.3 cm
-/R370 Do
-Q
-q
-5.4 0 0 -4.6 197.7 474.7 cm
-/R378 Do
-Q
-q
-1.3 0 0 -3 204.3 471.3 cm
-/R370 Do
-Q
-q
-2.6 0 0 -6.9 208.2 477 cm
-/R386 Do
-Q
-q
-2.4 0 0 -9.9 211.8 477.7 cm
-/R382 Do
-Q
-BT
-/R356 10 Tf
-1 0 0 1 218.399 470.16 Tm
-(is) Tj
-1 0 0 1 228.479 470.16 Tm
-(true) Tj
-1 0 0 1 247.439 470.16 Tm
-(and) Tj
-ET
-q
-2.6 0 0 -6.9 265.4 477 cm
-/R386 Do
-Q
-BT
-1 0 0 1 268.679 470.16 Tm
-(') Tj
-1 0 0 1 271.439 470.16 Tm
-(s) Tj
-1 0 0 1 278.759 470.16 Tm
-(state) Tj
-1 0 0 1 72 458.28 Tm
-(re\257ects) Tj
-1 0 0 1 105.96 458.28 Tm
-(the) Tj
-1 0 0 1 123.36 458.28 Tm
-(sequential) Tj
-1 0 0 1 169.08 458.28 Tm
-(e) Tj
-1 0 0 1 173.4 458.28 Tm
-(x) Tj
-1 0 0 1 178.32 458.28 Tm
-(ecution) Tj
-1 0 0 1 212.64 458.28 Tm
-(of) Tj
-1 0 0 1 226.199 458.28 Tm
-(all) Tj
-1 0 0 1 241.439 458.28 Tm
-(requests) Tj
-1 0 0 1 279.239 458.28 Tm
-(with) Tj
-1 0 0 1 72 446.28 Tm
-(lo) Tj
-1 0 0 1 79.56 446.28 Tm
-(wer) Tj
-1 0 0 1 99.1199 446.28 Tm
-(sequence) Tj
-1 0 0 1 140.4 446.28 Tm
-(numbers.) Tj
-1 0 0 1 187.44 446.28 Tm
-(This) Tj
-1 0 0 1 209.88 446.28 Tm
-(ensures) Tj
-1 0 0 1 244.44 446.28 Tm
-(that) Tj
-1 0 0 1 264.119 446.28 Tm
-(all) Tj
-1 0 0 1 278.759 446.28 Tm
-(non-) Tj
-1 0 0 1 72 434.4 Tm
-(f) Tj
-1 0 0 1 75.24 434.4 Tm
-(aulty) Tj
-1 0 0 1 99.9599 434.4 Tm
-(replicas) Tj
-1 0 0 1 135.72 434.4 Tm
-(e) Tj
-1 0 0 1 140.04 434.4 Tm
-(x) Tj
-1 0 0 1 144.96 434.4 Tm
-(ecute) Tj
-1 0 0 1 170.64 434.4 Tm
-(requests) Tj
-1 0 0 1 208.08 434.4 Tm
-(in) Tj
-1 0 0 1 220.679 434.4 Tm
-(the) Tj
-1 0 0 1 237.599 434.4 Tm
-(same) Tj
-1 0 0 1 262.919 434.4 Tm
-(order) Tj
-1 0 0 1 288.719 434.4 Tm
-(as) Tj
-1 0 0 1 72 422.4 Tm
-(required) Tj
-1 0 0 1 108.12 422.4 Tm
-(to) Tj
-1 0 0 1 118.92 422.4 Tm
-(pro) Tj
-1 0 0 1 132.24 422.4 Tm
-(vide) Tj
-1 0 0 1 152.16 422.4 Tm
-(the) Tj
-1 0 0 1 167.28 422.4 Tm
-(safety) Tj
-1 0 0 1 194.04 422.4 Tm
-(property) Tj
-1 0 0 1 227.519 422.4 Tm
-(.) Tj
-1 0 0 1 234.599 422.4 Tm
-(After) Tj
-1 0 0 1 258.599 422.4 Tm
-(e) Tj
-1 0 0 1 262.919 422.4 Tm
-(x) Tj
-1 0 0 1 267.839 422.4 Tm
-(ecuting) Tj
-1 0 0 1 72 410.52 Tm
-(the) Tj
-1 0 0 1 85.9199 410.52 Tm
-(requested) Tj
-1 0 0 1 125.88 410.52 Tm
-(operation,) Tj
-1 0 0 1 167.88 410.52 Tm
-(replicas) Tj
-1 0 0 1 200.52 410.52 Tm
-(send) Tj
-1 0 0 1 220.559 410.52 Tm
-(a) Tj
-1 0 0 1 226.799 410.52 Tm
-(reply) Tj
-1 0 0 1 248.999 410.52 Tm
-(to) Tj
-1 0 0 1 258.479 410.52 Tm
-(the) Tj
-1 0 0 1 272.399 410.52 Tm
-(client.) Tj
-1 0 0 1 72 398.52 Tm
-(Replicas) Tj
-1 0 0 1 108.6 398.52 Tm
-(discard) Tj
-1 0 0 1 139.68 398.52 Tm
-(requests) Tj
-1 0 0 1 174.6 398.52 Tm
-(whose) Tj
-1 0 0 1 202.32 398.52 Tm
-(timestamp) Tj
-1 0 0 1 246.119 398.52 Tm
-(is) Tj
-1 0 0 1 255.119 398.52 Tm
-(lo) Tj
-1 0 0 1 262.679 398.52 Tm
-(wer) Tj
-1 0 0 1 279.839 398.52 Tm
-(than) Tj
-1 0 0 1 72 386.52 Tm
-(the) Tj
-1 0 0 1 87.2399 386.52 Tm
-(timestamp) Tj
-1 0 0 1 131.88 386.52 Tm
-(in) Tj
-1 0 0 1 142.8 386.52 Tm
-(the) Tj
-1 0 0 1 158.04 386.52 Tm
-(last) Tj
-1 0 0 1 174.96 386.52 Tm
-(reply) Tj
-1 0 0 1 198.6 386.52 Tm
-(the) Tj
-1 0 0 1 210.72 386.52 Tm
-(y) Tj
-1 0 0 1 218.639 386.52 Tm
-(sent) Tj
-1 0 0 1 237.839 386.52 Tm
-(to) Tj
-1 0 0 1 248.759 386.52 Tm
-(the) Tj
-1 0 0 1 263.999 386.52 Tm
-(client) Tj
-1 0 0 1 289.199 386.52 Tm
-(to) Tj
-1 0 0 1 72 374.64 Tm
-(guarantee) Tj
-1 0 0 1 113.16 374.64 Tm
-(e) Tj
-1 0 0 1 117.48 374.64 Tm
-(xactly-once) Tj
-1 0 0 1 166.44 374.64 Tm
-(semantics.) Tj
-1 0 0 1 81.96 362.64 Tm
-(W) Tj
-1 0 0 1 90.48 362.64 Tm
-(e) Tj
-1 0 0 1 100.08 362.64 Tm
-(do) Tj
-1 0 0 1 115.08 362.64 Tm
-(not) Tj
-1 0 0 1 132.84 362.64 Tm
-(rely) Tj
-1 0 0 1 153.48 362.64 Tm
-(on) Tj
-1 0 0 1 168.48 362.64 Tm
-(ordered) Tj
-1 0 0 1 204 362.64 Tm
-(message) Tj
-1 0 0 1 242.76 362.64 Tm
-(deli) Tj
-1 0 0 1 257.52 362.64 Tm
-(v) Tj
-1 0 0 1 262.439 362.64 Tm
-(ery) Tj
-1 0 0 1 274.679 362.64 Tm
-(,) Tj
-1 0 0 1 282.599 362.64 Tm
-(and) Tj
-1 0 0 1 72 350.76 Tm
-(therefore) Tj
-1 0 0 1 111.36 350.76 Tm
-(it) Tj
-1 0 0 1 120.24 350.76 Tm
-(is) Tj
-1 0 0 1 130.2 350.76 Tm
-(possible) Tj
-1 0 0 1 166.2 350.76 Tm
-(for) Tj
-1 0 0 1 181.2 350.76 Tm
-(a) Tj
-1 0 0 1 188.999 350.76 Tm
-(replica) Tj
-1 0 0 1 219.479 350.76 Tm
-(to) Tj
-1 0 0 1 230.519 350.76 Tm
-(commit) Tj
-1 0 0 1 264.359 350.76 Tm
-(requests) Tj
-1 0 0 1 72 338.76 Tm
-(out) Tj
-1 0 0 1 87.36 338.76 Tm
-(of) Tj
-1 0 0 1 98.2799 338.76 Tm
-(order) Tj
-1 0 0 1 118.92 338.76 Tm
-(.) Tj
-1 0 0 1 125.16 338.76 Tm
-(This) Tj
-1 0 0 1 145.44 338.76 Tm
-(does) Tj
-1 0 0 1 166.32 338.76 Tm
-(not) Tj
-1 0 0 1 181.68 338.76 Tm
-(matter) Tj
-1 0 0 1 209.76 338.76 Tm
-(since) Tj
-1 0 0 1 232.8 338.76 Tm
-(it) Tj
-1 0 0 1 240.959 338.76 Tm
-(k) Tj
-1 0 0 1 245.879 338.76 Tm
-(eeps) Tj
-1 0 0 1 266.159 338.76 Tm
-(the) Tj
-1 0 0 1 280.919 338.76 Tm
-(pre-) Tj
-1 0 0 1 72 326.88 Tm
-(prepare,) Tj
-1 0 0 1 107.28 326.88 Tm
-(prepare,) Tj
-1 0 0 1 142.68 326.88 Tm
-(and) Tj
-1 0 0 1 159.84 326.88 Tm
-(commit) Tj
-1 0 0 1 193.2 326.88 Tm
-(messages) Tj
-1 0 0 1 233.76 326.88 Tm
-(logged) Tj
-1 0 0 1 263.64 326.88 Tm
-(until) Tj
-1 0 0 1 284.879 326.88 Tm
-(the) Tj
-1 0 0 1 72 314.88 Tm
-(corresponding) Tj
-1 0 0 1 131.52 314.88 Tm
-(request) Tj
-1 0 0 1 162.72 314.88 Tm
-(can) Tj
-1 0 0 1 179.04 314.88 Tm
-(be) Tj
-1 0 0 1 190.92 314.88 Tm
-(e) Tj
-1 0 0 1 195.24 314.88 Tm
-(x) Tj
-1 0 0 1 200.16 314.88 Tm
-(ecuted.) Tj
-1 0 0 1 81.96 303 Tm
-(Figure) Tj
-1 0 0 1 111.36 303 Tm
-(1) Tj
-1 0 0 1 119.76 303 Tm
-(sho) Tj
-1 0 0 1 133.44 303 Tm
-(ws) Tj
-1 0 0 1 147.72 303 Tm
-(the) Tj
-1 0 0 1 163.32 303 Tm
-(operation) Tj
-1 0 0 1 204.36 303 Tm
-(of) Tj
-1 0 0 1 216 303 Tm
-(the) Tj
-1 0 0 1 231.6 303 Tm
-(algorithm) Tj
-1 0 0 1 273.719 303 Tm
-(in) Tj
-1 0 0 1 284.879 303 Tm
-(the) Tj
-1 0 0 1 72 291 Tm
-(normal) Tj
-1 0 0 1 102 291 Tm
-(case) Tj
-1 0 0 1 120.72 291 Tm
-(of) Tj
-1 0 0 1 130.68 291 Tm
-(no) Tj
-1 0 0 1 142.32 291 Tm
-(primary) Tj
-1 0 0 1 175.68 291 Tm
-(f) Tj
-1 0 0 1 178.92 291 Tm
-(aults.) Tj
-1 0 0 1 203.04 291 Tm
-(Replica) Tj
-1 0 0 1 235.079 291 Tm
-(0) Tj
-1 0 0 1 241.679 291 Tm
-(is) Tj
-1 0 0 1 249.839 291 Tm
-(the) Tj
-1 0 0 1 263.639 291 Tm
-(primary) Tj
-1 0 0 1 294.839 291 Tm
-(,) Tj
-1 0 0 1 72 279.12 Tm
-(replica) Tj
-1 0 0 1 101.64 279.12 Tm
-(3) Tj
-1 0 0 1 109.08 279.12 Tm
-(is) Tj
-1 0 0 1 118.2 279.12 Tm
-(f) Tj
-1 0 0 1 121.44 279.12 Tm
-(aulty) Tj
-1 0 0 1 140.88 279.12 Tm
-(,) Tj
-1 0 0 1 145.68 279.12 Tm
-(and) Tj
-ET
-endstream
-endobj
-397 0 obj
-13859
-endobj
-398 0 obj
-<< /Type /XObject /Name /R398 /Subtype /Image /Length 399 0 R
-/ImageMask true /Width 71 /Height 74 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 71 /BlackIs1 true >>]
->>
-stream
--,TJZ1dVEQ3$Jkuk_6*$#G?]kK5eSH^CS).)nksrhgWI<)tp]Y_[[^Ja2*B2Sf%[*I!cbX_1^mB-u]1e&-~>
-endstream
-endobj
-399 0 obj
-131
-endobj
-400 0 obj
-<< /Length 401 0 R >>
-stream
-q
-7.1 0 0 -7.4 163 286.2 cm
-/R398 Do
-Q
-BT
-1 0 0 1 172.92 279.12 Tm
-(is) Tj
-1 0 0 1 182.04 279.12 Tm
-(the) Tj
-1 0 0 1 196.679 279.12 Tm
-(client.) Tj
-ET
-1 i
-83.3164 227.163 211.705 1.07319 re
-f
-83.315 211.063 211.705 1.07319 re
-f
-83.3161 193.363 211.702 1.07319 re
-f
-83.3161 176.763 211.702 1.07319 re
-f
-endstream
-endobj
-401 0 obj
-302
-endobj
-402 0 obj
-<< /Type /Font /Name /R402 /Subtype /Type1 /BaseFont /Helvetica-Bold >>
-endobj
-403 0 obj
-<< /Length 404 0 R >>
-stream
-BT
-/R402 7.65182 Tf
-1 0 0 0.981817 102.068 175.27 Tm
-(X) Tj
-ET
-83.3258 244.863 211.56 1.07319 re
-f
-125.841 263.126 m
-125.294 263.129 l
-125.288 262.056 l
-125.834 262.053 l
-f
-125.828 260.98 m
-125.282 260.983 l
-125.276 259.909 l
-125.822 259.906 l
-f
-125.816 258.833 m
-125.27 258.836 l
-125.264 257.763 l
-125.81 257.76 l
-f
-125.804 256.687 m
-125.257 256.69 l
-125.251 255.616 l
-125.798 255.614 l
-f
-125.792 254.54 m
-125.245 254.543 l
-125.239 253.47 l
-125.786 253.467 l
-f
-125.78 252.394 m
-125.233 252.397 l
-125.227 251.324 l
-125.773 251.321 l
-f
-125.767 250.247 m
-125.221 250.25 l
-125.215 249.177 l
-125.761 249.174 l
-f
-125.755 248.101 m
-125.209 248.104 l
-125.202 247.031 l
-125.749 247.028 l
-f
-125.743 245.955 m
-125.196 245.958 l
-125.19 244.884 l
-125.737 244.881 l
-f
-125.731 243.808 m
-125.184 243.811 l
-125.178 242.738 l
-125.725 242.735 l
-f
-125.718 241.662 m
-125.172 241.665 l
-125.166 240.591 l
-125.712 240.588 l
-f
-125.706 239.515 m
-125.16 239.518 l
-125.154 238.445 l
-125.7 238.442 l
-f
-125.694 237.369 m
-125.148 237.372 l
-125.141 236.299 l
-125.688 236.296 l
-f
-125.682 235.222 m
-125.135 235.225 l
-125.129 234.152 l
-125.676 234.149 l
-f
-125.67 233.076 m
-125.123 233.079 l
-125.117 232.006 l
-125.664 232.003 l
-f
-125.657 230.929 m
-125.111 230.932 l
-125.105 229.859 l
-125.651 229.856 l
-f
-125.645 228.783 m
-125.099 228.786 l
-125.093 227.713 l
-125.639 227.71 l
-f
-125.633 226.637 m
-125.086 226.64 l
-125.08 225.566 l
-125.627 225.563 l
-f
-125.621 224.49 m
-125.074 224.493 l
-125.068 223.42 l
-125.615 223.417 l
-f
-125.609 222.344 m
-125.062 222.347 l
-125.056 221.274 l
-125.603 221.271 l
-f
-125.596 220.197 m
-125.05 220.2 l
-125.044 219.127 l
-125.59 219.124 l
-f
-125.584 218.051 m
-125.038 218.054 l
-125.032 216.981 l
-125.578 216.978 l
-f
-125.572 215.904 m
-125.025 215.907 l
-125.019 214.834 l
-125.566 214.831 l
-f
-125.56 213.758 m
-125.013 213.761 l
-125.007 212.688 l
-125.554 212.685 l
-f
-125.548 211.612 m
-125.001 211.615 l
-124.995 210.541 l
-125.541 210.538 l
-f
-125.535 209.465 m
-124.989 209.468 l
-124.983 208.395 l
-125.529 208.392 l
-f
-125.523 207.319 m
-124.977 207.322 l
-124.971 206.248 l
-125.517 206.245 l
-f
-125.511 205.172 m
-124.964 205.175 l
-124.958 204.102 l
-125.505 204.099 l
-f
-125.499 203.026 m
-124.952 203.029 l
-124.946 201.956 l
-125.493 201.953 l
-f
-125.487 200.879 m
-124.94 200.882 l
-124.934 199.809 l
-125.48 199.806 l
-f
-125.474 198.733 m
-124.928 198.736 l
-124.922 197.663 l
-125.468 197.66 l
-f
-125.462 196.587 m
-124.916 196.59 l
-124.909 195.516 l
-125.456 195.513 l
-f
-125.45 194.44 m
-124.903 194.443 l
-124.897 193.37 l
-125.444 193.367 l
-f
-125.438 192.294 m
-124.891 192.297 l
-124.885 191.223 l
-125.432 191.22 l
-f
-125.426 190.147 m
-124.879 190.15 l
-124.873 189.077 l
-125.419 189.074 l
-f
-125.413 188.001 m
-124.867 188.004 l
-124.861 186.931 l
-125.407 186.928 l
-f
-125.401 185.854 m
-124.855 185.857 l
-124.848 184.784 l
-125.395 184.781 l
-f
-125.389 183.708 m
-124.842 183.711 l
-124.836 182.638 l
-125.383 182.635 l
-f
-125.377 181.561 m
-124.83 181.564 l
-124.824 180.491 l
-125.371 180.488 l
-f
-125.364 179.415 m
-124.818 179.418 l
-124.812 178.345 l
-125.358 178.342 l
-f
-125.352 177.269 m
-124.806 177.272 l
-124.8 176.198 l
-125.346 176.195 l
-f
-125.34 175.122 m
-124.794 175.125 l
-124.787 174.052 l
-125.334 174.049 l
-f
-125.328 172.976 m
-124.781 172.979 l
-124.775 171.905 l
-125.322 171.903 l
-f
-125.316 170.829 m
-124.769 170.832 l
-124.763 169.759 l
-125.31 169.756 l
-f
-125.303 168.683 m
-124.757 168.686 l
-124.751 167.613 l
-125.297 167.61 l
-f
-168.427 261.518 0.546533 1.07322 re
-f
-168.427 259.371 0.546533 1.07322 re
-f
-168.427 257.225 0.546533 1.07322 re
-f
-168.427 255.078 0.546533 1.07322 re
-f
-168.427 252.932 0.546533 1.07322 re
-f
-168.427 250.785 0.546533 1.07322 re
-f
-168.427 248.639 0.546533 1.07322 re
-f
-168.427 246.493 0.546533 1.07322 re
-f
-168.427 244.346 0.546533 1.07322 re
-f
-168.427 242.2 0.546533 1.07322 re
-f
-168.427 240.053 0.546533 1.07322 re
-f
-168.427 237.907 0.546533 1.07322 re
-f
-168.427 235.76 0.546533 1.07322 re
-f
-168.427 233.614 0.546533 1.07322 re
-f
-168.427 231.468 0.546533 1.07322 re
-f
-168.427 229.321 0.546533 1.07322 re
-f
-168.427 227.175 0.546533 1.07322 re
-f
-168.427 225.028 0.546533 1.07322 re
-f
-168.427 222.882 0.546533 1.07322 re
-f
-168.427 220.735 0.546533 1.07322 re
-f
-168.427 218.589 0.546533 1.07322 re
-f
-168.427 216.443 0.546533 1.07322 re
-f
-168.427 214.296 0.546533 1.07322 re
-f
-168.427 212.15 0.546533 1.07322 re
-f
-168.427 210.003 0.546533 1.07322 re
-f
-168.427 207.857 0.546533 1.07322 re
-f
-168.427 205.71 0.546533 1.07322 re
-f
-168.427 203.564 0.546533 1.07322 re
-f
-168.427 201.417 0.546533 1.07322 re
-f
-168.427 199.271 0.546533 1.07322 re
-f
-168.427 197.125 0.546533 1.07322 re
-f
-168.427 194.978 0.546533 1.07322 re
-f
-168.427 192.832 0.546533 1.07322 re
-f
-168.427 190.685 0.546533 1.07322 re
-f
-168.427 188.539 0.546533 1.07322 re
-f
-168.427 186.392 0.546533 1.07322 re
-f
-168.427 184.246 0.546533 1.07322 re
-f
-168.427 182.1 0.546533 1.07322 re
-f
-168.427 179.953 0.546533 1.07322 re
-f
-168.427 177.807 0.546533 1.07322 re
-f
-168.427 175.66 0.546533 1.07322 re
-f
-168.427 173.514 0.546533 1.07322 re
-f
-168.427 171.367 0.546533 1.07322 re
-f
-168.427 169.221 0.546533 1.07322 re
-f
-168.427 167.075 0.546533 1.07322 re
-f
-168.427 165.999 0.546533 0.00219727 re
-f
-208.924 262.592 m
-208.377 262.589 l
-208.383 261.516 l
-208.93 261.519 l
-f
-208.936 260.446 m
-208.389 260.443 l
-208.395 259.37 l
-208.942 259.373 l
-f
-208.948 258.299 m
-208.401 258.297 l
-208.407 257.223 l
-208.954 257.226 l
-f
-208.96 256.153 m
-208.413 256.15 l
-208.419 255.077 l
-208.966 255.08 l
-f
-208.972 254.007 m
-208.425 254.004 l
-208.431 252.93 l
-208.978 252.933 l
-f
-208.984 251.86 m
-208.437 251.857 l
-208.443 250.784 l
-208.99 250.787 l
-f
-208.996 249.714 m
-208.449 249.711 l
-208.455 248.638 l
-209.002 248.641 l
-f
-209.008 247.567 m
-208.461 247.564 l
-208.467 246.491 l
-209.014 246.494 l
-f
-209.02 245.421 m
-208.474 245.418 l
-208.48 244.345 l
-209.026 244.348 l
-f
-209.032 243.274 m
-208.486 243.272 l
-208.492 242.198 l
-209.038 242.201 l
-f
-209.044 241.128 m
-208.498 241.125 l
-208.504 240.052 l
-209.05 240.055 l
-f
-209.056 238.982 m
-208.51 238.979 l
-208.516 237.905 l
-209.062 237.908 l
-f
-209.068 236.835 m
-208.522 236.832 l
-208.528 235.759 l
-209.074 235.762 l
-f
-209.08 234.689 m
-208.534 234.686 l
-208.54 233.613 l
-209.086 233.615 l
-f
-209.092 232.542 m
-208.546 232.539 l
-208.552 231.466 l
-209.098 231.469 l
-f
-209.104 230.396 m
-208.558 230.393 l
-208.564 229.32 l
-209.11 229.323 l
-f
-209.117 228.249 m
-208.57 228.246 l
-208.576 227.173 l
-209.123 227.176 l
-f
-209.129 226.103 m
-208.582 226.1 l
-208.588 225.027 l
-209.135 225.03 l
-f
-209.141 223.957 m
-208.594 223.954 l
-208.6 222.88 l
-209.147 222.883 l
-f
-209.153 221.81 m
-208.606 221.807 l
-208.612 220.734 l
-209.159 220.737 l
-f
-209.165 219.664 m
-208.618 219.661 l
-208.624 218.588 l
-209.171 218.59 l
-f
-209.177 217.517 m
-208.63 217.514 l
-208.636 216.441 l
-209.183 216.444 l
-f
-209.189 215.371 m
-208.642 215.368 l
-208.648 214.295 l
-209.195 214.298 l
-f
-209.201 213.224 m
-208.654 213.221 l
-208.66 212.148 l
-209.207 212.151 l
-f
-209.213 211.078 m
-208.666 211.075 l
-208.673 210.002 l
-209.219 210.005 l
-f
-209.225 208.931 m
-208.679 208.929 l
-208.685 207.855 l
-209.231 207.858 l
-f
-209.237 206.785 m
-208.691 206.782 l
-208.697 205.709 l
-209.243 205.712 l
-f
-209.249 204.639 m
-208.703 204.636 l
-208.709 203.562 l
-209.255 203.565 l
-f
-209.261 202.492 m
-208.715 202.489 l
-208.721 201.416 l
-209.267 201.419 l
-f
-209.273 200.346 m
-208.727 200.343 l
-208.733 199.27 l
-209.279 199.273 l
-f
-209.285 198.199 m
-208.739 198.196 l
-208.745 197.123 l
-209.291 197.126 l
-f
-209.297 196.053 m
-208.751 196.05 l
-208.757 194.977 l
-209.303 194.98 l
-f
-209.309 193.906 m
-208.763 193.903 l
-208.769 192.83 l
-209.316 192.833 l
-f
-209.322 191.76 m
-208.775 191.757 l
-208.781 190.684 l
-209.328 190.687 l
-f
-209.334 189.614 m
-208.787 189.611 l
-208.793 188.537 l
-209.34 188.54 l
-f
-209.346 187.467 m
-208.799 187.464 l
-208.805 186.391 l
-209.352 186.394 l
-f
-209.358 185.321 m
-208.811 185.318 l
-208.817 184.245 l
-209.364 184.247 l
-f
-209.37 183.174 m
-208.823 183.171 l
-208.829 182.098 l
-209.376 182.101 l
-f
-209.382 181.028 m
-208.835 181.025 l
-208.841 179.952 l
-209.388 179.955 l
-f
-209.394 178.881 m
-208.847 178.878 l
-208.853 177.805 l
-209.4 177.808 l
-f
-209.406 176.735 m
-208.859 176.732 l
-208.865 175.659 l
-209.412 175.662 l
-f
-209.418 174.589 m
-208.872 174.586 l
-208.878 173.512 l
-209.424 173.515 l
-f
-209.43 172.442 m
-208.884 172.439 l
-208.89 171.366 l
-209.436 171.369 l
-f
-209.442 170.296 m
-208.896 170.293 l
-208.902 169.219 l
-209.448 169.222 l
-f
-209.454 168.149 m
-208.908 168.146 l
-208.914 167.073 l
-209.46 167.076 l
-f
-209.449 166.095 m
-208.937 165.908 l
-208.938 165.906 l
-209.45 166.092 l
-f
-249.369 261.519 m
-248.822 261.516 l
-248.829 260.443 l
-249.375 260.446 l
-f
-249.381 259.373 m
-248.835 259.37 l
-248.841 258.297 l
-249.387 258.299 l
-f
-249.393 257.226 m
-248.847 257.223 l
-248.853 256.15 l
-249.399 256.153 l
-f
-249.406 255.08 m
-248.859 255.077 l
-248.865 254.004 l
-249.412 254.007 l
-f
-249.418 252.933 m
-248.871 252.93 l
-248.877 251.857 l
-249.424 251.86 l
-f
-249.43 250.787 m
-248.883 250.784 l
-248.89 249.711 l
-249.436 249.714 l
-f
-249.442 248.641 m
-248.896 248.638 l
-248.902 247.564 l
-249.448 247.567 l
-f
-249.454 246.494 m
-248.908 246.491 l
-248.914 245.418 l
-249.461 245.421 l
-f
-249.467 244.348 m
-248.92 244.345 l
-248.926 243.271 l
-249.473 243.274 l
-f
-249.479 242.201 m
-248.932 242.198 l
-248.938 241.125 l
-249.485 241.128 l
-f
-249.491 240.055 m
-248.945 240.052 l
-248.951 238.979 l
-249.497 238.982 l
-f
-249.503 237.908 m
-248.957 237.905 l
-248.963 236.832 l
-249.509 236.835 l
-f
-249.515 235.762 m
-248.969 235.759 l
-248.975 234.686 l
-249.522 234.689 l
-f
-249.528 233.615 m
-248.981 233.613 l
-248.987 232.539 l
-249.534 232.542 l
-f
-249.54 231.469 m
-248.993 231.466 l
-248.999 230.393 l
-249.546 230.396 l
-f
-249.552 229.323 m
-249.006 229.32 l
-249.012 228.246 l
-249.558 228.249 l
-f
-249.564 227.176 m
-249.018 227.173 l
-249.024 226.1 l
-249.57 226.103 l
-f
-249.576 225.03 m
-249.03 225.027 l
-249.036 223.954 l
-249.583 223.957 l
-f
-249.589 222.883 m
-249.042 222.88 l
-249.048 221.807 l
-249.595 221.81 l
-f
-249.601 220.737 m
-249.054 220.734 l
-249.06 219.661 l
-249.607 219.664 l
-f
-249.613 218.59 m
-249.067 218.587 l
-249.073 217.514 l
-249.619 217.517 l
-f
-249.625 216.444 m
-249.079 216.441 l
-249.085 215.368 l
-249.631 215.371 l
-f
-249.638 214.298 m
-249.091 214.295 l
-249.097 213.221 l
-249.644 213.224 l
-f
-249.65 212.151 m
-249.103 212.148 l
-249.109 211.075 l
-249.656 211.078 l
-f
-249.662 210.005 m
-249.115 210.002 l
-249.122 208.928 l
-249.668 208.931 l
-f
-249.674 207.858 m
-249.128 207.855 l
-249.134 206.782 l
-249.68 206.785 l
-f
-249.686 205.712 m
-249.14 205.709 l
-249.146 204.636 l
-249.692 204.639 l
-f
-249.699 203.565 m
-249.152 203.562 l
-249.158 202.489 l
-249.705 202.492 l
-f
-249.711 201.419 m
-249.164 201.416 l
-249.17 200.343 l
-249.717 200.346 l
-f
-249.723 199.273 m
-249.176 199.27 l
-249.183 198.196 l
-249.729 198.199 l
-f
-249.735 197.126 m
-249.189 197.123 l
-249.195 196.05 l
-249.741 196.053 l
-f
-249.747 194.98 m
-249.201 194.977 l
-249.207 193.903 l
-249.753 193.906 l
-f
-249.76 192.833 m
-249.213 192.83 l
-249.219 191.757 l
-249.766 191.76 l
-f
-249.772 190.687 m
-249.225 190.684 l
-249.231 189.611 l
-249.778 189.614 l
-f
-249.784 188.54 m
-249.237 188.537 l
-249.244 187.464 l
-249.79 187.467 l
-f
-249.796 186.394 m
-249.25 186.391 l
-249.256 185.318 l
-249.802 185.321 l
-f
-249.808 184.247 m
-249.262 184.244 l
-249.268 183.171 l
-249.815 183.174 l
-f
-249.821 182.101 m
-249.274 182.098 l
-249.28 181.025 l
-249.827 181.028 l
-f
-249.833 179.955 m
-249.286 179.952 l
-249.292 178.878 l
-249.839 178.881 l
-f
-249.845 177.808 m
-249.299 177.805 l
-249.305 176.732 l
-249.851 176.735 l
-f
-249.857 175.662 m
-249.311 175.659 l
-249.317 174.586 l
-249.863 174.589 l
-f
-249.869 173.515 m
-249.323 173.512 l
-249.329 172.439 l
-249.876 172.442 l
-f
-249.882 171.369 m
-249.335 171.366 l
-249.341 170.293 l
-249.888 170.296 l
-f
-249.894 169.222 m
-249.347 169.219 l
-249.353 168.146 l
-249.9 168.149 l
-f
-249.906 167.076 m
-249.36 167.073 l
-249.366 166 l
-249.912 166.003 l
-f
-88.5281 245.658 m
-88.2806 245.18 l
-122.714 228.008 l
-122.961 228.486 l
-f
-123.842 227.746 m
-119.349 231.576 l
-118.042 229.049 l
-f*
-122.658 228.045 m
-123.017 228.45 l
-119.349 231.576 l
-119.191 231.27 l
-119.434 231.148 l
-119.255 230.946 l
-f
-119.678 231.027 m
-119.191 231.27 l
-118.042 229.05 l
-118.383 228.973 l
-118.444 229.234 l
-118.688 229.113 l
-f
-118.505 229.496 m
-118.383 228.973 l
-123.842 227.746 l
-123.017 228.45 l
-122.838 228.247 l
-122.899 228.509 l
-f
-253.235 228.474 m
-253.528 228.021 l
-281.066 245.193 l
-280.773 245.645 l
-f
-281.87 246.012 m
-276.224 244.17 l
-277.771 241.777 l
-f*
-281.005 245.164 m
-280.833 245.674 l
-276.224 244.17 l
-276.412 243.88 l
-276.642 244.023 l
-276.728 243.769 l
-f
-276.873 244.167 m
-276.412 243.88 l
-277.771 241.778 l
-278.012 242.027 l
-277.814 242.211 l
-278.045 242.355 l
-f
-277.616 242.396 m
-278.012 242.027 l
-281.87 246.012 l
-280.833 245.674 l
-280.919 245.419 l
-280.721 245.604 l
-f
-258.351 211.776 m
-258.784 211.448 l
-285.312 245.255 l
-284.879 245.583 l
-f
-285.783 246.295 m
-281.117 242.67 l
-283.403 240.941 l
-f*
-285.265 245.209 m
-284.926 245.629 l
-281.117 242.67 l
-281.394 242.461 l
-281.561 242.673 l
-281.731 242.463 l
-f
-281.728 242.886 m
-281.394 242.461 l
-283.403 240.941 l
-283.543 241.256 l
-283.293 241.363 l
-283.46 241.576 l
-f
-283.042 241.471 m
-283.543 241.256 l
-285.783 246.295 l
-284.926 245.629 l
-285.095 245.419 l
-284.845 245.526 l
-f
-252.325 194.595 m
-252.771 194.285 l
-289.677 245.264 l
-289.232 245.574 l
-f
-290.107 246.321 m
-285.587 242.522 l
-287.939 240.88 l
-f*
-289.632 245.215 m
-289.277 245.623 l
-285.587 242.522 l
-285.872 242.323 l
-286.031 242.542 l
-286.208 242.338 l
-f
-286.189 242.76 m
-285.872 242.323 l
-287.939 240.88 l
-288.067 241.2 l
-287.812 241.298 l
-287.971 241.517 l
-f
-287.558 241.396 m
-288.067 241.2 l
-290.107 246.321 l
-289.277 245.623 l
-289.455 245.419 l
-289.2 245.517 l
-f
-endstream
-endobj
-404 0 obj
-13606
-endobj
-405 0 obj
-<< /Type /Font /Name /R405 /Subtype /Type1 /BaseFont /Times-Bold >>
-endobj
-406 0 obj
-<< /Length 407 0 R >>
-stream
-BT
-/R405 7.65182 Tf
-1 0 0 0.981817 92.7768 250.277 Tm
-(request) Tj
-1 0 0 0.981817 127.757 250.277 Tm
-(pre-prepare) Tj
-1 0 0 0.981817 175.854 250.277 Tm
-(prepare) Tj
-1 0 0 0.981817 215.206 250.277 Tm
-(commit) Tj
-1 0 0 0.981817 258.384 250.277 Tm
-(reply) Tj
-1 0 0 0.981817 74.1938 241.154 Tm
-(C) Tj
-1 0 0 0.981817 74.7404 224.519 Tm
-(0) Tj
-1 0 0 0.981817 74.7404 207.347 Tm
-(1) Tj
-1 0 0 0.981817 74.7404 190.175 Tm
-(2) Tj
-1 0 0 0.981817 74.7404 173.54 Tm
-(3) Tj
-ET
-130.241 228.493 m
-130.021 228.002 l
-168.471 211.366 l
-168.692 211.857 l
-f
-169.612 211.166 m
-164.912 214.748 l
-163.748 212.155 l
-f*
-168.414 211.4 m
-168.749 211.824 l
-164.912 214.748 l
-164.771 214.433 l
-165.021 214.325 l
-164.853 214.113 l
-f
-165.271 214.217 m
-164.771 214.433 l
-163.748 212.155 l
-164.093 212.096 l
-164.139 212.361 l
-164.389 212.253 l
-f
-164.186 212.625 m
-164.093 212.096 l
-169.612 211.166 l
-168.749 211.824 l
-168.581 211.612 l
-168.628 211.876 l
-f
-131.79 228.433 m
-131.395 228.062 l
-164.352 194.254 l
-164.747 194.626 l
-f
-165.329 193.641 m
-162.38 198.715 l
-160.295 196.755 l
-f*
-164.312 194.307 m
-164.787 194.573 l
-162.38 198.715 l
-162.127 198.477 l
-162.316 198.283 l
-162.079 198.15 l
-f
-162.505 198.09 m
-162.127 198.477 l
-160.295 196.755 l
-160.591 196.572 l
-160.737 196.799 l
-160.926 196.605 l
-f
-160.882 197.026 m
-160.591 196.572 l
-165.329 193.641 l
-164.787 194.573 l
-164.55 194.44 l
-164.695 194.667 l
-f
-131.861 228.42 m
-131.402 228.129 l
-164.3 178.15 l
-164.759 178.441 l
-f
-165.141 177.366 m
-163.22 182.895 l
-160.796 181.357 l
-f*
-164.271 178.209 m
-164.788 178.382 l
-163.22 182.895 l
-162.926 182.709 l
-163.074 182.483 l
-162.816 182.397 l
-f
-163.223 182.258 m
-162.926 182.709 l
-160.796 181.357 l
-161.052 181.123 l
-161.238 181.318 l
-161.386 181.093 l
-f
-161.425 181.514 m
-161.052 181.123 l
-165.141 177.366 l
-164.788 178.382 l
-164.53 178.295 l
-164.716 178.491 l
-f
-173.006 211.766 m
-173.294 211.31 l
-199.185 227.069 l
-198.897 227.525 l
-f
-199.998 227.88 m
-194.332 226.098 l
-195.853 223.69 l
-f*
-199.124 227.042 m
-198.957 227.553 l
-194.332 226.098 l
-194.516 225.806 l
-194.748 225.948 l
-194.832 225.692 l
-f
-194.981 226.089 m
-194.516 225.806 l
-195.853 223.69 l
-196.096 223.936 l
-195.9 224.123 l
-196.133 224.265 l
-f
-195.704 224.31 m
-196.096 223.936 l
-199.998 227.88 l
-198.957 227.553 l
-199.041 227.297 l
-198.845 227.484 l
-f
-174.657 211.304 m
-174.371 210.847 l
-202.902 193.675 l
-203.187 194.132 l
-f
-204.005 193.325 m
-199.838 197.495 l
-198.33 195.079 l
-f*
-202.85 193.715 m
-203.24 194.091 l
-199.838 197.495 l
-199.655 197.202 l
-199.888 197.062 l
-199.693 196.874 l
-f
-200.121 196.922 m
-199.655 197.202 l
-198.33 195.079 l
-198.664 194.976 l
-198.746 195.232 l
-198.979 195.092 l
-f
-198.828 195.488 m
-198.664 194.976 l
-204.005 193.325 l
-203.24 194.091 l
-203.045 193.903 l
-203.127 194.159 l
-f
-173.774 211.835 m
-173.376 211.467 l
-205.35 178.091 l
-205.748 178.458 l
-f
-206.321 177.469 m
-203.417 182.568 l
-201.315 180.626 l
-f*
-205.31 178.143 m
-205.787 178.405 l
-203.417 182.568 l
-203.162 182.332 l
-203.349 182.137 l
-203.111 182.006 l
-f
-203.537 181.941 m
-203.162 182.332 l
-201.315 180.626 l
-201.609 180.44 l
-201.757 180.666 l
-201.944 180.471 l
-f
-201.905 180.892 m
-201.609 180.44 l
-206.321 177.469 l
-205.787 178.405 l
-205.549 178.274 l
-205.696 178.5 l
-f
-175.145 194.679 m
-175.395 194.202 l
-209.337 211.373 l
-209.086 211.85 l
-f
-210.213 212.119 m
-204.421 210.782 l
-205.743 208.263 l
-f*
-209.274 211.351 m
-209.149 211.873 l
-204.421 210.782 l
-204.581 210.477 l
-204.824 210.599 l
-204.887 210.338 l
-f
-205.067 210.722 m
-204.581 210.477 l
-205.743 208.263 l
-206.006 208.49 l
-205.825 208.691 l
-206.068 208.814 l
-f
-205.645 208.893 m
-206.006 208.49 l
-210.213 212.119 l
-209.149 211.873 l
-209.212 211.612 l
-209.031 211.813 l
-f
-174.451 194.603 m
-174.852 194.238 l
-206.334 227.562 l
-205.933 227.927 l
-f
-206.9 228.556 m
-201.916 225.364 l
-204.032 223.437 l
-f*
-206.283 227.52 m
-205.984 227.969 l
-201.916 225.364 l
-202.173 225.13 l
-202.358 225.327 l
-202.508 225.102 l
-f
-202.544 225.524 m
-202.173 225.13 l
-204.032 223.437 l
-204.201 223.738 l
-203.961 223.867 l
-204.147 224.064 l
-f
-203.722 223.996 m
-204.201 223.738 l
-206.899 228.555 l
-205.984 227.969 l
-206.133 227.744 l
-205.894 227.874 l
-f
-174.182 194.665 m
-173.885 194.215 l
-200.856 177.043 l
-201.153 177.493 l
-f
-201.95 176.666 m
-197.892 180.939 l
-196.322 178.561 l
-f*
-200.805 177.085 m
-201.205 177.451 l
-197.892 180.939 l
-197.702 180.65 l
-197.931 180.504 l
-197.731 180.321 l
-f
-198.16 180.358 m
-197.702 180.65 l
-196.322 178.561 l
-196.653 178.45 l
-196.741 178.703 l
-196.971 178.557 l
-f
-196.83 178.957 m
-196.653 178.45 l
-201.95 176.666 l
-201.205 177.451 l
-201.005 177.268 l
-201.093 177.522 l
-f
-211.899 228.481 m
-211.63 228.014 l
-241.618 211.378 l
-241.887 211.845 l
-f
-242.733 211.068 m
-238.417 215.089 l
-236.997 212.622 l
-f*
-241.564 211.417 m
-241.94 211.806 l
-238.417 215.089 l
-238.245 214.79 l
-238.483 214.658 l
-238.295 214.463 l
-f
-238.721 214.526 m
-238.245 214.79 l
-236.997 212.622 l
-237.335 212.531 l
-237.408 212.789 l
-237.645 212.657 l
-f
-237.48 213.048 m
-237.335 212.531 l
-242.733 211.068 l
-241.94 211.806 l
-241.752 211.612 l
-241.825 211.87 l
-f
-212.666 228.437 m
-212.28 228.057 l
-246.713 194.25 l
-247.1 194.63 l
-f
-247.703 193.658 m
-244.642 198.667 l
-242.601 196.663 l
-f*
-246.672 194.302 m
-247.141 194.578 l
-244.642 198.667 l
-244.394 198.424 l
-244.588 198.234 l
-244.353 198.096 l
-f
-244.781 198.045 m
-244.394 198.424 l
-242.601 196.663 l
-242.901 196.487 l
-243.042 196.717 l
-243.235 196.527 l
-f
-243.182 196.947 m
-242.901 196.487 l
-247.703 193.658 l
-247.141 194.578 l
-246.906 194.44 l
-247.047 194.67 l
-f
-212.7 228.425 m
-212.247 228.124 l
-246.68 178.145 l
-247.133 178.446 l
-f
-247.538 177.379 m
-245.499 182.867 l
-243.108 181.28 l
-f*
-246.65 178.203 m
-247.163 178.387 l
-245.499 182.867 l
-245.209 182.675 l
-245.362 182.453 l
-245.105 182.361 l
-f
-245.515 182.23 m
-245.209 182.675 l
-243.108 181.28 l
-243.369 181.05 l
-243.551 181.25 l
-243.704 181.028 l
-f
-243.734 181.45 m
-243.369 181.05 l
-247.538 177.379 l
-247.163 178.387 l
-246.906 178.295 l
-247.089 178.495 l
-f
-213.052 211.765 m
-213.342 211.31 l
-238.921 227.07 l
-238.631 227.525 l
-f
-239.73 227.885 m
-234.074 226.073 l
-235.608 223.673 l
-f*
-238.861 227.042 m
-238.691 227.552 l
-234.074 226.073 l
-234.26 225.782 l
-234.491 225.925 l
-234.576 225.67 l
-f
-234.723 226.067 m
-234.26 225.782 l
-235.608 223.673 l
-235.85 223.921 l
-235.653 224.107 l
-235.885 224.249 l
-f
-235.456 224.292 m
-235.85 223.921 l
-239.73 227.885 l
-238.691 227.552 l
-238.776 227.297 l
-238.579 227.483 l
-f
-213.458 211.838 m
-213.165 211.385 l
-240.664 194.214 l
-240.957 194.666 l
-f
-241.761 193.846 m
-237.665 198.083 l
-236.116 195.692 l
-f*
-240.612 194.255 m
-241.009 194.625 l
-237.665 198.083 l
-237.477 197.793 l
-237.708 197.649 l
-237.51 197.465 l
-f
-237.938 197.505 m
-237.477 197.793 l
-236.116 195.692 l
-236.448 195.584 l
-236.535 195.838 l
-236.765 195.694 l
-f
-236.621 196.093 m
-236.448 195.584 l
-241.761 193.846 l
-241.009 194.625 l
-240.811 194.44 l
-240.897 194.695 l
-f
-213.469 211.819 m
-213.042 211.485 l
-240.105 178.108 l
-240.533 178.443 l
-f
-241.021 177.41 m
-238.554 182.726 l
-236.296 180.962 l
-f*
-240.07 178.164 m
-240.568 178.387 l
-238.554 182.726 l
-238.281 182.512 l
-238.451 182.303 l
-238.202 182.191 l
-f
-238.621 182.093 m
-238.281 182.512 l
-236.296 180.962 l
-236.574 180.753 l
-236.74 180.966 l
-236.91 180.756 l
-f
-236.906 181.179 m
-236.574 180.753 l
-241.02 177.41 l
-240.568 178.387 l
-240.319 178.276 l
-240.485 178.489 l
-f
-210.777 194.681 m
-211.016 194.199 l
-246.925 211.371 l
-246.686 211.853 l
-f
-247.819 212.096 m
-241.997 210.888 l
-243.261 208.341 l
-f*
-246.862 211.349 m
-246.749 211.874 l
-241.997 210.888 l
-242.15 210.579 l
-242.396 210.697 l
-242.453 210.434 l
-f
-242.642 210.814 m
-242.15 210.579 l
-243.261 208.341 l
-243.529 208.562 l
-243.353 208.767 l
-243.599 208.885 l
-f
-243.178 208.973 m
-243.529 208.562 l
-247.819 212.096 l
-246.749 211.874 l
-246.806 211.612 l
-246.63 211.817 l
-f
-211.097 195.101 m
-211.492 194.731 l
-242.905 227.089 l
-242.509 227.459 l
-f
-243.485 228.075 m
-238.457 224.95 l
-240.547 222.995 l
-f*
-242.853 227.047 m
-242.561 227.501 l
-238.457 224.95 l
-238.711 224.713 l
-238.899 224.907 l
-239.045 224.68 l
-f
-239.088 225.101 m
-238.711 224.713 l
-240.547 222.995 l
-240.719 223.293 l
-240.482 223.426 l
-240.67 223.62 l
-f
-240.244 223.558 m
-240.719 223.293 l
-243.485 228.075 l
-242.561 227.501 l
-242.707 227.274 l
-242.47 227.406 l
-f
-210.014 194.693 m
-209.698 194.255 l
-233.801 177.524 l
-234.117 177.962 l
-f
-234.879 177.104 m
-230.999 181.533 l
-229.333 179.219 l
-f*
-233.752 177.568 m
-234.166 177.918 l
-230.999 181.533 l
-230.797 181.252 l
-231.02 181.097 l
-230.813 180.922 l
-f
-231.243 180.942 m
-230.797 181.252 l
-229.333 179.219 l
-229.659 179.094 l
-229.758 179.345 l
-229.981 179.19 l
-f
-229.857 179.595 m
-229.659 179.094 l
-234.879 177.104 l
-234.166 177.918 l
-233.959 177.743 l
-234.058 177.993 l
-f
-BT
-/R356 10 Tf
-1 0 0 1 117.24 141.84 Tm
-(Figure) Tj
-1 0 0 1 145.8 141.84 Tm
-(1:) Tj
-1 0 0 1 157.08 141.84 Tm
-(Normal) Tj
-1 0 0 1 190.08 141.84 Tm
-(Case) Tj
-1 0 0 1 211.92 141.84 Tm
-(Operation) Tj
-/R405 10 Tf
-1 0 0 1 72 109.08 Tm
-(4.3) Tj
-1 0 0 1 94.4399 109.08 Tm
-(Garbage) Tj
-1 0 0 1 134.04 109.08 Tm
-(Collection) Tj
-/R356 10 Tf
-1 0 0 1 72 94.92 Tm
-(This) Tj
-1 0 0 1 93.9599 94.92 Tm
-(section) Tj
-1 0 0 1 126.36 94.92 Tm
-(discusses) Tj
-1 0 0 1 167.76 94.92 Tm
-(the) Tj
-1 0 0 1 184.08 94.92 Tm
-(mechanism) Tj
-1 0 0 1 233.759 94.92 Tm
-(used) Tj
-1 0 0 1 256.199 94.92 Tm
-(to) Tj
-1 0 0 1 268.199 94.92 Tm
-(discard) Tj
-1 0 0 1 72 82.92 Tm
-(messages) Tj
-1 0 0 1 112.32 82.92 Tm
-(from) Tj
-1 0 0 1 134.28 82.92 Tm
-(the) Tj
-1 0 0 1 149.16 82.92 Tm
-(log.) Tj
-1 0 0 1 168.48 82.92 Tm
-(F) Tj
-1 0 0 1 173.88 82.92 Tm
-(or) Tj
-1 0 0 1 184.8 82.92 Tm
-(the) Tj
-1 0 0 1 199.68 82.92 Tm
-(safety) Tj
-1 0 0 1 226.08 82.92 Tm
-(condition) Tj
-1 0 0 1 266.399 82.92 Tm
-(to) Tj
-1 0 0 1 276.839 82.92 Tm
-(hold,) Tj
-1 0 0 1 72 71.04 Tm
-(messages) Tj
-1 0 0 1 111.24 71.04 Tm
-(must) Tj
-1 0 0 1 132.36 71.04 Tm
-(be) Tj
-1 0 0 1 143.4 71.04 Tm
-(k) Tj
-1 0 0 1 148.32 71.04 Tm
-(ept) Tj
-1 0 0 1 162.12 71.04 Tm
-(in) Tj
-1 0 0 1 171.6 71.04 Tm
-(a) Tj
-1 0 0 1 177.6 71.04 Tm
-(replica') Tj
-1 0 0 1 207.6 71.04 Tm
-(s) Tj
-1 0 0 1 213.12 71.04 Tm
-(log) Tj
-1 0 0 1 227.519 71.04 Tm
-(until) Tj
-1 0 0 1 247.439 71.04 Tm
-(it) Tj
-1 0 0 1 254.639 71.04 Tm
-(kno) Tj
-1 0 0 1 269.519 71.04 Tm
-(ws) Tj
-1 0 0 1 281.999 71.04 Tm
-(that) Tj
-1 0 0 1 315 709.08 Tm
-(the) Tj
-1 0 0 1 329.88 709.08 Tm
-(requests) Tj
-1 0 0 1 365.16 709.08 Tm
-(the) Tj
-1 0 0 1 377.28 709.08 Tm
-(y) Tj
-1 0 0 1 384.72 709.08 Tm
-(concern) Tj
-1 0 0 1 418.92 709.08 Tm
-(ha) Tj
-1 0 0 1 428.16 709.08 Tm
-(v) Tj
-1 0 0 1 433.08 709.08 Tm
-(e) Tj
-1 0 0 1 440.04 709.08 Tm
-(been) Tj
-1 0 0 1 461.519 709.08 Tm
-(e) Tj
-1 0 0 1 465.84 709.08 Tm
-(x) Tj
-1 0 0 1 470.759 709.08 Tm
-(ecuted) Tj
-1 0 0 1 499.319 709.08 Tm
-(by) Tj
-1 0 0 1 511.919 709.08 Tm
-(at) Tj
-1 0 0 1 521.759 709.08 Tm
-(least) Tj
-ET
-q
-5 0 0 -9.2 315.4 704.2 cm
-/R390 Do
-Q
-q
-6.6 0 0 -6.5 323.9 702.9 cm
-/R394 Do
-Q
-BT
-1 0 0 1 333.6 697.08 Tm
-(1) Tj
-1 0 0 1 341.52 697.08 Tm
-(non-f) Tj
-1 0 0 1 363.24 697.08 Tm
-(aulty) Tj
-1 0 0 1 385.92 697.08 Tm
-(replicas) Tj
-1 0 0 1 419.76 697.08 Tm
-(and) Tj
-1 0 0 1 437.04 697.08 Tm
-(it) Tj
-1 0 0 1 445.559 697.08 Tm
-(can) Tj
-1 0 0 1 462.359 697.08 Tm
-(pro) Tj
-1 0 0 1 475.679 697.08 Tm
-(v) Tj
-1 0 0 1 480.599 697.08 Tm
-(e) Tj
-1 0 0 1 487.679 697.08 Tm
-(this) Tj
-1 0 0 1 504.959 697.08 Tm
-(to) Tj
-1 0 0 1 515.639 697.08 Tm
-(others) Tj
-1 0 0 1 315 685.2 Tm
-(in) Tj
-1 0 0 1 327 685.2 Tm
-(vie) Tj
-1 0 0 1 339 685.2 Tm
-(w) Tj
-1 0 0 1 350.4 685.2 Tm
-(changes.) Tj
-1 0 0 1 393.96 685.2 Tm
-(In) Tj
-1 0 0 1 406.56 685.2 Tm
-(addition,) Tj
-1 0 0 1 446.4 685.2 Tm
-(if) Tj
-1 0 0 1 456.719 685.2 Tm
-(some) Tj
-1 0 0 1 482.039 685.2 Tm
-(replica) Tj
-1 0 0 1 513.479 685.2 Tm
-(misses) Tj
-1 0 0 1 315 673.2 Tm
-(messages) Tj
-1 0 0 1 355.44 673.2 Tm
-(that) Tj
-1 0 0 1 373.32 673.2 Tm
-(were) Tj
-1 0 0 1 395.52 673.2 Tm
-(discarded) Tj
-1 0 0 1 436.56 673.2 Tm
-(by) Tj
-1 0 0 1 449.4 673.2 Tm
-(all) Tj
-1 0 0 1 462.24 673.2 Tm
-(non-f) Tj
-1 0 0 1 483.959 673.2 Tm
-(aulty) Tj
-1 0 0 1 506.519 673.2 Tm
-(replicas,) Tj
-1 0 0 1 315 661.32 Tm
-(it) Tj
-1 0 0 1 323.88 661.32 Tm
-(will) Tj
-1 0 0 1 342.6 661.32 Tm
-(need) Tj
-1 0 0 1 364.8 661.32 Tm
-(to) Tj
-1 0 0 1 375.84 661.32 Tm
-(be) Tj
-1 0 0 1 388.56 661.32 Tm
-(brought) Tj
-1 0 0 1 422.76 661.32 Tm
-(up) Tj
-1 0 0 1 436.08 661.32 Tm
-(to) Tj
-1 0 0 1 447.119 661.32 Tm
-(date) Tj
-1 0 0 1 467.039 661.32 Tm
-(by) Tj
-1 0 0 1 480.239 661.32 Tm
-(transferring) Tj
-1 0 0 1 530.039 661.32 Tm
-(all) Tj
-1 0 0 1 315 649.32 Tm
-(or) Tj
-1 0 0 1 325.92 649.32 Tm
-(a) Tj
-1 0 0 1 333 649.32 Tm
-(portion) Tj
-1 0 0 1 364.44 649.32 Tm
-(of) Tj
-1 0 0 1 375.36 649.32 Tm
-(the) Tj
-1 0 0 1 390.24 649.32 Tm
-(service) Tj
-1 0 0 1 421.08 649.32 Tm
-(state.) Tj
-1 0 0 1 445.92 649.32 Tm
-(Therefore,) Tj
-1 0 0 1 490.319 649.32 Tm
-(replicas) Tj
-1 0 0 1 523.919 649.32 Tm
-(also) Tj
-1 0 0 1 315 637.44 Tm
-(need) Tj
-1 0 0 1 336.36 637.44 Tm
-(some) Tj
-1 0 0 1 359.88 637.44 Tm
-(proof) Tj
-1 0 0 1 383.88 637.44 Tm
-(that) Tj
-1 0 0 1 401.28 637.44 Tm
-(the) Tj
-1 0 0 1 416.04 637.44 Tm
-(state) Tj
-1 0 0 1 436.8 637.44 Tm
-(is) Tj
-1 0 0 1 445.92 637.44 Tm
-(correct.) Tj
-1 0 0 1 324.96 624.96 Tm
-(Generating) Tj
-1 0 0 1 372.72 624.96 Tm
-(these) Tj
-1 0 0 1 396.72 624.96 Tm
-(proofs) Tj
-1 0 0 1 425.64 624.96 Tm
-(after) Tj
-1 0 0 1 447.36 624.96 Tm
-(e) Tj
-1 0 0 1 451.68 624.96 Tm
-(x) Tj
-1 0 0 1 456.6 624.96 Tm
-(ecuting) Tj
-1 0 0 1 489.359 624.96 Tm
-(e) Tj
-1 0 0 1 493.559 624.96 Tm
-(v) Tj
-1 0 0 1 498.479 624.96 Tm
-(ery) Tj
-1 0 0 1 514.559 624.96 Tm
-(opera-) Tj
-1 0 0 1 315 613.08 Tm
-(tion) Tj
-1 0 0 1 334.68 613.08 Tm
-(w) Tj
-1 0 0 1 341.76 613.08 Tm
-(ould) Tj
-1 0 0 1 363.72 613.08 Tm
-(be) Tj
-1 0 0 1 377.28 613.08 Tm
-(e) Tj
-1 0 0 1 381.6 613.08 Tm
-(xpensi) Tj
-1 0 0 1 407.52 613.08 Tm
-(v) Tj
-1 0 0 1 412.44 613.08 Tm
-(e.) Tj
-1 0 0 1 427.8 613.08 Tm
-(Instead,) Tj
-1 0 0 1 463.679 613.08 Tm
-(the) Tj
-1 0 0 1 475.799 613.08 Tm
-(y) Tj
-1 0 0 1 484.919 613.08 Tm
-(are) Tj
-1 0 0 1 501.239 613.08 Tm
-(generated) Tj
-1 0 0 1 315 601.08 Tm
-(periodically) Tj
-1 0 0 1 362.28 601.08 Tm
-(,) Tj
-1 0 0 1 367.08 601.08 Tm
-(when) Tj
-1 0 0 1 391.2 601.08 Tm
-(a) Tj
-1 0 0 1 398.16 601.08 Tm
-(request) Tj
-1 0 0 1 429.48 601.08 Tm
-(with) Tj
-1 0 0 1 449.88 601.08 Tm
-(a) Tj
-1 0 0 1 456.84 601.08 Tm
-(sequence) Tj
-1 0 0 1 495.959 601.08 Tm
-(number) Tj
-1 0 0 1 528.959 601.08 Tm
-(di-) Tj
-1 0 0 1 315 589.2 Tm
-(visible) Tj
-1 0 0 1 344.04 589.2 Tm
-(by) Tj
-1 0 0 1 356.4 589.2 Tm
-(some) Tj
-1 0 0 1 379.8 589.2 Tm
-(constant) Tj
-1 0 0 1 415.44 589.2 Tm
-(\(e.g.,) Tj
-1 0 0 1 438.12 589.2 Tm
-(100\)) Tj
-1 0 0 1 458.759 589.2 Tm
-(is) Tj
-1 0 0 1 467.879 589.2 Tm
-(e) Tj
-1 0 0 1 472.199 589.2 Tm
-(x) Tj
-1 0 0 1 477.119 589.2 Tm
-(ecuted.) Tj
-1 0 0 1 509.039 589.2 Tm
-(W) Tj
-1 0 0 1 517.559 589.2 Tm
-(e) Tj
-1 0 0 1 524.519 589.2 Tm
-(will) Tj
-1 0 0 1 315 577.2 Tm
-(refer) Tj
-1 0 0 1 336.48 577.2 Tm
-(to) Tj
-1 0 0 1 346.92 577.2 Tm
-(the) Tj
-1 0 0 1 361.68 577.2 Tm
-(states) Tj
-1 0 0 1 386.52 577.2 Tm
-(produced) Tj
-1 0 0 1 426.24 577.2 Tm
-(by) Tj
-1 0 0 1 438.84 577.2 Tm
-(the) Tj
-1 0 0 1 453.72 577.2 Tm
-(e) Tj
-1 0 0 1 458.04 577.2 Tm
-(x) Tj
-1 0 0 1 462.959 577.2 Tm
-(ecution) Tj
-1 0 0 1 494.879 577.2 Tm
-(of) Tj
-1 0 0 1 505.799 577.2 Tm
-(these) Tj
-1 0 0 1 528.959 577.2 Tm
-(re-) Tj
-1 0 0 1 315 565.32 Tm
-(quests) Tj
-1 0 0 1 342.96 565.32 Tm
-(as) Tj
-/R359 10 Tf
-1 0 0 1 354.24 565.32 Tm
-(c) Tj
-1 0 0 1 358.56 565.32 Tm
-(hec) Tj
-1 0 0 1 372.24 565.32 Tm
-(kpoints) Tj
-/R356 10 Tf
-1 0 0 1 403.92 565.32 Tm
-(and) Tj
-1 0 0 1 421.44 565.32 Tm
-(we) Tj
-1 0 0 1 436.079 565.32 Tm
-(will) Tj
-1 0 0 1 454.559 565.32 Tm
-(say) Tj
-1 0 0 1 470.879 565.32 Tm
-(that) Tj
-1 0 0 1 488.879 565.32 Tm
-(a) Tj
-1 0 0 1 496.319 565.32 Tm
-(checkpoint) Tj
-1 0 0 1 315 553.32 Tm
-(with) Tj
-1 0 0 1 335.16 553.32 Tm
-(a) Tj
-1 0 0 1 342.12 553.32 Tm
-(proof) Tj
-1 0 0 1 366.24 553.32 Tm
-(is) Tj
-1 0 0 1 375.36 553.32 Tm
-(a) Tj
-/R359 10 Tf
-1 0 0 1 382.2 553.32 Tm
-(stable) Tj
-1 0 0 1 408.48 553.32 Tm
-(c) Tj
-1 0 0 1 412.8 553.32 Tm
-(hec) Tj
-1 0 0 1 426.48 553.32 Tm
-(kpoint) Tj
-/R356 10 Tf
-1 0 0 1 451.559 553.32 Tm
-(.) Tj
-1 0 0 1 324.96 540.96 Tm
-(A) Tj
-1 0 0 1 333.72 540.96 Tm
-(replica) Tj
-1 0 0 1 362.52 540.96 Tm
-(maintains) Tj
-1 0 0 1 402.96 540.96 Tm
-(se) Tj
-1 0 0 1 411 540.96 Tm
-(v) Tj
-1 0 0 1 415.92 540.96 Tm
-(eral) Tj
-1 0 0 1 432.48 540.96 Tm
-(logical) Tj
-1 0 0 1 461.279 540.96 Tm
-(copies) Tj
-1 0 0 1 488.399 540.96 Tm
-(of) Tj
-1 0 0 1 498.359 540.96 Tm
-(the) Tj
-1 0 0 1 512.159 540.96 Tm
-(service) Tj
-1 0 0 1 315 529.08 Tm
-(state:) Tj
-1 0 0 1 339.24 529.08 Tm
-(the) Tj
-1 0 0 1 353.04 529.08 Tm
-(last) Tj
-1 0 0 1 368.52 529.08 Tm
-(stable) Tj
-1 0 0 1 393.48 529.08 Tm
-(checkpoint,) Tj
-1 0 0 1 441.479 529.08 Tm
-(zero) Tj
-1 0 0 1 460.319 529.08 Tm
-(or) Tj
-1 0 0 1 470.279 529.08 Tm
-(more) Tj
-1 0 0 1 492.359 529.08 Tm
-(checkpoints) Tj
-1 0 0 1 315 517.08 Tm
-(that) Tj
-1 0 0 1 333.6 517.08 Tm
-(are) Tj
-1 0 0 1 349.44 517.08 Tm
-(not) Tj
-1 0 0 1 365.88 517.08 Tm
-(stable,) Tj
-1 0 0 1 395.52 517.08 Tm
-(and) Tj
-1 0 0 1 413.64 517.08 Tm
-(a) Tj
-1 0 0 1 421.679 517.08 Tm
-(current) Tj
-1 0 0 1 453.599 517.08 Tm
-(state.) Tj
-1 0 0 1 481.439 517.08 Tm
-(Cop) Tj
-1 0 0 1 497.999 517.08 Tm
-(y-on-write) Tj
-1 0 0 1 315 505.2 Tm
-(techniques) Tj
-1 0 0 1 362.16 505.2 Tm
-(can) Tj
-1 0 0 1 380.4 505.2 Tm
-(be) Tj
-1 0 0 1 394.32 505.2 Tm
-(used) Tj
-1 0 0 1 417.12 505.2 Tm
-(to) Tj
-1 0 0 1 429.36 505.2 Tm
-(reduce) Tj
-1 0 0 1 460.44 505.2 Tm
-(the) Tj
-1 0 0 1 477.119 505.2 Tm
-(space) Tj
-1 0 0 1 503.759 505.2 Tm
-(o) Tj
-1 0 0 1 508.679 505.2 Tm
-(v) Tj
-1 0 0 1 513.599 505.2 Tm
-(erhead) Tj
-1 0 0 1 315 493.2 Tm
-(to) Tj
-1 0 0 1 327.24 493.2 Tm
-(store) Tj
-1 0 0 1 351 493.2 Tm
-(the) Tj
-1 0 0 1 367.68 493.2 Tm
-(e) Tj
-1 0 0 1 372 493.2 Tm
-(xtra) Tj
-1 0 0 1 391.92 493.2 Tm
-(copies) Tj
-1 0 0 1 421.8 493.2 Tm
-(of) Tj
-1 0 0 1 434.52 493.2 Tm
-(the) Tj
-1 0 0 1 451.2 493.2 Tm
-(state,) Tj
-1 0 0 1 476.879 493.2 Tm
-(as) Tj
-1 0 0 1 489.599 493.2 Tm
-(discussed) Tj
-1 0 0 1 532.199 493.2 Tm
-(in) Tj
-1 0 0 1 315 481.2 Tm
-(Section) Tj
-1 0 0 1 347.4 481.2 Tm
-(6.3.) Tj
-1 0 0 1 324.96 468.84 Tm
-(The) Tj
-1 0 0 1 342.96 468.84 Tm
-(proof) Tj
-1 0 0 1 366.96 468.84 Tm
-(of) Tj
-1 0 0 1 377.76 468.84 Tm
-(correctness) Tj
-1 0 0 1 425.04 468.84 Tm
-(for) Tj
-1 0 0 1 439.08 468.84 Tm
-(a) Tj
-1 0 0 1 446.04 468.84 Tm
-(checkpoint) Tj
-1 0 0 1 492.119 468.84 Tm
-(is) Tj
-1 0 0 1 501.239 468.84 Tm
-(generated) Tj
-1 0 0 1 315 456.96 Tm
-(as) Tj
-1 0 0 1 327.6 456.96 Tm
-(follo) Tj
-1 0 0 1 346.32 456.96 Tm
-(ws.) Tj
-1 0 0 1 368.76 456.96 Tm
-(When) Tj
-1 0 0 1 396.84 456.96 Tm
-(a) Tj
-1 0 0 1 405.6 456.96 Tm
-(replica) Tj
-ET
-q
-2.6 0 0 -6.9 437.2 463.8 cm
-/R386 Do
-Q
-BT
-1 0 0 1 444.84 456.96 Tm
-(produces) Tj
-1 0 0 1 485.04 456.96 Tm
-(a) Tj
-1 0 0 1 493.799 456.96 Tm
-(checkpoint,) Tj
-1 0 0 1 315 444.96 Tm
-(it) Tj
-1 0 0 1 324.96 444.96 Tm
-(multicasts) Tj
-1 0 0 1 369.84 444.96 Tm
-(a) Tj
-1 0 0 1 378.6 444.96 Tm
-(message) Tj
-ET
-endstream
-endobj
-407 0 obj
-18527
-endobj
-408 0 obj
-<< /Type /XObject /Name /R408 /Subtype /Image /Length 409 0 R
-/ImageMask true /Width 24 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 24 /BlackIs1 true >>]
->>
-stream
-+t-07X8N5#0B"SKInTVGqHrM(f3_PN_YUJ4L&^prs)7cFqg[B")ufa0GPC"Nr'(,Kmt^kVHo1m8!<~>
-endstream
-endobj
-409 0 obj
-80
-endobj
-410 0 obj
-<< /Length 411 0 R >>
-stream
-q
-2.4 0 0 -9.9 417.8 452.5 cm
-/R408 Do
-Q
-BT
-/R356 8 Tf
-1 0 0 1 420.72 444.96 Tm
-(CHECKPOINT) Tj
-ET
-q
-1.3 0 0 -3 472 446.1 cm
-/R370 Do
-Q
-q
-5.4 0 0 -4.6 475.9 449.5 cm
-/R378 Do
-Q
-q
-1.3 0 0 -3 482.5 446.1 cm
-/R370 Do
-Q
-endstream
-endobj
-411 0 obj
-216
-endobj
-412 0 obj
-<< /Type /XObject /Name /R412 /Subtype /Image /Length 413 0 R
-/ImageMask true /Width 49 /Height 71 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 49 /BlackIs1 true >>]
->>
-stream
--PYiBJV"+0)UN3G',i&VcojQ(@sYoeKmuDG
-s)&q9s*o7jJ)C$Fpj^'QJ%rnUr&sfAs+VQL0)H)pV[&D-@^p.P-,mCns*qra5O\@FpQ6S*nl.";J-Z~>
-endstream
-endobj
-413 0 obj
-117
-endobj
-414 0 obj
-<< /Length 415 0 R >>
-stream
-q
-4.9 0 0 -7.1 486.4 452 cm
-/R412 Do
-Q
-q
-1.3 0 0 -3 492.1 446.1 cm
-/R370 Do
-Q
-q
-2.6 0 0 -6.9 495.9 451.8 cm
-/R386 Do
-Q
-endstream
-endobj
-415 0 obj
-119
-endobj
-416 0 obj
-<< /Type /XObject /Name /R416 /Subtype /Image /Length 417 0 R
-/ImageMask true /Width 24 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 24 /BlackIs1 true >>]
->>
-stream
-02pd&htA/cs0qnbrP.\`mJhV5_u&o]hqrq@J+[15ImJQWpe1HjlFsc8R~>
-endstream
-endobj
-417 0 obj
-78
-endobj
-418 0 obj
-<< /Length 419 0 R >>
-stream
-q
-2.4 0 0 -9.9 499.6 452.5 cm
-/R416 Do
-Q
-endstream
-endobj
-419 0 obj
-41
-endobj
-420 0 obj
-<< /Type /XObject /Name /R420 /Subtype /Image /Length 421 0 R
-/ImageMask true /Width 42 /Height 31 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 42 /BlackIs1 true >>]
->>
-stream
-1`R)4"qZ&4%Y>/aKS+]fJ#a+Sp>>oFIt)n@>7^\DYeoBbLCXeP2$%q%J-Z~>
-endstream
-endobj
-421 0 obj
-61
-endobj
-422 0 obj
-<< /Length 423 0 R >>
-stream
-q
-4.2 0 0 -3.1 503.2 446.5 cm
-/R420 Do
-Q
-endstream
-endobj
-423 0 obj
-41
-endobj
-424 0 obj
-<< /Type /XObject /Name /R424 /Subtype /Image /Length 425 0 R
-/ImageMask true /Width 17 /Height 35 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 17 /BlackIs1 true >>]
->>
-stream
-4B*=`S,;]mpj7Y*s1(">iS6Nohi?6cs!N02p(RKl"9~>
-endstream
-endobj
-425 0 obj
-45
-endobj
-426 0 obj
-<< /Length 427 0 R >>
-stream
-q
-1.7 0 0 -3.5 507.9 446.1 cm
-/R424 Do
-Q
-BT
-/R356 10 Tf
-1 0 0 1 515.64 444.96 Tm
-(to) Tj
-1 0 0 1 527.88 444.96 Tm
-(the) Tj
-1 0 0 1 315 433.08 Tm
-(other) Tj
-1 0 0 1 339.24 433.08 Tm
-(replicas,) Tj
-1 0 0 1 376.92 433.08 Tm
-(where) Tj
-ET
-q
-5.4 0 0 -4.6 405.2 437.6 cm
-/R378 Do
-Q
-BT
-1 0 0 1 414.72 433.08 Tm
-(is) Tj
-1 0 0 1 425.16 433.08 Tm
-(the) Tj
-1 0 0 1 441.24 433.08 Tm
-(sequence) Tj
-1 0 0 1 481.44 433.08 Tm
-(number) Tj
-1 0 0 1 515.759 433.08 Tm
-(of) Tj
-1 0 0 1 527.879 433.08 Tm
-(the) Tj
-1 0 0 1 315 421.08 Tm
-(last) Tj
-1 0 0 1 333.72 421.08 Tm
-(request) Tj
-1 0 0 1 367.44 421.08 Tm
-(whose) Tj
-1 0 0 1 397.8 421.08 Tm
-(e) Tj
-1 0 0 1 402.12 421.08 Tm
-(x) Tj
-1 0 0 1 407.04 421.08 Tm
-(ecution) Tj
-1 0 0 1 441.24 421.08 Tm
-(is) Tj
-1 0 0 1 452.76 421.08 Tm
-(re\257ected) Tj
-1 0 0 1 491.999 421.08 Tm
-(in) Tj
-1 0 0 1 504.599 421.08 Tm
-(the) Tj
-1 0 0 1 521.759 421.08 Tm
-(state) Tj
-1 0 0 1 315 409.2 Tm
-(and) Tj
-ET
-q
-4.9 0 0 -7.1 333.7 416.2 cm
-/R412 Do
-Q
-BT
-1 0 0 1 342.6 409.2 Tm
-(is) Tj
-1 0 0 1 353.16 409.2 Tm
-(the) Tj
-1 0 0 1 369.36 409.2 Tm
-(digest) Tj
-1 0 0 1 397.2 409.2 Tm
-(of) Tj
-1 0 0 1 409.44 409.2 Tm
-(the) Tj
-1 0 0 1 425.64 409.2 Tm
-(state.) Tj
-1 0 0 1 454.559 409.2 Tm
-(Each) Tj
-1 0 0 1 478.439 409.2 Tm
-(replica) Tj
-1 0 0 1 509.519 409.2 Tm
-(collects) Tj
-1 0 0 1 315 397.2 Tm
-(checkpoint) Tj
-1 0 0 1 363 397.2 Tm
-(messages) Tj
-1 0 0 1 404.88 397.2 Tm
-(in) Tj
-1 0 0 1 416.88 397.2 Tm
-(its) Tj
-1 0 0 1 430.56 397.2 Tm
-(log) Tj
-1 0 0 1 447.48 397.2 Tm
-(until) Tj
-1 0 0 1 470.04 397.2 Tm
-(it) Tj
-1 0 0 1 479.879 397.2 Tm
-(has) Tj
-1 0 0 1 497.399 397.2 Tm
-(2) Tj
-ET
-q
-5 0 0 -9.2 502.8 404.3 cm
-/R390 Do
-Q
-q
-6.6 0 0 -6.5 512.1 403 cm
-/R394 Do
-Q
-BT
-1 0 0 1 522.479 397.2 Tm
-(1) Tj
-1 0 0 1 531.719 397.2 Tm
-(of) Tj
-1 0 0 1 315 385.32 Tm
-(them) Tj
-1 0 0 1 339.48 385.32 Tm
-(for) Tj
-1 0 0 1 355.68 385.32 Tm
-(sequence) Tj
-1 0 0 1 396.84 385.32 Tm
-(number) Tj
-ET
-q
-5.4 0 0 -4.6 432 389.8 cm
-/R378 Do
-Q
-BT
-1 0 0 1 442.32 385.32 Tm
-(with) Tj
-1 0 0 1 464.64 385.32 Tm
-(the) Tj
-1 0 0 1 481.44 385.32 Tm
-(same) Tj
-1 0 0 1 506.4 385.32 Tm
-(digest) Tj
-ET
-q
-4.9 0 0 -7.1 535.1 392.3 cm
-/R412 Do
-Q
-BT
-1 0 0 1 315 373.32 Tm
-(signed) Tj
-1 0 0 1 344.4 373.32 Tm
-(by) Tj
-1 0 0 1 357.72 373.32 Tm
-(dif) Tj
-1 0 0 1 368.64 373.32 Tm
-(ferent) Tj
-1 0 0 1 395.04 373.32 Tm
-(replicas) Tj
-1 0 0 1 429.48 373.32 Tm
-(\(including) Tj
-1 0 0 1 473.759 373.32 Tm
-(possibly) Tj
-1 0 0 1 510.359 373.32 Tm
-(its) Tj
-1 0 0 1 523.079 373.32 Tm
-(o) Tj
-1 0 0 1 527.879 373.32 Tm
-(wn) Tj
-1 0 0 1 315 361.44 Tm
-(such) Tj
-1 0 0 1 336 361.44 Tm
-(message\).) Tj
-1 0 0 1 379.8 361.44 Tm
-(These) Tj
-1 0 0 1 406.32 361.44 Tm
-(2) Tj
-ET
-q
-5 0 0 -9.2 411.8 368.5 cm
-/R390 Do
-Q
-q
-6.6 0 0 -6.5 420 367.2 cm
-/R394 Do
-Q
-BT
-1 0 0 1 429.6 361.44 Tm
-(1) Tj
-1 0 0 1 437.28 361.44 Tm
-(messages) Tj
-1 0 0 1 477.6 361.44 Tm
-(are) Tj
-1 0 0 1 492.48 361.44 Tm
-(the) Tj
-1 0 0 1 507.359 361.44 Tm
-(proof) Tj
-1 0 0 1 531.719 361.44 Tm
-(of) Tj
-1 0 0 1 315 349.44 Tm
-(correctness) Tj
-1 0 0 1 362.28 349.44 Tm
-(for) Tj
-1 0 0 1 376.44 349.44 Tm
-(the) Tj
-1 0 0 1 391.08 349.44 Tm
-(checkpoint.) Tj
-1 0 0 1 324.96 337.08 Tm
-(A) Tj
-1 0 0 1 336.6 337.08 Tm
-(checkpoint) Tj
-1 0 0 1 384.84 337.08 Tm
-(with) Tj
-1 0 0 1 407.04 337.08 Tm
-(a) Tj
-1 0 0 1 415.92 337.08 Tm
-(proof) Tj
-1 0 0 1 441.96 337.08 Tm
-(becomes) Tj
-1 0 0 1 481.2 337.08 Tm
-(stable) Tj
-1 0 0 1 508.919 337.08 Tm
-(and) Tj
-1 0 0 1 527.879 337.08 Tm
-(the) Tj
-1 0 0 1 315 325.08 Tm
-(replica) Tj
-1 0 0 1 346.92 325.08 Tm
-(discards) Tj
-1 0 0 1 384.24 325.08 Tm
-(all) Tj
-1 0 0 1 399 325.08 Tm
-(pre-prepare,) Tj
-1 0 0 1 452.76 325.08 Tm
-(prepare,) Tj
-1 0 0 1 490.439 325.08 Tm
-(and) Tj
-1 0 0 1 509.519 325.08 Tm
-(commit) Tj
-1 0 0 1 315 313.2 Tm
-(messages) Tj
-1 0 0 1 356.76 313.2 Tm
-(with) Tj
-1 0 0 1 378.6 313.2 Tm
-(sequence) Tj
-1 0 0 1 419.28 313.2 Tm
-(number) Tj
-1 0 0 1 453.84 313.2 Tm
-(less) Tj
-1 0 0 1 472.8 313.2 Tm
-(than) Tj
-1 0 0 1 494.159 313.2 Tm
-(or) Tj
-1 0 0 1 506.519 313.2 Tm
-(equal) Tj
-1 0 0 1 532.199 313.2 Tm
-(to) Tj
-ET
-q
-5.4 0 0 -4.6 315.2 305.7 cm
-/R378 Do
-Q
-BT
-1 0 0 1 323.28 301.2 Tm
-(from) Tj
-1 0 0 1 345 301.2 Tm
-(its) Tj
-1 0 0 1 356.64 301.2 Tm
-(log;) Tj
-1 0 0 1 374.52 301.2 Tm
-(it) Tj
-1 0 0 1 382.44 301.2 Tm
-(also) Tj
-1 0 0 1 400.8 301.2 Tm
-(discards) Tj
-1 0 0 1 435.719 301.2 Tm
-(all) Tj
-1 0 0 1 447.959 301.2 Tm
-(earlier) Tj
-1 0 0 1 475.679 301.2 Tm
-(checkpoints) Tj
-1 0 0 1 525.599 301.2 Tm
-(and) Tj
-1 0 0 1 315 289.32 Tm
-(checkpoint) Tj
-1 0 0 1 361.2 289.32 Tm
-(messages.) Tj
-1 0 0 1 324.96 276.96 Tm
-(Computing) Tj
-1 0 0 1 373.56 276.96 Tm
-(the) Tj
-1 0 0 1 389.4 276.96 Tm
-(proofs) Tj
-1 0 0 1 418.56 276.96 Tm
-(is) Tj
-1 0 0 1 429 276.96 Tm
-(ef) Tj
-1 0 0 1 436.56 276.96 Tm
-(\256cient) Tj
-1 0 0 1 465 276.96 Tm
-(because) Tj
-1 0 0 1 500.279 276.96 Tm
-(the) Tj
-1 0 0 1 516.239 276.96 Tm
-(digest) Tj
-1 0 0 1 315 264.96 Tm
-(can) Tj
-1 0 0 1 331.8 264.96 Tm
-(be) Tj
-1 0 0 1 344.16 264.96 Tm
-(computed) Tj
-1 0 0 1 386.52 264.96 Tm
-(using) Tj
-1 0 0 1 411 264.96 Tm
-(incremental) Tj
-1 0 0 1 461.04 264.96 Tm
-(cryptography) Tj
-1 0 0 1 517.079 264.96 Tm
-([1) Tj
-1 0 0 1 525.359 264.96 Tm
-(]) Tj
-1 0 0 1 531.719 264.96 Tm
-(as) Tj
-1 0 0 1 315 253.08 Tm
-(discussed) Tj
-1 0 0 1 355.44 253.08 Tm
-(in) Tj
-1 0 0 1 365.52 253.08 Tm
-(Section) Tj
-1 0 0 1 397.68 253.08 Tm
-(6.3,) Tj
-1 0 0 1 414.96 253.08 Tm
-(and) Tj
-1 0 0 1 431.64 253.08 Tm
-(proofs) Tj
-1 0 0 1 459.479 253.08 Tm
-(are) Tj
-1 0 0 1 473.879 253.08 Tm
-(generated) Tj
-1 0 0 1 514.919 253.08 Tm
-(rarely) Tj
-1 0 0 1 537.719 253.08 Tm
-(.) Tj
-1 0 0 1 324.96 240.72 Tm
-(The) Tj
-1 0 0 1 344.28 240.72 Tm
-(checkpoint) Tj
-1 0 0 1 391.8 240.72 Tm
-(protocol) Tj
-1 0 0 1 428.88 240.72 Tm
-(is) Tj
-1 0 0 1 439.32 240.72 Tm
-(used) Tj
-1 0 0 1 461.52 240.72 Tm
-(to) Tj
-1 0 0 1 473.04 240.72 Tm
-(adv) Tj
-1 0 0 1 487.319 240.72 Tm
-(ance) Tj
-1 0 0 1 509.279 240.72 Tm
-(the) Tj
-1 0 0 1 525.359 240.72 Tm
-(lo) Tj
-1 0 0 1 532.919 240.72 Tm
-(w) Tj
-1 0 0 1 315 228.72 Tm
-(and) Tj
-1 0 0 1 332.88 228.72 Tm
-(high) Tj
-1 0 0 1 354 228.72 Tm
-(w) Tj
-1 0 0 1 361.08 228.72 Tm
-(ater) Tj
-1 0 0 1 379.44 228.72 Tm
-(marks) Tj
-1 0 0 1 407.28 228.72 Tm
-(\(which) Tj
-1 0 0 1 438.36 228.72 Tm
-(limit) Tj
-1 0 0 1 460.56 228.72 Tm
-(what) Tj
-1 0 0 1 483.479 228.72 Tm
-(messages) Tj
-1 0 0 1 524.519 228.72 Tm
-(will) Tj
-1 0 0 1 315 216.84 Tm
-(be) Tj
-1 0 0 1 328.8 216.84 Tm
-(accepted\).) Tj
-1 0 0 1 378.96 216.84 Tm
-(The) Tj
-1 0 0 1 398.88 216.84 Tm
-(lo) Tj
-1 0 0 1 406.44 216.84 Tm
-(w-w) Tj
-1 0 0 1 424.08 216.84 Tm
-(ater) Tj
-1 0 0 1 443.4 216.84 Tm
-(mark) Tj
-ET
-endstream
-endobj
-427 0 obj
-6379
-endobj
-428 0 obj
-<< /Type /XObject /Name /R428 /Subtype /Image /Length 429 0 R
-/ImageMask true /Width 50 /Height 71 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 50 /BlackIs1 true >>]
->>
-stream
-0Zl\u@0_OZ#Wp,3rBJ3g^\>2:
-rV-&ursUj$gmgWn*E:5fO9!_pbg-FlJ[WfIqQ^[&,mZcqtL,7s*eVhs5pRo!WX>~>
-endstream
-endobj
-429 0 obj
-108
-endobj
-430 0 obj
-<< /Length 431 0 R >>
-stream
-q
-5 0 0 -7.1 468.8 223.8 cm
-/R428 Do
-Q
-BT
-1 0 0 1 478.56 216.84 Tm
-(is) Tj
-1 0 0 1 489.6 216.84 Tm
-(equal) Tj
-1 0 0 1 515.639 216.84 Tm
-(to) Tj
-1 0 0 1 527.879 216.84 Tm
-(the) Tj
-1 0 0 1 315 204.84 Tm
-(sequence) Tj
-1 0 0 1 354 204.84 Tm
-(number) Tj
-1 0 0 1 387 204.84 Tm
-(of) Tj
-1 0 0 1 397.68 204.84 Tm
-(the) Tj
-1 0 0 1 412.44 204.84 Tm
-(last) Tj
-1 0 0 1 428.76 204.84 Tm
-(stable) Tj
-1 0 0 1 454.44 204.84 Tm
-(checkpoint.) Tj
-1 0 0 1 504.239 204.84 Tm
-(The) Tj
-1 0 0 1 522.239 204.84 Tm
-(high) Tj
-1 0 0 1 315 192.84 Tm
-(w) Tj
-1 0 0 1 322.08 192.84 Tm
-(ater) Tj
-1 0 0 1 340.2 192.84 Tm
-(mark) Tj
-ET
-endstream
-endobj
-431 0 obj
-599
-endobj
-432 0 obj
-<< /Type /XObject /Name /R432 /Subtype /Image /Length 433 0 R
-/ImageMask true /Width 84 /Height 69 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 84 /BlackIs1 true >>]
->>
-stream
--D8e7)F+8D_$Y]c$*6AK
-mN;?)rZ1b5h;A,.rpTgb+7B0HrVjk:r%\j3J,S4'^YeJZhr4S'r'0*,+8c$9*VY&PJY_cls1
-endstream
-endobj
-433 0 obj
-102
-endobj
-434 0 obj
-<< /Length 435 0 R >>
-stream
-q
-8.4 0 0 -6.9 364.3 199.7 cm
-/R432 Do
-Q
-endstream
-endobj
-435 0 obj
-41
-endobj
-436 0 obj
-<< /Type /XObject /Name /R436 /Subtype /Image /Length 437 0 R
-/ImageMask true /Width 66 /Height 27 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 66 /BlackIs1 true >>]
->>
-stream
-/e%CP4)j*Wq&BoPm6CdS5Q~>
-endstream
-endobj
-437 0 obj
-25
-endobj
-438 0 obj
-<< /Length 439 0 R >>
-stream
-q
-6.6 0 0 -2.7 377.3 196.7 cm
-/R436 Do
-Q
-q
-5 0 0 -7.1 388.7 199.8 cm
-/R428 Do
-Q
-q
-6.6 0 0 -6.5 397.1 198.6 cm
-/R394 Do
-Q
-endstream
-endobj
-439 0 obj
-121
-endobj
-440 0 obj
-<< /Type /XObject /Name /R440 /Subtype /Image /Length 441 0 R
-/ImageMask true /Width 47 /Height 71 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 47 /BlackIs1 true >>]
->>
-stream
-0ZYuc@0_O>l/"oP624[@s1A
-endstream
-endobj
-441 0 obj
-119
-endobj
-442 0 obj
-<< /Length 443 0 R >>
-stream
-q
-4.7 0 0 -7.1 407.4 199.8 cm
-/R440 Do
-Q
-BT
-1 0 0 1 412.56 192.84 Tm
-(,) Tj
-1 0 0 1 418.44 192.84 Tm
-(where) Tj
-ET
-q
-4.7 0 0 -7.1 446.3 199.8 cm
-/R440 Do
-Q
-BT
-1 0 0 1 454.679 192.84 Tm
-(is) Tj
-1 0 0 1 464.519 192.84 Tm
-(big) Tj
-1 0 0 1 480.479 192.84 Tm
-(enough) Tj
-1 0 0 1 512.999 192.84 Tm
-(so) Tj
-1 0 0 1 524.999 192.84 Tm
-(that) Tj
-1 0 0 1 315 180.96 Tm
-(replicas) Tj
-1 0 0 1 348.96 180.96 Tm
-(do) Tj
-1 0 0 1 361.8 180.96 Tm
-(not) Tj
-1 0 0 1 377.52 180.96 Tm
-(stall) Tj
-1 0 0 1 397.08 180.96 Tm
-(w) Tj
-1 0 0 1 404.16 180.96 Tm
-(aiting) Tj
-1 0 0 1 429.72 180.96 Tm
-(for) Tj
-1 0 0 1 444.359 180.96 Tm
-(a) Tj
-1 0 0 1 451.679 180.96 Tm
-(checkpoint) Tj
-1 0 0 1 498.359 180.96 Tm
-(to) Tj
-1 0 0 1 509.039 180.96 Tm
-(become) Tj
-1 0 0 1 315 168.96 Tm
-(stable.) Tj
-1 0 0 1 345.6 168.96 Tm
-(F) Tj
-1 0 0 1 351 168.96 Tm
-(or) Tj
-1 0 0 1 362.28 168.96 Tm
-(e) Tj
-1 0 0 1 366.6 168.96 Tm
-(xample,) Tj
-1 0 0 1 401.4 168.96 Tm
-(if) Tj
-1 0 0 1 410.4 168.96 Tm
-(checkpoints) Tj
-1 0 0 1 460.919 168.96 Tm
-(are) Tj
-1 0 0 1 476.039 168.96 Tm
-(tak) Tj
-1 0 0 1 488.159 168.96 Tm
-(en) Tj
-1 0 0 1 500.399 168.96 Tm
-(e) Tj
-1 0 0 1 504.599 168.96 Tm
-(v) Tj
-1 0 0 1 509.519 168.96 Tm
-(ery) Tj
-1 0 0 1 524.999 168.96 Tm
-(100) Tj
-1 0 0 1 315 157.08 Tm
-(requests,) Tj
-ET
-q
-4.7 0 0 -7.1 353.1 164.1 cm
-/R440 Do
-Q
-BT
-1 0 0 1 360.6 157.08 Tm
-(might) Tj
-1 0 0 1 386.4 157.08 Tm
-(be) Tj
-1 0 0 1 398.28 157.08 Tm
-(200.) Tj
-/R405 10 Tf
-1 0 0 1 315 133.8 Tm
-(4.4) Tj
-1 0 0 1 337.44 133.8 Tm
-(V) Tj
-1 0 0 1 344.28 133.8 Tm
-(iew) Tj
-1 0 0 1 361.08 133.8 Tm
-(Changes) Tj
-/R356 10 Tf
-1 0 0 1 315 118.8 Tm
-(The) Tj
-1 0 0 1 333 118.8 Tm
-(vie) Tj
-1 0 0 1 345 118.8 Tm
-(w-change) Tj
-1 0 0 1 386.16 118.8 Tm
-(protocol) Tj
-1 0 0 1 421.92 118.8 Tm
-(pro) Tj
-1 0 0 1 435.24 118.8 Tm
-(vides) Tj
-1 0 0 1 458.64 118.8 Tm
-(li) Tj
-1 0 0 1 463.92 118.8 Tm
-(v) Tj
-1 0 0 1 468.84 118.8 Tm
-(eness) Tj
-1 0 0 1 492.839 118.8 Tm
-(by) Tj
-1 0 0 1 505.319 118.8 Tm
-(allo) Tj
-1 0 0 1 520.079 118.8 Tm
-(wing) Tj
-1 0 0 1 315 106.8 Tm
-(the) Tj
-1 0 0 1 328.92 106.8 Tm
-(system) Tj
-1 0 0 1 358.32 106.8 Tm
-(to) Tj
-1 0 0 1 367.8 106.8 Tm
-(mak) Tj
-1 0 0 1 384.96 106.8 Tm
-(e) Tj
-1 0 0 1 391.08 106.8 Tm
-(progress) Tj
-1 0 0 1 426.72 106.8 Tm
-(when) Tj
-1 0 0 1 450.12 106.8 Tm
-(th) Tj
-1 0 0 1 457.799 106.8 Tm
-(e) Tj
-1 0 0 1 463.919 106.8 Tm
-(pr) Tj
-1 0 0 1 472.199 106.8 Tm
-(imar) Tj
-1 0 0 1 490.439 106.8 Tm
-(y) Tj
-1 0 0 1 497.159 106.8 Tm
-(f) Tj
-1 0 0 1 500.279 106.8 Tm
-(ails.) Tj
-1 0 0 1 519.239 106.8 Tm
-(V) Tj
-1 0 0 1 525.839 106.8 Tm
-(ie) Tj
-1 0 0 1 532.799 106.8 Tm
-(w) Tj
-1 0 0 1 315 94.92 Tm
-(changes) Tj
-1 0 0 1 350.4 94.92 Tm
-(are) Tj
-1 0 0 1 366 94.92 Tm
-(triggered) Tj
-1 0 0 1 405.24 94.92 Tm
-(by) Tj
-1 0 0 1 418.56 94.92 Tm
-(timeouts) Tj
-1 0 0 1 456.24 94.92 Tm
-(that) Tj
-1 0 0 1 474.479 94.92 Tm
-(pre) Tj
-1 0 0 1 487.079 94.92 Tm
-(v) Tj
-1 0 0 1 491.999 94.92 Tm
-(ent) Tj
-1 0 0 1 507.359 94.92 Tm
-(backups) Tj
-1 0 0 1 315 82.92 Tm
-(from) Tj
-1 0 0 1 339.12 82.92 Tm
-(w) Tj
-1 0 0 1 346.2 82.92 Tm
-(aiting) Tj
-1 0 0 1 373.56 82.92 Tm
-(inde\256nitely) Tj
-1 0 0 1 423.72 82.92 Tm
-(for) Tj
-1 0 0 1 440.04 82.92 Tm
-(requests) Tj
-1 0 0 1 477.479 82.92 Tm
-(to) Tj
-1 0 0 1 489.839 82.92 Tm
-(e) Tj
-1 0 0 1 494.159 82.92 Tm
-(x) Tj
-1 0 0 1 499.079 82.92 Tm
-(ecute.) Tj
-1 0 0 1 532.799 82.92 Tm
-(A) Tj
-1 0 0 1 315 71.04 Tm
-(backup) Tj
-1 0 0 1 345.6 71.04 Tm
-(is) Tj
-/R359 10 Tf
-1 0 0 1 353.76 71.04 Tm
-(waiting) Tj
-/R356 10 Tf
-1 0 0 1 384.96 71.04 Tm
-(for) Tj
-1 0 0 1 398.28 71.04 Tm
-(a) Tj
-1 0 0 1 404.28 71.04 Tm
-(request) Tj
-1 0 0 1 434.76 71.04 Tm
-(if) Tj
-1 0 0 1 442.44 71.04 Tm
-(it) Tj
-1 0 0 1 449.519 71.04 Tm
-(recei) Tj
-1 0 0 1 468.719 71.04 Tm
-(v) Tj
-1 0 0 1 473.639 71.04 Tm
-(ed) Tj
-1 0 0 1 484.679 71.04 Tm
-(a) Tj
-1 0 0 1 490.679 71.04 Tm
-(v) Tj
-1 0 0 1 495.479 71.04 Tm
-(alid) Tj
-1 0 0 1 511.919 71.04 Tm
-(req) Tj
-1 0 0 1 524.639 71.04 Tm
-(uest) Tj
-1 0 0 1 303.48 35.16 Tm
-(5) Tj
-ET
-Q
-endstream
-endobj
-443 0 obj
-3824
-endobj
-444 0 obj
-<<
-/Type /Page
-/MediaBox [0 0 612 792]
-/Parent 2 0 R
-/Resources << /ProcSet [/PDF /ImageB /Text]
-/Font <<
-/R405 405 0 R
-/R402 402 0 R
-/R359 359 0 R
-/R356 356 0 R
->>
-/XObject <<
-/R440 440 0 R
-/R394 394 0 R
-/R428 428 0 R
-/R436 436 0 R
-/R432 432 0 R
-/R378 378 0 R
-/R390 390 0 R
-/R412 412 0 R
-/R424 424 0 R
-/R420 420 0 R
-/R416 416 0 R
-/R386 386 0 R
-/R370 370 0 R
-/R408 408 0 R
-/R398 398 0 R
-/R382 382 0 R
-/R374 374 0 R
-/R366 366 0 R
-/R362 362 0 R
->>
->>
-/Contents [
-357 0 R
-360 0 R
-364 0 R
-368 0 R
-372 0 R
-376 0 R
-380 0 R
-384 0 R
-388 0 R
-392 0 R
-396 0 R
-400 0 R
-403 0 R
-406 0 R
-410 0 R
-414 0 R
-418 0 R
-422 0 R
-426 0 R
-430 0 R
-434 0 R
-438 0 R
-442 0 R
-]
->>
-endobj
-445 0 obj
-<< /Type /Font /Name /R445 /Subtype /Type1 /BaseFont /Times-Roman >>
-endobj
-446 0 obj
-<< /Length 447 0 R >>
-stream
-q
-BT
-/R445 10 Tf
-1 0 0 1 72 709.08 Tm
-(and) Tj
-1 0 0 1 89.16 709.08 Tm
-(has) Tj
-1 0 0 1 105.12 709.08 Tm
-(not) Tj
-1 0 0 1 120.6 709.08 Tm
-(e) Tj
-1 0 0 1 124.92 709.08 Tm
-(x) Tj
-1 0 0 1 129.84 709.08 Tm
-(ecuted) Tj
-1 0 0 1 158.52 709.08 Tm
-(it.) Tj
-1 0 0 1 170.88 709.08 Tm
-(A) Tj
-1 0 0 1 180.84 709.08 Tm
-(backup) Tj
-1 0 0 1 212.4 709.08 Tm
-(starts) Tj
-1 0 0 1 236.159 709.08 Tm
-(a) Tj
-1 0 0 1 243.359 709.08 Tm
-(timer) Tj
-1 0 0 1 267.119 709.08 Tm
-(when) Tj
-1 0 0 1 291.479 709.08 Tm
-(it) Tj
-1 0 0 1 72 697.08 Tm
-(recei) Tj
-1 0 0 1 91.2 697.08 Tm
-(v) Tj
-1 0 0 1 96.1199 697.08 Tm
-(es) Tj
-1 0 0 1 107.52 697.08 Tm
-(a) Tj
-1 0 0 1 115.32 697.08 Tm
-(request) Tj
-1 0 0 1 147.36 697.08 Tm
-(and) Tj
-1 0 0 1 165.12 697.08 Tm
-(the) Tj
-1 0 0 1 180.6 697.08 Tm
-(timer) Tj
-1 0 0 1 204.84 697.08 Tm
-(is) Tj
-1 0 0 1 214.8 697.08 Tm
-(not) Tj
-1 0 0 1 230.879 697.08 Tm
-(already) Tj
-1 0 0 1 263.519 697.08 Tm
-(running.) Tj
-1 0 0 1 72 685.2 Tm
-(It) Tj
-1 0 0 1 80.64 685.2 Tm
-(stops) Tj
-1 0 0 1 103.68 685.2 Tm
-(the) Tj
-1 0 0 1 118.44 685.2 Tm
-(timer) Tj
-1 0 0 1 142.08 685.2 Tm
-(when) Tj
-1 0 0 1 166.2 685.2 Tm
-(it) Tj
-1 0 0 1 174.36 685.2 Tm
-(is) Tj
-1 0 0 1 183.6 685.2 Tm
-(no) Tj
-1 0 0 1 196.08 685.2 Tm
-(longer) Tj
-1 0 0 1 224.159 685.2 Tm
-(w) Tj
-1 0 0 1 231.239 685.2 Tm
-(aiting) Tj
-1 0 0 1 256.559 685.2 Tm
-(to) Tj
-1 0 0 1 266.879 685.2 Tm
-(e) Tj
-1 0 0 1 271.199 685.2 Tm
-(x) Tj
-1 0 0 1 276.119 685.2 Tm
-(ecute) Tj
-1 0 0 1 72 673.2 Tm
-(the) Tj
-1 0 0 1 87.2399 673.2 Tm
-(request,) Tj
-1 0 0 1 121.56 673.2 Tm
-(b) Tj
-1 0 0 1 126.36 673.2 Tm
-(ut) Tj
-1 0 0 1 137.16 673.2 Tm
-(restarts) Tj
-1 0 0 1 168.96 673.2 Tm
-(it) Tj
-1 0 0 1 177.48 673.2 Tm
-(if) Tj
-1 0 0 1 186.599 673.2 Tm
-(at) Tj
-1 0 0 1 196.799 673.2 Tm
-(that) Tj
-1 0 0 1 214.799 673.2 Tm
-(point) Tj
-1 0 0 1 238.199 673.2 Tm
-(it) Tj
-1 0 0 1 246.839 673.2 Tm
-(is) Tj
-1 0 0 1 256.439 673.2 Tm
-(w) Tj
-1 0 0 1 263.519 673.2 Tm
-(aiting) Tj
-1 0 0 1 289.199 673.2 Tm
-(to) Tj
-1 0 0 1 72 661.32 Tm
-(e) Tj
-1 0 0 1 76.32 661.32 Tm
-(x) Tj
-1 0 0 1 81.24 661.32 Tm
-(ecute) Tj
-1 0 0 1 104.64 661.32 Tm
-(some) Tj
-1 0 0 1 128.16 661.32 Tm
-(other) Tj
-1 0 0 1 151.08 661.32 Tm
-(request.) Tj
-1 0 0 1 81.96 649.32 Tm
-(If) Tj
-1 0 0 1 94.4399 649.32 Tm
-(the) Tj
-1 0 0 1 112.44 649.32 Tm
-(timer) Tj
-1 0 0 1 139.32 649.32 Tm
-(of) Tj
-1 0 0 1 153.48 649.32 Tm
-(backup) Tj
-ET
-Q
-q
-W
-0 0 612 792 re
-n
-endstream
-endobj
-447 0 obj
-2311
-endobj
-448 0 obj
-<< /Type /XObject /Name /R448 /Subtype /Image /Length 449 0 R
-/ImageMask true /Width 26 /Height 69 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 26 /BlackIs1 true >>]
->>
-stream
--R^*Zl/YrmIf:DfhtVWo^UNqc%K6'1s*addX2"DHrSQB/+4u(tp(mUa[G\kks2oQE"5iR%(OubkJ,~>
-endstream
-endobj
-449 0 obj
-80
-endobj
-450 0 obj
-<< /Length 451 0 R >>
-stream
-q
-2.6 0 0 -6.9 188.4 656.1 cm
-/R448 Do
-Q
-BT
-/R445 10 Tf
-1 0 0 1 197.4 649.32 Tm
-(e) Tj
-1 0 0 1 201.72 649.32 Tm
-(xpires) Tj
-1 0 0 1 231.84 649.32 Tm
-(in) Tj
-1 0 0 1 245.519 649.32 Tm
-(vie) Tj
-1 0 0 1 257.519 649.32 Tm
-(w) Tj
-ET
-endstream
-endobj
-451 0 obj
-228
-endobj
-452 0 obj
-<< /Type /XObject /Name /R452 /Subtype /Image /Length 453 0 R
-/ImageMask true /Width 44 /Height 46 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 44 /BlackIs1 true >>]
->>
-stream
-2$jBq
-&9R,hkFhTE_G0fRqg[T's0obU5O\AciSX+=pUN/*r',Z@_Z&BgfC8fKf@@X?]DE=DTC?6WJ-Z.*~>
-endstream
-endobj
-453 0 obj
-84
-endobj
-454 0 obj
-<< /Length 455 0 R >>
-stream
-q
-4.4 0 0 -4.6 270.7 653.8 cm
-/R452 Do
-Q
-BT
-1 0 0 1 275.639 649.32 Tm
-(,) Tj
-1 0 0 1 284.879 649.32 Tm
-(the) Tj
-1 0 0 1 72 637.44 Tm
-(backup) Tj
-1 0 0 1 105.96 637.44 Tm
-(starts) Tj
-1 0 0 1 132.12 637.44 Tm
-(a) Tj
-1 0 0 1 141.6 637.44 Tm
-(vie) Tj
-1 0 0 1 153.6 637.44 Tm
-(w) Tj
-1 0 0 1 165.96 637.44 Tm
-(change) Tj
-1 0 0 1 199.2 637.44 Tm
-(to) Tj
-1 0 0 1 212.16 637.44 Tm
-(mo) Tj
-1 0 0 1 224.88 637.44 Tm
-(v) Tj
-1 0 0 1 229.8 637.44 Tm
-(e) Tj
-1 0 0 1 239.16 637.44 Tm
-(the) Tj
-1 0 0 1 256.44 637.44 Tm
-(system) Tj
-1 0 0 1 289.199 637.44 Tm
-(to) Tj
-1 0 0 1 72 625.44 Tm
-(vie) Tj
-1 0 0 1 84 625.44 Tm
-(w) Tj
-ET
-q
-4.4 0 0 -4.6 95.7 629.9 cm
-/R452 Do
-Q
-endstream
-endobj
-455 0 obj
-649
-endobj
-456 0 obj
-<< /Type /XObject /Name /R456 /Subtype /Image /Length 457 0 R
-/ImageMask true /Width 66 /Height 65 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 66 /BlackIs1 true >>]
->>
-stream
-,BZ6Ns8W-!s8W-!s-Eq9Iaj?!s8W-!s8W-!s8Uf'#QTA~>
-endstream
-endobj
-457 0 obj
-47
-endobj
-458 0 obj
-<< /Length 459 0 R >>
-stream
-q
-6.6 0 0 -6.5 104.4 631.2 cm
-/R456 Do
-Q
-BT
-1 0 0 1 114.96 625.44 Tm
-(1.) Tj
-1 0 0 1 131.76 625.44 Tm
-(It) Tj
-1 0 0 1 142.2 625.44 Tm
-(stops) Tj
-1 0 0 1 167.04 625.44 Tm
-(accepting) Tj
-1 0 0 1 209.64 625.44 Tm
-(messages) Tj
-1 0 0 1 251.639 625.44 Tm
-(\(other) Tj
-1 0 0 1 279.839 625.44 Tm
-(than) Tj
-1 0 0 1 72 613.44 Tm
-(checkpoint,) Tj
-1 0 0 1 121.8 613.44 Tm
-(vie) Tj
-1 0 0 1 133.8 613.44 Tm
-(w-change,) Tj
-1 0 0 1 178.44 613.44 Tm
-(and) Tj
-1 0 0 1 196.2 613.44 Tm
-(ne) Tj
-1 0 0 1 205.44 613.44 Tm
-(w-vie) Tj
-1 0 0 1 228 613.44 Tm
-(w) Tj
-1 0 0 1 238.32 613.44 Tm
-(messages\)) Tj
-1 0 0 1 282.6 613.44 Tm
-(and) Tj
-1 0 0 1 72 601.56 Tm
-(multicasts) Tj
-1 0 0 1 114.72 601.56 Tm
-(a) Tj
-ET
-endstream
-endobj
-459 0 obj
-686
-endobj
-460 0 obj
-<< /Type /XObject /Name /R460 /Subtype /Image /Length 461 0 R
-/ImageMask true /Width 24 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 24 /BlackIs1 true >>]
->>
-stream
-+t-07X8N5#0B"SKInTVGqHrM(f3_PN_YUJ4L&^prs)7cFqg[B")ufa0GPC"Nr'(,Kmt^kVHo1m8!<~>
-endstream
-endobj
-461 0 obj
-80
-endobj
-462 0 obj
-<< /Length 463 0 R >>
-stream
-q
-2.4 0 0 -9.9 122.3 609.1 cm
-/R460 Do
-Q
-BT
-/R445 8 Tf
-1 0 0 1 125.28 601.56 Tm
-(VIEW) Tj
-/R445 10 Tf
-1 0 0 1 145.68 601.56 Tm
-(-) Tj
-/R445 8 Tf
-1 0 0 1 149.04 601.56 Tm
-(CHANGE) Tj
-ET
-endstream
-endobj
-463 0 obj
-185
-endobj
-464 0 obj
-<< /Type /XObject /Name /R464 /Subtype /Image /Length 465 0 R
-/ImageMask true /Width 13 /Height 30 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 13 /BlackIs1 true >>]
->>
-stream
-0g^A/h=&*equ,LR2Xj(@lh_"t-iec'~>
-endstream
-endobj
-465 0 obj
-33
-endobj
-466 0 obj
-<< /Length 467 0 R >>
-stream
-q
-1.3 0 0 -3 183 602.7 cm
-/R464 Do
-Q
-q
-4.4 0 0 -4.6 186.8 606.1 cm
-/R452 Do
-Q
-q
-6.6 0 0 -6.5 194.1 607.4 cm
-/R456 Do
-Q
-BT
-/R445 10 Tf
-1 0 0 1 203.16 601.56 Tm
-(1) Tj
-ET
-q
-1.3 0 0 -3 209 602.7 cm
-/R464 Do
-Q
-endstream
-endobj
-467 0 obj
-206
-endobj
-468 0 obj
-<< /Type /XObject /Name /R468 /Subtype /Image /Length 469 0 R
-/ImageMask true /Width 54 /Height 46 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 54 /BlackIs1 true >>]
->>
-stream
-4N]t,$m>7rl/"o@d!re,
-pYTohhg]lis4_o!aocV_^Yur>rVsXfR^`8
-endstream
-endobj
-469 0 obj
-102
-endobj
-470 0 obj
-<< /Length 471 0 R >>
-stream
-q
-5.4 0 0 -4.6 212.8 606.1 cm
-/R468 Do
-Q
-q
-1.3 0 0 -3 219.4 602.7 cm
-/R464 Do
-Q
-endstream
-endobj
-471 0 obj
-80
-endobj
-472 0 obj
-<< /Type /XObject /Name /R472 /Subtype /Image /Length 473 0 R
-/ImageMask true /Width 51 /Height 74 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 51 /BlackIs1 true >>]
->>
-stream
-,Q`3Ui.96s*~>
-endstream
-endobj
-473 0 obj
-108
-endobj
-474 0 obj
-<< /Length 475 0 R >>
-stream
-q
-5.1 0 0 -7.4 223.2 608.7 cm
-/R472 Do
-Q
-q
-1.3 0 0 -3 229.8 602.7 cm
-/R464 Do
-Q
-endstream
-endobj
-475 0 obj
-80
-endobj
-476 0 obj
-<< /Type /XObject /Name /R476 /Subtype /Image /Length 477 0 R
-/ImageMask true /Width 71 /Height 75 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 71 /BlackIs1 true >>]
->>
-stream
--a<+0n+Z5LIJ`KNiW!ir]91&&#RC*7(FNXHi:o#"8-c],:)i/ImgL%P
-mJ$#;hX9n1s0oc#Hf+iJh4SuL\$#UXrTYHSLP2l)n?sB\%/C-b5U_6s
-endstream
-endobj
-477 0 obj
-134
-endobj
-478 0 obj
-<< /Length 479 0 R >>
-stream
-q
-7.1 0 0 -7.5 233.5 608.5 cm
-/R476 Do
-Q
-q
-1.3 0 0 -3 242 602.7 cm
-/R464 Do
-Q
-q
-2.6 0 0 -6.9 245.8 608.4 cm
-/R448 Do
-Q
-endstream
-endobj
-479 0 obj
-119
-endobj
-480 0 obj
-<< /Type /XObject /Name /R480 /Subtype /Image /Length 481 0 R
-/ImageMask true /Width 24 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 24 /BlackIs1 true >>]
->>
-stream
-02pd&htA/cs0qnbrP.\`mJhV5_u&o]hqrq@J+[15ImJQWpe1HjlFsc8R~>
-endstream
-endobj
-481 0 obj
-78
-endobj
-482 0 obj
-<< /Length 483 0 R >>
-stream
-q
-2.4 0 0 -9.9 249.5 609.1 cm
-/R480 Do
-Q
-endstream
-endobj
-483 0 obj
-41
-endobj
-484 0 obj
-<< /Type /XObject /Name /R484 /Subtype /Image /Length 485 0 R
-/ImageMask true /Width 42 /Height 31 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 42 /BlackIs1 true >>]
->>
-stream
-1`R)4"qZ&4%Y>/aKS+]fJ#a+Sp>>oFIt)n@>7^\DYeoBbLCXeP2$%q%J-Z~>
-endstream
-endobj
-485 0 obj
-61
-endobj
-486 0 obj
-<< /Length 487 0 R >>
-stream
-q
-4.2 0 0 -3.1 253.2 603.1 cm
-/R484 Do
-Q
-endstream
-endobj
-487 0 obj
-41
-endobj
-488 0 obj
-<< /Type /XObject /Name /R488 /Subtype /Image /Length 489 0 R
-/ImageMask true /Width 17 /Height 35 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 17 /BlackIs1 true >>]
->>
-stream
-4B*=`S,;]mpj7Y*s1(">iS6Nohi?6cs!N02p(RKl"9~>
-endstream
-endobj
-489 0 obj
-45
-endobj
-490 0 obj
-<< /Length 491 0 R >>
-stream
-q
-1.7 0 0 -3.5 257.8 602.7 cm
-/R488 Do
-Q
-BT
-1 0 0 1 263.28 601.56 Tm
-(message) Tj
-1 0 0 1 72 589.56 Tm
-(to) Tj
-1 0 0 1 82.2 589.56 Tm
-(all) Tj
-1 0 0 1 94.6799 589.56 Tm
-(replicas.) Tj
-1 0 0 1 131.76 589.56 Tm
-(Here) Tj
-ET
-q
-5.4 0 0 -4.6 153.8 594.1 cm
-/R468 Do
-Q
-BT
-1 0 0 1 162 589.56 Tm
-(is) Tj
-1 0 0 1 171.12 589.56 Tm
-(the) Tj
-1 0 0 1 185.76 589.56 Tm
-(sequence) Tj
-1 0 0 1 224.759 589.56 Tm
-(number) Tj
-1 0 0 1 257.759 589.56 Tm
-(of) Tj
-1 0 0 1 268.559 589.56 Tm
-(the) Tj
-1 0 0 1 283.199 589.56 Tm
-(last) Tj
-1 0 0 1 72 577.68 Tm
-(stable) Tj
-1 0 0 1 97.6799 577.68 Tm
-(checkpoint) Tj
-ET
-endstream
-endobj
-491 0 obj
-590
-endobj
-492 0 obj
-<< /Type /XObject /Name /R492 /Subtype /Image /Length 493 0 R
-/ImageMask true /Width 37 /Height 46 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 37 /BlackIs1 true >>]
->>
-stream
-1^aSA
-!J1f4d1VKfY*42Ai;KnWs7a;-)HcZabs@p6K&KV(n>M'uOFo&O1?^[smruILGVDte$reoe$n)++#Q~>
-endstream
-endobj
-493 0 obj
-86
-endobj
-494 0 obj
-<< /Length 495 0 R >>
-stream
-q
-3.7 0 0 -4.6 144.2 582.2 cm
-/R492 Do
-Q
-BT
-1 0 0 1 150.84 577.68 Tm
-(kno) Tj
-1 0 0 1 165.72 577.68 Tm
-(wn) Tj
-1 0 0 1 180.24 577.68 Tm
-(to) Tj
-ET
-q
-2.6 0 0 -6.9 190.5 584.5 cm
-/R448 Do
-Q
-BT
-1 0 0 1 193.8 577.68 Tm
-(,) Tj
-ET
-q
-5.1 0 0 -7.4 198.8 584.8 cm
-/R472 Do
-Q
-BT
-1 0 0 1 207 577.68 Tm
-(is) Tj
-1 0 0 1 215.999 577.68 Tm
-(a) Tj
-1 0 0 1 222.839 577.68 Tm
-(set) Tj
-1 0 0 1 236.399 577.68 Tm
-(of) Tj
-1 0 0 1 247.079 577.68 Tm
-(2) Tj
-ET
-endstream
-endobj
-495 0 obj
-437
-endobj
-496 0 obj
-<< /Type /XObject /Name /R496 /Subtype /Image /Length 497 0 R
-/ImageMask true /Width 50 /Height 92 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 50 /BlackIs1 true >>]
->>
-stream
-5$eL7-b:K3p0<%?
-h1u#R]2'Mug].5is7$!eqtL-hqu?EZs5/V3iQXZVs7/ihqu?EZs4QRbJe-ans*o2/4DdB_@6aqq5Q~>
-endstream
-endobj
-497 0 obj
-96
-endobj
-498 0 obj
-<< /Length 499 0 R >>
-stream
-q
-5 0 0 -9.2 252.5 584.8 cm
-/R496 Do
-Q
-q
-6.6 0 0 -6.5 260.7 583.5 cm
-/R456 Do
-Q
-BT
-1 0 0 1 269.879 577.68 Tm
-(1) Tj
-1 0 0 1 277.319 577.68 Tm
-(v) Tj
-1 0 0 1 282.119 577.68 Tm
-(alid) Tj
-1 0 0 1 72 565.68 Tm
-(checkpoint) Tj
-1 0 0 1 119.4 565.68 Tm
-(messages) Tj
-1 0 0 1 160.68 565.68 Tm
-(pro) Tj
-1 0 0 1 174 565.68 Tm
-(ving) Tj
-1 0 0 1 195.24 565.68 Tm
-(the) Tj
-1 0 0 1 211.08 565.68 Tm
-(correctness) Tj
-1 0 0 1 259.559 565.68 Tm
-(of) Tj
-ET
-q
-3.7 0 0 -4.6 271.8 570.2 cm
-/R492 Do
-Q
-BT
-1 0 0 1 276.119 565.68 Tm
-(,) Tj
-1 0 0 1 282.599 565.68 Tm
-(and) Tj
-ET
-q
-7.1 0 0 -7.5 72.1 560.7 cm
-/R476 Do
-Q
-BT
-1 0 0 1 83.16 553.8 Tm
-(is) Tj
-1 0 0 1 93.2399 553.8 Tm
-(a) Tj
-1 0 0 1 101.04 553.8 Tm
-(set) Tj
-1 0 0 1 115.44 553.8 Tm
-(containing) Tj
-1 0 0 1 160.92 553.8 Tm
-(a) Tj
-1 0 0 1 168.72 553.8 Tm
-(set) Tj
-ET
-q
-7.1 0 0 -7.5 183.3 560.7 cm
-/R476 Do
-Q
-endstream
-endobj
-499 0 obj
-841
-endobj
-500 0 obj
-<< /Type /XObject /Name /R500 /Subtype /Image /Length 501 0 R
-/ImageMask true /Width 63 /Height 33 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 63 /BlackIs1 true >>]
->>
-stream
-36HD6'aC$jrgrOM2g''=
-rP/?jh7L;trr;+h\8B"TnGiOCD85XVJ,"6UrZ/nkn+R@d'CFS6G.p]PWt2ocSubj)(omor5f3O$&-2~>
-endstream
-endobj
-501 0 obj
-102
-endobj
-502 0 obj
-<< /Length 503 0 R >>
-stream
-q
-6.3 0 0 -3.3 190.5 555.6 cm
-/R500 Do
-Q
-BT
-1 0 0 1 201.12 553.8 Tm
-(for) Tj
-1 0 0 1 216.12 553.8 Tm
-(each) Tj
-1 0 0 1 237.72 553.8 Tm
-(request) Tj
-ET
-endstream
-endobj
-503 0 obj
-151
-endobj
-504 0 obj
-<< /Type /XObject /Name /R504 /Subtype /Image /Length 505 0 R
-/ImageMask true /Width 81 /Height 46 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 81 /BlackIs1 true >>]
->>
-stream
-4N`CV%M3$8612U>:Ag"NnFZb
-endstream
-endobj
-505 0 obj
-139
-endobj
-506 0 obj
-<< /Length 507 0 R >>
-stream
-q
-8.1 0 0 -4.6 270.1 558.3 cm
-/R504 Do
-Q
-BT
-1 0 0 1 282 553.8 Tm
-(that) Tj
-1 0 0 1 72 541.8 Tm
-(prepared) Tj
-1 0 0 1 108.6 541.8 Tm
-(at) Tj
-ET
-q
-2.6 0 0 -6.9 117.8 548.6 cm
-/R448 Do
-Q
-BT
-1 0 0 1 122.88 541.8 Tm
-(with) Tj
-1 0 0 1 142.32 541.8 Tm
-(a) Tj
-1 0 0 1 148.56 541.8 Tm
-(sequence) Tj
-1 0 0 1 186.84 541.8 Tm
-(number) Tj
-1 0 0 1 219.12 541.8 Tm
-(higher) Tj
-1 0 0 1 246.359 541.8 Tm
-(than) Tj
-ET
-q
-5.4 0 0 -4.6 265.4 546.3 cm
-/R468 Do
-Q
-BT
-1 0 0 1 271.199 541.8 Tm
-(.) Tj
-1 0 0 1 277.079 541.8 Tm
-(Each) Tj
-1 0 0 1 72 529.92 Tm
-(set) Tj
-ET
-q
-7.1 0 0 -7.5 85.2 536.8 cm
-/R476 Do
-Q
-q
-6.3 0 0 -3.3 92.3 531.7 cm
-/R500 Do
-Q
-BT
-1 0 0 1 101.64 529.92 Tm
-(contains) Tj
-1 0 0 1 136.92 529.92 Tm
-(a) Tj
-1 0 0 1 143.4 529.92 Tm
-(v) Tj
-1 0 0 1 148.2 529.92 Tm
-(alid) Tj
-1 0 0 1 165.24 529.92 Tm
-(pre-prepare) Tj
-1 0 0 1 213.12 529.92 Tm
-(message) Tj
-1 0 0 1 249 529.92 Tm
-(\(without) Tj
-1 0 0 1 284.879 529.92 Tm
-(the) Tj
-1 0 0 1 72 517.92 Tm
-(corresponding) Tj
-1 0 0 1 132.96 517.92 Tm
-(client) Tj
-1 0 0 1 159.12 517.92 Tm
-(message\)) Tj
-1 0 0 1 200.16 517.92 Tm
-(and) Tj
-1 0 0 1 218.52 517.92 Tm
-(2) Tj
-ET
-q
-5 0 0 -9.2 224 525 cm
-/R496 Do
-Q
-BT
-1 0 0 1 233.4 517.92 Tm
-(matching,) Tj
-1 0 0 1 277.319 517.92 Tm
-(v) Tj
-1 0 0 1 282.119 517.92 Tm
-(alid) Tj
-1 0 0 1 72 506.04 Tm
-(prepare) Tj
-1 0 0 1 105.48 506.04 Tm
-(messages) Tj
-1 0 0 1 146.64 506.04 Tm
-(signed) Tj
-1 0 0 1 176.16 506.04 Tm
-(by) Tj
-1 0 0 1 189.72 506.04 Tm
-(dif) Tj
-1 0 0 1 200.64 506.04 Tm
-(ferent) Tj
-1 0 0 1 227.279 506.04 Tm
-(backups) Tj
-1 0 0 1 263.519 506.04 Tm
-(with) Tj
-1 0 0 1 284.879 506.04 Tm
-(the) Tj
-1 0 0 1 72 494.04 Tm
-(same) Tj
-1 0 0 1 94.9199 494.04 Tm
-(vie) Tj
-1 0 0 1 106.92 494.04 Tm
-(w) Tj
-1 0 0 1 113.52 494.04 Tm
-(,) Tj
-1 0 0 1 118.44 494.04 Tm
-(sequence) Tj
-1 0 0 1 157.44 494.04 Tm
-(number) Tj
-1 0 0 1 187.8 494.04 Tm
-(,) Tj
-1 0 0 1 192.48 494.04 Tm
-(and) Tj
-1 0 0 1 209.28 494.04 Tm
-(the) Tj
-1 0 0 1 224.04 494.04 Tm
-(digest) Tj
-1 0 0 1 250.319 494.04 Tm
-(of) Tj
-ET
-q
-8.1 0 0 -4.6 261.3 498.5 cm
-/R504 Do
-Q
-BT
-1 0 0 1 269.879 494.04 Tm
-(.) Tj
-1 0 0 1 81.96 482.16 Tm
-(When) Tj
-1 0 0 1 108.96 482.16 Tm
-(the) Tj
-1 0 0 1 124.44 482.16 Tm
-(primary) Tj
-ET
-endstream
-endobj
-507 0 obj
-2136
-endobj
-508 0 obj
-<< /Type /XObject /Name /R508 /Subtype /Image /Length 509 0 R
-/ImageMask true /Width 54 /Height 64 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 54 /BlackIs1 true >>]
->>
-stream
--D98r4=0b"4s0Orro]!o&:3^Ke&7l2
-[/(7*rS^,RIfB4oLV,SG]>+(NrPSU5I/eEj^Aki-s4fFGn+Z5e95',@28).TTZ(Ru?\8Ii-iec'~>
-endstream
-endobj
-509 0 obj
-109
-endobj
-510 0 obj
-<< /Length 511 0 R >>
-stream
-q
-5.4 0 0 -6.4 158.7 486.7 cm
-/R508 Do
-Q
-BT
-1 0 0 1 167.4 482.16 Tm
-(of) Tj
-1 0 0 1 178.92 482.16 Tm
-(vie) Tj
-1 0 0 1 190.92 482.16 Tm
-(w) Tj
-ET
-q
-4.4 0 0 -4.6 201.4 486.7 cm
-/R452 Do
-Q
-q
-6.6 0 0 -6.5 209.7 488 cm
-/R456 Do
-Q
-BT
-1 0 0 1 219.48 482.16 Tm
-(1) Tj
-1 0 0 1 227.64 482.16 Tm
-(recei) Tj
-1 0 0 1 246.84 482.16 Tm
-(v) Tj
-1 0 0 1 251.76 482.16 Tm
-(es) Tj
-1 0 0 1 263.159 482.16 Tm
-(2) Tj
-ET
-q
-5 0 0 -9.2 268.6 489.3 cm
-/R496 Do
-Q
-BT
-1 0 0 1 277.319 482.16 Tm
-(v) Tj
-1 0 0 1 282.119 482.16 Tm
-(alid) Tj
-1 0 0 1 72 470.16 Tm
-(vie) Tj
-1 0 0 1 84 470.16 Tm
-(w-change) Tj
-1 0 0 1 124.56 470.16 Tm
-(messages) Tj
-1 0 0 1 164.04 470.16 Tm
-(for) Tj
-1 0 0 1 177.48 470.16 Tm
-(vie) Tj
-1 0 0 1 189.48 470.16 Tm
-(w) Tj
-ET
-q
-4.4 0 0 -4.6 198.7 474.7 cm
-/R452 Do
-Q
-q
-6.6 0 0 -6.5 205 476 cm
-/R456 Do
-Q
-BT
-1 0 0 1 213.119 470.16 Tm
-(1) Tj
-1 0 0 1 219.959 470.16 Tm
-(from) Tj
-1 0 0 1 241.199 470.16 Tm
-(other) Tj
-1 0 0 1 263.519 470.16 Tm
-(replicas,) Tj
-1 0 0 1 72 458.28 Tm
-(it) Tj
-1 0 0 1 79.9199 458.28 Tm
-(multicasts) Tj
-1 0 0 1 122.64 458.28 Tm
-(a) Tj
-ET
-q
-2.4 0 0 -9.9 130.4 465.8 cm
-/R460 Do
-Q
-BT
-/R445 8 Tf
-1 0 0 1 133.32 458.28 Tm
-(NEW) Tj
-/R445 10 Tf
-1 0 0 1 151.08 458.28 Tm
-(-) Tj
-/R445 8 Tf
-1 0 0 1 154.44 458.28 Tm
-(VIEW) Tj
-ET
-q
-1.3 0 0 -3 175.9 459.4 cm
-/R464 Do
-Q
-q
-4.4 0 0 -4.6 179.7 462.8 cm
-/R452 Do
-Q
-q
-6.6 0 0 -6.5 187.1 464.1 cm
-/R456 Do
-Q
-BT
-/R445 10 Tf
-1 0 0 1 196.32 458.28 Tm
-(1) Tj
-ET
-q
-1.3 0 0 -3 202.2 459.4 cm
-/R464 Do
-Q
-endstream
-endobj
-511 0 obj
-1441
-endobj
-512 0 obj
-<< /Type /XObject /Name /R512 /Subtype /Image /Length 513 0 R
-/ImageMask true /Width 63 /Height 74 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 63 /BlackIs1 true >>]
->>
-stream
-3nSfS4mq2+%std@nf[D1mtU]MLV%uL
-HZ-Y0fR:M_^AL36_uFYahhUt*h-^,9hr!Z's1\N8deI/VX$K^`$prPKWY^jqg$5s
-endstream
-endobj
-513 0 obj
-113
-endobj
-514 0 obj
-<< /Length 515 0 R >>
-stream
-q
-6.3 0 0 -7.4 206 465.2 cm
-/R512 Do
-Q
-q
-1.3 0 0 -3 213.6 459.4 cm
-/R464 Do
-Q
-endstream
-endobj
-515 0 obj
-78
-endobj
-516 0 obj
-<< /Type /XObject /Name /R516 /Subtype /Image /Length 517 0 R
-/ImageMask true /Width 72 /Height 74 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 72 /BlackIs1 true >>]
->>
-stream
-.D\.1%HncC3X8G(Ssge8@F>AX*$@u(%Hp!FloO!m_Jf)Vl23boo`"`;p\l8Ps6eeEqfi&>
-rP.2d@Gpp)^[++umqqs0GJjBg_puYOE5G\*g[Ns3DUu^A/VY)r9(0U#`%,\4qd@o5@6r1i?ig
-endstream
-endobj
-517 0 obj
-149
-endobj
-518 0 obj
-<< /Length 519 0 R >>
-stream
-q
-7.2 0 0 -7.4 217.7 465.4 cm
-/R516 Do
-Q
-q
-2.4 0 0 -9.9 225.8 465.8 cm
-/R480 Do
-Q
-q
-4.2 0 0 -3.1 229.4 459.8 cm
-/R484 Do
-Q
-endstream
-endobj
-519 0 obj
-123
-endobj
-520 0 obj
-<< /Type /XObject /Name /R520 /Subtype /Image /Length 521 0 R
-/ImageMask true /Width 31 /Height 32 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 31 /BlackIs1 true >>]
->>
-stream
--D:A;E<"bo0Kp%mK
-endstream
-endobj
-521 0 obj
-58
-endobj
-522 0 obj
-<< /Length 523 0 R >>
-stream
-q
-3.1 0 0 -3.2 233.9 458.1 cm
-/R520 Do
-Q
-BT
-1 0 0 1 240.84 458.28 Tm
-(message) Tj
-1 0 0 1 276.96 458.28 Tm
-(to) Tj
-1 0 0 1 287.04 458.28 Tm
-(all) Tj
-1 0 0 1 72 446.28 Tm
-(other) Tj
-1 0 0 1 94.5599 446.28 Tm
-(replicas,) Tj
-1 0 0 1 130.32 446.28 Tm
-(where) Tj
-ET
-q
-6.3 0 0 -7.4 156.9 453.2 cm
-/R512 Do
-Q
-BT
-1 0 0 1 165.72 446.28 Tm
-(is) Tj
-1 0 0 1 174.6 446.28 Tm
-(a) Tj
-1 0 0 1 181.08 446.28 Tm
-(set) Tj
-1 0 0 1 194.28 446.28 Tm
-(containing) Tj
-1 0 0 1 238.439 446.28 Tm
-(the) Tj
-1 0 0 1 252.719 446.28 Tm
-(v) Tj
-1 0 0 1 257.519 446.28 Tm
-(alid) Tj
-1 0 0 1 274.559 446.28 Tm
-(vie) Tj
-1 0 0 1 286.559 446.28 Tm
-(w-) Tj
-1 0 0 1 72 434.4 Tm
-(change) Tj
-1 0 0 1 102.84 434.4 Tm
-(messages) Tj
-1 0 0 1 143.04 434.4 Tm
-(recei) Tj
-1 0 0 1 162.24 434.4 Tm
-(v) Tj
-1 0 0 1 167.16 434.4 Tm
-(ed) Tj
-1 0 0 1 179.04 434.4 Tm
-(by) Tj
-1 0 0 1 191.64 434.4 Tm
-(the) Tj
-1 0 0 1 206.4 434.4 Tm
-(primary) Tj
-1 0 0 1 240.6 434.4 Tm
-(plus) Tj
-1 0 0 1 259.799 434.4 Tm
-(the) Tj
-1 0 0 1 274.559 434.4 Tm
-(vie) Tj
-1 0 0 1 286.559 434.4 Tm
-(w-) Tj
-1 0 0 1 72 422.4 Tm
-(change) Tj
-1 0 0 1 102.12 422.4 Tm
-(message) Tj
-1 0 0 1 137.76 422.4 Tm
-(for) Tj
-ET
-q
-4.4 0 0 -4.6 151.5 426.9 cm
-/R452 Do
-Q
-q
-6.6 0 0 -6.5 157.8 428.2 cm
-/R456 Do
-Q
-BT
-1 0 0 1 165.96 422.4 Tm
-(1) Tj
-1 0 0 1 172.92 422.4 Tm
-(the) Tj
-1 0 0 1 186.96 422.4 Tm
-(primary) Tj
-1 0 0 1 220.319 422.4 Tm
-(sent) Tj
-1 0 0 1 238.319 422.4 Tm
-(\(or) Tj
-1 0 0 1 251.879 422.4 Tm
-(w) Tj
-1 0 0 1 258.959 422.4 Tm
-(ould) Tj
-1 0 0 1 278.519 422.4 Tm
-(ha) Tj
-1 0 0 1 287.759 422.4 Tm
-(v) Tj
-1 0 0 1 292.679 422.4 Tm
-(e) Tj
-1 0 0 1 72 410.52 Tm
-(sent\),) Tj
-1 0 0 1 95.9999 410.52 Tm
-(and) Tj
-ET
-q
-7.2 0 0 -7.4 112.9 417.6 cm
-/R516 Do
-Q
-BT
-1 0 0 1 122.76 410.52 Tm
-(is) Tj
-1 0 0 1 131.4 410.52 Tm
-(a) Tj
-1 0 0 1 137.88 410.52 Tm
-(set) Tj
-1 0 0 1 150.96 410.52 Tm
-(of) Tj
-1 0 0 1 161.4 410.52 Tm
-(pre-prepare) Tj
-1 0 0 1 209.279 410.52 Tm
-(messages) Tj
-1 0 0 1 248.999 410.52 Tm
-(\(without) Tj
-1 0 0 1 284.879 410.52 Tm
-(the) Tj
-1 0 0 1 72 398.52 Tm
-(piggyback) Tj
-1 0 0 1 113.76 398.52 Tm
-(ed) Tj
-1 0 0 1 125.28 398.52 Tm
-(request\).) Tj
-ET
-q
-7.2 0 0 -7.4 163.9 405.6 cm
-/R516 Do
-Q
-BT
-1 0 0 1 174.12 398.52 Tm
-(is) Tj
-1 0 0 1 183.36 398.52 Tm
-(computed) Tj
-1 0 0 1 225.12 398.52 Tm
-(as) Tj
-1 0 0 1 235.92 398.52 Tm
-(follo) Tj
-1 0 0 1 254.639 398.52 Tm
-(ws:) Tj
-1 0 0 1 74.52 386.4 Tm
-(1.) Tj
-1 0 0 1 87 386.4 Tm
-(The) Tj
-1 0 0 1 105.48 386.4 Tm
-(primary) Tj
-1 0 0 1 140.04 386.4 Tm
-(determines) Tj
-1 0 0 1 186.72 386.4 Tm
-(the) Tj
-1 0 0 1 201.84 386.4 Tm
-(sequence) Tj
-1 0 0 1 241.439 386.4 Tm
-(number) Tj
-ET
-endstream
-endobj
-523 0 obj
-2530
-endobj
-524 0 obj
-<< /Type /Font /Name /R524 /Subtype /Type1 /BaseFont /Times-Italic >>
-endobj
-525 0 obj
-<< /Length 526 0 R >>
-stream
-BT
-/R524 10 Tf
-1 0 0 1 274.919 386.4 Tm
-(min-s) Tj
-/R445 10 Tf
-1 0 0 1 87 374.52 Tm
-(of) Tj
-1 0 0 1 98.7599 374.52 Tm
-(the) Tj
-1 0 0 1 114.48 374.52 Tm
-(latest) Tj
-1 0 0 1 138.96 374.52 Tm
-(stable) Tj
-1 0 0 1 165.72 374.52 Tm
-(checkpoint) Tj
-1 0 0 1 213 374.52 Tm
-(in) Tj
-ET
-q
-6.3 0 0 -7.4 224.4 381.4 cm
-/R512 Do
-Q
-BT
-1 0 0 1 234.599 374.52 Tm
-(and) Tj
-1 0 0 1 252.479 374.52 Tm
-(the) Tj
-1 0 0 1 268.199 374.52 Tm
-(highest) Tj
-1 0 0 1 87 362.52 Tm
-(sequence) Tj
-1 0 0 1 126 362.52 Tm
-(number) Tj
-/R524 10 Tf
-1 0 0 1 158.88 362.52 Tm
-(max-s) Tj
-/R445 10 Tf
-1 0 0 1 185.16 362.52 Tm
-(in) Tj
-1 0 0 1 195.36 362.52 Tm
-(a) Tj
-1 0 0 1 202.32 362.52 Tm
-(prepare) Tj
-1 0 0 1 234.72 362.52 Tm
-(message) Tj
-1 0 0 1 270.959 362.52 Tm
-(in) Tj
-ET
-q
-6.3 0 0 -7.4 281.4 369.4 cm
-/R512 Do
-Q
-BT
-1 0 0 1 288.119 362.52 Tm
-(.) Tj
-1 0 0 1 74.52 348.84 Tm
-(2.) Tj
-1 0 0 1 87 348.84 Tm
-(The) Tj
-1 0 0 1 105.72 348.84 Tm
-(primary) Tj
-1 0 0 1 140.64 348.84 Tm
-(creates) Tj
-1 0 0 1 171.6 348.84 Tm
-(a) Tj
-1 0 0 1 179.4 348.84 Tm
-(ne) Tj
-1 0 0 1 188.64 348.84 Tm
-(w) Tj
-1 0 0 1 199.08 348.84 Tm
-(pre-prepare) Tj
-1 0 0 1 248.279 348.84 Tm
-(message) Tj
-1 0 0 1 285.359 348.84 Tm
-(for) Tj
-1 0 0 1 87 336.84 Tm
-(vie) Tj
-1 0 0 1 99 336.84 Tm
-(w) Tj
-ET
-q
-4.4 0 0 -4.6 108 341.3 cm
-/R452 Do
-Q
-q
-6.6 0 0 -6.5 113.9 342.6 cm
-/R456 Do
-Q
-BT
-1 0 0 1 121.68 336.84 Tm
-(1) Tj
-1 0 0 1 128.52 336.84 Tm
-(for) Tj
-1 0 0 1 141.84 336.84 Tm
-(each) Tj
-1 0 0 1 161.76 336.84 Tm
-(sequence) Tj
-1 0 0 1 200.04 336.84 Tm
-(number) Tj
-ET
-q
-5.4 0 0 -4.6 232.4 341.3 cm
-/R468 Do
-Q
-BT
-1 0 0 1 239.879 336.84 Tm
-(between) Tj
-/R524 10 Tf
-1 0 0 1 274.919 336.84 Tm
-(min-s) Tj
-/R445 10 Tf
-1 0 0 1 87 324.96 Tm
-(and) Tj
-/R524 10 Tf
-1 0 0 1 104.16 324.96 Tm
-(max-s) Tj
-/R445 10 Tf
-1 0 0 1 127.92 324.96 Tm
-(.) Tj
-1 0 0 1 135.12 324.96 Tm
-(There) Tj
-1 0 0 1 161.16 324.96 Tm
-(are) Tj
-1 0 0 1 176.16 324.96 Tm
-(tw) Tj
-1 0 0 1 186 324.96 Tm
-(o) Tj
-1 0 0 1 193.92 324.96 Tm
-(cases:) Tj
-1 0 0 1 222 324.96 Tm
-(\(1\)) Tj
-1 0 0 1 236.4 324.96 Tm
-(there) Tj
-1 0 0 1 259.199 324.96 Tm
-(is) Tj
-1 0 0 1 268.679 324.96 Tm
-(at) Tj
-1 0 0 1 278.759 324.96 Tm
-(least) Tj
-1 0 0 1 87 312.96 Tm
-(one) Tj
-1 0 0 1 105.36 312.96 Tm
-(set) Tj
-1 0 0 1 120.6 312.96 Tm
-(in) Tj
-1 0 0 1 132.36 312.96 Tm
-(the) Tj
-ET
-q
-7.1 0 0 -7.5 148.8 319.9 cm
-/R476 Do
-Q
-BT
-1 0 0 1 160.44 312.96 Tm
-(component) Tj
-1 0 0 1 208.8 312.96 Tm
-(of) Tj
-1 0 0 1 221.28 312.96 Tm
-(some) Tj
-1 0 0 1 246.359 312.96 Tm
-(vie) Tj
-1 0 0 1 258.359 312.96 Tm
-(w-change) Tj
-1 0 0 1 87 301.08 Tm
-(message) Tj
-1 0 0 1 123.84 301.08 Tm
-(in) Tj
-ET
-q
-6.3 0 0 -7.4 135 308 cm
-/R512 Do
-Q
-BT
-1 0 0 1 144.84 301.08 Tm
-(with) Tj
-1 0 0 1 165.72 301.08 Tm
-(sequence) Tj
-1 0 0 1 205.44 301.08 Tm
-(number) Tj
-ET
-q
-5.4 0 0 -4.6 239.2 305.6 cm
-/R468 Do
-Q
-BT
-1 0 0 1 245.04 301.08 Tm
-(,) Tj
-1 0 0 1 250.799 301.08 Tm
-(or) Tj
-1 0 0 1 262.319 301.08 Tm
-(\(2\)) Tj
-1 0 0 1 277.079 301.08 Tm
-(there) Tj
-1 0 0 1 87 289.08 Tm
-(is) Tj
-1 0 0 1 96.8399 289.08 Tm
-(no) Tj
-1 0 0 1 109.92 289.08 Tm
-(such) Tj
-1 0 0 1 131.4 289.08 Tm
-(set.) Tj
-1 0 0 1 150.72 289.08 Tm
-(In) Tj
-1 0 0 1 162.12 289.08 Tm
-(the) Tj
-1 0 0 1 177.48 289.08 Tm
-(\256rst) Tj
-1 0 0 1 196.2 289.08 Tm
-(case,) Tj
-1 0 0 1 219.24 289.08 Tm
-(the) Tj
-1 0 0 1 234.6 289.08 Tm
-(primary) Tj
-1 0 0 1 269.399 289.08 Tm
-(creates) Tj
-1 0 0 1 87 277.2 Tm
-(a) Tj
-1 0 0 1 94.3199 277.2 Tm
-(ne) Tj
-1 0 0 1 103.56 277.2 Tm
-(w) Tj
-1 0 0 1 113.76 277.2 Tm
-(message) Tj
-ET
-q
-2.4 0 0 -9.9 151.4 284.7 cm
-/R460 Do
-Q
-BT
-/R445 8 Tf
-1 0 0 1 154.32 277.2 Tm
-(PRE) Tj
-/R445 10 Tf
-1 0 0 1 168.96 277.2 Tm
-(-) Tj
-/R445 8 Tf
-1 0 0 1 172.32 277.2 Tm
-(PREP) Tj
-1 0 0 1 190.68 277.2 Tm
-(ARE) Tj
-ET
-q
-1.3 0 0 -3 207.3 278.3 cm
-/R464 Do
-Q
-q
-4.4 0 0 -4.6 211.2 281.7 cm
-/R452 Do
-Q
-q
-6.6 0 0 -6.5 219.1 283 cm
-/R456 Do
-Q
-BT
-/R445 10 Tf
-1 0 0 1 228.839 277.2 Tm
-(1) Tj
-ET
-q
-1.3 0 0 -3 234.7 278.3 cm
-/R464 Do
-Q
-q
-5.4 0 0 -4.6 238.5 281.7 cm
-/R468 Do
-Q
-q
-1.3 0 0 -3 245.1 278.3 cm
-/R464 Do
-Q
-endstream
-endobj
-526 0 obj
-3873
-endobj
-527 0 obj
-<< /Type /XObject /Name /R527 /Subtype /Image /Length 528 0 R
-/ImageMask true /Width 49 /Height 71 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 49 /BlackIs1 true >>]
->>
-stream
--PYiBJV"+0)UN3G',i&VcojQ(@sYoeKmuDG
-s)&q9s*o7jJ)C$Fpj^'QJ%rnUr&sfAs+VQL0)H)pV[&D-@^p.P-,mCns*qra5O\@FpQ6S*nl.";J-Z~>
-endstream
-endobj
-528 0 obj
-117
-endobj
-529 0 obj
-<< /Length 530 0 R >>
-stream
-q
-4.9 0 0 -7.1 249.1 284.2 cm
-/R527 Do
-Q
-q
-2.4 0 0 -9.9 254.3 284.7 cm
-/R480 Do
-Q
-q
-4.2 0 0 -3.1 258 278.8 cm
-/R484 Do
-Q
-q
-3.1 0 0 -3.2 262.4 277 cm
-/R520 Do
-Q
-BT
-1 0 0 1 267 277.2 Tm
-(,) Tj
-1 0 0 1 272.64 277.2 Tm
-(where) Tj
-ET
-q
-4.9 0 0 -7.1 87.3 272.2 cm
-/R527 Do
-Q
-BT
-1 0 0 1 94.5599 265.2 Tm
-(is) Tj
-1 0 0 1 103.68 265.2 Tm
-(the) Tj
-1 0 0 1 118.32 265.2 Tm
-(request) Tj
-1 0 0 1 149.64 265.2 Tm
-(digest) Tj
-1 0 0 1 175.92 265.2 Tm
-(in) Tj
-1 0 0 1 186.12 265.2 Tm
-(the) Tj
-1 0 0 1 200.759 265.2 Tm
-(pre-prepare) Tj
-1 0 0 1 249.119 265.2 Tm
-(message) Tj
-1 0 0 1 285.359 265.2 Tm
-(for) Tj
-1 0 0 1 87 253.32 Tm
-(sequence) Tj
-1 0 0 1 127.56 253.32 Tm
-(number) Tj
-ET
-q
-5.4 0 0 -4.6 162.3 257.8 cm
-/R468 Do
-Q
-BT
-1 0 0 1 172.2 253.32 Tm
-(with) Tj
-1 0 0 1 194.16 253.32 Tm
-(the) Tj
-1 0 0 1 210.36 253.32 Tm
-(highest) Tj
-1 0 0 1 243.359 253.32 Tm
-(vie) Tj
-1 0 0 1 255.359 253.32 Tm
-(w) Tj
-1 0 0 1 266.519 253.32 Tm
-(number) Tj
-1 0 0 1 87 241.32 Tm
-(in) Tj
-ET
-q
-6.3 0 0 -7.4 99.8 248.2 cm
-/R512 Do
-Q
-BT
-1 0 0 1 106.56 241.32 Tm
-(.) Tj
-1 0 0 1 119.64 241.32 Tm
-(In) Tj
-1 0 0 1 132.84 241.32 Tm
-(the) Tj
-1 0 0 1 149.88 241.32 Tm
-(second) Tj
-1 0 0 1 182.4 241.32 Tm
-(case,) Tj
-1 0 0 1 207.48 241.32 Tm
-(it) Tj
-1 0 0 1 217.92 241.32 Tm
-(creates) Tj
-1 0 0 1 250.439 241.32 Tm
-(a) Tj
-1 0 0 1 259.799 241.32 Tm
-(ne) Tj
-1 0 0 1 269.039 241.32 Tm
-(w) Tj
-1 0 0 1 280.919 241.32 Tm
-(pre-) Tj
-1 0 0 1 87 229.44 Tm
-(prepare) Tj
-1 0 0 1 121.8 229.44 Tm
-(message) Tj
-ET
-q
-2.4 0 0 -9.9 161.3 236.9 cm
-/R460 Do
-Q
-BT
-/R445 8 Tf
-1 0 0 1 164.28 229.44 Tm
-(PRE) Tj
-/R445 10 Tf
-1 0 0 1 178.92 229.44 Tm
-(-) Tj
-/R445 8 Tf
-1 0 0 1 182.28 229.44 Tm
-(PREP) Tj
-1 0 0 1 200.64 229.44 Tm
-(ARE) Tj
-ET
-q
-1.3 0 0 -3 217.4 230.5 cm
-/R464 Do
-Q
-q
-4.4 0 0 -4.6 221.2 233.9 cm
-/R452 Do
-Q
-q
-6.6 0 0 -6.5 230.3 235.2 cm
-/R456 Do
-Q
-BT
-/R445 10 Tf
-1 0 0 1 241.08 229.44 Tm
-(1) Tj
-ET
-q
-1.3 0 0 -3 246.9 230.5 cm
-/R464 Do
-Q
-q
-5.4 0 0 -4.6 250.8 233.9 cm
-/R468 Do
-Q
-q
-1.3 0 0 -3 257.4 230.5 cm
-/R464 Do
-Q
-q
-4.9 0 0 -7.1 261.3 236.4 cm
-/R527 Do
-Q
-endstream
-endobj
-530 0 obj
-1995
-endobj
-531 0 obj
-<< /Type /XObject /Name /R531 /Subtype /Image /Length 532 0 R
-/ImageMask true /Width 43 /Height 33 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 43 /BlackIs1 true >>]
->>
-stream
-366ZtBKi$Kj)nf1pi$0"h;="Vq3Z%=rV-?Z\+qmGnGV5SiW&fRKsuPqJ89Nq=JdRb$l@h'!$D~>
-endstream
-endobj
-532 0 obj
-76
-endobj
-533 0 obj
-<< /Length 534 0 R >>
-stream
-q
-4.3 0 0 -3.3 266.5 236.2 cm
-/R531 Do
-Q
-endstream
-endobj
-534 0 obj
-41
-endobj
-535 0 obj
-<< /Type /XObject /Name /R535 /Subtype /Image /Length 536 0 R
-/ImageMask true /Width 41 /Height 33 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 41 /BlackIs1 true >>]
->>
-stream
-,RS3]JV5%#k`6^IoGFXX]IX$\_o'7hq4MUEDu\^EYl?&J&+AtsIJ\HmJ,?^gl`g^Q%1dsp!.Y~>
-endstream
-endobj
-536 0 obj
-76
-endobj
-537 0 obj
-<< /Length 538 0 R >>
-stream
-q
-4.1 0 0 -3.3 271.4 236.2 cm
-/R535 Do
-Q
-endstream
-endobj
-538 0 obj
-41
-endobj
-539 0 obj
-<< /Type /XObject /Name /R539 /Subtype /Image /Length 540 0 R
-/ImageMask true /Width 18 /Height 49 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 18 /BlackIs1 true >>]
->>
-stream
-3,jM'nkeZHp\iq*s4I>^^[L[l^Yee_rr7Jcn,(B6_t&A/#QTA~>
-endstream
-endobj
-540 0 obj
-52
-endobj
-541 0 obj
-<< /Length 542 0 R >>
-stream
-q
-1.8 0 0 -4.9 276 237.8 cm
-/R539 Do
-Q
-q
-1.8 0 0 -4.9 278.5 237.8 cm
-/R539 Do
-Q
-q
-2.4 0 0 -9.9 281.7 236.9 cm
-/R480 Do
-Q
-q
-4.2 0 0 -3.1 285.3 231 cm
-/R484 Do
-Q
-q
-3.1 0 0 -3.2 289.8 229.2 cm
-/R520 Do
-Q
-BT
-1 0 0 1 294.48 229.44 Tm
-(,) Tj
-1 0 0 1 87 217.44 Tm
-(where) Tj
-ET
-q
-4.9 0 0 -7.1 115.5 224.4 cm
-/R527 Do
-Q
-q
-4.3 0 0 -3.3 120.7 224.2 cm
-/R531 Do
-Q
-q
-4.1 0 0 -3.3 125.6 224.2 cm
-/R535 Do
-Q
-q
-1.8 0 0 -4.9 130.2 225.8 cm
-/R539 Do
-Q
-q
-1.8 0 0 -4.9 132.7 225.8 cm
-/R539 Do
-Q
-BT
-1 0 0 1 139.56 217.44 Tm
-(is) Tj
-1 0 0 1 150.12 217.44 Tm
-(the) Tj
-1 0 0 1 166.2 217.44 Tm
-(digest) Tj
-1 0 0 1 193.92 217.44 Tm
-(of) Tj
-1 0 0 1 206.16 217.44 Tm
-(a) Tj
-1 0 0 1 214.44 217.44 Tm
-(special) Tj
-/R524 10 Tf
-1 0 0 1 246 217.44 Tm
-(null) Tj
-/R445 10 Tf
-1 0 0 1 265.44 217.44 Tm
-(request;) Tj
-1 0 0 1 87 205.56 Tm
-(a) Tj
-1 0 0 1 95.28 205.56 Tm
-(null) Tj
-1 0 0 1 114.72 205.56 Tm
-(request) Tj
-1 0 0 1 147.36 205.56 Tm
-(goes) Tj
-1 0 0 1 169.56 205.56 Tm
-(through) Tj
-1 0 0 1 204.48 205.56 Tm
-(the) Tj
-1 0 0 1 220.68 205.56 Tm
-(protocol) Tj
-1 0 0 1 257.759 205.56 Tm
-(lik) Tj
-1 0 0 1 268.199 205.56 Tm
-(e) Tj
-1 0 0 1 276.479 205.56 Tm
-(other) Tj
-1 0 0 1 87 193.56 Tm
-(requests,) Tj
-1 0 0 1 126.12 193.56 Tm
-(b) Tj
-1 0 0 1 130.92 193.56 Tm
-(ut) Tj
-1 0 0 1 142.44 193.56 Tm
-(its) Tj
-1 0 0 1 155.64 193.56 Tm
-(e) Tj
-1 0 0 1 159.96 193.56 Tm
-(x) Tj
-1 0 0 1 164.88 193.56 Tm
-(ecution) Tj
-1 0 0 1 197.88 193.56 Tm
-(is) Tj
-1 0 0 1 208.32 193.56 Tm
-(a) Tj
-1 0 0 1 216.48 193.56 Tm
-(no-op.) Tj
-1 0 0 1 249.719 193.56 Tm
-(\(P) Tj
-1 0 0 1 258.479 193.56 Tm
-(axos) Tj
-1 0 0 1 280.439 193.56 Tm
-([18) Tj
-1 0 0 1 293.639 193.56 Tm
-(]) Tj
-1 0 0 1 87 181.68 Tm
-(used) Tj
-1 0 0 1 107.64 181.68 Tm
-(a) Tj
-1 0 0 1 114.6 181.68 Tm
-(similar) Tj
-1 0 0 1 144.72 181.68 Tm
-(technique) Tj
-1 0 0 1 186 181.68 Tm
-(to) Tj
-1 0 0 1 196.2 181.68 Tm
-(\256ll) Tj
-1 0 0 1 209.76 181.68 Tm
-(in) Tj
-1 0 0 1 220.08 181.68 Tm
-(gaps.\)) Tj
-1 0 0 1 81.96 166.56 Tm
-(Ne) Tj
-1 0 0 1 93.48 166.56 Tm
-(xt) Tj
-1 0 0 1 105.24 166.56 Tm
-(the) Tj
-1 0 0 1 121.44 166.56 Tm
-(primary) Tj
-1 0 0 1 157.08 166.56 Tm
-(appends) Tj
-1 0 0 1 193.8 166.56 Tm
-(the) Tj
-1 0 0 1 210 166.56 Tm
-(messages) Tj
-1 0 0 1 251.64 166.56 Tm
-(in) Tj
-ET
-q
-7.2 0 0 -7.4 264 173.7 cm
-/R516 Do
-Q
-BT
-1 0 0 1 275.759 166.56 Tm
-(to) Tj
-1 0 0 1 287.639 166.56 Tm
-(its) Tj
-1 0 0 1 72 154.56 Tm
-(log.) Tj
-1 0 0 1 92.5199 154.56 Tm
-(If) Tj
-/R524 10 Tf
-1 0 0 1 102.12 154.56 Tm
-(min-s) Tj
-/R445 10 Tf
-1 0 0 1 127.32 154.56 Tm
-(is) Tj
-1 0 0 1 137.04 154.56 Tm
-(greater) Tj
-1 0 0 1 167.76 154.56 Tm
-(than) Tj
-1 0 0 1 187.919 154.56 Tm
-(the) Tj
-1 0 0 1 203.159 154.56 Tm
-(sequence) Tj
-1 0 0 1 242.759 154.56 Tm
-(number) Tj
-1 0 0 1 276.239 154.56 Tm
-(of) Tj
-1 0 0 1 287.639 154.56 Tm
-(its) Tj
-1 0 0 1 72 142.68 Tm
-(latest) Tj
-1 0 0 1 94.9199 142.68 Tm
-(stable) Tj
-1 0 0 1 120 142.68 Tm
-(checkpoint,) Tj
-1 0 0 1 168.24 142.68 Tm
-(the) Tj
-1 0 0 1 182.16 142.68 Tm
-(primary) Tj
-1 0 0 1 215.64 142.68 Tm
-(also) Tj
-1 0 0 1 233.519 142.68 Tm
-(inserts) Tj
-1 0 0 1 261.359 142.68 Tm
-(the) Tj
-1 0 0 1 275.399 142.68 Tm
-(proof) Tj
-1 0 0 1 72 130.68 Tm
-(of) Tj
-1 0 0 1 84.96 130.68 Tm
-(stability) Tj
-1 0 0 1 121.68 130.68 Tm
-(for) Tj
-1 0 0 1 137.88 130.68 Tm
-(the) Tj
-1 0 0 1 154.68 130.68 Tm
-(checkpoint) Tj
-1 0 0 1 203.04 130.68 Tm
-(with) Tj
-1 0 0 1 225.36 130.68 Tm
-(sequence) Tj
-1 0 0 1 266.519 130.68 Tm
-(number) Tj
-/R524 10 Tf
-1 0 0 1 72 118.8 Tm
-(min-s) Tj
-/R445 10 Tf
-1 0 0 1 97.6799 118.8 Tm
-(in) Tj
-1 0 0 1 108.96 118.8 Tm
-(its) Tj
-1 0 0 1 121.92 118.8 Tm
-(log,) Tj
-1 0 0 1 141 118.8 Tm
-(and) Tj
-1 0 0 1 158.88 118.8 Tm
-(discards) Tj
-1 0 0 1 195.12 118.8 Tm
-(information) Tj
-1 0 0 1 245.639 118.8 Tm
-(from) Tj
-1 0 0 1 268.559 118.8 Tm
-(the) Tj
-1 0 0 1 284.279 118.8 Tm
-(log) Tj
-1 0 0 1 72 106.8 Tm
-(as) Tj
-1 0 0 1 82.5599 106.8 Tm
-(discussed) Tj
-1 0 0 1 123 106.8 Tm
-(in) Tj
-1 0 0 1 133.08 106.8 Tm
-(Section) Tj
-1 0 0 1 165.24 106.8 Tm
-(4.3.) Tj
-1 0 0 1 183.72 106.8 Tm
-(Then) Tj
-1 0 0 1 206.4 106.8 Tm
-(it) Tj
-/R524 10 Tf
-1 0 0 1 214.199 106.8 Tm
-(enter) Tj
-1 0 0 1 234.599 106.8 Tm
-(s) Tj
-/R445 10 Tf
-1 0 0 1 240.719 106.8 Tm
-(vie) Tj
-1 0 0 1 252.719 106.8 Tm
-(w) Tj
-ET
-q
-4.4 0 0 -4.6 262.4 111.3 cm
-/R452 Do
-Q
-q
-6.6 0 0 -6.5 269.5 112.6 cm
-/R456 Do
-Q
-BT
-1 0 0 1 278.519 106.8 Tm
-(1:) Tj
-1 0 0 1 289.799 106.8 Tm
-(at) Tj
-1 0 0 1 72 94.92 Tm
-(this) Tj
-1 0 0 1 88.9199 94.92 Tm
-(point) Tj
-1 0 0 1 111.84 94.92 Tm
-(it) Tj
-1 0 0 1 119.88 94.92 Tm
-(is) Tj
-1 0 0 1 129 94.92 Tm
-(able) Tj
-1 0 0 1 148.08 94.92 Tm
-(to) Tj
-1 0 0 1 158.4 94.92 Tm
-(accept) Tj
-1 0 0 1 186.24 94.92 Tm
-(messages) Tj
-1 0 0 1 226.44 94.92 Tm
-(for) Tj
-1 0 0 1 240.479 94.92 Tm
-(vie) Tj
-1 0 0 1 252.479 94.92 Tm
-(w) Tj
-ET
-q
-4.4 0 0 -4.6 262.3 99.4 cm
-/R452 Do
-Q
-q
-6.6 0 0 -6.5 270 100.7 cm
-/R456 Do
-Q
-BT
-1 0 0 1 279.479 94.92 Tm
-(1.) Tj
-1 0 0 1 81.96 82.92 Tm
-(A) Tj
-1 0 0 1 91.68 82.92 Tm
-(backup) Tj
-1 0 0 1 122.88 82.92 Tm
-(accepts) Tj
-1 0 0 1 154.68 82.92 Tm
-(a) Tj
-1 0 0 1 161.52 82.92 Tm
-(ne) Tj
-1 0 0 1 170.76 82.92 Tm
-(w-vie) Tj
-1 0 0 1 193.32 82.92 Tm
-(w) Tj
-1 0 0 1 202.8 82.92 Tm
-(message) Tj
-1 0 0 1 239.04 82.92 Tm
-(for) Tj
-1 0 0 1 253.199 82.92 Tm
-(vie) Tj
-1 0 0 1 265.199 82.92 Tm
-(w) Tj
-ET
-q
-4.4 0 0 -4.6 274.9 87.4 cm
-/R452 Do
-Q
-q
-6.6 0 0 -6.5 282.6 88.7 cm
-/R456 Do
-Q
-BT
-1 0 0 1 291.959 82.92 Tm
-(1) Tj
-1 0 0 1 72 71.04 Tm
-(if) Tj
-1 0 0 1 81.7199 71.04 Tm
-(it) Tj
-1 0 0 1 90.9599 71.04 Tm
-(is) Tj
-1 0 0 1 101.16 71.04 Tm
-(signed) Tj
-1 0 0 1 130.8 71.04 Tm
-(properly) Tj
-1 0 0 1 164.28 71.04 Tm
-(,) Tj
-1 0 0 1 170.4 71.04 Tm
-(if) Tj
-1 0 0 1 180.12 71.04 Tm
-(the) Tj
-1 0 0 1 195.959 71.04 Tm
-(vie) Tj
-1 0 0 1 207.959 71.04 Tm
-(w-change) Tj
-1 0 0 1 250.199 71.04 Tm
-(messages) Tj
-1 0 0 1 291.479 71.04 Tm
-(it) Tj
-1 0 0 1 315 709.08 Tm
-(contains) Tj
-1 0 0 1 352.2 709.08 Tm
-(are) Tj
-1 0 0 1 368.28 709.08 Tm
-(v) Tj
-1 0 0 1 373.08 709.08 Tm
-(alid) Tj
-1 0 0 1 392.04 709.08 Tm
-(for) Tj
-1 0 0 1 407.64 709.08 Tm
-(vie) Tj
-1 0 0 1 419.64 709.08 Tm
-(w) Tj
-ET
-q
-4.4 0 0 -4.6 430.9 713.6 cm
-/R452 Do
-Q
-q
-6.6 0 0 -6.5 439.5 714.9 cm
-/R456 Do
-Q
-BT
-1 0 0 1 449.76 709.08 Tm
-(1,) Tj
-1 0 0 1 461.519 709.08 Tm
-(and) Tj
-1 0 0 1 479.879 709.08 Tm
-(if) Tj
-1 0 0 1 489.959 709.08 Tm
-(the) Tj
-1 0 0 1 506.159 709.08 Tm
-(set) Tj
-ET
-q
-7.2 0 0 -7.4 521.7 716.2 cm
-/R516 Do
-Q
-BT
-1 0 0 1 533.399 709.08 Tm
-(is) Tj
-1 0 0 1 315 697.08 Tm
-(correct;) Tj
-1 0 0 1 348.72 697.08 Tm
-(it) Tj
-1 0 0 1 357.24 697.08 Tm
-(v) Tj
-1 0 0 1 362.16 697.08 Tm
-(eri\256es) Tj
-1 0 0 1 389.4 697.08 Tm
-(the) Tj
-1 0 0 1 404.52 697.08 Tm
-(correctness) Tj
-1 0 0 1 452.279 697.08 Tm
-(of) Tj
-ET
-q
-7.2 0 0 -7.4 464.1 704.2 cm
-/R516 Do
-Q
-BT
-1 0 0 1 474.839 697.08 Tm
-(by) Tj
-1 0 0 1 487.799 697.08 Tm
-(performing) Tj
-1 0 0 1 535.559 697.08 Tm
-(a) Tj
-1 0 0 1 315 685.2 Tm
-(computation) Tj
-1 0 0 1 368.52 685.2 Tm
-(similar) Tj
-1 0 0 1 399.96 685.2 Tm
-(to) Tj
-1 0 0 1 411.36 685.2 Tm
-(the) Tj
-1 0 0 1 427.32 685.2 Tm
-(one) Tj
-1 0 0 1 445.44 685.2 Tm
-(used) Tj
-1 0 0 1 467.4 685.2 Tm
-(by) Tj
-1 0 0 1 481.079 685.2 Tm
-(the) Tj
-1 0 0 1 497.039 685.2 Tm
-(primary) Tj
-1 0 0 1 532.199 685.2 Tm
-(to) Tj
-1 0 0 1 315 673.2 Tm
-(create) Tj
-ET
-q
-7.2 0 0 -7.4 342 680.3 cm
-/R516 Do
-Q
-BT
-1 0 0 1 349.68 673.2 Tm
-(.) Tj
-1 0 0 1 356.76 673.2 Tm
-(Then) Tj
-1 0 0 1 380.04 673.2 Tm
-(it) Tj
-1 0 0 1 388.44 673.2 Tm
-(adds) Tj
-1 0 0 1 409.44 673.2 Tm
-(the) Tj
-1 0 0 1 424.44 673.2 Tm
-(ne) Tj
-1 0 0 1 433.68 673.2 Tm
-(w) Tj
-1 0 0 1 443.52 673.2 Tm
-(information) Tj
-1 0 0 1 493.439 673.2 Tm
-(to) Tj
-1 0 0 1 503.999 673.2 Tm
-(its) Tj
-1 0 0 1 516.119 673.2 Tm
-(log) Tj
-1 0 0 1 531.719 673.2 Tm
-(as) Tj
-1 0 0 1 315 661.32 Tm
-(described) Tj
-1 0 0 1 356.28 661.32 Tm
-(for) Tj
-1 0 0 1 371.04 661.32 Tm
-(the) Tj
-1 0 0 1 386.28 661.32 Tm
-(primary) Tj
-1 0 0 1 417.48 661.32 Tm
-(,) Tj
-1 0 0 1 423 661.32 Tm
-(multicasts) Tj
-1 0 0 1 466.439 661.32 Tm
-(a) Tj
-1 0 0 1 473.999 661.32 Tm
-(prepare) Tj
-1 0 0 1 506.999 661.32 Tm
-(for) Tj
-1 0 0 1 521.759 661.32 Tm
-(each) Tj
-1 0 0 1 315 649.32 Tm
-(message) Tj
-1 0 0 1 350.64 649.32 Tm
-(in) Tj
-ET
-q
-7.2 0 0 -7.4 360.7 656.4 cm
-/R516 Do
-Q
-BT
-1 0 0 1 370.32 649.32 Tm
-(to) Tj
-1 0 0 1 380.04 649.32 Tm
-(all) Tj
-1 0 0 1 391.8 649.32 Tm
-(the) Tj
-1 0 0 1 405.96 649.32 Tm
-(other) Tj
-1 0 0 1 428.28 649.32 Tm
-(replicas,) Tj
-1 0 0 1 463.799 649.32 Tm
-(adds) Tj
-1 0 0 1 483.839 649.32 Tm
-(these) Tj
-1 0 0 1 506.279 649.32 Tm
-(prepares) Tj
-1 0 0 1 315 637.44 Tm
-(to) Tj
-1 0 0 1 325.2 637.44 Tm
-(its) Tj
-1 0 0 1 337.2 637.44 Tm
-(log,) Tj
-1 0 0 1 354.84 637.44 Tm
-(and) Tj
-1 0 0 1 371.76 637.44 Tm
-(enters) Tj
-1 0 0 1 398.04 637.44 Tm
-(vie) Tj
-1 0 0 1 410.04 637.44 Tm
-(w) Tj
-ET
-q
-4.4 0 0 -4.6 419.8 641.9 cm
-/R452 Do
-Q
-q
-6.6 0 0 -6.5 427.6 643.2 cm
-/R456 Do
-Q
-BT
-1 0 0 1 437.04 637.44 Tm
-(1.) Tj
-1 0 0 1 324.96 625.08 Tm
-(Thereafter) Tj
-1 0 0 1 366.36 625.08 Tm
-(,) Tj
-1 0 0 1 375.36 625.08 Tm
-(the) Tj
-1 0 0 1 393.48 625.08 Tm
-(protocol) Tj
-1 0 0 1 432.6 625.08 Tm
-(proceeds) Tj
-1 0 0 1 473.879 625.08 Tm
-(as) Tj
-1 0 0 1 488.159 625.08 Tm
-(described) Tj
-1 0 0 1 532.199 625.08 Tm
-(in) Tj
-1 0 0 1 315 613.2 Tm
-(Section) Tj
-1 0 0 1 349.08 613.2 Tm
-(4.2.) Tj
-1 0 0 1 372.6 613.2 Tm
-(Replicas) Tj
-1 0 0 1 411 613.2 Tm
-(redo) Tj
-1 0 0 1 432.96 613.2 Tm
-(the) Tj
-1 0 0 1 449.28 613.2 Tm
-(protocol) Tj
-1 0 0 1 486.599 613.2 Tm
-(for) Tj
-1 0 0 1 502.319 613.2 Tm
-(messages) Tj
-1 0 0 1 315 601.2 Tm
-(between) Tj
-/R524 10 Tf
-1 0 0 1 352.56 601.2 Tm
-(min-s) Tj
-/R445 10 Tf
-1 0 0 1 379.08 601.2 Tm
-(and) Tj
-/R524 10 Tf
-1 0 0 1 397.92 601.2 Tm
-(max-s) Tj
-/R445 10 Tf
-1 0 0 1 426.12 601.2 Tm
-(b) Tj
-1 0 0 1 430.92 601.2 Tm
-(ut) Tj
-1 0 0 1 443.04 601.2 Tm
-(the) Tj
-1 0 0 1 455.16 601.2 Tm
-(y) Tj
-1 0 0 1 464.4 601.2 Tm
-(a) Tj
-1 0 0 1 468.6 601.2 Tm
-(v) Tj
-1 0 0 1 473.4 601.2 Tm
-(oid) Tj
-1 0 0 1 490.56 601.2 Tm
-(re-e) Tj
-1 0 0 1 506.039 601.2 Tm
-(x) Tj
-1 0 0 1 510.959 601.2 Tm
-(ecuting) Tj
-1 0 0 1 315 589.32 Tm
-(client) Tj
-1 0 0 1 340.56 589.32 Tm
-(requests) Tj
-1 0 0 1 376.56 589.32 Tm
-(\(by) Tj
-1 0 0 1 393.12 589.32 Tm
-(using) Tj
-1 0 0 1 418.08 589.32 Tm
-(their) Tj
-1 0 0 1 439.8 589.32 Tm
-(stored) Tj
-1 0 0 1 467.399 589.32 Tm
-(information) Tj
-1 0 0 1 517.919 589.32 Tm
-(about) Tj
-1 0 0 1 315 577.32 Tm
-(the) Tj
-1 0 0 1 329.64 577.32 Tm
-(last) Tj
-1 0 0 1 345.96 577.32 Tm
-(reply) Tj
-1 0 0 1 369 577.32 Tm
-(sent) Tj
-1 0 0 1 387.48 577.32 Tm
-(to) Tj
-1 0 0 1 397.68 577.32 Tm
-(each) Tj
-1 0 0 1 418.44 577.32 Tm
-(client\).) Tj
-1 0 0 1 324.96 565.08 Tm
-(A) Tj
-1 0 0 1 336 565.08 Tm
-(replica) Tj
-1 0 0 1 366.96 565.08 Tm
-(may) Tj
-1 0 0 1 387.96 565.08 Tm
-(be) Tj
-1 0 0 1 401.28 565.08 Tm
-(missing) Tj
-1 0 0 1 436.08 565.08 Tm
-(some) Tj
-1 0 0 1 461.04 565.08 Tm
-(request) Tj
-1 0 0 1 493.679 565.08 Tm
-(message) Tj
-ET
-q
-8.1 0 0 -4.6 531.4 569.6 cm
-/R504 Do
-Q
-BT
-1 0 0 1 315 553.08 Tm
-(or) Tj
-1 0 0 1 326.52 553.08 Tm
-(a) Tj
-1 0 0 1 334.32 553.08 Tm
-(stable) Tj
-1 0 0 1 360.72 553.08 Tm
-(checkpoint) Tj
-1 0 0 1 407.76 553.08 Tm
-(\(since) Tj
-1 0 0 1 434.76 553.08 Tm
-(these) Tj
-1 0 0 1 458.519 553.08 Tm
-(are) Tj
-1 0 0 1 473.999 553.08 Tm
-(not) Tj
-1 0 0 1 489.959 553.08 Tm
-(sent) Tj
-1 0 0 1 509.279 553.08 Tm
-(in) Tj
-1 0 0 1 520.319 553.08 Tm
-(ne) Tj
-1 0 0 1 529.559 553.08 Tm
-(w-) Tj
-1 0 0 1 315 541.2 Tm
-(vie) Tj
-1 0 0 1 327 541.2 Tm
-(w) Tj
-1 0 0 1 336.84 541.2 Tm
-(messages.\)) Tj
-1 0 0 1 384.36 541.2 Tm
-(It) Tj
-1 0 0 1 393.12 541.2 Tm
-(can) Tj
-1 0 0 1 409.68 541.2 Tm
-(obtain) Tj
-1 0 0 1 437.28 541.2 Tm
-(missing) Tj
-1 0 0 1 470.88 541.2 Tm
-(information) Tj
-1 0 0 1 520.679 541.2 Tm
-(from) Tj
-1 0 0 1 315 529.2 Tm
-(another) Tj
-1 0 0 1 349.44 529.2 Tm
-(replica.) Tj
-1 0 0 1 388.8 529.2 Tm
-(F) Tj
-1 0 0 1 394.2 529.2 Tm
-(or) Tj
-1 0 0 1 407.04 529.2 Tm
-(e) Tj
-1 0 0 1 411.36 529.2 Tm
-(xample,) Tj
-1 0 0 1 448.08 529.2 Tm
-(replica) Tj
-ET
-q
-2.6 0 0 -6.9 480 536 cm
-/R448 Do
-Q
-BT
-1 0 0 1 487.799 529.2 Tm
-(can) Tj
-1 0 0 1 506.159 529.2 Tm
-(obtain) Tj
-1 0 0 1 535.559 529.2 Tm
-(a) Tj
-1 0 0 1 315 517.32 Tm
-(missing) Tj
-1 0 0 1 351.24 517.32 Tm
-(checkpoint) Tj
-1 0 0 1 400.2 517.32 Tm
-(state) Tj
-ET
-q
-3.7 0 0 -4.6 424.2 521.8 cm
-/R492 Do
-Q
-BT
-1 0 0 1 433.68 517.32 Tm
-(from) Tj
-1 0 0 1 458.4 517.32 Tm
-(one) Tj
-1 0 0 1 477.96 517.32 Tm
-(of) Tj
-1 0 0 1 491.519 517.32 Tm
-(the) Tj
-1 0 0 1 509.039 517.32 Tm
-(replicas) Tj
-1 0 0 1 315 505.32 Tm
-(whose) Tj
-1 0 0 1 344.4 505.32 Tm
-(checkpoint) Tj
-1 0 0 1 392.04 505.32 Tm
-(messages) Tj
-1 0 0 1 433.56 505.32 Tm
-(certi\256ed) Tj
-1 0 0 1 470.16 505.32 Tm
-(its) Tj
-1 0 0 1 483.479 505.32 Tm
-(correctness) Tj
-1 0 0 1 532.199 505.32 Tm
-(in) Tj
-ET
-q
-6.3 0 0 -7.4 315.2 500.3 cm
-/R512 Do
-Q
-BT
-1 0 0 1 321.96 493.44 Tm
-(.) Tj
-1 0 0 1 327.96 493.44 Tm
-(Since) Tj
-ET
-q
-5 0 0 -9.2 352.6 500.5 cm
-/R496 Do
-Q
-q
-6.6 0 0 -6.5 360.1 499.2 cm
-/R456 Do
-Q
-BT
-1 0 0 1 369 493.44 Tm
-(1) Tj
-1 0 0 1 376.08 493.44 Tm
-(of) Tj
-1 0 0 1 386.52 493.44 Tm
-(those) Tj
-1 0 0 1 409.8 493.44 Tm
-(replicas) Tj
-1 0 0 1 442.92 493.44 Tm
-(are) Tj
-1 0 0 1 457.199 493.44 Tm
-(correct,) Tj
-1 0 0 1 489.599 493.44 Tm
-(replica) Tj
-ET
-q
-2.6 0 0 -6.9 519.1 500.2 cm
-/R448 Do
-Q
-BT
-1 0 0 1 524.519 493.44 Tm
-(will) Tj
-1 0 0 1 315 481.44 Tm
-(al) Tj
-1 0 0 1 322.08 481.44 Tm
-(w) Tj
-1 0 0 1 329.16 481.44 Tm
-(ays) Tj
-1 0 0 1 344.88 481.44 Tm
-(obtain) Tj
-ET
-q
-3.7 0 0 -4.6 372.5 485.9 cm
-/R492 Do
-Q
-BT
-1 0 0 1 379.08 481.44 Tm
-(or) Tj
-1 0 0 1 389.76 481.44 Tm
-(a) Tj
-1 0 0 1 396.6 481.44 Tm
-(later) Tj
-1 0 0 1 416.64 481.44 Tm
-(certi\256ed) Tj
-1 0 0 1 451.559 481.44 Tm
-(stable) Tj
-1 0 0 1 477.239 481.44 Tm
-(checkpoint.) Tj
-1 0 0 1 526.919 481.44 Tm
-(W) Tj
-1 0 0 1 535.439 481.44 Tm
-(e) Tj
-1 0 0 1 315 469.56 Tm
-(can) Tj
-1 0 0 1 332.16 469.56 Tm
-(a) Tj
-1 0 0 1 336.36 469.56 Tm
-(v) Tj
-1 0 0 1 341.16 469.56 Tm
-(oid) Tj
-1 0 0 1 357.24 469.56 Tm
-(sending) Tj
-1 0 0 1 391.56 469.56 Tm
-(the) Tj
-1 0 0 1 407.16 469.56 Tm
-(entire) Tj
-1 0 0 1 433.08 469.56 Tm
-(checkpoint) Tj
-1 0 0 1 480.24 469.56 Tm
-(by) Tj
-1 0 0 1 493.559 469.56 Tm
-(partitioning) Tj
-1 0 0 1 315 457.56 Tm
-(the) Tj
-1 0 0 1 330.36 457.56 Tm
-(state) Tj
-1 0 0 1 351.72 457.56 Tm
-(and) Tj
-1 0 0 1 369.24 457.56 Tm
-(stamping) Tj
-1 0 0 1 408.96 457.56 Tm
-(each) Tj
-1 0 0 1 430.32 457.56 Tm
-(partition) Tj
-1 0 0 1 467.279 457.56 Tm
-(with) Tj
-1 0 0 1 488.159 457.56 Tm
-(the) Tj
-1 0 0 1 503.519 457.56 Tm
-(sequence) Tj
-1 0 0 1 315 445.68 Tm
-(number) Tj
-1 0 0 1 349.56 445.68 Tm
-(of) Tj
-1 0 0 1 362.04 445.68 Tm
-(the) Tj
-1 0 0 1 378.36 445.68 Tm
-(last) Tj
-1 0 0 1 396.36 445.68 Tm
-(request) Tj
-1 0 0 1 429.24 445.68 Tm
-(that) Tj
-1 0 0 1 448.32 445.68 Tm
-(modi\256ed) Tj
-1 0 0 1 487.919 445.68 Tm
-(it.) Tj
-1 0 0 1 504.599 445.68 Tm
-(T) Tj
-1 0 0 1 509.879 445.68 Tm
-(o) Tj
-1 0 0 1 518.999 445.68 Tm
-(bring) Tj
-1 0 0 1 315 433.68 Tm
-(a) Tj
-1 0 0 1 323.04 433.68 Tm
-(replica) Tj
-1 0 0 1 353.88 433.68 Tm
-(up) Tj
-1 0 0 1 367.56 433.68 Tm
-(to) Tj
-1 0 0 1 378.96 433.68 Tm
-(date,) Tj
-1 0 0 1 402 433.68 Tm
-(it) Tj
-1 0 0 1 411.12 433.68 Tm
-(is) Tj
-1 0 0 1 421.44 433.68 Tm
-(only) Tj
-1 0 0 1 442.919 433.68 Tm
-(necessary) Tj
-1 0 0 1 485.279 433.68 Tm
-(to) Tj
-1 0 0 1 496.679 433.68 Tm
-(send) Tj
-1 0 0 1 518.639 433.68 Tm
-(it) Tj
-1 0 0 1 527.879 433.68 Tm
-(the) Tj
-1 0 0 1 315 421.8 Tm
-(partitions) Tj
-1 0 0 1 356.04 421.8 Tm
-(where) Tj
-1 0 0 1 383.64 421.8 Tm
-(it) Tj
-1 0 0 1 392.64 421.8 Tm
-(is) Tj
-1 0 0 1 402.6 421.8 Tm
-(out) Tj
-1 0 0 1 418.68 421.8 Tm
-(of) Tj
-1 0 0 1 430.32 421.8 Tm
-(date,) Tj
-1 0 0 1 453 421.8 Tm
-(rather) Tj
-1 0 0 1 479.639 421.8 Tm
-(than) Tj
-1 0 0 1 500.159 421.8 Tm
-(the) Tj
-1 0 0 1 515.639 421.8 Tm
-(whole) Tj
-1 0 0 1 315 409.8 Tm
-(checkpoint.) Tj
-ET
-endstream
-endobj
-542 0 obj
-15114
-endobj
-543 0 obj
-<< /Type /Font /Name /R543 /Subtype /Type1 /BaseFont /Times-Bold >>
-endobj
-544 0 obj
-<< /Length 545 0 R >>
-stream
-BT
-/R543 10 Tf
-1 0 0 1 315 387.12 Tm
-(4.5) Tj
-1 0 0 1 337.44 387.12 Tm
-(Corr) Tj
-1 0 0 1 358.44 387.12 Tm
-(ectness) Tj
-/R445 10 Tf
-1 0 0 1 315 372.24 Tm
-(This) Tj
-1 0 0 1 339.24 372.24 Tm
-(section) Tj
-1 0 0 1 374.04 372.24 Tm
-(sk) Tj
-1 0 0 1 382.8 372.24 Tm
-(etches) Tj
-1 0 0 1 414.24 372.24 Tm
-(the) Tj
-1 0 0 1 432.96 372.24 Tm
-(proof) Tj
-1 0 0 1 461.04 372.24 Tm
-(that) Tj
-1 0 0 1 482.519 372.24 Tm
-(the) Tj
-1 0 0 1 501.239 372.24 Tm
-(algorithm) Tj
-1 0 0 1 315 360.36 Tm
-(pro) Tj
-1 0 0 1 328.32 360.36 Tm
-(vides) Tj
-1 0 0 1 351.6 360.36 Tm
-(safety) Tj
-1 0 0 1 377.88 360.36 Tm
-(and) Tj
-1 0 0 1 394.8 360.36 Tm
-(li) Tj
-1 0 0 1 400.08 360.36 Tm
-(v) Tj
-1 0 0 1 405 360.36 Tm
-(eness;) Tj
-1 0 0 1 431.76 360.36 Tm
-(details) Tj
-1 0 0 1 460.319 360.36 Tm
-(can) Tj
-1 0 0 1 476.639 360.36 Tm
-(be) Tj
-1 0 0 1 488.519 360.36 Tm
-(found) Tj
-1 0 0 1 514.199 360.36 Tm
-(in) Tj
-1 0 0 1 524.519 360.36 Tm
-([4) Tj
-1 0 0 1 532.799 360.36 Tm
-(].) Tj
-/R543 10 Tf
-1 0 0 1 315 337.56 Tm
-(4.5.1) Tj
-1 0 0 1 344.88 337.56 Tm
-(Safety) Tj
-/R445 10 Tf
-1 0 0 1 315 322.8 Tm
-(As) Tj
-1 0 0 1 328.92 322.8 Tm
-(discussed) Tj
-1 0 0 1 370.08 322.8 Tm
-(earlier) Tj
-1 0 0 1 395.28 322.8 Tm
-(,) Tj
-1 0 0 1 400.56 322.8 Tm
-(the) Tj
-1 0 0 1 415.68 322.8 Tm
-(algorithm) Tj
-1 0 0 1 457.319 322.8 Tm
-(pro) Tj
-1 0 0 1 470.639 322.8 Tm
-(vides) Tj
-1 0 0 1 494.399 322.8 Tm
-(safety) Tj
-1 0 0 1 521.039 322.8 Tm
-(if) Tj
-1 0 0 1 530.039 322.8 Tm
-(all) Tj
-1 0 0 1 315 310.8 Tm
-(non-f) Tj
-1 0 0 1 336.72 310.8 Tm
-(aulty) Tj
-1 0 0 1 360.6 310.8 Tm
-(replicas) Tj
-1 0 0 1 395.88 310.8 Tm
-(agree) Tj
-1 0 0 1 421.68 310.8 Tm
-(on) Tj
-1 0 0 1 435.96 310.8 Tm
-(the) Tj
-1 0 0 1 452.4 310.8 Tm
-(sequence) Tj
-1 0 0 1 493.079 310.8 Tm
-(numbers) Tj
-1 0 0 1 531.719 310.8 Tm
-(of) Tj
-1 0 0 1 315 298.92 Tm
-(requests) Tj
-1 0 0 1 350.16 298.92 Tm
-(that) Tj
-1 0 0 1 367.56 298.92 Tm
-(commit) Tj
-1 0 0 1 400.56 298.92 Tm
-(locally) Tj
-1 0 0 1 427.2 298.92 Tm
-(.) Tj
-1 0 0 1 324.96 286.68 Tm
-(In) Tj
-1 0 0 1 336 286.68 Tm
-(Section) Tj
-1 0 0 1 368.52 286.68 Tm
-(4.2,) Tj
-1 0 0 1 386.28 286.68 Tm
-(we) Tj
-1 0 0 1 400.56 286.68 Tm
-(sho) Tj
-1 0 0 1 414.24 286.68 Tm
-(wed) Tj
-1 0 0 1 433.44 286.68 Tm
-(that) Tj
-1 0 0 1 451.08 286.68 Tm
-(if) Tj
-/R524 10 Tf
-1 0 0 1 459.84 286.68 Tm
-(pr) Tj
-1 0 0 1 468.36 286.68 Tm
-(epar) Tj
-1 0 0 1 486.36 286.68 Tm
-(ed) Tj
-ET
-endstream
-endobj
-545 0 obj
-2285
-endobj
-546 0 obj
-<< /Type /XObject /Name /R546 /Subtype /Image /Length 547 0 R
-/ImageMask true /Width 24 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 24 /BlackIs1 true >>]
->>
-stream
-+rF]%*LO8IHL@*j8[taqp!<~>
-endstream
-endobj
-547 0 obj
-80
-endobj
-548 0 obj
-<< /Length 549 0 R >>
-stream
-q
-2.4 0 0 -9.9 496.7 294.2 cm
-/R546 Do
-Q
-q
-8.1 0 0 -4.6 499.9 291.2 cm
-/R504 Do
-Q
-q
-1.3 0 0 -3 509.2 287.8 cm
-/R464 Do
-Q
-q
-4.4 0 0 -4.6 513.1 291.2 cm
-/R452 Do
-Q
-q
-1.3 0 0 -3 518.8 287.8 cm
-/R464 Do
-Q
-q
-5.4 0 0 -4.6 522.7 291.2 cm
-/R468 Do
-Q
-q
-1.3 0 0 -3 529.3 287.8 cm
-/R464 Do
-Q
-q
-2.6 0 0 -6.9 533.1 293.5 cm
-/R448 Do
-Q
-endstream
-endobj
-549 0 obj
-322
-endobj
-550 0 obj
-<< /Type /XObject /Name /R550 /Subtype /Image /Length 551 0 R
-/ImageMask true /Width 24 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 24 /BlackIs1 true >>]
->>
-stream
-,JEO$loTRL4niC`hqS$`rnmKps6nkFp\Y!js6KW5s0(&RK)W@\(KK(`l\2@U?Bm&k<5,",!$D~>
-endstream
-endobj
-551 0 obj
-76
-endobj
-552 0 obj
-<< /Length 553 0 R >>
-stream
-q
-2.4 0 0 -9.9 536.8 294.2 cm
-/R550 Do
-Q
-BT
-/R445 10 Tf
-1 0 0 1 315 274.68 Tm
-(is) Tj
-1 0 0 1 324.96 274.68 Tm
-(true,) Tj
-/R524 10 Tf
-1 0 0 1 346.56 274.68 Tm
-(pr) Tj
-1 0 0 1 355.08 274.68 Tm
-(epar) Tj
-1 0 0 1 373.08 274.68 Tm
-(ed) Tj
-ET
-q
-2.4 0 0 -9.9 383.5 282.2 cm
-/R546 Do
-Q
-q
-8.1 0 0 -4.6 386.6 279.2 cm
-/R504 Do
-Q
-endstream
-endobj
-553 0 obj
-320
-endobj
-554 0 obj
-<< /Type /XObject /Name /R554 /Subtype /Image /Length 555 0 R
-/ImageMask true /Width 17 /Height 37 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 17 /BlackIs1 true >>]
->>
-stream
-2p&%Irsf"qs+g(;pODr+p\l"Z@=(fO!"]~>
-endstream
-endobj
-555 0 obj
-36
-endobj
-556 0 obj
-<< /Length 557 0 R >>
-stream
-q
-1.7 0 0 -3.7 395.5 282.2 cm
-/R554 Do
-Q
-q
-1.3 0 0 -3 398.5 275.8 cm
-/R464 Do
-Q
-q
-4.4 0 0 -4.6 402.3 279.2 cm
-/R452 Do
-Q
-q
-1.3 0 0 -3 408.1 275.8 cm
-/R464 Do
-Q
-q
-5.4 0 0 -4.6 411.9 279.2 cm
-/R468 Do
-Q
-q
-1.3 0 0 -3 418.5 275.8 cm
-/R464 Do
-Q
-endstream
-endobj
-557 0 obj
-240
-endobj
-558 0 obj
-<< /Type /XObject /Name /R558 /Subtype /Image /Length 559 0 R
-/ImageMask true /Width 41 /Height 89 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 41 /BlackIs1 true >>]
->>
-stream
-3%oqNe0+KR
-8.TS3gNRT8m0C&=*WH)RhtR$Is*qrFs*qfPpZ+:-rpTR[p\3
-endstream
-endobj
-559 0 obj
-92
-endobj
-560 0 obj
-<< /Length 561 0 R >>
-stream
-q
-4.1 0 0 -8.9 422 281.5 cm
-/R558 Do
-Q
-q
-2.4 0 0 -9.9 427.2 282.2 cm
-/R550 Do
-Q
-BT
-/R445 10 Tf
-1 0 0 1 434.04 274.68 Tm
-(is) Tj
-1 0 0 1 444 274.68 Tm
-(f) Tj
-1 0 0 1 447.24 274.68 Tm
-(alse) Tj
-1 0 0 1 466.08 274.68 Tm
-(for) Tj
-1 0 0 1 481.079 274.68 Tm
-(an) Tj
-1 0 0 1 490.44 274.68 Tm
-(y) Tj
-1 0 0 1 498.599 274.68 Tm
-(non-f) Tj
-1 0 0 1 520.319 274.68 Tm
-(aulty) Tj
-1 0 0 1 315 262.8 Tm
-(replica) Tj
-ET
-q
-4.1 0 0 -8.9 347.6 269.6 cm
-/R558 Do
-Q
-BT
-1 0 0 1 358.08 262.8 Tm
-(\(including) Tj
-ET
-q
-2.6 0 0 -6.9 405 269.6 cm
-/R448 Do
-Q
-endstream
-endobj
-561 0 obj
-530
-endobj
-562 0 obj
-<< /Type /XObject /Name /R562 /Subtype /Image /Length 563 0 R
-/ImageMask true /Width 66 /Height 27 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 66 /BlackIs1 true >>]
->>
-stream
-/e%CP4)j*Wq&BoPm6CdS5Q~>
-endstream
-endobj
-563 0 obj
-25
-endobj
-564 0 obj
-<< /Length 565 0 R >>
-stream
-q
-6.6 0 0 -2.7 415.8 266.7 cm
-/R562 Do
-Q
-q
-4.1 0 0 -8.9 430.1 269.6 cm
-/R558 Do
-Q
-BT
-1 0 0 1 435 262.8 Tm
-(\)) Tj
-1 0 0 1 444 262.8 Tm
-(and) Tj
-1 0 0 1 464.04 262.8 Tm
-(an) Tj
-1 0 0 1 473.399 262.8 Tm
-(y) Tj
-ET
-q
-8.1 0 0 -4.6 484.2 267.3 cm
-/R504 Do
-Q
-q
-1.7 0 0 -3.7 493 270.3 cm
-/R554 Do
-Q
-BT
-1 0 0 1 501.12 262.8 Tm
-(such) Tj
-1 0 0 1 525 262.8 Tm
-(that) Tj
-ET
-endstream
-endobj
-565 0 obj
-362
-endobj
-566 0 obj
-<< /Type /XObject /Name /R566 /Subtype /Image /Length 567 0 R
-/ImageMask true /Width 75 /Height 69 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 75 /BlackIs1 true >>]
->>
-stream
--D@i/="t3q:)'T:EY'Q7@JfCQK73IN
-DqmDb@DDO(rqCj@Fs$I.iOf--It,63^V:<:qnMn*^\@b0s+Zm:ht=@d?EiAlYY3Kq%(IruTE5*9~>
-endstream
-endobj
-567 0 obj
-109
-endobj
-568 0 obj
-<< /Length 569 0 R >>
-stream
-q
-7.5 0 0 -6.9 315.3 257.7 cm
-/R566 Do
-Q
-q
-2.4 0 0 -9.9 324.4 258.3 cm
-/R546 Do
-Q
-q
-8.1 0 0 -4.6 327.6 255.3 cm
-/R504 Do
-Q
-q
-1.7 0 0 -3.7 336.4 258.3 cm
-/R554 Do
-Q
-q
-2.4 0 0 -9.9 339.4 258.3 cm
-/R550 Do
-Q
-endstream
-endobj
-569 0 obj
-205
-endobj
-570 0 obj
-<< /Type /XObject /Name /R570 /Subtype /Image /Length 571 0 R
-/ImageMask true /Width 51 /Height 94 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 51 /BlackIs1 true >>]
->>
-stream
-,Ll]7
-h=lC.rSQ7WGMW0U^L?$SqnImbmtZC2mf"1&^)d0e]D-=4pilH2n):tW%fYAApCHZh48XMGLM?f3!W~>
-endstream
-endobj
-571 0 obj
-86
-endobj
-572 0 obj
-<< /Length 573 0 R >>
-stream
-q
-5.1 0 0 -9.4 350.4 258 cm
-/R570 Do
-Q
-q
-6.6 0 0 -2.7 349.6 254.7 cm
-/R562 Do
-Q
-q
-7.5 0 0 -6.9 363.4 257.7 cm
-/R566 Do
-Q
-q
-2.4 0 0 -9.9 372.5 258.3 cm
-/R546 Do
-Q
-q
-8.1 0 0 -4.6 375.7 255.3 cm
-/R504 Do
-Q
-q
-2.4 0 0 -9.9 384.6 258.3 cm
-/R550 Do
-Q
-BT
-1 0 0 1 388.08 250.8 Tm
-(.) Tj
-1 0 0 1 401.76 250.8 Tm
-(This) Tj
-1 0 0 1 424.44 250.8 Tm
-(implies) Tj
-1 0 0 1 458.76 250.8 Tm
-(that) Tj
-1 0 0 1 478.8 250.8 Tm
-(tw) Tj
-1 0 0 1 488.64 250.8 Tm
-(o) Tj
-1 0 0 1 498.6 250.8 Tm
-(non-f) Tj
-1 0 0 1 520.32 250.8 Tm
-(aulty) Tj
-1 0 0 1 315 238.92 Tm
-(replicas) Tj
-1 0 0 1 349.44 238.92 Tm
-(agree) Tj
-1 0 0 1 374.4 238.92 Tm
-(on) Tj
-1 0 0 1 387.84 238.92 Tm
-(the) Tj
-1 0 0 1 403.44 238.92 Tm
-(sequence) Tj
-1 0 0 1 443.4 238.92 Tm
-(number) Tj
-1 0 0 1 477.239 238.92 Tm
-(of) Tj
-1 0 0 1 488.999 238.92 Tm
-(requests) Tj
-1 0 0 1 524.999 238.92 Tm
-(that) Tj
-1 0 0 1 315 226.92 Tm
-(commit) Tj
-1 0 0 1 347.88 226.92 Tm
-(locally) Tj
-1 0 0 1 377.52 226.92 Tm
-(in) Tj
-1 0 0 1 387.84 226.92 Tm
-(the) Tj
-1 0 0 1 402.48 226.92 Tm
-(same) Tj
-1 0 0 1 425.4 226.92 Tm
-(vie) Tj
-1 0 0 1 437.4 226.92 Tm
-(w) Tj
-1 0 0 1 447 226.92 Tm
-(at) Tj
-1 0 0 1 456.719 226.92 Tm
-(the) Tj
-1 0 0 1 471.359 226.92 Tm
-(tw) Tj
-1 0 0 1 481.199 226.92 Tm
-(o) Tj
-1 0 0 1 488.759 226.92 Tm
-(replicas.) Tj
-1 0 0 1 324.96 214.68 Tm
-(The) Tj
-1 0 0 1 346.32 214.68 Tm
-(vie) Tj
-1 0 0 1 358.32 214.68 Tm
-(w-change) Tj
-1 0 0 1 402.84 214.68 Tm
-(protocol) Tj
-1 0 0 1 441.96 214.68 Tm
-(ensures) Tj
-1 0 0 1 477.72 214.68 Tm
-(that) Tj
-1 0 0 1 498.6 214.68 Tm
-(non-f) Tj
-1 0 0 1 520.319 214.68 Tm
-(aulty) Tj
-1 0 0 1 315 202.68 Tm
-(replicas) Tj
-1 0 0 1 349.32 202.68 Tm
-(also) Tj
-1 0 0 1 368.64 202.68 Tm
-(agree) Tj
-1 0 0 1 393.48 202.68 Tm
-(on) Tj
-1 0 0 1 406.8 202.68 Tm
-(the) Tj
-1 0 0 1 422.16 202.68 Tm
-(sequence) Tj
-1 0 0 1 462 202.68 Tm
-(number) Tj
-1 0 0 1 495.719 202.68 Tm
-(of) Tj
-1 0 0 1 507.359 202.68 Tm
-(requests) Tj
-1 0 0 1 315 190.8 Tm
-(that) Tj
-1 0 0 1 331.68 190.8 Tm
-(commit) Tj
-1 0 0 1 363.96 190.8 Tm
-(locally) Tj
-1 0 0 1 392.88 190.8 Tm
-(in) Tj
-1 0 0 1 402.36 190.8 Tm
-(dif) Tj
-1 0 0 1 413.28 190.8 Tm
-(fer) Tj
-1 0 0 1 424.32 190.8 Tm
-(ent) Tj
-1 0 0 1 438.119 190.8 Tm
-(vie) Tj
-1 0 0 1 450.119 190.8 Tm
-(w) Tj
-1 0 0 1 457.199 190.8 Tm
-(s) Tj
-1 0 0 1 462.719 190.8 Tm
-(at) Tj
-1 0 0 1 471.599 190.8 Tm
-(d) Tj
-1 0 0 1 476.519 190.8 Tm
-(if) Tj
-1 0 0 1 482.399 190.8 Tm
-(fe) Tj
-1 0 0 1 490.079 190.8 Tm
-(ren) Tj
-1 0 0 1 502.799 190.8 Tm
-(t) Tj
-1 0 0 1 507.239 190.8 Tm
-(rep) Tj
-1 0 0 1 519.959 190.8 Tm
-(licas.) Tj
-1 0 0 1 315 178.8 Tm
-(A) Tj
-1 0 0 1 324.48 178.8 Tm
-(request) Tj
-ET
-q
-8.1 0 0 -4.6 355.9 183.3 cm
-/R504 Do
-Q
-BT
-1 0 0 1 366.72 178.8 Tm
-(commits) Tj
-1 0 0 1 403.32 178.8 Tm
-(locally) Tj
-1 0 0 1 432.84 178.8 Tm
-(at) Tj
-1 0 0 1 442.32 178.8 Tm
-(a) Tj
-1 0 0 1 449.16 178.8 Tm
-(non-f) Tj
-1 0 0 1 470.879 178.8 Tm
-(aulty) Tj
-1 0 0 1 492.839 178.8 Tm
-(replica) Tj
-1 0 0 1 522.239 178.8 Tm
-(with) Tj
-1 0 0 1 315 166.92 Tm
-(sequence) Tj
-1 0 0 1 353.76 166.92 Tm
-(number) Tj
-ET
-q
-5.4 0 0 -4.6 386.7 171.4 cm
-/R468 Do
-Q
-BT
-1 0 0 1 394.8 166.92 Tm
-(in) Tj
-1 0 0 1 404.76 166.92 Tm
-(vie) Tj
-1 0 0 1 416.76 166.92 Tm
-(w) Tj
-ET
-q
-4.4 0 0 -4.6 426.3 171.4 cm
-/R452 Do
-Q
-BT
-1 0 0 1 433.68 166.92 Tm
-(only) Tj
-1 0 0 1 453.6 166.92 Tm
-(if) Tj
-/R524 10 Tf
-1 0 0 1 461.999 166.92 Tm
-(committed) Tj
-ET
-q
-2.4 0 0 -9.9 504.5 174.4 cm
-/R546 Do
-Q
-q
-8.1 0 0 -4.6 507.7 171.4 cm
-/R504 Do
-Q
-q
-1.3 0 0 -3 517 168 cm
-/R464 Do
-Q
-q
-4.4 0 0 -4.6 520.9 171.4 cm
-/R452 Do
-Q
-q
-1.3 0 0 -3 526.6 168 cm
-/R464 Do
-Q
-q
-5.4 0 0 -4.6 530.5 171.4 cm
-/R468 Do
-Q
-q
-2.4 0 0 -9.9 536.7 174.4 cm
-/R550 Do
-Q
-BT
-/R445 10 Tf
-1 0 0 1 315 154.92 Tm
-(is) Tj
-1 0 0 1 323.28 154.92 Tm
-(true.) Tj
-1 0 0 1 344.52 154.92 Tm
-(This) Tj
-1 0 0 1 363.96 154.92 Tm
-(means) Tj
-1 0 0 1 391.2 154.92 Tm
-(that) Tj
-1 0 0 1 407.88 154.92 Tm
-(there) Tj
-1 0 0 1 429.6 154.92 Tm
-(is) Tj
-1 0 0 1 437.879 154.92 Tm
-(a) Tj
-1 0 0 1 443.999 154.92 Tm
-(set) Tj
-ET
-endstream
-endobj
-573 0 obj
-3843
-endobj
-574 0 obj
-<< /Type /XObject /Name /R574 /Subtype /Image /Length 575 0 R
-/ImageMask true /Width 72 /Height 72 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 72 /BlackIs1 true >>]
->>
-stream
-,bfN+EbZ%+T220fDo-cZ,s?pcnFun\pj__WTt^P^p]'u;n,MhU
-gAgoM\7one3%l@pc*52@)Lt#%cP0LqgZ5-hr4=Er'14o0CHFELJ)8VIoB/o@='0"=9*jW~>
-endstream
-endobj
-575 0 obj
-129
-endobj
-576 0 obj
-<< /Length 577 0 R >>
-stream
-q
-7.2 0 0 -7.2 457 161.8 cm
-/R574 Do
-Q
-BT
-/R445 7 Tf
-1 0 0 1 464.28 153.48 Tm
-(1) Tj
-/R445 10 Tf
-1 0 0 1 469.2 154.92 Tm
-(containing) Tj
-1 0 0 1 513.24 154.92 Tm
-(at) Tj
-1 0 0 1 522.12 154.92 Tm
-(least) Tj
-ET
-q
-5 0 0 -9.2 315.4 150.1 cm
-/R496 Do
-Q
-q
-6.6 0 0 -6.5 324 148.8 cm
-/R456 Do
-Q
-BT
-1 0 0 1 333.84 143.04 Tm
-(1) Tj
-1 0 0 1 341.88 143.04 Tm
-(non-f) Tj
-1 0 0 1 363.6 143.04 Tm
-(aulty) Tj
-1 0 0 1 386.4 143.04 Tm
-(replicas) Tj
-1 0 0 1 420.48 143.04 Tm
-(such) Tj
-1 0 0 1 441.84 143.04 Tm
-(that) Tj
-/R524 10 Tf
-1 0 0 1 459.839 143.04 Tm
-(pr) Tj
-1 0 0 1 468.359 143.04 Tm
-(epar) Tj
-1 0 0 1 486.359 143.04 Tm
-(ed) Tj
-ET
-q
-2.4 0 0 -9.9 496.7 150.5 cm
-/R546 Do
-Q
-q
-8.1 0 0 -4.6 499.9 147.5 cm
-/R504 Do
-Q
-q
-1.3 0 0 -3 509.2 144.1 cm
-/R464 Do
-Q
-q
-4.4 0 0 -4.6 513.1 147.5 cm
-/R452 Do
-Q
-q
-1.3 0 0 -3 518.8 144.1 cm
-/R464 Do
-Q
-q
-5.4 0 0 -4.6 522.7 147.5 cm
-/R468 Do
-Q
-q
-1.3 0 0 -3 529.3 144.1 cm
-/R464 Do
-Q
-q
-2.6 0 0 -6.9 533.1 149.8 cm
-/R448 Do
-Q
-q
-2.4 0 0 -9.9 536.8 150.5 cm
-/R550 Do
-Q
-BT
-/R445 10 Tf
-1 0 0 1 315 131.04 Tm
-(is) Tj
-1 0 0 1 324.12 131.04 Tm
-(true) Tj
-1 0 0 1 342.12 131.04 Tm
-(for) Tj
-1 0 0 1 356.28 131.04 Tm
-(e) Tj
-1 0 0 1 360.48 131.04 Tm
-(v) Tj
-1 0 0 1 365.4 131.04 Tm
-(ery) Tj
-1 0 0 1 380.4 131.04 Tm
-(replica) Tj
-ET
-q
-2.6 0 0 -6.9 410.2 137.8 cm
-/R448 Do
-Q
-BT
-1 0 0 1 415.919 131.04 Tm
-(in) Tj
-1 0 0 1 426.239 131.04 Tm
-(the) Tj
-1 0 0 1 440.879 131.04 Tm
-(set.) Tj
-1 0 0 1 324.96 118.8 Tm
-(Non-f) Tj
-1 0 0 1 348.84 118.8 Tm
-(aulty) Tj
-1 0 0 1 372.12 118.8 Tm
-(replicas) Tj
-1 0 0 1 406.68 118.8 Tm
-(will) Tj
-1 0 0 1 425.64 118.8 Tm
-(not) Tj
-1 0 0 1 441.96 118.8 Tm
-(accept) Tj
-1 0 0 1 470.999 118.8 Tm
-(a) Tj
-1 0 0 1 478.919 118.8 Tm
-(pre-prepare) Tj
-1 0 0 1 528.359 118.8 Tm
-(for) Tj
-1 0 0 1 315 106.8 Tm
-(vie) Tj
-1 0 0 1 327 106.8 Tm
-(w) Tj
-ET
-q
-4.4 0 0 -4.6 336 111.3 cm
-/R452 Do
-Q
-q
-1.7 0 0 -3.7 341.2 114.3 cm
-/R554 Do
-Q
-endstream
-endobj
-577 0 obj
-1843
-endobj
-578 0 obj
-<< /Type /XObject /Name /R578 /Subtype /Image /Length 579 0 R
-/ImageMask true /Width 61 /Height 61 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 61 /BlackIs1 true >>]
->>
-stream
-,Ld57i8DMjL(5&>G[TII_hJX
-endstream
-endobj
-579 0 obj
-114
-endobj
-580 0 obj
-<< /Length 581 0 R >>
-stream
-q
-6.1 0 0 -6.1 347.4 112.4 cm
-/R578 Do
-Q
-q
-4.4 0 0 -4.6 357.3 111.3 cm
-/R452 Do
-Q
-BT
-1 0 0 1 363.96 106.8 Tm
-(without) Tj
-1 0 0 1 396 106.8 Tm
-(ha) Tj
-1 0 0 1 405.24 106.8 Tm
-(ving) Tj
-1 0 0 1 424.68 106.8 Tm
-(recei) Tj
-1 0 0 1 443.88 106.8 Tm
-(v) Tj
-1 0 0 1 448.8 106.8 Tm
-(ed) Tj
-1 0 0 1 459.72 106.8 Tm
-(a) Tj
-1 0 0 1 465.84 106.8 Tm
-(ne) Tj
-1 0 0 1 475.079 106.8 Tm
-(w-vie) Tj
-1 0 0 1 497.639 106.8 Tm
-(w) Tj
-1 0 0 1 506.279 106.8 Tm
-(message) Tj
-1 0 0 1 315 94.92 Tm
-(for) Tj
-ET
-q
-4.4 0 0 -4.6 328.6 99.4 cm
-/R452 Do
-Q
-q
-1.7 0 0 -3.7 333.9 102.4 cm
-/R554 Do
-Q
-BT
-1 0 0 1 338.16 94.92 Tm
-(\(since) Tj
-1 0 0 1 363.72 94.92 Tm
-(only) Tj
-1 0 0 1 383.16 94.92 Tm
-(at) Tj
-1 0 0 1 392.16 94.92 Tm
-(that) Tj
-1 0 0 1 408.84 94.92 Tm
-(point) Tj
-1 0 0 1 431.16 94.92 Tm
-(do) Tj
-1 0 0 1 442.92 94.92 Tm
-(the) Tj
-1 0 0 1 455.04 94.92 Tm
-(y) Tj
-1 0 0 1 461.639 94.92 Tm
-(enter) Tj
-1 0 0 1 483.359 94.92 Tm
-(the) Tj
-1 0 0 1 497.279 94.92 Tm
-(vie) Tj
-1 0 0 1 509.279 94.92 Tm
-(w\).) Tj
-1 0 0 1 525.599 94.92 Tm
-(But) Tj
-1 0 0 1 315 82.92 Tm
-(an) Tj
-1 0 0 1 324.36 82.92 Tm
-(y) Tj
-1 0 0 1 332.04 82.92 Tm
-(correct) Tj
-1 0 0 1 362.4 82.92 Tm
-(ne) Tj
-1 0 0 1 371.64 82.92 Tm
-(w-vie) Tj
-1 0 0 1 394.2 82.92 Tm
-(w) Tj
-1 0 0 1 404.04 82.92 Tm
-(message) Tj
-1 0 0 1 440.52 82.92 Tm
-(for) Tj
-1 0 0 1 454.92 82.92 Tm
-(vie) Tj
-1 0 0 1 466.92 82.92 Tm
-(w) Tj
-ET
-q
-4.4 0 0 -4.6 477 87.4 cm
-/R452 Do
-Q
-q
-1.7 0 0 -3.7 482.2 90.4 cm
-/R554 Do
-Q
-q
-6.1 0 0 -6.1 488.7 88.5 cm
-/R578 Do
-Q
-q
-4.4 0 0 -4.6 499 87.4 cm
-/R452 Do
-Q
-BT
-1 0 0 1 506.76 82.92 Tm
-(contains) Tj
-1 0 0 1 315 71.04 Tm
-(correct) Tj
-1 0 0 1 345.84 71.04 Tm
-(vie) Tj
-1 0 0 1 357.84 71.04 Tm
-(w-change) Tj
-1 0 0 1 399.6 71.04 Tm
-(messages) Tj
-1 0 0 1 440.4 71.04 Tm
-(from) Tj
-1 0 0 1 462.96 71.04 Tm
-(e) Tj
-1 0 0 1 467.16 71.04 Tm
-(v) Tj
-1 0 0 1 472.08 71.04 Tm
-(ery) Tj
-1 0 0 1 487.8 71.04 Tm
-(replica) Tj
-ET
-q
-2.6 0 0 -6.9 518.2 77.8 cm
-/R448 Do
-Q
-BT
-1 0 0 1 524.639 71.04 Tm
-(in) Tj
-1 0 0 1 535.559 71.04 Tm
-(a) Tj
-1 0 0 1 303.48 35.16 Tm
-(6) Tj
-ET
-Q
-endstream
-endobj
-581 0 obj
-1989
-endobj
-582 0 obj
-<<
-/Type /Page
-/MediaBox [0 0 612 792]
-/Parent 2 0 R
-/Resources << /ProcSet [/PDF /ImageB /Text]
-/Font <<
-/R543 543 0 R
-/R524 524 0 R
-/R445 445 0 R
->>
-/XObject <<
-/R448 448 0 R
-/R452 452 0 R
-/R578 578 0 R
-/R554 554 0 R
-/R550 550 0 R
-/R464 464 0 R
-/R468 468 0 R
-/R504 504 0 R
-/R546 546 0 R
-/R456 456 0 R
-/R496 496 0 R
-/R574 574 0 R
-/R566 566 0 R
-/R562 562 0 R
-/R570 570 0 R
-/R558 558 0 R
-/R492 492 0 R
-/R512 512 0 R
-/R516 516 0 R
-/R539 539 0 R
-/R535 535 0 R
-/R531 531 0 R
-/R527 527 0 R
-/R520 520 0 R
-/R484 484 0 R
-/R480 480 0 R
-/R460 460 0 R
-/R476 476 0 R
-/R508 508 0 R
-/R500 500 0 R
-/R472 472 0 R
-/R488 488 0 R
->>
->>
-/Contents [
-446 0 R
-450 0 R
-454 0 R
-458 0 R
-462 0 R
-466 0 R
-470 0 R
-474 0 R
-478 0 R
-482 0 R
-486 0 R
-490 0 R
-494 0 R
-498 0 R
-502 0 R
-506 0 R
-510 0 R
-514 0 R
-518 0 R
-522 0 R
-525 0 R
-529 0 R
-533 0 R
-537 0 R
-541 0 R
-544 0 R
-548 0 R
-552 0 R
-556 0 R
-560 0 R
-564 0 R
-568 0 R
-572 0 R
-576 0 R
-580 0 R
-]
->>
-endobj
-583 0 obj
-<< /Type /Font /Name /R583 /Subtype /Type1 /BaseFont /Times-Roman >>
-endobj
-584 0 obj
-<< /Length 585 0 R >>
-stream
-q
-BT
-/R583 10 Tf
-1 0 0 1 72 709.08 Tm
-(set) Tj
-ET
-Q
-q
-W
-0 0 612 792 re
-n
-endstream
-endobj
-585 0 obj
-73
-endobj
-586 0 obj
-<< /Type /XObject /Name /R586 /Subtype /Image /Length 587 0 R
-/ImageMask true /Width 72 /Height 72 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 72 /BlackIs1 true >>]
->>
-stream
-,bfN+EbZ%+T220fDo-cZ,s?pcnFun\pj__WTt^P^p]'u;n,MhU
-gAgoM\7one3%l@pc*52@)Lt#%cP0LqgZ5-hr4=Er'14o0CHFELJ)8VIoB/o@='0"=9*jW~>
-endstream
-endobj
-587 0 obj
-129
-endobj
-588 0 obj
-<< /Length 589 0 R >>
-stream
-q
-7.2 0 0 -7.2 85.5 716 cm
-/R586 Do
-Q
-BT
-/R583 7 Tf
-1 0 0 1 92.76 707.64 Tm
-(2) Tj
-/R583 10 Tf
-1 0 0 1 98.76 709.08 Tm
-(of) Tj
-1 0 0 1 109.2 709.08 Tm
-(2) Tj
-ET
-endstream
-endobj
-589 0 obj
-161
-endobj
-590 0 obj
-<< /Type /XObject /Name /R590 /Subtype /Image /Length 591 0 R
-/ImageMask true /Width 50 /Height 92 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 50 /BlackIs1 true >>]
->>
-stream
-5$eL7-b:K3p0<%?
-h1u#R]2'Mug].5is7$!eqtL-hqu?EZs5/V3iQXZVs7/ihqu?EZs4QRbJe-ans*o2/4DdB_@6aqq5Q~>
-endstream
-endobj
-591 0 obj
-96
-endobj
-592 0 obj
-<< /Length 593 0 R >>
-stream
-q
-5 0 0 -9.2 114.6 716.2 cm
-/R590 Do
-Q
-endstream
-endobj
-593 0 obj
-39
-endobj
-594 0 obj
-<< /Type /XObject /Name /R594 /Subtype /Image /Length 595 0 R
-/ImageMask true /Width 66 /Height 65 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 66 /BlackIs1 true >>]
->>
-stream
-,BZ6Ns8W-!s8W-!s-Eq9Iaj?!s8W-!s8W-!s8Uf'#QTA~>
-endstream
-endobj
-595 0 obj
-47
-endobj
-596 0 obj
-<< /Length 597 0 R >>
-stream
-q
-6.6 0 0 -6.5 121.9 714.9 cm
-/R594 Do
-Q
-BT
-1 0 0 1 130.56 709.08 Tm
-(1) Tj
-1 0 0 1 137.64 709.08 Tm
-(replicas.) Tj
-1 0 0 1 174.6 709.08 Tm
-(Since) Tj
-1 0 0 1 198.84 709.08 Tm
-(there) Tj
-1 0 0 1 220.8 709.08 Tm
-(are) Tj
-1 0 0 1 235.08 709.08 Tm
-(3) Tj
-ET
-q
-5 0 0 -9.2 240.5 716.2 cm
-/R590 Do
-Q
-q
-6.6 0 0 -6.5 247.8 714.9 cm
-/R594 Do
-Q
-BT
-1 0 0 1 256.439 709.08 Tm
-(1) Tj
-1 0 0 1 263.519 709.08 Tm
-(replicas,) Tj
-ET
-q
-7.2 0 0 -7.2 72.3 704 cm
-/R586 Do
-Q
-BT
-/R583 7 Tf
-1 0 0 1 79.56 695.64 Tm
-(1) Tj
-/R583 10 Tf
-1 0 0 1 86.28 697.08 Tm
-(and) Tj
-ET
-q
-7.2 0 0 -7.2 103.6 704 cm
-/R586 Do
-Q
-BT
-/R583 7 Tf
-1 0 0 1 110.88 695.64 Tm
-(2) Tj
-/R583 10 Tf
-1 0 0 1 117.6 697.08 Tm
-(must) Tj
-1 0 0 1 139.68 697.08 Tm
-(intersect) Tj
-1 0 0 1 176.16 697.08 Tm
-(in) Tj
-1 0 0 1 186.72 697.08 Tm
-(at) Tj
-1 0 0 1 196.56 697.08 Tm
-(least) Tj
-1 0 0 1 217.56 697.08 Tm
-(one) Tj
-1 0 0 1 234.6 697.08 Tm
-(replica) Tj
-ET
-endstream
-endobj
-597 0 obj
-893
-endobj
-598 0 obj
-<< /Type /XObject /Name /R598 /Subtype /Image /Length 599 0 R
-/ImageMask true /Width 47 /Height 71 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 47 /BlackIs1 true >>]
->>
-stream
-0ZYuc@0_O>l/"oP624[@s1A
-endstream
-endobj
-599 0 obj
-119
-endobj
-600 0 obj
-<< /Length 601 0 R >>
-stream
-q
-4.7 0 0 -7.1 264.9 704.1 cm
-/R598 Do
-Q
-BT
-1 0 0 1 272.639 697.08 Tm
-(that) Tj
-1 0 0 1 290.399 697.08 Tm
-(is) Tj
-1 0 0 1 72 685.2 Tm
-(not) Tj
-1 0 0 1 87.36 685.2 Tm
-(f) Tj
-1 0 0 1 90.5999 685.2 Tm
-(aulty) Tj
-1 0 0 1 110.04 685.2 Tm
-(.) Tj
-ET
-q
-4.7 0 0 -7.1 116.7 692.2 cm
-/R598 Do
-Q
-BT
-1 0 0 1 121.8 685.2 Tm
-(') Tj
-1 0 0 1 124.56 685.2 Tm
-(s) Tj
-1 0 0 1 131.04 685.2 Tm
-(vie) Tj
-1 0 0 1 143.04 685.2 Tm
-(w-change) Tj
-1 0 0 1 184.2 685.2 Tm
-(message) Tj
-1 0 0 1 220.56 685.2 Tm
-(will) Tj
-1 0 0 1 238.68 685.2 Tm
-(ensure) Tj
-1 0 0 1 267.239 685.2 Tm
-(that) Tj
-1 0 0 1 284.879 685.2 Tm
-(the) Tj
-1 0 0 1 72 673.2 Tm
-(f) Tj
-1 0 0 1 75.24 673.2 Tm
-(act) Tj
-1 0 0 1 89.6399 673.2 Tm
-(that) Tj
-ET
-endstream
-endobj
-601 0 obj
-691
-endobj
-602 0 obj
-<< /Type /XObject /Name /R602 /Subtype /Image /Length 603 0 R
-/ImageMask true /Width 81 /Height 46 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 81 /BlackIs1 true >>]
->>
-stream
-4N`CV%M3$8612U>:Ag"NnFZb
-endstream
-endobj
-603 0 obj
-139
-endobj
-604 0 obj
-<< /Length 605 0 R >>
-stream
-q
-8.1 0 0 -4.6 107.5 677.7 cm
-/R602 Do
-Q
-BT
-1 0 0 1 118.8 673.2 Tm
-(prepared) Tj
-1 0 0 1 156.48 673.2 Tm
-(in) Tj
-1 0 0 1 166.92 673.2 Tm
-(a) Tj
-1 0 0 1 174.12 673.2 Tm
-(pre) Tj
-1 0 0 1 186.72 673.2 Tm
-(vious) Tj
-1 0 0 1 210.959 673.2 Tm
-(vie) Tj
-1 0 0 1 222.959 673.2 Tm
-(w) Tj
-1 0 0 1 232.799 673.2 Tm
-(is) Tj
-1 0 0 1 242.279 673.2 Tm
-(propagated) Tj
-1 0 0 1 289.199 673.2 Tm
-(to) Tj
-1 0 0 1 72 661.32 Tm
-(subsequent) Tj
-1 0 0 1 118.32 661.32 Tm
-(vie) Tj
-1 0 0 1 130.32 661.32 Tm
-(ws,) Tj
-1 0 0 1 145.92 661.32 Tm
-(unless) Tj
-1 0 0 1 172.92 661.32 Tm
-(the) Tj
-1 0 0 1 187.2 661.32 Tm
-(ne) Tj
-1 0 0 1 196.44 661.32 Tm
-(w-vie) Tj
-1 0 0 1 219 661.32 Tm
-(w) Tj
-1 0 0 1 228 661.32 Tm
-(message) Tj
-1 0 0 1 263.76 661.32 Tm
-(contains) Tj
-1 0 0 1 72 649.32 Tm
-(a) Tj
-1 0 0 1 79.56 649.32 Tm
-(vie) Tj
-1 0 0 1 91.5599 649.32 Tm
-(w-change) Tj
-1 0 0 1 133.32 649.32 Tm
-(message) Tj
-1 0 0 1 170.16 649.32 Tm
-(with) Tj
-1 0 0 1 191.04 649.32 Tm
-(a) Tj
-1 0 0 1 198.6 649.32 Tm
-(stable) Tj
-1 0 0 1 224.88 649.32 Tm
-(checkpoint) Tj
-1 0 0 1 271.799 649.32 Tm
-(with) Tj
-1 0 0 1 292.559 649.32 Tm
-(a) Tj
-1 0 0 1 72 637.44 Tm
-(sequence) Tj
-1 0 0 1 112.44 637.44 Tm
-(number) Tj
-1 0 0 1 146.76 637.44 Tm
-(higher) Tj
-1 0 0 1 176.04 637.44 Tm
-(than) Tj
-ET
-endstream
-endobj
-605 0 obj
-1231
-endobj
-606 0 obj
-<< /Type /XObject /Name /R606 /Subtype /Image /Length 607 0 R
-/ImageMask true /Width 54 /Height 46 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 54 /BlackIs1 true >>]
->>
-stream
-4N]t,$m>7rl/"o@d!re,
-pYTohhg]lis4_o!aocV_^Yur>rVsXfR^`8
-endstream
-endobj
-607 0 obj
-102
-endobj
-608 0 obj
-<< /Length 609 0 R >>
-stream
-q
-5.4 0 0 -4.6 197.2 641.9 cm
-/R606 Do
-Q
-BT
-1 0 0 1 203.04 637.44 Tm
-(.) Tj
-1 0 0 1 213.36 637.44 Tm
-(In) Tj
-1 0 0 1 225.48 637.44 Tm
-(the) Tj
-1 0 0 1 241.559 637.44 Tm
-(\256rst) Tj
-1 0 0 1 260.999 637.44 Tm
-(case,) Tj
-1 0 0 1 284.879 637.44 Tm
-(the) Tj
-1 0 0 1 72 625.44 Tm
-(algorithm) Tj
-1 0 0 1 112.92 625.44 Tm
-(redoes) Tj
-1 0 0 1 141.12 625.44 Tm
-(the) Tj
-1 0 0 1 155.52 625.44 Tm
-(three) Tj
-1 0 0 1 177.6 625.44 Tm
-(phases) Tj
-1 0 0 1 206.28 625.44 Tm
-(of) Tj
-1 0 0 1 216.84 625.44 Tm
-(the) Tj
-1 0 0 1 231.12 625.44 Tm
-(atomic) Tj
-1 0 0 1 260.519 625.44 Tm
-(multicast) Tj
-1 0 0 1 72 613.44 Tm
-(protocol) Tj
-1 0 0 1 107.4 613.44 Tm
-(for) Tj
-ET
-q
-8.1 0 0 -4.6 121.3 617.9 cm
-/R602 Do
-Q
-BT
-1 0 0 1 132 613.44 Tm
-(with) Tj
-1 0 0 1 151.92 613.44 Tm
-(the) Tj
-1 0 0 1 166.2 613.44 Tm
-(same) Tj
-1 0 0 1 188.88 613.44 Tm
-(sequence) Tj
-1 0 0 1 227.52 613.44 Tm
-(number) Tj
-ET
-q
-5.4 0 0 -4.6 260.4 617.9 cm
-/R606 Do
-Q
-BT
-1 0 0 1 268.319 613.44 Tm
-(and) Tj
-1 0 0 1 284.879 613.44 Tm
-(the) Tj
-1 0 0 1 72 601.56 Tm
-(ne) Tj
-1 0 0 1 81.24 601.56 Tm
-(w) Tj
-1 0 0 1 91.08 601.56 Tm
-(vie) Tj
-1 0 0 1 103.08 601.56 Tm
-(w) Tj
-1 0 0 1 112.92 601.56 Tm
-(number) Tj
-1 0 0 1 143.04 601.56 Tm
-(.) Tj
-1 0 0 1 149.76 601.56 Tm
-(This) Tj
-1 0 0 1 170.16 601.56 Tm
-(is) Tj
-1 0 0 1 179.52 601.56 Tm
-(important) Tj
-1 0 0 1 221.04 601.56 Tm
-(because) Tj
-1 0 0 1 255.359 601.56 Tm
-(it) Tj
-1 0 0 1 263.639 601.56 Tm
-(pre) Tj
-1 0 0 1 276.239 601.56 Tm
-(v) Tj
-1 0 0 1 281.159 601.56 Tm
-(ents) Tj
-1 0 0 1 72 589.56 Tm
-(an) Tj
-1 0 0 1 81.36 589.56 Tm
-(y) Tj
-1 0 0 1 91.1999 589.56 Tm
-(dif) Tj
-1 0 0 1 102.12 589.56 Tm
-(ferent) Tj
-1 0 0 1 130.2 589.56 Tm
-(request) Tj
-1 0 0 1 163.92 589.56 Tm
-(that) Tj
-1 0 0 1 183.72 589.56 Tm
-(w) Tj
-1 0 0 1 190.8 589.56 Tm
-(as) Tj
-1 0 0 1 204.12 589.56 Tm
-(assigned) Tj
-1 0 0 1 243.359 589.56 Tm
-(the) Tj
-1 0 0 1 260.519 589.56 Tm
-(sequence) Tj
-1 0 0 1 72 577.68 Tm
-(number) Tj
-ET
-q
-5.4 0 0 -4.6 105.8 582.2 cm
-/R606 Do
-Q
-BT
-1 0 0 1 114.6 577.68 Tm
-(in) Tj
-1 0 0 1 125.52 577.68 Tm
-(a) Tj
-1 0 0 1 133.08 577.68 Tm
-(pre) Tj
-1 0 0 1 145.68 577.68 Tm
-(vious) Tj
-1 0 0 1 170.28 577.68 Tm
-(vie) Tj
-1 0 0 1 182.28 577.68 Tm
-(w) Tj
-1 0 0 1 192.48 577.68 Tm
-(from) Tj
-1 0 0 1 214.92 577.68 Tm
-(e) Tj
-1 0 0 1 219.12 577.68 Tm
-(v) Tj
-1 0 0 1 224.04 577.68 Tm
-(er) Tj
-1 0 0 1 234.839 577.68 Tm
-(committing.) Tj
-1 0 0 1 288.719 577.68 Tm
-(In) Tj
-1 0 0 1 72 565.68 Tm
-(the) Tj
-1 0 0 1 86.0399 565.68 Tm
-(second) Tj
-1 0 0 1 115.56 565.68 Tm
-(case) Tj
-1 0 0 1 134.52 565.68 Tm
-(no) Tj
-1 0 0 1 146.4 565.68 Tm
-(replica) Tj
-1 0 0 1 175.32 565.68 Tm
-(in) Tj
-1 0 0 1 184.92 565.68 Tm
-(the) Tj
-1 0 0 1 198.959 565.68 Tm
-(ne) Tj
-1 0 0 1 208.199 565.68 Tm
-(w) Tj
-1 0 0 1 217.199 565.68 Tm
-(vie) Tj
-1 0 0 1 229.199 565.68 Tm
-(w) Tj
-1 0 0 1 238.079 565.68 Tm
-(will) Tj
-1 0 0 1 255.479 565.68 Tm
-(accept) Tj
-1 0 0 1 282.719 565.68 Tm
-(an) Tj
-1 0 0 1 292.079 565.68 Tm
-(y) Tj
-1 0 0 1 72 553.8 Tm
-(message) Tj
-1 0 0 1 108.84 553.8 Tm
-(with) Tj
-1 0 0 1 129.72 553.8 Tm
-(sequence) Tj
-1 0 0 1 169.44 553.8 Tm
-(number) Tj
-1 0 0 1 203.04 553.8 Tm
-(lo) Tj
-1 0 0 1 210.6 553.8 Tm
-(wer) Tj
-1 0 0 1 228.6 553.8 Tm
-(than) Tj
-ET
-q
-5.4 0 0 -4.6 249.1 558.3 cm
-/R606 Do
-Q
-BT
-1 0 0 1 254.879 553.8 Tm
-(.) Tj
-1 0 0 1 262.919 553.8 Tm
-(In) Tj
-1 0 0 1 274.319 553.8 Tm
-(either) Tj
-1 0 0 1 72 541.8 Tm
-(case,) Tj
-1 0 0 1 94.4399 541.8 Tm
-(the) Tj
-1 0 0 1 109.44 541.8 Tm
-(replicas) Tj
-1 0 0 1 143.16 541.8 Tm
-(will) Tj
-1 0 0 1 161.4 541.8 Tm
-(agree) Tj
-1 0 0 1 185.76 541.8 Tm
-(on) Tj
-1 0 0 1 198.48 541.8 Tm
-(the) Tj
-1 0 0 1 213.48 541.8 Tm
-(request) Tj
-1 0 0 1 244.919 541.8 Tm
-(that) Tj
-1 0 0 1 262.679 541.8 Tm
-(commits) Tj
-1 0 0 1 72 529.92 Tm
-(locally) Tj
-1 0 0 1 101.64 529.92 Tm
-(with) Tj
-1 0 0 1 121.8 529.92 Tm
-(sequence) Tj
-1 0 0 1 160.8 529.92 Tm
-(number) Tj
-ET
-q
-5.4 0 0 -4.6 194 534.4 cm
-/R606 Do
-Q
-BT
-1 0 0 1 199.8 529.92 Tm
-(.) Tj
-ET
-endstream
-endobj
-609 0 obj
-3806
-endobj
-610 0 obj
-<< /Type /Font /Name /R610 /Subtype /Type1 /BaseFont /Times-Bold >>
-endobj
-611 0 obj
-<< /Length 612 0 R >>
-stream
-BT
-/R610 10 Tf
-1 0 0 1 72 500.4 Tm
-(4.5.2) Tj
-1 0 0 1 101.88 500.4 Tm
-(Li) Tj
-1 0 0 1 111.12 500.4 Tm
-(v) Tj
-1 0 0 1 116.04 500.4 Tm
-(eness) Tj
-/R583 10 Tf
-1 0 0 1 72 483.24 Tm
-(T) Tj
-1 0 0 1 77.28 483.24 Tm
-(o) Tj
-1 0 0 1 84.7199 483.24 Tm
-(pro) Tj
-1 0 0 1 98.0399 483.24 Tm
-(vide) Tj
-1 0 0 1 117.48 483.24 Tm
-(li) Tj
-1 0 0 1 122.76 483.24 Tm
-(v) Tj
-1 0 0 1 127.68 483.24 Tm
-(eness,) Tj
-1 0 0 1 154.08 483.24 Tm
-(replicas) Tj
-1 0 0 1 187.44 483.24 Tm
-(must) Tj
-1 0 0 1 209.28 483.24 Tm
-(mo) Tj
-1 0 0 1 222 483.24 Tm
-(v) Tj
-1 0 0 1 226.92 483.24 Tm
-(e) Tj
-1 0 0 1 233.519 483.24 Tm
-(to) Tj
-1 0 0 1 243.719 483.24 Tm
-(a) Tj
-1 0 0 1 250.559 483.24 Tm
-(ne) Tj
-1 0 0 1 259.799 483.24 Tm
-(w) Tj
-1 0 0 1 269.399 483.24 Tm
-(vie) Tj
-1 0 0 1 281.399 483.24 Tm
-(w) Tj
-1 0 0 1 290.879 483.24 Tm
-(if) Tj
-1 0 0 1 72 471.36 Tm
-(the) Tj
-1 0 0 1 84.1199 471.36 Tm
-(y) Tj
-1 0 0 1 91.9199 471.36 Tm
-(are) Tj
-1 0 0 1 106.92 471.36 Tm
-(unable) Tj
-1 0 0 1 136.32 471.36 Tm
-(to) Tj
-1 0 0 1 146.88 471.36 Tm
-(e) Tj
-1 0 0 1 151.2 471.36 Tm
-(x) Tj
-1 0 0 1 156.12 471.36 Tm
-(ecute) Tj
-1 0 0 1 179.88 471.36 Tm
-(a) Tj
-1 0 0 1 187.2 471.36 Tm
-(request.) Tj
-1 0 0 1 223.079 471.36 Tm
-(But) Tj
-1 0 0 1 240.359 471.36 Tm
-(it) Tj
-1 0 0 1 248.759 471.36 Tm
-(is) Tj
-1 0 0 1 258.239 471.36 Tm
-(important) Tj
-1 0 0 1 72 459.36 Tm
-(to) Tj
-1 0 0 1 83.88 459.36 Tm
-(maximize) Tj
-1 0 0 1 127.32 459.36 Tm
-(the) Tj
-1 0 0 1 143.64 459.36 Tm
-(period) Tj
-1 0 0 1 173.28 459.36 Tm
-(of) Tj
-1 0 0 1 185.76 459.36 Tm
-(time) Tj
-1 0 0 1 207.6 459.36 Tm
-(when) Tj
-1 0 0 1 233.28 459.36 Tm
-(at) Tj
-1 0 0 1 244.679 459.36 Tm
-(least) Tj
-1 0 0 1 267.119 459.36 Tm
-(2) Tj
-ET
-q
-5 0 0 -9.2 272.6 466.5 cm
-/R590 Do
-Q
-q
-6.6 0 0 -6.5 281.7 465.2 cm
-/R594 Do
-Q
-BT
-1 0 0 1 291.959 459.36 Tm
-(1) Tj
-1 0 0 1 72 447.48 Tm
-(non-f) Tj
-1 0 0 1 93.7199 447.48 Tm
-(aulty) Tj
-1 0 0 1 116.76 447.48 Tm
-(replicas) Tj
-1 0 0 1 151.2 447.48 Tm
-(are) Tj
-1 0 0 1 166.8 447.48 Tm
-(in) Tj
-1 0 0 1 177.96 447.48 Tm
-(the) Tj
-1 0 0 1 193.56 447.48 Tm
-(same) Tj
-1 0 0 1 217.44 447.48 Tm
-(vie) Tj
-1 0 0 1 229.439 447.48 Tm
-(w) Tj
-1 0 0 1 236.039 447.48 Tm
-(,) Tj
-1 0 0 1 242.039 447.48 Tm
-(and) Tj
-1 0 0 1 259.799 447.48 Tm
-(to) Tj
-1 0 0 1 270.959 447.48 Tm
-(ensure) Tj
-1 0 0 1 72 435.48 Tm
-(that) Tj
-1 0 0 1 88.6799 435.48 Tm
-(this) Tj
-1 0 0 1 104.88 435.48 Tm
-(period) Tj
-1 0 0 1 132.12 435.48 Tm
-(of) Tj
-1 0 0 1 142.2 435.48 Tm
-(time) Tj
-1 0 0 1 161.76 435.48 Tm
-(increases) Tj
-1 0 0 1 200.04 435.48 Tm
-(e) Tj
-1 0 0 1 204.36 435.48 Tm
-(xponentially) Tj
-1 0 0 1 255.959 435.48 Tm
-(until) Tj
-1 0 0 1 275.999 435.48 Tm
-(some) Tj
-1 0 0 1 72 423.6 Tm
-(requested) Tj
-1 0 0 1 112.56 423.6 Tm
-(operation) Tj
-1 0 0 1 152.64 423.6 Tm
-(e) Tj
-1 0 0 1 156.96 423.6 Tm
-(x) Tj
-1 0 0 1 161.88 423.6 Tm
-(ecutes.) Tj
-1 0 0 1 192.72 423.6 Tm
-(W) Tj
-1 0 0 1 201.24 423.6 Tm
-(e) Tj
-1 0 0 1 208.2 423.6 Tm
-(achie) Tj
-1 0 0 1 229.08 423.6 Tm
-(v) Tj
-1 0 0 1 234 423.6 Tm
-(e) Tj
-1 0 0 1 240.719 423.6 Tm
-(these) Tj
-1 0 0 1 263.519 423.6 Tm
-(goals) Tj
-1 0 0 1 287.039 423.6 Tm
-(by) Tj
-1 0 0 1 72 411.6 Tm
-(three) Tj
-1 0 0 1 94.4399 411.6 Tm
-(means.) Tj
-1 0 0 1 81.96 398.16 Tm
-(First,) Tj
-1 0 0 1 104.64 398.16 Tm
-(to) Tj
-1 0 0 1 114.12 398.16 Tm
-(a) Tj
-1 0 0 1 118.32 398.16 Tm
-(v) Tj
-1 0 0 1 123.12 398.16 Tm
-(oid) Tj
-1 0 0 1 137.52 398.16 Tm
-(starting) Tj
-1 0 0 1 169.2 398.16 Tm
-(a) Tj
-1 0 0 1 175.32 398.16 Tm
-(vie) Tj
-1 0 0 1 187.32 398.16 Tm
-(w) Tj
-1 0 0 1 196.2 398.16 Tm
-(change) Tj
-1 0 0 1 226.079 398.16 Tm
-(too) Tj
-1 0 0 1 240.599 398.16 Tm
-(soon,) Tj
-1 0 0 1 263.759 398.16 Tm
-(a) Tj
-1 0 0 1 269.879 398.16 Tm
-(replica) Tj
-1 0 0 1 72 386.16 Tm
-(that) Tj
-1 0 0 1 90.7199 386.16 Tm
-(multicasts) Tj
-1 0 0 1 134.88 386.16 Tm
-(a) Tj
-1 0 0 1 143.04 386.16 Tm
-(vie) Tj
-1 0 0 1 155.04 386.16 Tm
-(w-change) Tj
-1 0 0 1 197.52 386.16 Tm
-(message) Tj
-1 0 0 1 234.96 386.16 Tm
-(for) Tj
-1 0 0 1 250.32 386.16 Tm
-(vie) Tj
-1 0 0 1 262.319 386.16 Tm
-(w) Tj
-ET
-endstream
-endobj
-612 0 obj
-3847
-endobj
-613 0 obj
-<< /Type /XObject /Name /R613 /Subtype /Image /Length 614 0 R
-/ImageMask true /Width 44 /Height 46 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 44 /BlackIs1 true >>]
->>
-stream
-2$jBq
-&9R,hkFhTE_G0fRqg[T's0obU5O\AciSX+=pUN/*r',Z@_Z&BgfC8fKf@@X?]DE=DTC?6WJ-Z.*~>
-endstream
-endobj
-614 0 obj
-84
-endobj
-615 0 obj
-<< /Length 616 0 R >>
-stream
-q
-4.4 0 0 -4.6 273.4 390.7 cm
-/R613 Do
-Q
-q
-6.6 0 0 -6.5 281.9 392 cm
-/R594 Do
-Q
-BT
-1 0 0 1 291.959 386.16 Tm
-(1) Tj
-1 0 0 1 72 374.28 Tm
-(w) Tj
-1 0 0 1 79.08 374.28 Tm
-(aits) Tj
-1 0 0 1 96 374.28 Tm
-(for) Tj
-1 0 0 1 110.76 374.28 Tm
-(2) Tj
-ET
-q
-5 0 0 -9.2 116.2 381.4 cm
-/R590 Do
-Q
-q
-6.6 0 0 -6.5 124.7 380.1 cm
-/R594 Do
-Q
-BT
-1 0 0 1 134.52 374.28 Tm
-(1) Tj
-1 0 0 1 142.56 374.28 Tm
-(vie) Tj
-1 0 0 1 154.56 374.28 Tm
-(w-change) Tj
-1 0 0 1 196.32 374.28 Tm
-(messages) Tj
-1 0 0 1 237.12 374.28 Tm
-(for) Tj
-1 0 0 1 251.759 374.28 Tm
-(vie) Tj
-1 0 0 1 263.759 374.28 Tm
-(w) Tj
-ET
-q
-4.4 0 0 -4.6 274.2 378.8 cm
-/R613 Do
-Q
-q
-6.6 0 0 -6.5 282.3 380.1 cm
-/R594 Do
-Q
-BT
-1 0 0 1 291.959 374.28 Tm
-(1) Tj
-1 0 0 1 72 362.28 Tm
-(and) Tj
-1 0 0 1 90.7199 362.28 Tm
-(then) Tj
-1 0 0 1 112.08 362.28 Tm
-(starts) Tj
-1 0 0 1 137.4 362.28 Tm
-(its) Tj
-1 0 0 1 151.08 362.28 Tm
-(timer) Tj
-1 0 0 1 176.4 362.28 Tm
-(to) Tj
-1 0 0 1 188.4 362.28 Tm
-(e) Tj
-1 0 0 1 192.72 362.28 Tm
-(xpire) Tj
-1 0 0 1 217.44 362.28 Tm
-(after) Tj
-1 0 0 1 239.999 362.28 Tm
-(some) Tj
-1 0 0 1 265.319 362.28 Tm
-(time) Tj
-ET
-endstream
-endobj
-616 0 obj
-1075
-endobj
-617 0 obj
-<< /Type /XObject /Name /R617 /Subtype /Image /Length 618 0 R
-/ImageMask true /Width 67 /Height 69 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 67 /BlackIs1 true >>]
->>
-stream
-,DNu&
-o;Eol^[L[l^Aiucrr7K*n,*#In%[i\jON<1s53j3J,=`QLZ.\$qtn/.E;L1?qfLL$)^G[f,C]\)!<~>
-endstream
-endobj
-618 0 obj
-86
-endobj
-619 0 obj
-<< /Length 620 0 R >>
-stream
-q
-6.7 0 0 -6.9 287.5 369.2 cm
-/R617 Do
-Q
-BT
-1 0 0 1 294.599 362.28 Tm
-(.) Tj
-1 0 0 1 72 350.4 Tm
-(If) Tj
-1 0 0 1 81.96 350.4 Tm
-(the) Tj
-1 0 0 1 97.5599 350.4 Tm
-(timer) Tj
-1 0 0 1 122.04 350.4 Tm
-(e) Tj
-1 0 0 1 126.36 350.4 Tm
-(xpires) Tj
-1 0 0 1 153.96 350.4 Tm
-(before) Tj
-1 0 0 1 182.76 350.4 Tm
-(it) Tj
-1 0 0 1 191.76 350.4 Tm
-(recei) Tj
-1 0 0 1 210.959 350.4 Tm
-(v) Tj
-1 0 0 1 215.879 350.4 Tm
-(es) Tj
-1 0 0 1 227.399 350.4 Tm
-(a) Tj
-1 0 0 1 235.199 350.4 Tm
-(v) Tj
-1 0 0 1 239.999 350.4 Tm
-(alid) Tj
-1 0 0 1 258.239 350.4 Tm
-(ne) Tj
-1 0 0 1 267.479 350.4 Tm
-(w-vie) Tj
-1 0 0 1 290.039 350.4 Tm
-(w) Tj
-1 0 0 1 72 338.4 Tm
-(message) Tj
-1 0 0 1 108.84 338.4 Tm
-(for) Tj
-ET
-q
-4.4 0 0 -4.6 123.7 342.9 cm
-/R613 Do
-Q
-q
-6.6 0 0 -6.5 131.7 344.2 cm
-/R594 Do
-Q
-BT
-1 0 0 1 141.36 338.4 Tm
-(1) Tj
-1 0 0 1 149.4 338.4 Tm
-(or) Tj
-1 0 0 1 160.68 338.4 Tm
-(before) Tj
-1 0 0 1 189.24 338.4 Tm
-(it) Tj
-1 0 0 1 197.759 338.4 Tm
-(e) Tj
-1 0 0 1 202.079 338.4 Tm
-(x) Tj
-1 0 0 1 206.999 338.4 Tm
-(ecutes) Tj
-1 0 0 1 234.839 338.4 Tm
-(a) Tj
-1 0 0 1 242.279 338.4 Tm
-(request) Tj
-1 0 0 1 274.079 338.4 Tm
-(in) Tj
-1 0 0 1 284.879 338.4 Tm
-(the) Tj
-1 0 0 1 72 326.52 Tm
-(ne) Tj
-1 0 0 1 81.24 326.52 Tm
-(w) Tj
-1 0 0 1 90.8399 326.52 Tm
-(vie) Tj
-1 0 0 1 102.84 326.52 Tm
-(w) Tj
-1 0 0 1 112.32 326.52 Tm
-(that) Tj
-1 0 0 1 129.72 326.52 Tm
-(it) Tj
-1 0 0 1 137.76 326.52 Tm
-(had) Tj
-1 0 0 1 154.56 326.52 Tm
-(not) Tj
-1 0 0 1 169.68 326.52 Tm
-(e) Tj
-1 0 0 1 174 326.52 Tm
-(x) Tj
-1 0 0 1 178.92 326.52 Tm
-(ecuted) Tj
-1 0 0 1 207.24 326.52 Tm
-(pre) Tj
-1 0 0 1 219.839 326.52 Tm
-(viously) Tj
-1 0 0 1 248.759 326.52 Tm
-(,) Tj
-1 0 0 1 253.319 326.52 Tm
-(it) Tj
-1 0 0 1 261.359 326.52 Tm
-(starts) Tj
-1 0 0 1 284.879 326.52 Tm
-(the) Tj
-1 0 0 1 72 314.52 Tm
-(vie) Tj
-1 0 0 1 84 314.52 Tm
-(w) Tj
-1 0 0 1 93.8399 314.52 Tm
-(change) Tj
-1 0 0 1 124.68 314.52 Tm
-(for) Tj
-1 0 0 1 138.96 314.52 Tm
-(vie) Tj
-1 0 0 1 150.96 314.52 Tm
-(w) Tj
-ET
-q
-4.4 0 0 -4.6 161 319 cm
-/R613 Do
-Q
-q
-6.6 0 0 -6.5 168.7 320.3 cm
-/R594 Do
-Q
-BT
-1 0 0 1 178.32 314.52 Tm
-(2) Tj
-1 0 0 1 186 314.52 Tm
-(b) Tj
-1 0 0 1 190.8 314.52 Tm
-(ut) Tj
-1 0 0 1 201.24 314.52 Tm
-(this) Tj
-1 0 0 1 218.28 314.52 Tm
-(time) Tj
-1 0 0 1 238.679 314.52 Tm
-(it) Tj
-1 0 0 1 246.839 314.52 Tm
-(will) Tj
-1 0 0 1 265.079 314.52 Tm
-(w) Tj
-1 0 0 1 272.159 314.52 Tm
-(ait) Tj
-1 0 0 1 284.759 314.52 Tm
-(2) Tj
-ET
-q
-6.7 0 0 -6.9 290 321.4 cm
-/R617 Do
-Q
-BT
-1 0 0 1 72 302.64 Tm
-(before) Tj
-1 0 0 1 99.9599 302.64 Tm
-(starting) Tj
-1 0 0 1 132.36 302.64 Tm
-(a) Tj
-1 0 0 1 139.2 302.64 Tm
-(vie) Tj
-1 0 0 1 151.2 302.64 Tm
-(w) Tj
-1 0 0 1 160.8 302.64 Tm
-(change) Tj
-1 0 0 1 191.52 302.64 Tm
-(for) Tj
-1 0 0 1 205.679 302.64 Tm
-(vie) Tj
-1 0 0 1 217.679 302.64 Tm
-(w) Tj
-ET
-q
-4.4 0 0 -4.6 227.5 307.1 cm
-/R613 Do
-Q
-q
-6.6 0 0 -6.5 235.1 308.4 cm
-/R594 Do
-Q
-BT
-1 0 0 1 244.679 302.64 Tm
-(3.) Tj
-1 0 0 1 81.96 289.08 Tm
-(Second,) Tj
-1 0 0 1 116.28 289.08 Tm
-(if) Tj
-1 0 0 1 124.8 289.08 Tm
-(a) Tj
-1 0 0 1 131.64 289.08 Tm
-(replica) Tj
-1 0 0 1 161.16 289.08 Tm
-(recei) Tj
-1 0 0 1 180.36 289.08 Tm
-(v) Tj
-1 0 0 1 185.28 289.08 Tm
-(es) Tj
-1 0 0 1 195.96 289.08 Tm
-(a) Tj
-1 0 0 1 202.8 289.08 Tm
-(set) Tj
-1 0 0 1 216.359 289.08 Tm
-(of) Tj
-ET
-q
-5 0 0 -9.2 227.4 296.2 cm
-/R590 Do
-Q
-q
-6.6 0 0 -6.5 235.6 294.9 cm
-/R594 Do
-Q
-BT
-1 0 0 1 245.039 289.08 Tm
-(1) Tj
-1 0 0 1 252.479 289.08 Tm
-(v) Tj
-1 0 0 1 257.279 289.08 Tm
-(alid) Tj
-1 0 0 1 274.559 289.08 Tm
-(vie) Tj
-1 0 0 1 286.559 289.08 Tm
-(w-) Tj
-1 0 0 1 72 277.2 Tm
-(change) Tj
-1 0 0 1 103.92 277.2 Tm
-(messages) Tj
-1 0 0 1 145.32 277.2 Tm
-(from) Tj
-1 0 0 1 168.36 277.2 Tm
-(other) Tj
-1 0 0 1 192.6 277.2 Tm
-(replicas) Tj
-1 0 0 1 227.28 277.2 Tm
-(for) Tj
-1 0 0 1 242.639 277.2 Tm
-(vie) Tj
-1 0 0 1 254.639 277.2 Tm
-(ws) Tj
-1 0 0 1 269.399 277.2 Tm
-(greater) Tj
-1 0 0 1 72 265.2 Tm
-(than) Tj
-1 0 0 1 93.2399 265.2 Tm
-(its) Tj
-1 0 0 1 106.68 265.2 Tm
-(current) Tj
-1 0 0 1 138.96 265.2 Tm
-(vie) Tj
-1 0 0 1 150.96 265.2 Tm
-(w) Tj
-1 0 0 1 157.56 265.2 Tm
-(,) Tj
-1 0 0 1 164.28 265.2 Tm
-(it) Tj
-1 0 0 1 173.88 265.2 Tm
-(sends) Tj
-1 0 0 1 200.04 265.2 Tm
-(a) Tj
-1 0 0 1 208.56 265.2 Tm
-(vie) Tj
-1 0 0 1 220.559 265.2 Tm
-(w-change) Tj
-1 0 0 1 263.279 265.2 Tm
-(message) Tj
-1 0 0 1 72 253.32 Tm
-(for) Tj
-1 0 0 1 87.9599 253.32 Tm
-(the) Tj
-1 0 0 1 104.4 253.32 Tm
-(smallest) Tj
-1 0 0 1 141.36 253.32 Tm
-(vie) Tj
-1 0 0 1 153.36 253.32 Tm
-(w) Tj
-1 0 0 1 164.76 253.32 Tm
-(in) Tj
-1 0 0 1 176.76 253.32 Tm
-(the) Tj
-1 0 0 1 193.32 253.32 Tm
-(set,) Tj
-1 0 0 1 211.559 253.32 Tm
-(e) Tj
-1 0 0 1 215.759 253.32 Tm
-(v) Tj
-1 0 0 1 220.679 253.32 Tm
-(en) Tj
-1 0 0 1 234.239 253.32 Tm
-(if) Tj
-1 0 0 1 244.679 253.32 Tm
-(its) Tj
-1 0 0 1 258.359 253.32 Tm
-(timer) Tj
-1 0 0 1 283.679 253.32 Tm
-(has) Tj
-1 0 0 1 72 241.32 Tm
-(not) Tj
-1 0 0 1 87.96 241.32 Tm
-(e) Tj
-1 0 0 1 92.28 241.32 Tm
-(xpired;) Tj
-1 0 0 1 123.96 241.32 Tm
-(this) Tj
-1 0 0 1 141.48 241.32 Tm
-(pre) Tj
-1 0 0 1 154.08 241.32 Tm
-(v) Tj
-1 0 0 1 159 241.32 Tm
-(ents) Tj
-1 0 0 1 178.08 241.32 Tm
-(it) Tj
-1 0 0 1 186.72 241.32 Tm
-(from) Tj
-1 0 0 1 209.28 241.32 Tm
-(starting) Tj
-1 0 0 1 242.399 241.32 Tm
-(the) Tj
-1 0 0 1 257.639 241.32 Tm
-(ne) Tj
-1 0 0 1 266.999 241.32 Tm
-(xt) Tj
-1 0 0 1 277.919 241.32 Tm
-(vie) Tj
-1 0 0 1 289.919 241.32 Tm
-(w) Tj
-1 0 0 1 72 229.32 Tm
-(change) Tj
-1 0 0 1 102.72 229.32 Tm
-(too) Tj
-1 0 0 1 117.96 229.32 Tm
-(late.) Tj
-1 0 0 1 81.96 215.88 Tm
-(Third,) Tj
-1 0 0 1 110.64 215.88 Tm
-(f) Tj
-1 0 0 1 113.88 215.88 Tm
-(aulty) Tj
-1 0 0 1 137.64 215.88 Tm
-(replicas) Tj
-1 0 0 1 172.32 215.88 Tm
-(are) Tj
-1 0 0 1 188.28 215.88 Tm
-(unable) Tj
-1 0 0 1 218.64 215.88 Tm
-(to) Tj
-1 0 0 1 230.159 215.88 Tm
-(impede) Tj
-1 0 0 1 263.279 215.88 Tm
-(progress) Tj
-1 0 0 1 72 203.88 Tm
-(by) Tj
-1 0 0 1 87 203.88 Tm
-(forcing) Tj
-1 0 0 1 120.96 203.88 Tm
-(frequent) Tj
-1 0 0 1 159.24 203.88 Tm
-(vie) Tj
-1 0 0 1 171.24 203.88 Tm
-(w) Tj
-1 0 0 1 183.36 203.88 Tm
-(changes.) Tj
-1 0 0 1 229.32 203.88 Tm
-(A) Tj
-1 0 0 1 241.68 203.88 Tm
-(f) Tj
-1 0 0 1 244.92 203.88 Tm
-(aulty) Tj
-1 0 0 1 269.879 203.88 Tm
-(replica) Tj
-1 0 0 1 72 192 Tm
-(cannot) Tj
-1 0 0 1 102.12 192 Tm
-(cause) Tj
-1 0 0 1 127.8 192 Tm
-(a) Tj
-1 0 0 1 135.84 192 Tm
-(vie) Tj
-1 0 0 1 147.84 192 Tm
-(w) Tj
-1 0 0 1 158.52 192 Tm
-(change) Tj
-1 0 0 1 190.32 192 Tm
-(by) Tj
-1 0 0 1 203.76 192 Tm
-(sending) Tj
-1 0 0 1 238.32 192 Tm
-(a) Tj
-1 0 0 1 246.359 192 Tm
-(vie) Tj
-1 0 0 1 258.359 192 Tm
-(w-change) Tj
-1 0 0 1 72 180 Tm
-(message,) Tj
-1 0 0 1 111.84 180 Tm
-(because) Tj
-1 0 0 1 146.64 180 Tm
-(a) Tj
-1 0 0 1 154.44 180 Tm
-(vie) Tj
-1 0 0 1 166.44 180 Tm
-(w) Tj
-1 0 0 1 176.88 180 Tm
-(change) Tj
-1 0 0 1 208.44 180 Tm
-(will) Tj
-1 0 0 1 227.28 180 Tm
-(happen) Tj
-1 0 0 1 259.32 180 Tm
-(only) Tj
-1 0 0 1 280.439 180 Tm
-(if) Tj
-1 0 0 1 289.799 180 Tm
-(at) Tj
-1 0 0 1 72 168.12 Tm
-(least) Tj
-ET
-q
-5 0 0 -9.2 94.1 175.2 cm
-/R590 Do
-Q
-q
-6.6 0 0 -6.5 103 173.9 cm
-/R594 Do
-Q
-BT
-1 0 0 1 112.92 168.12 Tm
-(1) Tj
-1 0 0 1 121.32 168.12 Tm
-(replicas) Tj
-1 0 0 1 155.76 168.12 Tm
-(send) Tj
-1 0 0 1 177.48 168.12 Tm
-(vie) Tj
-1 0 0 1 189.48 168.12 Tm
-(w-change) Tj
-1 0 0 1 231.6 168.12 Tm
-(messages,) Tj
-1 0 0 1 275.519 168.12 Tm
-(b) Tj
-1 0 0 1 280.319 168.12 Tm
-(ut) Tj
-1 0 0 1 291.479 168.12 Tm
-(it) Tj
-1 0 0 1 72 156.12 Tm
-(can) Tj
-1 0 0 1 88.9199 156.12 Tm
-(cause) Tj
-1 0 0 1 114.12 156.12 Tm
-(a) Tj
-1 0 0 1 121.56 156.12 Tm
-(vie) Tj
-1 0 0 1 133.56 156.12 Tm
-(w) Tj
-1 0 0 1 143.76 156.12 Tm
-(change) Tj
-1 0 0 1 175.08 156.12 Tm
-(when) Tj
-1 0 0 1 199.68 156.12 Tm
-(it) Tj
-1 0 0 1 208.32 156.12 Tm
-(is) Tj
-1 0 0 1 218.04 156.12 Tm
-(the) Tj
-1 0 0 1 233.279 156.12 Tm
-(primary) Tj
-1 0 0 1 267.959 156.12 Tm
-(\(by) Tj
-1 0 0 1 284.279 156.12 Tm
-(not) Tj
-1 0 0 1 72 144.24 Tm
-(sending) Tj
-1 0 0 1 106.2 144.24 Tm
-(messages) Tj
-1 0 0 1 146.88 144.24 Tm
-(or) Tj
-1 0 0 1 158.4 144.24 Tm
-(sending) Tj
-1 0 0 1 192.48 144.24 Tm
-(bad) Tj
-1 0 0 1 210 144.24 Tm
-(messages\).) Tj
-1 0 0 1 259.079 144.24 Tm
-(Ho) Tj
-1 0 0 1 271.079 144.24 Tm
-(we) Tj
-1 0 0 1 282.479 144.24 Tm
-(v) Tj
-1 0 0 1 287.399 144.24 Tm
-(er) Tj
-1 0 0 1 294.839 144.24 Tm
-(,) Tj
-1 0 0 1 72 132.24 Tm
-(because) Tj
-1 0 0 1 106.56 132.24 Tm
-(the) Tj
-1 0 0 1 121.68 132.24 Tm
-(primary) Tj
-1 0 0 1 156.24 132.24 Tm
-(of) Tj
-1 0 0 1 167.52 132.24 Tm
-(vie) Tj
-1 0 0 1 179.52 132.24 Tm
-(w) Tj
-ET
-q
-4.4 0 0 -4.6 189.9 136.7 cm
-/R613 Do
-Q
-BT
-1 0 0 1 197.88 132.24 Tm
-(is) Tj
-1 0 0 1 207.48 132.24 Tm
-(the) Tj
-1 0 0 1 222.72 132.24 Tm
-(replica) Tj
-ET
-endstream
-endobj
-620 0 obj
-8223
-endobj
-621 0 obj
-<< /Type /XObject /Name /R621 /Subtype /Image /Length 622 0 R
-/ImageMask true /Width 54 /Height 64 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 54 /BlackIs1 true >>]
->>
-stream
--D98r4=0b"4s0Orro]!o&:3^Ke&7l2
-[/(7*rS^,RIfB4oLV,SG]>+(NrPSU5I/eEj^Aki-s4fFGn+Z5e95',@28).TTZ(Ru?\8Ii-iec'~>
-endstream
-endobj
-622 0 obj
-109
-endobj
-623 0 obj
-<< /Length 624 0 R >>
-stream
-q
-5.4 0 0 -6.4 252.4 136.7 cm
-/R621 Do
-Q
-BT
-1 0 0 1 260.759 132.24 Tm
-(such) Tj
-1 0 0 1 281.999 132.24 Tm
-(that) Tj
-ET
-q
-5.4 0 0 -6.4 71.6 124.9 cm
-/R621 Do
-Q
-endstream
-endobj
-624 0 obj
-159
-endobj
-625 0 obj
-<< /Type /XObject /Name /R625 /Subtype /Image /Length 626 0 R
-/ImageMask true /Width 66 /Height 27 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 66 /BlackIs1 true >>]
->>
-stream
-/e%CP4)j*Wq&BoPm6CdS5Q~>
-endstream
-endobj
-626 0 obj
-25
-endobj
-627 0 obj
-<< /Length 628 0 R >>
-stream
-q
-6.6 0 0 -2.7 81.4 124.3 cm
-/R625 Do
-Q
-q
-4.4 0 0 -4.6 92.7 124.9 cm
-/R613 Do
-Q
-endstream
-endobj
-628 0 obj
-80
-endobj
-629 0 obj
-<< /Type /Font /Name /R629 /Subtype /Type1 /BaseFont /Times-Italic >>
-endobj
-630 0 obj
-<< /Length 631 0 R >>
-stream
-BT
-/R629 10 Tf
-1 0 0 1 101.52 120.36 Tm
-(mod) Tj
-ET
-endstream
-endobj
-631 0 obj
-52
-endobj
-632 0 obj
-<< /Type /XObject /Name /R632 /Subtype /Image /Length 633 0 R
-/ImageMask true /Width 6 /Height 100 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 6 /BlackIs1 true >>]
->>
-stream
-02qoNs8W-!s8W-!s8W-!s8W-!s8W-!s8Uf'#QTA~>
-endstream
-endobj
-633 0 obj
-42
-endobj
-634 0 obj
-<< /Length 635 0 R >>
-stream
-q
-0.6 0 0 -10 123.5 127.9 cm
-/R632 Do
-Q
-endstream
-endobj
-635 0 obj
-40
-endobj
-636 0 obj
-<< /Type /XObject /Name /R636 /Subtype /Image /Length 637 0 R
-/ImageMask true /Width 82 /Height 72 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 82 /BlackIs1 true >>]
->>
-stream
--Y/ktlnh'J_1WlVIN>d;OF5k,Do-F.&+/,KrBCW.%mf0XjHsl[XfmH0hq-EWKY$j0J0P"&G5OH\
-%NI1uW$_fE0RLEdqg:VHE;eVks1FCucp-FBHiJ$ama`KH4`C&`>7V$N*[EFX"s^Mb8oRjd(Qr1T!"]/~>
-endstream
-endobj
-637 0 obj
-158
-endobj
-638 0 obj
-<< /Length 639 0 R >>
-stream
-q
-8.2 0 0 -7.2 125.4 127.3 cm
-/R636 Do
-Q
-q
-0.6 0 0 -10 134.7 127.9 cm
-/R632 Do
-Q
-BT
-/R583 10 Tf
-1 0 0 1 136.44 120.36 Tm
-(,) Tj
-1 0 0 1 142.44 120.36 Tm
-(the) Tj
-1 0 0 1 157.92 120.36 Tm
-(primary) Tj
-1 0 0 1 192.72 120.36 Tm
-(cannot) Tj
-1 0 0 1 222.6 120.36 Tm
-(be) Tj
-1 0 0 1 235.2 120.36 Tm
-(f) Tj
-1 0 0 1 238.439 120.36 Tm
-(aulty) Tj
-1 0 0 1 261.599 120.36 Tm
-(for) Tj
-1 0 0 1 276.479 120.36 Tm
-(more) Tj
-1 0 0 1 72 108.36 Tm
-(than) Tj
-ET
-q
-5 0 0 -9.2 92.1 115.5 cm
-/R590 Do
-Q
-BT
-1 0 0 1 100.08 108.36 Tm
-(consecuti) Tj
-1 0 0 1 137.64 108.36 Tm
-(v) Tj
-1 0 0 1 142.56 108.36 Tm
-(e) Tj
-1 0 0 1 149.16 108.36 Tm
-(vie) Tj
-1 0 0 1 161.16 108.36 Tm
-(ws.) Tj
-1 0 0 1 81.96 94.92 Tm
-(These) Tj
-1 0 0 1 112.44 94.92 Tm
-(three) Tj
-1 0 0 1 139.08 94.92 Tm
-(techniques) Tj
-1 0 0 1 188.28 94.92 Tm
-(guarantee) Tj
-1 0 0 1 233.76 94.92 Tm
-(li) Tj
-1 0 0 1 239.04 94.92 Tm
-(v) Tj
-1 0 0 1 243.96 94.92 Tm
-(eness) Tj
-1 0 0 1 272.039 94.92 Tm
-(unless) Tj
-1 0 0 1 72 82.92 Tm
-(message) Tj
-1 0 0 1 111.24 82.92 Tm
-(delays) Tj
-1 0 0 1 142.2 82.92 Tm
-(gro) Tj
-1 0 0 1 155.4 82.92 Tm
-(w) Tj
-1 0 0 1 167.88 82.92 Tm
-(f) Tj
-1 0 0 1 171.12 82.92 Tm
-(aster) Tj
-1 0 0 1 195.36 82.92 Tm
-(than) Tj
-1 0 0 1 217.92 82.92 Tm
-(the) Tj
-1 0 0 1 235.68 82.92 Tm
-(timeout) Tj
-1 0 0 1 271.559 82.92 Tm
-(period) Tj
-1 0 0 1 72 71.04 Tm
-(inde\256nitely) Tj
-1 0 0 1 117 71.04 Tm
-(,) Tj
-1 0 0 1 121.68 71.04 Tm
-(which) Tj
-1 0 0 1 148.56 71.04 Tm
-(is) Tj
-1 0 0 1 157.68 71.04 Tm
-(unlik) Tj
-1 0 0 1 178.2 71.04 Tm
-(ely) Tj
-1 0 0 1 192.72 71.04 Tm
-(in) Tj
-1 0 0 1 203.04 71.04 Tm
-(a) Tj
-1 0 0 1 209.88 71.04 Tm
-(real) Tj
-1 0 0 1 227.279 71.04 Tm
-(system.) Tj
-/R610 10 Tf
-1 0 0 1 315 709.08 Tm
-(4.6) Tj
-1 0 0 1 337.44 709.08 Tm
-(Non-Determinism) Tj
-/R583 10 Tf
-1 0 0 1 315 693.84 Tm
-(State) Tj
-1 0 0 1 338.52 693.84 Tm
-(machine) Tj
-1 0 0 1 375.84 693.84 Tm
-(replicas) Tj
-1 0 0 1 410.4 693.84 Tm
-(must) Tj
-1 0 0 1 433.32 693.84 Tm
-(be) Tj
-1 0 0 1 446.28 693.84 Tm
-(deterministic) Tj
-1 0 0 1 501.959 693.84 Tm
-(b) Tj
-1 0 0 1 506.759 693.84 Tm
-(ut) Tj
-1 0 0 1 518.039 693.84 Tm
-(man) Tj
-1 0 0 1 535.199 693.84 Tm
-(y) Tj
-1 0 0 1 315 681.96 Tm
-(services) Tj
-1 0 0 1 351.48 681.96 Tm
-(in) Tj
-1 0 0 1 358.92 681.96 Tm
-(v) Tj
-1 0 0 1 363.72 681.96 Tm
-(olv) Tj
-1 0 0 1 376.44 681.96 Tm
-(e) Tj
-1 0 0 1 384.96 681.96 Tm
-(some) Tj
-1 0 0 1 410.28 681.96 Tm
-(form) Tj
-1 0 0 1 433.92 681.96 Tm
-(of) Tj
-1 0 0 1 446.64 681.96 Tm
-(non-determinism.) Tj
-1 0 0 1 526.319 681.96 Tm
-(F) Tj
-1 0 0 1 531.719 681.96 Tm
-(or) Tj
-1 0 0 1 315 669.96 Tm
-(e) Tj
-1 0 0 1 319.32 669.96 Tm
-(xample,) Tj
-1 0 0 1 353.52 669.96 Tm
-(the) Tj
-1 0 0 1 368.16 669.96 Tm
-(time-last-modi\256ed) Tj
-1 0 0 1 444.24 669.96 Tm
-(in) Tj
-1 0 0 1 454.44 669.96 Tm
-(NFS) Tj
-1 0 0 1 475.079 669.96 Tm
-(is) Tj
-1 0 0 1 484.199 669.96 Tm
-(set) Tj
-1 0 0 1 497.759 669.96 Tm
-(by) Tj
-1 0 0 1 510.119 669.96 Tm
-(reading) Tj
-1 0 0 1 315 658.08 Tm
-(the) Tj
-1 0 0 1 330 658.08 Tm
-(serv) Tj
-1 0 0 1 346.56 658.08 Tm
-(er') Tj
-1 0 0 1 357.12 658.08 Tm
-(s) Tj
-1 0 0 1 363.6 658.08 Tm
-(local) Tj
-1 0 0 1 385.8 658.08 Tm
-(clock;) Tj
-1 0 0 1 413.16 658.08 Tm
-(if) Tj
-1 0 0 1 422.04 658.08 Tm
-(this) Tj
-1 0 0 1 439.2 658.08 Tm
-(were) Tj
-1 0 0 1 461.399 658.08 Tm
-(done) Tj
-1 0 0 1 483.599 658.08 Tm
-(independently) Tj
-1 0 0 1 315 646.08 Tm
-(at) Tj
-1 0 0 1 325.92 646.08 Tm
-(each) Tj
-1 0 0 1 347.88 646.08 Tm
-(replica,) Tj
-1 0 0 1 381.6 646.08 Tm
-(the) Tj
-1 0 0 1 397.44 646.08 Tm
-(states) Tj
-1 0 0 1 423.36 646.08 Tm
-(of) Tj
-1 0 0 1 435.36 646.08 Tm
-(non-f) Tj
-1 0 0 1 457.079 646.08 Tm
-(aulty) Tj
-1 0 0 1 480.479 646.08 Tm
-(replicas) Tj
-1 0 0 1 515.159 646.08 Tm
-(w) Tj
-1 0 0 1 522.239 646.08 Tm
-(ould) Tj
-1 0 0 1 315 634.2 Tm
-(di) Tj
-1 0 0 1 322.56 634.2 Tm
-(v) Tj
-1 0 0 1 327.48 634.2 Tm
-(er) Tj
-1 0 0 1 335.16 634.2 Tm
-(ge.) Tj
-1 0 0 1 352.92 634.2 Tm
-(Therefore,) Tj
-1 0 0 1 398.28 634.2 Tm
-(some) Tj
-1 0 0 1 422.64 634.2 Tm
-(mechanism) Tj
-1 0 0 1 471.36 634.2 Tm
-(to) Tj
-1 0 0 1 482.4 634.2 Tm
-(ensure) Tj
-1 0 0 1 511.8 634.2 Tm
-(that) Tj
-1 0 0 1 530.039 634.2 Tm
-(all) Tj
-1 0 0 1 315 622.2 Tm
-(replicas) Tj
-1 0 0 1 348.84 622.2 Tm
-(select) Tj
-1 0 0 1 374.4 622.2 Tm
-(the) Tj
-1 0 0 1 389.4 622.2 Tm
-(same) Tj
-1 0 0 1 412.8 622.2 Tm
-(v) Tj
-1 0 0 1 417.6 622.2 Tm
-(alue) Tj
-1 0 0 1 436.92 622.2 Tm
-(is) Tj
-1 0 0 1 446.52 622.2 Tm
-(needed.) Tj
-1 0 0 1 481.919 622.2 Tm
-(In) Tj
-1 0 0 1 493.079 622.2 Tm
-(general,) Tj
-1 0 0 1 527.879 622.2 Tm
-(the) Tj
-1 0 0 1 315 610.32 Tm
-(client) Tj
-1 0 0 1 340.92 610.32 Tm
-(cannot) Tj
-1 0 0 1 371.16 610.32 Tm
-(select) Tj
-1 0 0 1 397.56 610.32 Tm
-(the) Tj
-1 0 0 1 413.52 610.32 Tm
-(v) Tj
-1 0 0 1 418.32 610.32 Tm
-(alue) Tj
-1 0 0 1 438.6 610.32 Tm
-(because) Tj
-1 0 0 1 473.759 610.32 Tm
-(it) Tj
-1 0 0 1 483.119 610.32 Tm
-(does) Tj
-1 0 0 1 505.079 610.32 Tm
-(not) Tj
-1 0 0 1 521.519 610.32 Tm
-(ha) Tj
-1 0 0 1 530.759 610.32 Tm
-(v) Tj
-1 0 0 1 535.679 610.32 Tm
-(e) Tj
-1 0 0 1 315 598.32 Tm
-(enough) Tj
-1 0 0 1 347.16 598.32 Tm
-(information;) Tj
-1 0 0 1 399.96 598.32 Tm
-(for) Tj
-1 0 0 1 414.36 598.32 Tm
-(e) Tj
-1 0 0 1 418.68 598.32 Tm
-(xample,) Tj
-1 0 0 1 453.36 598.32 Tm
-(it) Tj
-1 0 0 1 461.76 598.32 Tm
-(does) Tj
-1 0 0 1 482.879 598.32 Tm
-(not) Tj
-1 0 0 1 498.359 598.32 Tm
-(kno) Tj
-1 0 0 1 513.239 598.32 Tm
-(w) Tj
-1 0 0 1 523.079 598.32 Tm
-(ho) Tj
-1 0 0 1 532.919 598.32 Tm
-(w) Tj
-1 0 0 1 315 586.32 Tm
-(its) Tj
-1 0 0 1 326.76 586.32 Tm
-(request) Tj
-1 0 0 1 357.96 586.32 Tm
-(will) Tj
-1 0 0 1 375.84 586.32 Tm
-(be) Tj
-1 0 0 1 387.6 586.32 Tm
-(ordered) Tj
-1 0 0 1 420.36 586.32 Tm
-(relati) Tj
-1 0 0 1 440.64 586.32 Tm
-(v) Tj
-1 0 0 1 445.559 586.32 Tm
-(e) Tj
-1 0 0 1 452.279 586.32 Tm
-(to) Tj
-1 0 0 1 462.359 586.32 Tm
-(concurrent) Tj
-1 0 0 1 507.359 586.32 Tm
-(requests) Tj
-1 0 0 1 315 574.44 Tm
-(by) Tj
-1 0 0 1 327.6 574.44 Tm
-(other) Tj
-1 0 0 1 350.76 574.44 Tm
-(clients.) Tj
-1 0 0 1 383.52 574.44 Tm
-(Instead,) Tj
-1 0 0 1 417.48 574.44 Tm
-(the) Tj
-1 0 0 1 432.36 574.44 Tm
-(primary) Tj
-1 0 0 1 466.679 574.44 Tm
-(needs) Tj
-1 0 0 1 491.999 574.44 Tm
-(to) Tj
-1 0 0 1 502.439 574.44 Tm
-(select) Tj
-1 0 0 1 527.879 574.44 Tm
-(the) Tj
-1 0 0 1 315 562.44 Tm
-(v) Tj
-1 0 0 1 319.8 562.44 Tm
-(alue) Tj
-1 0 0 1 339.6 562.44 Tm
-(either) Tj
-1 0 0 1 365.64 562.44 Tm
-(independently) Tj
-1 0 0 1 425.4 562.44 Tm
-(or) Tj
-1 0 0 1 436.92 562.44 Tm
-(based) Tj
-1 0 0 1 462.96 562.44 Tm
-(on) Tj
-1 0 0 1 476.279 562.44 Tm
-(v) Tj
-1 0 0 1 481.079 562.44 Tm
-(alues) Tj
-1 0 0 1 504.719 562.44 Tm
-(pro) Tj
-1 0 0 1 518.039 562.44 Tm
-(vided) Tj
-1 0 0 1 315 550.56 Tm
-(by) Tj
-1 0 0 1 327.48 550.56 Tm
-(the) Tj
-1 0 0 1 342.12 550.56 Tm
-(backups.) Tj
-1 0 0 1 324.96 538.08 Tm
-(If) Tj
-1 0 0 1 333.6 538.08 Tm
-(the) Tj
-1 0 0 1 347.76 538.08 Tm
-(primary) Tj
-1 0 0 1 381.24 538.08 Tm
-(selects) Tj
-1 0 0 1 409.8 538.08 Tm
-(the) Tj
-1 0 0 1 423.96 538.08 Tm
-(non-deterministic) Tj
-1 0 0 1 496.199 538.08 Tm
-(v) Tj
-1 0 0 1 500.999 538.08 Tm
-(alue) Tj
-1 0 0 1 519.479 538.08 Tm
-(inde-) Tj
-1 0 0 1 315 526.2 Tm
-(pendently) Tj
-1 0 0 1 354 526.2 Tm
-(,) Tj
-1 0 0 1 359.64 526.2 Tm
-(it) Tj
-1 0 0 1 368.4 526.2 Tm
-(concatenates) Tj
-1 0 0 1 422.52 526.2 Tm
-(the) Tj
-1 0 0 1 438 526.2 Tm
-(v) Tj
-1 0 0 1 442.8 526.2 Tm
-(alue) Tj
-1 0 0 1 462.599 526.2 Tm
-(with) Tj
-1 0 0 1 483.599 526.2 Tm
-(the) Tj
-1 0 0 1 499.079 526.2 Tm
-(associated) Tj
-1 0 0 1 315 514.2 Tm
-(request) Tj
-1 0 0 1 347.04 514.2 Tm
-(and) Tj
-1 0 0 1 364.68 514.2 Tm
-(e) Tj
-1 0 0 1 369 514.2 Tm
-(x) Tj
-1 0 0 1 373.92 514.2 Tm
-(ecutes) Tj
-1 0 0 1 402 514.2 Tm
-(the) Tj
-1 0 0 1 417.36 514.2 Tm
-(three) Tj
-1 0 0 1 440.52 514.2 Tm
-(phase) Tj
-1 0 0 1 466.56 514.2 Tm
-(protocol) Tj
-1 0 0 1 503.039 514.2 Tm
-(to) Tj
-1 0 0 1 513.959 514.2 Tm
-(ensure) Tj
-1 0 0 1 315 502.2 Tm
-(that) Tj
-1 0 0 1 332.88 502.2 Tm
-(non-f) Tj
-1 0 0 1 354.6 502.2 Tm
-(aulty) Tj
-1 0 0 1 377.16 502.2 Tm
-(replicas) Tj
-1 0 0 1 411 502.2 Tm
-(agree) Tj
-1 0 0 1 435.48 502.2 Tm
-(on) Tj
-1 0 0 1 448.32 502.2 Tm
-(a) Tj
-1 0 0 1 455.64 502.2 Tm
-(sequence) Tj
-1 0 0 1 494.999 502.2 Tm
-(number) Tj
-1 0 0 1 528.359 502.2 Tm
-(for) Tj
-1 0 0 1 315 490.32 Tm
-(the) Tj
-1 0 0 1 328.92 490.32 Tm
-(request) Tj
-1 0 0 1 359.52 490.32 Tm
-(and) Tj
-1 0 0 1 375.72 490.32 Tm
-(v) Tj
-1 0 0 1 380.52 490.32 Tm
-(alue.) Tj
-1 0 0 1 402.36 490.32 Tm
-(This) Tj
-1 0 0 1 421.8 490.32 Tm
-(pre) Tj
-1 0 0 1 434.4 490.32 Tm
-(v) Tj
-1 0 0 1 439.32 490.32 Tm
-(ents) Tj
-1 0 0 1 457.079 490.32 Tm
-(a) Tj
-1 0 0 1 463.199 490.32 Tm
-(f) Tj
-1 0 0 1 466.439 490.32 Tm
-(aulty) Tj
-1 0 0 1 488.159 490.32 Tm
-(pr) Tj
-1 0 0 1 496.439 490.32 Tm
-(imary) Tj
-1 0 0 1 521.399 490.32 Tm
-(f) Tj
-1 0 0 1 524.639 490.32 Tm
-(ro) Tj
-1 0 0 1 532.919 490.32 Tm
-(m) Tj
-1 0 0 1 315 478.32 Tm
-(causing) Tj
-1 0 0 1 348.12 478.32 Tm
-(replica) Tj
-1 0 0 1 378 478.32 Tm
-(state) Tj
-1 0 0 1 399 478.32 Tm
-(to) Tj
-1 0 0 1 409.56 478.32 Tm
-(di) Tj
-1 0 0 1 417.12 478.32 Tm
-(v) Tj
-1 0 0 1 422.04 478.32 Tm
-(er) Tj
-1 0 0 1 429.72 478.32 Tm
-(ge) Tj
-1 0 0 1 441.479 478.32 Tm
-(by) Tj
-1 0 0 1 454.199 478.32 Tm
-(sending) Tj
-1 0 0 1 487.919 478.32 Tm
-(dif) Tj
-1 0 0 1 498.839 478.32 Tm
-(ferent) Tj
-1 0 0 1 524.759 478.32 Tm
-(v) Tj
-1 0 0 1 529.559 478.32 Tm
-(al-) Tj
-1 0 0 1 315 466.44 Tm
-(ues) Tj
-1 0 0 1 330.12 466.44 Tm
-(to) Tj
-1 0 0 1 339.6 466.44 Tm
-(dif) Tj
-1 0 0 1 350.52 466.44 Tm
-(ferent) Tj
-1 0 0 1 375.48 466.44 Tm
-(replicas.) Tj
-1 0 0 1 412.32 466.44 Tm
-(Ho) Tj
-1 0 0 1 424.32 466.44 Tm
-(we) Tj
-1 0 0 1 435.72 466.44 Tm
-(v) Tj
-1 0 0 1 440.64 466.44 Tm
-(er) Tj
-1 0 0 1 448.079 466.44 Tm
-(,) Tj
-1 0 0 1 452.279 466.44 Tm
-(a) Tj
-1 0 0 1 458.399 466.44 Tm
-(f) Tj
-1 0 0 1 461.639 466.44 Tm
-(aulty) Tj
-1 0 0 1 483.359 466.44 Tm
-(primary) Tj
-1 0 0 1 516.719 466.44 Tm
-(might) Tj
-1 0 0 1 315 454.44 Tm
-(send) Tj
-1 0 0 1 335.52 454.44 Tm
-(the) Tj
-1 0 0 1 349.92 454.44 Tm
-(same,) Tj
-1 0 0 1 375.24 454.44 Tm
-(incorrect,) Tj
-1 0 0 1 415.44 454.44 Tm
-(v) Tj
-1 0 0 1 420.24 454.44 Tm
-(alue) Tj
-1 0 0 1 438.96 454.44 Tm
-(to) Tj
-1 0 0 1 449.04 454.44 Tm
-(all) Tj
-1 0 0 1 461.279 454.44 Tm
-(replicas.) Tj
-1 0 0 1 498.239 454.44 Tm
-(Therefore,) Tj
-1 0 0 1 315 442.56 Tm
-(replicas) Tj
-1 0 0 1 348.24 442.56 Tm
-(must) Tj
-1 0 0 1 369.84 442.56 Tm
-(be) Tj
-1 0 0 1 381.6 442.56 Tm
-(able) Tj
-1 0 0 1 400.44 442.56 Tm
-(to) Tj
-1 0 0 1 410.4 442.56 Tm
-(decide) Tj
-1 0 0 1 438.72 442.56 Tm
-(deterministically) Tj
-1 0 0 1 507.959 442.56 Tm
-(whether) Tj
-1 0 0 1 315 430.56 Tm
-(the) Tj
-1 0 0 1 329.28 430.56 Tm
-(v) Tj
-1 0 0 1 334.08 430.56 Tm
-(alue) Tj
-1 0 0 1 352.8 430.56 Tm
-(is) Tj
-1 0 0 1 361.56 430.56 Tm
-(correct) Tj
-1 0 0 1 391.32 430.56 Tm
-(\(and) Tj
-1 0 0 1 411.12 430.56 Tm
-(what) Tj
-1 0 0 1 432.6 430.56 Tm
-(to) Tj
-1 0 0 1 442.56 430.56 Tm
-(do) Tj
-1 0 0 1 454.679 430.56 Tm
-(if) Tj
-1 0 0 1 462.839 430.56 Tm
-(it) Tj
-1 0 0 1 470.519 430.56 Tm
-(is) Tj
-1 0 0 1 479.279 430.56 Tm
-(not\)) Tj
-1 0 0 1 497.519 430.56 Tm
-(based) Tj
-1 0 0 1 522.239 430.56 Tm
-(only) Tj
-1 0 0 1 315 418.68 Tm
-(on) Tj
-1 0 0 1 327.48 418.68 Tm
-(the) Tj
-1 0 0 1 342.12 418.68 Tm
-(service) Tj
-1 0 0 1 372.84 418.68 Tm
-(state.) Tj
-1 0 0 1 324.96 406.2 Tm
-(This) Tj
-1 0 0 1 345.24 406.2 Tm
-(protocol) Tj
-1 0 0 1 381 406.2 Tm
-(is) Tj
-1 0 0 1 390.24 406.2 Tm
-(adequate) Tj
-1 0 0 1 428.28 406.2 Tm
-(for) Tj
-1 0 0 1 442.44 406.2 Tm
-(most) Tj
-1 0 0 1 464.399 406.2 Tm
-(services) Tj
-1 0 0 1 499.079 406.2 Tm
-(\(including) Tj
-1 0 0 1 315 394.2 Tm
-(NFS\)) Tj
-1 0 0 1 343.44 394.2 Tm
-(b) Tj
-1 0 0 1 348.24 394.2 Tm
-(ut) Tj
-1 0 0 1 362.76 394.2 Tm
-(occasionally) Tj
-1 0 0 1 419.4 394.2 Tm
-(replicas) Tj
-1 0 0 1 457.2 394.2 Tm
-(must) Tj
-1 0 0 1 483.36 394.2 Tm
-(participate) Tj
-1 0 0 1 532.199 394.2 Tm
-(in) Tj
-1 0 0 1 315 382.32 Tm
-(selecting) Tj
-1 0 0 1 354.72 382.32 Tm
-(the) Tj
-1 0 0 1 371.16 382.32 Tm
-(v) Tj
-1 0 0 1 375.96 382.32 Tm
-(alue) Tj
-1 0 0 1 396.84 382.32 Tm
-(to) Tj
-1 0 0 1 408.96 382.32 Tm
-(satisfy) Tj
-1 0 0 1 439.199 382.32 Tm
-(a) Tj
-1 0 0 1 447.959 382.32 Tm
-(service') Tj
-1 0 0 1 479.039 382.32 Tm
-(s) Tj
-1 0 0 1 487.199 382.32 Tm
-(speci\256cation.) Tj
-1 0 0 1 315 370.32 Tm
-(This) Tj
-1 0 0 1 336.36 370.32 Tm
-(can) Tj
-1 0 0 1 353.76 370.32 Tm
-(be) Tj
-1 0 0 1 366.84 370.32 Tm
-(accomplished) Tj
-1 0 0 1 425.16 370.32 Tm
-(by) Tj
-1 0 0 1 438.84 370.32 Tm
-(adding) Tj
-1 0 0 1 469.56 370.32 Tm
-(an) Tj
-1 0 0 1 482.519 370.32 Tm
-(e) Tj
-1 0 0 1 486.839 370.32 Tm
-(xtra) Tj
-1 0 0 1 505.919 370.32 Tm
-(phase) Tj
-1 0 0 1 532.199 370.32 Tm
-(to) Tj
-1 0 0 1 315 358.44 Tm
-(the) Tj
-1 0 0 1 331.08 358.44 Tm
-(protocol:) Tj
-1 0 0 1 373.56 358.44 Tm
-(the) Tj
-1 0 0 1 389.64 358.44 Tm
-(primary) Tj
-1 0 0 1 425.04 358.44 Tm
-(obtains) Tj
-1 0 0 1 457.8 358.44 Tm
-(authenticated) Tj
-1 0 0 1 514.799 358.44 Tm
-(v) Tj
-1 0 0 1 519.599 358.44 Tm
-(alues) Tj
-1 0 0 1 315 346.44 Tm
-(proposed) Tj
-1 0 0 1 354.84 346.44 Tm
-(by) Tj
-1 0 0 1 368.04 346.44 Tm
-(the) Tj
-1 0 0 1 383.52 346.44 Tm
-(backups,) Tj
-1 0 0 1 422.04 346.44 Tm
-(concatenates) Tj
-1 0 0 1 476.279 346.44 Tm
-(2) Tj
-ET
-q
-5 0 0 -9.2 481.7 353.5 cm
-/R590 Do
-Q
-q
-6.6 0 0 -6.5 490.3 352.2 cm
-/R594 Do
-Q
-BT
-1 0 0 1 500.279 346.44 Tm
-(1) Tj
-1 0 0 1 508.559 346.44 Tm
-(of) Tj
-1 0 0 1 520.079 346.44 Tm
-(them) Tj
-1 0 0 1 315 334.56 Tm
-(with) Tj
-1 0 0 1 336.72 334.56 Tm
-(the) Tj
-1 0 0 1 352.92 334.56 Tm
-(associated) Tj
-1 0 0 1 397.92 334.56 Tm
-(request,) Tj
-1 0 0 1 433.68 334.56 Tm
-(and) Tj
-1 0 0 1 452.04 334.56 Tm
-(starts) Tj
-1 0 0 1 477.119 334.56 Tm
-(the) Tj
-1 0 0 1 493.319 334.56 Tm
-(three) Tj
-1 0 0 1 517.319 334.56 Tm
-(phase) Tj
-1 0 0 1 315 322.56 Tm
-(protocol) Tj
-1 0 0 1 350.88 322.56 Tm
-(for) Tj
-1 0 0 1 365.28 322.56 Tm
-(the) Tj
-1 0 0 1 380.16 322.56 Tm
-(concatenated) Tj
-1 0 0 1 434.88 322.56 Tm
-(message.) Tj
-1 0 0 1 475.319 322.56 Tm
-(Replicas) Tj
-1 0 0 1 512.279 322.56 Tm
-(choose) Tj
-1 0 0 1 315 310.68 Tm
-(the) Tj
-1 0 0 1 330.24 310.68 Tm
-(v) Tj
-1 0 0 1 335.04 310.68 Tm
-(alue) Tj
-1 0 0 1 354.6 310.68 Tm
-(by) Tj
-1 0 0 1 367.68 310.68 Tm
-(a) Tj
-1 0 0 1 375.12 310.68 Tm
-(deterministic) Tj
-1 0 0 1 430.2 310.68 Tm
-(computation) Tj
-1 0 0 1 482.999 310.68 Tm
-(on) Tj
-1 0 0 1 496.079 310.68 Tm
-(the) Tj
-1 0 0 1 511.319 310.68 Tm
-(2) Tj
-ET
-q
-5 0 0 -9.2 516.8 317.8 cm
-/R590 Do
-Q
-q
-6.6 0 0 -6.5 525.3 316.5 cm
-/R594 Do
-Q
-BT
-1 0 0 1 534.959 310.68 Tm
-(1) Tj
-1 0 0 1 315 298.68 Tm
-(v) Tj
-1 0 0 1 319.8 298.68 Tm
-(alues) Tj
-1 0 0 1 342.84 298.68 Tm
-(and) Tj
-1 0 0 1 359.88 298.68 Tm
-(their) Tj
-1 0 0 1 380.76 298.68 Tm
-(state,) Tj
-1 0 0 1 404.28 298.68 Tm
-(e.g.,) Tj
-1 0 0 1 423.84 298.68 Tm
-(taking) Tj
-1 0 0 1 451.32 298.68 Tm
-(the) Tj
-1 0 0 1 466.199 298.68 Tm
-(median.) Tj
-1 0 0 1 502.079 298.68 Tm
-(The) Tj
-1 0 0 1 520.199 298.68 Tm
-(e) Tj
-1 0 0 1 524.519 298.68 Tm
-(xtra) Tj
-1 0 0 1 315 286.8 Tm
-(phase) Tj
-1 0 0 1 340.8 286.8 Tm
-(can) Tj
-1 0 0 1 357.72 286.8 Tm
-(be) Tj
-1 0 0 1 370.2 286.8 Tm
-(optimized) Tj
-1 0 0 1 413.16 286.8 Tm
-(a) Tj
-1 0 0 1 417.48 286.8 Tm
-(w) Tj
-1 0 0 1 424.56 286.8 Tm
-(ay) Tj
-1 0 0 1 437.04 286.8 Tm
-(in) Tj
-1 0 0 1 447.96 286.8 Tm
-(the) Tj
-1 0 0 1 463.199 286.8 Tm
-(common) Tj
-1 0 0 1 501.239 286.8 Tm
-(case.) Tj
-1 0 0 1 526.319 286.8 Tm
-(F) Tj
-1 0 0 1 531.719 286.8 Tm
-(or) Tj
-1 0 0 1 315 274.8 Tm
-(e) Tj
-1 0 0 1 319.32 274.8 Tm
-(xample,) Tj
-1 0 0 1 354.24 274.8 Tm
-(if) Tj
-1 0 0 1 363.24 274.8 Tm
-(replicas) Tj
-1 0 0 1 397.2 274.8 Tm
-(need) Tj
-1 0 0 1 419.04 274.8 Tm
-(a) Tj
-1 0 0 1 426.48 274.8 Tm
-(v) Tj
-1 0 0 1 431.28 274.8 Tm
-(alue) Tj
-1 0 0 1 450.84 274.8 Tm
-(that) Tj
-1 0 0 1 468.719 274.8 Tm
-(is) Tj
-1 0 0 1 478.319 274.8 Tm
-(\252close) Tj
-1 0 0 1 506.279 274.8 Tm
-(enough\272) Tj
-1 0 0 1 315 262.92 Tm
-(to) Tj
-1 0 0 1 324.84 262.92 Tm
-(that) Tj
-1 0 0 1 341.88 262.92 Tm
-(of) Tj
-1 0 0 1 352.32 262.92 Tm
-(their) Tj
-1 0 0 1 372.72 262.92 Tm
-(local) Tj
-1 0 0 1 394.2 262.92 Tm
-(clock,) Tj
-1 0 0 1 420.48 262.92 Tm
-(the) Tj
-1 0 0 1 434.76 262.92 Tm
-(e) Tj
-1 0 0 1 439.079 262.92 Tm
-(xtra) Tj
-1 0 0 1 456.599 262.92 Tm
-(phase) Tj
-1 0 0 1 481.439 262.92 Tm
-(can) Tj
-1 0 0 1 497.399 262.92 Tm
-(be) Tj
-1 0 0 1 508.799 262.92 Tm
-(a) Tj
-1 0 0 1 512.999 262.92 Tm
-(v) Tj
-1 0 0 1 517.799 262.92 Tm
-(oided) Tj
-1 0 0 1 315 250.92 Tm
-(when) Tj
-1 0 0 1 339.12 250.92 Tm
-(their) Tj
-1 0 0 1 359.88 250.92 Tm
-(clocks) Tj
-1 0 0 1 387.72 250.92 Tm
-(are) Tj
-1 0 0 1 402.48 250.92 Tm
-(synchronized) Tj
-1 0 0 1 458.04 250.92 Tm
-(within) Tj
-1 0 0 1 485.999 250.92 Tm
-(some) Tj
-1 0 0 1 509.519 250.92 Tm
-(delta.) Tj
-/R610 12 Tf
-1 0 0 1 315 222.96 Tm
-(5) Tj
-1 0 0 1 332.88 222.96 Tm
-(Optimizations) Tj
-/R583 10 Tf
-1 0 0 1 315 205.44 Tm
-(This) Tj
-1 0 0 1 335.88 205.44 Tm
-(section) Tj
-1 0 0 1 367.2 205.44 Tm
-(describes) Tj
-1 0 0 1 407.4 205.44 Tm
-(some) Tj
-1 0 0 1 431.64 205.44 Tm
-(optimizations) Tj
-1 0 0 1 488.999 205.44 Tm
-(that) Tj
-1 0 0 1 507.119 205.44 Tm
-(impro) Tj
-1 0 0 1 530.999 205.44 Tm
-(v) Tj
-1 0 0 1 535.919 205.44 Tm
-(e) Tj
-1 0 0 1 315 193.56 Tm
-(the) Tj
-1 0 0 1 331.92 193.56 Tm
-(performance) Tj
-1 0 0 1 387 193.56 Tm
-(of) Tj
-1 0 0 1 400.08 193.56 Tm
-(the) Tj
-1 0 0 1 417 193.56 Tm
-(algorithm) Tj
-1 0 0 1 460.56 193.56 Tm
-(during) Tj
-1 0 0 1 491.279 193.56 Tm
-(normal-case) Tj
-1 0 0 1 315 181.56 Tm
-(operation.) Tj
-1 0 0 1 363.24 181.56 Tm
-(All) Tj
-1 0 0 1 380.04 181.56 Tm
-(the) Tj
-1 0 0 1 396.24 181.56 Tm
-(optimizations) Tj
-1 0 0 1 454.44 181.56 Tm
-(preserv) Tj
-1 0 0 1 483.839 181.56 Tm
-(e) Tj
-1 0 0 1 492.119 181.56 Tm
-(the) Tj
-1 0 0 1 508.319 181.56 Tm
-(li) Tj
-1 0 0 1 513.599 181.56 Tm
-(v) Tj
-1 0 0 1 518.519 181.56 Tm
-(eness) Tj
-1 0 0 1 315 169.68 Tm
-(and) Tj
-1 0 0 1 331.92 169.68 Tm
-(safety) Tj
-1 0 0 1 358.2 169.68 Tm
-(properties.) Tj
-/R610 10 Tf
-1 0 0 1 315 145.92 Tm
-(5.1) Tj
-1 0 0 1 337.44 145.92 Tm
-(Reducing) Tj
-1 0 0 1 380.28 145.92 Tm
-(Communication) Tj
-/R583 10 Tf
-1 0 0 1 315 130.68 Tm
-(W) Tj
-1 0 0 1 323.52 130.68 Tm
-(e) Tj
-1 0 0 1 334.8 130.68 Tm
-(use) Tj
-1 0 0 1 354.72 130.68 Tm
-(three) Tj
-1 0 0 1 381.36 130.68 Tm
-(optimizations) Tj
-1 0 0 1 442.32 130.68 Tm
-(to) Tj
-1 0 0 1 456.84 130.68 Tm
-(reduce) Tj
-1 0 0 1 490.079 130.68 Tm
-(the) Tj
-1 0 0 1 508.919 130.68 Tm
-(cost) Tj
-1 0 0 1 531.719 130.68 Tm
-(of) Tj
-1 0 0 1 315 118.8 Tm
-(communication.) Tj
-1 0 0 1 389.76 118.8 Tm
-(The) Tj
-1 0 0 1 409.92 118.8 Tm
-(\256rst) Tj
-1 0 0 1 430.2 118.8 Tm
-(a) Tj
-1 0 0 1 434.4 118.8 Tm
-(v) Tj
-1 0 0 1 439.2 118.8 Tm
-(oids) Tj
-1 0 0 1 460.44 118.8 Tm
-(sending) Tj
-1 0 0 1 496.2 118.8 Tm
-(most) Tj
-1 0 0 1 520.319 118.8 Tm
-(lar) Tj
-1 0 0 1 530.759 118.8 Tm
-(ge) Tj
-1 0 0 1 315 106.8 Tm
-(replies.) Tj
-1 0 0 1 352.92 106.8 Tm
-(A) Tj
-1 0 0 1 364.44 106.8 Tm
-(client) Tj
-1 0 0 1 390.84 106.8 Tm
-(request) Tj
-1 0 0 1 423.84 106.8 Tm
-(designates) Tj
-1 0 0 1 469.679 106.8 Tm
-(a) Tj
-1 0 0 1 478.319 106.8 Tm
-(replica) Tj
-1 0 0 1 509.759 106.8 Tm
-(to) Tj
-1 0 0 1 521.759 106.8 Tm
-(send) Tj
-1 0 0 1 315 94.92 Tm
-(the) Tj
-1 0 0 1 330.24 94.92 Tm
-(result;) Tj
-1 0 0 1 358.56 94.92 Tm
-(all) Tj
-1 0 0 1 371.64 94.92 Tm
-(other) Tj
-1 0 0 1 395.28 94.92 Tm
-(replicas) Tj
-1 0 0 1 429.36 94.92 Tm
-(send) Tj
-1 0 0 1 450.72 94.92 Tm
-(replies) Tj
-1 0 0 1 480.479 94.92 Tm
-(containing) Tj
-1 0 0 1 525.599 94.92 Tm
-(just) Tj
-1 0 0 1 315 82.92 Tm
-(the) Tj
-1 0 0 1 330.6 82.92 Tm
-(digest) Tj
-1 0 0 1 357.72 82.92 Tm
-(of) Tj
-1 0 0 1 369.48 82.92 Tm
-(the) Tj
-1 0 0 1 384.96 82.92 Tm
-(result.) Tj
-1 0 0 1 415.92 82.92 Tm
-(The) Tj
-1 0 0 1 434.76 82.92 Tm
-(digests) Tj
-1 0 0 1 465.84 82.92 Tm
-(allo) Tj
-1 0 0 1 480.599 82.92 Tm
-(w) Tj
-1 0 0 1 491.159 82.92 Tm
-(the) Tj
-1 0 0 1 506.759 82.92 Tm
-(client) Tj
-1 0 0 1 532.199 82.92 Tm
-(to) Tj
-1 0 0 1 315 71.04 Tm
-(check) Tj
-1 0 0 1 339.96 71.04 Tm
-(the) Tj
-1 0 0 1 353.76 71.04 Tm
-(correctness) Tj
-1 0 0 1 400.32 71.04 Tm
-(of) Tj
-1 0 0 1 410.28 71.04 Tm
-(the) Tj
-1 0 0 1 424.08 71.04 Tm
-(result) Tj
-1 0 0 1 447.84 71.04 Tm
-(while) Tj
-1 0 0 1 471.599 71.04 Tm
-(reducin) Tj
-1 0 0 1 501.599 71.04 Tm
-(g) Tj
-1 0 0 1 508.199 71.04 Tm
-(n) Tj
-1 0 0 1 513.119 71.04 Tm
-(etw) Tj
-1 0 0 1 527.399 71.04 Tm
-(or) Tj
-1 0 0 1 535.679 71.04 Tm
-(k) Tj
-1 0 0 1 303.48 35.16 Tm
-(7) Tj
-ET
-Q
-endstream
-endobj
-639 0 obj
-19357
-endobj
-640 0 obj
-<<
-/Type /Page
-/MediaBox [0 0 612 792]
-/Parent 2 0 R
-/Resources << /ProcSet [/PDF /ImageB /Text]
-/Font <<
-/R629 629 0 R
-/R610 610 0 R
-/R583 583 0 R
->>
-/XObject <<
-/R594 594 0 R
-/R590 590 0 R
-/R632 632 0 R
-/R636 636 0 R
-/R613 613 0 R
-/R625 625 0 R
-/R621 621 0 R
-/R617 617 0 R
-/R606 606 0 R
-/R602 602 0 R
-/R598 598 0 R
-/R586 586 0 R
->>
->>
-/Contents [
-584 0 R
-588 0 R
-592 0 R
-596 0 R
-600 0 R
-604 0 R
-608 0 R
-611 0 R
-615 0 R
-619 0 R
-623 0 R
-627 0 R
-630 0 R
-634 0 R
-638 0 R
-]
->>
-endobj
-641 0 obj
-<< /Type /Font /Name /R641 /Subtype /Type1 /BaseFont /Times-Roman >>
-endobj
-642 0 obj
-<< /Length 643 0 R >>
-stream
-q
-BT
-/R641 10 Tf
-1 0 0 1 72 709.08 Tm
-(bandwidth) Tj
-1 0 0 1 116.52 709.08 Tm
-(consumption) Tj
-1 0 0 1 170.4 709.08 Tm
-(and) Tj
-1 0 0 1 187.2 709.08 Tm
-(CPU) Tj
-1 0 0 1 209.04 709.08 Tm
-(o) Tj
-1 0 0 1 213.96 709.08 Tm
-(v) Tj
-1 0 0 1 218.88 709.08 Tm
-(erhead) Tj
-1 0 0 1 247.68 709.08 Tm
-(signi\256cantly) Tj
-1 0 0 1 72 697.08 Tm
-(for) Tj
-1 0 0 1 86.6399 697.08 Tm
-(lar) Tj
-1 0 0 1 97.0799 697.08 Tm
-(ge) Tj
-1 0 0 1 109.32 697.08 Tm
-(replies.) Tj
-1 0 0 1 143.52 697.08 Tm
-(If) Tj
-1 0 0 1 153.24 697.08 Tm
-(the) Tj
-1 0 0 1 168.36 697.08 Tm
-(client) Tj
-1 0 0 1 193.559 697.08 Tm
-(does) Tj
-1 0 0 1 214.799 697.08 Tm
-(not) Tj
-1 0 0 1 230.519 697.08 Tm
-(recei) Tj
-1 0 0 1 249.719 697.08 Tm
-(v) Tj
-1 0 0 1 254.639 697.08 Tm
-(e) Tj
-1 0 0 1 261.959 697.08 Tm
-(a) Tj
-1 0 0 1 269.399 697.08 Tm
-(correct) Tj
-1 0 0 1 72 685.2 Tm
-(result) Tj
-1 0 0 1 99.3599 685.2 Tm
-(from) Tj
-1 0 0 1 123.96 685.2 Tm
-(the) Tj
-1 0 0 1 141.24 685.2 Tm
-(designated) Tj
-1 0 0 1 189.12 685.2 Tm
-(replica,) Tj
-1 0 0 1 224.64 685.2 Tm
-(it) Tj
-1 0 0 1 235.32 685.2 Tm
-(retransmits) Tj
-1 0 0 1 284.879 685.2 Tm
-(the) Tj
-1 0 0 1 72 673.2 Tm
-(request) Tj
-1 0 0 1 105.96 673.2 Tm
-(as) Tj
-1 0 0 1 119.4 673.2 Tm
-(usual,) Tj
-1 0 0 1 148.8 673.2 Tm
-(requesting) Tj
-1 0 0 1 195.48 673.2 Tm
-(all) Tj
-1 0 0 1 210.6 673.2 Tm
-(replicas) Tj
-1 0 0 1 246.84 673.2 Tm
-(to) Tj
-1 0 0 1 259.679 673.2 Tm
-(send) Tj
-1 0 0 1 283.199 673.2 Tm
-(full) Tj
-1 0 0 1 72 661.32 Tm
-(replies.) Tj
-1 0 0 1 81.96 648.84 Tm
-(The) Tj
-1 0 0 1 104.16 648.84 Tm
-(second) Tj
-1 0 0 1 138.48 648.84 Tm
-(optimization) Tj
-1 0 0 1 195.6 648.84 Tm
-(reduces) Tj
-1 0 0 1 232.68 648.84 Tm
-(the) Tj
-1 0 0 1 251.519 648.84 Tm
-(number) Tj
-1 0 0 1 288.719 648.84 Tm
-(of) Tj
-1 0 0 1 72 636.84 Tm
-(message) Tj
-1 0 0 1 111.6 636.84 Tm
-(delays) Tj
-1 0 0 1 143.04 636.84 Tm
-(for) Tj
-1 0 0 1 160.56 636.84 Tm
-(an) Tj
-1 0 0 1 175.8 636.84 Tm
-(operation) Tj
-1 0 0 1 219.36 636.84 Tm
-(in) Tj
-1 0 0 1 226.8 636.84 Tm
-(v) Tj
-1 0 0 1 231.6 636.84 Tm
-(ocation) Tj
-1 0 0 1 266.759 636.84 Tm
-(from) Tj
-1 0 0 1 291.959 636.84 Tm
-(5) Tj
-1 0 0 1 72 624.96 Tm
-(to) Tj
-1 0 0 1 84.48 624.96 Tm
-(4.) Tj
-1 0 0 1 102.36 624.96 Tm
-(Replicas) Tj
-1 0 0 1 141.36 624.96 Tm
-(e) Tj
-1 0 0 1 145.68 624.96 Tm
-(x) Tj
-1 0 0 1 150.6 624.96 Tm
-(ecute) Tj
-1 0 0 1 176.28 624.96 Tm
-(a) Tj
-1 0 0 1 185.4 624.96 Tm
-(request) Tj
-ET
-endstream
-endobj
-643 0 obj
-2300
-endobj
-644 0 obj
-<< /Type /Font /Name /R644 /Subtype /Type1 /BaseFont /Times-Italic >>
-endobj
-645 0 obj
-<< /Length 646 0 R >>
-stream
-BT
-/R644 10 Tf
-1 0 0 1 218.88 624.96 Tm
-(tentatively) Tj
-/R641 10 Tf
-1 0 0 1 265.199 624.96 Tm
-(as) Tj
-1 0 0 1 278.159 624.96 Tm
-(soon) Tj
-1 0 0 1 72 612.96 Tm
-(as) Tj
-1 0 0 1 84.9599 612.96 Tm
-(the) Tj
-1 0 0 1 101.88 612.96 Tm
-(prepared) Tj
-1 0 0 1 141.48 612.96 Tm
-(predicate) Tj
-1 0 0 1 182.64 612.96 Tm
-(holds) Tj
-1 0 0 1 209.04 612.96 Tm
-(for) Tj
-1 0 0 1 225.359 612.96 Tm
-(the) Tj
-1 0 0 1 242.159 612.96 Tm
-(request,) Tj
-1 0 0 1 278.759 612.96 Tm
-(their) Tj
-1 0 0 1 72 601.08 Tm
-(state) Tj
-1 0 0 1 94.7999 601.08 Tm
-(re\257ects) Tj
-1 0 0 1 128.16 601.08 Tm
-(the) Tj
-1 0 0 1 144.84 601.08 Tm
-(e) Tj
-1 0 0 1 149.16 601.08 Tm
-(x) Tj
-1 0 0 1 154.08 601.08 Tm
-(ecution) Tj
-1 0 0 1 187.8 601.08 Tm
-(of) Tj
-1 0 0 1 200.64 601.08 Tm
-(all) Tj
-1 0 0 1 215.159 601.08 Tm
-(requests) Tj
-1 0 0 1 252.359 601.08 Tm
-(with) Tj
-1 0 0 1 274.559 601.08 Tm
-(lo) Tj
-1 0 0 1 282.119 601.08 Tm
-(wer) Tj
-1 0 0 1 72 589.08 Tm
-(sequence) Tj
-1 0 0 1 112.44 589.08 Tm
-(number) Tj
-1 0 0 1 142.8 589.08 Tm
-(,) Tj
-1 0 0 1 149.28 589.08 Tm
-(and) Tj
-1 0 0 1 167.52 589.08 Tm
-(these) Tj
-1 0 0 1 191.88 589.08 Tm
-(requests) Tj
-1 0 0 1 228.48 589.08 Tm
-(are) Tj
-1 0 0 1 244.56 589.08 Tm
-(all) Tj
-1 0 0 1 258.479 589.08 Tm
-(kno) Tj
-1 0 0 1 273.359 589.08 Tm
-(wn) Tj
-1 0 0 1 289.199 589.08 Tm
-(to) Tj
-1 0 0 1 72 577.2 Tm
-(ha) Tj
-1 0 0 1 81.24 577.2 Tm
-(v) Tj
-1 0 0 1 86.16 577.2 Tm
-(e) Tj
-1 0 0 1 92.3999 577.2 Tm
-(committed.) Tj
-1 0 0 1 141 577.2 Tm
-(After) Tj
-1 0 0 1 163.92 577.2 Tm
-(e) Tj
-1 0 0 1 168.24 577.2 Tm
-(x) Tj
-1 0 0 1 173.16 577.2 Tm
-(ecuting) Tj
-1 0 0 1 204.36 577.2 Tm
-(the) Tj
-1 0 0 1 218.52 577.2 Tm
-(request,) Tj
-1 0 0 1 251.879 577.2 Tm
-(the) Tj
-1 0 0 1 266.039 577.2 Tm
-(replicas) Tj
-1 0 0 1 72 565.2 Tm
-(send) Tj
-1 0 0 1 93.4799 565.2 Tm
-(tentati) Tj
-1 0 0 1 118.2 565.2 Tm
-(v) Tj
-1 0 0 1 123.12 565.2 Tm
-(e) Tj
-1 0 0 1 130.56 565.2 Tm
-(replies) Tj
-1 0 0 1 160.44 565.2 Tm
-(to) Tj
-1 0 0 1 171.36 565.2 Tm
-(the) Tj
-1 0 0 1 186.72 565.2 Tm
-(client.) Tj
-1 0 0 1 217.199 565.2 Tm
-(The) Tj
-1 0 0 1 235.919 565.2 Tm
-(client) Tj
-1 0 0 1 261.239 565.2 Tm
-(w) Tj
-1 0 0 1 268.319 565.2 Tm
-(aits) Tj
-1 0 0 1 285.359 565.2 Tm
-(for) Tj
-1 0 0 1 72 553.32 Tm
-(2) Tj
-ET
-Q
-q
-W
-0 0 612 792 re
-n
-endstream
-endobj
-646 0 obj
-2166
-endobj
-647 0 obj
-<< /Type /XObject /Name /R647 /Subtype /Image /Length 648 0 R
-/ImageMask true /Width 50 /Height 92 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 50 /BlackIs1 true >>]
->>
-stream
-5$eL7-b:K3p0<%?
-h1u#R]2'Mug].5is7$!eqtL-hqu?EZs5/V3iQXZVs7/ihqu?EZs4QRbJe-ans*o2/4DdB_@6aqq5Q~>
-endstream
-endobj
-648 0 obj
-96
-endobj
-649 0 obj
-<< /Length 650 0 R >>
-stream
-q
-5 0 0 -9.2 77.4 560.4 cm
-/R647 Do
-Q
-endstream
-endobj
-650 0 obj
-38
-endobj
-651 0 obj
-<< /Type /XObject /Name /R651 /Subtype /Image /Length 652 0 R
-/ImageMask true /Width 66 /Height 65 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 66 /BlackIs1 true >>]
->>
-stream
-,BZ6Ns8W-!s8W-!s-Eq9Iaj?!s8W-!s8W-!s8Uf'#QTA~>
-endstream
-endobj
-652 0 obj
-47
-endobj
-653 0 obj
-<< /Length 654 0 R >>
-stream
-q
-6.6 0 0 -6.5 86.7 559.1 cm
-/R651 Do
-Q
-BT
-/R641 10 Tf
-1 0 0 1 97.1999 553.32 Tm
-(1) Tj
-1 0 0 1 106.68 553.32 Tm
-(matching) Tj
-1 0 0 1 148.2 553.32 Tm
-(tentati) Tj
-1 0 0 1 172.92 553.32 Tm
-(v) Tj
-1 0 0 1 177.84 553.32 Tm
-(e) Tj
-1 0 0 1 186.48 553.32 Tm
-(replies.) Tj
-1 0 0 1 224.879 553.32 Tm
-(If) Tj
-1 0 0 1 236.039 553.32 Tm
-(it) Tj
-1 0 0 1 245.999 553.32 Tm
-(recei) Tj
-1 0 0 1 265.199 553.32 Tm
-(v) Tj
-1 0 0 1 270.119 553.32 Tm
-(es) Tj
-1 0 0 1 282.599 553.32 Tm
-(this) Tj
-1 0 0 1 72 541.32 Tm
-(man) Tj
-1 0 0 1 89.16 541.32 Tm
-(y) Tj
-1 0 0 1 93.6 541.32 Tm
-(,) Tj
-1 0 0 1 100.32 541.32 Tm
-(the) Tj
-1 0 0 1 116.52 541.32 Tm
-(request) Tj
-1 0 0 1 149.28 541.32 Tm
-(is) Tj
-1 0 0 1 159.96 541.32 Tm
-(guaranteed) Tj
-1 0 0 1 207.72 541.32 Tm
-(to) Tj
-1 0 0 1 219.6 541.32 Tm
-(commit) Tj
-1 0 0 1 254.04 541.32 Tm
-(e) Tj
-1 0 0 1 258.239 541.32 Tm
-(v) Tj
-1 0 0 1 263.159 541.32 Tm
-(entually) Tj
-1 0 0 1 294.839 541.32 Tm
-(.) Tj
-1 0 0 1 72 529.44 Tm
-(Otherwise,) Tj
-1 0 0 1 119.52 529.44 Tm
-(the) Tj
-1 0 0 1 135.48 529.44 Tm
-(client) Tj
-1 0 0 1 161.4 529.44 Tm
-(retransmits) Tj
-1 0 0 1 209.4 529.44 Tm
-(the) Tj
-1 0 0 1 225.36 529.44 Tm
-(request) Tj
-1 0 0 1 257.879 529.44 Tm
-(and) Tj
-1 0 0 1 276.119 529.44 Tm
-(w) Tj
-1 0 0 1 283.199 529.44 Tm
-(aits) Tj
-1 0 0 1 72 517.44 Tm
-(for) Tj
-ET
-q
-5 0 0 -9.2 86.6 524.5 cm
-/R647 Do
-Q
-q
-6.6 0 0 -6.5 94.8 523.2 cm
-/R651 Do
-Q
-BT
-1 0 0 1 104.28 517.44 Tm
-(1) Tj
-1 0 0 1 111.72 517.44 Tm
-(non-tentati) Tj
-1 0 0 1 154.92 517.44 Tm
-(v) Tj
-1 0 0 1 159.84 517.44 Tm
-(e) Tj
-1 0 0 1 166.32 517.44 Tm
-(replies.) Tj
-1 0 0 1 81.96 504.96 Tm
-(A) Tj
-1 0 0 1 93 504.96 Tm
-(request) Tj
-1 0 0 1 125.52 504.96 Tm
-(that) Tj
-1 0 0 1 144.24 504.96 Tm
-(has) Tj
-1 0 0 1 161.28 504.96 Tm
-(e) Tj
-1 0 0 1 165.6 504.96 Tm
-(x) Tj
-1 0 0 1 170.52 504.96 Tm
-(ecuted) Tj
-1 0 0 1 200.28 504.96 Tm
-(tentati) Tj
-1 0 0 1 225 504.96 Tm
-(v) Tj
-1 0 0 1 229.92 504.96 Tm
-(ely) Tj
-1 0 0 1 245.639 504.96 Tm
-(may) Tj
-1 0 0 1 266.639 504.96 Tm
-(abort) Tj
-1 0 0 1 290.879 504.96 Tm
-(if) Tj
-1 0 0 1 72 493.08 Tm
-(there) Tj
-1 0 0 1 97.0799 493.08 Tm
-(is) Tj
-1 0 0 1 108.84 493.08 Tm
-(a) Tj
-1 0 0 1 118.44 493.08 Tm
-(vie) Tj
-1 0 0 1 130.44 493.08 Tm
-(w) Tj
-1 0 0 1 142.68 493.08 Tm
-(change) Tj
-1 0 0 1 176.04 493.08 Tm
-(and) Tj
-1 0 0 1 195.48 493.08 Tm
-(it) Tj
-1 0 0 1 206.16 493.08 Tm
-(is) Tj
-1 0 0 1 217.92 493.08 Tm
-(replaced) Tj
-1 0 0 1 256.799 493.08 Tm
-(by) Tj
-1 0 0 1 271.919 493.08 Tm
-(a) Tj
-/R644 10 Tf
-1 0 0 1 281.519 493.08 Tm
-(null) Tj
-/R641 10 Tf
-1 0 0 1 72 481.08 Tm
-(request.) Tj
-1 0 0 1 110.4 481.08 Tm
-(In) Tj
-1 0 0 1 122.4 481.08 Tm
-(this) Tj
-1 0 0 1 140.52 481.08 Tm
-(case) Tj
-1 0 0 1 161.28 481.08 Tm
-(the) Tj
-1 0 0 1 177.12 481.08 Tm
-(replica) Tj
-1 0 0 1 207.96 481.08 Tm
-(re) Tj
-1 0 0 1 215.519 481.08 Tm
-(v) Tj
-1 0 0 1 220.439 481.08 Tm
-(erts) Tj
-1 0 0 1 238.319 481.08 Tm
-(its) Tj
-1 0 0 1 251.399 481.08 Tm
-(state) Tj
-1 0 0 1 273.359 481.08 Tm
-(to) Tj
-1 0 0 1 284.879 481.08 Tm
-(the) Tj
-1 0 0 1 72 469.2 Tm
-(last) Tj
-1 0 0 1 88.7999 469.2 Tm
-(stable) Tj
-1 0 0 1 114.96 469.2 Tm
-(checkpoint) Tj
-1 0 0 1 161.52 469.2 Tm
-(in) Tj
-1 0 0 1 172.2 469.2 Tm
-(the) Tj
-1 0 0 1 187.32 469.2 Tm
-(ne) Tj
-1 0 0 1 196.56 469.2 Tm
-(w-vie) Tj
-1 0 0 1 219.12 469.2 Tm
-(w) Tj
-1 0 0 1 229.08 469.2 Tm
-(message) Tj
-1 0 0 1 265.679 469.2 Tm
-(or) Tj
-1 0 0 1 276.959 469.2 Tm
-(to) Tj
-1 0 0 1 287.639 469.2 Tm
-(its) Tj
-1 0 0 1 72 457.2 Tm
-(last) Tj
-1 0 0 1 88.4399 457.2 Tm
-(checkpointed) Tj
-1 0 0 1 144.12 457.2 Tm
-(state) Tj
-1 0 0 1 165 457.2 Tm
-(\(depending) Tj
-1 0 0 1 212.4 457.2 Tm
-(on) Tj
-1 0 0 1 225 457.2 Tm
-(which) Tj
-1 0 0 1 251.999 457.2 Tm
-(one) Tj
-1 0 0 1 268.919 457.2 Tm
-(has) Tj
-1 0 0 1 284.879 457.2 Tm
-(the) Tj
-1 0 0 1 72 445.32 Tm
-(higher) Tj
-1 0 0 1 99.9599 445.32 Tm
-(sequence) Tj
-1 0 0 1 138.96 445.32 Tm
-(number\).) Tj
-1 0 0 1 81.96 432.84 Tm
-(The) Tj
-1 0 0 1 101.28 432.84 Tm
-(third) Tj
-1 0 0 1 123.84 432.84 Tm
-(optimization) Tj
-1 0 0 1 178.08 432.84 Tm
-(impro) Tj
-1 0 0 1 201.96 432.84 Tm
-(v) Tj
-1 0 0 1 206.88 432.84 Tm
-(es) Tj
-1 0 0 1 218.64 432.84 Tm
-(the) Tj
-1 0 0 1 234.6 432.84 Tm
-(performance) Tj
-1 0 0 1 288.719 432.84 Tm
-(of) Tj
-1 0 0 1 72 420.84 Tm
-(read-only) Tj
-1 0 0 1 115.68 420.84 Tm
-(operations) Tj
-1 0 0 1 162.72 420.84 Tm
-(that) Tj
-1 0 0 1 183.12 420.84 Tm
-(do) Tj
-1 0 0 1 198.6 420.84 Tm
-(not) Tj
-1 0 0 1 216.84 420.84 Tm
-(modify) Tj
-1 0 0 1 251.159 420.84 Tm
-(the) Tj
-1 0 0 1 268.799 420.84 Tm
-(service) Tj
-1 0 0 1 72 408.96 Tm
-(state.) Tj
-1 0 0 1 103.68 408.96 Tm
-(A) Tj
-1 0 0 1 115.8 408.96 Tm
-(client) Tj
-1 0 0 1 142.8 408.96 Tm
-(multicasts) Tj
-1 0 0 1 188.16 408.96 Tm
-(a) Tj
-1 0 0 1 197.52 408.96 Tm
-(read-only) Tj
-1 0 0 1 240.599 408.96 Tm
-(request) Tj
-1 0 0 1 274.319 408.96 Tm
-(to) Tj
-1 0 0 1 287.039 408.96 Tm
-(all) Tj
-1 0 0 1 72 396.96 Tm
-(replicas.) Tj
-1 0 0 1 113.76 396.96 Tm
-(Replicas) Tj
-1 0 0 1 152.16 396.96 Tm
-(e) Tj
-1 0 0 1 156.48 396.96 Tm
-(x) Tj
-1 0 0 1 161.4 396.96 Tm
-(ecute) Tj
-1 0 0 1 186.36 396.96 Tm
-(the) Tj
-1 0 0 1 202.56 396.96 Tm
-(request) Tj
-1 0 0 1 235.319 396.96 Tm
-(immediately) Tj
-1 0 0 1 289.199 396.96 Tm
-(in) Tj
-1 0 0 1 72 385.08 Tm
-(their) Tj
-1 0 0 1 95.0399 385.08 Tm
-(tentati) Tj
-1 0 0 1 119.76 385.08 Tm
-(v) Tj
-1 0 0 1 124.68 385.08 Tm
-(e) Tj
-1 0 0 1 133.68 385.08 Tm
-(state) Tj
-1 0 0 1 156.6 385.08 Tm
-(after) Tj
-1 0 0 1 179.64 385.08 Tm
-(checking) Tj
-1 0 0 1 220.32 385.08 Tm
-(that) Tj
-1 0 0 1 239.999 385.08 Tm
-(the) Tj
-1 0 0 1 256.799 385.08 Tm
-(request) Tj
-1 0 0 1 290.399 385.08 Tm
-(is) Tj
-1 0 0 1 72 373.08 Tm
-(properly) Tj
-1 0 0 1 110.04 373.08 Tm
-(authenticated,) Tj
-1 0 0 1 170.4 373.08 Tm
-(that) Tj
-1 0 0 1 189.6 373.08 Tm
-(the) Tj
-1 0 0 1 206.04 373.08 Tm
-(client) Tj
-1 0 0 1 232.439 373.08 Tm
-(has) Tj
-1 0 0 1 249.959 373.08 Tm
-(access,) Tj
-1 0 0 1 282.599 373.08 Tm
-(and) Tj
-1 0 0 1 72 361.2 Tm
-(that) Tj
-1 0 0 1 89.6399 361.2 Tm
-(the) Tj
-1 0 0 1 104.52 361.2 Tm
-(request) Tj
-1 0 0 1 135.96 361.2 Tm
-(is) Tj
-1 0 0 1 145.32 361.2 Tm
-(in) Tj
-1 0 0 1 155.88 361.2 Tm
-(f) Tj
-1 0 0 1 159.12 361.2 Tm
-(act) Tj
-1 0 0 1 173.4 361.2 Tm
-(read-only) Tj
-1 0 0 1 211.32 361.2 Tm
-(.) Tj
-1 0 0 1 217.679 361.2 Tm
-(The) Tj
-1 0 0 1 233.159 361.2 Tm
-(y) Tj
-1 0 0 1 240.719 361.2 Tm
-(send) Tj
-1 0 0 1 261.599 361.2 Tm
-(the) Tj
-1 0 0 1 276.479 361.2 Tm
-(reply) Tj
-1 0 0 1 72 349.2 Tm
-(only) Tj
-1 0 0 1 92.1599 349.2 Tm
-(after) Tj
-1 0 0 1 112.8 349.2 Tm
-(all) Tj
-1 0 0 1 125.16 349.2 Tm
-(requests) Tj
-1 0 0 1 160.2 349.2 Tm
-(re\257ected) Tj
-1 0 0 1 196.8 349.2 Tm
-(in) Tj
-1 0 0 1 207 349.2 Tm
-(the) Tj
-1 0 0 1 221.519 349.2 Tm
-(tentati) Tj
-1 0 0 1 246.239 349.2 Tm
-(v) Tj
-1 0 0 1 251.159 349.2 Tm
-(e) Tj
-1 0 0 1 257.879 349.2 Tm
-(state) Tj
-1 0 0 1 278.519 349.2 Tm
-(ha) Tj
-1 0 0 1 287.759 349.2 Tm
-(v) Tj
-1 0 0 1 292.679 349.2 Tm
-(e) Tj
-1 0 0 1 72 337.32 Tm
-(committed;) Tj
-1 0 0 1 121.44 337.32 Tm
-(this) Tj
-1 0 0 1 139.44 337.32 Tm
-(is) Tj
-1 0 0 1 149.64 337.32 Tm
-(necessary) Tj
-1 0 0 1 191.88 337.32 Tm
-(to) Tj
-1 0 0 1 203.16 337.32 Tm
-(pre) Tj
-1 0 0 1 215.759 337.32 Tm
-(v) Tj
-1 0 0 1 220.679 337.32 Tm
-(ent) Tj
-1 0 0 1 236.159 337.32 Tm
-(the) Tj
-1 0 0 1 251.999 337.32 Tm
-(client) Tj
-1 0 0 1 277.679 337.32 Tm
-(from) Tj
-1 0 0 1 72 325.32 Tm
-(observing) Tj
-1 0 0 1 113.4 325.32 Tm
-(uncommitted) Tj
-1 0 0 1 168 325.32 Tm
-(state.) Tj
-1 0 0 1 192.24 325.32 Tm
-(The) Tj
-1 0 0 1 209.76 325.32 Tm
-(client) Tj
-1 0 0 1 234 325.32 Tm
-(w) Tj
-1 0 0 1 241.08 325.32 Tm
-(aits) Tj
-1 0 0 1 257.039 325.32 Tm
-(for) Tj
-1 0 0 1 270.719 325.32 Tm
-(2) Tj
-ET
-q
-5 0 0 -9.2 276.2 332.4 cm
-/R647 Do
-Q
-q
-6.6 0 0 -6.5 283.5 331.1 cm
-/R651 Do
-Q
-BT
-1 0 0 1 292.079 325.32 Tm
-(1) Tj
-1 0 0 1 72 313.44 Tm
-(replies) Tj
-1 0 0 1 101.28 313.44 Tm
-(from) Tj
-1 0 0 1 123.36 313.44 Tm
-(dif) Tj
-1 0 0 1 134.28 313.44 Tm
-(ferent) Tj
-1 0 0 1 160.2 313.44 Tm
-(replicas) Tj
-1 0 0 1 193.92 313.44 Tm
-(with) Tj
-1 0 0 1 214.44 313.44 Tm
-(the) Tj
-1 0 0 1 229.32 313.44 Tm
-(same) Tj
-1 0 0 1 252.479 313.44 Tm
-(result.) Tj
-1 0 0 1 281.519 313.44 Tm
-(The) Tj
-1 0 0 1 72 301.44 Tm
-(client) Tj
-1 0 0 1 95.9999 301.44 Tm
-(may) Tj
-1 0 0 1 115.08 301.44 Tm
-(be) Tj
-1 0 0 1 126.48 301.44 Tm
-(unable) Tj
-1 0 0 1 154.92 301.44 Tm
-(to) Tj
-1 0 0 1 164.52 301.44 Tm
-(collect) Tj
-1 0 0 1 193.08 301.44 Tm
-(2) Tj
-ET
-q
-5 0 0 -9.2 198.5 308.5 cm
-/R647 Do
-Q
-q
-6.6 0 0 -6.5 205.3 307.2 cm
-/R651 Do
-Q
-BT
-1 0 0 1 213.599 301.44 Tm
-(1) Tj
-1 0 0 1 220.439 301.44 Tm
-(such) Tj
-1 0 0 1 240.599 301.44 Tm
-(replies) Tj
-1 0 0 1 269.039 301.44 Tm
-(if) Tj
-1 0 0 1 277.079 301.44 Tm
-(there) Tj
-1 0 0 1 72 289.56 Tm
-(are) Tj
-1 0 0 1 86.6399 289.56 Tm
-(concurrent) Tj
-1 0 0 1 131.76 289.56 Tm
-(writes) Tj
-1 0 0 1 158.64 289.56 Tm
-(to) Tj
-1 0 0 1 168.84 289.56 Tm
-(data) Tj
-1 0 0 1 187.92 289.56 Tm
-(that) Tj
-1 0 0 1 205.319 289.56 Tm
-(af) Tj
-1 0 0 1 212.879 289.56 Tm
-(fect) Tj
-1 0 0 1 230.279 289.56 Tm
-(the) Tj
-1 0 0 1 244.919 289.56 Tm
-(result;) Tj
-1 0 0 1 272.399 289.56 Tm
-(in) Tj
-1 0 0 1 282.599 289.56 Tm
-(this) Tj
-1 0 0 1 72 277.56 Tm
-(case,) Tj
-1 0 0 1 96.1199 277.56 Tm
-(it) Tj
-1 0 0 1 105.72 277.56 Tm
-(retransmits) Tj
-1 0 0 1 154.08 277.56 Tm
-(the) Tj
-1 0 0 1 170.28 277.56 Tm
-(request) Tj
-1 0 0 1 203.04 277.56 Tm
-(as) Tj
-1 0 0 1 215.4 277.56 Tm
-(a) Tj
-1 0 0 1 223.92 277.56 Tm
-(re) Tj
-1 0 0 1 231.6 277.56 Tm
-(gular) Tj
-1 0 0 1 256.079 277.56 Tm
-(read-write) Tj
-1 0 0 1 72 265.68 Tm
-(request) Tj
-1 0 0 1 103.32 265.68 Tm
-(after) Tj
-1 0 0 1 123.96 265.68 Tm
-(its) Tj
-1 0 0 1 135.96 265.68 Tm
-(retransmission) Tj
-1 0 0 1 196.56 265.68 Tm
-(timer) Tj
-1 0 0 1 220.079 265.68 Tm
-(e) Tj
-1 0 0 1 224.399 265.68 Tm
-(xpires.) Tj
-ET
-endstream
-endobj
-654 0 obj
-9324
-endobj
-655 0 obj
-<< /Type /Font /Name /R655 /Subtype /Type1 /BaseFont /Times-Bold >>
-endobj
-656 0 obj
-<< /Length 657 0 R >>
-stream
-BT
-/R655 10 Tf
-1 0 0 1 72 241.92 Tm
-(5.2) Tj
-1 0 0 1 94.4399 241.92 Tm
-(Cryptograph) Tj
-1 0 0 1 150.48 241.92 Tm
-(y) Tj
-/R641 10 Tf
-1 0 0 1 72 226.8 Tm
-(In) Tj
-1 0 0 1 86.4 226.8 Tm
-(Section) Tj
-1 0 0 1 122.28 226.8 Tm
-(4,) Tj
-1 0 0 1 136.68 226.8 Tm
-(we) Tj
-1 0 0 1 154.32 226.8 Tm
-(described) Tj
-1 0 0 1 198.6 226.8 Tm
-(an) Tj
-1 0 0 1 214.08 226.8 Tm
-(algorithm) Tj
-1 0 0 1 258.839 226.8 Tm
-(that) Tj
-1 0 0 1 279.839 226.8 Tm
-(uses) Tj
-1 0 0 1 72 214.8 Tm
-(digital) Tj
-1 0 0 1 99.8399 214.8 Tm
-(signatures) Tj
-1 0 0 1 142.56 214.8 Tm
-(to) Tj
-1 0 0 1 152.64 214.8 Tm
-(authenticate) Tj
-1 0 0 1 203.04 214.8 Tm
-(all) Tj
-1 0 0 1 215.399 214.8 Tm
-(messages.) Tj
-1 0 0 1 259.079 214.8 Tm
-(Ho) Tj
-1 0 0 1 271.079 214.8 Tm
-(we) Tj
-1 0 0 1 282.479 214.8 Tm
-(v) Tj
-1 0 0 1 287.399 214.8 Tm
-(er) Tj
-1 0 0 1 294.839 214.8 Tm
-(,) Tj
-1 0 0 1 72 202.92 Tm
-(we) Tj
-1 0 0 1 90.8399 202.92 Tm
-(actually) Tj
-1 0 0 1 129.72 202.92 Tm
-(use) Tj
-1 0 0 1 150.24 202.92 Tm
-(digital) Tj
-1 0 0 1 183 202.92 Tm
-(signatures) Tj
-1 0 0 1 230.639 202.92 Tm
-(only) Tj
-1 0 0 1 255.719 202.92 Tm
-(for) Tj
-1 0 0 1 274.559 202.92 Tm
-(vie) Tj
-1 0 0 1 286.559 202.92 Tm
-(w-) Tj
-1 0 0 1 72 190.92 Tm
-(change) Tj
-1 0 0 1 103.92 190.92 Tm
-(and) Tj
-1 0 0 1 121.92 190.92 Tm
-(ne) Tj
-1 0 0 1 131.16 190.92 Tm
-(w-vie) Tj
-1 0 0 1 153.72 190.92 Tm
-(w) Tj
-1 0 0 1 164.4 190.92 Tm
-(messages,) Tj
-1 0 0 1 208.44 190.92 Tm
-(which) Tj
-1 0 0 1 236.4 190.92 Tm
-(are) Tj
-1 0 0 1 252.239 190.92 Tm
-(sent) Tj
-1 0 0 1 271.919 190.92 Tm
-(rarely) Tj
-1 0 0 1 294.719 190.92 Tm
-(,) Tj
-1 0 0 1 72 179.04 Tm
-(and) Tj
-1 0 0 1 92.88 179.04 Tm
-(authenticate) Tj
-1 0 0 1 147.6 179.04 Tm
-(all) Tj
-1 0 0 1 164.04 179.04 Tm
-(other) Tj
-1 0 0 1 191.04 179.04 Tm
-(messages) Tj
-1 0 0 1 235.2 179.04 Tm
-(using) Tj
-1 0 0 1 263.279 179.04 Tm
-(message) Tj
-1 0 0 1 72 167.04 Tm
-(authentication) Tj
-1 0 0 1 131.4 167.04 Tm
-(codes) Tj
-1 0 0 1 157.08 167.04 Tm
-(\(MA) Tj
-1 0 0 1 176.16 167.04 Tm
-(Cs\).) Tj
-1 0 0 1 197.4 167.04 Tm
-(This) Tj
-1 0 0 1 218.04 167.04 Tm
-(eliminates) Tj
-1 0 0 1 261.959 167.04 Tm
-(the) Tj
-1 0 0 1 277.079 167.04 Tm
-(main) Tj
-1 0 0 1 72 155.16 Tm
-(performance) Tj
-1 0 0 1 124.8 155.16 Tm
-(bottleneck) Tj
-1 0 0 1 168.84 155.16 Tm
-(in) Tj
-1 0 0 1 179.04 155.16 Tm
-(pre) Tj
-1 0 0 1 191.64 155.16 Tm
-(vious) Tj
-1 0 0 1 215.64 155.16 Tm
-(systems) Tj
-1 0 0 1 249.719 155.16 Tm
-([29) Tj
-1 0 0 1 262.919 155.16 Tm
-(,) Tj
-1 0 0 1 267.959 155.16 Tm
-(22) Tj
-1 0 0 1 277.919 155.16 Tm
-(].) Tj
-1 0 0 1 81.96 142.68 Tm
-(Ho) Tj
-1 0 0 1 93.96 142.68 Tm
-(we) Tj
-1 0 0 1 105.36 142.68 Tm
-(v) Tj
-1 0 0 1 110.28 142.68 Tm
-(er) Tj
-1 0 0 1 117.72 142.68 Tm
-(,) Tj
-1 0 0 1 123.72 142.68 Tm
-(MA) Tj
-1 0 0 1 139.44 142.68 Tm
-(Cs) Tj
-1 0 0 1 153.36 142.68 Tm
-(ha) Tj
-1 0 0 1 162.6 142.68 Tm
-(v) Tj
-1 0 0 1 167.52 142.68 Tm
-(e) Tj
-1 0 0 1 175.32 142.68 Tm
-(a) Tj
-1 0 0 1 183.24 142.68 Tm
-(fundamental) Tj
-1 0 0 1 236.52 142.68 Tm
-(limitation) Tj
-1 0 0 1 278.759 142.68 Tm
-(rela-) Tj
-1 0 0 1 72 130.68 Tm
-(ti) Tj
-1 0 0 1 77.28 130.68 Tm
-(v) Tj
-1 0 0 1 82.2 130.68 Tm
-(e) Tj
-1 0 0 1 90.6 130.68 Tm
-(to) Tj
-1 0 0 1 102.36 130.68 Tm
-(digital) Tj
-1 0 0 1 131.88 130.68 Tm
-(signatures) Tj
-1 0 0 1 176.4 130.68 Tm
-(\320) Tj
-1 0 0 1 190.32 130.68 Tm
-(the) Tj
-1 0 0 1 206.52 130.68 Tm
-(inability) Tj
-1 0 0 1 243.839 130.68 Tm
-(to) Tj
-1 0 0 1 255.599 130.68 Tm
-(pro) Tj
-1 0 0 1 268.919 130.68 Tm
-(v) Tj
-1 0 0 1 273.839 130.68 Tm
-(e) Tj
-1 0 0 1 281.999 130.68 Tm
-(that) Tj
-1 0 0 1 72 118.8 Tm
-(a) Tj
-1 0 0 1 80.0399 118.8 Tm
-(message) Tj
-1 0 0 1 117.48 118.8 Tm
-(is) Tj
-1 0 0 1 127.68 118.8 Tm
-(authentic) Tj
-1 0 0 1 167.88 118.8 Tm
-(to) Tj
-1 0 0 1 179.28 118.8 Tm
-(a) Tj
-1 0 0 1 187.32 118.8 Tm
-(third) Tj
-1 0 0 1 209.759 118.8 Tm
-(party) Tj
-1 0 0 1 229.799 118.8 Tm
-(.) Tj
-1 0 0 1 239.159 118.8 Tm
-(The) Tj
-1 0 0 1 258.239 118.8 Tm
-(algorithm) Tj
-1 0 0 1 72 106.8 Tm
-(in) Tj
-1 0 0 1 82.68 106.8 Tm
-(Section) Tj
-1 0 0 1 115.56 106.8 Tm
-(4) Tj
-1 0 0 1 123.48 106.8 Tm
-(and) Tj
-1 0 0 1 140.88 106.8 Tm
-(pre) Tj
-1 0 0 1 153.48 106.8 Tm
-(vious) Tj
-1 0 0 1 177.96 106.8 Tm
-(Byzantine-f) Tj
-1 0 0 1 225.12 106.8 Tm
-(ault-tolerant) Tj
-1 0 0 1 276.479 106.8 Tm
-(algo-) Tj
-1 0 0 1 72 94.92 Tm
-(rithms) Tj
-1 0 0 1 100.44 94.92 Tm
-([31) Tj
-1 0 0 1 113.76 94.92 Tm
-(,) Tj
-1 0 0 1 119.16 94.92 Tm
-(16) Tj
-1 0 0 1 129.12 94.92 Tm
-(]) Tj
-1 0 0 1 135.36 94.92 Tm
-(for) Tj
-1 0 0 1 150 94.92 Tm
-(state) Tj
-1 0 0 1 171.12 94.92 Tm
-(machine) Tj
-1 0 0 1 207.839 94.92 Tm
-(replication) Tj
-1 0 0 1 253.439 94.92 Tm
-(rely) Tj
-1 0 0 1 271.919 94.92 Tm
-(on) Tj
-1 0 0 1 284.879 94.92 Tm
-(the) Tj
-1 0 0 1 72 82.92 Tm
-(e) Tj
-1 0 0 1 76.32 82.92 Tm
-(xtra) Tj
-1 0 0 1 94.3199 82.92 Tm
-(po) Tj
-1 0 0 1 104.16 82.92 Tm
-(wer) Tj
-1 0 0 1 121.56 82.92 Tm
-(of) Tj
-1 0 0 1 132.36 82.92 Tm
-(digital) Tj
-1 0 0 1 160.44 82.92 Tm
-(signatures.) Tj
-1 0 0 1 207.12 82.92 Tm
-(W) Tj
-1 0 0 1 215.64 82.92 Tm
-(e) Tj
-1 0 0 1 222.719 82.92 Tm
-(modi\256ed) Tj
-1 0 0 1 260.639 82.92 Tm
-(our) Tj
-1 0 0 1 276.479 82.92 Tm
-(algo-) Tj
-1 0 0 1 72 71.04 Tm
-(rithm) Tj
-1 0 0 1 96.3599 71.04 Tm
-(to) Tj
-1 0 0 1 106.92 71.04 Tm
-(circumv) Tj
-1 0 0 1 139.68 71.04 Tm
-(ent) Tj
-1 0 0 1 154.32 71.04 Tm
-(the) Tj
-1 0 0 1 169.32 71.04 Tm
-(problem) Tj
-1 0 0 1 205.32 71.04 Tm
-(by) Tj
-1 0 0 1 218.04 71.04 Tm
-(taking) Tj
-1 0 0 1 245.759 71.04 Tm
-(adv) Tj
-1 0 0 1 260.039 71.04 Tm
-(antage) Tj
-1 0 0 1 288.719 71.04 Tm
-(of) Tj
-1 0 0 1 315 709.08 Tm
-(speci\256c) Tj
-1 0 0 1 347.76 709.08 Tm
-(in) Tj
-1 0 0 1 355.2 709.08 Tm
-(v) Tj
-1 0 0 1 360 709.08 Tm
-(ariants,) Tj
-1 0 0 1 391.2 709.08 Tm
-(e.g,) Tj
-1 0 0 1 407.88 709.08 Tm
-(the) Tj
-1 0 0 1 422.28 709.08 Tm
-(in) Tj
-1 0 0 1 429.72 709.08 Tm
-(v) Tj
-1 0 0 1 434.52 709.08 Tm
-(ariant) Tj
-1 0 0 1 459.359 709.08 Tm
-(that) Tj
-1 0 0 1 476.639 709.08 Tm
-(no) Tj
-1 0 0 1 488.879 709.08 Tm
-(tw) Tj
-1 0 0 1 498.719 709.08 Tm
-(o) Tj
-1 0 0 1 505.919 709.08 Tm
-(dif) Tj
-1 0 0 1 516.839 709.08 Tm
-(ferent) Tj
-1 0 0 1 315 697.08 Tm
-(requests) Tj
-1 0 0 1 350.28 697.08 Tm
-(prepare) Tj
-1 0 0 1 382.8 697.08 Tm
-(with) Tj
-1 0 0 1 403.08 697.08 Tm
-(the) Tj
-1 0 0 1 417.96 697.08 Tm
-(same) Tj
-1 0 0 1 441 697.08 Tm
-(vie) Tj
-1 0 0 1 453 697.08 Tm
-(w) Tj
-1 0 0 1 462.84 697.08 Tm
-(and) Tj
-1 0 0 1 479.879 697.08 Tm
-(sequence) Tj
-1 0 0 1 518.999 697.08 Tm
-(num-) Tj
-1 0 0 1 315 685.2 Tm
-(ber) Tj
-1 0 0 1 330 685.2 Tm
-(at) Tj
-1 0 0 1 339.36 685.2 Tm
-(tw) Tj
-1 0 0 1 349.2 685.2 Tm
-(o) Tj
-1 0 0 1 356.4 685.2 Tm
-(non-f) Tj
-1 0 0 1 378.12 685.2 Tm
-(aulty) Tj
-1 0 0 1 400.08 685.2 Tm
-(replicas.) Tj
-1 0 0 1 437.04 685.2 Tm
-(The) Tj
-1 0 0 1 454.799 685.2 Tm
-(modi\256ed) Tj
-1 0 0 1 492.359 685.2 Tm
-(algorithm) Tj
-1 0 0 1 533.399 685.2 Tm
-(is) Tj
-1 0 0 1 315 673.2 Tm
-(described) Tj
-1 0 0 1 356.28 673.2 Tm
-(in) Tj
-1 0 0 1 367.2 673.2 Tm
-([5) Tj
-1 0 0 1 375.48 673.2 Tm
-(].) Tj
-1 0 0 1 386.76 673.2 Tm
-(Here) Tj
-1 0 0 1 409.2 673.2 Tm
-(we) Tj
-1 0 0 1 423.96 673.2 Tm
-(sk) Tj
-1 0 0 1 432.72 673.2 Tm
-(etch) Tj
-1 0 0 1 452.399 673.2 Tm
-(the) Tj
-1 0 0 1 467.639 673.2 Tm
-(main) Tj
-1 0 0 1 490.679 673.2 Tm
-(implications) Tj
-1 0 0 1 315 661.32 Tm
-(of) Tj
-1 0 0 1 325.8 661.32 Tm
-(using) Tj
-1 0 0 1 349.92 661.32 Tm
-(MA) Tj
-1 0 0 1 365.64 661.32 Tm
-(Cs.) Tj
-1 0 0 1 324.96 648.36 Tm
-(MA) Tj
-1 0 0 1 340.68 648.36 Tm
-(Cs) Tj
-1 0 0 1 355.56 648.36 Tm
-(can) Tj
-1 0 0 1 373.92 648.36 Tm
-(be) Tj
-1 0 0 1 387.72 648.36 Tm
-(computed) Tj
-1 0 0 1 431.52 648.36 Tm
-(three) Tj
-1 0 0 1 455.88 648.36 Tm
-(orders) Tj
-1 0 0 1 485.16 648.36 Tm
-(of) Tj
-1 0 0 1 497.879 648.36 Tm
-(magnitude) Tj
-1 0 0 1 315 636.36 Tm
-(f) Tj
-1 0 0 1 318.24 636.36 Tm
-(aster) Tj
-1 0 0 1 340.56 636.36 Tm
-(than) Tj
-1 0 0 1 361.2 636.36 Tm
-(digital) Tj
-1 0 0 1 390.12 636.36 Tm
-(signatures.) Tj
-1 0 0 1 439.679 636.36 Tm
-(F) Tj
-1 0 0 1 445.079 636.36 Tm
-(or) Tj
-1 0 0 1 456.839 636.36 Tm
-(e) Tj
-1 0 0 1 461.159 636.36 Tm
-(xample,) Tj
-1 0 0 1 496.679 636.36 Tm
-(a) Tj
-1 0 0 1 504.599 636.36 Tm
-(200MHz) Tj
-1 0 0 1 315 624.48 Tm
-(Pentium) Tj
-1 0 0 1 351 624.48 Tm
-(Pro) Tj
-1 0 0 1 367.56 624.48 Tm
-(tak) Tj
-1 0 0 1 379.68 624.48 Tm
-(es) Tj
-1 0 0 1 390.72 624.48 Tm
-(43ms) Tj
-1 0 0 1 414.96 624.48 Tm
-(to) Tj
-1 0 0 1 425.52 624.48 Tm
-(generate) Tj
-1 0 0 1 462 624.48 Tm
-(a) Tj
-1 0 0 1 469.199 624.48 Tm
-(1024-bit) Tj
-1 0 0 1 505.679 624.48 Tm
-(modulus) Tj
-1 0 0 1 315 612.48 Tm
-(RSA) Tj
-1 0 0 1 338.4 612.48 Tm
-(signature) Tj
-1 0 0 1 379.08 612.48 Tm
-(of) Tj
-1 0 0 1 391.44 612.48 Tm
-(an) Tj
-1 0 0 1 404.88 612.48 Tm
-(MD5) Tj
-1 0 0 1 430.08 612.48 Tm
-(digest) Tj
-1 0 0 1 457.92 612.48 Tm
-(and) Tj
-1 0 0 1 476.399 612.48 Tm
-(0.6ms) Tj
-1 0 0 1 504.479 612.48 Tm
-(to) Tj
-1 0 0 1 516.359 612.48 Tm
-(v) Tj
-1 0 0 1 521.279 612.48 Tm
-(erify) Tj
-1 0 0 1 315 600.6 Tm
-(the) Tj
-1 0 0 1 332.76 600.6 Tm
-(signature) Tj
-1 0 0 1 375 600.6 Tm
-([37) Tj
-1 0 0 1 388.2 600.6 Tm
-(],) Tj
-1 0 0 1 400.44 600.6 Tm
-(whereas) Tj
-1 0 0 1 438.72 600.6 Tm
-(it) Tj
-1 0 0 1 449.88 600.6 Tm
-(tak) Tj
-1 0 0 1 462 600.6 Tm
-(es) Tj
-1 0 0 1 475.92 600.6 Tm
-(only) Tj
-1 0 0 1 499.319 600.6 Tm
-(10.3) Tj
-ET
-endstream
-endobj
-657 0 obj
-8780
-endobj
-658 0 obj
-<< /Type /XObject /Name /R658 /Subtype /Image /Length 659 0 R
-/ImageMask true /Width 55 /Height 67 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 55 /BlackIs1 true >>]
->>
-stream
-,Fo)=s1dI\pj_2iqjRk5*s`]L
-iYYt!ON4^rGA'-'R,85M_r:L)s6\^!r&aE:no3LSs5!_L&,jEGmf2,CpODW2pijXUhVkZj+b0guJ,~>
-endstream
-endobj
-659 0 obj
-106
-endobj
-660 0 obj
-<< /Length 661 0 R >>
-stream
-q
-5.5 0 0 -6.7 517.2 605.1 cm
-/R658 Do
-Q
-BT
-1 0 0 1 522.959 600.6 Tm
-(s) Tj
-1 0 0 1 532.199 600.6 Tm
-(to) Tj
-1 0 0 1 315 588.6 Tm
-(compute) Tj
-1 0 0 1 353.4 588.6 Tm
-(the) Tj
-1 0 0 1 369.6 588.6 Tm
-(MA) Tj
-1 0 0 1 385.32 588.6 Tm
-(C) Tj
-1 0 0 1 396 588.6 Tm
-(of) Tj
-1 0 0 1 408.36 588.6 Tm
-(a) Tj
-1 0 0 1 416.88 588.6 Tm
-(64-byte) Tj
-1 0 0 1 451.44 588.6 Tm
-(message) Tj
-1 0 0 1 489.239 588.6 Tm
-(on) Tj
-1 0 0 1 503.279 588.6 Tm
-(the) Tj
-1 0 0 1 519.479 588.6 Tm
-(same) Tj
-1 0 0 1 315 576.6 Tm
-(hardw) Tj
-1 0 0 1 339.96 576.6 Tm
-(are) Tj
-1 0 0 1 354.36 576.6 Tm
-(in) Tj
-1 0 0 1 364.44 576.6 Tm
-(our) Tj
-1 0 0 1 380.16 576.6 Tm
-(implementation.) Tj
-1 0 0 1 448.8 576.6 Tm
-(There) Tj
-1 0 0 1 474.359 576.6 Tm
-(are) Tj
-1 0 0 1 488.879 576.6 Tm
-(other) Tj
-1 0 0 1 511.799 576.6 Tm
-(public-) Tj
-1 0 0 1 315 564.72 Tm
-(k) Tj
-1 0 0 1 319.92 564.72 Tm
-(e) Tj
-1 0 0 1 324.24 564.72 Tm
-(y) Tj
-1 0 0 1 333 564.72 Tm
-(cryptosystems) Tj
-1 0 0 1 393.96 564.72 Tm
-(that) Tj
-1 0 0 1 412.8 564.72 Tm
-(generate) Tj
-1 0 0 1 450.48 564.72 Tm
-(signatures) Tj
-1 0 0 1 494.759 564.72 Tm
-(f) Tj
-1 0 0 1 497.999 564.72 Tm
-(aster) Tj
-1 0 0 1 516.479 564.72 Tm
-(,) Tj
-1 0 0 1 523.079 564.72 Tm
-(e.g.,) Tj
-1 0 0 1 315 552.72 Tm
-(elliptic) Tj
-1 0 0 1 347.4 552.72 Tm
-(curv) Tj
-1 0 0 1 365.16 552.72 Tm
-(e) Tj
-1 0 0 1 374.16 552.72 Tm
-(public-k) Tj
-1 0 0 1 407.52 552.72 Tm
-(e) Tj
-1 0 0 1 411.84 552.72 Tm
-(y) Tj
-1 0 0 1 421.32 552.72 Tm
-(cryptosystems,) Tj
-1 0 0 1 486.119 552.72 Tm
-(b) Tj
-1 0 0 1 490.919 552.72 Tm
-(ut) Tj
-1 0 0 1 503.519 552.72 Tm
-(signature) Tj
-1 0 0 1 315 540.84 Tm
-(v) Tj
-1 0 0 1 319.92 540.84 Tm
-(eri\256cation) Tj
-1 0 0 1 364.92 540.84 Tm
-(is) Tj
-1 0 0 1 376.32 540.84 Tm
-(slo) Tj
-1 0 0 1 387.72 540.84 Tm
-(wer) Tj
-1 0 0 1 407.4 540.84 Tm
-([37) Tj
-1 0 0 1 420.6 540.84 Tm
-(]) Tj
-1 0 0 1 428.64 540.84 Tm
-(and) Tj
-1 0 0 1 447.84 540.84 Tm
-(in) Tj
-1 0 0 1 460.32 540.84 Tm
-(our) Tj
-1 0 0 1 478.319 540.84 Tm
-(algorithm) Tj
-1 0 0 1 521.759 540.84 Tm
-(each) Tj
-1 0 0 1 315 528.84 Tm
-(signature) Tj
-1 0 0 1 354 528.84 Tm
-(is) Tj
-1 0 0 1 363.12 528.84 Tm
-(v) Tj
-1 0 0 1 368.04 528.84 Tm
-(eri\256ed) Tj
-1 0 0 1 395.88 528.84 Tm
-(man) Tj
-1 0 0 1 413.04 528.84 Tm
-(y) Tj
-1 0 0 1 420.36 528.84 Tm
-(times.) Tj
-1 0 0 1 324.96 515.88 Tm
-(Each) Tj
-1 0 0 1 348.12 515.88 Tm
-(node) Tj
-1 0 0 1 370.68 515.88 Tm
-(\(including) Tj
-1 0 0 1 414.72 515.88 Tm
-(acti) Tj
-1 0 0 1 428.88 515.88 Tm
-(v) Tj
-1 0 0 1 433.8 515.88 Tm
-(e) Tj
-1 0 0 1 441.36 515.88 Tm
-(clients\)) Tj
-1 0 0 1 473.879 515.88 Tm
-(shares) Tj
-1 0 0 1 501.959 515.88 Tm
-(a) Tj
-1 0 0 1 509.519 515.88 Tm
-(16-byte) Tj
-1 0 0 1 315 504 Tm
-(secret) Tj
-1 0 0 1 343.8 504 Tm
-(session) Tj
-1 0 0 1 378.12 504 Tm
-(k) Tj
-1 0 0 1 383.04 504 Tm
-(e) Tj
-1 0 0 1 387.36 504 Tm
-(y) Tj
-1 0 0 1 397.8 504 Tm
-(with) Tj
-1 0 0 1 420.96 504 Tm
-(each) Tj
-1 0 0 1 444.84 504 Tm
-(replica.) Tj
-1 0 0 1 487.079 504 Tm
-(W) Tj
-1 0 0 1 495.599 504 Tm
-(e) Tj
-1 0 0 1 505.679 504 Tm
-(compute) Tj
-1 0 0 1 315 492 Tm
-(message) Tj
-1 0 0 1 352.56 492 Tm
-(authentication) Tj
-1 0 0 1 412.68 492 Tm
-(codes) Tj
-1 0 0 1 439.2 492 Tm
-(by) Tj
-1 0 0 1 452.88 492 Tm
-(applying) Tj
-1 0 0 1 491.519 492 Tm
-(MD5) Tj
-1 0 0 1 516.359 492 Tm
-(to) Tj
-1 0 0 1 527.879 492 Tm
-(the) Tj
-1 0 0 1 315 480.12 Tm
-(concatenation) Tj
-1 0 0 1 372.6 480.12 Tm
-(of) Tj
-1 0 0 1 383.28 480.12 Tm
-(the) Tj
-1 0 0 1 397.8 480.12 Tm
-(message) Tj
-1 0 0 1 433.8 480.12 Tm
-(with) Tj
-1 0 0 1 453.84 480.12 Tm
-(the) Tj
-1 0 0 1 468.36 480.12 Tm
-(secret) Tj
-1 0 0 1 493.919 480.12 Tm
-(k) Tj
-1 0 0 1 498.839 480.12 Tm
-(e) Tj
-1 0 0 1 503.159 480.12 Tm
-(y) Tj
-1 0 0 1 507.599 480.12 Tm
-(.) Tj
-1 0 0 1 513.479 480.12 Tm
-(Rather) Tj
-1 0 0 1 315 468.12 Tm
-(than) Tj
-1 0 0 1 335.16 468.12 Tm
-(using) Tj
-1 0 0 1 359.64 468.12 Tm
-(the) Tj
-1 0 0 1 374.76 468.12 Tm
-(16) Tj
-1 0 0 1 387.72 468.12 Tm
-(bytes) Tj
-1 0 0 1 411.72 468.12 Tm
-(of) Tj
-1 0 0 1 423 468.12 Tm
-(the) Tj
-1 0 0 1 438.119 468.12 Tm
-(\256nal) Tj
-1 0 0 1 458.759 468.12 Tm
-(MD5) Tj
-1 0 0 1 482.759 468.12 Tm
-(digest,) Tj
-1 0 0 1 512.159 468.12 Tm
-(we) Tj
-1 0 0 1 526.679 468.12 Tm
-(use) Tj
-1 0 0 1 315 456.24 Tm
-(only) Tj
-1 0 0 1 336.12 456.24 Tm
-(the) Tj
-1 0 0 1 351.72 456.24 Tm
-(10) Tj
-1 0 0 1 365.16 456.24 Tm
-(least) Tj
-1 0 0 1 386.88 456.24 Tm
-(signi\256cant) Tj
-1 0 0 1 431.76 456.24 Tm
-(bytes.) Tj
-1 0 0 1 461.759 456.24 Tm
-(This) Tj
-1 0 0 1 482.879 456.24 Tm
-(truncation) Tj
-1 0 0 1 526.679 456.24 Tm
-(has) Tj
-1 0 0 1 315 444.24 Tm
-(the) Tj
-1 0 0 1 329.52 444.24 Tm
-(ob) Tj
-1 0 0 1 339.48 444.24 Tm
-(vious) Tj
-1 0 0 1 363.36 444.24 Tm
-(adv) Tj
-1 0 0 1 377.64 444.24 Tm
-(antage) Tj
-1 0 0 1 405.96 444.24 Tm
-(of) Tj
-1 0 0 1 416.64 444.24 Tm
-(reducing) Tj
-1 0 0 1 453.84 444.24 Tm
-(the) Tj
-1 0 0 1 468.479 444.24 Tm
-(size) Tj
-1 0 0 1 486.359 444.24 Tm
-(of) Tj
-1 0 0 1 497.039 444.24 Tm
-(MA) Tj
-1 0 0 1 512.759 444.24 Tm
-(Cs) Tj
-1 0 0 1 525.599 444.24 Tm
-(and) Tj
-1 0 0 1 315 432.36 Tm
-(it) Tj
-1 0 0 1 324.12 432.36 Tm
-(also) Tj
-1 0 0 1 343.68 432.36 Tm
-(impro) Tj
-1 0 0 1 367.56 432.36 Tm
-(v) Tj
-1 0 0 1 372.48 432.36 Tm
-(es) Tj
-1 0 0 1 384.12 432.36 Tm
-(their) Tj
-1 0 0 1 405.96 432.36 Tm
-(resilience) Tj
-1 0 0 1 447.719 432.36 Tm
-(to) Tj
-1 0 0 1 458.999 432.36 Tm
-(certain) Tj
-1 0 0 1 489.719 432.36 Tm
-(attacks) Tj
-1 0 0 1 520.919 432.36 Tm
-([27) Tj
-1 0 0 1 534.239 432.36 Tm
-(].) Tj
-1 0 0 1 315 420.36 Tm
-(This) Tj
-1 0 0 1 335.64 420.36 Tm
-(is) Tj
-1 0 0 1 345.24 420.36 Tm
-(a) Tj
-1 0 0 1 352.56 420.36 Tm
-(v) Tj
-1 0 0 1 357.36 420.36 Tm
-(ariant) Tj
-1 0 0 1 382.92 420.36 Tm
-(of) Tj
-1 0 0 1 394.08 420.36 Tm
-(the) Tj
-1 0 0 1 409.2 420.36 Tm
-(secret) Tj
-1 0 0 1 435.359 420.36 Tm
-(suf) Tj
-1 0 0 1 447.359 420.36 Tm
-(\256x) Tj
-1 0 0 1 460.679 420.36 Tm
-(method) Tj
-1 0 0 1 493.559 420.36 Tm
-([36) Tj
-1 0 0 1 506.759 420.36 Tm
-(],) Tj
-1 0 0 1 515.639 420.36 Tm
-(which) Tj
-1 0 0 1 315 408.48 Tm
-(is) Tj
-1 0 0 1 324.12 408.48 Tm
-(secure) Tj
-1 0 0 1 352.08 408.48 Tm
-(as) Tj
-1 0 0 1 362.88 408.48 Tm
-(long) Tj
-1 0 0 1 383.04 408.48 Tm
-(as) Tj
-1 0 0 1 393.84 408.48 Tm
-(MD5) Tj
-1 0 0 1 417.36 408.48 Tm
-(is) Tj
-1 0 0 1 426.48 408.48 Tm
-(collision) Tj
-1 0 0 1 463.319 408.48 Tm
-(resistant) Tj
-1 0 0 1 498.959 408.48 Tm
-([27) Tj
-1 0 0 1 512.279 408.48 Tm
-(,) Tj
-1 0 0 1 517.319 408.48 Tm
-(8) Tj
-1 0 0 1 522.239 408.48 Tm
-(].) Tj
-1 0 0 1 324.96 395.52 Tm
-(The) Tj
-1 0 0 1 342.24 395.52 Tm
-(digital) Tj
-1 0 0 1 369.48 395.52 Tm
-(signature) Tj
-1 0 0 1 407.88 395.52 Tm
-(in) Tj
-1 0 0 1 417.36 395.52 Tm
-(a) Tj
-1 0 0 1 423.48 395.52 Tm
-(rep) Tj
-1 0 0 1 436.2 395.52 Tm
-(ly) Tj
-1 0 0 1 445.679 395.52 Tm
-(m) Tj
-1 0 0 1 453.359 395.52 Tm
-(essage) Tj
-1 0 0 1 481.079 395.52 Tm
-(is) Tj
-1 0 0 1 489.359 395.52 Tm
-(r) Tj
-1 0 0 1 492.599 395.52 Tm
-(eplac) Tj
-1 0 0 1 513.599 395.52 Tm
-(ed) Tj
-1 0 0 1 524.639 395.52 Tm
-(by) Tj
-1 0 0 1 536.279 395.52 Tm
-(a) Tj
-1 0 0 1 315 383.52 Tm
-(single) Tj
-1 0 0 1 341.52 383.52 Tm
-(MA) Tj
-1 0 0 1 357.24 383.52 Tm
-(C,) Tj
-1 0 0 1 369 383.52 Tm
-(which) Tj
-1 0 0 1 396 383.52 Tm
-(is) Tj
-1 0 0 1 405.36 383.52 Tm
-(suf) Tj
-1 0 0 1 417.36 383.52 Tm
-(\256cient) Tj
-1 0 0 1 444.96 383.52 Tm
-(because) Tj
-1 0 0 1 479.159 383.52 Tm
-(these) Tj
-1 0 0 1 502.319 383.52 Tm
-(messages) Tj
-1 0 0 1 315 371.64 Tm
-(ha) Tj
-1 0 0 1 324.24 371.64 Tm
-(v) Tj
-1 0 0 1 329.16 371.64 Tm
-(e) Tj
-1 0 0 1 337.2 371.64 Tm
-(a) Tj
-1 0 0 1 345.24 371.64 Tm
-(single) Tj
-1 0 0 1 372.72 371.64 Tm
-(intended) Tj
-1 0 0 1 410.76 371.64 Tm
-(recipient.) Tj
-1 0 0 1 455.279 371.64 Tm
-(The) Tj
-1 0 0 1 474.479 371.64 Tm
-(signatures) Tj
-1 0 0 1 518.639 371.64 Tm
-(in) Tj
-1 0 0 1 530.039 371.64 Tm
-(all) Tj
-1 0 0 1 315 359.64 Tm
-(other) Tj
-1 0 0 1 338.76 359.64 Tm
-(messages) Tj
-1 0 0 1 379.56 359.64 Tm
-(\(including) Tj
-1 0 0 1 423.84 359.64 Tm
-(client) Tj
-1 0 0 1 449.16 359.64 Tm
-(requests) Tj
-1 0 0 1 485.039 359.64 Tm
-(b) Tj
-1 0 0 1 489.839 359.64 Tm
-(ut) Tj
-1 0 0 1 500.879 359.64 Tm
-(e) Tj
-1 0 0 1 505.199 359.64 Tm
-(xcluding) Tj
-1 0 0 1 315 347.76 Tm
-(vie) Tj
-1 0 0 1 327 347.76 Tm
-(w) Tj
-1 0 0 1 336.84 347.76 Tm
-(changes\)) Tj
-1 0 0 1 375.12 347.76 Tm
-(are) Tj
-1 0 0 1 390 347.76 Tm
-(replaced) Tj
-1 0 0 1 426.48 347.76 Tm
-(by) Tj
-1 0 0 1 439.2 347.76 Tm
-(v) Tj
-1 0 0 1 444.12 347.76 Tm
-(ectors) Tj
-1 0 0 1 470.64 347.76 Tm
-(of) Tj
-1 0 0 1 481.679 347.76 Tm
-(MA) Tj
-1 0 0 1 497.4 347.76 Tm
-(Cs) Tj
-1 0 0 1 510.719 347.76 Tm
-(that) Tj
-1 0 0 1 528.359 347.76 Tm
-(we) Tj
-1 0 0 1 315 335.76 Tm
-(call) Tj
-/R644 10 Tf
-1 0 0 1 333.36 335.76 Tm
-(authenticator) Tj
-1 0 0 1 387.24 335.76 Tm
-(s) Tj
-/R641 10 Tf
-1 0 0 1 391.08 335.76 Tm
-(.) Tj
-1 0 0 1 401.28 335.76 Tm
-(An) Tj
-1 0 0 1 417.36 335.76 Tm
-(authenticator) Tj
-1 0 0 1 473.399 335.76 Tm
-(has) Tj
-1 0 0 1 490.559 335.76 Tm
-(an) Tj
-1 0 0 1 503.999 335.76 Tm
-(entry) Tj
-1 0 0 1 528.359 335.76 Tm
-(for) Tj
-1 0 0 1 315 323.88 Tm
-(e) Tj
-1 0 0 1 319.2 323.88 Tm
-(v) Tj
-1 0 0 1 324.12 323.88 Tm
-(ery) Tj
-1 0 0 1 341.04 323.88 Tm
-(replica) Tj
-1 0 0 1 372.48 323.88 Tm
-(other) Tj
-1 0 0 1 397.32 323.88 Tm
-(than) Tj
-1 0 0 1 418.8 323.88 Tm
-(the) Tj
-1 0 0 1 435.36 323.88 Tm
-(sender;) Tj
-1 0 0 1 469.439 323.88 Tm
-(each) Tj
-1 0 0 1 491.999 323.88 Tm
-(entry) Tj
-1 0 0 1 516.839 323.88 Tm
-(is) Tj
-1 0 0 1 527.879 323.88 Tm
-(the) Tj
-1 0 0 1 315 311.88 Tm
-(MA) Tj
-1 0 0 1 330.72 311.88 Tm
-(C) Tj
-1 0 0 1 340.68 311.88 Tm
-(computed) Tj
-1 0 0 1 383.4 311.88 Tm
-(with) Tj
-1 0 0 1 404.64 311.88 Tm
-(the) Tj
-1 0 0 1 420.24 311.88 Tm
-(k) Tj
-1 0 0 1 425.16 311.88 Tm
-(e) Tj
-1 0 0 1 429.48 311.88 Tm
-(y) Tj
-1 0 0 1 437.76 311.88 Tm
-(shared) Tj
-1 0 0 1 467.16 311.88 Tm
-(by) Tj
-1 0 0 1 480.6 311.88 Tm
-(the) Tj
-1 0 0 1 496.199 311.88 Tm
-(sender) Tj
-1 0 0 1 525.599 311.88 Tm
-(and) Tj
-1 0 0 1 315 300 Tm
-(the) Tj
-1 0 0 1 329.64 300 Tm
-(replica) Tj
-1 0 0 1 359.28 300 Tm
-(corresponding) Tj
-1 0 0 1 418.8 300 Tm
-(to) Tj
-1 0 0 1 429 300 Tm
-(the) Tj
-1 0 0 1 443.64 300 Tm
-(entry) Tj
-1 0 0 1 463.679 300 Tm
-(.) Tj
-1 0 0 1 324.96 287.04 Tm
-(The) Tj
-1 0 0 1 343.2 287.04 Tm
-(time) Tj
-1 0 0 1 363.6 287.04 Tm
-(to) Tj
-1 0 0 1 374.04 287.04 Tm
-(v) Tj
-1 0 0 1 378.96 287.04 Tm
-(erify) Tj
-1 0 0 1 400.44 287.04 Tm
-(an) Tj
-1 0 0 1 412.56 287.04 Tm
-(authenticator) Tj
-1 0 0 1 467.279 287.04 Tm
-(is) Tj
-1 0 0 1 476.639 287.04 Tm
-(constant) Tj
-1 0 0 1 512.519 287.04 Tm
-(b) Tj
-1 0 0 1 517.319 287.04 Tm
-(ut) Tj
-1 0 0 1 527.879 287.04 Tm
-(the) Tj
-1 0 0 1 315 275.04 Tm
-(time) Tj
-1 0 0 1 335.88 275.04 Tm
-(to) Tj
-1 0 0 1 346.8 275.04 Tm
-(generate) Tj
-1 0 0 1 383.64 275.04 Tm
-(one) Tj
-1 0 0 1 401.16 275.04 Tm
-(gro) Tj
-1 0 0 1 414.36 275.04 Tm
-(ws) Tj
-1 0 0 1 428.4 275.04 Tm
-(linearly) Tj
-1 0 0 1 461.999 275.04 Tm
-(with) Tj
-1 0 0 1 482.759 275.04 Tm
-(the) Tj
-1 0 0 1 498.119 275.04 Tm
-(number) Tj
-1 0 0 1 531.719 275.04 Tm
-(of) Tj
-1 0 0 1 315 263.16 Tm
-(replicas.) Tj
-1 0 0 1 352.08 263.16 Tm
-(This) Tj
-1 0 0 1 372.12 263.16 Tm
-(is) Tj
-1 0 0 1 381.24 263.16 Tm
-(not) Tj
-1 0 0 1 396.36 263.16 Tm
-(a) Tj
-1 0 0 1 403.08 263.16 Tm
-(problem) Tj
-1 0 0 1 438.72 263.16 Tm
-(because) Tj
-1 0 0 1 472.679 263.16 Tm
-(we) Tj
-1 0 0 1 486.719 263.16 Tm
-(do) Tj
-1 0 0 1 499.079 263.16 Tm
-(not) Tj
-1 0 0 1 514.199 263.16 Tm
-(e) Tj
-1 0 0 1 518.519 263.16 Tm
-(xpect) Tj
-1 0 0 1 315 251.16 Tm
-(to) Tj
-1 0 0 1 326.4 251.16 Tm
-(ha) Tj
-1 0 0 1 335.64 251.16 Tm
-(v) Tj
-1 0 0 1 340.56 251.16 Tm
-(e) Tj
-1 0 0 1 348.48 251.16 Tm
-(a) Tj
-1 0 0 1 356.64 251.16 Tm
-(lar) Tj
-1 0 0 1 367.08 251.16 Tm
-(ge) Tj
-1 0 0 1 379.92 251.16 Tm
-(number) Tj
-1 0 0 1 414.12 251.16 Tm
-(of) Tj
-1 0 0 1 426 251.16 Tm
-(replicas) Tj
-1 0 0 1 460.679 251.16 Tm
-(and) Tj
-1 0 0 1 478.679 251.16 Tm
-(there) Tj
-1 0 0 1 502.199 251.16 Tm
-(is) Tj
-1 0 0 1 512.519 251.16 Tm
-(a) Tj
-1 0 0 1 520.679 251.16 Tm
-(huge) Tj
-1 0 0 1 315 239.16 Tm
-(performance) Tj
-1 0 0 1 370.08 239.16 Tm
-(gap) Tj
-1 0 0 1 389.16 239.16 Tm
-(between) Tj
-1 0 0 1 427.08 239.16 Tm
-(MA) Tj
-1 0 0 1 442.8 239.16 Tm
-(C) Tj
-1 0 0 1 454.08 239.16 Tm
-(and) Tj
-1 0 0 1 473.28 239.16 Tm
-(digital) Tj
-1 0 0 1 503.519 239.16 Tm
-(signature) Tj
-1 0 0 1 315 227.28 Tm
-(computation.) Tj
-1 0 0 1 374.52 227.28 Tm
-(Furthermore,) Tj
-1 0 0 1 430.8 227.28 Tm
-(we) Tj
-1 0 0 1 446.16 227.28 Tm
-(compute) Tj
-1 0 0 1 484.08 227.28 Tm
-(authenticators) Tj
-1 0 0 1 315 215.28 Tm
-(ef) Tj
-1 0 0 1 322.56 215.28 Tm
-(\256ciently;) Tj
-1 0 0 1 360.96 215.28 Tm
-(MD5) Tj
-1 0 0 1 384.84 215.28 Tm
-(is) Tj
-1 0 0 1 394.44 215.28 Tm
-(applied) Tj
-1 0 0 1 426.6 215.28 Tm
-(to) Tj
-1 0 0 1 437.16 215.28 Tm
-(the) Tj
-1 0 0 1 452.279 215.28 Tm
-(message) Tj
-1 0 0 1 488.879 215.28 Tm
-(once) Tj
-1 0 0 1 510.599 215.28 Tm
-(and) Tj
-1 0 0 1 527.879 215.28 Tm
-(the) Tj
-1 0 0 1 315 203.4 Tm
-(resulting) Tj
-1 0 0 1 353.64 203.4 Tm
-(conte) Tj
-1 0 0 1 375.24 203.4 Tm
-(xt) Tj
-1 0 0 1 386.64 203.4 Tm
-(is) Tj
-1 0 0 1 397.08 203.4 Tm
-(used) Tj
-1 0 0 1 419.16 203.4 Tm
-(to) Tj
-1 0 0 1 430.8 203.4 Tm
-(compute) Tj
-1 0 0 1 468.959 203.4 Tm
-(each) Tj
-1 0 0 1 490.919 203.4 Tm
-(v) Tj
-1 0 0 1 495.839 203.4 Tm
-(ector) Tj
-1 0 0 1 519.479 203.4 Tm
-(entry) Tj
-1 0 0 1 315 191.4 Tm
-(by) Tj
-1 0 0 1 327.72 191.4 Tm
-(applying) Tj
-1 0 0 1 365.4 191.4 Tm
-(MD5) Tj
-1 0 0 1 389.16 191.4 Tm
-(to) Tj
-1 0 0 1 399.72 191.4 Tm
-(the) Tj
-1 0 0 1 414.6 191.4 Tm
-(corresponding) Tj
-1 0 0 1 474.36 191.4 Tm
-(session) Tj
-1 0 0 1 505.919 191.4 Tm
-(k) Tj
-1 0 0 1 510.839 191.4 Tm
-(e) Tj
-1 0 0 1 515.159 191.4 Tm
-(y) Tj
-1 0 0 1 519.599 191.4 Tm
-(.) Tj
-1 0 0 1 526.319 191.4 Tm
-(F) Tj
-1 0 0 1 531.719 191.4 Tm
-(or) Tj
-1 0 0 1 315 179.52 Tm
-(e) Tj
-1 0 0 1 319.32 179.52 Tm
-(xample,) Tj
-1 0 0 1 355.92 179.52 Tm
-(in) Tj
-1 0 0 1 368.04 179.52 Tm
-(a) Tj
-1 0 0 1 376.92 179.52 Tm
-(system) Tj
-1 0 0 1 408.96 179.52 Tm
-(with) Tj
-1 0 0 1 431.04 179.52 Tm
-(37) Tj
-1 0 0 1 445.32 179.52 Tm
-(replicas) Tj
-1 0 0 1 480.719 179.52 Tm
-(\(i.e.,) Tj
-1 0 0 1 503.519 179.52 Tm
-(a) Tj
-1 0 0 1 512.279 179.52 Tm
-(system) Tj
-1 0 0 1 315 167.52 Tm
-(that) Tj
-1 0 0 1 332.4 167.52 Tm
-(can) Tj
-1 0 0 1 348.6 167.52 Tm
-(tolerate) Tj
-1 0 0 1 381 167.52 Tm
-(12) Tj
-1 0 0 1 393.36 167.52 Tm
-(simultaneous) Tj
-1 0 0 1 448.319 167.52 Tm
-(f) Tj
-1 0 0 1 451.559 167.52 Tm
-(aults\)) Tj
-1 0 0 1 476.159 167.52 Tm
-(an) Tj
-1 0 0 1 488.039 167.52 Tm
-(authenticator) Tj
-1 0 0 1 315 155.64 Tm
-(can) Tj
-1 0 0 1 333.24 155.64 Tm
-(still) Tj
-1 0 0 1 352.56 155.64 Tm
-(be) Tj
-1 0 0 1 366.48 155.64 Tm
-(computed) Tj
-1 0 0 1 410.16 155.64 Tm
-(much) Tj
-1 0 0 1 436.68 155.64 Tm
-(more) Tj
-1 0 0 1 461.52 155.64 Tm
-(than) Tj
-1 0 0 1 483.119 155.64 Tm
-(tw) Tj
-1 0 0 1 492.959 155.64 Tm
-(o) Tj
-1 0 0 1 502.439 155.64 Tm
-(orders) Tj
-1 0 0 1 531.719 155.64 Tm
-(of) Tj
-1 0 0 1 315 143.64 Tm
-(magnitude) Tj
-1 0 0 1 358.92 143.64 Tm
-(f) Tj
-1 0 0 1 362.16 143.64 Tm
-(aster) Tj
-1 0 0 1 382.8 143.64 Tm
-(than) Tj
-1 0 0 1 401.76 143.64 Tm
-(a) Tj
-1 0 0 1 408 143.64 Tm
-(1024-bit) Tj
-1 0 0 1 443.64 143.64 Tm
-(modulus) Tj
-1 0 0 1 479.759 143.64 Tm
-(RSA) Tj
-1 0 0 1 500.999 143.64 Tm
-(signature.) Tj
-1 0 0 1 324.96 130.68 Tm
-(The) Tj
-1 0 0 1 345.48 130.68 Tm
-(size) Tj
-1 0 0 1 366.12 130.68 Tm
-(of) Tj
-1 0 0 1 379.44 130.68 Tm
-(authenticators) Tj
-1 0 0 1 440.4 130.68 Tm
-(gro) Tj
-1 0 0 1 453.6 130.68 Tm
-(ws) Tj
-1 0 0 1 469.56 130.68 Tm
-(linearly) Tj
-1 0 0 1 505.079 130.68 Tm
-(with) Tj
-1 0 0 1 527.879 130.68 Tm
-(the) Tj
-1 0 0 1 315 118.8 Tm
-(number) Tj
-1 0 0 1 349.44 118.8 Tm
-(of) Tj
-1 0 0 1 361.68 118.8 Tm
-(replicas) Tj
-1 0 0 1 396.72 118.8 Tm
-(b) Tj
-1 0 0 1 401.52 118.8 Tm
-(ut) Tj
-1 0 0 1 413.16 118.8 Tm
-(it) Tj
-1 0 0 1 422.76 118.8 Tm
-(gro) Tj
-1 0 0 1 435.96 118.8 Tm
-(ws) Tj
-1 0 0 1 450.84 118.8 Tm
-(slo) Tj
-1 0 0 1 462.24 118.8 Tm
-(wly:) Tj
-1 0 0 1 486.479 118.8 Tm
-(it) Tj
-1 0 0 1 496.079 118.8 Tm
-(is) Tj
-1 0 0 1 506.639 118.8 Tm
-(equal) Tj
-1 0 0 1 532.199 118.8 Tm
-(to) Tj
-1 0 0 1 315 106.8 Tm
-(30) Tj
-ET
-endstream
-endobj
-661 0 obj
-15291
-endobj
-662 0 obj
-<< /Type /XObject /Name /R662 /Subtype /Image /Length 663 0 R
-/ImageMask true /Width 49 /Height 49 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 49 /BlackIs1 true >>]
->>
-stream
-,K-UT@67h56YTu2Y_'iL)8\I86km$G`&5CSk:J&,`]#017Bg"U@"<.1<5Qh~>
-endstream
-endobj
-663 0 obj
-102
-endobj
-664 0 obj
-<< /Length 665 0 R >>
-stream
-q
-4.9 0 0 -4.9 329 111.8 cm
-/R662 Do
-Q
-endstream
-endobj
-665 0 obj
-39
-endobj
-666 0 obj
-<< /Type /XObject /Name /R666 /Subtype /Image /Length 667 0 R
-/ImageMask true /Width 26 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 26 /BlackIs1 true >>]
->>
-stream
-/da'+AAiuts8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!qbR:n&-~>
-endstream
-endobj
-667 0 obj
-60
-endobj
-668 0 obj
-<< /Length 669 0 R >>
-stream
-q
-2.6 0 0 -9.9 339.6 114.3 cm
-/R666 Do
-Q
-endstream
-endobj
-669 0 obj
-41
-endobj
-670 0 obj
-<< /Type /XObject /Name /R670 /Subtype /Image /Length 671 0 R
-/ImageMask true /Width 43 /Height 33 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 43 /BlackIs1 true >>]
->>
-stream
-366ZtBKi$Kj)nf1pi$0"h;="Vq3Z%=rV-?Z\+qmGnGV5SiW&fRKsuPqJ89Nq=JdRb$l@h'!$D~>
-endstream
-endobj
-671 0 obj
-76
-endobj
-672 0 obj
-<< /Length 673 0 R >>
-stream
-q
-4.3 0 0 -3.3 344 114 cm
-/R670 Do
-Q
-endstream
-endobj
-673 0 obj
-37
-endobj
-674 0 obj
-<< /Type /XObject /Name /R674 /Subtype /Image /Length 675 0 R
-/ImageMask true /Width 47 /Height 5 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 47 /BlackIs1 true >>]
->>
-stream
--D7RA!$D=~>
-endstream
-endobj
-675 0 obj
-12
-endobj
-676 0 obj
-<< /Length 677 0 R >>
-stream
-q
-4.7 0 0 -0.5 349.3 112.8 cm
-/R674 Do
-Q
-BT
-/R641 7 Tf
-1 0 0 1 354.84 110.76 Tm
-(1) Tj
-ET
-q
-14.64 0 0 -0.48 343.668 109.572 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 349.2 103.44 Tm
-(3) Tj
-ET
-endstream
-endobj
-677 0 obj
-216
-endobj
-678 0 obj
-<< /Type /XObject /Name /R678 /Subtype /Image /Length 679 0 R
-/ImageMask true /Width 26 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 26 /BlackIs1 true >>]
->>
-stream
-,Ct/ij?\:qs8W-!s8W-!s8W-!s8W-!s8W-!s+[0J!$D~>
-endstream
-endobj
-679 0 obj
-46
-endobj
-680 0 obj
-<< /Length 681 0 R >>
-stream
-q
-2.6 0 0 -9.9 359.6 114.3 cm
-/R678 Do
-Q
-BT
-/R641 10 Tf
-1 0 0 1 367.2 106.8 Tm
-(bytes.) Tj
-1 0 0 1 396.72 106.8 Tm
-(An) Tj
-1 0 0 1 412.2 106.8 Tm
-(authenticator) Tj
-1 0 0 1 467.52 106.8 Tm
-(is) Tj
-1 0 0 1 477.48 106.8 Tm
-(smaller) Tj
-1 0 0 1 510.119 106.8 Tm
-(than) Tj
-1 0 0 1 530.639 106.8 Tm
-(an) Tj
-1 0 0 1 315 94.92 Tm
-(RSA) Tj
-1 0 0 1 336.84 94.92 Tm
-(signature) Tj
-1 0 0 1 375.96 94.92 Tm
-(with) Tj
-1 0 0 1 396.12 94.92 Tm
-(a) Tj
-1 0 0 1 403.08 94.92 Tm
-(1024-bit) Tj
-1 0 0 1 439.32 94.92 Tm
-(modulus) Tj
-1 0 0 1 476.159 94.92 Tm
-(for) Tj
-ET
-endstream
-endobj
-681 0 obj
-548
-endobj
-682 0 obj
-<< /Type /XObject /Name /R682 /Subtype /Image /Length 683 0 R
-/ImageMask true /Width 54 /Height 46 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 54 /BlackIs1 true >>]
->>
-stream
-4N]t,$m>7rl/"o@d!re,
-pYTohhg]lis4_o!aocV_^Yur>rVsXfR^`8
-endstream
-endobj
-683 0 obj
-102
-endobj
-684 0 obj
-<< /Length 685 0 R >>
-stream
-q
-5.4 0 0 -4.6 490.4 99.4 cm
-/R682 Do
-Q
-endstream
-endobj
-685 0 obj
-40
-endobj
-686 0 obj
-<< /Type /XObject /Name /R686 /Subtype /Image /Length 687 0 R
-/ImageMask true /Width 61 /Height 80 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 61 /BlackIs1 true >>]
->>
-stream
-,Cs,bCWHJN=?&u&-qa^H'Hg5V5sbq_";DtTYX(S`
-"U#M^:p<5P$O$YI+At1.K#5?3i5G[TII_hJX
-endstream
-endobj
-687 0 obj
-123
-endobj
-688 0 obj
-<< /Length 689 0 R >>
-stream
-q
-6.1 0 0 -8 499.8 101.3 cm
-/R686 Do
-Q
-BT
-1 0 0 1 509.519 94.92 Tm
-(13) Tj
-1 0 0 1 521.999 94.92 Tm
-(\(i.e.,) Tj
-1 0 0 1 315 82.92 Tm
-(systems) Tj
-1 0 0 1 350.52 82.92 Tm
-(that) Tj
-1 0 0 1 369.36 82.92 Tm
-(can) Tj
-1 0 0 1 387.24 82.92 Tm
-(tolerate) Tj
-1 0 0 1 421.08 82.92 Tm
-(up) Tj
-1 0 0 1 435 82.92 Tm
-(to) Tj
-1 0 0 1 446.64 82.92 Tm
-(4) Tj
-1 0 0 1 455.64 82.92 Tm
-(simultaneous) Tj
-1 0 0 1 512.159 82.92 Tm
-(f) Tj
-1 0 0 1 515.399 82.92 Tm
-(aults\),) Tj
-1 0 0 1 315 71.04 Tm
-(which) Tj
-1 0 0 1 341.88 71.04 Tm
-(we) Tj
-1 0 0 1 355.92 71.04 Tm
-(e) Tj
-1 0 0 1 360.24 71.04 Tm
-(xpect) Tj
-1 0 0 1 384.24 71.04 Tm
-(to) Tj
-1 0 0 1 394.56 71.04 Tm
-(be) Tj
-1 0 0 1 406.44 71.04 Tm
-(true) Tj
-1 0 0 1 424.44 71.04 Tm
-(in) Tj
-1 0 0 1 434.64 71.04 Tm
-(most) Tj
-1 0 0 1 456.479 71.04 Tm
-(con\256gurations.) Tj
-1 0 0 1 303.48 35.16 Tm
-(8) Tj
-ET
-Q
-endstream
-endobj
-689 0 obj
-835
-endobj
-690 0 obj
-<<
-/Type /Page
-/MediaBox [0 0 612 792]
-/Parent 2 0 R
-/Resources << /ProcSet [/PDF /ImageB /Text]
-/Font <<
-/R655 655 0 R
-/R644 644 0 R
-/R641 641 0 R
->>
-/XObject <<
-/R686 686 0 R
-/R682 682 0 R
-/R678 678 0 R
-/R674 674 0 R
-/R670 670 0 R
-/R666 666 0 R
-/R662 662 0 R
-/R658 658 0 R
-/R651 651 0 R
-/R647 647 0 R
->>
->>
-/Contents [
-642 0 R
-645 0 R
-649 0 R
-653 0 R
-656 0 R
-660 0 R
-664 0 R
-668 0 R
-672 0 R
-676 0 R
-680 0 R
-684 0 R
-688 0 R
-]
->>
-endobj
-691 0 obj
-<< /Type /Font /Name /R691 /Subtype /Type1 /BaseFont /Times-Bold >>
-endobj
-692 0 obj
-<< /Length 693 0 R >>
-stream
-q
-BT
-/R691 12 Tf
-1 0 0 1 72 709.08 Tm
-(6) Tj
-1 0 0 1 89.8799 709.08 Tm
-(Implementation) Tj
-ET
-endstream
-endobj
-693 0 obj
-94
-endobj
-694 0 obj
-<< /Type /Font /Name /R694 /Subtype /Type1 /BaseFont /Times-Roman >>
-endobj
-695 0 obj
-<< /Length 696 0 R >>
-stream
-BT
-/R694 10 Tf
-1 0 0 1 72 692.4 Tm
-(This) Tj
-1 0 0 1 94.4399 692.4 Tm
-(section) Tj
-1 0 0 1 127.32 692.4 Tm
-(describes) Tj
-1 0 0 1 169.08 692.4 Tm
-(our) Tj
-1 0 0 1 187.08 692.4 Tm
-(implementation.) Tj
-1 0 0 1 262.439 692.4 Tm
-(First) Tj
-1 0 0 1 285.359 692.4 Tm
-(we) Tj
-1 0 0 1 72 680.52 Tm
-(discuss) Tj
-1 0 0 1 105.6 680.52 Tm
-(the) Tj
-1 0 0 1 122.52 680.52 Tm
-(replication) Tj
-1 0 0 1 169.92 680.52 Tm
-(library) Tj
-1 0 0 1 196.08 680.52 Tm
-(,) Tj
-1 0 0 1 203.76 680.52 Tm
-(which) Tj
-1 0 0 1 232.8 680.52 Tm
-(can) Tj
-1 0 0 1 251.399 680.52 Tm
-(be) Tj
-1 0 0 1 265.679 680.52 Tm
-(used) Tj
-1 0 0 1 288.719 680.52 Tm
-(as) Tj
-1 0 0 1 72 668.52 Tm
-(a) Tj
-1 0 0 1 80.6399 668.52 Tm
-(basis) Tj
-1 0 0 1 104.76 668.52 Tm
-(for) Tj
-1 0 0 1 120.6 668.52 Tm
-(an) Tj
-1 0 0 1 129.96 668.52 Tm
-(y) Tj
-1 0 0 1 139.08 668.52 Tm
-(replicated) Tj
-1 0 0 1 182.64 668.52 Tm
-(service.) Tj
-1 0 0 1 222.119 668.52 Tm
-(In) Tj
-1 0 0 1 234.599 668.52 Tm
-(Section) Tj
-1 0 0 1 268.679 668.52 Tm
-(6.2) Tj
-1 0 0 1 285.359 668.52 Tm
-(we) Tj
-1 0 0 1 72 656.64 Tm
-(describe) Tj
-1 0 0 1 108.48 656.64 Tm
-(ho) Tj
-1 0 0 1 118.32 656.64 Tm
-(w) Tj
-1 0 0 1 128.76 656.64 Tm
-(we) Tj
-1 0 0 1 143.64 656.64 Tm
-(implemented) Tj
-1 0 0 1 199.08 656.64 Tm
-(a) Tj
-1 0 0 1 206.76 656.64 Tm
-(replicated) Tj
-1 0 0 1 249.36 656.64 Tm
-(NFS) Tj
-1 0 0 1 270.959 656.64 Tm
-(on) Tj
-1 0 0 1 284.279 656.64 Tm
-(top) Tj
-1 0 0 1 72 644.64 Tm
-(of) Tj
-1 0 0 1 84.6 644.64 Tm
-(the) Tj
-1 0 0 1 101.16 644.64 Tm
-(replication) Tj
-1 0 0 1 148.2 644.64 Tm
-(library) Tj
-1 0 0 1 174.36 644.64 Tm
-(.) Tj
-1 0 0 1 185.76 644.64 Tm
-(Then) Tj
-1 0 0 1 210.6 644.64 Tm
-(we) Tj
-1 0 0 1 226.559 644.64 Tm
-(describe) Tj
-1 0 0 1 264.119 644.64 Tm
-(ho) Tj
-1 0 0 1 273.959 644.64 Tm
-(w) Tj
-1 0 0 1 285.359 644.64 Tm
-(we) Tj
-1 0 0 1 72 632.76 Tm
-(maintain) Tj
-1 0 0 1 111.36 632.76 Tm
-(checkpoints) Tj
-1 0 0 1 163.44 632.76 Tm
-(and) Tj
-1 0 0 1 182.28 632.76 Tm
-(compute) Tj
-1 0 0 1 221.16 632.76 Tm
-(checkpoint) Tj
-1 0 0 1 269.279 632.76 Tm
-(digests) Tj
-1 0 0 1 72 620.76 Tm
-(ef) Tj
-1 0 0 1 79.56 620.76 Tm
-(\256ciently) Tj
-1 0 0 1 111.72 620.76 Tm
-(.) Tj
-/R691 10 Tf
-1 0 0 1 72 599.28 Tm
-(6.1) Tj
-1 0 0 1 94.4399 599.28 Tm
-(The) Tj
-1 0 0 1 113.52 599.28 Tm
-(Replication) Tj
-1 0 0 1 164.76 599.28 Tm
-(Library) Tj
-/R694 10 Tf
-1 0 0 1 72 585 Tm
-(The) Tj
-1 0 0 1 90.4799 585 Tm
-(client) Tj
-1 0 0 1 115.56 585 Tm
-(interf) Tj
-1 0 0 1 137.16 585 Tm
-(ace) Tj
-1 0 0 1 153.24 585 Tm
-(to) Tj
-1 0 0 1 163.92 585 Tm
-(the) Tj
-1 0 0 1 179.16 585 Tm
-(replication) Tj
-1 0 0 1 224.639 585 Tm
-(library) Tj
-1 0 0 1 254.159 585 Tm
-(consists) Tj
-1 0 0 1 288.719 585 Tm
-(of) Tj
-1 0 0 1 72 573 Tm
-(a) Tj
-1 0 0 1 79.4399 573 Tm
-(single) Tj
-1 0 0 1 106.2 573 Tm
-(procedure,) Tj
-ET
-endstream
-endobj
-696 0 obj
-2668
-endobj
-697 0 obj
-<< /Type /Font /Name /R697 /Subtype /Type1 /BaseFont /Times-Italic >>
-endobj
-698 0 obj
-<< /Length 699 0 R >>
-stream
-BT
-/R697 10 Tf
-1 0 0 1 151.68 573 Tm
-(in) Tj
-1 0 0 1 159.12 573 Tm
-(vok) Tj
-1 0 0 1 172.92 573 Tm
-(e) Tj
-/R694 10 Tf
-1 0 0 1 177.36 573 Tm
-(,) Tj
-1 0 0 1 182.88 573 Tm
-(with) Tj
-1 0 0 1 203.639 573 Tm
-(one) Tj
-1 0 0 1 221.039 573 Tm
-(ar) Tj
-1 0 0 1 228.719 573 Tm
-(gument,) Tj
-1 0 0 1 264.119 573 Tm
-(an) Tj
-1 0 0 1 276.479 573 Tm
-(input) Tj
-1 0 0 1 72 561.12 Tm
-(b) Tj
-1 0 0 1 76.8 561.12 Tm
-(uf) Tj
-1 0 0 1 84.96 561.12 Tm
-(fer) Tj
-1 0 0 1 100.32 561.12 Tm
-(containing) Tj
-1 0 0 1 146.76 561.12 Tm
-(a) Tj
-1 0 0 1 155.64 561.12 Tm
-(request) Tj
-1 0 0 1 188.76 561.12 Tm
-(to) Tj
-1 0 0 1 200.88 561.12 Tm
-(in) Tj
-1 0 0 1 208.32 561.12 Tm
-(v) Tj
-1 0 0 1 213.12 561.12 Tm
-(ok) Tj
-1 0 0 1 223.079 561.12 Tm
-(e) Tj
-1 0 0 1 231.719 561.12 Tm
-(a) Tj
-1 0 0 1 240.599 561.12 Tm
-(state) Tj
-1 0 0 1 263.279 561.12 Tm
-(machine) Tj
-1 0 0 1 72 549.12 Tm
-(operation.) Tj
-1 0 0 1 120.48 549.12 Tm
-(The) Tj
-/R697 10 Tf
-1 0 0 1 139.92 549.12 Tm
-(in) Tj
-1 0 0 1 147.36 549.12 Tm
-(vok) Tj
-1 0 0 1 161.16 549.12 Tm
-(e) Tj
-/R694 10 Tf
-1 0 0 1 169.56 549.12 Tm
-(procedure) Tj
-1 0 0 1 213.48 549.12 Tm
-(uses) Tj
-1 0 0 1 234.6 549.12 Tm
-(our) Tj
-1 0 0 1 251.999 549.12 Tm
-(protocol) Tj
-1 0 0 1 289.199 549.12 Tm
-(to) Tj
-1 0 0 1 72 537.12 Tm
-(e) Tj
-1 0 0 1 76.32 537.12 Tm
-(x) Tj
-1 0 0 1 81.24 537.12 Tm
-(ecute) Tj
-1 0 0 1 104.52 537.12 Tm
-(the) Tj
-1 0 0 1 119.16 537.12 Tm
-(requested) Tj
-1 0 0 1 159.72 537.12 Tm
-(operation) Tj
-1 0 0 1 199.8 537.12 Tm
-(at) Tj
-1 0 0 1 209.52 537.12 Tm
-(the) Tj
-1 0 0 1 224.039 537.12 Tm
-(replicas) Tj
-1 0 0 1 257.519 537.12 Tm
-(and) Tj
-1 0 0 1 274.319 537.12 Tm
-(select) Tj
-1 0 0 1 72 525.24 Tm
-(the) Tj
-1 0 0 1 86.2799 525.24 Tm
-(correct) Tj
-1 0 0 1 116.04 525.24 Tm
-(reply) Tj
-1 0 0 1 138.6 525.24 Tm
-(from) Tj
-1 0 0 1 160.08 525.24 Tm
-(among) Tj
-1 0 0 1 189.24 525.24 Tm
-(the) Tj
-1 0 0 1 203.52 525.24 Tm
-(replies) Tj
-1 0 0 1 232.199 525.24 Tm
-(of) Tj
-1 0 0 1 242.519 525.24 Tm
-(the) Tj
-1 0 0 1 256.799 525.24 Tm
-(indi) Tj
-1 0 0 1 272.159 525.24 Tm
-(vidual) Tj
-1 0 0 1 72 513.24 Tm
-(replicas.) Tj
-1 0 0 1 112.2 513.24 Tm
-(It) Tj
-1 0 0 1 121.8 513.24 Tm
-(returns) Tj
-1 0 0 1 153 513.24 Tm
-(a) Tj
-1 0 0 1 160.92 513.24 Tm
-(pointer) Tj
-1 0 0 1 192.6 513.24 Tm
-(to) Tj
-1 0 0 1 203.879 513.24 Tm
-(a) Tj
-1 0 0 1 211.799 513.24 Tm
-(b) Tj
-1 0 0 1 216.599 513.24 Tm
-(uf) Tj
-1 0 0 1 224.759 513.24 Tm
-(fer) Tj
-1 0 0 1 239.279 513.24 Tm
-(containing) Tj
-1 0 0 1 284.879 513.24 Tm
-(the) Tj
-1 0 0 1 72 501.36 Tm
-(operation) Tj
-1 0 0 1 112.08 501.36 Tm
-(result.) Tj
-1 0 0 1 81.96 489.36 Tm
-(On) Tj
-1 0 0 1 99.5999 489.36 Tm
-(the) Tj
-1 0 0 1 117.24 489.36 Tm
-(serv) Tj
-1 0 0 1 133.8 489.36 Tm
-(er) Tj
-1 0 0 1 147 489.36 Tm
-(side,) Tj
-1 0 0 1 171.72 489.36 Tm
-(the) Tj
-1 0 0 1 189.36 489.36 Tm
-(replication) Tj
-1 0 0 1 237.479 489.36 Tm
-(code) Tj
-1 0 0 1 261.719 489.36 Tm
-(mak) Tj
-1 0 0 1 278.879 489.36 Tm
-(es) Tj
-1 0 0 1 292.559 489.36 Tm
-(a) Tj
-1 0 0 1 72 477.36 Tm
-(number) Tj
-1 0 0 1 105.96 477.36 Tm
-(of) Tj
-1 0 0 1 117.72 477.36 Tm
-(upcalls) Tj
-1 0 0 1 149.4 477.36 Tm
-(to) Tj
-1 0 0 1 160.68 477.36 Tm
-(procedures) Tj
-1 0 0 1 207.96 477.36 Tm
-(that) Tj
-1 0 0 1 226.32 477.36 Tm
-(the) Tj
-1 0 0 1 242.04 477.36 Tm
-(serv) Tj
-1 0 0 1 258.599 477.36 Tm
-(er) Tj
-1 0 0 1 269.759 477.36 Tm
-(part) Tj
-1 0 0 1 288.719 477.36 Tm
-(of) Tj
-1 0 0 1 72 465.48 Tm
-(the) Tj
-1 0 0 1 87.7199 465.48 Tm
-(application) Tj
-1 0 0 1 135.6 465.48 Tm
-(must) Tj
-1 0 0 1 158.64 465.48 Tm
-(implement.) Tj
-1 0 0 1 210.72 465.48 Tm
-(There) Tj
-1 0 0 1 237.48 465.48 Tm
-(are) Tj
-1 0 0 1 253.319 465.48 Tm
-(procedures) Tj
-1 0 0 1 72 453.48 Tm
-(to) Tj
-1 0 0 1 82.2 453.48 Tm
-(e) Tj
-1 0 0 1 86.5199 453.48 Tm
-(x) Tj
-1 0 0 1 91.4399 453.48 Tm
-(ecute) Tj
-1 0 0 1 114.84 453.48 Tm
-(requests) Tj
-1 0 0 1 149.88 453.48 Tm
-(\() Tj
-/R697 10 Tf
-1 0 0 1 153.24 453.48 Tm
-(e) Tj
-1 0 0 1 157.44 453.48 Tm
-(xecute) Tj
-/R694 10 Tf
-1 0 0 1 183 453.48 Tm
-(\),) Tj
-1 0 0 1 191.16 453.48 Tm
-(to) Tj
-1 0 0 1 201.36 453.48 Tm
-(maintain) Tj
-1 0 0 1 238.679 453.48 Tm
-(checkpoints) Tj
-1 0 0 1 288.719 453.48 Tm
-(of) Tj
-1 0 0 1 72 441.48 Tm
-(the) Tj
-1 0 0 1 86.0399 441.48 Tm
-(service) Tj
-1 0 0 1 116.04 441.48 Tm
-(state) Tj
-1 0 0 1 136.2 441.48 Tm
-(\() Tj
-/R697 10 Tf
-1 0 0 1 139.56 441.48 Tm
-(mak) Tj
-1 0 0 1 156.12 441.48 Tm
-(e) Tj
-ET
-Q
-q
-W
-0 0 612 792 re
-n
-q
-3 0 0 -0.48 161.148 441.972 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-/R697 10 Tf
-1 0 0 1 164.04 441.48 Tm
-(c) Tj
-1 0 0 1 168.36 441.48 Tm
-(hec) Tj
-1 0 0 1 182.04 441.48 Tm
-(kpoint) Tj
-/R694 10 Tf
-1 0 0 1 207.12 441.48 Tm
-(,) Tj
-/R697 10 Tf
-1 0 0 1 211.319 441.48 Tm
-(delete) Tj
-ET
-q
-3 0 0 -0.48 235.788 441.972 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 238.679 441.48 Tm
-(c) Tj
-1 0 0 1 242.999 441.48 Tm
-(hec) Tj
-1 0 0 1 256.679 441.48 Tm
-(kpoint) Tj
-/R694 10 Tf
-1 0 0 1 281.759 441.48 Tm
-(\),) Tj
-1 0 0 1 289.199 441.48 Tm
-(to) Tj
-1 0 0 1 72 429.6 Tm
-(obtain) Tj
-1 0 0 1 100.32 429.6 Tm
-(the) Tj
-1 0 0 1 115.92 429.6 Tm
-(digest) Tj
-1 0 0 1 143.04 429.6 Tm
-(of) Tj
-1 0 0 1 154.8 429.6 Tm
-(a) Tj
-1 0 0 1 162.6 429.6 Tm
-(speci\256ed) Tj
-1 0 0 1 201.36 429.6 Tm
-(checkpoint) Tj
-1 0 0 1 248.519 429.6 Tm
-(\() Tj
-/R697 10 Tf
-1 0 0 1 251.879 429.6 Tm
-(g) Tj
-1 0 0 1 256.799 429.6 Tm
-(et) Tj
-ET
-q
-3 0 0 -0.48 264.588 430.092 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 267.479 429.6 Tm
-(dig) Tj
-1 0 0 1 280.199 429.6 Tm
-(est) Tj
-/R694 10 Tf
-1 0 0 1 291.239 429.6 Tm
-(\),) Tj
-1 0 0 1 72 417.6 Tm
-(and) Tj
-1 0 0 1 93.48 417.6 Tm
-(to) Tj
-1 0 0 1 108.36 417.6 Tm
-(obtain) Tj
-1 0 0 1 140.4 417.6 Tm
-(missing) Tj
-1 0 0 1 178.56 417.6 Tm
-(information) Tj
-1 0 0 1 232.68 417.6 Tm
-(\() Tj
-/R697 10 Tf
-1 0 0 1 236.04 417.6 Tm
-(g) Tj
-1 0 0 1 240.96 417.6 Tm
-(et) Tj
-ET
-q
-3 0 0 -0.48 248.748 418.092 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 251.639 417.6 Tm
-(c) Tj
-1 0 0 1 255.959 417.6 Tm
-(hec) Tj
-1 0 0 1 269.639 417.6 Tm
-(kpoint) Tj
-/R694 10 Tf
-1 0 0 1 294.719 417.6 Tm
-(,) Tj
-/R697 10 Tf
-1 0 0 1 72 405.72 Tm
-(set) Tj
-ET
-q
-3 0 0 -0.48 83.628 406.212 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 86.6399 405.72 Tm
-(c) Tj
-1 0 0 1 90.9599 405.72 Tm
-(hec) Tj
-1 0 0 1 104.64 405.72 Tm
-(kpoint) Tj
-/R694 10 Tf
-1 0 0 1 129.72 405.72 Tm
-(\).) Tj
-1 0 0 1 138.84 405.72 Tm
-(The) Tj
-/R697 10 Tf
-1 0 0 1 156.72 405.72 Tm
-(e) Tj
-1 0 0 1 160.92 405.72 Tm
-(xecute) Tj
-/R694 10 Tf
-1 0 0 1 188.88 405.72 Tm
-(procedure) Tj
-1 0 0 1 231.12 405.72 Tm
-(recei) Tj
-1 0 0 1 250.319 405.72 Tm
-(v) Tj
-1 0 0 1 255.239 405.72 Tm
-(es) Tj
-1 0 0 1 265.799 405.72 Tm
-(as) Tj
-1 0 0 1 276.479 405.72 Tm
-(input) Tj
-1 0 0 1 72 393.72 Tm
-(a) Tj
-1 0 0 1 78.96 393.72 Tm
-(b) Tj
-1 0 0 1 83.7599 393.72 Tm
-(uf) Tj
-1 0 0 1 91.9199 393.72 Tm
-(fer) Tj
-1 0 0 1 105.48 393.72 Tm
-(containing) Tj
-1 0 0 1 150.12 393.72 Tm
-(the) Tj
-1 0 0 1 164.76 393.72 Tm
-(requested) Tj
-1 0 0 1 205.56 393.72 Tm
-(operation,) Tj
-1 0 0 1 248.279 393.72 Tm
-(e) Tj
-1 0 0 1 252.599 393.72 Tm
-(x) Tj
-1 0 0 1 257.519 393.72 Tm
-(ecutes) Tj
-1 0 0 1 284.879 393.72 Tm
-(the) Tj
-1 0 0 1 72 381.84 Tm
-(operation,) Tj
-1 0 0 1 115.08 381.84 Tm
-(and) Tj
-1 0 0 1 132.24 381.84 Tm
-(places) Tj
-1 0 0 1 159.96 381.84 Tm
-(the) Tj
-1 0 0 1 174.96 381.84 Tm
-(result) Tj
-1 0 0 1 199.92 381.84 Tm
-(in) Tj
-1 0 0 1 210.479 381.84 Tm
-(an) Tj
-1 0 0 1 222.719 381.84 Tm
-(output) Tj
-1 0 0 1 251.039 381.84 Tm
-(b) Tj
-1 0 0 1 255.839 381.84 Tm
-(uf) Tj
-1 0 0 1 263.999 381.84 Tm
-(fer) Tj
-1 0 0 1 274.559 381.84 Tm
-(.) Tj
-1 0 0 1 281.519 381.84 Tm
-(The) Tj
-1 0 0 1 72 369.84 Tm
-(other) Tj
-1 0 0 1 96.7199 369.84 Tm
-(procedures) Tj
-1 0 0 1 144.6 369.84 Tm
-(are) Tj
-1 0 0 1 160.92 369.84 Tm
-(discussed) Tj
-1 0 0 1 203.28 369.84 Tm
-(further) Tj
-1 0 0 1 234.599 369.84 Tm
-(in) Tj
-1 0 0 1 246.599 369.84 Tm
-(Sections) Tj
-1 0 0 1 284.519 369.84 Tm
-(6.3) Tj
-1 0 0 1 72 357.96 Tm
-(and) Tj
-1 0 0 1 88.9199 357.96 Tm
-(6.4.) Tj
-1 0 0 1 81.96 345.84 Tm
-(Point-to-point) Tj
-1 0 0 1 139.8 345.84 Tm
-(communication) Tj
-1 0 0 1 203.76 345.84 Tm
-(betwee) Tj
-1 0 0 1 231.96 345.84 Tm
-(n) Tj
-1 0 0 1 238.56 345.84 Tm
-(no) Tj
-1 0 0 1 248.52 345.84 Tm
-(des) Tj
-1 0 0 1 263.399 345.84 Tm
-(is) Tj
-1 0 0 1 271.559 345.84 Tm
-(imple-) Tj
-1 0 0 1 72 333.96 Tm
-(mented) Tj
-1 0 0 1 103.44 333.96 Tm
-(using) Tj
-1 0 0 1 127.2 333.96 Tm
-(UDP) Tj
-1 0 0 1 146.04 333.96 Tm
-(,) Tj
-1 0 0 1 150.72 333.96 Tm
-(and) Tj
-1 0 0 1 167.28 333.96 Tm
-(multicast) Tj
-1 0 0 1 205.92 333.96 Tm
-(to) Tj
-1 0 0 1 215.88 333.96 Tm
-(the) Tj
-1 0 0 1 230.16 333.96 Tm
-(group) Tj
-1 0 0 1 255.599 333.96 Tm
-(of) Tj
-1 0 0 1 266.039 333.96 Tm
-(replicas) Tj
-1 0 0 1 72 321.96 Tm
-(is) Tj
-1 0 0 1 81.48 321.96 Tm
-(implemented) Tj
-1 0 0 1 136.44 321.96 Tm
-(using) Tj
-1 0 0 1 160.8 321.96 Tm
-(UDP) Tj
-1 0 0 1 183.6 321.96 Tm
-(o) Tj
-1 0 0 1 188.52 321.96 Tm
-(v) Tj
-1 0 0 1 193.44 321.96 Tm
-(er) Tj
-1 0 0 1 203.88 321.96 Tm
-(IP) Tj
-1 0 0 1 215.52 321.96 Tm
-(multicast) Tj
-1 0 0 1 254.999 321.96 Tm
-([7) Tj
-1 0 0 1 263.279 321.96 Tm
-(].) Tj
-1 0 0 1 273.719 321.96 Tm
-(There) Tj
-1 0 0 1 72 310.08 Tm
-(is) Tj
-1 0 0 1 80.52 310.08 Tm
-(a) Tj
-1 0 0 1 86.7599 310.08 Tm
-(single) Tj
-1 0 0 1 112.44 310.08 Tm
-(IP) Tj
-1 0 0 1 123.24 310.08 Tm
-(multicast) Tj
-1 0 0 1 161.64 310.08 Tm
-(group) Tj
-1 0 0 1 186.72 310.08 Tm
-(for) Tj
-1 0 0 1 200.279 310.08 Tm
-(each) Tj
-1 0 0 1 220.319 310.08 Tm
-(service,) Tj
-1 0 0 1 253.079 310.08 Tm
-(which) Tj
-1 0 0 1 279.239 310.08 Tm
-(con-) Tj
-1 0 0 1 72 298.08 Tm
-(tains) Tj
-1 0 0 1 92.8799 298.08 Tm
-(all) Tj
-1 0 0 1 104.76 298.08 Tm
-(the) Tj
-1 0 0 1 119.04 298.08 Tm
-(replicas.) Tj
-1 0 0 1 155.88 298.08 Tm
-(These) Tj
-1 0 0 1 181.68 298.08 Tm
-(communication) Tj
-1 0 0 1 245.759 298.08 Tm
-(protocols) Tj
-1 0 0 1 284.879 298.08 Tm
-(are) Tj
-1 0 0 1 72 286.2 Tm
-(unreliable;) Tj
-1 0 0 1 116.64 286.2 Tm
-(the) Tj
-1 0 0 1 128.76 286.2 Tm
-(y) Tj
-1 0 0 1 135.36 286.2 Tm
-(may) Tj
-1 0 0 1 154.2 286.2 Tm
-(duplicate) Tj
-1 0 0 1 192.48 286.2 Tm
-(or) Tj
-1 0 0 1 202.56 286.2 Tm
-(lose) Tj
-1 0 0 1 220.319 286.2 Tm
-(messages) Tj
-1 0 0 1 259.679 286.2 Tm
-(or) Tj
-1 0 0 1 269.759 286.2 Tm
-(deli) Tj
-1 0 0 1 284.519 286.2 Tm
-(v) Tj
-1 0 0 1 289.439 286.2 Tm
-(er) Tj
-1 0 0 1 72 274.2 Tm
-(them) Tj
-1 0 0 1 94.4399 274.2 Tm
-(out) Tj
-1 0 0 1 109.68 274.2 Tm
-(of) Tj
-1 0 0 1 120.48 274.2 Tm
-(order) Tj
-1 0 0 1 141.12 274.2 Tm
-(.) Tj
-1 0 0 1 81.96 262.2 Tm
-(The) Tj
-1 0 0 1 103.8 262.2 Tm
-(algorithm) Tj
-1 0 0 1 148.92 262.2 Tm
-(tolerates) Tj
-1 0 0 1 189 262.2 Tm
-(out-of-order) Tj
-1 0 0 1 243.959 262.2 Tm
-(deli) Tj
-1 0 0 1 258.719 262.2 Tm
-(v) Tj
-1 0 0 1 263.639 262.2 Tm
-(ery) Tj
-1 0 0 1 282.599 262.2 Tm
-(and) Tj
-1 0 0 1 72 250.2 Tm
-(rejects) Tj
-1 0 0 1 100.8 250.2 Tm
-(duplicates.) Tj
-1 0 0 1 148.32 250.2 Tm
-(V) Tj
-1 0 0 1 154.92 250.2 Tm
-(ie) Tj
-1 0 0 1 161.88 250.2 Tm
-(w) Tj
-1 0 0 1 171.96 250.2 Tm
-(changes) Tj
-1 0 0 1 206.88 250.2 Tm
-(can) Tj
-1 0 0 1 223.56 250.2 Tm
-(be) Tj
-1 0 0 1 235.8 250.2 Tm
-(used) Tj
-1 0 0 1 256.799 250.2 Tm
-(to) Tj
-1 0 0 1 267.479 250.2 Tm
-(reco) Tj
-1 0 0 1 284.639 250.2 Tm
-(v) Tj
-1 0 0 1 289.559 250.2 Tm
-(er) Tj
-1 0 0 1 72 238.32 Tm
-(from) Tj
-1 0 0 1 93.8399 238.32 Tm
-(lost) Tj
-1 0 0 1 110.76 238.32 Tm
-(messages,) Tj
-1 0 0 1 153.36 238.32 Tm
-(b) Tj
-1 0 0 1 158.16 238.32 Tm
-(ut) Tj
-1 0 0 1 168.36 238.32 Tm
-(this) Tj
-1 0 0 1 185.28 238.32 Tm
-(is) Tj
-1 0 0 1 194.4 238.32 Tm
-(e) Tj
-1 0 0 1 198.72 238.32 Tm
-(xpensi) Tj
-1 0 0 1 224.64 238.32 Tm
-(v) Tj
-1 0 0 1 229.56 238.32 Tm
-(e) Tj
-1 0 0 1 236.159 238.32 Tm
-(and) Tj
-1 0 0 1 253.079 238.32 Tm
-(therefore) Tj
-1 0 0 1 291.479 238.32 Tm
-(it) Tj
-1 0 0 1 72 226.32 Tm
-(is) Tj
-1 0 0 1 81.48 226.32 Tm
-(important) Tj
-1 0 0 1 123.12 226.32 Tm
-(to) Tj
-1 0 0 1 133.68 226.32 Tm
-(perform) Tj
-1 0 0 1 168.6 226.32 Tm
-(retransmissions.) Tj
-1 0 0 1 237.719 226.32 Tm
-(During) Tj
-1 0 0 1 268.799 226.32 Tm
-(normal) Tj
-1 0 0 1 72 214.44 Tm
-(operation) Tj
-1 0 0 1 115.32 214.44 Tm
-(reco) Tj
-1 0 0 1 132.48 214.44 Tm
-(v) Tj
-1 0 0 1 137.4 214.44 Tm
-(ery) Tj
-1 0 0 1 155.52 214.44 Tm
-(from) Tj
-1 0 0 1 180.6 214.44 Tm
-(lost) Tj
-1 0 0 1 200.64 214.44 Tm
-(messages) Tj
-1 0 0 1 243.96 214.44 Tm
-(is) Tj
-1 0 0 1 256.319 214.44 Tm
-(dri) Tj
-1 0 0 1 267.239 214.44 Tm
-(v) Tj
-1 0 0 1 272.159 214.44 Tm
-(en) Tj
-1 0 0 1 287.039 214.44 Tm
-(by) Tj
-1 0 0 1 72 202.44 Tm
-(the) Tj
-1 0 0 1 88.1999 202.44 Tm
-(recei) Tj
-1 0 0 1 107.4 202.44 Tm
-(v) Tj
-1 0 0 1 112.32 202.44 Tm
-(er:) Tj
-1 0 0 1 129.24 202.44 Tm
-(backups) Tj
-1 0 0 1 165.84 202.44 Tm
-(send) Tj
-1 0 0 1 188.16 202.44 Tm
-(ne) Tj
-1 0 0 1 197.52 202.44 Tm
-(gati) Tj
-1 0 0 1 212.28 202.44 Tm
-(v) Tj
-1 0 0 1 217.2 202.44 Tm
-(e) Tj
-1 0 0 1 225.359 202.44 Tm
-(ackno) Tj
-1 0 0 1 249.119 202.44 Tm
-(wledgments) Tj
-1 0 0 1 72 190.56 Tm
-(to) Tj
-1 0 0 1 85.56 190.56 Tm
-(the) Tj
-1 0 0 1 103.68 190.56 Tm
-(primary) Tj
-1 0 0 1 141 190.56 Tm
-(when) Tj
-1 0 0 1 168.48 190.56 Tm
-(the) Tj
-1 0 0 1 180.6 190.56 Tm
-(y) Tj
-1 0 0 1 191.4 190.56 Tm
-(are) Tj
-1 0 0 1 209.4 190.56 Tm
-(out) Tj
-1 0 0 1 228 190.56 Tm
-(of) Tj
-1 0 0 1 242.159 190.56 Tm
-(date) Tj
-1 0 0 1 264.599 190.56 Tm
-(and) Tj
-1 0 0 1 284.879 190.56 Tm
-(the) Tj
-1 0 0 1 72 178.56 Tm
-(primary) Tj
-1 0 0 1 107.76 178.56 Tm
-(retransmits) Tj
-1 0 0 1 156.24 178.56 Tm
-(pre-prepare) Tj
-1 0 0 1 206.4 178.56 Tm
-(messages) Tj
-1 0 0 1 248.159 178.56 Tm
-(after) Tj
-1 0 0 1 270.599 178.56 Tm
-(a) Tj
-1 0 0 1 279.239 178.56 Tm
-(long) Tj
-1 0 0 1 72 166.68 Tm
-(timeout.) Tj
-1 0 0 1 113.76 166.68 Tm
-(A) Tj
-1 0 0 1 125.16 166.68 Tm
-(reply) Tj
-1 0 0 1 149.88 166.68 Tm
-(to) Tj
-1 0 0 1 161.76 166.68 Tm
-(a) Tj
-1 0 0 1 170.4 166.68 Tm
-(ne) Tj
-1 0 0 1 179.76 166.68 Tm
-(gati) Tj
-1 0 0 1 194.52 166.68 Tm
-(v) Tj
-1 0 0 1 199.44 166.68 Tm
-(e) Tj
-1 0 0 1 207.84 166.68 Tm
-(ackno) Tj
-1 0 0 1 231.6 166.68 Tm
-(wledgment) Tj
-1 0 0 1 279.839 166.68 Tm
-(may) Tj
-1 0 0 1 72 154.68 Tm
-(include) Tj
-1 0 0 1 103.56 154.68 Tm
-(both) Tj
-1 0 0 1 123.36 154.68 Tm
-(a) Tj
-1 0 0 1 130.08 154.68 Tm
-(portion) Tj
-1 0 0 1 161.04 154.68 Tm
-(of) Tj
-1 0 0 1 171.48 154.68 Tm
-(a) Tj
-1 0 0 1 178.08 154.68 Tm
-(stable) Tj
-1 0 0 1 203.52 154.68 Tm
-(checkpoint) Tj
-1 0 0 1 249.479 154.68 Tm
-(and) Tj
-1 0 0 1 266.039 154.68 Tm
-(missing) Tj
-1 0 0 1 72 142.8 Tm
-(messages.) Tj
-1 0 0 1 123.12 142.8 Tm
-(During) Tj
-1 0 0 1 156.36 142.8 Tm
-(vie) Tj
-1 0 0 1 168.36 142.8 Tm
-(w) Tj
-1 0 0 1 180.48 142.8 Tm
-(changes,) Tj
-1 0 0 1 220.68 142.8 Tm
-(replicas) Tj
-1 0 0 1 256.56 142.8 Tm
-(retransmit) Tj
-1 0 0 1 72 130.8 Tm
-(vie) Tj
-1 0 0 1 84 130.8 Tm
-(w-change) Tj
-1 0 0 1 124.32 130.8 Tm
-(messages) Tj
-1 0 0 1 163.68 130.8 Tm
-(until) Tj
-1 0 0 1 183.6 130.8 Tm
-(the) Tj
-1 0 0 1 195.72 130.8 Tm
-(y) Tj
-1 0 0 1 202.32 130.8 Tm
-(recei) Tj
-1 0 0 1 221.52 130.8 Tm
-(v) Tj
-1 0 0 1 226.44 130.8 Tm
-(e) Tj
-1 0 0 1 232.44 130.8 Tm
-(a) Tj
-1 0 0 1 238.559 130.8 Tm
-(matching) Tj
-1 0 0 1 277.319 130.8 Tm
-(ne) Tj
-1 0 0 1 286.559 130.8 Tm
-(w-) Tj
-1 0 0 1 72 118.92 Tm
-(vie) Tj
-1 0 0 1 84 118.92 Tm
-(w) Tj
-1 0 0 1 93.5999 118.92 Tm
-(message) Tj
-1 0 0 1 129.84 118.92 Tm
-(or) Tj
-1 0 0 1 140.64 118.92 Tm
-(the) Tj
-1 0 0 1 152.76 118.92 Tm
-(y) Tj
-1 0 0 1 160.08 118.92 Tm
-(mo) Tj
-1 0 0 1 172.8 118.92 Tm
-(v) Tj
-1 0 0 1 177.72 118.92 Tm
-(e) Tj
-1 0 0 1 184.44 118.92 Tm
-(on) Tj
-1 0 0 1 196.92 118.92 Tm
-(to) Tj
-1 0 0 1 207.12 118.92 Tm
-(a) Tj
-1 0 0 1 214.079 118.92 Tm
-(later) Tj
-1 0 0 1 234.239 118.92 Tm
-(vie) Tj
-1 0 0 1 246.239 118.92 Tm
-(w) Tj
-1 0 0 1 252.839 118.92 Tm
-(.) Tj
-1 0 0 1 81.96 106.8 Tm
-(The) Tj
-1 0 0 1 103.68 106.8 Tm
-(replication) Tj
-1 0 0 1 152.64 106.8 Tm
-(library) Tj
-1 0 0 1 185.4 106.8 Tm
-(does) Tj
-1 0 0 1 210 106.8 Tm
-(not) Tj
-1 0 0 1 228.96 106.8 Tm
-(implement) Tj
-1 0 0 1 277.919 106.8 Tm
-(vie) Tj
-1 0 0 1 289.919 106.8 Tm
-(w) Tj
-1 0 0 1 72 94.92 Tm
-(changes) Tj
-1 0 0 1 110.64 94.92 Tm
-(or) Tj
-1 0 0 1 125.4 94.92 Tm
-(retransmissions) Tj
-1 0 0 1 193.92 94.92 Tm
-(at) Tj
-1 0 0 1 207.6 94.92 Tm
-(present.) Tj
-1 0 0 1 254.52 94.92 Tm
-(This) Tj
-1 0 0 1 278.759 94.92 Tm
-(does) Tj
-1 0 0 1 72 82.92 Tm
-(not) Tj
-1 0 0 1 91.4399 82.92 Tm
-(compromise) Tj
-1 0 0 1 147.48 82.92 Tm
-(the) Tj
-1 0 0 1 166.44 82.92 Tm
-(accurac) Tj
-1 0 0 1 196.92 82.92 Tm
-(y) Tj
-1 0 0 1 208.44 82.92 Tm
-(of) Tj
-1 0 0 1 223.56 82.92 Tm
-(the) Tj
-1 0 0 1 242.52 82.92 Tm
-(results) Tj
-1 0 0 1 275.279 82.92 Tm
-(gi) Tj
-1 0 0 1 282.839 82.92 Tm
-(v) Tj
-1 0 0 1 287.759 82.92 Tm
-(en) Tj
-1 0 0 1 72 71.04 Tm
-(in) Tj
-1 0 0 1 86.28 71.04 Tm
-(Section) Tj
-1 0 0 1 122.64 71.04 Tm
-(7) Tj
-1 0 0 1 134.04 71.04 Tm
-(because) Tj
-1 0 0 1 172.08 71.04 Tm
-(the) Tj
-1 0 0 1 190.8 71.04 Tm
-(rest) Tj
-1 0 0 1 211.68 71.04 Tm
-(of) Tj
-1 0 0 1 226.44 71.04 Tm
-(the) Tj
-1 0 0 1 245.159 71.04 Tm
-(algorithm) Tj
-1 0 0 1 290.399 71.04 Tm
-(is) Tj
-1 0 0 1 315 709.08 Tm
-(completely) Tj
-1 0 0 1 362.16 709.08 Tm
-(implemented) Tj
-1 0 0 1 417.12 709.08 Tm
-(\(including) Tj
-1 0 0 1 461.04 709.08 Tm
-(the) Tj
-1 0 0 1 476.16 709.08 Tm
-(manipulation) Tj
-1 0 0 1 531.719 709.08 Tm
-(of) Tj
-1 0 0 1 315 697.08 Tm
-(the) Tj
-1 0 0 1 331.44 697.08 Tm
-(timers) Tj
-1 0 0 1 360.72 697.08 Tm
-(that) Tj
-1 0 0 1 379.92 697.08 Tm
-(trigger) Tj
-1 0 0 1 410.76 697.08 Tm
-(vie) Tj
-1 0 0 1 422.76 697.08 Tm
-(w) Tj
-1 0 0 1 434.16 697.08 Tm
-(changes\)) Tj
-1 0 0 1 473.879 697.08 Tm
-(and) Tj
-1 0 0 1 492.599 697.08 Tm
-(because) Tj
-1 0 0 1 528.359 697.08 Tm
-(we) Tj
-1 0 0 1 315 685.2 Tm
-(ha) Tj
-1 0 0 1 324.24 685.2 Tm
-(v) Tj
-1 0 0 1 329.16 685.2 Tm
-(e) Tj
-1 0 0 1 336.96 685.2 Tm
-(formalized) Tj
-1 0 0 1 383.64 685.2 Tm
-(the) Tj
-1 0 0 1 399.36 685.2 Tm
-(complete) Tj
-1 0 0 1 439.44 685.2 Tm
-(algorithm) Tj
-1 0 0 1 481.799 685.2 Tm
-(and) Tj
-1 0 0 1 499.679 685.2 Tm
-(pro) Tj
-1 0 0 1 512.999 685.2 Tm
-(v) Tj
-1 0 0 1 517.919 685.2 Tm
-(ed) Tj
-1 0 0 1 530.639 685.2 Tm
-(its) Tj
-1 0 0 1 315 673.2 Tm
-(correctness) Tj
-1 0 0 1 362.28 673.2 Tm
-([4) Tj
-1 0 0 1 370.56 673.2 Tm
-(].) Tj
-/R691 10 Tf
-1 0 0 1 315 650.04 Tm
-(6.2) Tj
-1 0 0 1 337.44 650.04 Tm
-(BFS:) Tj
-1 0 0 1 361.44 650.04 Tm
-(A) Tj
-1 0 0 1 371.16 650.04 Tm
-(Byzantine-F) Tj
-1 0 0 1 423.12 650.04 Tm
-(ault-tolerant) Tj
-1 0 0 1 479.16 650.04 Tm
-(File) Tj
-1 0 0 1 497.639 650.04 Tm
-(System) Tj
-/R694 10 Tf
-1 0 0 1 315 635.04 Tm
-(W) Tj
-1 0 0 1 323.52 635.04 Tm
-(e) Tj
-1 0 0 1 332.28 635.04 Tm
-(implemented) Tj
-1 0 0 1 388.56 635.04 Tm
-(BFS,) Tj
-1 0 0 1 413.16 635.04 Tm
-(a) Tj
-1 0 0 1 421.8 635.04 Tm
-(Byzantine-f) Tj
-1 0 0 1 468.96 635.04 Tm
-(ault-tolerant) Tj
-1 0 0 1 521.759 635.04 Tm
-(NFS) Tj
-1 0 0 1 315 623.16 Tm
-(service,) Tj
-1 0 0 1 348.24 623.16 Tm
-(using) Tj
-1 0 0 1 372.48 623.16 Tm
-(the) Tj
-1 0 0 1 387.12 623.16 Tm
-(replication) Tj
-1 0 0 1 432.36 623.16 Tm
-(library) Tj
-1 0 0 1 458.519 623.16 Tm
-(.) Tj
-1 0 0 1 464.519 623.16 Tm
-(Figure) Tj
-1 0 0 1 493.079 623.16 Tm
-(2) Tj
-1 0 0 1 500.639 623.16 Tm
-(sho) Tj
-1 0 0 1 514.319 623.16 Tm
-(ws) Tj
-1 0 0 1 527.879 623.16 Tm
-(the) Tj
-1 0 0 1 315 611.16 Tm
-(architecture) Tj
-1 0 0 1 365.16 611.16 Tm
-(of) Tj
-1 0 0 1 376.56 611.16 Tm
-(BFS.) Tj
-1 0 0 1 399.84 611.16 Tm
-(W) Tj
-1 0 0 1 408.36 611.16 Tm
-(e) Tj
-1 0 0 1 416.04 611.16 Tm
-(opted) Tj
-1 0 0 1 441.24 611.16 Tm
-(not) Tj
-1 0 0 1 457.199 611.16 Tm
-(to) Tj
-1 0 0 1 467.999 611.16 Tm
-(modify) Tj
-1 0 0 1 499.919 611.16 Tm
-(the) Tj
-1 0 0 1 515.159 611.16 Tm
-(k) Tj
-1 0 0 1 520.079 611.16 Tm
-(ernel) Tj
-1 0 0 1 315 599.28 Tm
-(NFS) Tj
-1 0 0 1 334.92 599.28 Tm
-(client) Tj
-1 0 0 1 358.8 599.28 Tm
-(and) Tj
-1 0 0 1 374.88 599.28 Tm
-(serv) Tj
-1 0 0 1 391.44 599.28 Tm
-(er) Tj
-1 0 0 1 400.68 599.28 Tm
-(because) Tj
-1 0 0 1 433.92 599.28 Tm
-(we) Tj
-1 0 0 1 447.24 599.28 Tm
-(did) Tj
-1 0 0 1 461.639 599.28 Tm
-(not) Tj
-1 0 0 1 476.159 599.28 Tm
-(ha) Tj
-1 0 0 1 485.399 599.28 Tm
-(v) Tj
-1 0 0 1 490.319 599.28 Tm
-(e) Tj
-1 0 0 1 496.199 599.28 Tm
-(the) Tj
-1 0 0 1 510.119 599.28 Tm
-(sources) Tj
-1 0 0 1 315 587.28 Tm
-(for) Tj
-1 0 0 1 329.16 587.28 Tm
-(the) Tj
-1 0 0 1 343.8 587.28 Tm
-(Digital) Tj
-1 0 0 1 373.92 587.28 Tm
-(Unix) Tj
-1 0 0 1 396.36 587.28 Tm
-(k) Tj
-1 0 0 1 401.28 587.28 Tm
-(ernel.) Tj
-1 0 0 1 324.96 574.92 Tm
-(A) Tj
-1 0 0 1 333.72 574.92 Tm
-(\256le) Tj
-1 0 0 1 348 574.92 Tm
-(system) Tj
-1 0 0 1 377.28 574.92 Tm
-(e) Tj
-1 0 0 1 381.6 574.92 Tm
-(xported) Tj
-1 0 0 1 413.88 574.92 Tm
-(by) Tj
-1 0 0 1 425.52 574.92 Tm
-(the) Tj
-1 0 0 1 439.32 574.92 Tm
-(f) Tj
-1 0 0 1 442.44 574.92 Tm
-(ault-to) Tj
-1 0 0 1 468.479 574.92 Tm
-(leran) Tj
-1 0 0 1 488.399 574.92 Tm
-(t) Tj
-1 0 0 1 492.719 574.92 Tm
-(NFS) Tj
-1 0 0 1 512.519 574.92 Tm
-(serv) Tj
-1 0 0 1 529.079 574.92 Tm
-(ice) Tj
-1 0 0 1 315 563.04 Tm
-(is) Tj
-1 0 0 1 324.96 563.04 Tm
-(mounted) Tj
-1 0 0 1 363.24 563.04 Tm
-(on) Tj
-1 0 0 1 376.44 563.04 Tm
-(the) Tj
-1 0 0 1 392.04 563.04 Tm
-(client) Tj
-1 0 0 1 417.48 563.04 Tm
-(machine) Tj
-1 0 0 1 454.56 563.04 Tm
-(lik) Tj
-1 0 0 1 465 563.04 Tm
-(e) Tj
-1 0 0 1 472.8 563.04 Tm
-(an) Tj
-1 0 0 1 482.16 563.04 Tm
-(y) Tj
-1 0 0 1 490.319 563.04 Tm
-(re) Tj
-1 0 0 1 497.999 563.04 Tm
-(gular) Tj
-1 0 0 1 521.759 563.04 Tm
-(NFS) Tj
-1 0 0 1 315 551.04 Tm
-(\256le) Tj
-1 0 0 1 331.2 551.04 Tm
-(system.) Tj
-1 0 0 1 367.92 551.04 Tm
-(Application) Tj
-1 0 0 1 418.32 551.04 Tm
-(processes) Tj
-1 0 0 1 459.96 551.04 Tm
-(run) Tj
-1 0 0 1 476.76 551.04 Tm
-(unmodi\256ed) Tj
-1 0 0 1 525.599 551.04 Tm
-(and) Tj
-1 0 0 1 315 539.16 Tm
-(interact) Tj
-1 0 0 1 348.48 539.16 Tm
-(with) Tj
-1 0 0 1 369.72 539.16 Tm
-(the) Tj
-1 0 0 1 385.44 539.16 Tm
-(mounted) Tj
-1 0 0 1 423.84 539.16 Tm
-(\256le) Tj
-1 0 0 1 440.16 539.16 Tm
-(system) Tj
-1 0 0 1 471.479 539.16 Tm
-(through) Tj
-1 0 0 1 506.039 539.16 Tm
-(the) Tj
-1 0 0 1 521.759 539.16 Tm
-(NFS) Tj
-1 0 0 1 315 527.16 Tm
-(client) Tj
-1 0 0 1 339.36 527.16 Tm
-(in) Tj
-1 0 0 1 349.32 527.16 Tm
-(the) Tj
-1 0 0 1 363.72 527.16 Tm
-(k) Tj
-1 0 0 1 368.64 527.16 Tm
-(ernel.) Tj
-1 0 0 1 394.44 527.16 Tm
-(W) Tj
-1 0 0 1 402.96 527.16 Tm
-(e) Tj
-1 0 0 1 409.68 527.16 Tm
-(rely) Tj
-1 0 0 1 427.44 527.16 Tm
-(on) Tj
-1 0 0 1 439.559 527.16 Tm
-(user) Tj
-1 0 0 1 458.399 527.16 Tm
-(le) Tj
-1 0 0 1 465.359 527.16 Tm
-(v) Tj
-1 0 0 1 470.279 527.16 Tm
-(el) Tj
-/R697 10 Tf
-1 0 0 1 479.519 527.16 Tm
-(r) Tj
-1 0 0 1 482.999 527.16 Tm
-(elay) Tj
-/R694 10 Tf
-1 0 0 1 501.839 527.16 Tm
-(processes) Tj
-1 0 0 1 315 515.28 Tm
-(to) Tj
-1 0 0 1 327.12 515.28 Tm
-(mediate) Tj
-1 0 0 1 363.12 515.28 Tm
-(communication) Tj
-1 0 0 1 429.48 515.28 Tm
-(between) Tj
-1 0 0 1 467.04 515.28 Tm
-(the) Tj
-1 0 0 1 483.6 515.28 Tm
-(standard) Tj
-1 0 0 1 521.759 515.28 Tm
-(NFS) Tj
-1 0 0 1 315 503.28 Tm
-(client) Tj
-1 0 0 1 340.68 503.28 Tm
-(and) Tj
-1 0 0 1 358.68 503.28 Tm
-(the) Tj
-1 0 0 1 374.52 503.28 Tm
-(replicas.) Tj
-1 0 0 1 414.84 503.28 Tm
-(A) Tj
-1 0 0 1 425.64 503.28 Tm
-(relay) Tj
-1 0 0 1 449.16 503.28 Tm
-(recei) Tj
-1 0 0 1 468.359 503.28 Tm
-(v) Tj
-1 0 0 1 473.279 503.28 Tm
-(es) Tj
-1 0 0 1 484.919 503.28 Tm
-(NFS) Tj
-1 0 0 1 506.759 503.28 Tm
-(protocol) Tj
-1 0 0 1 315 491.4 Tm
-(requests,) Tj
-1 0 0 1 354.72 491.4 Tm
-(calls) Tj
-1 0 0 1 377.28 491.4 Tm
-(the) Tj
-/R697 10 Tf
-1 0 0 1 393.6 491.4 Tm
-(in) Tj
-1 0 0 1 401.04 491.4 Tm
-(vok) Tj
-1 0 0 1 414.84 491.4 Tm
-(e) Tj
-/R694 10 Tf
-1 0 0 1 423.36 491.4 Tm
-(procedure) Tj
-1 0 0 1 467.399 491.4 Tm
-(of) Tj
-1 0 0 1 479.879 491.4 Tm
-(our) Tj
-1 0 0 1 497.399 491.4 Tm
-(replication) Tj
-1 0 0 1 315 479.4 Tm
-(library) Tj
-1 0 0 1 341.16 479.4 Tm
-(,) Tj
-1 0 0 1 345.84 479.4 Tm
-(and) Tj
-1 0 0 1 362.76 479.4 Tm
-(sends) Tj
-1 0 0 1 387.36 479.4 Tm
-(the) Tj
-1 0 0 1 402.12 479.4 Tm
-(result) Tj
-1 0 0 1 426.72 479.4 Tm
-(back) Tj
-1 0 0 1 447.959 479.4 Tm
-(to) Tj
-1 0 0 1 458.279 479.4 Tm
-(the) Tj
-1 0 0 1 472.919 479.4 Tm
-(NFS) Tj
-1 0 0 1 493.679 479.4 Tm
-(client.) Tj
-ET
-1 i
-346.202 420.898 m
-346.52 419.464 l
-347.898 419.767 l
-347.739 420.484 l
-347.65 421.213 l
-347.615 421.209 l
-f
-347.65 421.213 m
-347.827 419.755 l
-349.122 419.911 l
-349.034 420.64 l
-349 421.373 l
-348.972 421.372 l
-f
-349 421.373 m
-349.068 419.906 l
-350.309 419.964 l
-350.274 420.697 l
-350.269 421.431 l
-350.255 421.431 l
-f
-350.269 421.431 m
-350.279 419.963 l
-351.492 419.971 l
-351.487 420.7 l
-351.487 421.434 l
-351.482 421.44 l
-f
-351.487 421.434 m
-351.487 419.966 l
-356.32 419.966 l
-356.32 420.7 l
-356.32 421.434 l
-356.32 421.434 l
-f
-356.32 421.434 m
-356.32 419.966 l
-361.153 419.966 l
-361.153 420.7 l
-361.153 421.434 l
-361.153 421.434 l
-f
-361.153 421.434 m
-361.153 419.966 l
-365.987 419.966 l
-365.987 420.7 l
-365.987 421.434 l
-365.987 421.434 l
-f
-365.987 421.434 m
-365.987 419.966 l
-370.746 419.966 l
-370.746 420.7 l
-370.746 421.434 l
-370.746 421.434 l
-f
-370.746 421.434 m
-370.746 419.966 l
-375.287 419.966 l
-375.287 420.7 l
-375.287 421.434 l
-375.287 421.434 l
-f
-375.287 421.434 m
-375.287 419.966 l
-380.046 419.966 l
-380.046 420.7 l
-380.046 421.434 l
-380.046 421.434 l
-f
-380.046 421.434 m
-380.046 419.966 l
-384.88 419.966 l
-384.88 420.7 l
-384.88 421.434 l
-384.88 421.434 l
-f
-384.88 421.434 m
-384.88 419.966 l
-389.713 419.966 l
-389.713 420.7 l
-389.713 421.434 l
-389.713 421.434 l
-f
-389.713 421.434 m
-389.713 419.966 l
-394.546 419.966 l
-394.546 420.7 l
-394.546 421.434 l
-394.546 421.434 l
-f
-394.546 421.434 m
-394.546 419.966 l
-399.379 419.966 l
-399.379 420.7 l
-399.379 421.434 l
-399.379 421.434 l
-f
-399.379 421.434 m
-399.379 419.966 l
-404.139 419.966 l
-404.139 420.7 l
-404.139 421.434 l
-404.139 421.434 l
-f
-404.139 421.434 m
-404.139 419.966 l
-408.679 419.966 l
-408.679 420.7 l
-408.679 421.434 l
-408.679 421.434 l
-f
-408.679 421.434 m
-408.679 419.966 l
-413.439 419.966 l
-413.439 420.7 l
-413.439 421.434 l
-413.439 421.434 l
-f
-413.439 421.434 m
-413.439 419.966 l
-418.272 419.966 l
-418.272 420.7 l
-418.272 421.434 l
-418.272 421.434 l
-f
-418.272 421.434 m
-418.272 419.966 l
-423.105 419.966 l
-423.105 420.7 l
-423.105 421.434 l
-423.105 421.434 l
-f
-423.105 421.434 m
-423.105 419.966 l
-427.938 419.966 l
-427.938 420.7 l
-427.938 421.434 l
-427.938 421.434 l
-f
-427.938 421.434 m
-427.938 419.966 l
-432.698 419.966 l
-432.698 420.705 l
-432.703 421.44 l
-432.698 421.434 l
-f
-432.703 421.44 m
-432.693 419.971 l
-433.839 419.963 l
-433.845 420.697 l
-433.881 421.431 l
-433.866 421.431 l
-f
-433.881 421.431 m
-433.808 419.964 l
-434.968 419.906 l
-435.005 420.64 l
-435.099 421.368 l
-435.07 421.372 l
-f
-435.099 421.368 m
-434.911 419.911 l
-436.126 419.756 l
-436.22 420.484 l
-436.387 421.199 l
-436.351 421.208 l
-f
-436.387 421.199 m
-436.053 419.769 l
-437.364 419.466 l
-437.531 420.181 l
-437.773 420.875 l
-437.736 420.887 l
-f
-437.773 420.875 m
-437.289 419.487 l
-438.716 418.994 l
-438.958 419.688 l
-439.274 420.352 l
-439.238 420.369 l
-f
-439.274 420.352 m
-438.642 419.025 l
-440.117 418.328 l
-440.433 418.992 l
-440.829 419.611 l
-440.79 419.636 l
-f
-440.829 419.611 m
-440.037 418.372 l
-441.471 417.465 l
-441.867 418.085 l
-442.35 418.639 l
-442.308 418.675 l
-f
-442.35 418.639 m
-441.383 417.53 l
-442.687 416.405 l
-443.17 416.96 l
-443.74 417.426 l
-443.7 417.474 l
-f
-443.74 417.426 m
-442.6 416.494 l
-443.699 415.161 l
-444.269 415.626 l
-444.901 416.005 l
-444.874 416.051 l
-f
-444.901 416.005 m
-443.637 415.248 l
-444.524 413.781 l
-445.156 414.16 l
-445.829 414.461 l
-445.811 414.501 l
-f
-445.829 414.461 m
-444.483 413.859 l
-445.164 412.35 l
-445.837 412.651 l
-446.538 412.88 l
-446.526 412.917 l
-f
-446.538 412.88 m
-445.136 412.422 l
-445.618 410.962 l
-446.319 411.191 l
-447.039 411.349 l
-447.031 411.385 l
-f
-447.039 411.349 m
-445.598 411.034 l
-445.894 409.692 l
-446.615 409.85 l
-447.347 409.939 l
-447.343 409.974 l
-f
-447.347 409.939 m
-445.883 409.761 l
-446.035 408.518 l
-446.767 408.607 l
-447.504 408.641 l
-447.503 408.669 l
-f
-447.504 408.641 m
-446.03 408.572 l
-446.086 407.386 l
-446.823 407.42 l
-447.561 407.425 l
-447.561 407.44 l
-f
-447.561 407.425 m
-446.086 407.415 l
-446.094 406.242 l
-446.8 406.247 l
-447.538 406.247 l
-447.569 406.252 l
-f
-447.538 406.247 m
-446.062 406.247 l
-446.062 401.378 l
-446.8 401.378 l
-447.538 401.378 l
-447.538 401.378 l
-f
-447.538 401.378 m
-446.062 401.378 l
-446.062 396.434 l
-446.8 396.434 l
-447.538 396.434 l
-447.538 396.434 l
-f
-447.538 396.434 m
-446.062 396.434 l
-446.062 391.489 l
-446.8 391.489 l
-447.538 391.489 l
-447.538 391.489 l
-f
-447.538 391.489 m
-446.062 391.489 l
-446.062 386.545 l
-446.8 386.545 l
-447.538 386.545 l
-447.538 386.545 l
-f
-447.538 386.545 m
-446.062 386.545 l
-446.062 381.601 l
-446.8 381.601 l
-447.538 381.601 l
-447.538 381.601 l
-f
-447.538 381.601 m
-446.062 381.601 l
-446.062 376.732 l
-446.8 376.732 l
-447.538 376.732 l
-447.538 376.732 l
-f
-447.538 376.732 m
-446.062 376.732 l
-446.062 372.087 l
-446.831 372.087 l
-447.569 372.082 l
-447.538 372.087 l
-f
-447.569 372.082 m
-446.094 372.092 l
-446.086 370.895 l
-446.823 370.89 l
-447.56 370.857 l
-447.561 370.885 l
-f
-447.56 370.857 m
-446.086 370.922 l
-446.03 369.676 l
-446.767 369.643 l
-447.5 369.559 l
-447.503 369.585 l
-f
-447.5 369.559 m
-446.034 369.727 l
-445.882 368.41 l
-446.615 368.326 l
-447.337 368.176 l
-447.344 368.209 l
-f
-447.337 368.176 m
-445.893 368.477 l
-445.597 367.069 l
-446.319 366.918 l
-447.021 366.695 l
-447.033 366.731 l
-f
-447.021 366.695 m
-445.616 367.141 l
-445.134 365.638 l
-445.837 365.415 l
-446.511 365.118 l
-446.528 365.154 l
-f
-446.511 365.118 m
-445.162 365.712 l
-444.482 364.181 l
-445.156 363.884 l
-445.789 363.507 l
-445.812 363.546 l
-f
-445.789 363.507 m
-444.523 364.261 l
-443.636 362.786 l
-444.269 362.409 l
-444.84 361.944 l
-444.874 361.986 l
-f
-444.84 361.944 m
-443.699 362.875 l
-442.599 361.541 l
-443.17 361.075 l
-443.653 360.52 l
-443.7 360.561 l
-f
-443.653 360.52 m
-442.687 361.63 l
-441.383 360.505 l
-441.867 359.95 l
-442.262 359.33 l
-442.308 359.359 l
-f
-442.262 359.33 m
-441.471 360.57 l
-440.037 359.663 l
-440.433 359.043 l
-440.749 358.379 l
-440.79 358.399 l
-f
-440.749 358.379 m
-440.117 359.706 l
-438.642 359.01 l
-438.958 358.346 l
-439.2 357.653 l
-439.238 357.666 l
-f
-439.2 357.653 m
-438.716 359.04 l
-437.289 358.547 l
-437.531 357.854 l
-437.698 357.138 l
-437.736 357.147 l
-f
-437.698 357.138 m
-437.364 358.569 l
-436.053 358.266 l
-436.22 357.551 l
-436.314 356.822 l
-436.351 356.827 l
-f
-436.314 356.822 m
-436.126 358.279 l
-434.911 358.123 l
-435.005 357.395 l
-435.041 356.661 l
-435.07 356.663 l
-f
-435.041 356.661 m
-434.968 358.128 l
-433.808 358.071 l
-433.845 357.337 l
-433.85 356.603 l
-433.866 356.603 l
-f
-433.85 356.603 m
-433.839 358.072 l
-432.693 358.064 l
-432.698 357.3 l
-432.698 356.566 l
-432.703 356.595 l
-f
-432.698 356.566 m
-432.698 358.034 l
-427.938 358.034 l
-427.938 357.3 l
-427.938 356.566 l
-427.938 356.566 l
-f
-427.938 356.566 m
-427.938 358.034 l
-423.105 358.034 l
-423.105 357.3 l
-423.105 356.566 l
-423.105 356.566 l
-f
-423.105 356.566 m
-423.105 358.034 l
-418.272 358.034 l
-418.272 357.3 l
-418.272 356.566 l
-418.272 356.566 l
-f
-418.272 356.566 m
-418.272 358.034 l
-413.439 358.034 l
-413.439 357.3 l
-413.439 356.566 l
-413.439 356.566 l
-f
-413.439 356.566 m
-413.439 358.034 l
-408.679 358.034 l
-408.679 357.3 l
-408.679 356.566 l
-408.679 356.566 l
-f
-408.679 356.566 m
-408.679 358.034 l
-404.139 358.034 l
-404.139 357.3 l
-404.139 356.566 l
-404.139 356.566 l
-f
-404.139 356.566 m
-404.139 358.034 l
-399.379 358.034 l
-399.379 357.3 l
-399.379 356.566 l
-399.379 356.566 l
-f
-399.379 356.566 m
-399.379 358.034 l
-394.546 358.034 l
-394.546 357.3 l
-394.546 356.566 l
-394.546 356.566 l
-f
-394.546 356.566 m
-394.546 358.034 l
-389.713 358.034 l
-389.713 357.3 l
-389.713 356.566 l
-389.713 356.566 l
-f
-389.713 356.566 m
-389.713 358.034 l
-384.88 358.034 l
-384.88 357.3 l
-384.88 356.566 l
-384.88 356.566 l
-f
-384.88 356.566 m
-384.88 358.034 l
-380.046 358.034 l
-380.046 357.3 l
-380.046 356.566 l
-380.046 356.566 l
-f
-380.046 356.566 m
-380.046 358.034 l
-375.287 358.034 l
-375.287 357.3 l
-375.287 356.566 l
-375.287 356.566 l
-f
-375.287 356.566 m
-375.287 358.034 l
-370.746 358.034 l
-370.746 357.3 l
-370.746 356.566 l
-370.746 356.566 l
-f
-370.746 356.566 m
-370.746 358.034 l
-365.987 358.034 l
-365.987 357.3 l
-365.987 356.566 l
-365.987 356.566 l
-f
-365.987 356.566 m
-365.987 358.034 l
-361.153 358.034 l
-361.153 357.3 l
-361.153 356.566 l
-361.153 356.566 l
-f
-361.153 356.566 m
-361.153 358.034 l
-356.32 358.034 l
-356.32 357.3 l
-356.32 356.566 l
-356.32 356.566 l
-f
-356.32 356.566 m
-356.32 358.034 l
-351.487 358.034 l
-351.487 357.329 l
-351.482 356.595 l
-351.487 356.566 l
-f
-351.482 356.595 m
-351.492 358.064 l
-350.279 358.072 l
-350.274 357.337 l
-350.24 356.604 l
-350.255 356.603 l
-f
-350.24 356.604 m
-350.309 358.071 l
-349.068 358.128 l
-349.034 357.395 l
-348.946 356.666 l
-348.972 356.663 l
-f
-348.946 356.666 m
-349.122 358.124 l
-347.827 358.28 l
-347.739 357.551 l
-347.58 356.833 l
-347.615 356.826 l
-f
-347.58 356.833 m
-347.898 358.268 l
-346.52 358.571 l
-346.361 357.854 l
-346.125 357.158 l
-346.163 357.145 l
-f
-346.125 357.158 m
-346.597 358.55 l
-345.129 359.042 l
-344.893 358.346 l
-344.579 357.682 l
-344.618 357.664 l
-f
-344.579 357.682 m
-345.207 359.011 l
-343.718 359.708 l
-343.405 359.043 l
-343.006 358.425 l
-343.047 358.399 l
-f
-343.006 358.425 m
-343.803 359.661 l
-342.383 360.568 l
-341.985 359.95 l
-341.493 359.403 l
-341.537 359.364 l
-f
-341.493 359.403 m
-342.477 360.497 l
-341.215 361.622 l
-340.723 361.075 l
-340.138 360.627 l
-340.18 360.573 l
-f
-340.138 360.627 m
-341.307 361.523 l
-340.274 362.858 l
-339.689 362.409 l
-339.041 362.058 l
-339.069 362.007 l
-f
-339.041 362.058 m
-340.337 362.76 l
-339.531 364.235 l
-338.883 363.884 l
-338.196 363.617 l
-338.212 363.574 l
-f
-338.196 363.617 m
-339.57 364.151 l
-338.969 365.682 l
-338.282 365.415 l
-337.571 365.22 l
-337.581 365.184 l
-f
-337.571 365.22 m
-338.993 365.61 l
-338.578 367.113 l
-337.867 366.918 l
-337.141 366.788 l
-337.147 366.755 l
-f
-337.141 366.788 m
-338.593 367.048 l
-338.339 368.456 l
-337.613 368.326 l
-336.879 368.254 l
-336.881 368.225 l
-f
-336.879 368.254 m
-338.347 368.398 l
-338.216 369.715 l
-337.482 369.643 l
-336.745 369.615 l
-336.746 369.593 l
-f
-336.745 369.615 m
-338.219 369.671 l
-338.171 370.918 l
-337.434 370.89 l
-336.696 370.885 l
-336.697 370.861 l
-f
-336.696 370.885 m
-338.172 370.894 l
-338.165 372.091 l
-337.4 372.087 l
-336.662 372.087 l
-336.69 372.083 l
-f
-336.662 372.087 m
-338.138 372.087 l
-338.138 376.732 l
-337.4 376.732 l
-336.662 376.732 l
-336.662 376.732 l
-f
-336.662 376.732 m
-338.138 376.732 l
-338.138 381.601 l
-337.4 381.601 l
-336.662 381.601 l
-336.662 381.601 l
-f
-336.662 381.601 m
-338.138 381.601 l
-338.138 386.545 l
-337.4 386.545 l
-336.662 386.545 l
-336.662 386.545 l
-f
-336.662 386.545 m
-338.138 386.545 l
-338.138 391.489 l
-337.4 391.489 l
-336.662 391.489 l
-336.662 391.489 l
-f
-336.662 391.489 m
-338.138 391.489 l
-338.138 396.434 l
-337.4 396.434 l
-336.662 396.434 l
-336.662 396.434 l
-f
-336.662 396.434 m
-338.138 396.434 l
-338.138 401.378 l
-337.4 401.378 l
-336.662 401.378 l
-336.662 401.378 l
-f
-336.662 401.378 m
-338.138 401.378 l
-338.138 406.247 l
-337.427 406.247 l
-336.69 406.251 l
-336.662 406.247 l
-f
-336.69 406.251 m
-338.165 406.243 l
-338.172 407.416 l
-337.434 407.42 l
-336.697 407.45 l
-336.696 407.424 l
-f
-336.697 407.45 m
-338.171 407.39 l
-338.219 408.577 l
-337.482 408.607 l
-336.749 408.683 l
-336.746 408.66 l
-f
-336.749 408.683 m
-338.216 408.531 l
-338.346 409.774 l
-337.613 409.85 l
-336.888 409.986 l
-336.882 409.956 l
-f
-336.888 409.986 m
-338.338 409.714 l
-338.592 411.055 l
-337.867 411.191 l
-337.157 411.392 l
-337.148 411.36 l
-f
-337.157 411.392 m
-338.576 410.991 l
-338.992 412.451 l
-338.282 412.651 l
-337.596 412.922 l
-337.582 412.887 l
-f
-337.596 412.922 m
-338.968 412.381 l
-339.568 413.889 l
-338.883 414.16 l
-338.236 414.512 l
-338.214 414.473 l
-f
-338.236 414.512 m
-339.53 413.807 l
-340.336 415.274 l
-339.689 415.626 l
-339.105 416.075 l
-339.07 416.03 l
-f
-339.105 416.075 m
-340.273 415.178 l
-341.307 416.511 l
-340.723 416.96 l
-340.23 417.507 l
-340.18 417.462 l
-f
-340.23 417.507 m
-341.215 416.413 l
-342.477 417.537 l
-341.985 418.085 l
-341.586 418.703 l
-341.536 418.671 l
-f
-341.586 418.703 m
-342.383 417.467 l
-343.803 418.374 l
-343.405 418.992 l
-343.091 419.656 l
-343.047 419.636 l
-f
-343.091 419.656 m
-343.718 418.327 l
-345.207 419.024 l
-344.893 419.688 l
-344.657 420.384 l
-344.617 420.371 l
-f
-344.657 420.384 m
-345.129 418.992 l
-346.597 419.485 l
-346.125 420.877 l
-f
-348.232 409.726 m
-348.43 409.019 l
-350.086 409.48 l
-349.986 409.834 l
-349.971 410.201 l
-349.928 410.199 l
-f
-349.971 410.201 m
-350.001 409.467 l
-351.656 409.533 l
-351.641 409.9 l
-351.641 410.267 l
-351.627 410.266 l
-f
-351.641 410.267 m
-351.641 409.533 l
-354.952 409.533 l
-354.952 409.9 l
-354.952 410.267 l
-354.952 410.267 l
-f
-354.952 410.267 m
-354.952 409.533 l
-358.262 409.533 l
-358.262 409.9 l
-358.262 410.267 l
-358.262 410.267 l
-f
-358.262 410.267 m
-358.262 409.533 l
-361.572 409.533 l
-361.572 409.9 l
-361.572 410.267 l
-361.572 410.267 l
-f
-361.572 410.267 m
-361.572 409.533 l
-364.883 409.533 l
-364.883 409.9 l
-364.883 410.267 l
-364.883 410.267 l
-f
-364.883 410.267 m
-364.883 409.533 l
-368.193 409.533 l
-368.193 409.9 l
-368.193 410.267 l
-368.193 410.267 l
-f
-368.193 410.267 m
-368.193 409.533 l
-371.503 409.533 l
-371.503 409.9 l
-371.503 410.267 l
-371.503 410.267 l
-f
-371.503 410.267 m
-371.503 409.533 l
-373.176 409.533 l
-373.176 409.9 l
-373.176 410.267 l
-373.176 410.267 l
-f
-373.176 410.267 m
-373.176 409.533 l
-374.952 409.533 l
-374.952 409.9 l
-374.952 410.267 l
-374.952 410.267 l
-f
-374.952 410.267 m
-374.952 409.533 l
-376.883 409.533 l
-376.883 409.9 l
-376.883 410.267 l
-376.883 410.267 l
-f
-376.883 410.267 m
-376.883 409.533 l
-378.814 409.533 l
-378.814 409.9 l
-378.817 410.267 l
-378.814 410.267 l
-f
-378.817 410.267 m
-378.81 409.532 l
-379.718 409.524 l
-379.721 409.891 l
-379.746 410.258 l
-379.724 410.258 l
-f
-379.746 410.258 m
-379.697 409.525 l
-380.565 409.467 l
-380.59 409.834 l
-380.657 410.195 l
-380.636 410.199 l
-f
-380.657 410.195 m
-380.522 409.473 l
-381.365 409.316 l
-381.432 409.677 l
-381.56 410.022 l
-381.531 410.033 l
-f
-381.56 410.022 m
-381.305 409.333 l
-382.135 409.028 l
-382.262 409.373 l
-382.451 409.688 l
-382.422 409.706 l
-f
-382.451 409.688 m
-382.073 409.057 l
-382.892 408.572 l
-383.081 408.887 l
-383.317 409.17 l
-383.294 409.188 l
-f
-383.317 409.17 m
-382.846 408.605 l
-383.613 407.971 l
-383.848 408.254 l
-384.122 408.5 l
-384.104 408.519 l
-f
-384.122 408.5 m
-383.574 408.008 l
-384.238 407.275 l
-384.512 407.521 l
-384.822 407.721 l
-384.806 407.745 l
-f
-384.822 407.721 m
-384.202 407.322 l
-384.711 406.54 l
-385.021 406.739 l
-385.363 406.876 l
-385.35 406.909 l
-f
-385.363 406.876 m
-384.678 406.602 l
-384.997 405.812 l
-385.34 405.949 l
-385.701 406.023 l
-385.694 406.056 l
-f
-385.701 406.023 m
-384.978 405.875 l
-385.142 405.085 l
-385.503 405.159 l
-385.871 405.187 l
-385.869 405.21 l
-f
-385.871 405.187 m
-385.136 405.131 l
-385.196 404.341 l
-385.564 404.369 l
-385.933 404.373 l
-385.932 404.397 l
-f
-385.933 404.373 m
-385.195 404.365 l
-385.204 403.575 l
-385.6 403.579 l
-385.969 403.579 l
-385.941 403.583 l
-f
-385.969 403.579 m
-385.231 403.579 l
-385.231 400.419 l
-385.6 400.419 l
-385.969 400.419 l
-385.969 400.419 l
-f
-385.969 400.419 m
-385.231 400.419 l
-385.231 398.905 l
-385.6 398.905 l
-385.969 398.905 l
-385.969 398.905 l
-f
-385.969 398.905 m
-385.231 398.905 l
-385.231 397.785 l
-385.6 397.785 l
-385.969 397.785 l
-385.969 397.785 l
-f
-385.969 397.785 m
-385.231 397.785 l
-385.231 397.473 l
-385.6 397.473 l
-385.969 397.473 l
-385.969 397.473 l
-f
-385.969 397.473 m
-385.231 397.473 l
-385.231 397.045 l
-385.6 397.045 l
-385.969 397.045 l
-385.969 397.045 l
-f
-385.969 397.045 m
-385.231 397.045 l
-385.231 396.732 l
-385.6 396.732 l
-385.969 396.732 l
-385.969 396.732 l
-f
-385.969 396.732 m
-385.231 396.732 l
-385.231 395.613 l
-385.6 395.613 l
-385.969 395.613 l
-385.969 395.613 l
-f
-385.969 395.613 m
-385.231 395.613 l
-385.231 394.098 l
-385.6 394.098 l
-385.969 394.098 l
-385.969 394.098 l
-f
-385.969 394.098 m
-385.231 394.098 l
-385.231 390.938 l
-385.6 390.938 l
-385.969 390.938 l
-385.969 390.938 l
-f
-385.969 390.938 m
-385.231 390.938 l
-385.231 387.778 l
-385.6 387.778 l
-385.969 387.778 l
-385.969 387.778 l
-f
-385.969 387.778 m
-385.231 387.778 l
-385.231 384.618 l
-385.572 384.618 l
-385.941 384.614 l
-385.969 384.618 l
-f
-385.941 384.614 m
-385.204 384.622 l
-385.195 383.832 l
-385.564 383.828 l
-385.932 383.8 l
-385.932 383.812 l
-f
-385.932 383.8 m
-385.196 383.856 l
-385.136 383.066 l
-385.503 383.038 l
-385.865 382.964 l
-385.869 382.986 l
-f
-385.865 382.964 m
-385.142 383.112 l
-384.978 382.322 l
-385.34 382.248 l
-385.682 382.111 l
-385.694 382.141 l
-f
-385.682 382.111 m
-384.997 382.385 l
-384.678 381.595 l
-385.021 381.458 l
-385.33 381.258 l
-385.35 381.288 l
-f
-385.33 381.258 m
-384.711 381.657 l
-384.202 380.875 l
-384.512 380.676 l
-384.786 380.43 l
-384.806 380.452 l
-f
-384.786 380.43 m
-384.238 380.922 l
-383.574 380.189 l
-383.848 379.943 l
-384.084 379.661 l
-384.104 379.678 l
-f
-384.084 379.661 m
-383.613 380.226 l
-382.846 379.592 l
-383.081 379.31 l
-383.27 378.994 l
-383.294 379.009 l
-f
-383.27 378.994 m
-382.892 379.625 l
-382.073 379.14 l
-382.262 378.824 l
-382.39 378.48 l
-382.422 378.491 l
-f
-382.39 378.48 m
-382.135 379.169 l
-381.305 378.864 l
-381.432 378.52 l
-381.5 378.159 l
-381.531 378.164 l
-f
-381.5 378.159 m
-381.365 378.881 l
-380.522 378.724 l
-380.59 378.363 l
-380.614 377.997 l
-380.636 377.998 l
-f
-380.614 377.997 m
-380.565 378.73 l
-379.697 378.672 l
-379.721 378.306 l
-379.724 377.939 l
-379.746 377.939 l
-f
-379.724 377.939 m
-379.718 378.673 l
-378.81 378.665 l
-378.814 378.3 l
-378.814 377.933 l
-378.817 377.93 l
-f
-378.814 377.933 m
-378.814 378.667 l
-376.883 378.667 l
-376.883 378.3 l
-376.883 377.933 l
-376.883 377.933 l
-f
-376.883 377.933 m
-376.883 378.667 l
-374.952 378.667 l
-374.952 378.3 l
-374.952 377.933 l
-374.952 377.933 l
-f
-374.952 377.933 m
-374.952 378.667 l
-373.176 378.667 l
-373.176 378.3 l
-373.176 377.933 l
-373.176 377.933 l
-f
-373.176 377.933 m
-373.176 378.667 l
-371.503 378.667 l
-371.503 378.3 l
-371.503 377.933 l
-371.503 377.933 l
-f
-371.503 377.933 m
-371.503 378.667 l
-368.193 378.667 l
-368.193 378.3 l
-368.193 377.933 l
-368.193 377.933 l
-f
-368.193 377.933 m
-368.193 378.667 l
-364.883 378.667 l
-364.883 378.3 l
-364.883 377.933 l
-364.883 377.933 l
-f
-364.883 377.933 m
-364.883 378.667 l
-361.572 378.667 l
-361.572 378.3 l
-361.572 377.933 l
-361.572 377.933 l
-f
-361.572 377.933 m
-361.572 378.667 l
-358.262 378.667 l
-358.262 378.3 l
-358.262 377.933 l
-358.262 377.933 l
-f
-358.262 377.933 m
-358.262 378.667 l
-354.952 378.667 l
-354.952 378.3 l
-354.952 377.933 l
-354.952 377.933 l
-f
-354.952 377.933 m
-354.952 378.667 l
-351.641 378.667 l
-351.641 378.297 l
-351.627 377.931 l
-351.641 377.933 l
-f
-351.627 377.931 m
-351.656 378.664 l
-350.001 378.73 l
-349.986 378.363 l
-349.887 378.01 l
-349.928 377.998 l
-f
-349.887 378.01 m
-350.086 378.717 l
-348.43 379.178 l
-348.331 378.824 l
-348.142 378.509 l
-348.184 378.484 l
-f
-348.142 378.509 m
-348.52 379.14 l
-347.701 379.625 l
-347.512 379.31 l
-347.277 379.027 l
-347.299 379.009 l
-f
-347.277 379.027 m
-347.748 379.592 l
-346.98 380.226 l
-346.745 379.943 l
-346.471 379.697 l
-346.489 379.678 l
-f
-346.471 379.697 m
-347.019 380.189 l
-346.355 380.922 l
-346.081 380.676 l
-345.771 380.476 l
-345.787 380.452 l
-f
-345.771 380.476 m
-346.391 380.875 l
-345.882 381.657 l
-345.572 381.458 l
-345.23 381.321 l
-345.243 381.288 l
-f
-345.23 381.321 m
-345.915 381.595 l
-345.596 382.385 l
-345.253 382.248 l
-344.892 382.173 l
-344.899 382.141 l
-f
-344.892 382.173 m
-345.615 382.322 l
-345.451 383.112 l
-345.09 383.038 l
-344.722 383.01 l
-344.724 382.986 l
-f
-344.722 383.01 m
-345.457 383.066 l
-345.397 383.856 l
-345.029 383.828 l
-344.66 383.824 l
-344.661 383.812 l
-f
-344.66 383.824 m
-345.398 383.832 l
-345.39 384.622 l
-345 384.618 l
-344.631 384.618 l
-344.652 384.614 l
-f
-344.631 384.618 m
-345.369 384.618 l
-345.369 387.778 l
-345 387.778 l
-344.631 387.778 l
-344.631 387.778 l
-f
-344.631 387.778 m
-345.369 387.778 l
-345.369 390.938 l
-345 390.938 l
-344.631 390.938 l
-344.631 390.938 l
-f
-344.631 390.938 m
-345.369 390.938 l
-345.369 394.098 l
-345 394.098 l
-344.631 394.098 l
-344.631 394.098 l
-f
-344.631 394.098 m
-345.369 394.098 l
-345.369 397.259 l
-345 397.259 l
-344.631 397.259 l
-344.631 397.259 l
-f
-344.631 397.259 m
-345.369 397.259 l
-345.369 400.419 l
-345 400.419 l
-344.631 400.419 l
-344.631 400.419 l
-f
-344.631 400.419 m
-345.369 400.419 l
-345.369 403.579 l
-345.021 403.579 l
-344.652 403.583 l
-344.631 403.579 l
-f
-344.652 403.583 m
-345.39 403.575 l
-345.398 404.365 l
-345.029 404.369 l
-344.662 404.397 l
-344.66 404.373 l
-f
-344.662 404.397 m
-345.397 404.341 l
-345.457 405.131 l
-345.09 405.159 l
-344.728 405.233 l
-344.724 405.21 l
-f
-344.728 405.233 m
-345.451 405.085 l
-345.615 405.875 l
-345.253 405.949 l
-344.911 406.086 l
-344.899 406.056 l
-f
-344.911 406.086 m
-345.596 405.812 l
-345.915 406.602 l
-345.572 406.739 l
-345.263 406.939 l
-345.243 406.909 l
-f
-345.263 406.939 m
-345.882 406.54 l
-346.391 407.322 l
-346.081 407.521 l
-345.807 407.767 l
-345.787 407.745 l
-f
-345.807 407.767 m
-346.355 407.275 l
-347.019 408.008 l
-346.745 408.254 l
-346.509 408.536 l
-346.489 408.519 l
-f
-346.509 408.536 m
-346.98 407.971 l
-347.748 408.605 l
-347.512 408.887 l
-347.323 409.203 l
-347.299 409.188 l
-f
-347.323 409.203 m
-347.701 408.572 l
-348.52 409.057 l
-348.142 409.688 l
-f
-BT
-/R691 6.82548 Tf
-1 0 0 0.995457 353.162 395.957 Tm
-(Andrew) Tj
-1 0 0 0.995457 348.233 388.03 Tm
-(benchmark) Tj
-ET
-337.243 369.633 109.586 0.734326 re
-f
-BT
-/R691 6.82544 Tf
-1 0 0 0.995457 366.062 360.576 Tm
-(kernel NFS client) Tj
-ET
-401.994 409.726 m
-402.193 409.019 l
-403.848 409.48 l
-403.749 409.834 l
-403.734 410.201 l
-403.691 410.199 l
-f
-403.734 410.201 m
-403.764 409.467 l
-405.419 409.533 l
-405.404 409.9 l
-405.404 410.267 l
-405.389 410.266 l
-f
-405.404 410.267 m
-405.404 409.533 l
-408.715 409.533 l
-408.715 409.9 l
-408.715 410.267 l
-408.715 410.267 l
-f
-408.715 410.267 m
-408.715 409.533 l
-412.025 409.533 l
-412.025 409.9 l
-412.025 410.267 l
-412.025 410.267 l
-f
-412.025 410.267 m
-412.025 409.533 l
-415.335 409.533 l
-415.335 409.9 l
-415.335 410.267 l
-415.335 410.267 l
-f
-415.335 410.267 m
-415.335 409.533 l
-418.646 409.533 l
-418.646 409.9 l
-418.646 410.267 l
-418.646 410.267 l
-f
-418.646 410.267 m
-418.646 409.533 l
-421.956 409.533 l
-421.956 409.9 l
-421.956 410.267 l
-421.956 410.267 l
-f
-421.956 410.267 m
-421.956 409.533 l
-425.266 409.533 l
-425.266 409.9 l
-425.266 410.267 l
-425.266 410.267 l
-f
-425.266 410.267 m
-425.266 409.533 l
-426.939 409.533 l
-426.939 409.9 l
-426.939 410.267 l
-426.939 410.267 l
-f
-426.939 410.267 m
-426.939 409.533 l
-428.715 409.533 l
-428.715 409.9 l
-428.715 410.267 l
-428.715 410.267 l
-f
-428.715 410.267 m
-428.715 409.533 l
-430.646 409.533 l
-430.646 409.9 l
-430.646 410.267 l
-430.646 410.267 l
-f
-430.646 410.267 m
-430.646 409.533 l
-432.577 409.533 l
-432.577 409.9 l
-432.58 410.267 l
-432.577 410.267 l
-f
-432.58 410.267 m
-432.573 409.532 l
-433.481 409.524 l
-433.484 409.891 l
-433.508 410.258 l
-433.498 410.258 l
-f
-433.508 410.258 m
-433.459 409.525 l
-434.328 409.467 l
-434.352 409.834 l
-434.42 410.195 l
-434.399 410.199 l
-f
-434.42 410.195 m
-434.285 409.473 l
-435.128 409.316 l
-435.195 409.677 l
-435.323 410.022 l
-435.293 410.033 l
-f
-435.323 410.022 m
-435.068 409.333 l
-435.897 409.028 l
-436.025 409.373 l
-436.214 409.688 l
-436.184 409.706 l
-f
-436.214 409.688 m
-435.836 409.057 l
-436.655 408.572 l
-436.844 408.887 l
-437.079 409.17 l
-437.057 409.188 l
-f
-437.079 409.17 m
-436.608 408.605 l
-437.376 407.971 l
-437.611 408.254 l
-437.885 408.5 l
-437.867 408.519 l
-f
-437.885 408.5 m
-437.337 408.008 l
-438.001 407.275 l
-438.275 407.521 l
-438.584 407.721 l
-438.568 407.745 l
-f
-438.584 407.721 m
-437.965 407.322 l
-438.474 406.54 l
-438.783 406.739 l
-439.126 406.876 l
-439.112 406.909 l
-f
-439.126 406.876 m
-438.441 406.602 l
-438.76 405.812 l
-439.102 405.949 l
-439.464 406.023 l
-439.457 406.056 l
-f
-439.464 406.023 m
-438.741 405.875 l
-438.905 405.085 l
-439.266 405.159 l
-439.634 405.187 l
-439.632 405.21 l
-f
-439.634 405.187 m
-438.898 405.131 l
-438.959 404.341 l
-439.327 404.369 l
-439.695 404.373 l
-439.694 404.397 l
-f
-439.695 404.373 m
-438.958 404.365 l
-438.966 403.575 l
-439.3 403.579 l
-439.669 403.579 l
-439.704 403.583 l
-f
-439.669 403.579 m
-438.931 403.579 l
-438.931 400.419 l
-439.3 400.419 l
-439.669 400.419 l
-439.669 400.419 l
-f
-439.669 400.419 m
-438.931 400.419 l
-438.931 398.905 l
-439.3 398.905 l
-439.669 398.905 l
-439.669 398.905 l
-f
-439.669 398.905 m
-438.931 398.905 l
-438.931 397.785 l
-439.3 397.785 l
-439.669 397.785 l
-439.669 397.785 l
-f
-439.669 397.785 m
-438.931 397.785 l
-438.931 397.473 l
-439.3 397.473 l
-439.669 397.473 l
-439.669 397.473 l
-f
-439.669 397.473 m
-438.931 397.473 l
-438.931 397.045 l
-439.3 397.045 l
-439.669 397.045 l
-439.669 397.045 l
-f
-439.669 397.045 m
-438.931 397.045 l
-438.931 396.732 l
-439.3 396.732 l
-439.669 396.732 l
-439.669 396.732 l
-f
-439.669 396.732 m
-438.931 396.732 l
-438.931 395.613 l
-439.3 395.613 l
-439.669 395.613 l
-439.669 395.613 l
-f
-439.669 395.613 m
-438.931 395.613 l
-438.931 394.098 l
-439.3 394.098 l
-439.669 394.098 l
-439.669 394.098 l
-f
-439.669 394.098 m
-438.931 394.098 l
-438.931 390.938 l
-439.3 390.938 l
-439.669 390.938 l
-439.669 390.938 l
-f
-439.669 390.938 m
-438.931 390.938 l
-438.931 387.778 l
-439.3 387.778 l
-439.669 387.778 l
-439.669 387.778 l
-f
-439.669 387.778 m
-438.931 387.778 l
-438.931 384.618 l
-439.335 384.618 l
-439.704 384.614 l
-439.669 384.618 l
-f
-439.704 384.614 m
-438.966 384.622 l
-438.958 383.832 l
-439.327 383.828 l
-439.694 383.8 l
-439.695 383.812 l
-f
-439.694 383.8 m
-438.959 383.856 l
-438.898 383.066 l
-439.266 383.038 l
-439.627 382.964 l
-439.632 382.986 l
-f
-439.627 382.964 m
-438.905 383.112 l
-438.741 382.322 l
-439.102 382.248 l
-439.445 382.111 l
-439.457 382.141 l
-f
-439.445 382.111 m
-438.76 382.385 l
-438.441 381.595 l
-438.783 381.458 l
-439.093 381.258 l
-439.112 381.288 l
-f
-439.093 381.258 m
-438.474 381.657 l
-437.965 380.875 l
-438.275 380.676 l
-438.549 380.43 l
-438.569 380.452 l
-f
-438.549 380.43 m
-438.001 380.922 l
-437.337 380.189 l
-437.611 379.943 l
-437.847 379.661 l
-437.867 379.678 l
-f
-437.847 379.661 m
-437.376 380.226 l
-436.608 379.592 l
-436.844 379.31 l
-437.033 378.994 l
-437.057 379.009 l
-f
-437.033 378.994 m
-436.655 379.625 l
-435.836 379.14 l
-436.025 378.824 l
-436.152 378.48 l
-436.184 378.491 l
-f
-436.152 378.48 m
-435.897 379.169 l
-435.068 378.864 l
-435.195 378.52 l
-435.263 378.159 l
-435.293 378.164 l
-f
-435.263 378.159 m
-435.128 378.881 l
-434.285 378.724 l
-434.352 378.363 l
-434.377 377.997 l
-434.399 377.998 l
-f
-434.377 377.997 m
-434.328 378.73 l
-433.459 378.672 l
-433.484 378.306 l
-433.487 377.939 l
-433.498 377.939 l
-f
-433.487 377.939 m
-433.481 378.673 l
-432.573 378.665 l
-432.577 378.3 l
-432.577 377.933 l
-432.58 377.93 l
-f
-432.577 377.933 m
-432.577 378.667 l
-430.646 378.667 l
-430.646 378.3 l
-430.646 377.933 l
-430.646 377.933 l
-f
-430.646 377.933 m
-430.646 378.667 l
-428.715 378.667 l
-428.715 378.3 l
-428.715 377.933 l
-428.715 377.933 l
-f
-428.715 377.933 m
-428.715 378.667 l
-426.939 378.667 l
-426.939 378.3 l
-426.939 377.933 l
-426.939 377.933 l
-f
-426.939 377.933 m
-426.939 378.667 l
-425.266 378.667 l
-425.266 378.3 l
-425.266 377.933 l
-425.266 377.933 l
-f
-425.266 377.933 m
-425.266 378.667 l
-421.956 378.667 l
-421.956 378.3 l
-421.956 377.933 l
-421.956 377.933 l
-f
-421.956 377.933 m
-421.956 378.667 l
-418.646 378.667 l
-418.646 378.3 l
-418.646 377.933 l
-418.646 377.933 l
-f
-418.646 377.933 m
-418.646 378.667 l
-415.335 378.667 l
-415.335 378.3 l
-415.335 377.933 l
-415.335 377.933 l
-f
-415.335 377.933 m
-415.335 378.667 l
-412.025 378.667 l
-412.025 378.3 l
-412.025 377.933 l
-412.025 377.933 l
-f
-412.025 377.933 m
-412.025 378.667 l
-408.715 378.667 l
-408.715 378.3 l
-408.715 377.933 l
-408.715 377.933 l
-f
-408.715 377.933 m
-408.715 378.667 l
-405.404 378.667 l
-405.404 378.297 l
-405.389 377.931 l
-405.404 377.933 l
-f
-405.389 377.931 m
-405.419 378.664 l
-403.764 378.73 l
-403.749 378.363 l
-403.65 378.01 l
-403.691 377.998 l
-f
-403.65 378.01 m
-403.848 378.717 l
-402.193 379.178 l
-402.094 378.824 l
-401.905 378.509 l
-401.947 378.484 l
-f
-401.905 378.509 m
-402.283 379.14 l
-401.464 379.625 l
-401.275 379.31 l
-401.039 379.027 l
-401.061 379.009 l
-f
-401.039 379.027 m
-401.51 379.592 l
-400.743 380.226 l
-400.508 379.943 l
-400.234 379.697 l
-400.252 379.678 l
-f
-400.234 379.697 m
-400.781 380.189 l
-400.118 380.922 l
-399.844 380.676 l
-399.534 380.476 l
-399.55 380.452 l
-f
-399.534 380.476 m
-400.153 380.875 l
-399.645 381.657 l
-399.335 381.458 l
-398.993 381.321 l
-399.006 381.288 l
-f
-398.993 381.321 m
-399.677 381.595 l
-399.358 382.385 l
-399.016 382.248 l
-398.655 382.173 l
-398.662 382.141 l
-f
-398.655 382.173 m
-399.377 382.322 l
-399.214 383.112 l
-398.852 383.038 l
-398.485 383.01 l
-398.486 382.986 l
-f
-398.485 383.01 m
-399.22 383.066 l
-399.16 383.856 l
-398.792 383.828 l
-398.423 383.824 l
-398.423 383.812 l
-f
-398.423 383.824 m
-399.161 383.832 l
-399.152 384.622 l
-398.8 384.618 l
-398.431 384.618 l
-398.415 384.614 l
-f
-398.431 384.618 m
-399.169 384.618 l
-399.169 387.778 l
-398.8 387.778 l
-398.431 387.778 l
-398.431 387.778 l
-f
-398.431 387.778 m
-399.169 387.778 l
-399.169 390.938 l
-398.8 390.938 l
-398.431 390.938 l
-398.431 390.938 l
-f
-398.431 390.938 m
-399.169 390.938 l
-399.169 394.098 l
-398.8 394.098 l
-398.431 394.098 l
-398.431 394.098 l
-f
-398.431 394.098 m
-399.169 394.098 l
-399.169 397.259 l
-398.8 397.259 l
-398.431 397.259 l
-398.431 397.259 l
-f
-398.431 397.259 m
-399.169 397.259 l
-399.169 400.419 l
-398.8 400.419 l
-398.431 400.419 l
-398.431 400.419 l
-f
-398.431 400.419 m
-399.169 400.419 l
-399.169 403.579 l
-398.783 403.579 l
-398.415 403.583 l
-398.431 403.579 l
-f
-398.415 403.583 m
-399.152 403.575 l
-399.161 404.365 l
-398.792 404.369 l
-398.424 404.397 l
-398.423 404.373 l
-f
-398.424 404.397 m
-399.16 404.341 l
-399.22 405.131 l
-398.852 405.159 l
-398.491 405.233 l
-398.486 405.21 l
-f
-398.491 405.233 m
-399.214 405.085 l
-399.377 405.875 l
-399.016 405.949 l
-398.674 406.086 l
-398.662 406.056 l
-f
-398.674 406.086 m
-399.358 405.812 l
-399.677 406.602 l
-399.335 406.739 l
-399.026 406.939 l
-399.006 406.909 l
-f
-399.026 406.939 m
-399.645 406.54 l
-400.153 407.322 l
-399.844 407.521 l
-399.57 407.767 l
-399.55 407.745 l
-f
-399.57 407.767 m
-400.118 407.275 l
-400.781 408.008 l
-400.508 408.254 l
-400.272 408.536 l
-400.252 408.519 l
-f
-400.272 408.536 m
-400.743 407.971 l
-401.51 408.605 l
-401.275 408.887 l
-401.086 409.203 l
-401.061 409.188 l
-f
-401.086 409.203 m
-401.464 408.572 l
-402.283 409.057 l
-401.905 409.688 l
-f
-BT
-/R691 6.82548 Tf
-1 0 0 0.995457 402.843 390.528 Tm
-(replication) Tj
-1 0 0 0.995457 408.531 383.356 Tm
-(library) Tj
-ET
-398.673 398.533 40.5739 0.734326 re
-f
-BT
-/R691 6.82551 Tf
-1 0 0 0.995457 410.805 402.593 Tm
-(relay) Tj
-/R691 6.84901 Tf
-1 0 0 0.995457 349.611 423.354 Tm
-(client) Tj
-ET
-0.501961 g
-365.048 382.807 m
-367.324 379.862 l
-362.772 379.862 l
-365.048 382.807 l
-f*
-365.341 383.031 m
-364.756 382.583 l
-367.032 379.638 l
-367.324 379.9 l
-367.324 379.533 l
-368.043 379.533 l
-f
-367.324 379.533 m
-367.324 380.267 l
-362.772 380.267 l
-362.772 379.862 l
-362.48 380.085 l
-362.053 379.533 l
-f
-362.48 380.085 m
-363.065 379.638 l
-365.341 382.583 l
-365.048 382.807 l
-365.341 383.031 l
-365.048 383.409 l
-f
-367.324 368.59 m
-365.048 365.532 l
-362.772 368.59 l
-f*
-367.621 368.372 m
-367.028 368.809 l
-364.752 365.75 l
-365.048 365.532 l
-364.752 365.313 l
-365.048 364.915 l
-f
-364.752 365.313 m
-365.345 365.75 l
-363.069 368.809 l
-362.772 368.6 l
-362.772 368.967 l
-362.033 368.967 l
-f
-362.772 368.967 m
-362.772 368.233 l
-367.324 368.233 l
-367.324 368.59 l
-367.621 368.372 l
-368.064 368.967 l
-f
-364.309 368.961 1.4793 10.7807 re
-f*
-363.931 368.961 m
-364.669 368.961 l
-364.669 379.742 l
-364.309 379.7 l
-364.309 380.067 l
-363.931 380.067 l
-f
-364.309 380.067 m
-364.309 379.333 l
-365.788 379.333 l
-365.8 379.742 l
-366.169 379.742 l
-366.169 380.067 l
-f
-366.169 379.742 m
-365.431 379.742 l
-365.431 368.961 l
-365.788 369 l
-365.788 368.633 l
-366.169 368.633 l
-f
-365.788 368.633 m
-365.788 369.367 l
-364.309 369.367 l
-364.3 368.961 l
-363.931 368.961 l
-363.931 368.633 l
-f
-418.998 382.726 m
-421.274 379.78 l
-416.722 379.78 l
-418.998 382.726 l
-f*
-419.29 382.949 m
-418.705 382.502 l
-420.981 379.557 l
-421.274 379.8 l
-421.274 379.433 l
-422.007 379.433 l
-f
-421.274 379.433 m
-421.274 380.167 l
-416.722 380.167 l
-416.722 379.78 l
-416.429 380.004 l
-415.988 379.433 l
-f
-416.429 380.004 m
-417.014 379.557 l
-419.29 382.502 l
-418.998 382.726 l
-419.29 382.949 l
-418.998 383.328 l
-f
-421.274 368.509 m
-418.998 365.451 l
-416.722 368.509 l
-f*
-421.57 368.291 m
-420.977 368.728 l
-418.701 365.669 l
-418.998 365.451 l
-418.701 365.232 l
-418.998 364.834 l
-f
-418.701 365.232 m
-419.294 365.669 l
-417.018 368.728 l
-416.722 368.5 l
-416.722 368.867 l
-415.996 368.867 l
-f
-416.722 368.867 m
-416.722 368.133 l
-421.274 368.133 l
-421.274 368.509 l
-421.57 368.291 l
-421.999 368.867 l
-f
-418.258 368.88 1.4793 10.7807 re
-f*
-417.931 368.88 m
-418.669 368.88 l
-418.669 379.661 l
-418.258 379.7 l
-418.258 380.067 l
-417.931 380.067 l
-f
-418.258 380.067 m
-418.258 379.333 l
-419.737 379.333 l
-419.7 379.661 l
-420.069 379.661 l
-420.069 380.067 l
-f
-420.069 379.661 m
-419.331 379.661 l
-419.331 368.88 l
-419.737 368.9 l
-419.737 368.533 l
-420.069 368.533 l
-f
-419.737 368.533 m
-419.737 369.267 l
-418.258 369.267 l
-418.3 368.88 l
-417.931 368.88 l
-417.931 368.533 l
-f
-0.764706 g
-489.669 384.661 m
-489.669 385.498 488.988 386.176 488.147 386.176 c
-487.307 386.176 486.625 385.498 486.625 384.661 c
-486.625 383.825 487.307 383.146 488.147 383.146 c
-488.988 383.146 489.669 383.825 489.669 384.661 c
-f*
-489.302 384.625 m
-490.036 384.698 l
-490.002 385.04 l
-489.991 385.076 l
-489.638 384.967 l
-489.272 384.93 l
-f
-489.286 384.858 m
-489.991 385.076 l
-489.891 385.395 l
-489.874 385.426 l
-489.55 385.251 l
-489.198 385.142 l
-f
-489.226 385.076 m
-489.874 385.426 l
-489.717 385.715 l
-489.694 385.742 l
-489.409 385.508 l
-489.085 385.333 l
-f
-489.125 385.275 m
-489.694 385.742 l
-489.486 385.993 l
-489.458 386.016 l
-489.224 385.733 l
-488.939 385.499 l
-f
-488.989 385.449 m
-489.458 386.016 l
-489.206 386.223 l
-489.174 386.24 l
-488.998 385.918 l
-488.764 385.634 l
-f
-488.822 385.595 m
-489.174 386.24 l
-488.884 386.397 l
-488.849 386.408 l
-488.74 386.057 l
-488.564 385.735 l
-f
-488.63 385.707 m
-488.849 386.408 l
-488.528 386.507 l
-488.491 386.511 l
-488.454 386.146 l
-488.345 385.795 l
-f
-488.417 385.78 m
-488.491 386.511 l
-488.147 386.545 l
-488.11 386.542 l
-488.147 386.176 l
-488.11 385.811 l
-f
-488.184 385.811 m
-488.11 386.542 l
-487.767 386.507 l
-487.731 386.496 l
-487.841 386.146 l
-487.878 385.78 l
-f
-487.95 385.795 m
-487.731 386.496 l
-487.411 386.397 l
-487.379 386.38 l
-487.555 386.057 l
-487.664 385.707 l
-f
-487.731 385.735 m
-487.379 386.38 l
-487.089 386.223 l
-487.062 386.201 l
-487.296 385.918 l
-487.472 385.595 l
-f
-487.531 385.634 m
-487.062 386.201 l
-486.809 385.994 l
-486.787 385.966 l
-487.071 385.733 l
-487.306 385.449 l
-f
-487.356 385.499 m
-486.787 385.966 l
-486.578 385.715 l
-486.561 385.684 l
-486.885 385.508 l
-487.17 385.275 l
-f
-487.21 385.333 m
-486.561 385.684 l
-486.404 385.395 l
-486.393 385.36 l
-486.745 385.251 l
-487.069 385.076 l
-f
-487.097 385.142 m
-486.393 385.36 l
-486.293 385.04 l
-486.289 385.003 l
-486.656 384.967 l
-487.009 384.858 l
-f
-487.023 384.93 m
-486.289 385.003 l
-486.255 384.661 l
-486.258 384.625 l
-486.625 384.661 l
-486.992 384.625 l
-f
-486.992 384.698 m
-486.258 384.625 l
-486.293 384.283 l
-486.304 384.247 l
-486.656 384.356 l
-487.023 384.393 l
-f
-487.009 384.465 m
-486.304 384.247 l
-486.404 383.928 l
-486.421 383.896 l
-486.745 384.072 l
-487.097 384.18 l
-f
-487.069 384.247 m
-486.421 383.896 l
-486.578 383.608 l
-486.601 383.581 l
-486.885 383.814 l
-487.21 383.989 l
-f
-487.17 384.048 m
-486.601 383.581 l
-486.809 383.329 l
-486.836 383.307 l
-487.071 383.59 l
-487.356 383.824 l
-f
-487.306 383.873 m
-486.836 383.307 l
-487.089 383.099 l
-487.12 383.082 l
-487.296 383.405 l
-487.531 383.688 l
-f
-487.472 383.728 m
-487.12 383.082 l
-487.411 382.925 l
-487.446 382.915 l
-487.555 383.265 l
-487.731 383.588 l
-f
-487.664 383.616 m
-487.446 382.915 l
-487.767 382.815 l
-487.804 382.812 l
-487.841 383.177 l
-487.95 383.528 l
-f
-487.878 383.542 m
-487.804 382.812 l
-488.147 382.777 l
-488.184 382.781 l
-488.147 383.146 l
-488.184 383.512 l
-f
-488.11 383.512 m
-488.184 382.781 l
-488.528 382.815 l
-488.563 382.826 l
-488.454 383.177 l
-488.417 383.542 l
-f
-488.345 383.528 m
-488.563 382.826 l
-488.884 382.925 l
-488.916 382.943 l
-488.74 383.265 l
-488.63 383.616 l
-f
-488.564 383.588 m
-488.916 382.943 l
-489.206 383.099 l
-489.233 383.122 l
-488.998 383.405 l
-488.822 383.728 l
-f
-488.764 383.688 m
-489.233 383.122 l
-489.486 383.329 l
-489.508 383.356 l
-489.224 383.59 l
-488.989 383.873 l
-f
-488.939 383.824 m
-489.508 383.356 l
-489.717 383.608 l
-489.734 383.639 l
-489.409 383.814 l
-489.125 384.048 l
-f
-489.085 383.989 m
-489.734 383.639 l
-489.891 383.928 l
-489.902 383.963 l
-489.55 384.072 l
-489.226 384.247 l
-f
-489.198 384.18 m
-489.902 383.963 l
-490.002 384.282 l
-490.005 384.319 l
-489.638 384.356 l
-489.286 384.465 l
-f
-489.272 384.393 m
-490.005 384.319 l
-490.036 384.625 l
-489.302 384.698 l
-f
-489.669 390.262 m
-489.669 391.099 488.988 391.777 488.147 391.777 c
-487.307 391.777 486.625 391.099 486.625 390.262 c
-486.625 389.425 487.307 388.747 488.147 388.747 c
-488.988 388.747 489.669 389.425 489.669 390.262 c
-f*
-489.302 390.225 m
-490.036 390.299 l
-490.002 390.641 l
-489.991 390.676 l
-489.638 390.567 l
-489.271 390.53 l
-f
-489.286 390.458 m
-489.991 390.676 l
-489.891 390.995 l
-489.874 391.027 l
-489.55 390.851 l
-489.197 390.743 l
-f
-489.226 390.676 m
-489.874 391.027 l
-489.717 391.315 l
-489.694 391.343 l
-489.409 391.109 l
-489.085 390.934 l
-f
-489.125 390.875 m
-489.694 391.343 l
-489.486 391.594 l
-489.458 391.616 l
-489.224 391.333 l
-488.939 391.099 l
-f
-488.989 391.05 m
-489.458 391.616 l
-489.206 391.824 l
-489.174 391.841 l
-488.998 391.518 l
-488.764 391.235 l
-f
-488.822 391.195 m
-489.174 391.841 l
-488.884 391.998 l
-488.849 392.008 l
-488.74 391.658 l
-488.564 391.335 l
-f
-488.63 391.307 m
-488.849 392.008 l
-488.528 392.108 l
-488.491 392.111 l
-488.454 391.746 l
-488.345 391.395 l
-f
-488.417 391.381 m
-488.491 392.111 l
-488.147 392.146 l
-488.11 392.142 l
-488.147 391.777 l
-488.11 391.412 l
-f
-488.184 391.412 m
-488.11 392.142 l
-487.767 392.108 l
-487.731 392.097 l
-487.841 391.746 l
-487.878 391.381 l
-f
-487.95 391.395 m
-487.731 392.097 l
-487.411 391.998 l
-487.379 391.98 l
-487.555 391.658 l
-487.664 391.307 l
-f
-487.731 391.335 m
-487.379 391.98 l
-487.089 391.824 l
-487.062 391.801 l
-487.296 391.518 l
-487.472 391.195 l
-f
-487.531 391.235 m
-487.062 391.801 l
-486.809 391.594 l
-486.787 391.567 l
-487.071 391.333 l
-487.306 391.05 l
-f
-487.356 391.099 m
-486.787 391.567 l
-486.578 391.315 l
-486.561 391.284 l
-486.885 391.109 l
-487.17 390.875 l
-f
-487.209 390.934 m
-486.561 391.284 l
-486.404 390.995 l
-486.393 390.96 l
-486.745 390.851 l
-487.069 390.676 l
-f
-487.097 390.743 m
-486.393 390.96 l
-486.293 390.641 l
-486.289 390.604 l
-486.656 390.567 l
-487.009 390.458 l
-f
-487.023 390.53 m
-486.289 390.604 l
-486.255 390.262 l
-486.258 390.225 l
-486.625 390.262 l
-486.992 390.225 l
-f
-486.992 390.299 m
-486.258 390.225 l
-486.293 389.883 l
-486.304 389.848 l
-486.656 389.956 l
-487.023 389.993 l
-f
-487.009 390.065 m
-486.304 389.848 l
-486.403 389.529 l
-486.421 389.497 l
-486.745 389.672 l
-487.097 389.781 l
-f
-487.069 389.847 m
-486.421 389.497 l
-486.578 389.208 l
-486.601 389.181 l
-486.885 389.415 l
-487.209 389.59 l
-f
-487.17 389.648 m
-486.601 389.181 l
-486.809 388.93 l
-486.836 388.907 l
-487.071 389.19 l
-487.356 389.424 l
-f
-487.306 389.474 m
-486.836 388.907 l
-487.089 388.7 l
-487.12 388.683 l
-487.296 389.005 l
-487.531 389.289 l
-f
-487.472 389.328 m
-487.12 388.683 l
-487.411 388.526 l
-487.446 388.515 l
-487.555 388.866 l
-487.731 389.188 l
-f
-487.664 389.216 m
-487.446 388.515 l
-487.767 388.416 l
-487.804 388.412 l
-487.841 388.777 l
-487.95 389.128 l
-f
-487.878 389.143 m
-487.804 388.412 l
-488.147 388.378 l
-488.184 388.381 l
-488.147 388.747 l
-488.184 389.112 l
-f
-488.11 389.112 m
-488.184 388.381 l
-488.528 388.416 l
-488.563 388.427 l
-488.454 388.777 l
-488.417 389.143 l
-f
-488.345 389.128 m
-488.563 388.427 l
-488.884 388.526 l
-488.916 388.543 l
-488.74 388.866 l
-488.63 389.216 l
-f
-488.564 389.188 m
-488.916 388.543 l
-489.206 388.7 l
-489.233 388.722 l
-488.998 389.005 l
-488.822 389.328 l
-f
-488.764 389.289 m
-489.233 388.722 l
-489.486 388.93 l
-489.508 388.957 l
-489.224 389.19 l
-488.989 389.474 l
-f
-488.939 389.424 m
-489.508 388.957 l
-489.717 389.208 l
-489.734 389.24 l
-489.409 389.415 l
-489.125 389.648 l
-f
-489.085 389.59 m
-489.734 389.24 l
-489.891 389.529 l
-489.902 389.563 l
-489.55 389.672 l
-489.226 389.847 l
-f
-489.197 389.781 m
-489.902 389.563 l
-490.002 389.883 l
-490.005 389.92 l
-489.638 389.956 l
-489.286 390.065 l
-f
-489.271 389.993 m
-490.005 389.92 l
-490.036 390.225 l
-489.302 390.299 l
-f
-489.669 396.241 m
-489.669 397.078 488.988 397.756 488.147 397.756 c
-487.307 397.756 486.625 397.078 486.625 396.241 c
-486.625 395.404 487.307 394.726 488.147 394.726 c
-488.988 394.726 489.669 395.404 489.669 396.241 c
-f*
-489.302 396.204 m
-490.036 396.278 l
-490.002 396.62 l
-489.991 396.655 l
-489.638 396.546 l
-489.271 396.509 l
-f
-489.286 396.437 m
-489.991 396.655 l
-489.891 396.974 l
-489.874 397.006 l
-489.55 396.831 l
-489.197 396.722 l
-f
-489.226 396.656 m
-489.874 397.006 l
-489.717 397.294 l
-489.694 397.322 l
-489.409 397.088 l
-489.085 396.913 l
-f
-489.125 396.854 m
-489.694 397.322 l
-489.486 397.573 l
-489.458 397.595 l
-489.224 397.312 l
-488.939 397.079 l
-f
-488.989 397.029 m
-489.458 397.595 l
-489.206 397.803 l
-489.174 397.82 l
-488.998 397.497 l
-488.764 397.214 l
-f
-488.822 397.175 m
-489.174 397.82 l
-488.884 397.977 l
-488.849 397.988 l
-488.74 397.637 l
-488.564 397.314 l
-f
-488.63 397.286 m
-488.849 397.988 l
-488.528 398.087 l
-488.491 398.091 l
-488.454 397.725 l
-488.345 397.375 l
-f
-488.417 397.36 m
-488.491 398.091 l
-488.147 398.125 l
-488.11 398.121 l
-488.147 397.756 l
-488.11 397.391 l
-f
-488.184 397.391 m
-488.11 398.121 l
-487.767 398.087 l
-487.731 398.076 l
-487.841 397.725 l
-487.878 397.36 l
-f
-487.95 397.375 m
-487.731 398.076 l
-487.411 397.977 l
-487.379 397.96 l
-487.555 397.637 l
-487.664 397.286 l
-f
-487.731 397.314 m
-487.379 397.96 l
-487.089 397.803 l
-487.062 397.78 l
-487.296 397.497 l
-487.472 397.175 l
-f
-487.531 397.214 m
-487.062 397.78 l
-486.809 397.573 l
-486.787 397.546 l
-487.071 397.312 l
-487.306 397.029 l
-f
-487.356 397.079 m
-486.787 397.546 l
-486.578 397.294 l
-486.561 397.263 l
-486.885 397.088 l
-487.17 396.854 l
-f
-487.209 396.913 m
-486.561 397.263 l
-486.404 396.974 l
-486.393 396.94 l
-486.745 396.831 l
-487.069 396.656 l
-f
-487.097 396.722 m
-486.393 396.94 l
-486.293 396.62 l
-486.289 396.583 l
-486.656 396.546 l
-487.009 396.437 l
-f
-487.023 396.509 m
-486.289 396.583 l
-486.255 396.241 l
-486.258 396.204 l
-486.625 396.241 l
-486.992 396.204 l
-f
-486.992 396.278 m
-486.258 396.204 l
-486.293 395.862 l
-486.304 395.827 l
-486.656 395.936 l
-487.023 395.972 l
-f
-487.009 396.044 m
-486.304 395.827 l
-486.403 395.508 l
-486.421 395.476 l
-486.745 395.651 l
-487.097 395.76 l
-f
-487.069 395.826 m
-486.421 395.476 l
-486.578 395.188 l
-486.601 395.16 l
-486.885 395.394 l
-487.209 395.569 l
-f
-487.17 395.628 m
-486.601 395.16 l
-486.809 394.909 l
-486.836 394.886 l
-487.071 395.17 l
-487.356 395.403 l
-f
-487.306 395.453 m
-486.836 394.886 l
-487.089 394.679 l
-487.12 394.662 l
-487.296 394.985 l
-487.531 395.268 l
-f
-487.472 395.307 m
-487.12 394.662 l
-487.411 394.505 l
-487.446 394.494 l
-487.555 394.845 l
-487.731 395.168 l
-f
-487.664 395.196 m
-487.446 394.494 l
-487.767 394.395 l
-487.804 394.391 l
-487.841 394.757 l
-487.95 395.107 l
-f
-487.878 395.122 m
-487.804 394.391 l
-488.147 394.357 l
-488.184 394.361 l
-488.147 394.726 l
-488.184 395.091 l
-f
-488.11 395.091 m
-488.184 394.361 l
-488.528 394.395 l
-488.563 394.406 l
-488.454 394.757 l
-488.417 395.122 l
-f
-488.345 395.107 m
-488.563 394.406 l
-488.884 394.505 l
-488.916 394.522 l
-488.74 394.845 l
-488.63 395.196 l
-f
-488.564 395.168 m
-488.916 394.522 l
-489.206 394.679 l
-489.233 394.701 l
-488.998 394.985 l
-488.822 395.307 l
-f
-488.764 395.268 m
-489.233 394.701 l
-489.486 394.909 l
-489.508 394.936 l
-489.224 395.17 l
-488.989 395.453 l
-f
-488.939 395.403 m
-489.508 394.936 l
-489.717 395.188 l
-489.734 395.219 l
-489.409 395.394 l
-489.125 395.628 l
-f
-489.085 395.569 m
-489.734 395.219 l
-489.891 395.508 l
-489.902 395.542 l
-489.55 395.651 l
-489.226 395.826 l
-f
-489.197 395.76 m
-489.902 395.542 l
-490.002 395.862 l
-490.005 395.899 l
-489.638 395.936 l
-489.286 396.044 l
-f
-489.271 395.972 m
-490.005 395.899 l
-490.036 396.204 l
-489.302 396.278 l
-f
-BT
-0 g
-1 0 0 0.995457 463.599 462.633 Tm
-(replica 0) Tj
-ET
-466.484 453.617 m
-466.683 452.91 l
-468.338 453.37 l
-468.239 453.724 l
-468.224 454.09 l
-468.181 454.089 l
-f
-468.224 454.09 m
-468.253 453.357 l
-469.909 453.422 l
-469.894 453.8 l
-469.894 454.167 l
-469.879 454.156 l
-f
-469.894 454.167 m
-469.894 453.433 l
-473.204 453.433 l
-473.204 453.8 l
-473.204 454.167 l
-473.204 454.167 l
-f
-473.204 454.167 m
-473.204 453.433 l
-476.515 453.433 l
-476.515 453.8 l
-476.515 454.167 l
-476.515 454.167 l
-f
-476.515 454.167 m
-476.515 453.433 l
-479.825 453.433 l
-479.825 453.8 l
-479.825 454.167 l
-479.825 454.167 l
-f
-479.825 454.167 m
-479.825 453.433 l
-483.135 453.433 l
-483.135 453.8 l
-483.135 454.167 l
-483.135 454.167 l
-f
-483.135 454.167 m
-483.135 453.433 l
-486.446 453.433 l
-486.446 453.8 l
-486.446 454.167 l
-486.446 454.167 l
-f
-486.446 454.167 m
-486.446 453.433 l
-489.756 453.433 l
-489.756 453.8 l
-489.756 454.167 l
-489.756 454.167 l
-f
-489.756 454.167 m
-489.756 453.433 l
-491.428 453.433 l
-491.428 453.8 l
-491.428 454.167 l
-491.428 454.167 l
-f
-491.428 454.167 m
-491.428 453.433 l
-493.204 453.433 l
-493.204 453.8 l
-493.204 454.167 l
-493.204 454.167 l
-f
-493.204 454.167 m
-493.204 453.433 l
-495.135 453.433 l
-495.135 453.8 l
-495.135 454.167 l
-495.135 454.167 l
-f
-495.135 454.167 m
-495.135 453.433 l
-497.066 453.433 l
-497.066 453.789 l
-497.07 454.156 l
-497.066 454.167 l
-f
-497.07 454.156 m
-497.063 453.422 l
-497.97 453.414 l
-497.974 453.781 l
-497.998 454.147 l
-497.977 454.148 l
-f
-497.998 454.147 m
-497.949 453.415 l
-498.818 453.357 l
-498.842 453.724 l
-498.91 454.085 l
-498.888 454.089 l
-f
-498.91 454.085 m
-498.775 453.363 l
-499.617 453.206 l
-499.685 453.567 l
-499.812 453.912 l
-499.783 453.923 l
-f
-499.812 453.912 m
-499.558 453.223 l
-500.387 452.919 l
-500.515 453.263 l
-500.703 453.579 l
-500.674 453.596 l
-f
-500.703 453.579 m
-500.326 452.948 l
-501.145 452.463 l
-501.334 452.779 l
-501.569 453.061 l
-501.547 453.08 l
-f
-501.569 453.061 m
-501.098 452.496 l
-501.866 451.863 l
-502.101 452.146 l
-502.375 452.392 l
-502.357 452.412 l
-f
-502.375 452.392 m
-501.827 451.9 l
-502.491 451.168 l
-502.765 451.415 l
-503.074 451.614 l
-503.058 451.639 l
-f
-503.074 451.614 m
-502.455 451.215 l
-502.964 450.434 l
-503.273 450.634 l
-503.615 450.771 l
-503.602 450.804 l
-f
-503.615 450.771 m
-502.931 450.497 l
-503.25 449.708 l
-503.592 449.845 l
-503.953 449.919 l
-503.947 449.952 l
-f
-503.953 449.919 m
-503.231 449.771 l
-503.395 448.982 l
-503.756 449.056 l
-504.124 449.084 l
-504.122 449.108 l
-f
-504.124 449.084 m
-503.388 449.028 l
-503.449 448.24 l
-503.816 448.268 l
-504.185 448.272 l
-504.184 448.295 l
-f
-504.185 448.272 m
-503.448 448.264 l
-503.456 447.475 l
-503.8 447.479 l
-504.169 447.479 l
-504.194 447.483 l
-f
-504.169 447.479 m
-503.431 447.479 l
-503.431 444.323 l
-503.8 444.323 l
-504.169 444.323 l
-504.169 444.323 l
-f
-504.169 444.323 m
-503.431 444.323 l
-503.431 442.811 l
-503.8 442.811 l
-504.169 442.811 l
-504.169 442.811 l
-f
-504.169 442.811 m
-503.431 442.811 l
-503.431 441.694 l
-503.8 441.694 l
-504.169 441.694 l
-504.169 441.694 l
-f
-504.169 441.694 m
-503.431 441.694 l
-503.431 441.382 l
-503.8 441.382 l
-504.169 441.382 l
-504.169 441.382 l
-f
-504.169 441.382 m
-503.431 441.382 l
-503.431 440.954 l
-503.8 440.954 l
-504.169 440.954 l
-504.169 440.954 l
-f
-504.169 440.954 m
-503.431 440.954 l
-503.431 440.642 l
-503.8 440.642 l
-504.169 440.642 l
-504.169 440.642 l
-f
-504.169 440.642 m
-503.431 440.642 l
-503.431 439.525 l
-503.8 439.525 l
-504.169 439.525 l
-504.169 439.525 l
-f
-504.169 439.525 m
-503.431 439.525 l
-503.431 438.013 l
-503.8 438.013 l
-504.169 438.013 l
-504.169 438.013 l
-f
-504.169 438.013 m
-503.431 438.013 l
-503.431 434.857 l
-503.8 434.857 l
-504.169 434.857 l
-504.169 434.857 l
-f
-504.169 434.857 m
-503.431 434.857 l
-503.431 431.702 l
-503.8 431.702 l
-504.169 431.702 l
-504.169 431.702 l
-f
-504.169 431.702 m
-503.431 431.702 l
-503.431 428.547 l
-503.825 428.547 l
-504.194 428.543 l
-504.169 428.547 l
-f
-504.194 428.543 m
-503.456 428.551 l
-503.448 427.762 l
-503.816 427.758 l
-504.184 427.73 l
-504.185 427.742 l
-f
-504.184 427.73 m
-503.449 427.786 l
-503.388 426.997 l
-503.756 426.969 l
-504.117 426.895 l
-504.122 426.918 l
-f
-504.117 426.895 m
-503.395 427.043 l
-503.231 426.255 l
-503.592 426.18 l
-503.934 426.043 l
-503.947 426.074 l
-f
-503.934 426.043 m
-503.25 426.317 l
-502.931 425.528 l
-503.273 425.391 l
-503.583 425.192 l
-503.602 425.221 l
-f
-503.583 425.192 m
-502.964 425.591 l
-502.455 424.811 l
-502.765 424.611 l
-503.038 424.365 l
-503.058 424.386 l
-f
-503.038 424.365 m
-502.491 424.857 l
-501.827 424.126 l
-502.101 423.879 l
-502.336 423.597 l
-502.357 423.614 l
-f
-502.336 423.597 m
-501.866 424.162 l
-501.098 423.529 l
-501.334 423.247 l
-501.522 422.931 l
-501.547 422.946 l
-f
-501.522 422.931 m
-501.145 423.562 l
-500.326 423.078 l
-500.515 422.762 l
-500.642 422.417 l
-500.674 422.429 l
-f
-500.642 422.417 m
-500.387 423.106 l
-499.558 422.802 l
-499.685 422.458 l
-499.752 422.097 l
-499.783 422.103 l
-f
-499.752 422.097 m
-499.617 422.819 l
-498.775 422.663 l
-498.842 422.302 l
-498.867 421.935 l
-498.888 421.937 l
-f
-498.867 421.935 m
-498.818 422.668 l
-497.949 422.611 l
-497.974 422.244 l
-497.977 421.877 l
-497.998 421.878 l
-f
-497.977 421.877 m
-497.97 422.611 l
-497.063 422.603 l
-497.066 422.2 l
-497.066 421.833 l
-497.07 421.869 l
-f
-497.066 421.833 m
-497.066 422.567 l
-495.135 422.567 l
-495.135 422.2 l
-495.135 421.833 l
-495.135 421.833 l
-f
-495.135 421.833 m
-495.135 422.567 l
-493.204 422.567 l
-493.204 422.2 l
-493.204 421.833 l
-493.204 421.833 l
-f
-493.204 421.833 m
-493.204 422.567 l
-491.428 422.567 l
-491.428 422.2 l
-491.428 421.833 l
-491.428 421.833 l
-f
-491.428 421.833 m
-491.428 422.567 l
-489.756 422.567 l
-489.756 422.2 l
-489.756 421.833 l
-489.756 421.833 l
-f
-489.756 421.833 m
-489.756 422.567 l
-486.446 422.567 l
-486.446 422.2 l
-486.446 421.833 l
-486.446 421.833 l
-f
-486.446 421.833 m
-486.446 422.567 l
-483.135 422.567 l
-483.135 422.2 l
-483.135 421.833 l
-483.135 421.833 l
-f
-483.135 421.833 m
-483.135 422.567 l
-479.825 422.567 l
-479.825 422.2 l
-479.825 421.833 l
-479.825 421.833 l
-f
-479.825 421.833 m
-479.825 422.567 l
-476.515 422.567 l
-476.515 422.2 l
-476.515 421.833 l
-476.515 421.833 l
-f
-476.515 421.833 m
-476.515 422.567 l
-473.204 422.567 l
-473.204 422.2 l
-473.204 421.833 l
-473.204 421.833 l
-f
-473.204 421.833 m
-473.204 422.567 l
-469.894 422.567 l
-469.894 422.236 l
-469.879 421.869 l
-469.894 421.833 l
-f
-469.879 421.869 m
-469.909 422.603 l
-468.253 422.669 l
-468.239 422.302 l
-468.14 421.948 l
-468.181 421.937 l
-f
-468.14 421.948 m
-468.338 422.655 l
-466.683 423.116 l
-466.584 422.762 l
-466.395 422.446 l
-466.437 422.421 l
-f
-466.395 422.446 m
-466.772 423.078 l
-465.953 423.562 l
-465.765 423.247 l
-465.529 422.964 l
-465.551 422.946 l
-f
-465.529 422.964 m
-466 423.529 l
-465.233 424.162 l
-464.997 423.879 l
-464.724 423.633 l
-464.742 423.614 l
-f
-464.724 423.633 m
-465.271 424.126 l
-464.607 424.857 l
-464.334 424.611 l
-464.024 424.411 l
-464.04 424.386 l
-f
-464.024 424.411 m
-464.643 424.811 l
-464.134 425.591 l
-463.825 425.391 l
-463.483 425.254 l
-463.496 425.221 l
-f
-463.483 425.254 m
-464.167 425.528 l
-463.848 426.317 l
-463.506 426.18 l
-463.145 426.106 l
-463.152 426.074 l
-f
-463.145 426.106 m
-463.867 426.255 l
-463.703 427.043 l
-463.342 426.969 l
-462.974 426.941 l
-462.976 426.918 l
-f
-462.974 426.941 m
-463.71 426.997 l
-463.65 427.786 l
-463.282 427.758 l
-462.913 427.754 l
-462.913 427.742 l
-f
-462.913 427.754 m
-463.651 427.762 l
-463.642 428.551 l
-463.3 428.547 l
-462.931 428.547 l
-462.904 428.543 l
-f
-462.931 428.547 m
-463.669 428.547 l
-463.669 431.702 l
-463.3 431.702 l
-462.931 431.702 l
-462.931 431.702 l
-f
-462.931 431.702 m
-463.669 431.702 l
-463.669 434.857 l
-463.3 434.857 l
-462.931 434.857 l
-462.931 434.857 l
-f
-462.931 434.857 m
-463.669 434.857 l
-463.669 438.013 l
-463.3 438.013 l
-462.931 438.013 l
-462.931 438.013 l
-f
-462.931 438.013 m
-463.669 438.013 l
-463.669 441.168 l
-463.3 441.168 l
-462.931 441.168 l
-462.931 441.168 l
-f
-462.931 441.168 m
-463.669 441.168 l
-463.669 444.323 l
-463.3 444.323 l
-462.931 444.323 l
-462.931 444.323 l
-f
-462.931 444.323 m
-463.669 444.323 l
-463.669 447.479 l
-463.273 447.479 l
-462.904 447.483 l
-462.931 447.479 l
-f
-462.904 447.483 m
-463.642 447.475 l
-463.651 448.264 l
-463.282 448.268 l
-462.914 448.295 l
-462.913 448.271 l
-f
-462.914 448.295 m
-463.65 448.24 l
-463.71 449.028 l
-463.342 449.056 l
-462.981 449.131 l
-462.976 449.108 l
-f
-462.981 449.131 m
-463.703 448.982 l
-463.867 449.771 l
-463.506 449.845 l
-463.164 449.982 l
-463.152 449.952 l
-f
-463.164 449.982 m
-463.848 449.708 l
-464.167 450.497 l
-463.825 450.634 l
-463.516 450.834 l
-463.496 450.804 l
-f
-463.516 450.834 m
-464.134 450.434 l
-464.643 451.215 l
-464.334 451.415 l
-464.06 451.661 l
-464.04 451.639 l
-f
-464.06 451.661 m
-464.607 451.168 l
-465.271 451.9 l
-464.997 452.146 l
-464.762 452.429 l
-464.742 452.412 l
-f
-464.762 452.429 m
-465.233 451.863 l
-466 452.496 l
-465.765 452.779 l
-465.576 453.094 l
-465.551 453.08 l
-f
-465.576 453.094 m
-465.953 452.463 l
-466.772 452.948 l
-466.395 453.579 l
-f
-BT
-/R691 6.82548 Tf
-1 0 0 0.995457 467.333 434.089 Tm
-(replication) Tj
-1 0 0 0.995457 473.021 426.917 Tm
-(library) Tj
-ET
-463.161 442.433 40.5735 0.734326 re
-f
-BT
-/R691 6.82544 Tf
-1 0 0 0.995457 475.295 447.29 Tm
-(snfsd) Tj
-ET
-462.708 459.455 m
-463.307 458.113 l
-464.535 458.656 l
-464.236 459.327 l
-464.072 460.043 l
-464.002 460.027 l
-f
-464.072 460.043 m
-464.4 458.611 l
-465.629 458.89 l
-465.465 459.606 l
-465.403 460.338 l
-465.351 460.333 l
-f
-465.403 460.338 m
-465.526 458.874 l
-466.755 458.977 l
-466.693 459.709 l
-466.684 460.443 l
-466.658 460.443 l
-f
-466.684 460.443 m
-466.702 458.974 l
-467.931 458.989 l
-467.922 459.7 l
-467.922 460.434 l
-467.913 460.458 l
-f
-467.922 460.434 m
-467.922 458.966 l
-472.836 458.966 l
-472.836 459.7 l
-472.836 460.434 l
-472.836 460.434 l
-f
-472.836 460.434 m
-472.836 458.966 l
-477.751 458.966 l
-477.751 459.7 l
-477.751 460.434 l
-477.751 460.434 l
-f
-477.751 460.434 m
-477.751 458.966 l
-482.665 458.966 l
-482.665 459.7 l
-482.665 460.434 l
-482.665 460.434 l
-f
-482.665 460.434 m
-482.665 458.966 l
-487.58 458.966 l
-487.58 459.7 l
-487.58 460.434 l
-487.58 460.434 l
-f
-487.58 460.434 m
-487.58 458.966 l
-492.494 458.966 l
-492.494 459.7 l
-492.494 460.434 l
-492.494 460.434 l
-f
-492.494 460.434 m
-492.494 458.966 l
-497.409 458.966 l
-497.409 459.7 l
-497.409 460.434 l
-497.409 460.434 l
-f
-497.409 460.434 m
-497.409 458.966 l
-499.891 458.966 l
-499.891 459.7 l
-499.891 460.434 l
-499.891 460.434 l
-f
-499.891 460.434 m
-499.891 458.966 l
-502.528 458.966 l
-502.528 459.7 l
-502.528 460.434 l
-502.528 460.434 l
-f
-502.528 460.434 m
-502.528 458.966 l
-505.395 458.966 l
-505.395 459.7 l
-505.395 460.434 l
-505.395 460.434 l
-f
-505.395 460.434 m
-505.395 458.966 l
-508.261 458.966 l
-508.261 459.723 l
-508.269 460.458 l
-508.261 460.434 l
-f
-508.269 460.458 m
-508.253 458.989 l
-509.6 458.974 l
-509.608 459.709 l
-509.667 460.441 l
-509.642 460.443 l
-f
-509.667 460.441 m
-509.549 458.977 l
-510.839 458.874 l
-510.898 459.606 l
-511.059 460.323 l
-511.008 460.334 l
-f
-511.059 460.323 m
-510.736 458.889 l
-511.988 458.61 l
-512.149 459.327 l
-512.447 459.998 l
-512.381 460.028 l
-f
-512.447 459.998 m
-511.85 458.656 l
-513.082 458.112 l
-513.381 458.784 l
-513.81 459.381 l
-513.748 459.425 l
-f
-513.81 459.381 m
-512.951 458.187 l
-514.167 457.321 l
-514.596 457.918 l
-515.117 458.438 l
-515.075 458.48 l
-f
-515.117 458.438 m
-514.076 457.398 l
-515.215 456.267 l
-515.735 456.787 l
-516.325 457.228 l
-516.294 457.27 l
-f
-516.325 457.228 m
-515.145 456.347 l
-516.131 455.04 l
-516.721 455.481 l
-517.37 455.829 l
-517.344 455.878 l
-f
-517.37 455.829 m
-516.071 455.133 l
-516.827 453.738 l
-517.476 454.086 l
-518.176 454.319 l
-518.155 454.379 l
-f
-518.176 454.319 m
-516.776 453.854 l
-517.25 452.444 l
-517.949 452.677 l
-518.676 452.802 l
-518.667 452.857 l
-f
-518.676 452.802 m
-517.222 452.553 l
-517.466 451.144 l
-518.193 451.268 l
-518.929 451.314 l
-518.926 451.354 l
-f
-518.929 451.314 m
-517.456 451.222 l
-517.546 449.812 l
-518.282 449.859 l
-519.02 449.865 l
-519.02 449.885 l
-f
-519.02 449.865 m
-517.545 449.852 l
-517.557 448.443 l
-518.3 448.45 l
-519.038 448.45 l
-519.033 448.456 l
-f
-519.038 448.45 m
-517.562 448.45 l
-517.562 442.813 l
-518.3 442.813 l
-519.038 442.813 l
-519.038 442.813 l
-f
-519.038 442.813 m
-517.562 442.813 l
-517.562 441.418 l
-518.3 441.418 l
-519.038 441.418 l
-519.038 441.418 l
-f
-519.038 441.418 m
-517.562 441.418 l
-517.562 438.981 l
-518.3 438.981 l
-519.038 438.981 l
-519.038 438.981 l
-f
-519.038 438.981 m
-517.562 438.981 l
-517.562 438.115 l
-518.3 438.115 l
-519.038 438.115 l
-519.038 438.115 l
-f
-519.038 438.115 m
-517.562 438.115 l
-517.562 437.557 l
-518.3 437.557 l
-519.038 437.557 l
-519.038 437.557 l
-f
-519.038 437.557 m
-517.562 437.557 l
-517.562 436.794 l
-518.3 436.794 l
-519.038 436.794 l
-519.038 436.794 l
-f
-519.038 436.794 m
-517.562 436.794 l
-517.562 436.236 l
-518.3 436.236 l
-519.038 436.236 l
-519.038 436.236 l
-f
-519.038 436.236 m
-517.562 436.236 l
-517.562 435.37 l
-518.3 435.37 l
-519.038 435.37 l
-519.038 435.37 l
-f
-519.038 435.37 m
-517.562 435.37 l
-517.562 432.933 l
-518.3 432.933 l
-519.038 432.933 l
-519.038 432.933 l
-f
-519.038 432.933 m
-517.562 432.933 l
-517.562 431.539 l
-518.3 431.539 l
-519.038 431.539 l
-519.038 431.539 l
-f
-519.038 431.539 m
-517.562 431.539 l
-517.562 425.902 l
-518.3 425.902 l
-519.038 425.902 l
-519.038 425.902 l
-f
-519.038 425.902 m
-517.562 425.902 l
-517.562 420.265 l
-518.3 420.265 l
-519.038 420.265 l
-519.038 420.265 l
-f
-519.038 420.265 m
-517.562 420.265 l
-517.562 414.628 l
-518.295 414.628 l
-519.033 414.622 l
-519.038 414.628 l
-f
-519.033 414.622 m
-517.557 414.635 l
-517.545 413.226 l
-518.282 413.219 l
-519.018 413.173 l
-519.02 413.193 l
-f
-519.018 413.173 m
-517.546 413.265 l
-517.456 411.856 l
-518.193 411.81 l
-518.92 411.685 l
-518.926 411.724 l
-f
-518.92 411.685 m
-517.466 411.934 l
-517.222 410.525 l
-517.949 410.401 l
-518.649 410.168 l
-518.667 410.221 l
-f
-518.649 410.168 m
-517.25 410.634 l
-516.776 409.224 l
-517.476 408.991 l
-518.125 408.643 l
-518.155 408.699 l
-f
-518.125 408.643 m
-516.827 409.34 l
-516.071 407.945 l
-516.721 407.597 l
-517.311 407.156 l
-517.344 407.2 l
-f
-517.311 407.156 m
-516.131 408.038 l
-515.145 406.731 l
-515.735 406.29 l
-516.256 405.77 l
-516.294 405.807 l
-f
-516.256 405.77 m
-515.215 406.81 l
-514.076 405.68 l
-514.596 405.16 l
-515.026 404.563 l
-515.075 404.598 l
-f
-515.026 404.563 m
-514.167 405.757 l
-512.951 404.891 l
-513.381 404.294 l
-513.679 403.623 l
-513.748 403.653 l
-f
-513.679 403.623 m
-513.082 404.965 l
-511.85 404.422 l
-512.149 403.751 l
-512.31 403.034 l
-512.381 403.05 l
-f
-512.31 403.034 m
-511.988 404.467 l
-510.736 404.189 l
-510.898 403.472 l
-510.957 402.74 l
-511.008 402.744 l
-f
-510.957 402.74 m
-510.839 404.204 l
-509.549 404.101 l
-509.608 403.369 l
-509.616 402.635 l
-509.642 402.635 l
-f
-509.616 402.635 m
-509.6 404.103 l
-508.253 404.089 l
-508.261 403.4 l
-508.261 402.666 l
-508.269 402.62 l
-f
-508.261 402.666 m
-508.261 404.134 l
-505.395 404.134 l
-505.395 403.4 l
-505.395 402.666 l
-505.395 402.666 l
-f
-505.395 402.666 m
-505.395 404.134 l
-502.528 404.134 l
-502.528 403.4 l
-502.528 402.666 l
-502.528 402.666 l
-f
-502.528 402.666 m
-502.528 404.134 l
-499.891 404.134 l
-499.891 403.4 l
-499.891 402.666 l
-499.891 402.666 l
-f
-499.891 402.666 m
-499.891 404.134 l
-497.409 404.134 l
-497.409 403.4 l
-497.409 402.666 l
-497.409 402.666 l
-f
-497.409 402.666 m
-497.409 404.134 l
-492.494 404.134 l
-492.494 403.4 l
-492.494 402.666 l
-492.494 402.666 l
-f
-492.494 402.666 m
-492.494 404.134 l
-487.58 404.134 l
-487.58 403.4 l
-487.58 402.666 l
-487.58 402.666 l
-f
-487.58 402.666 m
-487.58 404.134 l
-482.665 404.134 l
-482.665 403.4 l
-482.665 402.666 l
-482.665 402.666 l
-f
-482.665 402.666 m
-482.665 404.134 l
-477.751 404.134 l
-477.751 403.4 l
-477.751 402.666 l
-477.751 402.666 l
-f
-477.751 402.666 m
-477.751 404.134 l
-472.836 404.134 l
-472.836 403.4 l
-472.836 402.666 l
-472.836 402.666 l
-f
-472.836 402.666 m
-472.836 404.134 l
-467.922 404.134 l
-467.922 403.354 l
-467.913 402.62 l
-467.922 402.666 l
-f
-467.913 402.62 m
-467.931 404.089 l
-466.702 404.103 l
-466.693 403.369 l
-466.631 402.637 l
-466.658 402.635 l
-f
-466.631 402.637 m
-466.755 404.101 l
-465.526 404.204 l
-465.465 403.472 l
-465.301 402.756 l
-465.351 402.744 l
-f
-465.301 402.756 m
-465.629 404.188 l
-464.4 404.467 l
-464.236 403.751 l
-463.937 403.08 l
-464.002 403.051 l
-f
-463.937 403.08 m
-464.535 404.422 l
-463.307 404.965 l
-463.007 404.294 l
-462.578 403.697 l
-462.639 403.653 l
-f
-462.578 403.697 m
-463.437 404.891 l
-462.221 405.757 l
-461.792 405.16 l
-461.271 404.64 l
-461.313 404.598 l
-f
-461.271 404.64 m
-462.312 405.68 l
-461.173 406.81 l
-460.653 406.29 l
-460.063 405.849 l
-460.094 405.807 l
-f
-460.063 405.849 m
-461.242 406.731 l
-460.257 408.038 l
-459.667 407.597 l
-459.018 407.248 l
-459.044 407.2 l
-f
-459.018 407.248 m
-460.316 407.945 l
-459.561 409.34 l
-458.912 408.991 l
-458.212 408.758 l
-458.233 408.699 l
-f
-458.212 408.758 m
-459.612 409.224 l
-459.138 410.634 l
-458.438 410.401 l
-457.711 410.276 l
-457.721 410.221 l
-f
-457.711 410.276 m
-459.166 410.525 l
-458.922 411.934 l
-458.195 411.81 l
-457.459 411.763 l
-457.462 411.724 l
-f
-457.459 411.763 m
-458.932 411.856 l
-458.842 413.265 l
-458.106 413.219 l
-457.368 413.212 l
-457.368 413.192 l
-f
-457.368 413.212 m
-458.843 413.226 l
-458.831 414.635 l
-458.1 414.628 l
-457.362 414.628 l
-457.355 414.622 l
-f
-457.362 414.628 m
-458.838 414.628 l
-458.838 420.265 l
-458.1 420.265 l
-457.362 420.265 l
-457.362 420.265 l
-f
-457.362 420.265 m
-458.838 420.265 l
-458.838 425.902 l
-458.1 425.902 l
-457.362 425.902 l
-457.362 425.902 l
-f
-457.362 425.902 m
-458.838 425.902 l
-458.838 431.539 l
-458.1 431.539 l
-457.362 431.539 l
-457.362 431.539 l
-f
-457.362 431.539 m
-458.838 431.539 l
-458.838 437.176 l
-458.1 437.176 l
-457.362 437.176 l
-457.362 437.176 l
-f
-457.362 437.176 m
-458.838 437.176 l
-458.838 442.813 l
-458.1 442.813 l
-457.362 442.813 l
-457.362 442.813 l
-f
-457.362 442.813 m
-458.838 442.813 l
-458.838 448.45 l
-458.093 448.45 l
-457.355 448.456 l
-457.362 448.45 l
-f
-457.355 448.456 m
-458.831 448.443 l
-458.843 449.852 l
-458.106 449.859 l
-457.37 449.905 l
-457.368 449.885 l
-f
-457.37 449.905 m
-458.842 449.812 l
-458.932 451.222 l
-458.195 451.268 l
-457.468 451.392 l
-457.462 451.354 l
-f
-457.468 451.392 m
-458.922 451.144 l
-459.166 452.553 l
-458.438 452.677 l
-457.739 452.91 l
-457.721 452.857 l
-f
-457.739 452.91 m
-459.138 452.444 l
-459.612 453.854 l
-458.912 454.086 l
-458.263 454.435 l
-458.233 454.379 l
-f
-458.263 454.435 m
-459.561 453.738 l
-460.316 455.133 l
-459.667 455.481 l
-459.077 455.922 l
-459.044 455.878 l
-f
-459.077 455.922 m
-460.257 455.04 l
-461.242 456.347 l
-460.653 456.787 l
-460.132 457.308 l
-460.094 457.27 l
-f
-460.132 457.308 m
-461.173 456.267 l
-462.312 457.398 l
-461.792 457.918 l
-461.362 458.515 l
-461.313 458.48 l
-f
-461.362 458.515 m
-462.221 457.321 l
-463.437 458.187 l
-462.578 459.381 l
-f
-458 415.733 59.9384 0.734326 re
-f
-BT
-/R691 6.84901 Tf
-1 0 0 0.995457 472.398 408.469 Tm
-(kernel VM) Tj
-ET
-0.501961 g
-513.356 414.391 m
-511.08 411.332 l
-508.805 414.391 l
-f*
-513.653 414.172 m
-513.06 414.609 l
-510.784 411.551 l
-511.08 411.332 l
-510.784 411.114 l
-511.08 410.715 l
-f
-510.784 411.114 m
-511.377 411.551 l
-509.101 414.609 l
-508.805 414.4 l
-508.805 414.767 l
-508.065 414.767 l
-f
-508.805 414.767 m
-508.805 414.033 l
-513.356 414.033 l
-513.356 414.391 l
-513.653 414.172 l
-514.096 414.767 l
-f
-510.341 414.698 1.4793 33.7112 re
-f*
-509.931 414.698 m
-510.669 414.698 l
-510.669 448.409 l
-510.341 448.4 l
-510.341 448.767 l
-509.931 448.767 l
-f
-510.341 448.767 m
-510.341 448.033 l
-511.82 448.033 l
-511.8 448.409 l
-512.169 448.409 l
-512.169 448.767 l
-f
-512.169 448.409 m
-511.431 448.409 l
-511.431 414.698 l
-511.82 414.7 l
-511.82 414.333 l
-512.169 414.333 l
-f
-511.82 414.333 m
-511.82 415.067 l
-510.341 415.067 l
-510.3 414.698 l
-509.931 414.698 l
-509.931 414.333 l
-f
-500.547 445.715 m
-497.475 447.981 l
-500.547 450.246 l
-f*
-500.328 445.42 m
-500.767 446.01 l
-497.694 448.276 l
-497.475 447.981 l
-497.255 448.276 l
-496.855 447.981 l
-f
-497.255 448.276 m
-497.694 447.686 l
-500.767 449.951 l
-500.5 450.246 l
-500.869 450.246 l
-500.869 450.94 l
-f
-500.869 450.246 m
-500.131 450.246 l
-500.131 445.715 l
-500.547 445.715 l
-500.328 445.42 l
-500.869 445.021 l
-f
-500.919 447.245 10.83 1.47258 re
-f*
-500.919 449.067 m
-500.919 448.333 l
-511.749 448.333 l
-511.7 448.717 l
-512.069 448.717 l
-512.069 449.067 l
-f
-512.069 448.717 m
-511.331 448.717 l
-511.331 447.245 l
-511.749 447.2 l
-511.749 446.833 l
-512.069 446.833 l
-f
-511.749 446.833 m
-511.749 447.567 l
-500.919 447.567 l
-500.9 447.245 l
-500.531 447.245 l
-500.531 446.833 l
-f
-500.531 447.245 m
-501.269 447.245 l
-501.269 448.717 l
-500.919 448.7 l
-500.919 449.067 l
-500.531 449.067 l
-f
-BT
-0 g
-1 0 0 0.995457 463.599 377.329 Tm
-(replica n) Tj
-ET
-466.485 368.312 m
-466.683 367.605 l
-468.338 368.065 l
-468.239 368.419 l
-468.224 368.786 l
-468.181 368.784 l
-f
-468.224 368.786 m
-468.254 368.052 l
-469.909 368.118 l
-469.894 368.5 l
-469.894 368.867 l
-469.88 368.852 l
-f
-469.894 368.867 m
-469.894 368.133 l
-473.205 368.133 l
-473.205 368.5 l
-473.205 368.867 l
-473.205 368.867 l
-f
-473.205 368.867 m
-473.205 368.133 l
-476.515 368.133 l
-476.515 368.5 l
-476.515 368.867 l
-476.515 368.867 l
-f
-476.515 368.867 m
-476.515 368.133 l
-479.825 368.133 l
-479.825 368.5 l
-479.825 368.867 l
-479.825 368.867 l
-f
-479.825 368.867 m
-479.825 368.133 l
-483.136 368.133 l
-483.136 368.5 l
-483.136 368.867 l
-483.136 368.867 l
-f
-483.136 368.867 m
-483.136 368.133 l
-486.446 368.133 l
-486.446 368.5 l
-486.446 368.867 l
-486.446 368.867 l
-f
-486.446 368.867 m
-486.446 368.133 l
-489.756 368.133 l
-489.756 368.5 l
-489.756 368.867 l
-489.756 368.867 l
-f
-489.756 368.867 m
-489.756 368.133 l
-491.429 368.133 l
-491.429 368.5 l
-491.429 368.867 l
-491.429 368.867 l
-f
-491.429 368.867 m
-491.429 368.133 l
-493.205 368.133 l
-493.205 368.5 l
-493.205 368.867 l
-493.205 368.867 l
-f
-493.205 368.867 m
-493.205 368.133 l
-495.136 368.133 l
-495.136 368.5 l
-495.136 368.867 l
-495.136 368.867 l
-f
-495.136 368.867 m
-495.136 368.133 l
-497.067 368.133 l
-497.067 368.485 l
-497.07 368.852 l
-497.067 368.867 l
-f
-497.07 368.852 m
-497.063 368.118 l
-497.971 368.109 l
-497.974 368.476 l
-497.998 368.843 l
-497.977 368.844 l
-f
-497.998 368.843 m
-497.95 368.11 l
-498.818 368.053 l
-498.843 368.419 l
-498.91 368.78 l
-498.889 368.784 l
-f
-498.91 368.78 m
-498.775 368.058 l
-499.618 367.902 l
-499.685 368.263 l
-499.813 368.607 l
-499.783 368.618 l
-f
-499.813 368.607 m
-499.558 367.918 l
-500.388 367.614 l
-500.515 367.959 l
-500.703 368.274 l
-500.674 368.292 l
-f
-500.703 368.274 m
-500.326 367.643 l
-501.145 367.158 l
-501.334 367.474 l
-501.569 367.757 l
-501.547 367.775 l
-f
-501.569 367.757 m
-501.099 367.191 l
-501.866 366.558 l
-502.101 366.841 l
-502.375 367.087 l
-502.357 367.107 l
-f
-502.375 367.087 m
-501.827 366.595 l
-502.491 365.864 l
-502.765 366.11 l
-503.074 366.31 l
-503.058 366.334 l
-f
-503.074 366.31 m
-502.455 365.91 l
-502.964 365.13 l
-503.274 365.329 l
-503.616 365.466 l
-503.602 365.499 l
-f
-503.616 365.466 m
-502.931 365.192 l
-503.25 364.403 l
-503.593 364.54 l
-503.954 364.615 l
-503.947 364.647 l
-f
-503.954 364.615 m
-503.231 364.466 l
-503.395 363.677 l
-503.756 363.752 l
-504.124 363.779 l
-504.122 363.803 l
-f
-504.124 363.779 m
-503.389 363.724 l
-503.449 362.935 l
-503.817 362.963 l
-504.185 362.967 l
-504.184 362.991 l
-f
-504.185 362.967 m
-503.448 362.959 l
-503.456 362.17 l
-503.8 362.174 l
-504.169 362.174 l
-504.194 362.178 l
-f
-504.169 362.174 m
-503.431 362.174 l
-503.431 359.019 l
-503.8 359.019 l
-504.169 359.019 l
-504.169 359.019 l
-f
-504.169 359.019 m
-503.431 359.019 l
-503.431 357.507 l
-503.8 357.507 l
-504.169 357.507 l
-504.169 357.507 l
-f
-504.169 357.507 m
-503.431 357.507 l
-503.431 356.389 l
-503.8 356.389 l
-504.169 356.389 l
-504.169 356.389 l
-f
-504.169 356.389 m
-503.431 356.389 l
-503.431 356.077 l
-503.8 356.077 l
-504.169 356.077 l
-504.169 356.077 l
-f
-504.169 356.077 m
-503.431 356.077 l
-503.431 355.65 l
-503.8 355.65 l
-504.169 355.65 l
-504.169 355.65 l
-f
-504.169 355.65 m
-503.431 355.65 l
-503.431 355.337 l
-503.8 355.337 l
-504.169 355.337 l
-504.169 355.337 l
-f
-504.169 355.337 m
-503.431 355.337 l
-503.431 354.22 l
-503.8 354.22 l
-504.169 354.22 l
-504.169 354.22 l
-f
-504.169 354.22 m
-503.431 354.22 l
-503.431 352.708 l
-503.8 352.708 l
-504.169 352.708 l
-504.169 352.708 l
-f
-504.169 352.708 m
-503.431 352.708 l
-503.431 349.553 l
-503.8 349.553 l
-504.169 349.553 l
-504.169 349.553 l
-f
-504.169 349.553 m
-503.431 349.553 l
-503.431 346.397 l
-503.8 346.397 l
-504.169 346.397 l
-504.169 346.397 l
-f
-504.169 346.397 m
-503.431 346.397 l
-503.431 343.242 l
-503.825 343.242 l
-504.194 343.238 l
-504.169 343.242 l
-f
-504.194 343.238 m
-503.456 343.246 l
-503.448 342.457 l
-503.817 342.453 l
-504.184 342.425 l
-504.185 342.449 l
-f
-504.184 342.425 m
-503.449 342.481 l
-503.389 341.692 l
-503.756 341.664 l
-504.118 341.59 l
-504.122 341.613 l
-f
-504.118 341.59 m
-503.395 341.739 l
-503.231 340.95 l
-503.593 340.876 l
-503.935 340.738 l
-503.947 340.769 l
-f
-503.935 340.738 m
-503.25 341.013 l
-502.931 340.224 l
-503.274 340.087 l
-503.583 339.887 l
-503.602 339.917 l
-f
-503.583 339.887 m
-502.964 340.286 l
-502.455 339.506 l
-502.765 339.306 l
-503.039 339.06 l
-503.058 339.082 l
-f
-503.039 339.06 m
-502.491 339.552 l
-501.827 338.821 l
-502.101 338.575 l
-502.336 338.292 l
-502.357 338.309 l
-f
-502.336 338.292 m
-501.866 338.857 l
-501.099 338.225 l
-501.334 337.942 l
-501.522 337.626 l
-501.547 337.641 l
-f
-501.522 337.626 m
-501.145 338.258 l
-500.326 337.773 l
-500.515 337.457 l
-500.642 337.113 l
-500.674 337.124 l
-f
-500.642 337.113 m
-500.388 337.802 l
-499.558 337.498 l
-499.685 337.153 l
-499.753 336.792 l
-499.783 336.798 l
-f
-499.753 336.792 m
-499.618 337.514 l
-498.775 337.358 l
-498.843 336.997 l
-498.867 336.631 l
-498.889 336.632 l
-f
-498.867 336.631 m
-498.818 337.363 l
-497.95 337.306 l
-497.974 336.94 l
-497.977 336.572 l
-497.998 336.573 l
-f
-497.977 336.572 m
-497.971 337.307 l
-497.063 337.299 l
-497.067 336.9 l
-497.067 336.533 l
-497.07 336.564 l
-f
-497.067 336.533 m
-497.067 337.267 l
-495.136 337.267 l
-495.136 336.9 l
-495.136 336.533 l
-495.136 336.533 l
-f
-495.136 336.533 m
-495.136 337.267 l
-493.205 337.267 l
-493.205 336.9 l
-493.205 336.533 l
-493.205 336.533 l
-f
-493.205 336.533 m
-493.205 337.267 l
-491.429 337.267 l
-491.429 336.9 l
-491.429 336.533 l
-491.429 336.533 l
-f
-491.429 336.533 m
-491.429 337.267 l
-489.756 337.267 l
-489.756 336.9 l
-489.756 336.533 l
-489.756 336.533 l
-f
-489.756 336.533 m
-489.756 337.267 l
-486.446 337.267 l
-486.446 336.9 l
-486.446 336.533 l
-486.446 336.533 l
-f
-486.446 336.533 m
-486.446 337.267 l
-483.136 337.267 l
-483.136 336.9 l
-483.136 336.533 l
-483.136 336.533 l
-f
-483.136 336.533 m
-483.136 337.267 l
-479.825 337.267 l
-479.825 336.9 l
-479.825 336.533 l
-479.825 336.533 l
-f
-479.825 336.533 m
-479.825 337.267 l
-476.515 337.267 l
-476.515 336.9 l
-476.515 336.533 l
-476.515 336.533 l
-f
-476.515 336.533 m
-476.515 337.267 l
-473.205 337.267 l
-473.205 336.9 l
-473.205 336.533 l
-473.205 336.533 l
-f
-473.205 336.533 m
-473.205 337.267 l
-469.894 337.267 l
-469.894 336.931 l
-469.88 336.565 l
-469.894 336.533 l
-f
-469.88 336.565 m
-469.909 337.298 l
-468.254 337.364 l
-468.239 336.997 l
-468.14 336.643 l
-468.181 336.632 l
-f
-468.14 336.643 m
-468.338 337.351 l
-466.683 337.811 l
-466.584 337.457 l
-466.395 337.142 l
-466.438 337.117 l
-f
-466.395 337.142 m
-466.772 337.773 l
-465.953 338.258 l
-465.765 337.942 l
-465.53 337.659 l
-465.552 337.641 l
-f
-465.53 337.659 m
-466 338.225 l
-465.233 338.857 l
-464.998 338.575 l
-464.724 338.329 l
-464.742 338.309 l
-f
-464.724 338.329 m
-465.271 338.821 l
-464.608 339.552 l
-464.334 339.306 l
-464.024 339.106 l
-464.041 339.082 l
-f
-464.024 339.106 m
-464.643 339.506 l
-464.135 340.286 l
-463.825 340.087 l
-463.483 339.95 l
-463.496 339.917 l
-f
-463.483 339.95 m
-464.167 340.224 l
-463.848 341.013 l
-463.506 340.876 l
-463.145 340.801 l
-463.152 340.769 l
-f
-463.145 340.801 m
-463.867 340.95 l
-463.704 341.739 l
-463.342 341.664 l
-462.975 341.636 l
-462.977 341.613 l
-f
-462.975 341.636 m
-463.71 341.692 l
-463.65 342.481 l
-463.282 342.453 l
-462.913 342.449 l
-462.914 342.425 l
-f
-462.913 342.449 m
-463.651 342.457 l
-463.642 343.246 l
-463.3 343.242 l
-462.931 343.242 l
-462.905 343.238 l
-f
-462.931 343.242 m
-463.669 343.242 l
-463.669 346.397 l
-463.3 346.397 l
-462.931 346.397 l
-462.931 346.397 l
-f
-462.931 346.397 m
-463.669 346.397 l
-463.669 349.553 l
-463.3 349.553 l
-462.931 349.553 l
-462.931 349.553 l
-f
-462.931 349.553 m
-463.669 349.553 l
-463.669 352.708 l
-463.3 352.708 l
-462.931 352.708 l
-462.931 352.708 l
-f
-462.931 352.708 m
-463.669 352.708 l
-463.669 355.863 l
-463.3 355.863 l
-462.931 355.863 l
-462.931 355.863 l
-f
-462.931 355.863 m
-463.669 355.863 l
-463.669 359.019 l
-463.3 359.019 l
-462.931 359.019 l
-462.931 359.019 l
-f
-462.931 359.019 m
-463.669 359.019 l
-463.669 362.174 l
-463.274 362.174 l
-462.905 362.178 l
-462.931 362.174 l
-f
-462.905 362.178 m
-463.642 362.17 l
-463.651 362.959 l
-463.282 362.963 l
-462.914 362.991 l
-462.913 362.967 l
-f
-462.914 362.991 m
-463.65 362.935 l
-463.71 363.724 l
-463.342 363.752 l
-462.981 363.826 l
-462.976 363.803 l
-f
-462.981 363.826 m
-463.704 363.677 l
-463.867 364.466 l
-463.506 364.54 l
-463.164 364.678 l
-463.152 364.647 l
-f
-463.164 364.678 m
-463.848 364.403 l
-464.167 365.192 l
-463.825 365.329 l
-463.516 365.529 l
-463.496 365.499 l
-f
-463.516 365.529 m
-464.135 365.13 l
-464.643 365.91 l
-464.334 366.11 l
-464.06 366.356 l
-464.04 366.334 l
-f
-464.06 366.356 m
-464.608 365.864 l
-465.271 366.595 l
-464.998 366.841 l
-464.762 367.124 l
-464.742 367.107 l
-f
-464.762 367.124 m
-465.233 366.558 l
-466 367.191 l
-465.765 367.474 l
-465.576 367.79 l
-465.552 367.775 l
-f
-465.576 367.79 m
-465.953 367.158 l
-466.772 367.643 l
-466.395 368.274 l
-f
-BT
-/R691 6.82548 Tf
-1 0 0 0.995457 467.333 348.784 Tm
-(replication) Tj
-1 0 0 0.995457 473.021 341.612 Tm
-(library) Tj
-ET
-463.162 357.133 40.5735 0.734326 re
-f
-BT
-/R691 6.82544 Tf
-1 0 0 0.995457 475.295 361.985 Tm
-(snfsd) Tj
-ET
-462.708 374.15 m
-463.307 372.808 l
-464.535 373.351 l
-464.236 374.022 l
-464.072 374.738 l
-464.002 374.722 l
-f
-464.072 374.738 m
-464.4 373.306 l
-465.629 373.585 l
-465.465 374.301 l
-465.403 375.033 l
-465.351 375.028 l
-f
-465.403 375.033 m
-465.526 373.569 l
-466.755 373.672 l
-466.693 374.404 l
-466.684 375.138 l
-466.658 375.138 l
-f
-466.684 375.138 m
-466.702 373.669 l
-467.931 373.684 l
-467.922 374.4 l
-467.922 375.134 l
-467.913 375.153 l
-f
-467.922 375.134 m
-467.922 373.666 l
-472.836 373.666 l
-472.836 374.4 l
-472.836 375.134 l
-472.836 375.134 l
-f
-472.836 375.134 m
-472.836 373.666 l
-477.751 373.666 l
-477.751 374.4 l
-477.751 375.134 l
-477.751 375.134 l
-f
-477.751 375.134 m
-477.751 373.666 l
-482.665 373.666 l
-482.665 374.4 l
-482.665 375.134 l
-482.665 375.134 l
-f
-482.665 375.134 m
-482.665 373.666 l
-487.58 373.666 l
-487.58 374.4 l
-487.58 375.134 l
-487.58 375.134 l
-f
-487.58 375.134 m
-487.58 373.666 l
-492.494 373.666 l
-492.494 374.4 l
-492.494 375.134 l
-492.494 375.134 l
-f
-492.494 375.134 m
-492.494 373.666 l
-497.409 373.666 l
-497.409 374.4 l
-497.409 375.134 l
-497.409 375.134 l
-f
-497.409 375.134 m
-497.409 373.666 l
-499.891 373.666 l
-499.891 374.4 l
-499.891 375.134 l
-499.891 375.134 l
-f
-499.891 375.134 m
-499.891 373.666 l
-502.528 373.666 l
-502.528 374.4 l
-502.528 375.134 l
-502.528 375.134 l
-f
-502.528 375.134 m
-502.528 373.666 l
-505.395 373.666 l
-505.395 374.4 l
-505.395 375.134 l
-505.395 375.134 l
-f
-505.395 375.134 m
-505.395 373.666 l
-508.261 373.666 l
-508.261 374.418 l
-508.269 375.153 l
-508.261 375.134 l
-f
-508.269 375.153 m
-508.253 373.684 l
-509.6 373.669 l
-509.608 374.404 l
-509.667 375.136 l
-509.642 375.138 l
-f
-509.667 375.136 m
-509.549 373.672 l
-510.839 373.569 l
-510.898 374.301 l
-511.059 375.018 l
-511.008 375.029 l
-f
-511.059 375.018 m
-510.736 373.584 l
-511.988 373.306 l
-512.149 374.022 l
-512.447 374.694 l
-512.381 374.723 l
-f
-512.447 374.694 m
-511.85 373.351 l
-513.082 372.808 l
-513.381 373.479 l
-513.81 374.076 l
-513.748 374.12 l
-f
-513.81 374.076 m
-512.951 372.882 l
-514.167 372.016 l
-514.596 372.613 l
-515.117 373.133 l
-515.075 373.175 l
-f
-515.117 373.133 m
-514.076 372.093 l
-515.215 370.962 l
-515.735 371.483 l
-516.325 371.923 l
-516.294 371.965 l
-f
-516.325 371.923 m
-515.145 371.042 l
-516.131 369.735 l
-516.721 370.176 l
-517.37 370.524 l
-517.344 370.573 l
-f
-517.37 370.524 m
-516.071 369.828 l
-516.827 368.433 l
-517.476 368.782 l
-518.175 369.014 l
-518.155 369.074 l
-f
-518.175 369.014 m
-516.776 368.549 l
-517.25 367.139 l
-517.949 367.372 l
-518.676 367.497 l
-518.667 367.552 l
-f
-518.676 367.497 m
-517.222 367.248 l
-517.466 365.839 l
-518.193 365.963 l
-518.929 366.009 l
-518.926 366.049 l
-f
-518.929 366.009 m
-517.456 365.917 l
-517.546 364.508 l
-518.282 364.554 l
-519.02 364.561 l
-519.02 364.58 l
-f
-519.02 364.561 m
-517.544 364.547 l
-517.557 363.138 l
-518.3 363.145 l
-519.038 363.145 l
-519.033 363.151 l
-f
-519.038 363.145 m
-517.562 363.145 l
-517.562 357.508 l
-518.3 357.508 l
-519.038 357.508 l
-519.038 357.508 l
-f
-519.038 357.508 m
-517.562 357.508 l
-517.562 356.113 l
-518.3 356.113 l
-519.038 356.113 l
-519.038 356.113 l
-f
-519.038 356.113 m
-517.562 356.113 l
-517.562 353.676 l
-518.3 353.676 l
-519.038 353.676 l
-519.038 353.676 l
-f
-519.038 353.676 m
-517.562 353.676 l
-517.562 352.81 l
-518.3 352.81 l
-519.038 352.81 l
-519.038 352.81 l
-f
-519.038 352.81 m
-517.562 352.81 l
-517.562 352.253 l
-518.3 352.253 l
-519.038 352.253 l
-519.038 352.253 l
-f
-519.038 352.253 m
-517.562 352.253 l
-517.562 351.489 l
-518.3 351.489 l
-519.038 351.489 l
-519.038 351.489 l
-f
-519.038 351.489 m
-517.562 351.489 l
-517.562 350.931 l
-518.3 350.931 l
-519.038 350.931 l
-519.038 350.931 l
-f
-519.038 350.931 m
-517.562 350.931 l
-517.562 350.065 l
-518.3 350.065 l
-519.038 350.065 l
-519.038 350.065 l
-f
-519.038 350.065 m
-517.562 350.065 l
-517.562 347.629 l
-518.3 347.629 l
-519.038 347.629 l
-519.038 347.629 l
-f
-519.038 347.629 m
-517.562 347.629 l
-517.562 346.234 l
-518.3 346.234 l
-519.038 346.234 l
-519.038 346.234 l
-f
-519.038 346.234 m
-517.562 346.234 l
-517.562 340.597 l
-518.3 340.597 l
-519.038 340.597 l
-519.038 340.597 l
-f
-519.038 340.597 m
-517.562 340.597 l
-517.562 334.96 l
-518.3 334.96 l
-519.038 334.96 l
-519.038 334.96 l
-f
-519.038 334.96 m
-517.562 334.96 l
-517.562 329.323 l
-518.295 329.323 l
-519.033 329.317 l
-519.038 329.323 l
-f
-519.033 329.317 m
-517.557 329.33 l
-517.544 327.921 l
-518.282 327.914 l
-519.018 327.868 l
-519.02 327.888 l
-f
-519.018 327.868 m
-517.546 327.96 l
-517.456 326.551 l
-518.193 326.505 l
-518.92 326.381 l
-518.926 326.419 l
-f
-518.92 326.381 m
-517.466 326.629 l
-517.222 325.22 l
-517.949 325.096 l
-518.649 324.863 l
-518.667 324.916 l
-f
-518.649 324.863 m
-517.25 325.329 l
-516.776 323.919 l
-517.476 323.686 l
-518.125 323.338 l
-518.155 323.394 l
-f
-518.125 323.338 m
-516.827 324.035 l
-516.071 322.64 l
-516.721 322.292 l
-517.311 321.851 l
-517.344 321.895 l
-f
-517.311 321.851 m
-516.131 322.733 l
-515.145 321.426 l
-515.735 320.985 l
-516.256 320.465 l
-516.294 320.503 l
-f
-516.256 320.465 m
-515.215 321.505 l
-514.076 320.375 l
-514.596 319.855 l
-515.026 319.258 l
-515.074 319.293 l
-f
-515.026 319.258 m
-514.167 320.452 l
-512.951 319.586 l
-513.381 318.989 l
-513.679 318.318 l
-513.748 318.348 l
-f
-513.679 318.318 m
-513.082 319.66 l
-511.85 319.117 l
-512.149 318.446 l
-512.31 317.729 l
-512.381 317.745 l
-f
-512.31 317.729 m
-511.988 319.162 l
-510.736 318.884 l
-510.898 318.167 l
-510.957 317.435 l
-511.008 317.439 l
-f
-510.957 317.435 m
-510.839 318.899 l
-509.549 318.796 l
-509.608 318.064 l
-509.616 317.33 l
-509.642 317.33 l
-f
-509.616 317.33 m
-509.6 318.799 l
-508.253 318.784 l
-508.261 318 l
-508.261 317.266 l
-508.269 317.315 l
-f
-508.261 317.266 m
-508.261 318.734 l
-505.395 318.734 l
-505.395 318 l
-505.395 317.266 l
-505.395 317.266 l
-f
-505.395 317.266 m
-505.395 318.734 l
-502.528 318.734 l
-502.528 318 l
-502.528 317.266 l
-502.528 317.266 l
-f
-502.528 317.266 m
-502.528 318.734 l
-499.891 318.734 l
-499.891 318 l
-499.891 317.266 l
-499.891 317.266 l
-f
-499.891 317.266 m
-499.891 318.734 l
-497.409 318.734 l
-497.409 318 l
-497.409 317.266 l
-497.409 317.266 l
-f
-497.409 317.266 m
-497.409 318.734 l
-492.494 318.734 l
-492.494 318 l
-492.494 317.266 l
-492.494 317.266 l
-f
-492.494 317.266 m
-492.494 318.734 l
-487.58 318.734 l
-487.58 318 l
-487.58 317.266 l
-487.58 317.266 l
-f
-487.58 317.266 m
-487.58 318.734 l
-482.665 318.734 l
-482.665 318 l
-482.665 317.266 l
-482.665 317.266 l
-f
-482.665 317.266 m
-482.665 318.734 l
-477.751 318.734 l
-477.751 318 l
-477.751 317.266 l
-477.751 317.266 l
-f
-477.751 317.266 m
-477.751 318.734 l
-472.836 318.734 l
-472.836 318 l
-472.836 317.266 l
-472.836 317.266 l
-f
-472.836 317.266 m
-472.836 318.734 l
-467.922 318.734 l
-467.922 318.05 l
-467.913 317.315 l
-467.922 317.266 l
-f
-467.913 317.315 m
-467.931 318.784 l
-466.702 318.799 l
-466.693 318.064 l
-466.631 317.332 l
-466.658 317.33 l
-f
-466.631 317.332 m
-466.755 318.796 l
-465.526 318.899 l
-465.465 318.167 l
-465.301 317.451 l
-465.351 317.44 l
-f
-465.301 317.451 m
-465.629 318.883 l
-464.4 319.162 l
-464.236 318.446 l
-463.937 317.775 l
-464.002 317.746 l
-f
-463.937 317.775 m
-464.535 319.117 l
-463.307 319.66 l
-463.007 318.989 l
-462.578 318.392 l
-462.639 318.348 l
-f
-462.578 318.392 m
-463.437 319.586 l
-462.221 320.452 l
-461.792 319.855 l
-461.271 319.335 l
-461.313 319.293 l
-f
-461.271 319.335 m
-462.312 320.375 l
-461.173 321.505 l
-460.653 320.985 l
-460.063 320.545 l
-460.094 320.502 l
-f
-460.063 320.545 m
-461.242 321.426 l
-460.257 322.733 l
-459.667 322.292 l
-459.018 321.943 l
-459.044 321.895 l
-f
-459.018 321.943 m
-460.316 322.64 l
-459.561 324.035 l
-458.912 323.686 l
-458.212 323.453 l
-458.233 323.394 l
-f
-458.212 323.453 m
-459.612 323.919 l
-459.138 325.329 l
-458.438 325.096 l
-457.711 324.971 l
-457.721 324.916 l
-f
-457.711 324.971 m
-459.166 325.22 l
-458.922 326.629 l
-458.195 326.505 l
-457.459 326.459 l
-457.462 326.419 l
-f
-457.459 326.459 m
-458.932 326.551 l
-458.842 327.96 l
-458.106 327.914 l
-457.368 327.907 l
-457.368 327.888 l
-f
-457.368 327.907 m
-458.843 327.921 l
-458.831 329.33 l
-458.1 329.323 l
-457.362 329.323 l
-457.355 329.317 l
-f
-457.362 329.323 m
-458.838 329.323 l
-458.838 334.96 l
-458.1 334.96 l
-457.362 334.96 l
-457.362 334.96 l
-f
-457.362 334.96 m
-458.838 334.96 l
-458.838 340.597 l
-458.1 340.597 l
-457.362 340.597 l
-457.362 340.597 l
-f
-457.362 340.597 m
-458.838 340.597 l
-458.838 346.234 l
-458.1 346.234 l
-457.362 346.234 l
-457.362 346.234 l
-f
-457.362 346.234 m
-458.838 346.234 l
-458.838 351.871 l
-458.1 351.871 l
-457.362 351.871 l
-457.362 351.871 l
-f
-457.362 351.871 m
-458.838 351.871 l
-458.838 357.508 l
-458.1 357.508 l
-457.362 357.508 l
-457.362 357.508 l
-f
-457.362 357.508 m
-458.838 357.508 l
-458.838 363.145 l
-458.093 363.145 l
-457.355 363.151 l
-457.362 363.145 l
-f
-457.355 363.151 m
-458.831 363.138 l
-458.843 364.547 l
-458.106 364.554 l
-457.369 364.6 l
-457.368 364.58 l
-f
-457.369 364.6 m
-458.842 364.508 l
-458.932 365.917 l
-458.195 365.963 l
-457.468 366.087 l
-457.462 366.049 l
-f
-457.468 366.087 m
-458.922 365.839 l
-459.166 367.248 l
-458.438 367.372 l
-457.739 367.605 l
-457.721 367.552 l
-f
-457.739 367.605 m
-459.138 367.139 l
-459.612 368.549 l
-458.912 368.782 l
-458.263 369.13 l
-458.233 369.074 l
-f
-458.263 369.13 m
-459.561 368.433 l
-460.316 369.828 l
-459.667 370.176 l
-459.077 370.617 l
-459.044 370.573 l
-f
-459.077 370.617 m
-460.257 369.735 l
-461.242 371.042 l
-460.653 371.483 l
-460.132 372.003 l
-460.094 371.965 l
-f
-460.132 372.003 m
-461.173 370.962 l
-462.312 372.093 l
-461.792 372.613 l
-461.362 373.21 l
-461.313 373.175 l
-f
-461.362 373.21 m
-462.221 372.016 l
-463.437 372.882 l
-462.578 374.076 l
-f
-458 330.433 59.9384 0.734326 re
-f
-BT
-/R691 6.84901 Tf
-1 0 0 0.995457 472.399 323.164 Tm
-(kernel VM) Tj
-ET
-0.501961 g
-513.356 329.086 m
-511.08 326.027 l
-508.804 329.086 l
-f*
-513.653 328.867 m
-513.06 329.304 l
-510.784 326.246 l
-511.08 326.027 l
-510.784 325.809 l
-511.08 325.41 l
-f
-510.784 325.809 m
-511.377 326.246 l
-509.101 329.304 l
-508.804 329.1 l
-508.804 329.467 l
-508.061 329.467 l
-f
-508.804 329.467 m
-508.804 328.733 l
-513.356 328.733 l
-513.356 329.086 l
-513.653 328.867 l
-514.099 329.467 l
-f
-510.341 329.393 1.4793 33.7112 re
-f*
-509.931 329.393 m
-510.669 329.393 l
-510.669 363.105 l
-510.341 363.1 l
-510.341 363.467 l
-509.931 363.467 l
-f
-510.341 363.467 m
-510.341 362.733 l
-511.82 362.733 l
-511.8 363.105 l
-512.169 363.105 l
-512.169 363.467 l
-f
-512.169 363.105 m
-511.431 363.105 l
-511.431 329.393 l
-511.82 329.4 l
-511.82 329.033 l
-512.169 329.033 l
-f
-511.82 329.033 m
-511.82 329.767 l
-510.341 329.767 l
-510.3 329.393 l
-509.931 329.393 l
-509.931 329.033 l
-f
-500.547 360.411 m
-497.475 362.676 l
-500.547 364.942 l
-f*
-500.328 360.116 m
-500.767 360.706 l
-497.694 362.971 l
-497.475 362.676 l
-497.255 362.971 l
-496.855 362.676 l
-f
-497.255 362.971 m
-497.694 362.381 l
-500.767 364.647 l
-500.5 364.942 l
-500.869 364.942 l
-500.869 365.636 l
-f
-500.869 364.942 m
-500.131 364.942 l
-500.131 360.411 l
-500.547 360.411 l
-500.328 360.116 l
-500.869 359.717 l
-f
-500.919 361.94 10.83 1.47258 re
-f*
-500.919 363.767 m
-500.919 363.033 l
-511.749 363.033 l
-511.7 363.413 l
-512.069 363.413 l
-512.069 363.767 l
-f
-512.069 363.413 m
-511.331 363.413 l
-511.331 361.94 l
-511.749 361.9 l
-511.749 361.533 l
-512.069 361.533 l
-f
-511.749 361.533 m
-511.749 362.267 l
-500.919 362.267 l
-500.9 361.94 l
-500.531 361.94 l
-500.531 361.533 l
-f
-500.531 361.94 m
-501.269 361.94 l
-501.269 363.413 l
-500.919 363.4 l
-500.919 363.767 l
-500.531 363.767 l
-f
-434.045 385.282 m
-434.166 388.996 l
-437.682 386.118 l
-434.045 385.282 l
-f*
-433.676 385.294 m
-434.413 385.27 l
-434.535 388.984 l
-434.166 388.996 l
-434.4 389.279 l
-433.822 389.753 l
-f
-434.4 389.279 m
-433.932 388.712 l
-437.447 385.834 l
-437.682 386.118 l
-437.765 385.76 l
-438.494 385.928 l
-f
-437.765 385.76 m
-437.599 386.476 l
-433.962 385.64 l
-434.045 385.282 l
-433.676 385.294 l
-433.66 384.817 l
-f
-465.525 426.958 m
-469.234 427.881 l
-469.04 424.08 l
-f*
-465.435 427.314 m
-465.614 426.601 l
-469.323 427.525 l
-469.234 427.881 l
-469.602 427.862 l
-469.627 428.357 l
-f
-469.602 427.862 m
-468.866 427.9 l
-468.672 424.098 l
-469.04 424.08 l
-468.806 423.796 l
-469.372 423.333 l
-f
-468.806 423.796 m
-469.275 424.363 l
-465.759 427.241 l
-465.525 426.958 l
-465.435 427.314 l
-464.725 427.137 l
-f
-467.933 425.147 m
-436.638 387.262 l
-435.496 388.198 l
-466.791 426.082 l
-f*
-468.218 424.914 m
-467.648 425.38 l
-436.353 387.496 l
-436.638 387.262 l
-436.404 386.979 l
-436.689 386.746 l
-f
-436.404 386.979 m
-436.873 387.546 l
-435.73 388.481 l
-435.496 388.198 l
-435.211 388.431 l
-434.977 388.147 l
-f
-435.211 388.431 m
-435.781 387.964 l
-467.075 425.849 l
-466.791 426.082 l
-467.025 426.366 l
-466.74 426.599 l
-f
-467.025 426.366 m
-466.556 425.799 l
-467.699 424.864 l
-467.933 425.147 l
-468.218 424.914 l
-468.452 425.197 l
-f
-468.299 340.127 m
-464.681 341.042 l
-468.259 343.843 l
-468.299 340.127 l
-f*
-468.208 339.772 m
-468.39 340.483 l
-464.772 341.398 l
-464.681 341.042 l
-464.453 341.331 l
-463.864 340.87 l
-f
-464.453 341.331 m
-464.909 340.754 l
-468.487 343.554 l
-468.259 343.843 l
-468.628 343.847 l
-468.62 344.592 l
-f
-468.628 343.847 m
-467.891 343.839 l
-467.93 340.124 l
-468.299 340.127 l
-468.208 339.772 l
-468.673 339.654 l
-f
-434.165 379.679 m
-434.055 383.483 l
-437.744 382.479 l
-f*
-433.797 379.668 m
-434.534 379.689 l
-434.424 383.494 l
-434.055 383.483 l
-434.153 383.838 l
-433.673 383.968 l
-f
-434.153 383.838 m
-433.958 383.129 l
-437.646 382.125 l
-437.744 382.479 l
-437.972 382.191 l
-438.547 382.641 l
-f
-437.972 382.191 m
-437.516 382.768 l
-433.937 379.968 l
-434.165 379.679 l
-433.797 379.668 l
-433.818 378.94 l
-f
-436.459 381.632 m
-466.913 343.074 l
-465.75 342.164 l
-435.296 380.722 l
-f*
-436.749 381.859 m
-436.169 381.405 l
-466.623 342.847 l
-466.913 343.074 l
-467.141 342.786 l
-467.431 343.012 l
-f
-467.141 342.786 m
-466.685 343.363 l
-465.522 342.453 l
-465.75 342.164 l
-465.46 341.937 l
-465.688 341.648 l
-f
-465.46 341.937 m
-466.04 342.391 l
-435.586 380.949 l
-435.296 380.722 l
-435.068 381.011 l
-434.778 380.784 l
-f
-435.068 381.011 m
-435.524 380.433 l
-436.687 381.344 l
-436.459 381.632 l
-436.749 381.859 l
-436.521 382.148 l
-f
-BT
-0 g
-/R694 10 Tf
-1 0 0 1 333.96 294.6 Tm
-(Figure) Tj
-1 0 0 1 362.52 294.6 Tm
-(2:) Tj
-1 0 0 1 373.8 294.6 Tm
-(Replicated) Tj
-1 0 0 1 418.92 294.6 Tm
-(File) Tj
-1 0 0 1 436.92 294.6 Tm
-(System) Tj
-1 0 0 1 468.72 294.6 Tm
-(Architecture.) Tj
-1 0 0 1 324.96 274.8 Tm
-(Each) Tj
-1 0 0 1 351.72 274.8 Tm
-(replica) Tj
-1 0 0 1 385.68 274.8 Tm
-(runs) Tj
-1 0 0 1 409.68 274.8 Tm
-(a) Tj
-1 0 0 1 420.96 274.8 Tm
-(user) Tj
-1 0 0 1 437.4 274.8 Tm
-(-le) Tj
-1 0 0 1 447.72 274.8 Tm
-(v) Tj
-1 0 0 1 452.64 274.8 Tm
-(el) Tj
-1 0 0 1 466.56 274.8 Tm
-(process) Tj
-1 0 0 1 503.279 274.8 Tm
-(with) Tj
-1 0 0 1 527.879 274.8 Tm
-(the) Tj
-1 0 0 1 315 262.92 Tm
-(replication) Tj
-1 0 0 1 361.08 262.92 Tm
-(library) Tj
-1 0 0 1 391.08 262.92 Tm
-(and) Tj
-1 0 0 1 408.84 262.92 Tm
-(our) Tj
-1 0 0 1 425.52 262.92 Tm
-(NFS) Tj
-1 0 0 1 447.24 262.92 Tm
-(V2) Tj
-1 0 0 1 462.84 262.92 Tm
-(daemon,) Tj
-1 0 0 1 500.639 262.92 Tm
-(which) Tj
-1 0 0 1 528.359 262.92 Tm
-(we) Tj
-1 0 0 1 315 250.92 Tm
-(will) Tj
-1 0 0 1 333.72 250.92 Tm
-(refer) Tj
-1 0 0 1 355.8 250.92 Tm
-(to) Tj
-1 0 0 1 366.84 250.92 Tm
-(as) Tj
-/R697 10 Tf
-1 0 0 1 378.48 250.92 Tm
-(snfsd) Tj
-/R694 10 Tf
-1 0 0 1 402.24 250.92 Tm
-(\(for) Tj
-1 0 0 1 420.36 250.92 Tm
-(simple) Tj
-/R697 10 Tf
-1 0 0 1 450.24 250.92 Tm
-(nfsd) Tj
-/R694 10 Tf
-1 0 0 1 466.92 250.92 Tm
-(\).) Tj
-1 0 0 1 478.679 250.92 Tm
-(The) Tj
-1 0 0 1 497.399 250.92 Tm
-(replication) Tj
-1 0 0 1 315 239.04 Tm
-(library) Tj
-1 0 0 1 345.6 239.04 Tm
-(recei) Tj
-1 0 0 1 364.8 239.04 Tm
-(v) Tj
-1 0 0 1 369.72 239.04 Tm
-(es) Tj
-1 0 0 1 381.96 239.04 Tm
-(requests) Tj
-1 0 0 1 418.56 239.04 Tm
-(from) Tj
-1 0 0 1 442.08 239.04 Tm
-(the) Tj
-1 0 0 1 458.279 239.04 Tm
-(relay) Tj
-1 0 0 1 477.719 239.04 Tm
-(,) Tj
-1 0 0 1 484.439 239.04 Tm
-(interacts) Tj
-1 0 0 1 522.239 239.04 Tm
-(with) Tj
-/R697 10 Tf
-1 0 0 1 315 227.04 Tm
-(snfsd) Tj
-/R694 10 Tf
-1 0 0 1 338.28 227.04 Tm
-(by) Tj
-1 0 0 1 351.12 227.04 Tm
-(making) Tj
-1 0 0 1 383.88 227.04 Tm
-(upcalls,) Tj
-1 0 0 1 417.48 227.04 Tm
-(and) Tj
-1 0 0 1 434.64 227.04 Tm
-(packages) Tj
-1 0 0 1 474 227.04 Tm
-(NFS) Tj
-1 0 0 1 495.119 227.04 Tm
-(replies) Tj
-1 0 0 1 524.519 227.04 Tm
-(into) Tj
-1 0 0 1 315 215.16 Tm
-(replication) Tj
-1 0 0 1 360.12 215.16 Tm
-(protocol) Tj
-1 0 0 1 395.76 215.16 Tm
-(replies) Tj
-1 0 0 1 424.8 215.16 Tm
-(that) Tj
-1 0 0 1 442.319 215.16 Tm
-(it) Tj
-1 0 0 1 450.359 215.16 Tm
-(sends) Tj
-1 0 0 1 474.959 215.16 Tm
-(to) Tj
-1 0 0 1 485.159 215.16 Tm
-(the) Tj
-1 0 0 1 499.799 215.16 Tm
-(relay) Tj
-1 0 0 1 519.239 215.16 Tm
-(.) Tj
-1 0 0 1 324.96 202.8 Tm
-(W) Tj
-1 0 0 1 333.48 202.8 Tm
-(e) Tj
-1 0 0 1 342.72 202.8 Tm
-(implemented) Tj
-/R697 10 Tf
-1 0 0 1 399.48 202.8 Tm
-(snfsd) Tj
-/R694 10 Tf
-1 0 0 1 424.68 202.8 Tm
-(using) Tj
-1 0 0 1 450.96 202.8 Tm
-(a) Tj
-1 0 0 1 460.2 202.8 Tm
-(\256x) Tj
-1 0 0 1 470.64 202.8 Tm
-(ed-size) Tj
-1 0 0 1 503.519 202.8 Tm
-(memory-) Tj
-1 0 0 1 315 190.8 Tm
-(mapped) Tj
-1 0 0 1 350.76 190.8 Tm
-(\256le.) Tj
-1 0 0 1 374.52 190.8 Tm
-(All) Tj
-1 0 0 1 391.44 190.8 Tm
-(the) Tj
-1 0 0 1 407.76 190.8 Tm
-(\256le) Tj
-1 0 0 1 424.68 190.8 Tm
-(system) Tj
-1 0 0 1 456.6 190.8 Tm
-(data) Tj
-1 0 0 1 477.359 190.8 Tm
-(structures,) Tj
-1 0 0 1 523.079 190.8 Tm
-(e.g.,) Tj
-1 0 0 1 315 178.92 Tm
-(inodes,) Tj
-1 0 0 1 345.96 178.92 Tm
-(blocks) Tj
-1 0 0 1 374.52 178.92 Tm
-(and) Tj
-1 0 0 1 391.44 178.92 Tm
-(their) Tj
-1 0 0 1 412.2 178.92 Tm
-(free) Tj
-1 0 0 1 430.08 178.92 Tm
-(lists,) Tj
-1 0 0 1 451.199 178.92 Tm
-(are) Tj
-1 0 0 1 465.839 178.92 Tm
-(in) Tj
-1 0 0 1 476.039 178.92 Tm
-(the) Tj
-1 0 0 1 490.799 178.92 Tm
-(mapped) Tj
-1 0 0 1 524.759 178.92 Tm
-(\256le.) Tj
-1 0 0 1 315 166.92 Tm
-(W) Tj
-1 0 0 1 323.52 166.92 Tm
-(e) Tj
-1 0 0 1 330.72 166.92 Tm
-(rely) Tj
-1 0 0 1 348.96 166.92 Tm
-(on) Tj
-1 0 0 1 361.68 166.92 Tm
-(the) Tj
-1 0 0 1 376.56 166.92 Tm
-(operating) Tj
-1 0 0 1 416.88 166.92 Tm
-(system) Tj
-1 0 0 1 447.24 166.92 Tm
-(to) Tj
-1 0 0 1 457.679 166.92 Tm
-(manage) Tj
-1 0 0 1 491.399 166.92 Tm
-(the) Tj
-1 0 0 1 506.279 166.92 Tm
-(cache) Tj
-1 0 0 1 531.719 166.92 Tm
-(of) Tj
-1 0 0 1 315 155.04 Tm
-(memory-mapped) Tj
-1 0 0 1 386.04 155.04 Tm
-(\256le) Tj
-1 0 0 1 401.76 155.04 Tm
-(pages) Tj
-1 0 0 1 427.44 155.04 Tm
-(and) Tj
-1 0 0 1 444.72 155.04 Tm
-(to) Tj
-1 0 0 1 455.52 155.04 Tm
-(write) Tj
-1 0 0 1 478.919 155.04 Tm
-(modi\256ed) Tj
-1 0 0 1 517.319 155.04 Tm
-(pages) Tj
-1 0 0 1 315 143.04 Tm
-(to) Tj
-1 0 0 1 327.6 143.04 Tm
-(disk) Tj
-1 0 0 1 349.08 143.04 Tm
-(asynchronously) Tj
-1 0 0 1 411.48 143.04 Tm
-(.) Tj
-1 0 0 1 424.08 143.04 Tm
-(The) Tj
-1 0 0 1 444.36 143.04 Tm
-(current) Tj
-1 0 0 1 477.48 143.04 Tm
-(implementation) Tj
-1 0 0 1 315 131.16 Tm
-(uses) Tj
-1 0 0 1 337.2 131.16 Tm
-(8KB) Tj
-1 0 0 1 360.96 131.16 Tm
-(blocks) Tj
-1 0 0 1 392.04 131.16 Tm
-(and) Tj
-1 0 0 1 411.48 131.16 Tm
-(inodes) Tj
-1 0 0 1 442.44 131.16 Tm
-(contain) Tj
-1 0 0 1 476.88 131.16 Tm
-(the) Tj
-1 0 0 1 494.039 131.16 Tm
-(NFS) Tj
-1 0 0 1 517.319 131.16 Tm
-(status) Tj
-1 0 0 1 315 119.16 Tm
-(information) Tj
-1 0 0 1 364.2 119.16 Tm
-(plus) Tj
-1 0 0 1 382.92 119.16 Tm
-(256) Tj
-1 0 0 1 400.08 119.16 Tm
-(bytes) Tj
-1 0 0 1 423.24 119.16 Tm
-(of) Tj
-1 0 0 1 433.68 119.16 Tm
-(data,) Tj
-1 0 0 1 455.039 119.16 Tm
-(which) Tj
-1 0 0 1 481.559 119.16 Tm
-(is) Tj
-1 0 0 1 490.319 119.16 Tm
-(used) Tj
-1 0 0 1 510.719 119.16 Tm
-(to) Tj
-1 0 0 1 520.679 119.16 Tm
-(store) Tj
-1 0 0 1 315 107.28 Tm
-(directory) Tj
-1 0 0 1 353.16 107.28 Tm
-(entries) Tj
-1 0 0 1 381.84 107.28 Tm
-(in) Tj
-1 0 0 1 391.8 107.28 Tm
-(directories,) Tj
-1 0 0 1 438.599 107.28 Tm
-(pointers) Tj
-1 0 0 1 472.919 107.28 Tm
-(to) Tj
-1 0 0 1 482.759 107.28 Tm
-(blocks) Tj
-1 0 0 1 510.959 107.28 Tm
-(in) Tj
-1 0 0 1 520.919 107.28 Tm
-(\256les,) Tj
-1 0 0 1 315 95.28 Tm
-(and) Tj
-1 0 0 1 331.56 95.28 Tm
-(te) Tj
-1 0 0 1 338.64 95.28 Tm
-(xt) Tj
-1 0 0 1 348.6 95.28 Tm
-(in) Tj
-1 0 0 1 358.56 95.28 Tm
-(symbolic) Tj
-1 0 0 1 397.32 95.28 Tm
-(links.) Tj
-1 0 0 1 422.64 95.28 Tm
-(Directories) Tj
-1 0 0 1 469.199 95.28 Tm
-(and) Tj
-1 0 0 1 485.759 95.28 Tm
-(\256les) Tj
-1 0 0 1 504.599 95.28 Tm
-(may) Tj
-1 0 0 1 523.919 95.28 Tm
-(also) Tj
-1 0 0 1 315 83.4 Tm
-(use) Tj
-1 0 0 1 330.72 83.4 Tm
-(indirect) Tj
-1 0 0 1 363.72 83.4 Tm
-(blocks) Tj
-1 0 0 1 392.16 83.4 Tm
-(in) Tj
-1 0 0 1 402.48 83.4 Tm
-(a) Tj
-1 0 0 1 409.32 83.4 Tm
-(w) Tj
-1 0 0 1 416.4 83.4 Tm
-(ay) Tj
-1 0 0 1 428.4 83.4 Tm
-(similar) Tj
-1 0 0 1 458.519 83.4 Tm
-(to) Tj
-1 0 0 1 468.719 83.4 Tm
-(Unix.) Tj
-1 0 0 1 324.96 71.04 Tm
-(Our) Tj
-1 0 0 1 345.48 71.04 Tm
-(implementation) Tj
-1 0 0 1 413.04 71.04 Tm
-(ensures) Tj
-1 0 0 1 447.96 71.04 Tm
-(that) Tj
-1 0 0 1 468 71.04 Tm
-(all) Tj
-1 0 0 1 483 71.04 Tm
-(state) Tj
-1 0 0 1 506.279 71.04 Tm
-(machine) Tj
-1 0 0 1 303.48 35.16 Tm
-(9) Tj
-ET
-Q
-endstream
-endobj
-699 0 obj
-115962
-endobj
-700 0 obj
-<<
-/Type /Page
-/MediaBox [0 0 612 792]
-/Parent 2 0 R
-/Resources << /ProcSet [/PDF /ImageB /Text]
-/Font <<
-/R697 697 0 R
-/R694 694 0 R
-/R691 691 0 R
->>
->>
-/Contents [
-692 0 R
-695 0 R
-698 0 R
-]
->>
-endobj
-701 0 obj
-<< /Type /Font /Name /R701 /Subtype /Type1 /BaseFont /Times-Roman >>
-endobj
-702 0 obj
-<< /Length 703 0 R >>
-stream
-q
-BT
-/R701 10 Tf
-1 0 0 1 72 709.08 Tm
-(replicas) Tj
-1 0 0 1 104.64 709.08 Tm
-(start) Tj
-1 0 0 1 123.36 709.08 Tm
-(in) Tj
-1 0 0 1 132.72 709.08 Tm
-(the) Tj
-1 0 0 1 146.52 709.08 Tm
-(same) Tj
-1 0 0 1 168.6 709.08 Tm
-(initial) Tj
-1 0 0 1 193.439 709.08 Tm
-(state) Tj
-1 0 0 1 213.239 709.08 Tm
-(and) Tj
-1 0 0 1 229.319 709.08 Tm
-(are) Tj
-1 0 0 1 243.119 709.08 Tm
-(determ) Tj
-1 0 0 1 270.839 709.08 Tm
-(inistic,) Tj
-1 0 0 1 72 697.08 Tm
-(which) Tj
-1 0 0 1 99.7199 697.08 Tm
-(are) Tj
-1 0 0 1 115.2 697.08 Tm
-(necessary) Tj
-1 0 0 1 157.32 697.08 Tm
-(conditions) Tj
-1 0 0 1 202.2 697.08 Tm
-(for) Tj
-1 0 0 1 217.2 697.08 Tm
-(the) Tj
-1 0 0 1 232.68 697.08 Tm
-(correctness) Tj
-1 0 0 1 280.919 697.08 Tm
-(of) Tj
-1 0 0 1 292.559 697.08 Tm
-(a) Tj
-1 0 0 1 72 685.2 Tm
-(service) Tj
-1 0 0 1 104.04 685.2 Tm
-(implemented) Tj
-1 0 0 1 159.96 685.2 Tm
-(using) Tj
-1 0 0 1 185.52 685.2 Tm
-(our) Tj
-1 0 0 1 202.68 685.2 Tm
-(protocol.) Tj
-1 0 0 1 246.12 685.2 Tm
-(The) Tj
-1 0 0 1 265.439 685.2 Tm
-(primary) Tj
-1 0 0 1 72 673.2 Tm
-(proposes) Tj
-1 0 0 1 112.68 673.2 Tm
-(the) Tj
-1 0 0 1 130.08 673.2 Tm
-(v) Tj
-1 0 0 1 134.88 673.2 Tm
-(alues) Tj
-1 0 0 1 160.56 673.2 Tm
-(for) Tj
-1 0 0 1 177.48 673.2 Tm
-(time-last-modi\256ed) Tj
-1 0 0 1 256.319 673.2 Tm
-(and) Tj
-1 0 0 1 275.999 673.2 Tm
-(time-) Tj
-1 0 0 1 72 661.32 Tm
-(last-accessed,) Tj
-1 0 0 1 134.04 661.32 Tm
-(and) Tj
-1 0 0 1 154.92 661.32 Tm
-(replicas) Tj
-1 0 0 1 192.48 661.32 Tm
-(select) Tj
-1 0 0 1 221.64 661.32 Tm
-(the) Tj
-1 0 0 1 240.359 661.32 Tm
-(lar) Tj
-1 0 0 1 250.799 661.32 Tm
-(ger) Tj
-1 0 0 1 269.999 661.32 Tm
-(of) Tj
-1 0 0 1 284.879 661.32 Tm
-(the) Tj
-1 0 0 1 72 649.32 Tm
-(proposed) Tj
-1 0 0 1 111 649.32 Tm
-(v) Tj
-1 0 0 1 115.8 649.32 Tm
-(alue) Tj
-1 0 0 1 134.88 649.32 Tm
-(and) Tj
-1 0 0 1 151.8 649.32 Tm
-(one) Tj
-1 0 0 1 168.72 649.32 Tm
-(greater) Tj
-1 0 0 1 198.96 649.32 Tm
-(than) Tj
-1 0 0 1 218.639 649.32 Tm
-(the) Tj
-1 0 0 1 233.279 649.32 Tm
-(maximum) Tj
-1 0 0 1 276.239 649.32 Tm
-(of) Tj
-1 0 0 1 287.039 649.32 Tm
-(all) Tj
-1 0 0 1 72 637.44 Tm
-(v) Tj
-1 0 0 1 76.8 637.44 Tm
-(alues) Tj
-1 0 0 1 100.8 637.44 Tm
-(selected) Tj
-1 0 0 1 136.44 637.44 Tm
-(for) Tj
-1 0 0 1 151.56 637.44 Tm
-(earlier) Tj
-1 0 0 1 180.48 637.44 Tm
-(requests.) Tj
-1 0 0 1 222.479 637.44 Tm
-(W) Tj
-1 0 0 1 230.999 637.44 Tm
-(e) Tj
-1 0 0 1 239.039 637.44 Tm
-(do) Tj
-1 0 0 1 252.479 637.44 Tm
-(not) Tj
-1 0 0 1 268.799 637.44 Tm
-(require) Tj
-1 0 0 1 72 625.44 Tm
-(synchronous) Tj
-1 0 0 1 128.4 625.44 Tm
-(writes) Tj
-1 0 0 1 158.76 625.44 Tm
-(to) Tj
-1 0 0 1 172.56 625.44 Tm
-(implement) Tj
-1 0 0 1 221.28 625.44 Tm
-(NFS) Tj
-1 0 0 1 245.52 625.44 Tm
-(V2) Tj
-1 0 0 1 263.759 625.44 Tm
-(protocol) Tj
-1 0 0 1 72 613.44 Tm
-(semantics) Tj
-1 0 0 1 115.8 613.44 Tm
-(because) Tj
-1 0 0 1 151.68 613.44 Tm
-(BFS) Tj
-1 0 0 1 173.88 613.44 Tm
-(achie) Tj
-1 0 0 1 194.76 613.44 Tm
-(v) Tj
-1 0 0 1 199.68 613.44 Tm
-(es) Tj
-1 0 0 1 212.28 613.44 Tm
-(stability) Tj
-1 0 0 1 248.88 613.44 Tm
-(of) Tj
-1 0 0 1 261.599 613.44 Tm
-(modi\256ed) Tj
-1 0 0 1 72 601.56 Tm
-(data) Tj
-1 0 0 1 91.0799 601.56 Tm
-(and) Tj
-1 0 0 1 108 601.56 Tm
-(meta-data) Tj
-1 0 0 1 149.76 601.56 Tm
-(through) Tj
-1 0 0 1 183.24 601.56 Tm
-(replication) Tj
-1 0 0 1 228.359 601.56 Tm
-([20) Tj
-1 0 0 1 241.559 601.56 Tm
-(].) Tj
-ET
-endstream
-endobj
-703 0 obj
-3195
-endobj
-704 0 obj
-<< /Type /Font /Name /R704 /Subtype /Type1 /BaseFont /Times-Bold >>
-endobj
-705 0 obj
-<< /Length 706 0 R >>
-stream
-BT
-/R704 10 Tf
-1 0 0 1 72 577.8 Tm
-(6.3) Tj
-1 0 0 1 94.4399 577.8 Tm
-(Maintaining) Tj
-1 0 0 1 149.52 577.8 Tm
-(Checkpoints) Tj
-/R701 10 Tf
-1 0 0 1 72 562.68 Tm
-(This) Tj
-1 0 0 1 92.7599 562.68 Tm
-(section) Tj
-1 0 0 1 124.08 562.68 Tm
-(describes) Tj
-1 0 0 1 164.16 562.68 Tm
-(ho) Tj
-1 0 0 1 174 562.68 Tm
-(w) Tj
-ET
-endstream
-endobj
-706 0 obj
-314
-endobj
-707 0 obj
-<< /Type /Font /Name /R707 /Subtype /Type1 /BaseFont /Times-Italic >>
-endobj
-708 0 obj
-<< /Length 709 0 R >>
-stream
-BT
-/R707 10 Tf
-1 0 0 1 184.08 562.68 Tm
-(snfsd) Tj
-/R701 10 Tf
-1 0 0 1 207.6 562.68 Tm
-(maintains) Tj
-1 0 0 1 249.359 562.68 Tm
-(checkpoints) Tj
-1 0 0 1 72 550.8 Tm
-(of) Tj
-1 0 0 1 82.2 550.8 Tm
-(the) Tj
-1 0 0 1 96.3599 550.8 Tm
-(\256le) Tj
-1 0 0 1 111 550.8 Tm
-(system) Tj
-1 0 0 1 140.64 550.8 Tm
-(state.) Tj
-1 0 0 1 164.76 550.8 Tm
-(Recall) Tj
-1 0 0 1 192.12 550.8 Tm
-(that) Tj
-1 0 0 1 209.04 550.8 Tm
-(each) Tj
-1 0 0 1 229.199 550.8 Tm
-(replica) Tj
-1 0 0 1 258.239 550.8 Tm
-(maintains) Tj
-1 0 0 1 72 538.8 Tm
-(se) Tj
-1 0 0 1 80.04 538.8 Tm
-(v) Tj
-1 0 0 1 84.96 538.8 Tm
-(eral) Tj
-1 0 0 1 102 538.8 Tm
-(logical) Tj
-1 0 0 1 131.28 538.8 Tm
-(copies) Tj
-1 0 0 1 158.88 538.8 Tm
-(of) Tj
-1 0 0 1 169.44 538.8 Tm
-(the) Tj
-1 0 0 1 183.72 538.8 Tm
-(state:) Tj
-1 0 0 1 208.199 538.8 Tm
-(the) Tj
-1 0 0 1 222.599 538.8 Tm
-(current) Tj
-1 0 0 1 252.959 538.8 Tm
-(state,) Tj
-1 0 0 1 275.999 538.8 Tm
-(some) Tj
-1 0 0 1 72 526.92 Tm
-(number) Tj
-1 0 0 1 104.52 526.92 Tm
-(of) Tj
-1 0 0 1 114.84 526.92 Tm
-(checkpoints) Tj
-1 0 0 1 164.4 526.92 Tm
-(that) Tj
-1 0 0 1 181.44 526.92 Tm
-(are) Tj
-1 0 0 1 195.6 526.92 Tm
-(not) Tj
-1 0 0 1 210.48 526.92 Tm
-(yet) Tj
-1 0 0 1 224.64 526.92 Tm
-(stable,) Tj
-1 0 0 1 252.479 526.92 Tm
-(and) Tj
-1 0 0 1 268.919 526.92 Tm
-(the) Tj
-1 0 0 1 283.199 526.92 Tm
-(last) Tj
-1 0 0 1 72 514.92 Tm
-(stable) Tj
-1 0 0 1 97.6799 514.92 Tm
-(checkpoint.) Tj
-/R707 10 Tf
-1 0 0 1 81.96 502.44 Tm
-(snfsd) Tj
-/R701 10 Tf
-1 0 0 1 106.44 502.44 Tm
-(e) Tj
-1 0 0 1 110.76 502.44 Tm
-(x) Tj
-1 0 0 1 115.68 502.44 Tm
-(ecutes) Tj
-1 0 0 1 144.48 502.44 Tm
-(\256le) Tj
-1 0 0 1 161.28 502.44 Tm
-(system) Tj
-1 0 0 1 192.96 502.44 Tm
-(operations) Tj
-1 0 0 1 238.559 502.44 Tm
-(directly) Tj
-1 0 0 1 272.999 502.44 Tm
-(in) Tj
-1 0 0 1 284.879 502.44 Tm
-(the) Tj
-1 0 0 1 72 490.56 Tm
-(memory) Tj
-1 0 0 1 107.16 490.56 Tm
-(mapped) Tj
-1 0 0 1 140.64 490.56 Tm
-(\256le) Tj
-1 0 0 1 155.04 490.56 Tm
-(to) Tj
-1 0 0 1 164.4 490.56 Tm
-(pre) Tj
-1 0 0 1 177.12 490.56 Tm
-(serv) Tj
-1 0 0 1 193.56 490.56 Tm
-(e) Tj
-1 0 0 1 199.68 490.56 Tm
-(lo) Tj
-1 0 0 1 207.36 490.56 Tm
-(cality) Tj
-1 0 0 1 228.839 490.56 Tm
-(,) Tj
-1 0 0 1 232.439 490.56 Tm
-(and) Tj
-1 0 0 1 248.639 490.56 Tm
-(it) Tj
-1 0 0 1 255.839 490.56 Tm
-(uses) Tj
-1 0 0 1 274.679 490.56 Tm
-(cop) Tj
-1 0 0 1 289.079 490.56 Tm
-(y-) Tj
-1 0 0 1 72 478.56 Tm
-(on-write) Tj
-1 0 0 1 107.4 478.56 Tm
-(to) Tj
-1 0 0 1 116.88 478.56 Tm
-(reduce) Tj
-1 0 0 1 145.08 478.56 Tm
-(the) Tj
-1 0 0 1 158.88 478.56 Tm
-(space) Tj
-1 0 0 1 182.76 478.56 Tm
-(and) Tj
-1 0 0 1 198.72 478.56 Tm
-(time) Tj
-1 0 0 1 218.159 478.56 Tm
-(o) Tj
-1 0 0 1 223.079 478.56 Tm
-(v) Tj
-1 0 0 1 227.999 478.56 Tm
-(erhead) Tj
-1 0 0 1 256.079 478.56 Tm
-(associated) Tj
-1 0 0 1 72 466.68 Tm
-(with) Tj
-1 0 0 1 93.1199 466.68 Tm
-(maintaining) Tj
-1 0 0 1 144.12 466.68 Tm
-(checkpoints.) Tj
-/R707 10 Tf
-1 0 0 1 200.52 466.68 Tm
-(snfsd) Tj
-/R701 10 Tf
-1 0 0 1 224.4 466.68 Tm
-(maintains) Tj
-1 0 0 1 266.639 466.68 Tm
-(a) Tj
-1 0 0 1 274.439 466.68 Tm
-(cop) Tj
-1 0 0 1 288.839 466.68 Tm
-(y-) Tj
-1 0 0 1 72 454.68 Tm
-(on-write) Tj
-1 0 0 1 110.4 454.68 Tm
-(bit) Tj
-1 0 0 1 125.4 454.68 Tm
-(for) Tj
-1 0 0 1 141.6 454.68 Tm
-(e) Tj
-1 0 0 1 145.8 454.68 Tm
-(v) Tj
-1 0 0 1 150.72 454.68 Tm
-(ery) Tj
-1 0 0 1 168 454.68 Tm
-(512-byte) Tj
-1 0 0 1 207.96 454.68 Tm
-(block) Tj
-1 0 0 1 234.72 454.68 Tm
-(in) Tj
-1 0 0 1 247.079 454.68 Tm
-(the) Tj
-1 0 0 1 263.759 454.68 Tm
-(memory) Tj
-1 0 0 1 72 442.8 Tm
-(mapped) Tj
-1 0 0 1 108.24 442.8 Tm
-(\256le.) Tj
-1 0 0 1 133.68 442.8 Tm
-(When) Tj
-1 0 0 1 162.12 442.8 Tm
-(the) Tj
-1 0 0 1 179.04 442.8 Tm
-(replication) Tj
-1 0 0 1 226.32 442.8 Tm
-(code) Tj
-1 0 0 1 249.84 442.8 Tm
-(in) Tj
-1 0 0 1 257.279 442.8 Tm
-(v) Tj
-1 0 0 1 262.079 442.8 Tm
-(ok) Tj
-1 0 0 1 272.039 442.8 Tm
-(es) Tj
-1 0 0 1 284.879 442.8 Tm
-(the) Tj
-/R707 10 Tf
-1 0 0 1 72 430.8 Tm
-(mak) Tj
-1 0 0 1 88.56 430.8 Tm
-(e) Tj
-ET
-Q
-q
-W
-0 0 612 792 re
-n
-q
-3 0 0 -0.48 93.588 431.292 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-/R707 10 Tf
-1 0 0 1 96.4799 430.8 Tm
-(c) Tj
-1 0 0 1 100.8 430.8 Tm
-(hec) Tj
-1 0 0 1 114.48 430.8 Tm
-(kpoint) Tj
-/R701 10 Tf
-1 0 0 1 142.08 430.8 Tm
-(upcall,) Tj
-/R707 10 Tf
-1 0 0 1 171.84 430.8 Tm
-(snfsd) Tj
-/R701 10 Tf
-1 0 0 1 195.12 430.8 Tm
-(sets) Tj
-1 0 0 1 212.88 430.8 Tm
-(all) Tj
-1 0 0 1 225.719 430.8 Tm
-(the) Tj
-1 0 0 1 240.719 430.8 Tm
-(cop) Tj
-1 0 0 1 255.119 430.8 Tm
-(y-on-write) Tj
-1 0 0 1 72 418.92 Tm
-(bits) Tj
-1 0 0 1 88.4399 418.92 Tm
-(and) Tj
-1 0 0 1 104.76 418.92 Tm
-(creates) Tj
-1 0 0 1 134.4 418.92 Tm
-(a) Tj
-1 0 0 1 140.88 418.92 Tm
-(\(v) Tj
-1 0 0 1 149.04 418.92 Tm
-(olatile\)) Tj
-1 0 0 1 179.16 418.92 Tm
-(checkpoint) Tj
-1 0 0 1 224.88 418.92 Tm
-(record,) Tj
-1 0 0 1 254.879 418.92 Tm
-(containing) Tj
-1 0 0 1 72 406.92 Tm
-(the) Tj
-1 0 0 1 88.5599 406.92 Tm
-(current) Tj
-1 0 0 1 121.2 406.92 Tm
-(sequence) Tj
-1 0 0 1 162.12 406.92 Tm
-(number) Tj
-1 0 0 1 192.48 406.92 Tm
-(,) Tj
-1 0 0 1 199.56 406.92 Tm
-(which) Tj
-1 0 0 1 228.24 406.92 Tm
-(it) Tj
-1 0 0 1 238.2 406.92 Tm
-(recei) Tj
-1 0 0 1 257.399 406.92 Tm
-(v) Tj
-1 0 0 1 262.319 406.92 Tm
-(es) Tj
-1 0 0 1 274.919 406.92 Tm
-(as) Tj
-1 0 0 1 287.639 406.92 Tm
-(an) Tj
-1 0 0 1 72 395.04 Tm
-(ar) Tj
-1 0 0 1 79.68 395.04 Tm
-(gument) Tj
-1 0 0 1 113.28 395.04 Tm
-(to) Tj
-1 0 0 1 124.92 395.04 Tm
-(the) Tj
-1 0 0 1 141 395.04 Tm
-(upcall,) Tj
-1 0 0 1 172.08 395.04 Tm
-(and) Tj
-1 0 0 1 190.32 395.04 Tm
-(a) Tj
-1 0 0 1 198.72 395.04 Tm
-(list) Tj
-1 0 0 1 214.8 395.04 Tm
-(of) Tj
-1 0 0 1 226.92 395.04 Tm
-(blocks.) Tj
-1 0 0 1 263.159 395.04 Tm
-(This) Tj
-1 0 0 1 284.759 395.04 Tm
-(list) Tj
-1 0 0 1 72 383.04 Tm
-(contains) Tj
-1 0 0 1 109.92 383.04 Tm
-(the) Tj
-1 0 0 1 126.84 383.04 Tm
-(copies) Tj
-1 0 0 1 157.08 383.04 Tm
-(of) Tj
-1 0 0 1 170.16 383.04 Tm
-(the) Tj
-1 0 0 1 187.08 383.04 Tm
-(blocks) Tj
-1 0 0 1 217.799 383.04 Tm
-(that) Tj
-1 0 0 1 237.479 383.04 Tm
-(were) Tj
-1 0 0 1 261.599 383.04 Tm
-(modi\256ed) Tj
-1 0 0 1 72 371.16 Tm
-(since) Tj
-1 0 0 1 97.7999 371.16 Tm
-(the) Tj
-1 0 0 1 115.32 371.16 Tm
-(checkpoint) Tj
-1 0 0 1 164.4 371.16 Tm
-(w) Tj
-1 0 0 1 171.48 371.16 Tm
-(as) Tj
-1 0 0 1 185.16 371.16 Tm
-(tak) Tj
-1 0 0 1 197.28 371.16 Tm
-(en,) Tj
-1 0 0 1 215.16 371.16 Tm
-(and) Tj
-1 0 0 1 234.959 371.16 Tm
-(therefore,) Tj
-1 0 0 1 279.479 371.16 Tm
-(it) Tj
-1 0 0 1 290.399 371.16 Tm
-(is) Tj
-1 0 0 1 72 359.16 Tm
-(initially) Tj
-1 0 0 1 106.68 359.16 Tm
-(empty) Tj
-1 0 0 1 131.16 359.16 Tm
-(.) Tj
-1 0 0 1 140.52 359.16 Tm
-(The) Tj
-1 0 0 1 159.72 359.16 Tm
-(record) Tj
-1 0 0 1 188.76 359.16 Tm
-(also) Tj
-1 0 0 1 208.56 359.16 Tm
-(contains) Tj
-1 0 0 1 245.399 359.16 Tm
-(the) Tj
-1 0 0 1 261.239 359.16 Tm
-(digest) Tj
-1 0 0 1 288.719 359.16 Tm
-(of) Tj
-1 0 0 1 72 347.16 Tm
-(the) Tj
-1 0 0 1 86.8799 347.16 Tm
-(current) Tj
-1 0 0 1 117.72 347.16 Tm
-(state;) Tj
-1 0 0 1 141.6 347.16 Tm
-(we) Tj
-1 0 0 1 155.88 347.16 Tm
-(discuss) Tj
-1 0 0 1 187.44 347.16 Tm
-(ho) Tj
-1 0 0 1 197.28 347.16 Tm
-(w) Tj
-1 0 0 1 207 347.16 Tm
-(the) Tj
-1 0 0 1 221.879 347.16 Tm
-(digest) Tj
-1 0 0 1 248.399 347.16 Tm
-(is) Tj
-1 0 0 1 257.759 347.16 Tm
-(computed) Tj
-1 0 0 1 72 335.28 Tm
-(in) Tj
-1 0 0 1 82.2 335.28 Tm
-(Section) Tj
-1 0 0 1 114.6 335.28 Tm
-(6.4.) Tj
-1 0 0 1 81.96 322.8 Tm
-(When) Tj
-1 0 0 1 108.48 322.8 Tm
-(a) Tj
-1 0 0 1 115.68 322.8 Tm
-(block) Tj
-1 0 0 1 140.52 322.8 Tm
-(of) Tj
-1 0 0 1 151.56 322.8 Tm
-(the) Tj
-1 0 0 1 166.44 322.8 Tm
-(memory) Tj
-1 0 0 1 202.44 322.8 Tm
-(mapped) Tj
-1 0 0 1 236.76 322.8 Tm
-(\256le) Tj
-1 0 0 1 252.24 322.8 Tm
-(is) Tj
-1 0 0 1 261.599 322.8 Tm
-(modi\256ed) Tj
-1 0 0 1 72 310.92 Tm
-(while) Tj
-1 0 0 1 97.1999 310.92 Tm
-(e) Tj
-1 0 0 1 101.52 310.92 Tm
-(x) Tj
-1 0 0 1 106.44 310.92 Tm
-(ecuting) Tj
-1 0 0 1 138.6 310.92 Tm
-(a) Tj
-1 0 0 1 146.04 310.92 Tm
-(client) Tj
-1 0 0 1 171.24 310.92 Tm
-(request,) Tj
-/R707 10 Tf
-1 0 0 1 205.559 310.92 Tm
-(snfsd) Tj
-/R701 10 Tf
-1 0 0 1 229.079 310.92 Tm
-(checks) Tj
-1 0 0 1 259.199 310.92 Tm
-(the) Tj
-1 0 0 1 274.439 310.92 Tm
-(cop) Tj
-1 0 0 1 288.839 310.92 Tm
-(y-) Tj
-1 0 0 1 72 298.92 Tm
-(on-write) Tj
-1 0 0 1 107.52 298.92 Tm
-(bit) Tj
-1 0 0 1 119.88 298.92 Tm
-(for) Tj
-1 0 0 1 133.32 298.92 Tm
-(the) Tj
-1 0 0 1 147.24 298.92 Tm
-(block) Tj
-1 0 0 1 171.24 298.92 Tm
-(and,) Tj
-1 0 0 1 190.08 298.92 Tm
-(if) Tj
-1 0 0 1 197.879 298.92 Tm
-(it) Tj
-1 0 0 1 205.199 298.92 Tm
-(is) Tj
-1 0 0 1 213.719 298.92 Tm
-(set,) Tj
-1 0 0 1 229.199 298.92 Tm
-(stores) Tj
-1 0 0 1 254.279 298.92 Tm
-(the) Tj
-1 0 0 1 268.199 298.92 Tm
-(block') Tj
-1 0 0 1 293.279 298.92 Tm
-(s) Tj
-1 0 0 1 72 287.04 Tm
-(current) Tj
-1 0 0 1 102 287.04 Tm
-(contents) Tj
-1 0 0 1 137.04 287.04 Tm
-(and) Tj
-1 0 0 1 153.36 287.04 Tm
-(its) Tj
-1 0 0 1 164.52 287.04 Tm
-(identi\256er) Tj
-1 0 0 1 202.439 287.04 Tm
-(in) Tj
-1 0 0 1 212.039 287.04 Tm
-(the) Tj
-1 0 0 1 225.959 287.04 Tm
-(checkpoint) Tj
-1 0 0 1 271.559 287.04 Tm
-(record) Tj
-1 0 0 1 72 275.04 Tm
-(for) Tj
-1 0 0 1 87.5999 275.04 Tm
-(the) Tj
-1 0 0 1 103.8 275.04 Tm
-(last) Tj
-1 0 0 1 121.68 275.04 Tm
-(checkpoint.) Tj
-1 0 0 1 176.04 275.04 Tm
-(Then,) Tj
-1 0 0 1 203.4 275.04 Tm
-(it) Tj
-1 0 0 1 212.879 275.04 Tm
-(o) Tj
-1 0 0 1 217.799 275.04 Tm
-(v) Tj
-1 0 0 1 222.719 275.04 Tm
-(erwrites) Tj
-1 0 0 1 258.719 275.04 Tm
-(the) Tj
-1 0 0 1 274.919 275.04 Tm
-(block) Tj
-1 0 0 1 72 263.16 Tm
-(with) Tj
-1 0 0 1 95.2799 263.16 Tm
-(its) Tj
-1 0 0 1 110.16 263.16 Tm
-(ne) Tj
-1 0 0 1 119.4 263.16 Tm
-(w) Tj
-1 0 0 1 132.12 263.16 Tm
-(v) Tj
-1 0 0 1 136.92 263.16 Tm
-(alue) Tj
-1 0 0 1 159 263.16 Tm
-(and) Tj
-1 0 0 1 178.92 263.16 Tm
-(resets) Tj
-1 0 0 1 207.12 263.16 Tm
-(its) Tj
-1 0 0 1 222.12 263.16 Tm
-(cop) Tj
-1 0 0 1 236.519 263.16 Tm
-(y-on-write) Tj
-1 0 0 1 284.039 263.16 Tm
-(bit.) Tj
-/R707 10 Tf
-1 0 0 1 72 251.16 Tm
-(snfsd) Tj
-/R701 10 Tf
-1 0 0 1 96.7199 251.16 Tm
-(retains) Tj
-1 0 0 1 127.56 251.16 Tm
-(a) Tj
-1 0 0 1 136.2 251.16 Tm
-(checkpoint) Tj
-1 0 0 1 184.2 251.16 Tm
-(record) Tj
-1 0 0 1 213.959 251.16 Tm
-(until) Tj
-1 0 0 1 236.399 251.16 Tm
-(told) Tj
-1 0 0 1 256.199 251.16 Tm
-(to) Tj
-1 0 0 1 268.199 251.16 Tm
-(discard) Tj
-1 0 0 1 72 239.28 Tm
-(it) Tj
-1 0 0 1 81 239.28 Tm
-(via) Tj
-1 0 0 1 96.5999 239.28 Tm
-(a) Tj
-/R707 10 Tf
-1 0 0 1 104.4 239.28 Tm
-(delete) Tj
-ET
-q
-3 0 0 -0.48 128.868 239.772 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 131.76 239.28 Tm
-(c) Tj
-1 0 0 1 136.08 239.28 Tm
-(hec) Tj
-1 0 0 1 149.76 239.28 Tm
-(kpoint) Tj
-/R701 10 Tf
-1 0 0 1 178.08 239.28 Tm
-(upcall,) Tj
-1 0 0 1 208.56 239.28 Tm
-(which) Tj
-1 0 0 1 236.399 239.28 Tm
-(is) Tj
-1 0 0 1 246.359 239.28 Tm
-(made) Tj
-1 0 0 1 271.439 239.28 Tm
-(by) Tj
-1 0 0 1 284.879 239.28 Tm
-(the) Tj
-1 0 0 1 72 227.28 Tm
-(replication) Tj
-1 0 0 1 116.88 227.28 Tm
-(code) Tj
-1 0 0 1 137.88 227.28 Tm
-(when) Tj
-1 0 0 1 161.64 227.28 Tm
-(a) Tj
-1 0 0 1 168.36 227.28 Tm
-(later) Tj
-1 0 0 1 188.28 227.28 Tm
-(checkpoint) Tj
-1 0 0 1 234.24 227.28 Tm
-(becomes) Tj
-1 0 0 1 271.319 227.28 Tm
-(stable.) Tj
-1 0 0 1 81.96 214.8 Tm
-(If) Tj
-1 0 0 1 92.1599 214.8 Tm
-(the) Tj
-1 0 0 1 107.88 214.8 Tm
-(replication) Tj
-1 0 0 1 154.08 214.8 Tm
-(code) Tj
-1 0 0 1 176.52 214.8 Tm
-(requires) Tj
-1 0 0 1 212.16 214.8 Tm
-(a) Tj
-1 0 0 1 220.08 214.8 Tm
-(checkpoint) Tj
-1 0 0 1 267.359 214.8 Tm
-(to) Tj
-1 0 0 1 278.759 214.8 Tm
-(send) Tj
-1 0 0 1 72 202.92 Tm
-(to) Tj
-1 0 0 1 82.8 202.92 Tm
-(another) Tj
-1 0 0 1 115.68 202.92 Tm
-(replica,) Tj
-1 0 0 1 148.32 202.92 Tm
-(it) Tj
-1 0 0 1 156.84 202.92 Tm
-(calls) Tj
-1 0 0 1 178.08 202.92 Tm
-(the) Tj
-/R707 10 Tf
-1 0 0 1 193.32 202.92 Tm
-(g) Tj
-1 0 0 1 198.239 202.92 Tm
-(et) Tj
-ET
-q
-3 0 0 -0.48 206.028 203.412 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 208.919 202.92 Tm
-(c) Tj
-1 0 0 1 213.239 202.92 Tm
-(hec) Tj
-1 0 0 1 226.919 202.92 Tm
-(kpoint) Tj
-/R701 10 Tf
-1 0 0 1 254.759 202.92 Tm
-(upcall.) Tj
-1 0 0 1 286.679 202.92 Tm
-(T) Tj
-1 0 0 1 291.959 202.92 Tm
-(o) Tj
-1 0 0 1 72 190.92 Tm
-(obtain) Tj
-1 0 0 1 100.08 190.92 Tm
-(the) Tj
-1 0 0 1 115.56 190.92 Tm
-(v) Tj
-1 0 0 1 120.36 190.92 Tm
-(alue) Tj
-1 0 0 1 140.04 190.92 Tm
-(for) Tj
-1 0 0 1 154.92 190.92 Tm
-(a) Tj
-1 0 0 1 162.6 190.92 Tm
-(block,) Tj
-/R707 10 Tf
-1 0 0 1 190.56 190.92 Tm
-(snfsd) Tj
-/R701 10 Tf
-1 0 0 1 214.319 190.92 Tm
-(\256rst) Tj
-1 0 0 1 233.039 190.92 Tm
-(searches) Tj
-1 0 0 1 269.999 190.92 Tm
-(for) Tj
-1 0 0 1 284.879 190.92 Tm
-(the) Tj
-1 0 0 1 72 179.04 Tm
-(block) Tj
-1 0 0 1 97.0799 179.04 Tm
-(in) Tj
-1 0 0 1 107.88 179.04 Tm
-(the) Tj
-1 0 0 1 123 179.04 Tm
-(checkpoint) Tj
-1 0 0 1 169.68 179.04 Tm
-(record) Tj
-1 0 0 1 198.12 179.04 Tm
-(of) Tj
-1 0 0 1 209.4 179.04 Tm
-(the) Tj
-1 0 0 1 224.519 179.04 Tm
-(stable) Tj
-1 0 0 1 250.799 179.04 Tm
-(checkpoint,) Tj
-1 0 0 1 72 167.04 Tm
-(and) Tj
-1 0 0 1 90.7199 167.04 Tm
-(then) Tj
-1 0 0 1 112.08 167.04 Tm
-(searches) Tj
-1 0 0 1 150.12 167.04 Tm
-(the) Tj
-1 0 0 1 166.56 167.04 Tm
-(checkpoint) Tj
-1 0 0 1 214.56 167.04 Tm
-(records) Tj
-1 0 0 1 248.159 167.04 Tm
-(of) Tj
-1 0 0 1 260.759 167.04 Tm
-(an) Tj
-1 0 0 1 270.119 167.04 Tm
-(y) Tj
-1 0 0 1 279.239 167.04 Tm
-(later) Tj
-1 0 0 1 72 155.16 Tm
-(checkpoints.) Tj
-1 0 0 1 125.52 155.16 Tm
-(If) Tj
-1 0 0 1 134.4 155.16 Tm
-(the) Tj
-1 0 0 1 148.8 155.16 Tm
-(block) Tj
-1 0 0 1 173.04 155.16 Tm
-(is) Tj
-1 0 0 1 181.92 155.16 Tm
-(not) Tj
-1 0 0 1 196.8 155.16 Tm
-(in) Tj
-1 0 0 1 206.76 155.16 Tm
-(an) Tj
-1 0 0 1 216.12 155.16 Tm
-(y) Tj
-1 0 0 1 223.199 155.16 Tm
-(checkpoint) Tj
-1 0 0 1 269.039 155.16 Tm
-(record,) Tj
-1 0 0 1 72 143.16 Tm
-(it) Tj
-1 0 0 1 80.04 143.16 Tm
-(returns) Tj
-1 0 0 1 110.16 143.16 Tm
-(the) Tj
-1 0 0 1 124.8 143.16 Tm
-(v) Tj
-1 0 0 1 129.6 143.16 Tm
-(alue) Tj
-1 0 0 1 148.68 143.16 Tm
-(from) Tj
-1 0 0 1 170.52 143.16 Tm
-(the) Tj
-1 0 0 1 185.16 143.16 Tm
-(current) Tj
-1 0 0 1 215.879 143.16 Tm
-(state.) Tj
-1 0 0 1 81.96 130.68 Tm
-(The) Tj
-1 0 0 1 101.16 130.68 Tm
-(use) Tj
-1 0 0 1 118.08 130.68 Tm
-(of) Tj
-1 0 0 1 130.08 130.68 Tm
-(the) Tj
-1 0 0 1 145.92 130.68 Tm
-(cop) Tj
-1 0 0 1 160.32 130.68 Tm
-(y-on-write) Tj
-1 0 0 1 205.92 130.68 Tm
-(technique) Tj
-1 0 0 1 248.279 130.68 Tm
-(and) Tj
-1 0 0 1 266.279 130.68 Tm
-(the) Tj
-1 0 0 1 282.119 130.68 Tm
-(f) Tj
-1 0 0 1 285.359 130.68 Tm
-(act) Tj
-1 0 0 1 72 118.8 Tm
-(that) Tj
-1 0 0 1 89.5199 118.8 Tm
-(we) Tj
-1 0 0 1 103.68 118.8 Tm
-(k) Tj
-1 0 0 1 108.6 118.8 Tm
-(eep) Tj
-1 0 0 1 124.92 118.8 Tm
-(at) Tj
-1 0 0 1 134.64 118.8 Tm
-(most) Tj
-1 0 0 1 156.48 118.8 Tm
-(2) Tj
-1 0 0 1 164.04 118.8 Tm
-(checkpoints) Tj
-1 0 0 1 214.2 118.8 Tm
-(ensure) Tj
-1 0 0 1 242.639 118.8 Tm
-(that) Tj
-1 0 0 1 260.159 118.8 Tm
-(the) Tj
-1 0 0 1 274.919 118.8 Tm
-(space) Tj
-1 0 0 1 72 106.8 Tm
-(and) Tj
-1 0 0 1 91.08 106.8 Tm
-(time) Tj
-1 0 0 1 113.4 106.8 Tm
-(o) Tj
-1 0 0 1 118.32 106.8 Tm
-(v) Tj
-1 0 0 1 123.24 106.8 Tm
-(erheads) Tj
-1 0 0 1 158.16 106.8 Tm
-(of) Tj
-1 0 0 1 171.12 106.8 Tm
-(k) Tj
-1 0 0 1 176.04 106.8 Tm
-(eeping) Tj
-1 0 0 1 207.24 106.8 Tm
-(se) Tj
-1 0 0 1 215.28 106.8 Tm
-(v) Tj
-1 0 0 1 220.2 106.8 Tm
-(eral) Tj
-1 0 0 1 239.76 106.8 Tm
-(logical) Tj
-1 0 0 1 271.559 106.8 Tm
-(copies) Tj
-1 0 0 1 72 94.92 Tm
-(of) Tj
-1 0 0 1 85.68 94.92 Tm
-(the) Tj
-1 0 0 1 103.2 94.92 Tm
-(state) Tj
-1 0 0 1 126.84 94.92 Tm
-(are) Tj
-1 0 0 1 144.36 94.92 Tm
-(lo) Tj
-1 0 0 1 151.92 94.92 Tm
-(w) Tj
-1 0 0 1 158.52 94.92 Tm
-(.) Tj
-1 0 0 1 173.16 94.92 Tm
-(F) Tj
-1 0 0 1 178.56 94.92 Tm
-(or) Tj
-1 0 0 1 192.24 94.92 Tm
-(e) Tj
-1 0 0 1 196.56 94.92 Tm
-(xample,) Tj
-1 0 0 1 234.48 94.92 Tm
-(in) Tj
-1 0 0 1 247.559 94.92 Tm
-(the) Tj
-1 0 0 1 265.199 94.92 Tm
-(Andre) Tj
-1 0 0 1 290.039 94.92 Tm
-(w) Tj
-1 0 0 1 72 82.92 Tm
-(benchmark) Tj
-1 0 0 1 122.28 82.92 Tm
-(e) Tj
-1 0 0 1 126.6 82.92 Tm
-(xperiments) Tj
-1 0 0 1 176.76 82.92 Tm
-(described) Tj
-1 0 0 1 220.92 82.92 Tm
-(in) Tj
-1 0 0 1 234.6 82.92 Tm
-(Section) Tj
-1 0 0 1 270.479 82.92 Tm
-(7,) Tj
-1 0 0 1 284.879 82.92 Tm
-(the) Tj
-1 0 0 1 72 71.04 Tm
-(a) Tj
-1 0 0 1 76.2 71.04 Tm
-(v) Tj
-1 0 0 1 81.1199 71.04 Tm
-(erage) Tj
-1 0 0 1 105.12 71.04 Tm
-(checkpoint) Tj
-1 0 0 1 151.32 71.04 Tm
-(record) Tj
-1 0 0 1 179.16 71.04 Tm
-(size) Tj
-1 0 0 1 197.16 71.04 Tm
-(is) Tj
-1 0 0 1 206.28 71.04 Tm
-(only) Tj
-1 0 0 1 226.439 71.04 Tm
-(182) Tj
-1 0 0 1 243.959 71.04 Tm
-(blocks) Tj
-1 0 0 1 272.399 71.04 Tm
-(with) Tj
-1 0 0 1 292.559 71.04 Tm
-(a) Tj
-1 0 0 1 315 709.08 Tm
-(maximum) Tj
-1 0 0 1 357.84 709.08 Tm
-(of) Tj
-1 0 0 1 368.64 709.08 Tm
-(500.) Tj
-/R704 10 Tf
-1 0 0 1 315 687.96 Tm
-(6.4) Tj
-1 0 0 1 337.44 687.96 Tm
-(Computing) Tj
-1 0 0 1 388.08 687.96 Tm
-(Checkpoint) Tj
-1 0 0 1 439.8 687.96 Tm
-(Digests) Tj
-/R707 10 Tf
-1 0 0 1 315 673.68 Tm
-(snfsd) Tj
-/R701 10 Tf
-1 0 0 1 339.84 673.68 Tm
-(computes) Tj
-1 0 0 1 382.44 673.68 Tm
-(a) Tj
-1 0 0 1 391.32 673.68 Tm
-(digest) Tj
-1 0 0 1 419.52 673.68 Tm
-(of) Tj
-1 0 0 1 432.24 673.68 Tm
-(a) Tj
-1 0 0 1 441 673.68 Tm
-(checkpoint) Tj
-1 0 0 1 489.119 673.68 Tm
-(state) Tj
-1 0 0 1 511.799 673.68 Tm
-(as) Tj
-1 0 0 1 524.519 673.68 Tm
-(part) Tj
-1 0 0 1 315 661.8 Tm
-(of) Tj
-1 0 0 1 328.56 661.8 Tm
-(a) Tj
-/R707 10 Tf
-1 0 0 1 338.28 661.8 Tm
-(mak) Tj
-1 0 0 1 354.84 661.8 Tm
-(e) Tj
-ET
-q
-3 0 0 -0.48 359.868 662.292 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 362.76 661.8 Tm
-(c) Tj
-1 0 0 1 367.08 661.8 Tm
-(hec) Tj
-1 0 0 1 380.76 661.8 Tm
-(kpoint) Tj
-/R701 10 Tf
-1 0 0 1 410.76 661.8 Tm
-(upcall.) Tj
-1 0 0 1 449.52 661.8 Tm
-(Although) Tj
-1 0 0 1 492.36 661.8 Tm
-(checkpoints) Tj
-1 0 0 1 315 649.8 Tm
-(are) Tj
-1 0 0 1 330.72 649.8 Tm
-(only) Tj
-1 0 0 1 352.08 649.8 Tm
-(tak) Tj
-1 0 0 1 364.2 649.8 Tm
-(en) Tj
-1 0 0 1 377.16 649.8 Tm
-(occasionally) Tj
-1 0 0 1 426.6 649.8 Tm
-(,) Tj
-1 0 0 1 432.6 649.8 Tm
-(it) Tj
-1 0 0 1 441.72 649.8 Tm
-(is) Tj
-1 0 0 1 452.039 649.8 Tm
-(important) Tj
-1 0 0 1 494.399 649.8 Tm
-(to) Tj
-1 0 0 1 505.679 649.8 Tm
-(compute) Tj
-1 0 0 1 315 637.92 Tm
-(the) Tj
-1 0 0 1 330.6 637.92 Tm
-(state) Tj
-1 0 0 1 352.32 637.92 Tm
-(digest) Tj
-1 0 0 1 379.56 637.92 Tm
-(incrementally) Tj
-1 0 0 1 437.76 637.92 Tm
-(because) Tj
-1 0 0 1 472.679 637.92 Tm
-(the) Tj
-1 0 0 1 488.279 637.92 Tm
-(state) Tj
-1 0 0 1 509.999 637.92 Tm
-(may) Tj
-1 0 0 1 530.639 637.92 Tm
-(be) Tj
-1 0 0 1 315 625.92 Tm
-(lar) Tj
-1 0 0 1 325.44 625.92 Tm
-(ge.) Tj
-/R707 10 Tf
-1 0 0 1 342.36 625.92 Tm
-(snfsd) Tj
-/R701 10 Tf
-1 0 0 1 365.88 625.92 Tm
-(uses) Tj
-1 0 0 1 386.04 625.92 Tm
-(an) Tj
-1 0 0 1 398.4 625.92 Tm
-(incremental) Tj
-1 0 0 1 448.44 625.92 Tm
-(collision-resistant) Tj
-1 0 0 1 522.239 625.92 Tm
-(one-) Tj
-1 0 0 1 315 614.04 Tm
-(w) Tj
-1 0 0 1 322.08 614.04 Tm
-(ay) Tj
-1 0 0 1 335.88 614.04 Tm
-(hash) Tj
-1 0 0 1 358.56 614.04 Tm
-(function) Tj
-1 0 0 1 396.12 614.04 Tm
-(called) Tj
-1 0 0 1 424.32 614.04 Tm
-(AdHash) Tj
-1 0 0 1 461.28 614.04 Tm
-([1) Tj
-1 0 0 1 469.56 614.04 Tm
-(].) Tj
-1 0 0 1 484.68 614.04 Tm
-(This) Tj
-1 0 0 1 506.76 614.04 Tm
-(function) Tj
-1 0 0 1 315 602.04 Tm
-(di) Tj
-1 0 0 1 322.56 602.04 Tm
-(vides) Tj
-1 0 0 1 347.76 602.04 Tm
-(the) Tj
-1 0 0 1 364.08 602.04 Tm
-(state) Tj
-1 0 0 1 386.52 602.04 Tm
-(into) Tj
-1 0 0 1 406.2 602.04 Tm
-(\256x) Tj
-1 0 0 1 416.64 602.04 Tm
-(ed-size) Tj
-1 0 0 1 448.92 602.04 Tm
-(blocks) Tj
-1 0 0 1 479.039 602.04 Tm
-(and) Tj
-1 0 0 1 497.639 602.04 Tm
-(uses) Tj
-1 0 0 1 518.999 602.04 Tm
-(some) Tj
-1 0 0 1 315 590.16 Tm
-(other) Tj
-1 0 0 1 339.24 590.16 Tm
-(hash) Tj
-1 0 0 1 361.32 590.16 Tm
-(function) Tj
-1 0 0 1 398.28 590.16 Tm
-(\(e.g.,) Tj
-1 0 0 1 422.52 590.16 Tm
-(MD5\)) Tj
-1 0 0 1 450.6 590.16 Tm
-(to) Tj
-1 0 0 1 462.12 590.16 Tm
-(compute) Tj
-1 0 0 1 500.279 590.16 Tm
-(the) Tj
-1 0 0 1 516.239 590.16 Tm
-(digest) Tj
-1 0 0 1 315 578.16 Tm
-(of) Tj
-1 0 0 1 326.52 578.16 Tm
-(the) Tj
-1 0 0 1 342 578.16 Tm
-(string) Tj
-1 0 0 1 367.92 578.16 Tm
-(obtained) Tj
-1 0 0 1 405.48 578.16 Tm
-(by) Tj
-1 0 0 1 418.68 578.16 Tm
-(concatenating) Tj
-1 0 0 1 477.24 578.16 Tm
-(the) Tj
-1 0 0 1 492.599 578.16 Tm
-(block) Tj
-1 0 0 1 518.039 578.16 Tm
-(inde) Tj
-1 0 0 1 535.199 578.16 Tm
-(x) Tj
-1 0 0 1 315 566.28 Tm
-(with) Tj
-1 0 0 1 336.12 566.28 Tm
-(the) Tj
-1 0 0 1 351.72 566.28 Tm
-(block) Tj
-1 0 0 1 377.28 566.28 Tm
-(v) Tj
-1 0 0 1 382.08 566.28 Tm
-(alue) Tj
-1 0 0 1 402.12 566.28 Tm
-(for) Tj
-1 0 0 1 417.12 566.28 Tm
-(each) Tj
-1 0 0 1 438.84 566.28 Tm
-(block.) Tj
-1 0 0 1 469.92 566.28 Tm
-(The) Tj
-1 0 0 1 488.879 566.28 Tm
-(digest) Tj
-1 0 0 1 516.119 566.28 Tm
-(of) Tj
-1 0 0 1 527.879 566.28 Tm
-(the) Tj
-1 0 0 1 315 554.28 Tm
-(state) Tj
-1 0 0 1 335.52 554.28 Tm
-(is) Tj
-1 0 0 1 344.52 554.28 Tm
-(the) Tj
-1 0 0 1 358.92 554.28 Tm
-(sum) Tj
-1 0 0 1 377.88 554.28 Tm
-(of) Tj
-1 0 0 1 388.44 554.28 Tm
-(the) Tj
-1 0 0 1 402.96 554.28 Tm
-(digests) Tj
-1 0 0 1 432.839 554.28 Tm
-(of) Tj
-1 0 0 1 443.519 554.28 Tm
-(the) Tj
-1 0 0 1 457.919 554.28 Tm
-(blocks) Tj
-1 0 0 1 486.239 554.28 Tm
-(modulo) Tj
-1 0 0 1 518.999 554.28 Tm
-(some) Tj
-1 0 0 1 315 542.28 Tm
-(lar) Tj
-1 0 0 1 325.44 542.28 Tm
-(ge) Tj
-1 0 0 1 337.56 542.28 Tm
-(inte) Tj
-1 0 0 1 352.44 542.28 Tm
-(ger) Tj
-1 0 0 1 364.68 542.28 Tm
-(.) Tj
-1 0 0 1 371.4 542.28 Tm
-(In) Tj
-1 0 0 1 382.44 542.28 Tm
-(our) Tj
-1 0 0 1 398.52 542.28 Tm
-(current) Tj
-1 0 0 1 429.479 542.28 Tm
-(implementation,) Tj
-1 0 0 1 497.399 542.28 Tm
-(we) Tj
-1 0 0 1 511.799 542.28 Tm
-(use) Tj
-1 0 0 1 527.879 542.28 Tm
-(the) Tj
-1 0 0 1 315 530.4 Tm
-(512-byte) Tj
-1 0 0 1 354.12 530.4 Tm
-(blocks) Tj
-1 0 0 1 384 530.4 Tm
-(from) Tj
-1 0 0 1 407.04 530.4 Tm
-(the) Tj
-1 0 0 1 423 530.4 Tm
-(cop) Tj
-1 0 0 1 437.4 530.4 Tm
-(y-on-write) Tj
-1 0 0 1 483.119 530.4 Tm
-(technique) Tj
-1 0 0 1 525.599 530.4 Tm
-(and) Tj
-1 0 0 1 315 518.4 Tm
-(compute) Tj
-1 0 0 1 351.84 518.4 Tm
-(their) Tj
-1 0 0 1 372.6 518.4 Tm
-(digest) Tj
-1 0 0 1 398.88 518.4 Tm
-(using) Tj
-1 0 0 1 422.88 518.4 Tm
-(MD5.) Tj
-1 0 0 1 324.96 506.52 Tm
-(T) Tj
-1 0 0 1 330.24 506.52 Tm
-(o) Tj
-1 0 0 1 337.08 506.52 Tm
-(compute) Tj
-1 0 0 1 373.32 506.52 Tm
-(the) Tj
-1 0 0 1 387.36 506.52 Tm
-(digest) Tj
-1 0 0 1 413.16 506.52 Tm
-(for) Tj
-1 0 0 1 426.6 506.52 Tm
-(the) Tj
-1 0 0 1 440.76 506.52 Tm
-(state) Tj
-1 0 0 1 460.919 506.52 Tm
-(incrementally) Tj
-1 0 0 1 515.399 506.52 Tm
-(,) Tj
-/R707 10 Tf
-1 0 0 1 519.479 506.52 Tm
-(snfsd) Tj
-/R701 10 Tf
-1 0 0 1 315 494.52 Tm
-(maintains) Tj
-1 0 0 1 357.72 494.52 Tm
-(a) Tj
-1 0 0 1 366 494.52 Tm
-(table) Tj
-1 0 0 1 389.4 494.52 Tm
-(with) Tj
-1 0 0 1 411 494.52 Tm
-(a) Tj
-1 0 0 1 419.4 494.52 Tm
-(hash) Tj
-1 0 0 1 441.6 494.52 Tm
-(v) Tj
-1 0 0 1 446.4 494.52 Tm
-(alue) Tj
-1 0 0 1 466.8 494.52 Tm
-(for) Tj
-1 0 0 1 482.4 494.52 Tm
-(each) Tj
-1 0 0 1 504.599 494.52 Tm
-(512-byte) Tj
-1 0 0 1 315 482.64 Tm
-(block.) Tj
-1 0 0 1 347.76 482.64 Tm
-(This) Tj
-1 0 0 1 369.48 482.64 Tm
-(hash) Tj
-1 0 0 1 391.8 482.64 Tm
-(v) Tj
-1 0 0 1 396.6 482.64 Tm
-(alue) Tj
-1 0 0 1 417.12 482.64 Tm
-(is) Tj
-1 0 0 1 427.8 482.64 Tm
-(obtained) Tj
-1 0 0 1 466.08 482.64 Tm
-(by) Tj
-1 0 0 1 480.12 482.64 Tm
-(applying) Tj
-1 0 0 1 518.999 482.64 Tm
-(MD5) Tj
-1 0 0 1 315 470.64 Tm
-(to) Tj
-1 0 0 1 325.92 470.64 Tm
-(the) Tj
-1 0 0 1 341.28 470.64 Tm
-(block) Tj
-1 0 0 1 366.48 470.64 Tm
-(inde) Tj
-1 0 0 1 383.64 470.64 Tm
-(x) Tj
-1 0 0 1 391.68 470.64 Tm
-(concatenated) Tj
-1 0 0 1 446.88 470.64 Tm
-(with) Tj
-1 0 0 1 467.64 470.64 Tm
-(the) Tj
-1 0 0 1 482.999 470.64 Tm
-(block) Tj
-1 0 0 1 508.319 470.64 Tm
-(v) Tj
-1 0 0 1 513.119 470.64 Tm
-(alue) Tj
-1 0 0 1 532.799 470.64 Tm
-(at) Tj
-1 0 0 1 315 458.76 Tm
-(the) Tj
-1 0 0 1 330.24 458.76 Tm
-(time) Tj
-1 0 0 1 351 458.76 Tm
-(of) Tj
-1 0 0 1 362.28 458.76 Tm
-(the) Tj
-1 0 0 1 377.52 458.76 Tm
-(last) Tj
-1 0 0 1 394.44 458.76 Tm
-(checkpoint.) Tj
-1 0 0 1 445.8 458.76 Tm
-(When) Tj
-/R707 10 Tf
-1 0 0 1 472.679 458.76 Tm
-(mak) Tj
-1 0 0 1 489.239 458.76 Tm
-(e) Tj
-ET
-q
-3 0 0 -0.48 494.268 459.252 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 497.159 458.76 Tm
-(c) Tj
-1 0 0 1 501.479 458.76 Tm
-(hec) Tj
-1 0 0 1 515.159 458.76 Tm
-(kpoint) Tj
-/R701 10 Tf
-1 0 0 1 315 446.76 Tm
-(is) Tj
-1 0 0 1 326.4 446.76 Tm
-(called,) Tj
-/R707 10 Tf
-1 0 0 1 358.08 446.76 Tm
-(snfsd) Tj
-/R701 10 Tf
-1 0 0 1 383.4 446.76 Tm
-(obtains) Tj
-1 0 0 1 417 446.76 Tm
-(the) Tj
-1 0 0 1 433.92 446.76 Tm
-(digest) Tj
-ET
-endstream
-endobj
-709 0 obj
-23289
-endobj
-710 0 obj
-<< /Type /XObject /Name /R710 /Subtype /Image /Length 711 0 R
-/ImageMask true /Width 49 /Height 71 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 49 /BlackIs1 true >>]
->>
-stream
--PYiBJV"+0)UN3G',i&VcojQ(@sYoeKmuDG
-s)&q9s*o7jJ)C$Fpj^'QJ%rnUr&sfAs+VQL0)H)pV[&D-@^p.P-,mCns*qra5O\@FpQ6S*nl.";J-Z~>
-endstream
-endobj
-711 0 obj
-117
-endobj
-712 0 obj
-<< /Length 713 0 R >>
-stream
-q
-4.9 0 0 -7.1 462.9 453.8 cm
-/R710 Do
-Q
-BT
-1 0 0 1 472.559 446.76 Tm
-(for) Tj
-1 0 0 1 488.999 446.76 Tm
-(the) Tj
-1 0 0 1 505.919 446.76 Tm
-(pre) Tj
-1 0 0 1 518.519 446.76 Tm
-(vious) Tj
-1 0 0 1 315 434.76 Tm
-(checkpoint) Tj
-1 0 0 1 360.72 434.76 Tm
-(state) Tj
-1 0 0 1 381.12 434.76 Tm
-(\(from) Tj
-1 0 0 1 405.84 434.76 Tm
-(the) Tj
-1 0 0 1 420 434.76 Tm
-(associated) Tj
-1 0 0 1 462.96 434.76 Tm
-(checkpoint) Tj
-1 0 0 1 508.799 434.76 Tm
-(record\).) Tj
-1 0 0 1 315 422.88 Tm
-(It) Tj
-1 0 0 1 323.4 422.88 Tm
-(computes) Tj
-1 0 0 1 363.96 422.88 Tm
-(ne) Tj
-1 0 0 1 373.2 422.88 Tm
-(w) Tj
-1 0 0 1 382.56 422.88 Tm
-(hash) Tj
-1 0 0 1 403.2 422.88 Tm
-(v) Tj
-1 0 0 1 408 422.88 Tm
-(alues) Tj
-1 0 0 1 430.68 422.88 Tm
-(for) Tj
-1 0 0 1 444.6 422.88 Tm
-(each) Tj
-1 0 0 1 465.239 422.88 Tm
-(block) Tj
-1 0 0 1 489.599 422.88 Tm
-(whose) Tj
-1 0 0 1 517.439 422.88 Tm
-(cop) Tj
-1 0 0 1 531.839 422.88 Tm
-(y-) Tj
-1 0 0 1 315 410.88 Tm
-(on-write) Tj
-1 0 0 1 351.24 410.88 Tm
-(bit) Tj
-1 0 0 1 364.32 410.88 Tm
-(is) Tj
-1 0 0 1 373.56 410.88 Tm
-(reset) Tj
-1 0 0 1 394.92 410.88 Tm
-(by) Tj
-1 0 0 1 407.4 410.88 Tm
-(applying) Tj
-1 0 0 1 444.72 410.88 Tm
-(MD5) Tj
-1 0 0 1 468.36 410.88 Tm
-(to) Tj
-1 0 0 1 478.679 410.88 Tm
-(the) Tj
-1 0 0 1 493.319 410.88 Tm
-(block) Tj
-1 0 0 1 518.039 410.88 Tm
-(inde) Tj
-1 0 0 1 535.199 410.88 Tm
-(x) Tj
-1 0 0 1 315 399 Tm
-(concatenated) Tj
-1 0 0 1 369.6 399 Tm
-(with) Tj
-1 0 0 1 389.88 399 Tm
-(the) Tj
-1 0 0 1 404.64 399 Tm
-(current) Tj
-1 0 0 1 435.48 399 Tm
-(block) Tj
-1 0 0 1 460.2 399 Tm
-(v) Tj
-1 0 0 1 465 399 Tm
-(alue.) Tj
-1 0 0 1 488.039 399 Tm
-(Then,) Tj
-1 0 0 1 513.599 399 Tm
-(it) Tj
-1 0 0 1 521.759 399 Tm
-(adds) Tj
-1 0 0 1 315 387 Tm
-(the) Tj
-1 0 0 1 331.32 387 Tm
-(ne) Tj
-1 0 0 1 340.56 387 Tm
-(w) Tj
-1 0 0 1 351.72 387 Tm
-(hash) Tj
-1 0 0 1 374.16 387 Tm
-(v) Tj
-1 0 0 1 378.96 387 Tm
-(alue) Tj
-1 0 0 1 399.6 387 Tm
-(to) Tj
-ET
-q
-4.9 0 0 -7.1 411.8 394 cm
-/R710 Do
-Q
-BT
-1 0 0 1 416.64 387 Tm
-(,) Tj
-1 0 0 1 423.6 387 Tm
-(subtracts) Tj
-1 0 0 1 463.2 387 Tm
-(the) Tj
-1 0 0 1 479.399 387 Tm
-(old) Tj
-1 0 0 1 496.319 387 Tm
-(hash) Tj
-1 0 0 1 518.639 387 Tm
-(v) Tj
-1 0 0 1 523.439 387 Tm
-(alue) Tj
-1 0 0 1 315 375.12 Tm
-(from) Tj
-ET
-q
-4.9 0 0 -7.1 338.5 382.1 cm
-/R710 Do
-Q
-BT
-1 0 0 1 343.32 375.12 Tm
-(,) Tj
-1 0 0 1 349.8 375.12 Tm
-(and) Tj
-1 0 0 1 367.92 375.12 Tm
-(updates) Tj
-1 0 0 1 402.12 375.12 Tm
-(the) Tj
-1 0 0 1 418.08 375.12 Tm
-(table) Tj
-1 0 0 1 441.12 375.12 Tm
-(to) Tj
-1 0 0 1 452.64 375.12 Tm
-(contain) Tj
-1 0 0 1 485.759 375.12 Tm
-(the) Tj
-1 0 0 1 501.599 375.12 Tm
-(ne) Tj
-1 0 0 1 510.839 375.12 Tm
-(w) Tj
-1 0 0 1 521.759 375.12 Tm
-(hash) Tj
-1 0 0 1 315 363.12 Tm
-(v) Tj
-1 0 0 1 319.8 363.12 Tm
-(alue.) Tj
-1 0 0 1 344.64 363.12 Tm
-(This) Tj
-1 0 0 1 365.52 363.12 Tm
-(process) Tj
-1 0 0 1 398.64 363.12 Tm
-(is) Tj
-1 0 0 1 408.48 363.12 Tm
-(ef) Tj
-1 0 0 1 416.04 363.12 Tm
-(\256cient) Tj
-1 0 0 1 444.12 363.12 Tm
-(pro) Tj
-1 0 0 1 457.44 363.12 Tm
-(vided) Tj
-1 0 0 1 482.639 363.12 Tm
-(the) Tj
-1 0 0 1 497.999 363.12 Tm
-(number) Tj
-1 0 0 1 531.719 363.12 Tm
-(of) Tj
-1 0 0 1 315 351.24 Tm
-(modi\256ed) Tj
-1 0 0 1 352.32 351.24 Tm
-(blocks) Tj
-1 0 0 1 380.28 351.24 Tm
-(is) Tj
-1 0 0 1 388.8 351.24 Tm
-(small;) Tj
-1 0 0 1 415.32 351.24 Tm
-(as) Tj
-1 0 0 1 425.52 351.24 Tm
-(mentioned) Tj
-1 0 0 1 469.44 351.24 Tm
-(abo) Tj
-1 0 0 1 483.839 351.24 Tm
-(v) Tj
-1 0 0 1 488.759 351.24 Tm
-(e,) Tj
-1 0 0 1 497.519 351.24 Tm
-(on) Tj
-1 0 0 1 509.399 351.24 Tm
-(a) Tj
-1 0 0 1 513.599 351.24 Tm
-(v) Tj
-1 0 0 1 518.519 351.24 Tm
-(erage) Tj
-1 0 0 1 315 339.24 Tm
-(182) Tj
-1 0 0 1 333 339.24 Tm
-(blocks) Tj
-1 0 0 1 362.04 339.24 Tm
-(are) Tj
-1 0 0 1 377.28 339.24 Tm
-(modi\256ed) Tj
-1 0 0 1 415.68 339.24 Tm
-(per) Tj
-1 0 0 1 431.52 339.24 Tm
-(checkpoint) Tj
-1 0 0 1 478.319 339.24 Tm
-(for) Tj
-1 0 0 1 492.959 339.24 Tm
-(the) Tj
-1 0 0 1 508.199 339.24 Tm
-(Andre) Tj
-1 0 0 1 533.039 339.24 Tm
-(w) Tj
-1 0 0 1 315 327.36 Tm
-(benchmark.) Tj
-/R704 12 Tf
-1 0 0 1 315 302.04 Tm
-(7) Tj
-1 0 0 1 332.88 302.04 Tm
-(P) Tj
-1 0 0 1 339.96 302.04 Tm
-(erf) Tj
-1 0 0 1 354.24 302.04 Tm
-(ormance) Tj
-1 0 0 1 401.76 302.04 Tm
-(Ev) Tj
-1 0 0 1 415.56 302.04 Tm
-(aluation) Tj
-/R701 10 Tf
-1 0 0 1 315 285.48 Tm
-(This) Tj
-1 0 0 1 337.08 285.48 Tm
-(section) Tj
-1 0 0 1 369.72 285.48 Tm
-(e) Tj
-1 0 0 1 373.92 285.48 Tm
-(v) Tj
-1 0 0 1 378.72 285.48 Tm
-(aluates) Tj
-1 0 0 1 410.64 285.48 Tm
-(the) Tj
-1 0 0 1 427.2 285.48 Tm
-(performance) Tj
-1 0 0 1 481.919 285.48 Tm
-(of) Tj
-1 0 0 1 494.639 285.48 Tm
-(our) Tj
-1 0 0 1 512.279 285.48 Tm
-(system) Tj
-1 0 0 1 315 273.6 Tm
-(using) Tj
-1 0 0 1 341.88 273.6 Tm
-(tw) Tj
-1 0 0 1 351.72 273.6 Tm
-(o) Tj
-1 0 0 1 362.04 273.6 Tm
-(benchmarks:) Tj
-1 0 0 1 422.28 273.6 Tm
-(a) Tj
-1 0 0 1 432 273.6 Tm
-(micro-benchmark) Tj
-1 0 0 1 508.079 273.6 Tm
-(and) Tj
-1 0 0 1 527.879 273.6 Tm
-(the) Tj
-1 0 0 1 315 261.6 Tm
-(Andre) Tj
-1 0 0 1 339.84 261.6 Tm
-(w) Tj
-1 0 0 1 348.6 261.6 Tm
-(benchmark) Tj
-1 0 0 1 394.8 261.6 Tm
-([15) Tj
-1 0 0 1 407.4 261.6 Tm
-(].) Tj
-1 0 0 1 416.52 261.6 Tm
-(The) Tj
-1 0 0 1 433.68 261.6 Tm
-(micro-benchmark) Tj
-1 0 0 1 506.519 261.6 Tm
-(pr) Tj
-1 0 0 1 514.799 261.6 Tm
-(o) Tj
-1 0 0 1 519.719 261.6 Tm
-(v) Tj
-1 0 0 1 524.639 261.6 Tm
-(ides) Tj
-1 0 0 1 315 249.72 Tm
-(a) Tj
-1 0 0 1 322.8 249.72 Tm
-(service-independent) Tj
-1 0 0 1 406.44 249.72 Tm
-(e) Tj
-1 0 0 1 410.64 249.72 Tm
-(v) Tj
-1 0 0 1 415.44 249.72 Tm
-(aluation) Tj
-1 0 0 1 450.72 249.72 Tm
-(of) Tj
-1 0 0 1 462.479 249.72 Tm
-(the) Tj
-1 0 0 1 477.959 249.72 Tm
-(performance) Tj
-1 0 0 1 531.719 249.72 Tm
-(of) Tj
-1 0 0 1 315 237.72 Tm
-(the) Tj
-1 0 0 1 330.12 237.72 Tm
-(replication) Tj
-1 0 0 1 375.6 237.72 Tm
-(library;) Tj
-1 0 0 1 408 237.72 Tm
-(it) Tj
-1 0 0 1 416.4 237.72 Tm
-(measures) Tj
-1 0 0 1 456.359 237.72 Tm
-(the) Tj
-1 0 0 1 471.479 237.72 Tm
-(latenc) Tj
-1 0 0 1 495.239 237.72 Tm
-(y) Tj
-1 0 0 1 502.919 237.72 Tm
-(to) Tj
-1 0 0 1 513.599 237.72 Tm
-(in) Tj
-1 0 0 1 521.039 237.72 Tm
-(v) Tj
-1 0 0 1 525.839 237.72 Tm
-(ok) Tj
-1 0 0 1 535.799 237.72 Tm
-(e) Tj
-1 0 0 1 315 225.84 Tm
-(a) Tj
-1 0 0 1 321.96 225.84 Tm
-(null) Tj
-1 0 0 1 339.96 225.84 Tm
-(operation,) Tj
-1 0 0 1 382.56 225.84 Tm
-(i.e.,) Tj
-1 0 0 1 399.72 225.84 Tm
-(an) Tj
-1 0 0 1 411.6 225.84 Tm
-(operation) Tj
-1 0 0 1 451.679 225.84 Tm
-(that) Tj
-1 0 0 1 469.079 225.84 Tm
-(does) Tj
-1 0 0 1 489.839 225.84 Tm
-(nothing.) Tj
-1 0 0 1 324.96 213.84 Tm
-(The) Tj
-1 0 0 1 343.08 213.84 Tm
-(Andre) Tj
-1 0 0 1 367.92 213.84 Tm
-(w) Tj
-1 0 0 1 377.52 213.84 Tm
-(benchmark) Tj
-1 0 0 1 424.44 213.84 Tm
-(is) Tj
-1 0 0 1 433.68 213.84 Tm
-(used) Tj
-1 0 0 1 454.56 213.84 Tm
-(to) Tj
-1 0 0 1 465 213.84 Tm
-(compare) Tj
-1 0 0 1 501.96 213.84 Tm
-(BFS) Tj
-1 0 0 1 522.239 213.84 Tm
-(with) Tj
-1 0 0 1 315 201.84 Tm
-(tw) Tj
-1 0 0 1 324.84 201.84 Tm
-(o) Tj
-1 0 0 1 331.56 201.84 Tm
-(other) Tj
-1 0 0 1 353.88 201.84 Tm
-(\256le) Tj
-1 0 0 1 368.28 201.84 Tm
-(systems:) Tj
-1 0 0 1 405.48 201.84 Tm
-(one) Tj
-1 0 0 1 421.68 201.84 Tm
-(is) Tj
-1 0 0 1 429.96 201.84 Tm
-(the) Tj
-1 0 0 1 443.879 201.84 Tm
-(NFS) Tj
-1 0 0 1 463.799 201.84 Tm
-(V2) Tj
-1 0 0 1 477.719 201.84 Tm
-(implementation) Tj
-1 0 0 1 315 189.96 Tm
-(in) Tj
-1 0 0 1 325.56 189.96 Tm
-(Digital) Tj
-1 0 0 1 356.04 189.96 Tm
-(Unix,) Tj
-1 0 0 1 381.24 189.96 Tm
-(and) Tj
-1 0 0 1 398.4 189.96 Tm
-(the) Tj
-1 0 0 1 413.4 189.96 Tm
-(other) Tj
-1 0 0 1 436.56 189.96 Tm
-(is) Tj
-1 0 0 1 446.04 189.96 Tm
-(identical) Tj
-1 0 0 1 483.119 189.96 Tm
-(to) Tj
-1 0 0 1 493.679 189.96 Tm
-(BFS) Tj
-1 0 0 1 514.199 189.96 Tm
-(e) Tj
-1 0 0 1 518.519 189.96 Tm
-(xcept) Tj
-1 0 0 1 315 177.96 Tm
-(without) Tj
-1 0 0 1 348.72 177.96 Tm
-(replication.) Tj
-1 0 0 1 399.96 177.96 Tm
-(The) Tj
-1 0 0 1 418.8 177.96 Tm
-(\256rst) Tj
-1 0 0 1 437.64 177.96 Tm
-(comparison) Tj
-1 0 0 1 487.439 177.96 Tm
-(demonstrates) Tj
-1 0 0 1 315 166.08 Tm
-(that) Tj
-1 0 0 1 332.4 166.08 Tm
-(our) Tj
-1 0 0 1 348.24 166.08 Tm
-(system) Tj
-1 0 0 1 378.36 166.08 Tm
-(is) Tj
-1 0 0 1 387.6 166.08 Tm
-(practical) Tj
-1 0 0 1 424.32 166.08 Tm
-(by) Tj
-1 0 0 1 436.799 166.08 Tm
-(sho) Tj
-1 0 0 1 450.479 166.08 Tm
-(wing) Tj
-1 0 0 1 472.799 166.08 Tm
-(that) Tj
-1 0 0 1 490.319 166.08 Tm
-(its) Tj
-1 0 0 1 502.199 166.08 Tm
-(latenc) Tj
-1 0 0 1 525.959 166.08 Tm
-(y) Tj
-1 0 0 1 533.399 166.08 Tm
-(is) Tj
-1 0 0 1 315 154.08 Tm
-(similar) Tj
-1 0 0 1 344.88 154.08 Tm
-(to) Tj
-1 0 0 1 354.72 154.08 Tm
-(the) Tj
-1 0 0 1 369 154.08 Tm
-(latenc) Tj
-1 0 0 1 392.76 154.08 Tm
-(y) Tj
-1 0 0 1 399.84 154.08 Tm
-(of) Tj
-1 0 0 1 410.28 154.08 Tm
-(a) Tj
-1 0 0 1 416.88 154.08 Tm
-(commercial) Tj
-1 0 0 1 466.079 154.08 Tm
-(system) Tj
-1 0 0 1 495.839 154.08 Tm
-(that) Tj
-1 0 0 1 512.999 154.08 Tm
-(is) Tj
-1 0 0 1 521.759 154.08 Tm
-(used) Tj
-1 0 0 1 315 142.2 Tm
-(daily) Tj
-1 0 0 1 336.72 142.2 Tm
-(by) Tj
-1 0 0 1 348.6 142.2 Tm
-(man) Tj
-1 0 0 1 365.76 142.2 Tm
-(y) Tj
-1 0 0 1 372.36 142.2 Tm
-(users.) Tj
-1 0 0 1 398.76 142.2 Tm
-(The) Tj
-1 0 0 1 416.04 142.2 Tm
-(second) Tj
-1 0 0 1 445.56 142.2 Tm
-(comparison) Tj
-1 0 0 1 493.919 142.2 Tm
-(allo) Tj
-1 0 0 1 508.679 142.2 Tm
-(ws) Tj
-1 0 0 1 521.519 142.2 Tm
-(us) Tj
-1 0 0 1 532.199 142.2 Tm
-(to) Tj
-1 0 0 1 315 130.2 Tm
-(e) Tj
-1 0 0 1 319.2 130.2 Tm
-(v) Tj
-1 0 0 1 324 130.2 Tm
-(aluate) Tj
-1 0 0 1 350.16 130.2 Tm
-(the) Tj
-1 0 0 1 364.8 130.2 Tm
-(o) Tj
-1 0 0 1 369.72 130.2 Tm
-(v) Tj
-1 0 0 1 374.64 130.2 Tm
-(erhead) Tj
-1 0 0 1 403.44 130.2 Tm
-(of) Tj
-1 0 0 1 414.24 130.2 Tm
-(our) Tj
-1 0 0 1 429.96 130.2 Tm
-(algorithm) Tj
-1 0 0 1 471.119 130.2 Tm
-(accurately) Tj
-1 0 0 1 514.559 130.2 Tm
-(within) Tj
-1 0 0 1 315 118.32 Tm
-(an) Tj
-1 0 0 1 326.88 118.32 Tm
-(implementation) Tj
-1 0 0 1 391.92 118.32 Tm
-(of) Tj
-1 0 0 1 402.72 118.32 Tm
-(a) Tj
-1 0 0 1 409.68 118.32 Tm
-(real) Tj
-1 0 0 1 427.08 118.32 Tm
-(service.) Tj
-/R704 10 Tf
-1 0 0 1 315 97.2 Tm
-(7.1) Tj
-1 0 0 1 337.44 97.2 Tm
-(Experimental) Tj
-1 0 0 1 398.04 97.2 Tm
-(Setup) Tj
-/R701 10 Tf
-1 0 0 1 315 82.92 Tm
-(The) Tj
-1 0 0 1 335.76 82.92 Tm
-(e) Tj
-1 0 0 1 340.08 82.92 Tm
-(xperiments) Tj
-1 0 0 1 389.64 82.92 Tm
-(measure) Tj
-1 0 0 1 428.04 82.92 Tm
-(normal-case) Tj
-1 0 0 1 482.04 82.92 Tm
-(beha) Tj
-1 0 0 1 500.76 82.92 Tm
-(vior) Tj
-1 0 0 1 521.999 82.92 Tm
-(\(i.e.,) Tj
-1 0 0 1 315 71.04 Tm
-(there) Tj
-1 0 0 1 337.8 71.04 Tm
-(are) Tj
-1 0 0 1 352.92 71.04 Tm
-(no) Tj
-1 0 0 1 365.88 71.04 Tm
-(vie) Tj
-1 0 0 1 377.88 71.04 Tm
-(w) Tj
-1 0 0 1 387.96 71.04 Tm
-(changes\),) Tj
-1 0 0 1 428.88 71.04 Tm
-(because) Tj
-1 0 0 1 463.319 71.04 Tm
-(this) Tj
-1 0 0 1 480.599 71.04 Tm
-(is) Tj
-1 0 0 1 490.199 71.04 Tm
-(the) Tj
-1 0 0 1 505.319 71.04 Tm
-(beha) Tj
-1 0 0 1 524.039 71.04 Tm
-(vior) Tj
-1 0 0 1 300.96 35.16 Tm
-(10) Tj
-ET
-Q
-endstream
-endobj
-713 0 obj
-10322
-endobj
-714 0 obj
-<<
-/Type /Page
-/MediaBox [0 0 612 792]
-/Parent 2 0 R
-/Resources << /ProcSet [/PDF /ImageB /Text]
-/Font <<
-/R707 707 0 R
-/R704 704 0 R
-/R701 701 0 R
->>
-/XObject <<
-/R710 710 0 R
->>
->>
-/Contents [
-702 0 R
-705 0 R
-708 0 R
-712 0 R
-]
->>
-endobj
-715 0 obj
-<< /Type /Font /Name /R715 /Subtype /Type1 /BaseFont /Times-Roman >>
-endobj
-716 0 obj
-<< /Length 717 0 R >>
-stream
-q
-BT
-/R715 10 Tf
-1 0 0 1 72 709.08 Tm
-(that) Tj
-1 0 0 1 91.9199 709.08 Tm
-(determines) Tj
-1 0 0 1 140.52 709.08 Tm
-(the) Tj
-1 0 0 1 157.56 709.08 Tm
-(performance) Tj
-1 0 0 1 212.88 709.08 Tm
-(of) Tj
-1 0 0 1 226.08 709.08 Tm
-(the) Tj
-1 0 0 1 243.239 709.08 Tm
-(system.) Tj
-1 0 0 1 284.279 709.08 Tm
-(All) Tj
-1 0 0 1 72 697.08 Tm
-(e) Tj
-1 0 0 1 76.32 697.08 Tm
-(xperiments) Tj
-1 0 0 1 126.84 697.08 Tm
-(ran) Tj
-1 0 0 1 145.8 697.08 Tm
-(with) Tj
-1 0 0 1 169.68 697.08 Tm
-(one) Tj
-1 0 0 1 190.32 697.08 Tm
-(client) Tj
-1 0 0 1 218.76 697.08 Tm
-(running) Tj
-1 0 0 1 255.959 697.08 Tm
-(tw) Tj
-1 0 0 1 265.799 697.08 Tm
-(o) Tj
-1 0 0 1 277.079 697.08 Tm
-(relay) Tj
-1 0 0 1 72 685.2 Tm
-(processes,) Tj
-1 0 0 1 116.28 685.2 Tm
-(and) Tj
-1 0 0 1 133.92 685.2 Tm
-(four) Tj
-1 0 0 1 153.96 685.2 Tm
-(replicas.) Tj
-1 0 0 1 193.56 685.2 Tm
-(F) Tj
-1 0 0 1 198.96 685.2 Tm
-(our) Tj
-1 0 0 1 215.64 685.2 Tm
-(replicas) Tj
-1 0 0 1 249.959 685.2 Tm
-(can) Tj
-1 0 0 1 267.119 685.2 Tm
-(tolerate) Tj
-1 0 0 1 72 673.2 Tm
-(one) Tj
-1 0 0 1 90.24 673.2 Tm
-(Byzantine) Tj
-1 0 0 1 134.64 673.2 Tm
-(f) Tj
-1 0 0 1 137.88 673.2 Tm
-(ault;) Tj
-1 0 0 1 160.2 673.2 Tm
-(we) Tj
-1 0 0 1 175.68 673.2 Tm
-(e) Tj
-1 0 0 1 180 673.2 Tm
-(xpect) Tj
-1 0 0 1 205.44 673.2 Tm
-(this) Tj
-1 0 0 1 223.68 673.2 Tm
-(reliability) Tj
-1 0 0 1 266.399 673.2 Tm
-(le) Tj
-1 0 0 1 273.359 673.2 Tm
-(v) Tj
-1 0 0 1 278.279 673.2 Tm
-(el) Tj
-1 0 0 1 289.199 673.2 Tm
-(to) Tj
-1 0 0 1 72 661.32 Tm
-(suf) Tj
-1 0 0 1 84 661.32 Tm
-(\256ce) Tj
-1 0 0 1 103.68 661.32 Tm
-(for) Tj
-1 0 0 1 120.6 661.32 Tm
-(most) Tj
-1 0 0 1 145.32 661.32 Tm
-(applications.) Tj
-1 0 0 1 207.96 661.32 Tm
-(The) Tj
-1 0 0 1 228.84 661.32 Tm
-(replicas) Tj
-1 0 0 1 265.079 661.32 Tm
-(and) Tj
-1 0 0 1 284.879 661.32 Tm
-(the) Tj
-1 0 0 1 72 649.32 Tm
-(client) Tj
-1 0 0 1 95.7599 649.32 Tm
-(ran) Tj
-1 0 0 1 110.16 649.32 Tm
-(on) Tj
-1 0 0 1 121.8 649.32 Tm
-(identical) Tj
-1 0 0 1 157.8 649.32 Tm
-(DEC) Tj
-1 0 0 1 179.28 649.32 Tm
-(300) Tj
-1 0 0 1 194.28 649.32 Tm
-(0/4) Tj
-1 0 0 1 207 649.32 Tm
-(00) Tj
-1 0 0 1 218.52 649.32 Tm
-(Alph) Tj
-1 0 0 1 238.439 649.32 Tm
-(a) Tj
-1 0 0 1 244.439 649.32 Tm
-(w) Tj
-1 0 0 1 251.519 649.32 Tm
-(o) Tj
-1 0 0 1 256.439 649.32 Tm
-(rkstatio) Tj
-1 0 0 1 286.319 649.32 Tm
-(ns.) Tj
-1 0 0 1 72 637.44 Tm
-(These) Tj
-1 0 0 1 101.88 637.44 Tm
-(w) Tj
-1 0 0 1 108.96 637.44 Tm
-(orkstations) Tj
-1 0 0 1 158.88 637.44 Tm
-(ha) Tj
-1 0 0 1 168.12 637.44 Tm
-(v) Tj
-1 0 0 1 173.04 637.44 Tm
-(e) Tj
-1 0 0 1 183.48 637.44 Tm
-(a) Tj
-1 0 0 1 193.92 637.44 Tm
-(133) Tj
-1 0 0 1 215.04 637.44 Tm
-(MHz) Tj
-1 0 0 1 241.68 637.44 Tm
-(Alpha) Tj
-1 0 0 1 272.039 637.44 Tm
-(21064) Tj
-1 0 0 1 72 625.44 Tm
-(processor) Tj
-1 0 0 1 110.04 625.44 Tm
-(,) Tj
-1 0 0 1 117.12 625.44 Tm
-(128) Tj
-1 0 0 1 136.32 625.44 Tm
-(MB) Tj
-1 0 0 1 156.24 625.44 Tm
-(of) Tj
-1 0 0 1 168.84 625.44 Tm
-(memory) Tj
-1 0 0 1 201.72 625.44 Tm
-(,) Tj
-1 0 0 1 208.68 625.44 Tm
-(and) Tj
-1 0 0 1 227.4 625.44 Tm
-(run) Tj
-1 0 0 1 245.04 625.44 Tm
-(Digital) Tj
-1 0 0 1 277.079 625.44 Tm
-(Unix) Tj
-1 0 0 1 72 613.44 Tm
-(v) Tj
-1 0 0 1 76.92 613.44 Tm
-(ersion) Tj
-1 0 0 1 104.28 613.44 Tm
-(4.0.) Tj
-1 0 0 1 124.56 613.44 Tm
-(The) Tj
-1 0 0 1 143.04 613.44 Tm
-(\256le) Tj
-1 0 0 1 158.88 613.44 Tm
-(system) Tj
-1 0 0 1 189.6 613.44 Tm
-(w) Tj
-1 0 0 1 196.68 613.44 Tm
-(as) Tj
-1 0 0 1 208.08 613.44 Tm
-(stored) Tj
-1 0 0 1 235.559 613.44 Tm
-(by) Tj
-1 0 0 1 248.519 613.44 Tm
-(each) Tj
-1 0 0 1 269.879 613.44 Tm
-(replica) Tj
-1 0 0 1 72 601.56 Tm
-(on) Tj
-1 0 0 1 87.7199 601.56 Tm
-(a) Tj
-1 0 0 1 97.9199 601.56 Tm
-(DEC) Tj
-1 0 0 1 123.6 601.56 Tm
-(RZ26) Tj
-1 0 0 1 152.04 601.56 Tm
-(disk.) Tj
-1 0 0 1 184.56 601.56 Tm
-(All) Tj
-1 0 0 1 203.16 601.56 Tm
-(the) Tj
-1 0 0 1 221.04 601.56 Tm
-(w) Tj
-1 0 0 1 228.12 601.56 Tm
-(orkstations) Tj
-1 0 0 1 277.679 601.56 Tm
-(were) Tj
-1 0 0 1 72 589.56 Tm
-(connected) Tj
-1 0 0 1 114.48 589.56 Tm
-(by) Tj
-1 0 0 1 126.48 589.56 Tm
-(a) Tj
-1 0 0 1 132.96 589.56 Tm
-(10Mbit/s) Tj
-1 0 0 1 171 589.56 Tm
-(switched) Tj
-1 0 0 1 208.44 589.56 Tm
-(Ethernet) Tj
-1 0 0 1 244.199 589.56 Tm
-(and) Tj
-1 0 0 1 260.639 589.56 Tm
-(had) Tj
-1 0 0 1 277.079 589.56 Tm
-(DEC) Tj
-1 0 0 1 72 577.68 Tm
-(LANCE) Tj
-1 0 0 1 109.56 577.68 Tm
-(Ethernet) Tj
-1 0 0 1 147.72 577.68 Tm
-(interf) Tj
-1 0 0 1 169.32 577.68 Tm
-(aces.) Tj
-1 0 0 1 198.12 577.68 Tm
-(The) Tj
-1 0 0 1 218.04 577.68 Tm
-(switch) Tj
-1 0 0 1 248.52 577.68 Tm
-(w) Tj
-1 0 0 1 255.6 577.68 Tm
-(as) Tj
-1 0 0 1 268.2 577.68 Tm
-(a) Tj
-1 0 0 1 277.079 577.68 Tm
-(DEC) Tj
-1 0 0 1 72 565.68 Tm
-(EtherW) Tj
-1 0 0 1 102.96 565.68 Tm
-(ORKS) Tj
-1 0 0 1 132.6 565.68 Tm
-(8T/TX.) Tj
-1 0 0 1 165.36 565.68 Tm
-(The) Tj
-1 0 0 1 183.96 565.68 Tm
-(e) Tj
-1 0 0 1 188.28 565.68 Tm
-(xperiments) Tj
-1 0 0 1 235.56 565.68 Tm
-(were) Tj
-1 0 0 1 258.12 565.68 Tm
-(run) Tj
-1 0 0 1 274.559 565.68 Tm
-(on) Tj
-1 0 0 1 287.639 565.68 Tm
-(an) Tj
-1 0 0 1 72 553.8 Tm
-(isolated) Tj
-1 0 0 1 105.48 553.8 Tm
-(netw) Tj
-1 0 0 1 124.8 553.8 Tm
-(ork.) Tj
-1 0 0 1 81.96 541.8 Tm
-(The) Tj
-1 0 0 1 101.28 541.8 Tm
-(interv) Tj
-1 0 0 1 124.44 541.8 Tm
-(al) Tj
-1 0 0 1 135.36 541.8 Tm
-(between) Tj
-1 0 0 1 172.44 541.8 Tm
-(checkpoints) Tj
-1 0 0 1 223.8 541.8 Tm
-(w) Tj
-1 0 0 1 230.88 541.8 Tm
-(as) Tj
-1 0 0 1 243.12 541.8 Tm
-(128) Tj
-1 0 0 1 261.839 541.8 Tm
-(requests,) Tj
-1 0 0 1 72 529.92 Tm
-(which) Tj
-1 0 0 1 98.4 529.92 Tm
-(causes) Tj
-1 0 0 1 126.6 529.92 Tm
-(garbage) Tj
-1 0 0 1 160.2 529.92 Tm
-(collection) Tj
-1 0 0 1 201.6 529.92 Tm
-(to) Tj
-1 0 0 1 211.44 529.92 Tm
-(occur) Tj
-1 0 0 1 235.68 529.92 Tm
-(se) Tj
-1 0 0 1 243.72 529.92 Tm
-(v) Tj
-1 0 0 1 248.639 529.92 Tm
-(eral) Tj
-1 0 0 1 265.559 529.92 Tm
-(times) Tj
-1 0 0 1 289.199 529.92 Tm
-(in) Tj
-1 0 0 1 72 517.92 Tm
-(an) Tj
-1 0 0 1 81.36 517.92 Tm
-(y) Tj
-1 0 0 1 88.4399 517.92 Tm
-(of) Tj
-1 0 0 1 98.8799 517.92 Tm
-(the) Tj
-1 0 0 1 113.16 517.92 Tm
-(e) Tj
-1 0 0 1 117.48 517.92 Tm
-(xperiments.) Tj
-1 0 0 1 167.64 517.92 Tm
-(The) Tj
-1 0 0 1 185.28 517.92 Tm
-(maximum) Tj
-1 0 0 1 227.88 517.92 Tm
-(sequence) Tj
-1 0 0 1 266.519 517.92 Tm
-(number) Tj
-1 0 0 1 72 506.04 Tm
-(accepted) Tj
-1 0 0 1 110.76 506.04 Tm
-(by) Tj
-1 0 0 1 124.68 506.04 Tm
-(replicas) Tj
-1 0 0 1 159.6 506.04 Tm
-(in) Tj
-1 0 0 1 171.36 506.04 Tm
-(pre-prepare) Tj
-1 0 0 1 221.16 506.04 Tm
-(messages) Tj
-1 0 0 1 262.679 506.04 Tm
-(w) Tj
-1 0 0 1 269.759 506.04 Tm
-(as) Tj
-1 0 0 1 281.999 506.04 Tm
-(256) Tj
-1 0 0 1 72 494.04 Tm
-(plus) Tj
-1 0 0 1 91.0799 494.04 Tm
-(the) Tj
-1 0 0 1 105.72 494.04 Tm
-(sequence) Tj
-1 0 0 1 144.72 494.04 Tm
-(number) Tj
-1 0 0 1 177.72 494.04 Tm
-(of) Tj
-1 0 0 1 188.52 494.04 Tm
-(the) Tj
-1 0 0 1 203.16 494.04 Tm
-(last) Tj
-1 0 0 1 219.48 494.04 Tm
-(stable) Tj
-1 0 0 1 245.159 494.04 Tm
-(checkpoint.) Tj
-ET
-endstream
-endobj
-717 0 obj
-6532
-endobj
-718 0 obj
-<< /Type /Font /Name /R718 /Subtype /Type1 /BaseFont /Times-Bold >>
-endobj
-719 0 obj
-<< /Length 720 0 R >>
-stream
-BT
-/R718 10 Tf
-1 0 0 1 72 474 Tm
-(7.2) Tj
-1 0 0 1 94.4399 474 Tm
-(Micr) Tj
-1 0 0 1 115.32 474 Tm
-(o-Benchmark) Tj
-/R715 10 Tf
-1 0 0 1 72 459.84 Tm
-(The) Tj
-1 0 0 1 91.9199 459.84 Tm
-(micro-benchmark) Tj
-1 0 0 1 167.16 459.84 Tm
-(measures) Tj
-1 0 0 1 208.68 459.84 Tm
-(the) Tj
-1 0 0 1 225.36 459.84 Tm
-(latenc) Tj
-1 0 0 1 249.12 459.84 Tm
-(y) Tj
-1 0 0 1 258.36 459.84 Tm
-(to) Tj
-1 0 0 1 270.599 459.84 Tm
-(in) Tj
-1 0 0 1 278.039 459.84 Tm
-(v) Tj
-1 0 0 1 282.839 459.84 Tm
-(ok) Tj
-1 0 0 1 292.799 459.84 Tm
-(e) Tj
-1 0 0 1 72 447.96 Tm
-(a) Tj
-1 0 0 1 80.5199 447.96 Tm
-(null) Tj
-1 0 0 1 100.08 447.96 Tm
-(operation.) Tj
-1 0 0 1 148.44 447.96 Tm
-(It) Tj
-1 0 0 1 158.52 447.96 Tm
-(e) Tj
-1 0 0 1 162.72 447.96 Tm
-(v) Tj
-1 0 0 1 167.52 447.96 Tm
-(aluates) Tj
-1 0 0 1 199.2 447.96 Tm
-(the) Tj
-1 0 0 1 215.4 447.96 Tm
-(performance) Tj
-1 0 0 1 269.759 447.96 Tm
-(of) Tj
-1 0 0 1 282.119 447.96 Tm
-(tw) Tj
-1 0 0 1 291.959 447.96 Tm
-(o) Tj
-1 0 0 1 72 435.96 Tm
-(implementations) Tj
-1 0 0 1 142.2 435.96 Tm
-(of) Tj
-1 0 0 1 154.32 435.96 Tm
-(a) Tj
-1 0 0 1 162.48 435.96 Tm
-(simple) Tj
-1 0 0 1 192.84 435.96 Tm
-(service) Tj
-1 0 0 1 224.76 435.96 Tm
-(with) Tj
-1 0 0 1 246.24 435.96 Tm
-(no) Tj
-1 0 0 1 260.039 435.96 Tm
-(state) Tj
-1 0 0 1 281.999 435.96 Tm
-(that) Tj
-1 0 0 1 72 423.96 Tm
-(implements) Tj
-1 0 0 1 122.16 423.96 Tm
-(null) Tj
-1 0 0 1 141.36 423.96 Tm
-(operations) Tj
-1 0 0 1 186.48 423.96 Tm
-(with) Tj
-1 0 0 1 207.96 423.96 Tm
-(ar) Tj
-1 0 0 1 215.64 423.96 Tm
-(guments) Tj
-1 0 0 1 252.959 423.96 Tm
-(and) Tj
-1 0 0 1 270.959 423.96 Tm
-(results) Tj
-1 0 0 1 72 412.08 Tm
-(of) Tj
-1 0 0 1 83.04 412.08 Tm
-(dif) Tj
-1 0 0 1 93.9599 412.08 Tm
-(ferent) Tj
-1 0 0 1 120 412.08 Tm
-(sizes.) Tj
-1 0 0 1 146.28 412.08 Tm
-(The) Tj
-1 0 0 1 164.64 412.08 Tm
-(\256rst) Tj
-1 0 0 1 182.88 412.08 Tm
-(implementation) Tj
-1 0 0 1 248.279 412.08 Tm
-(is) Tj
-1 0 0 1 257.759 412.08 Tm
-(replicated) Tj
-1 0 0 1 72 400.08 Tm
-(using) Tj
-1 0 0 1 98.5199 400.08 Tm
-(our) Tj
-1 0 0 1 116.64 400.08 Tm
-(library) Tj
-1 0 0 1 148.08 400.08 Tm
-(and) Tj
-1 0 0 1 167.4 400.08 Tm
-(the) Tj
-1 0 0 1 184.44 400.08 Tm
-(second) Tj
-1 0 0 1 216.959 400.08 Tm
-(is) Tj
-1 0 0 1 228.479 400.08 Tm
-(unreplicated) Tj
-1 0 0 1 282.599 400.08 Tm
-(and) Tj
-1 0 0 1 72 388.2 Tm
-(uses) Tj
-1 0 0 1 92.7599 388.2 Tm
-(UDP) Tj
-1 0 0 1 116.4 388.2 Tm
-(directly) Tj
-1 0 0 1 146.4 388.2 Tm
-(.) Tj
-1 0 0 1 155.64 388.2 Tm
-(T) Tj
-1 0 0 1 160.92 388.2 Tm
-(able) Tj
-1 0 0 1 181.2 388.2 Tm
-(1) Tj
-1 0 0 1 189.84 388.2 Tm
-(reports) Tj
-1 0 0 1 221.159 388.2 Tm
-(the) Tj
-1 0 0 1 236.879 388.2 Tm
-(response) Tj
-1 0 0 1 275.399 388.2 Tm
-(times) Tj
-1 0 0 1 72 376.2 Tm
-(measured) Tj
-1 0 0 1 115.56 376.2 Tm
-(at) Tj
-1 0 0 1 128.16 376.2 Tm
-(the) Tj
-1 0 0 1 145.68 376.2 Tm
-(client) Tj
-1 0 0 1 173.16 376.2 Tm
-(for) Tj
-1 0 0 1 190.2 376.2 Tm
-(both) Tj
-1 0 0 1 213.24 376.2 Tm
-(read-only) Tj
-1 0 0 1 256.799 376.2 Tm
-(and) Tj
-1 0 0 1 276.479 376.2 Tm
-(read-) Tj
-1 0 0 1 72 364.32 Tm
-(write) Tj
-1 0 0 1 95.5199 364.32 Tm
-(operations.) Tj
-1 0 0 1 144.6 364.32 Tm
-(The) Tj
-1 0 0 1 160.08 364.32 Tm
-(y) Tj
-1 0 0 1 167.88 364.32 Tm
-(were) Tj
-1 0 0 1 190.32 364.32 Tm
-(obtained) Tj
-1 0 0 1 227.639 364.32 Tm
-(by) Tj
-1 0 0 1 240.599 364.32 Tm
-(timing) Tj
-1 0 0 1 269.639 364.32 Tm
-(10,000) Tj
-1 0 0 1 72 352.32 Tm
-(operation) Tj
-1 0 0 1 111.48 352.32 Tm
-(in) Tj
-1 0 0 1 118.92 352.32 Tm
-(v) Tj
-1 0 0 1 123.72 352.32 Tm
-(ocations) Tj
-1 0 0 1 158.64 352.32 Tm
-(in) Tj
-1 0 0 1 168.24 352.32 Tm
-(three) Tj
-1 0 0 1 190.08 352.32 Tm
-(separate) Tj
-1 0 0 1 224.519 352.32 Tm
-(runs) Tj
-1 0 0 1 243.479 352.32 Tm
-(and) Tj
-1 0 0 1 259.799 352.32 Tm
-(we) Tj
-1 0 0 1 273.239 352.32 Tm
-(report) Tj
-1 0 0 1 72 340.44 Tm
-(the) Tj
-1 0 0 1 89.1599 340.44 Tm
-(median) Tj
-1 0 0 1 123.48 340.44 Tm
-(v) Tj
-1 0 0 1 128.28 340.44 Tm
-(alue) Tj
-1 0 0 1 149.88 340.44 Tm
-(of) Tj
-1 0 0 1 163.2 340.44 Tm
-(the) Tj
-1 0 0 1 180.36 340.44 Tm
-(three) Tj
-1 0 0 1 205.32 340.44 Tm
-(runs.) Tj
-1 0 0 1 236.04 340.44 Tm
-(The) Tj
-1 0 0 1 256.56 340.44 Tm
-(maximum) Tj
-1 0 0 1 72 328.44 Tm
-(de) Tj
-1 0 0 1 81.24 328.44 Tm
-(viation) Tj
-1 0 0 1 112.8 328.44 Tm
-(from) Tj
-1 0 0 1 136.08 328.44 Tm
-(the) Tj
-1 0 0 1 152.16 328.44 Tm
-(median) Tj
-1 0 0 1 185.4 328.44 Tm
-(w) Tj
-1 0 0 1 192.48 328.44 Tm
-(as) Tj
-1 0 0 1 204.6 328.44 Tm
-(al) Tj
-1 0 0 1 211.68 328.44 Tm
-(w) Tj
-1 0 0 1 218.76 328.44 Tm
-(ays) Tj
-1 0 0 1 236.04 328.44 Tm
-(belo) Tj
-1 0 0 1 253.08 328.44 Tm
-(w) Tj
-1 0 0 1 264 328.44 Tm
-(0.3%) Tj
-1 0 0 1 288.719 328.44 Tm
-(of) Tj
-1 0 0 1 72 316.56 Tm
-(the) Tj
-1 0 0 1 88.0799 316.56 Tm
-(reported) Tj
-1 0 0 1 125.16 316.56 Tm
-(v) Tj
-1 0 0 1 129.96 316.56 Tm
-(alue.) Tj
-1 0 0 1 156.84 316.56 Tm
-(W) Tj
-1 0 0 1 165.36 316.56 Tm
-(e) Tj
-1 0 0 1 173.76 316.56 Tm
-(denote) Tj
-1 0 0 1 204.24 316.56 Tm
-(each) Tj
-1 0 0 1 226.44 316.56 Tm
-(operation) Tj
-1 0 0 1 267.959 316.56 Tm
-(by) Tj
-ET
-endstream
-endobj
-720 0 obj
-4750
-endobj
-721 0 obj
-<< /Type /Font /Name /R721 /Subtype /Type1 /BaseFont /Times-Italic >>
-endobj
-722 0 obj
-<< /Length 723 0 R >>
-stream
-BT
-/R721 10 Tf
-1 0 0 1 281.759 316.56 Tm
-(a/b) Tj
-/R715 10 Tf
-1 0 0 1 294.599 316.56 Tm
-(,) Tj
-1 0 0 1 72 304.56 Tm
-(where) Tj
-/R721 10 Tf
-1 0 0 1 98.4 304.56 Tm
-(a) Tj
-/R715 10 Tf
-1 0 0 1 105.48 304.56 Tm
-(and) Tj
-/R721 10 Tf
-1 0 0 1 121.92 304.56 Tm
-(b) Tj
-/R715 10 Tf
-1 0 0 1 128.88 304.56 Tm
-(are) Tj
-1 0 0 1 143.16 304.56 Tm
-(the) Tj
-1 0 0 1 157.44 304.56 Tm
-(sizes) Tj
-1 0 0 1 178.8 304.56 Tm
-(of) Tj
-1 0 0 1 189.12 304.56 Tm
-(the) Tj
-1 0 0 1 203.4 304.56 Tm
-(operation) Tj
-1 0 0 1 243.119 304.56 Tm
-(ar) Tj
-1 0 0 1 250.799 304.56 Tm
-(gument) Tj
-1 0 0 1 282.599 304.56 Tm
-(and) Tj
-1 0 0 1 72 292.68 Tm
-(result) Tj
-1 0 0 1 96.5999 292.68 Tm
-(in) Tj
-1 0 0 1 106.92 292.68 Tm
-(KBytes.) Tj
-ET
-Q
-q
-W
-0 0 612 792 re
-n
-q
-204.6 0 0 -0.48 82.188 281.892 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 81.948 281.532 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-/R715 9 Tf
-1 0 0 1 88.2 273.72 Tm
-(ar) Tj
-1 0 0 1 95.0399 273.72 Tm
-(g./res.) Tj
-ET
-q
-0.48 0 0 -11.04 122.748 281.532 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 122.748 281.532 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 162 273.72 Tm
-(replicated) Tj
-ET
-q
-0.48 0 0 -11.04 236.268 281.532 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 247.92 273.72 Tm
-(without) Tj
-ET
-q
-0.48 0 0 -11.04 286.548 281.532 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-113.64 0 0 -0.48 122.868 270.612 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 81.948 270.612 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 93.36 262.8 Tm
-(\(KB\)) Tj
-ET
-q
-0.48 0 0 -11.04 122.748 270.612 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 135.12 262.8 Tm
-(read-write) Tj
-ET
-q
-0.48 0 0 -11.04 183.948 270.612 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 193.08 262.8 Tm
-(read-only) Tj
-ET
-q
-0.48 0 0 -11.04 236.268 270.612 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 242.4 262.8 Tm
-(replication) Tj
-ET
-q
-0.48 0 0 -11.04 286.548 270.612 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-204.6 0 0 -0.48 82.188 259.572 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 81.948 259.212 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 96.84 251.4 Tm
-(0/0) Tj
-ET
-q
-0.48 0 0 -11.04 122.748 259.212 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 131.16 251.4 Tm
-(3.35) Tj
-1 0 0 1 149.04 251.4 Tm
-(\(309%\)) Tj
-ET
-q
-0.48 0 0 -11.04 183.948 259.212 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 190.2 251.4 Tm
-(1.62) Tj
-1 0 0 1 208.08 251.4 Tm
-(\(98%\)) Tj
-ET
-q
-0.48 0 0 -11.04 236.268 259.212 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 253.8 251.4 Tm
-(0.82) Tj
-ET
-q
-0.48 0 0 -11.04 286.548 259.212 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 81.948 248.292 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 96.84 240.48 Tm
-(4/0) Tj
-ET
-q
-0.48 0 0 -11.04 122.748 248.292 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 128.88 240.48 Tm
-(14.19) Tj
-1 0 0 1 151.32 240.48 Tm
-(\(207%\)) Tj
-ET
-q
-0.48 0 0 -11.04 183.948 248.292 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 190.2 240.48 Tm
-(6.98) Tj
-1 0 0 1 208.08 240.48 Tm
-(\(51%\)) Tj
-ET
-q
-0.48 0 0 -11.04 236.268 248.292 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 253.8 240.48 Tm
-(4.62) Tj
-ET
-q
-0.48 0 0 -11.04 286.548 248.292 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 81.948 237.252 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 96.84 229.56 Tm
-(0/4) Tj
-ET
-q
-0.48 0 0 -11.04 122.748 237.252 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 133.32 229.56 Tm
-(8.01) Tj
-1 0 0 1 151.32 229.56 Tm
-(\(72%\)) Tj
-ET
-q
-0.48 0 0 -11.04 183.948 237.252 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 190.2 229.56 Tm
-(5.94) Tj
-1 0 0 1 208.08 229.56 Tm
-(\(27%\)) Tj
-ET
-q
-0.48 0 0 -11.04 236.268 237.252 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 253.8 229.56 Tm
-(4.66) Tj
-ET
-q
-0.48 0 0 -11.04 286.548 237.252 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-204.6 0 0 -0.48 82.188 226.332 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-/R715 10 Tf
-1 0 0 1 72 212.4 Tm
-(T) Tj
-1 0 0 1 77.28 212.4 Tm
-(able) Tj
-1 0 0 1 96.5999 212.4 Tm
-(1:) Tj
-1 0 0 1 108.36 212.4 Tm
-(Micro-benchmark) Tj
-1 0 0 1 183 212.4 Tm
-(results) Tj
-1 0 0 1 211.8 212.4 Tm
-(\(in) Tj
-1 0 0 1 225.599 212.4 Tm
-(milliseconds\);) Tj
-1 0 0 1 284.879 212.4 Tm
-(the) Tj
-1 0 0 1 72 200.4 Tm
-(percentage) Tj
-1 0 0 1 117.6 200.4 Tm
-(o) Tj
-1 0 0 1 122.52 200.4 Tm
-(v) Tj
-1 0 0 1 127.44 200.4 Tm
-(erhead) Tj
-1 0 0 1 156.36 200.4 Tm
-(is) Tj
-1 0 0 1 165.48 200.4 Tm
-(relati) Tj
-1 0 0 1 185.76 200.4 Tm
-(v) Tj
-1 0 0 1 190.68 200.4 Tm
-(e) Tj
-1 0 0 1 197.4 200.4 Tm
-(to) Tj
-1 0 0 1 207.719 200.4 Tm
-(the) Tj
-1 0 0 1 222.359 200.4 Tm
-(unreplicated) Tj
-1 0 0 1 274.079 200.4 Tm
-(case.) Tj
-1 0 0 1 81.96 178.44 Tm
-(The) Tj
-1 0 0 1 100.68 178.44 Tm
-(o) Tj
-1 0 0 1 105.6 178.44 Tm
-(v) Tj
-1 0 0 1 110.52 178.44 Tm
-(erhead) Tj
-1 0 0 1 140.16 178.44 Tm
-(introduced) Tj
-1 0 0 1 186 178.44 Tm
-(by) Tj
-1 0 0 1 199.2 178.44 Tm
-(the) Tj
-1 0 0 1 214.68 178.44 Tm
-(replication) Tj
-1 0 0 1 260.519 178.44 Tm
-(library) Tj
-1 0 0 1 290.399 178.44 Tm
-(is) Tj
-1 0 0 1 72 166.56 Tm
-(due) Tj
-1 0 0 1 88.44 166.56 Tm
-(to) Tj
-1 0 0 1 98.2799 166.56 Tm
-(e) Tj
-1 0 0 1 102.6 166.56 Tm
-(xtra) Tj
-1 0 0 1 120.12 166.56 Tm
-(computation) Tj
-1 0 0 1 172.08 166.56 Tm
-(and) Tj
-1 0 0 1 188.52 166.56 Tm
-(communication.) Tj
-1 0 0 1 256.44 166.56 Tm
-(F) Tj
-1 0 0 1 261.839 166.56 Tm
-(or) Tj
-1 0 0 1 272.279 166.56 Tm
-(e) Tj
-1 0 0 1 276.599 166.56 Tm
-(xam-) Tj
-1 0 0 1 72 154.56 Tm
-(ple,) Tj
-1 0 0 1 89.3999 154.56 Tm
-(the) Tj
-1 0 0 1 104.28 154.56 Tm
-(computation) Tj
-1 0 0 1 156.72 154.56 Tm
-(o) Tj
-1 0 0 1 161.64 154.56 Tm
-(v) Tj
-1 0 0 1 166.56 154.56 Tm
-(erhead) Tj
-1 0 0 1 195.6 154.56 Tm
-(for) Tj
-1 0 0 1 209.88 154.56 Tm
-(the) Tj
-1 0 0 1 224.759 154.56 Tm
-(read-write) Tj
-1 0 0 1 268.319 154.56 Tm
-(0/0) Tj
-1 0 0 1 283.679 154.56 Tm
-(op-) Tj
-1 0 0 1 72 142.68 Tm
-(eration) Tj
-1 0 0 1 102.12 142.68 Tm
-(is) Tj
-1 0 0 1 111.36 142.68 Tm
-(approximately) Tj
-1 0 0 1 171.36 142.68 Tm
-(1.06ms,) Tj
-1 0 0 1 205.44 142.68 Tm
-(which) Tj
-1 0 0 1 232.2 142.68 Tm
-(includes) Tj
-1 0 0 1 267.959 142.68 Tm
-(0.55ms) Tj
-1 0 0 1 72 130.68 Tm
-(spent) Tj
-1 0 0 1 96.3599 130.68 Tm
-(e) Tj
-1 0 0 1 100.68 130.68 Tm
-(x) Tj
-1 0 0 1 105.6 130.68 Tm
-(ecuting) Tj
-1 0 0 1 138.24 130.68 Tm
-(cryptographic) Tj
-1 0 0 1 196.92 130.68 Tm
-(operations.) Tj
-1 0 0 1 247.199 130.68 Tm
-(The) Tj
-1 0 0 1 266.039 130.68 Tm
-(remain-) Tj
-1 0 0 1 72 118.8 Tm
-(ing) Tj
-1 0 0 1 87.2399 118.8 Tm
-(1.47ms) Tj
-1 0 0 1 118.8 118.8 Tm
-(of) Tj
-1 0 0 1 129.6 118.8 Tm
-(o) Tj
-1 0 0 1 134.52 118.8 Tm
-(v) Tj
-1 0 0 1 139.44 118.8 Tm
-(erhead) Tj
-1 0 0 1 168.24 118.8 Tm
-(are) Tj
-1 0 0 1 182.88 118.8 Tm
-(due) Tj
-1 0 0 1 199.8 118.8 Tm
-(to) Tj
-1 0 0 1 210 118.8 Tm
-(e) Tj
-1 0 0 1 214.32 118.8 Tm
-(xtra) Tj
-1 0 0 1 232.199 118.8 Tm
-(communication;) Tj
-1 0 0 1 72 106.8 Tm
-(the) Tj
-1 0 0 1 86.0399 106.8 Tm
-(replication) Tj
-1 0 0 1 130.44 106.8 Tm
-(library) Tj
-1 0 0 1 158.76 106.8 Tm
-(introduces) Tj
-1 0 0 1 202.079 106.8 Tm
-(an) Tj
-1 0 0 1 213.359 106.8 Tm
-(e) Tj
-1 0 0 1 217.679 106.8 Tm
-(xtra) Tj
-1 0 0 1 234.839 106.8 Tm
-(message) Tj
-1 0 0 1 270.479 106.8 Tm
-(round-) Tj
-1 0 0 1 72 94.92 Tm
-(trip,) Tj
-1 0 0 1 90.4799 94.92 Tm
-(it) Tj
-1 0 0 1 98.0399 94.92 Tm
-(sends) Tj
-1 0 0 1 122.28 94.92 Tm
-(lar) Tj
-1 0 0 1 132.72 94.92 Tm
-(ger) Tj
-1 0 0 1 147.36 94.92 Tm
-(messages,) Tj
-1 0 0 1 189.72 94.92 Tm
-(and) Tj
-1 0 0 1 206.16 94.92 Tm
-(it) Tj
-1 0 0 1 213.72 94.92 Tm
-(increases) Tj
-1 0 0 1 252.359 94.92 Tm
-(the) Tj
-1 0 0 1 266.519 94.92 Tm
-(number) Tj
-1 0 0 1 72 82.92 Tm
-(of) Tj
-1 0 0 1 82.56 82.92 Tm
-(messages) Tj
-1 0 0 1 122.52 82.92 Tm
-(recei) Tj
-1 0 0 1 141.72 82.92 Tm
-(v) Tj
-1 0 0 1 146.64 82.92 Tm
-(ed) Tj
-1 0 0 1 158.16 82.92 Tm
-(by) Tj
-1 0 0 1 170.4 82.92 Tm
-(each) Tj
-1 0 0 1 190.92 82.92 Tm
-(node) Tj
-1 0 0 1 212.52 82.92 Tm
-(relati) Tj
-1 0 0 1 232.8 82.92 Tm
-(v) Tj
-1 0 0 1 237.72 82.92 Tm
-(e) Tj
-1 0 0 1 244.319 82.92 Tm
-(to) Tj
-1 0 0 1 254.279 82.92 Tm
-(the) Tj
-1 0 0 1 268.799 82.92 Tm
-(service) Tj
-1 0 0 1 72 71.04 Tm
-(without) Tj
-1 0 0 1 104.88 71.04 Tm
-(replication.) Tj
-1 0 0 1 324.96 709.08 Tm
-(The) Tj
-1 0 0 1 343.2 709.08 Tm
-(o) Tj
-1 0 0 1 348.12 709.08 Tm
-(v) Tj
-1 0 0 1 353.04 709.08 Tm
-(erhead) Tj
-1 0 0 1 382.08 709.08 Tm
-(for) Tj
-1 0 0 1 396.36 709.08 Tm
-(read-only) Tj
-1 0 0 1 437.16 709.08 Tm
-(operations) Tj
-1 0 0 1 481.44 709.08 Tm
-(is) Tj
-1 0 0 1 490.679 709.08 Tm
-(signi\256cantly) Tj
-1 0 0 1 315 697.08 Tm
-(lo) Tj
-1 0 0 1 322.56 697.08 Tm
-(wer) Tj
-1 0 0 1 340.32 697.08 Tm
-(because) Tj
-1 0 0 1 374.76 697.08 Tm
-(the) Tj
-1 0 0 1 389.76 697.08 Tm
-(optimization) Tj
-1 0 0 1 443.04 697.08 Tm
-(discussed) Tj
-1 0 0 1 484.079 697.08 Tm
-(in) Tj
-1 0 0 1 494.759 697.08 Tm
-(Section) Tj
-1 0 0 1 527.519 697.08 Tm
-(5.1) Tj
-1 0 0 1 315 685.2 Tm
-(reduces) Tj
-1 0 0 1 347.16 685.2 Tm
-(both) Tj
-1 0 0 1 366.6 685.2 Tm
-(computation) Tj
-1 0 0 1 418.32 685.2 Tm
-(and) Tj
-1 0 0 1 434.4 685.2 Tm
-(commu) Tj
-1 0 0 1 464.4 685.2 Tm
-(nica) Tj
-1 0 0 1 480.959 685.2 Tm
-(tion) Tj
-1 0 0 1 498.119 685.2 Tm
-(o) Tj
-1 0 0 1 502.919 685.2 Tm
-(v) Tj
-1 0 0 1 507.839 685.2 Tm
-(er) Tj
-1 0 0 1 515.519 685.2 Tm
-(hea) Tj
-1 0 0 1 529.319 685.2 Tm
-(ds.) Tj
-1 0 0 1 315 673.2 Tm
-(F) Tj
-1 0 0 1 320.4 673.2 Tm
-(or) Tj
-1 0 0 1 330.84 673.2 Tm
-(e) Tj
-1 0 0 1 335.16 673.2 Tm
-(xample,) Tj
-1 0 0 1 369.12 673.2 Tm
-(the) Tj
-1 0 0 1 383.4 673.2 Tm
-(computation) Tj
-1 0 0 1 435.36 673.2 Tm
-(o) Tj
-1 0 0 1 440.28 673.2 Tm
-(v) Tj
-1 0 0 1 445.2 673.2 Tm
-(erhead) Tj
-1 0 0 1 473.759 673.2 Tm
-(for) Tj
-1 0 0 1 487.559 673.2 Tm
-(the) Tj
-1 0 0 1 501.839 673.2 Tm
-(read-only) Tj
-1 0 0 1 315 661.32 Tm
-(0/0) Tj
-1 0 0 1 331.2 661.32 Tm
-(operation) Tj
-1 0 0 1 372.36 661.32 Tm
-(is) Tj
-1 0 0 1 382.56 661.32 Tm
-(approximately) Tj
-1 0 0 1 443.64 661.32 Tm
-(0.43ms,) Tj
-1 0 0 1 478.92 661.32 Tm
-(which) Tj
-1 0 0 1 506.759 661.32 Tm
-(includes) Tj
-1 0 0 1 315 649.32 Tm
-(0.23ms) Tj
-1 0 0 1 348.48 649.32 Tm
-(spent) Tj
-1 0 0 1 374.04 649.32 Tm
-(e) Tj
-1 0 0 1 378.36 649.32 Tm
-(x) Tj
-1 0 0 1 383.28 649.32 Tm
-(ecuting) Tj
-1 0 0 1 416.88 649.32 Tm
-(cryptographic) Tj
-1 0 0 1 476.64 649.32 Tm
-(operations,) Tj
-1 0 0 1 525.599 649.32 Tm
-(and) Tj
-1 0 0 1 315 637.44 Tm
-(the) Tj
-1 0 0 1 329.64 637.44 Tm
-(communication) Tj
-1 0 0 1 394.2 637.44 Tm
-(o) Tj
-1 0 0 1 399.12 637.44 Tm
-(v) Tj
-1 0 0 1 404.04 637.44 Tm
-(erhead) Tj
-1 0 0 1 432.84 637.44 Tm
-(is) Tj
-1 0 0 1 442.08 637.44 Tm
-(only) Tj
-1 0 0 1 462.24 637.44 Tm
-(0.37ms) Tj
-1 0 0 1 493.8 637.44 Tm
-(because) Tj
-1 0 0 1 527.879 637.44 Tm
-(the) Tj
-1 0 0 1 315 625.44 Tm
-(protocol) Tj
-1 0 0 1 352.32 625.44 Tm
-(to) Tj
-1 0 0 1 364.2 625.44 Tm
-(e) Tj
-1 0 0 1 368.52 625.44 Tm
-(x) Tj
-1 0 0 1 373.44 625.44 Tm
-(ecute) Tj
-1 0 0 1 398.4 625.44 Tm
-(read-only) Tj
-1 0 0 1 440.76 625.44 Tm
-(operations) Tj
-1 0 0 1 486.359 625.44 Tm
-(uses) Tj
-1 0 0 1 507.599 625.44 Tm
-(a) Tj
-1 0 0 1 516.239 625.44 Tm
-(single) Tj
-1 0 0 1 315 613.44 Tm
-(round-trip.) Tj
-1 0 0 1 324.96 599.88 Tm
-(T) Tj
-1 0 0 1 330.24 599.88 Tm
-(able) Tj
-1 0 0 1 350.16 599.88 Tm
-(1) Tj
-1 0 0 1 358.44 599.88 Tm
-(sho) Tj
-1 0 0 1 372.12 599.88 Tm
-(ws) Tj
-1 0 0 1 386.52 599.88 Tm
-(that) Tj
-1 0 0 1 404.76 599.88 Tm
-(the) Tj
-1 0 0 1 420.24 599.88 Tm
-(relati) Tj
-1 0 0 1 440.52 599.88 Tm
-(v) Tj
-1 0 0 1 445.44 599.88 Tm
-(e) Tj
-1 0 0 1 453.119 599.88 Tm
-(o) Tj
-1 0 0 1 458.039 599.88 Tm
-(v) Tj
-1 0 0 1 462.959 599.88 Tm
-(erhead) Tj
-1 0 0 1 492.599 599.88 Tm
-(is) Tj
-1 0 0 1 502.559 599.88 Tm
-(lo) Tj
-1 0 0 1 510.119 599.88 Tm
-(wer) Tj
-1 0 0 1 528.359 599.88 Tm
-(for) Tj
-1 0 0 1 315 587.88 Tm
-(the) Tj
-1 0 0 1 330 587.88 Tm
-(4/0) Tj
-1 0 0 1 345.6 587.88 Tm
-(and) Tj
-1 0 0 1 362.76 587.88 Tm
-(0/4) Tj
-1 0 0 1 378.36 587.88 Tm
-(operations.) Tj
-1 0 0 1 426.84 587.88 Tm
-(This) Tj
-1 0 0 1 447.48 587.88 Tm
-(is) Tj
-1 0 0 1 456.84 587.88 Tm
-(because) Tj
-1 0 0 1 491.279 587.88 Tm
-(a) Tj
-1 0 0 1 498.479 587.88 Tm
-(signi\256cant) Tj
-1 0 0 1 315 576 Tm
-(fraction) Tj
-1 0 0 1 350.28 576 Tm
-(of) Tj
-1 0 0 1 362.88 576 Tm
-(the) Tj
-1 0 0 1 379.32 576 Tm
-(o) Tj
-1 0 0 1 384.24 576 Tm
-(v) Tj
-1 0 0 1 389.16 576 Tm
-(erhead) Tj
-1 0 0 1 419.76 576 Tm
-(introduced) Tj
-1 0 0 1 466.679 576 Tm
-(by) Tj
-1 0 0 1 480.959 576 Tm
-(the) Tj
-1 0 0 1 497.399 576 Tm
-(replication) Tj
-1 0 0 1 315 564 Tm
-(library) Tj
-1 0 0 1 344.04 564 Tm
-(is) Tj
-1 0 0 1 353.16 564 Tm
-(independent) Tj
-1 0 0 1 404.4 564 Tm
-(of) Tj
-1 0 0 1 415.2 564 Tm
-(the) Tj
-1 0 0 1 429.84 564 Tm
-(size) Tj
-1 0 0 1 447.719 564 Tm
-(of) Tj
-1 0 0 1 458.519 564 Tm
-(operation) Tj
-1 0 0 1 498.719 564 Tm
-(ar) Tj
-1 0 0 1 506.399 564 Tm
-(guments) Tj
-1 0 0 1 315 552.12 Tm
-(and) Tj
-1 0 0 1 331.56 552.12 Tm
-(results.) Tj
-1 0 0 1 363.48 552.12 Tm
-(F) Tj
-1 0 0 1 368.88 552.12 Tm
-(or) Tj
-1 0 0 1 379.32 552.12 Tm
-(e) Tj
-1 0 0 1 383.64 552.12 Tm
-(xample,) Tj
-1 0 0 1 417.72 552.12 Tm
-(in) Tj
-1 0 0 1 427.56 552.12 Tm
-(the) Tj
-1 0 0 1 441.96 552.12 Tm
-(read-write) Tj
-1 0 0 1 485.039 552.12 Tm
-(0/4) Tj
-1 0 0 1 499.919 552.12 Tm
-(operation,) Tj
-1 0 0 1 315 540.12 Tm
-(the) Tj
-1 0 0 1 332.16 540.12 Tm
-(lar) Tj
-1 0 0 1 342.6 540.12 Tm
-(ge) Tj
-1 0 0 1 356.88 540.12 Tm
-(message) Tj
-1 0 0 1 395.52 540.12 Tm
-(\(the) Tj
-1 0 0 1 416.04 540.12 Tm
-(reply\)) Tj
-1 0 0 1 444.72 540.12 Tm
-(goes) Tj
-1 0 0 1 468 540.12 Tm
-(o) Tj
-1 0 0 1 472.92 540.12 Tm
-(v) Tj
-1 0 0 1 477.84 540.12 Tm
-(er) Tj
-1 0 0 1 490.319 540.12 Tm
-(the) Tj
-1 0 0 1 507.479 540.12 Tm
-(netw) Tj
-1 0 0 1 526.799 540.12 Tm
-(ork) Tj
-1 0 0 1 315 528.24 Tm
-(only) Tj
-1 0 0 1 337.32 528.24 Tm
-(once) Tj
-1 0 0 1 360.6 528.24 Tm
-(\(as) Tj
-1 0 0 1 376.8 528.24 Tm
-(discussed) Tj
-1 0 0 1 419.52 528.24 Tm
-(in) Tj
-1 0 0 1 431.88 528.24 Tm
-(Section) Tj
-1 0 0 1 466.319 528.24 Tm
-(5.1\)) Tj
-1 0 0 1 486.599 528.24 Tm
-(and) Tj
-1 0 0 1 505.559 528.24 Tm
-(only) Tj
-1 0 0 1 527.879 528.24 Tm
-(the) Tj
-1 0 0 1 315 516.24 Tm
-(cryptographic) Tj
-1 0 0 1 373.56 516.24 Tm
-(o) Tj
-1 0 0 1 378.48 516.24 Tm
-(v) Tj
-1 0 0 1 383.4 516.24 Tm
-(erhead) Tj
-1 0 0 1 413.04 516.24 Tm
-(to) Tj
-1 0 0 1 424.08 516.24 Tm
-(process) Tj
-1 0 0 1 457.2 516.24 Tm
-(the) Tj
-1 0 0 1 472.679 516.24 Tm
-(reply) Tj
-1 0 0 1 496.319 516.24 Tm
-(message) Tj
-1 0 0 1 533.399 516.24 Tm
-(is) Tj
-1 0 0 1 315 504.36 Tm
-(increased.) Tj
-1 0 0 1 359.52 504.36 Tm
-(The) Tj
-1 0 0 1 377.76 504.36 Tm
-(o) Tj
-1 0 0 1 382.68 504.36 Tm
-(v) Tj
-1 0 0 1 387.6 504.36 Tm
-(erhead) Tj
-1 0 0 1 416.64 504.36 Tm
-(is) Tj
-1 0 0 1 426.12 504.36 Tm
-(higher) Tj
-1 0 0 1 454.319 504.36 Tm
-(for) Tj
-1 0 0 1 468.599 504.36 Tm
-(the) Tj
-1 0 0 1 483.599 504.36 Tm
-(read-write) Tj
-1 0 0 1 527.279 504.36 Tm
-(4/0) Tj
-1 0 0 1 315 492.36 Tm
-(operation) Tj
-1 0 0 1 356.16 492.36 Tm
-(because) Tj
-1 0 0 1 391.08 492.36 Tm
-(the) Tj
-1 0 0 1 406.8 492.36 Tm
-(lar) Tj
-1 0 0 1 417.24 492.36 Tm
-(ge) Tj
-1 0 0 1 429.96 492.36 Tm
-(message) Tj
-1 0 0 1 467.16 492.36 Tm
-(\(the) Tj
-1 0 0 1 486.119 492.36 Tm
-(request\)) Tj
-1 0 0 1 521.759 492.36 Tm
-(goes) Tj
-1 0 0 1 315 480.48 Tm
-(o) Tj
-1 0 0 1 319.92 480.48 Tm
-(v) Tj
-1 0 0 1 324.84 480.48 Tm
-(er) Tj
-1 0 0 1 335.64 480.48 Tm
-(the) Tj
-1 0 0 1 351.12 480.48 Tm
-(netw) Tj
-1 0 0 1 370.44 480.48 Tm
-(ork) Tj
-1 0 0 1 386.88 480.48 Tm
-(twice) Tj
-1 0 0 1 411.84 480.48 Tm
-(and) Tj
-1 0 0 1 429.48 480.48 Tm
-(increases) Tj
-1 0 0 1 469.199 480.48 Tm
-(the) Tj
-1 0 0 1 484.679 480.48 Tm
-(cryptographic) Tj
-1 0 0 1 315 468.48 Tm
-(o) Tj
-1 0 0 1 319.92 468.48 Tm
-(v) Tj
-1 0 0 1 324.84 468.48 Tm
-(erhead) Tj
-1 0 0 1 355.8 468.48 Tm
-(for) Tj
-1 0 0 1 372.12 468.48 Tm
-(processing) Tj
-1 0 0 1 419.28 468.48 Tm
-(both) Tj
-1 0 0 1 441.72 468.48 Tm
-(request) Tj
-1 0 0 1 475.079 468.48 Tm
-(and) Tj
-1 0 0 1 494.039 468.48 Tm
-(pre-prepare) Tj
-1 0 0 1 315 456.6 Tm
-(messages.) Tj
-1 0 0 1 324.96 442.92 Tm
-(It) Tj
-1 0 0 1 336.6 442.92 Tm
-(is) Tj
-1 0 0 1 348.72 442.92 Tm
-(important) Tj
-1 0 0 1 392.88 442.92 Tm
-(to) Tj
-1 0 0 1 406.2 442.92 Tm
-(note) Tj
-1 0 0 1 428.88 442.92 Tm
-(that) Tj
-1 0 0 1 449.279 442.92 Tm
-(this) Tj
-1 0 0 1 469.199 442.92 Tm
-(micro-benchmark) Tj
-1 0 0 1 315 431.04 Tm
-(represents) Tj
-1 0 0 1 360.12 431.04 Tm
-(the) Tj
-1 0 0 1 377.16 431.04 Tm
-(w) Tj
-1 0 0 1 384.24 431.04 Tm
-(orst) Tj
-1 0 0 1 403.92 431.04 Tm
-(case) Tj
-1 0 0 1 425.88 431.04 Tm
-(o) Tj
-1 0 0 1 430.8 431.04 Tm
-(v) Tj
-1 0 0 1 435.72 431.04 Tm
-(erhead) Tj
-1 0 0 1 466.799 431.04 Tm
-(for) Tj
-1 0 0 1 483.239 431.04 Tm
-(our) Tj
-1 0 0 1 501.239 431.04 Tm
-(algorithm) Tj
-1 0 0 1 315 419.04 Tm
-(because) Tj
-1 0 0 1 353.76 419.04 Tm
-(the) Tj
-1 0 0 1 373.2 419.04 Tm
-(operations) Tj
-1 0 0 1 422.04 419.04 Tm
-(perform) Tj
-1 0 0 1 461.28 419.04 Tm
-(no) Tj
-1 0 0 1 478.559 419.04 Tm
-(w) Tj
-1 0 0 1 485.639 419.04 Tm
-(ork) Tj
-1 0 0 1 506.159 419.04 Tm
-(and) Tj
-1 0 0 1 527.879 419.04 Tm
-(the) Tj
-1 0 0 1 315 407.04 Tm
-(unreplicated) Tj
-1 0 0 1 371.04 407.04 Tm
-(serv) Tj
-1 0 0 1 387.6 407.04 Tm
-(er) Tj
-1 0 0 1 401.88 407.04 Tm
-(pro) Tj
-1 0 0 1 415.2 407.04 Tm
-(vides) Tj
-1 0 0 1 442.8 407.04 Tm
-(v) Tj
-1 0 0 1 447.72 407.04 Tm
-(ery) Tj
-1 0 0 1 467.159 407.04 Tm
-(weak) Tj
-1 0 0 1 494.879 407.04 Tm
-(guarantees.) Tj
-1 0 0 1 315 395.16 Tm
-(Most) Tj
-1 0 0 1 341.04 395.16 Tm
-(services) Tj
-1 0 0 1 378.72 395.16 Tm
-(will) Tj
-1 0 0 1 399.72 395.16 Tm
-(require) Tj
-1 0 0 1 433.56 395.16 Tm
-(stronger) Tj
-1 0 0 1 471.72 395.16 Tm
-(guarantees,) Tj
-1 0 0 1 523.079 395.16 Tm
-(e.g.,) Tj
-1 0 0 1 315 383.16 Tm
-(authenticated) Tj
-1 0 0 1 371.4 383.16 Tm
-(connections,) Tj
-1 0 0 1 424.92 383.16 Tm
-(and) Tj
-1 0 0 1 442.56 383.16 Tm
-(the) Tj
-1 0 0 1 457.92 383.16 Tm
-(o) Tj
-1 0 0 1 462.84 383.16 Tm
-(v) Tj
-1 0 0 1 467.76 383.16 Tm
-(erhead) Tj
-1 0 0 1 497.399 383.16 Tm
-(introduced) Tj
-1 0 0 1 315 371.28 Tm
-(by) Tj
-1 0 0 1 326.64 371.28 Tm
-(our) Tj
-1 0 0 1 341.64 371.28 Tm
-(algorithm) Tj
-1 0 0 1 382.08 371.28 Tm
-(relati) Tj
-1 0 0 1 402.36 371.28 Tm
-(v) Tj
-1 0 0 1 407.28 371.28 Tm
-(e) Tj
-1 0 0 1 413.28 371.28 Tm
-(to) Tj
-1 0 0 1 422.64 371.28 Tm
-(a) Tj
-1 0 0 1 428.76 371.28 Tm
-(serv) Tj
-1 0 0 1 445.32 371.28 Tm
-(er) Tj
-1 0 0 1 454.679 371.28 Tm
-(that) Tj
-1 0 0 1 471.359 371.28 Tm
-(implements) Tj
-1 0 0 1 519.479 371.28 Tm
-(these) Tj
-1 0 0 1 315 359.28 Tm
-(guarantees) Tj
-1 0 0 1 361.92 359.28 Tm
-(will) Tj
-1 0 0 1 381.6 359.28 Tm
-(be) Tj
-1 0 0 1 395.28 359.28 Tm
-(lo) Tj
-1 0 0 1 402.84 359.28 Tm
-(wer) Tj
-1 0 0 1 417.24 359.28 Tm
-(.) Tj
-1 0 0 1 428.64 359.28 Tm
-(F) Tj
-1 0 0 1 434.04 359.28 Tm
-(or) Tj
-1 0 0 1 446.52 359.28 Tm
-(e) Tj
-1 0 0 1 450.84 359.28 Tm
-(xample,) Tj
-1 0 0 1 487.319 359.28 Tm
-(the) Tj
-1 0 0 1 503.759 359.28 Tm
-(o) Tj
-1 0 0 1 508.679 359.28 Tm
-(v) Tj
-1 0 0 1 513.599 359.28 Tm
-(erhead) Tj
-1 0 0 1 315 347.4 Tm
-(of) Tj
-1 0 0 1 328.2 347.4 Tm
-(the) Tj
-1 0 0 1 345.24 347.4 Tm
-(replication) Tj
-1 0 0 1 392.76 347.4 Tm
-(library) Tj
-1 0 0 1 424.2 347.4 Tm
-(relati) Tj
-1 0 0 1 444.479 347.4 Tm
-(v) Tj
-1 0 0 1 449.4 347.4 Tm
-(e) Tj
-1 0 0 1 458.64 347.4 Tm
-(to) Tj
-1 0 0 1 471.239 347.4 Tm
-(a) Tj
-1 0 0 1 480.599 347.4 Tm
-(v) Tj
-1 0 0 1 485.519 347.4 Tm
-(ersion) Tj
-1 0 0 1 514.679 347.4 Tm
-(of) Tj
-1 0 0 1 527.879 347.4 Tm
-(the) Tj
-1 0 0 1 315 335.4 Tm
-(unreplicated) Tj
-1 0 0 1 367.8 335.4 Tm
-(service) Tj
-1 0 0 1 399.48 335.4 Tm
-(that) Tj
-1 0 0 1 417.96 335.4 Tm
-(uses) Tj
-1 0 0 1 438.72 335.4 Tm
-(MA) Tj
-1 0 0 1 454.44 335.4 Tm
-(Cs) Tj
-1 0 0 1 468.359 335.4 Tm
-(for) Tj
-1 0 0 1 483.599 335.4 Tm
-(authentication) Tj
-1 0 0 1 315 323.52 Tm
-(is) Tj
-1 0 0 1 324 323.52 Tm
-(only) Tj
-1 0 0 1 343.92 323.52 Tm
-(243%) Tj
-1 0 0 1 369.48 323.52 Tm
-(for) Tj
-1 0 0 1 383.4 323.52 Tm
-(the) Tj
-1 0 0 1 397.92 323.52 Tm
-(read-write) Tj
-1 0 0 1 441.12 323.52 Tm
-(0/0) Tj
-1 0 0 1 456.24 323.52 Tm
-(operation) Tj
-1 0 0 1 496.079 323.52 Tm
-(and) Tj
-1 0 0 1 512.759 323.52 Tm
-(4%) Tj
-1 0 0 1 528.359 323.52 Tm
-(for) Tj
-1 0 0 1 315 311.52 Tm
-(the) Tj
-1 0 0 1 329.64 311.52 Tm
-(read-only) Tj
-1 0 0 1 370.32 311.52 Tm
-(4/0) Tj
-1 0 0 1 385.56 311.52 Tm
-(operation.) Tj
-1 0 0 1 324.96 297.96 Tm
-(W) Tj
-1 0 0 1 333.48 297.96 Tm
-(e) Tj
-1 0 0 1 345.24 297.96 Tm
-(can) Tj
-1 0 0 1 366.24 297.96 Tm
-(estimate) Tj
-1 0 0 1 406.68 297.96 Tm
-(a) Tj
-1 0 0 1 418.32 297.96 Tm
-(rough) Tj
-1 0 0 1 448.8 297.96 Tm
-(lo) Tj
-1 0 0 1 456.36 297.96 Tm
-(wer) Tj
-1 0 0 1 478.44 297.96 Tm
-(bound) Tj
-1 0 0 1 510.599 297.96 Tm
-(on) Tj
-1 0 0 1 527.879 297.96 Tm
-(the) Tj
-1 0 0 1 315 285.96 Tm
-(performance) Tj
-1 0 0 1 368.88 285.96 Tm
-(gain) Tj
-1 0 0 1 389.52 285.96 Tm
-(af) Tj
-1 0 0 1 397.08 285.96 Tm
-(forded) Tj
-1 0 0 1 426.6 285.96 Tm
-(by) Tj
-1 0 0 1 440.04 285.96 Tm
-(our) Tj
-1 0 0 1 456.96 285.96 Tm
-(algorithm) Tj
-1 0 0 1 499.199 285.96 Tm
-(relati) Tj
-1 0 0 1 519.479 285.96 Tm
-(v) Tj
-1 0 0 1 524.399 285.96 Tm
-(e) Tj
-1 0 0 1 532.199 285.96 Tm
-(to) Tj
-1 0 0 1 315 274.08 Tm
-(Rampart) Tj
-1 0 0 1 352.08 274.08 Tm
-([30) Tj
-1 0 0 1 365.4 274.08 Tm
-(].) Tj
-1 0 0 1 375.72 274.08 Tm
-(Reiter) Tj
-1 0 0 1 402.84 274.08 Tm
-(reports) Tj
-1 0 0 1 433.32 274.08 Tm
-(that) Tj
-1 0 0 1 450.96 274.08 Tm
-(Rampart) Tj
-1 0 0 1 488.039 274.08 Tm
-(has) Tj
-1 0 0 1 504.119 274.08 Tm
-(a) Tj
-1 0 0 1 511.319 274.08 Tm
-(latenc) Tj
-1 0 0 1 535.079 274.08 Tm
-(y) Tj
-1 0 0 1 315 262.08 Tm
-(of) Tj
-1 0 0 1 325.44 262.08 Tm
-(45ms) Tj
-1 0 0 1 349.2 262.08 Tm
-(for) Tj
-1 0 0 1 363 262.08 Tm
-(a) Tj
-1 0 0 1 369.48 262.08 Tm
-(multi-RPC) Tj
-1 0 0 1 414.84 262.08 Tm
-(of) Tj
-1 0 0 1 425.28 262.08 Tm
-(a) Tj
-1 0 0 1 431.88 262.08 Tm
-(null) Tj
-1 0 0 1 449.519 262.08 Tm
-(message) Tj
-1 0 0 1 485.399 262.08 Tm
-(in) Tj
-1 0 0 1 495.359 262.08 Tm
-(a) Tj
-1 0 0 1 501.839 262.08 Tm
-(10) Tj
-1 0 0 1 513.959 262.08 Tm
-(Mbit/s) Tj
-1 0 0 1 315 250.2 Tm
-(Ethernet) Tj
-1 0 0 1 351.36 250.2 Tm
-(netw) Tj
-1 0 0 1 370.68 250.2 Tm
-(ork) Tj
-1 0 0 1 386.4 250.2 Tm
-(of) Tj
-1 0 0 1 397.32 250.2 Tm
-(4) Tj
-1 0 0 1 404.88 250.2 Tm
-(SparcStation) Tj
-1 0 0 1 458.28 250.2 Tm
-(10s) Tj
-1 0 0 1 474.719 250.2 Tm
-([30) Tj
-1 0 0 1 487.919 250.2 Tm
-(].) Tj
-1 0 0 1 497.639 250.2 Tm
-(The) Tj
-1 0 0 1 515.639 250.2 Tm
-(multi-) Tj
-1 0 0 1 315 238.2 Tm
-(RPC) Tj
-1 0 0 1 335.52 238.2 Tm
-(is) Tj
-1 0 0 1 343.8 238.2 Tm
-(suf) Tj
-1 0 0 1 355.8 238.2 Tm
-(\256cient) Tj
-1 0 0 1 382.32 238.2 Tm
-(for) Tj
-1 0 0 1 395.64 238.2 Tm
-(the) Tj
-1 0 0 1 409.44 238.2 Tm
-(primary) Tj
-1 0 0 1 442.679 238.2 Tm
-(to) Tj
-1 0 0 1 452.159 238.2 Tm
-(in) Tj
-1 0 0 1 459.599 238.2 Tm
-(v) Tj
-1 0 0 1 464.399 238.2 Tm
-(ok) Tj
-1 0 0 1 474.359 238.2 Tm
-(e) Tj
-1 0 0 1 480.239 238.2 Tm
-(a) Tj
-1 0 0 1 486.359 238.2 Tm
-(state) Tj
-1 0 0 1 506.279 238.2 Tm
-(machine) Tj
-1 0 0 1 315 226.32 Tm
-(operation) Tj
-1 0 0 1 354.48 226.32 Tm
-(b) Tj
-1 0 0 1 359.28 226.32 Tm
-(ut) Tj
-1 0 0 1 368.76 226.32 Tm
-(for) Tj
-1 0 0 1 382.2 226.32 Tm
-(an) Tj
-1 0 0 1 393.36 226.32 Tm
-(arbitrary) Tj
-1 0 0 1 429.479 226.32 Tm
-(client) Tj
-1 0 0 1 453.359 226.32 Tm
-(to) Tj
-1 0 0 1 462.959 226.32 Tm
-(in) Tj
-1 0 0 1 470.399 226.32 Tm
-(v) Tj
-1 0 0 1 475.199 226.32 Tm
-(ok) Tj
-1 0 0 1 485.159 226.32 Tm
-(e) Tj
-1 0 0 1 491.159 226.32 Tm
-(an) Tj
-1 0 0 1 502.319 226.32 Tm
-(operation) Tj
-1 0 0 1 315 214.32 Tm
-(it) Tj
-1 0 0 1 323.04 214.32 Tm
-(w) Tj
-1 0 0 1 330.12 214.32 Tm
-(ould) Tj
-1 0 0 1 350.4 214.32 Tm
-(be) Tj
-1 0 0 1 362.4 214.32 Tm
-(necessary) Tj
-1 0 0 1 403.68 214.32 Tm
-(to) Tj
-1 0 0 1 414 214.32 Tm
-(add) Tj
-1 0 0 1 430.92 214.32 Tm
-(an) Tj
-1 0 0 1 442.92 214.32 Tm
-(e) Tj
-1 0 0 1 447.24 214.32 Tm
-(xtra) Tj
-1 0 0 1 465.239 214.32 Tm
-(message) Tj
-1 0 0 1 501.479 214.32 Tm
-(delay) Tj
-1 0 0 1 525.599 214.32 Tm
-(and) Tj
-1 0 0 1 315 202.32 Tm
-(an) Tj
-1 0 0 1 327.84 202.32 Tm
-(e) Tj
-1 0 0 1 332.16 202.32 Tm
-(xtra) Tj
-1 0 0 1 351.12 202.32 Tm
-(RSA) Tj
-1 0 0 1 374.04 202.32 Tm
-(signature) Tj
-1 0 0 1 414 202.32 Tm
-(and) Tj
-1 0 0 1 431.88 202.32 Tm
-(v) Tj
-1 0 0 1 436.8 202.32 Tm
-(eri\256cation) Tj
-1 0 0 1 480.599 202.32 Tm
-(to) Tj
-1 0 0 1 491.879 202.32 Tm
-(authenticate) Tj
-1 0 0 1 315 190.44 Tm
-(the) Tj
-1 0 0 1 330.36 190.44 Tm
-(client;) Tj
-1 0 0 1 358.92 190.44 Tm
-(this) Tj
-1 0 0 1 376.56 190.44 Tm
-(w) Tj
-1 0 0 1 383.64 190.44 Tm
-(ould) Tj
-1 0 0 1 404.64 190.44 Tm
-(lead) Tj
-1 0 0 1 424.44 190.44 Tm
-(to) Tj
-1 0 0 1 435.48 190.44 Tm
-(a) Tj
-1 0 0 1 443.04 190.44 Tm
-(latenc) Tj
-1 0 0 1 466.799 190.44 Tm
-(y) Tj
-1 0 0 1 474.959 190.44 Tm
-(of) Tj
-1 0 0 1 486.479 190.44 Tm
-(at) Tj
-1 0 0 1 496.919 190.44 Tm
-(least) Tj
-1 0 0 1 518.399 190.44 Tm
-(65ms) Tj
-1 0 0 1 315 178.44 Tm
-(\(using) Tj
-1 0 0 1 343.68 178.44 Tm
-(the) Tj
-1 0 0 1 359.52 178.44 Tm
-(RSA) Tj
-1 0 0 1 382.68 178.44 Tm
-(timings) Tj
-1 0 0 1 416.28 178.44 Tm
-(reported) Tj
-1 0 0 1 453.24 178.44 Tm
-(in) Tj
-1 0 0 1 464.759 178.44 Tm
-([29) Tj
-1 0 0 1 478.079 178.44 Tm
-(].\)) Tj
-1 0 0 1 494.519 178.44 Tm
-(Ev) Tj
-1 0 0 1 505.559 178.44 Tm
-(en) Tj
-1 0 0 1 518.519 178.44 Tm
-(if) Tj
-1 0 0 1 528.359 178.44 Tm
-(we) Tj
-1 0 0 1 315 166.56 Tm
-(di) Tj
-1 0 0 1 322.56 166.56 Tm
-(vide) Tj
-1 0 0 1 343.8 166.56 Tm
-(this) Tj
-1 0 0 1 362.28 166.56 Tm
-(latenc) Tj
-1 0 0 1 386.04 166.56 Tm
-(y) Tj
-1 0 0 1 394.92 166.56 Tm
-(by) Tj
-1 0 0 1 408.96 166.56 Tm
-(1.7,) Tj
-1 0 0 1 428.4 166.56 Tm
-(the) Tj
-1 0 0 1 444.72 166.56 Tm
-(ratio) Tj
-1 0 0 1 467.039 166.56 Tm
-(of) Tj
-1 0 0 1 479.399 166.56 Tm
-(the) Tj
-1 0 0 1 495.719 166.56 Tm
-(SPECint92) Tj
-1 0 0 1 315 154.56 Tm
-(ratings) Tj
-1 0 0 1 343.92 154.56 Tm
-(of) Tj
-1 0 0 1 354.12 154.56 Tm
-(the) Tj
-1 0 0 1 368.04 154.56 Tm
-(DEC) Tj
-1 0 0 1 389.88 154.56 Tm
-(3000/400) Tj
-1 0 0 1 429.36 154.56 Tm
-(and) Tj
-1 0 0 1 445.56 154.56 Tm
-(the) Tj
-1 0 0 1 459.599 154.56 Tm
-(SparcStation) Tj
-1 0 0 1 512.279 154.56 Tm
-(10,) Tj
-1 0 0 1 526.679 154.56 Tm
-(our) Tj
-1 0 0 1 315 142.68 Tm
-(algorithm) Tj
-1 0 0 1 355.56 142.68 Tm
-(still) Tj
-1 0 0 1 372 142.68 Tm
-(reduces) Tj
-1 0 0 1 404.16 142.68 Tm
-(the) Tj
-1 0 0 1 417.96 142.68 Tm
-(latenc) Tj
-1 0 0 1 441.72 142.68 Tm
-(y) Tj
-1 0 0 1 448.319 142.68 Tm
-(to) Tj
-1 0 0 1 457.679 142.68 Tm
-(in) Tj
-1 0 0 1 465.119 142.68 Tm
-(v) Tj
-1 0 0 1 469.919 142.68 Tm
-(ok) Tj
-1 0 0 1 479.879 142.68 Tm
-(e) Tj
-1 0 0 1 485.879 142.68 Tm
-(the) Tj
-1 0 0 1 499.679 142.68 Tm
-(read-) Tj
-1 0 0 1 520.199 142.68 Tm
-(write) Tj
-1 0 0 1 315 130.68 Tm
-(and) Tj
-1 0 0 1 332.16 130.68 Tm
-(read-only) Tj
-1 0 0 1 373.2 130.68 Tm
-(0/0) Tj
-1 0 0 1 388.8 130.68 Tm
-(operations) Tj
-1 0 0 1 433.08 130.68 Tm
-(by) Tj
-1 0 0 1 445.8 130.68 Tm
-(f) Tj
-1 0 0 1 449.04 130.68 Tm
-(actors) Tj
-1 0 0 1 475.679 130.68 Tm
-(of) Tj
-1 0 0 1 486.719 130.68 Tm
-(more) Tj
-1 0 0 1 510.119 130.68 Tm
-(than) Tj
-1 0 0 1 530.039 130.68 Tm
-(10) Tj
-1 0 0 1 315 118.8 Tm
-(and) Tj
-1 0 0 1 331.08 118.8 Tm
-(20,) Tj
-1 0 0 1 345.36 118.8 Tm
-(respecti) Tj
-1 0 0 1 376.2 118.8 Tm
-(v) Tj
-1 0 0 1 381.12 118.8 Tm
-(ely) Tj
-1 0 0 1 392.76 118.8 Tm
-(.) Tj
-1 0 0 1 398.28 118.8 Tm
-(Note) Tj
-1 0 0 1 419.4 118.8 Tm
-(that) Tj
-1 0 0 1 435.96 118.8 Tm
-(this) Tj
-1 0 0 1 452.04 118.8 Tm
-(scaling) Tj
-1 0 0 1 481.919 118.8 Tm
-(is) Tj
-1 0 0 1 490.319 118.8 Tm
-(conserv) Tj
-1 0 0 1 521.279 118.8 Tm
-(ati) Tj
-1 0 0 1 530.999 118.8 Tm
-(v) Tj
-1 0 0 1 535.919 118.8 Tm
-(e) Tj
-1 0 0 1 315 106.8 Tm
-(because) Tj
-1 0 0 1 350.16 106.8 Tm
-(the) Tj
-1 0 0 1 366 106.8 Tm
-(netw) Tj
-1 0 0 1 385.32 106.8 Tm
-(ork) Tj
-1 0 0 1 402.12 106.8 Tm
-(accounts) Tj
-1 0 0 1 440.64 106.8 Tm
-(for) Tj
-1 0 0 1 455.88 106.8 Tm
-(a) Tj
-1 0 0 1 463.92 106.8 Tm
-(signi\256cant) Tj
-1 0 0 1 509.039 106.8 Tm
-(fraction) Tj
-1 0 0 1 315 94.92 Tm
-(of) Tj
-1 0 0 1 327.6 94.92 Tm
-(Rampart') Tj
-1 0 0 1 364.8 94.92 Tm
-(s) Tj
-1 0 0 1 372.72 94.92 Tm
-(latenc) Tj
-1 0 0 1 396.48 94.92 Tm
-(y) Tj
-1 0 0 1 405.6 94.92 Tm
-([29) Tj
-1 0 0 1 418.92 94.92 Tm
-(]) Tj
-1 0 0 1 426.48 94.92 Tm
-(and) Tj
-1 0 0 1 445.2 94.92 Tm
-(Rampart') Tj
-1 0 0 1 482.399 94.92 Tm
-(s) Tj
-1 0 0 1 490.319 94.92 Tm
-(results) Tj
-1 0 0 1 520.679 94.92 Tm
-(were) Tj
-1 0 0 1 315 82.92 Tm
-(obtained) Tj
-1 0 0 1 352.56 82.92 Tm
-(using) Tj
-1 0 0 1 377.28 82.92 Tm
-(300-bit) Tj
-1 0 0 1 409.32 82.92 Tm
-(modulus) Tj
-1 0 0 1 446.76 82.92 Tm
-(RSA) Tj
-1 0 0 1 469.44 82.92 Tm
-(signatures,) Tj
-1 0 0 1 515.639 82.92 Tm
-(which) Tj
-1 0 0 1 315 71.04 Tm
-(are) Tj
-1 0 0 1 330.36 71.04 Tm
-(not) Tj
-1 0 0 1 346.2 71.04 Tm
-(considered) Tj
-1 0 0 1 392.52 71.04 Tm
-(secure) Tj
-1 0 0 1 421.08 71.04 Tm
-(today) Tj
-1 0 0 1 446.28 71.04 Tm
-(unless) Tj
-1 0 0 1 474.359 71.04 Tm
-(the) Tj
-1 0 0 1 489.719 71.04 Tm
-(k) Tj
-1 0 0 1 494.639 71.04 Tm
-(e) Tj
-1 0 0 1 498.959 71.04 Tm
-(ys) Tj
-1 0 0 1 510.839 71.04 Tm
-(used) Tj
-1 0 0 1 532.199 71.04 Tm
-(to) Tj
-1 0 0 1 300.96 35.16 Tm
-(11) Tj
-ET
-Q
-endstream
-endobj
-723 0 obj
-28018
-endobj
-724 0 obj
-<<
-/Type /Page
-/MediaBox [0 0 612 792]
-/Parent 2 0 R
-/Resources << /ProcSet [/PDF /ImageB /Text]
-/Font <<
-/R721 721 0 R
-/R718 718 0 R
-/R715 715 0 R
->>
->>
-/Contents [
-716 0 R
-719 0 R
-722 0 R
-]
->>
-endobj
-725 0 obj
-<< /Type /Font /Name /R725 /Subtype /Type1 /BaseFont /Times-Roman >>
-endobj
-726 0 obj
-<< /Length 727 0 R >>
-stream
-q
-BT
-/R725 10 Tf
-1 0 0 1 72 709.08 Tm
-(generate) Tj
-1 0 0 1 108.24 709.08 Tm
-(them) Tj
-1 0 0 1 130.68 709.08 Tm
-(are) Tj
-1 0 0 1 145.32 709.08 Tm
-(refreshed) Tj
-1 0 0 1 184.8 709.08 Tm
-(v) Tj
-1 0 0 1 189.72 709.08 Tm
-(ery) Tj
-1 0 0 1 204.96 709.08 Tm
-(frequently) Tj
-1 0 0 1 245.639 709.08 Tm
-(.) Tj
-1 0 0 1 81.96 696.72 Tm
-(There) Tj
-1 0 0 1 111 696.72 Tm
-(are) Tj
-1 0 0 1 128.88 696.72 Tm
-(no) Tj
-1 0 0 1 144.6 696.72 Tm
-(published) Tj
-1 0 0 1 189.12 696.72 Tm
-(performance) Tj
-1 0 0 1 245.28 696.72 Tm
-(numbers) Tj
-1 0 0 1 285.359 696.72 Tm
-(for) Tj
-1 0 0 1 72 684.72 Tm
-(SecureRing) Tj
-1 0 0 1 122.52 684.72 Tm
-([16) Tj
-1 0 0 1 135.72 684.72 Tm
-(]) Tj
-1 0 0 1 143.04 684.72 Tm
-(b) Tj
-1 0 0 1 147.84 684.72 Tm
-(ut) Tj
-1 0 0 1 159.6 684.72 Tm
-(it) Tj
-1 0 0 1 169.08 684.72 Tm
-(w) Tj
-1 0 0 1 176.16 684.72 Tm
-(ould) Tj
-1 0 0 1 197.88 684.72 Tm
-(be) Tj
-1 0 0 1 211.2 684.72 Tm
-(slo) Tj
-1 0 0 1 222.6 684.72 Tm
-(wer) Tj
-1 0 0 1 241.56 684.72 Tm
-(than) Tj
-1 0 0 1 262.679 684.72 Tm
-(Rampart) Tj
-1 0 0 1 72 672.72 Tm
-(because) Tj
-1 0 0 1 108.96 672.72 Tm
-(its) Tj
-1 0 0 1 123.84 672.72 Tm
-(algorithm) Tj
-1 0 0 1 168 672.72 Tm
-(has) Tj
-1 0 0 1 186.72 672.72 Tm
-(more) Tj
-1 0 0 1 212.52 672.72 Tm
-(message) Tj
-1 0 0 1 251.76 672.72 Tm
-(delays) Tj
-1 0 0 1 282.599 672.72 Tm
-(and) Tj
-1 0 0 1 72 660.84 Tm
-(signature) Tj
-1 0 0 1 111 660.84 Tm
-(operations) Tj
-1 0 0 1 155.04 660.84 Tm
-(in) Tj
-1 0 0 1 165.24 660.84 Tm
-(the) Tj
-1 0 0 1 179.88 660.84 Tm
-(critical) Tj
-1 0 0 1 210.12 660.84 Tm
-(path.) Tj
-ET
-endstream
-endobj
-727 0 obj
-1496
-endobj
-728 0 obj
-<< /Type /Font /Name /R728 /Subtype /Type1 /BaseFont /Times-Bold >>
-endobj
-729 0 obj
-<< /Length 730 0 R >>
-stream
-BT
-/R728 10 Tf
-1 0 0 1 72 637.56 Tm
-(7.3) Tj
-1 0 0 1 94.4399 637.56 Tm
-(Andr) Tj
-1 0 0 1 117 637.56 Tm
-(ew) Tj
-1 0 0 1 131.04 637.56 Tm
-(Benchmark) Tj
-/R725 10 Tf
-1 0 0 1 72 622.56 Tm
-(The) Tj
-1 0 0 1 94.5599 622.56 Tm
-(Andre) Tj
-1 0 0 1 119.4 622.56 Tm
-(w) Tj
-1 0 0 1 133.56 622.56 Tm
-(benchmark) Tj
-1 0 0 1 184.92 622.56 Tm
-([15) Tj
-1 0 0 1 198.24 622.56 Tm
-(]) Tj
-1 0 0 1 208.68 622.56 Tm
-(emulates) Tj
-1 0 0 1 251.28 622.56 Tm
-(a) Tj
-1 0 0 1 262.8 622.56 Tm
-(softw) Tj
-1 0 0 1 284.879 622.56 Tm
-(are) Tj
-1 0 0 1 72 610.56 Tm
-(de) Tj
-1 0 0 1 81.24 610.56 Tm
-(v) Tj
-1 0 0 1 86.16 610.56 Tm
-(elopment) Tj
-1 0 0 1 126.72 610.56 Tm
-(w) Tj
-1 0 0 1 133.8 610.56 Tm
-(orkload.) Tj
-1 0 0 1 173.76 610.56 Tm
-(It) Tj
-1 0 0 1 183.48 610.56 Tm
-(has) Tj
-1 0 0 1 200.4 610.56 Tm
-(\256v) Tj
-1 0 0 1 210.84 610.56 Tm
-(e) Tj
-1 0 0 1 218.88 610.56 Tm
-(phases:) Tj
-1 0 0 1 254.039 610.56 Tm
-(\(1\)) Tj
-1 0 0 1 269.399 610.56 Tm
-(creates) Tj
-1 0 0 1 72 598.68 Tm
-(subdirectories) Tj
-1 0 0 1 131.4 598.68 Tm
-(recursi) Tj
-1 0 0 1 158.4 598.68 Tm
-(v) Tj
-1 0 0 1 163.32 598.68 Tm
-(ely;) Tj
-1 0 0 1 182.04 598.68 Tm
-(\(2\)) Tj
-1 0 0 1 197.16 598.68 Tm
-(copies) Tj
-1 0 0 1 226.2 598.68 Tm
-(a) Tj
-1 0 0 1 234.119 598.68 Tm
-(source) Tj
-1 0 0 1 263.639 598.68 Tm
-(tree;) Tj
-1 0 0 1 285.359 598.68 Tm
-(\(3\)) Tj
-1 0 0 1 72 586.68 Tm
-(e) Tj
-1 0 0 1 76.32 586.68 Tm
-(xamines) Tj
-1 0 0 1 113.52 586.68 Tm
-(the) Tj
-1 0 0 1 129.72 586.68 Tm
-(status) Tj
-1 0 0 1 156.48 586.68 Tm
-(of) Tj
-1 0 0 1 168.72 586.68 Tm
-(all) Tj
-1 0 0 1 182.76 586.68 Tm
-(the) Tj
-1 0 0 1 198.96 586.68 Tm
-(\256les) Tj
-1 0 0 1 219.599 586.68 Tm
-(in) Tj
-1 0 0 1 231.359 586.68 Tm
-(the) Tj
-1 0 0 1 247.559 586.68 Tm
-(tree) Tj
-1 0 0 1 266.519 586.68 Tm
-(without) Tj
-1 0 0 1 72 574.8 Tm
-(e) Tj
-1 0 0 1 76.32 574.8 Tm
-(xamining) Tj
-1 0 0 1 116.64 574.8 Tm
-(their) Tj
-1 0 0 1 137.64 574.8 Tm
-(data;) Tj
-1 0 0 1 159.96 574.8 Tm
-(\(4\)) Tj
-1 0 0 1 174.24 574.8 Tm
-(e) Tj
-1 0 0 1 178.56 574.8 Tm
-(xamines) Tj
-1 0 0 1 214.44 574.8 Tm
-(e) Tj
-1 0 0 1 218.64 574.8 Tm
-(v) Tj
-1 0 0 1 223.56 574.8 Tm
-(ery) Tj
-1 0 0 1 238.919 574.8 Tm
-(byte) Tj
-1 0 0 1 258.839 574.8 Tm
-(of) Tj
-1 0 0 1 269.879 574.8 Tm
-(data) Tj
-1 0 0 1 289.199 574.8 Tm
-(in) Tj
-1 0 0 1 72 562.8 Tm
-(all) Tj
-1 0 0 1 84.48 562.8 Tm
-(the) Tj
-1 0 0 1 99.1199 562.8 Tm
-(\256les;) Tj
-1 0 0 1 120.96 562.8 Tm
-(and) Tj
-1 0 0 1 137.88 562.8 Tm
-(\(5\)) Tj
-1 0 0 1 151.92 562.8 Tm
-(compiles) Tj
-1 0 0 1 190.44 562.8 Tm
-(and) Tj
-1 0 0 1 207.359 562.8 Tm
-(links) Tj
-1 0 0 1 229.199 562.8 Tm
-(the) Tj
-1 0 0 1 243.839 562.8 Tm
-(\256les.) Tj
-1 0 0 1 81.96 550.44 Tm
-(W) Tj
-1 0 0 1 90.48 550.44 Tm
-(e) Tj
-1 0 0 1 97.9199 550.44 Tm
-(use) Tj
-1 0 0 1 114 550.44 Tm
-(the) Tj
-1 0 0 1 129 550.44 Tm
-(Andre) Tj
-1 0 0 1 153.84 550.44 Tm
-(w) Tj
-1 0 0 1 163.8 550.44 Tm
-(benchmark) Tj
-1 0 0 1 210.96 550.44 Tm
-(to) Tj
-1 0 0 1 221.52 550.44 Tm
-(compare) Tj
-1 0 0 1 258.72 550.44 Tm
-(BFS) Tj
-1 0 0 1 279.24 550.44 Tm
-(with) Tj
-1 0 0 1 72 538.56 Tm
-(tw) Tj
-1 0 0 1 81.84 538.56 Tm
-(o) Tj
-1 0 0 1 89.88 538.56 Tm
-(other) Tj
-1 0 0 1 113.28 538.56 Tm
-(\256le) Tj
-1 0 0 1 129.12 538.56 Tm
-(system) Tj
-1 0 0 1 159.72 538.56 Tm
-(con\256gurations:) Tj
-1 0 0 1 224.16 538.56 Tm
-(NFS-std,) Tj
-1 0 0 1 263.04 538.56 Tm
-(which) Tj
-1 0 0 1 290.399 538.56 Tm
-(is) Tj
-1 0 0 1 72 526.56 Tm
-(the) Tj
-1 0 0 1 86.1599 526.56 Tm
-(NFS) Tj
-1 0 0 1 106.44 526.56 Tm
-(V2) Tj
-1 0 0 1 120.6 526.56 Tm
-(implementation) Tj
-1 0 0 1 185.16 526.56 Tm
-(in) Tj
-1 0 0 1 195 526.56 Tm
-(Digital) Tj
-1 0 0 1 224.64 526.56 Tm
-(Unix,) Tj
-1 0 0 1 249.12 526.56 Tm
-(and) Tj
-1 0 0 1 265.559 526.56 Tm
-(BFS-nr) Tj
-1 0 0 1 294.599 526.56 Tm
-(,) Tj
-1 0 0 1 72 514.68 Tm
-(which) Tj
-1 0 0 1 98.4 514.68 Tm
-(is) Tj
-1 0 0 1 107.04 514.68 Tm
-(identical) Tj
-1 0 0 1 143.4 514.68 Tm
-(to) Tj
-1 0 0 1 153.12 514.68 Tm
-(BFS) Tj
-1 0 0 1 172.92 514.68 Tm
-(b) Tj
-1 0 0 1 177.72 514.68 Tm
-(ut) Tj
-1 0 0 1 187.44 514.68 Tm
-(with) Tj
-1 0 0 1 207.12 514.68 Tm
-(no) Tj
-1 0 0 1 219.12 514.68 Tm
-(replication.) Tj
-1 0 0 1 267.719 514.68 Tm
-(BFS-nr) Tj
-1 0 0 1 72 502.68 Tm
-(ran) Tj
-1 0 0 1 86.5199 502.68 Tm
-(tw) Tj
-1 0 0 1 96.3599 502.68 Tm
-(o) Tj
-1 0 0 1 103.08 502.68 Tm
-(simple) Tj
-1 0 0 1 131.52 502.68 Tm
-(UDP) Tj
-1 0 0 1 153.12 502.68 Tm
-(relays) Tj
-1 0 0 1 178.68 502.68 Tm
-(on) Tj
-1 0 0 1 190.44 502.68 Tm
-(the) Tj
-1 0 0 1 204.36 502.68 Tm
-(client,) Tj
-1 0 0 1 230.999 502.68 Tm
-(and) Tj
-1 0 0 1 247.079 502.68 Tm
-(on) Tj
-1 0 0 1 258.839 502.68 Tm
-(the) Tj
-1 0 0 1 272.759 502.68 Tm
-(serv) Tj
-1 0 0 1 289.319 502.68 Tm
-(er) Tj
-1 0 0 1 72 490.8 Tm
-(it) Tj
-1 0 0 1 80.88 490.8 Tm
-(ran) Tj
-1 0 0 1 96.8399 490.8 Tm
-(a) Tj
-1 0 0 1 104.52 490.8 Tm
-(thin) Tj
-1 0 0 1 123.36 490.8 Tm
-(v) Tj
-1 0 0 1 128.28 490.8 Tm
-(eneer) Tj
-1 0 0 1 153 490.8 Tm
-(link) Tj
-1 0 0 1 168.48 490.8 Tm
-(ed) Tj
-1 0 0 1 181.08 490.8 Tm
-(with) Tj
-1 0 0 1 202.08 490.8 Tm
-(a) Tj
-1 0 0 1 209.76 490.8 Tm
-(v) Tj
-1 0 0 1 214.679 490.8 Tm
-(ersion) Tj
-1 0 0 1 242.279 490.8 Tm
-(of) Tj
-ET
-endstream
-endobj
-730 0 obj
-4859
-endobj
-731 0 obj
-<< /Type /Font /Name /R731 /Subtype /Type1 /BaseFont /Times-Italic >>
-endobj
-732 0 obj
-<< /Length 733 0 R >>
-stream
-BT
-/R731 10 Tf
-1 0 0 1 253.919 490.8 Tm
-(snfsd) Tj
-/R725 10 Tf
-1 0 0 1 277.679 490.8 Tm
-(from) Tj
-1 0 0 1 72 478.8 Tm
-(which) Tj
-1 0 0 1 98.1599 478.8 Tm
-(all) Tj
-1 0 0 1 109.92 478.8 Tm
-(the) Tj
-1 0 0 1 123.96 478.8 Tm
-(checkpoint) Tj
-1 0 0 1 169.44 478.8 Tm
-(management) Tj
-1 0 0 1 222.12 478.8 Tm
-(code) Tj
-1 0 0 1 242.759 478.8 Tm
-(w) Tj
-1 0 0 1 249.839 478.8 Tm
-(as) Tj
-1 0 0 1 259.919 478.8 Tm
-(remo) Tj
-1 0 0 1 280.439 478.8 Tm
-(v) Tj
-1 0 0 1 285.359 478.8 Tm
-(ed.) Tj
-1 0 0 1 72 466.8 Tm
-(This) Tj
-1 0 0 1 93.5999 466.8 Tm
-(con\256guration) Tj
-1 0 0 1 150.48 466.8 Tm
-(does) Tj
-/R731 10 Tf
-1 0 0 1 172.56 466.8 Tm
-(not) Tj
-/R725 10 Tf
-1 0 0 1 189.24 466.8 Tm
-(write) Tj
-1 0 0 1 213.48 466.8 Tm
-(modi\256ed) Tj
-1 0 0 1 252.72 466.8 Tm
-(\256le) Tj
-1 0 0 1 269.279 466.8 Tm
-(system) Tj
-1 0 0 1 72 454.92 Tm
-(state) Tj
-1 0 0 1 93.4799 454.92 Tm
-(to) Tj
-1 0 0 1 104.52 454.92 Tm
-(disk) Tj
-1 0 0 1 124.32 454.92 Tm
-(before) Tj
-1 0 0 1 153 454.92 Tm
-(replying) Tj
-1 0 0 1 189.48 454.92 Tm
-(to) Tj
-1 0 0 1 200.4 454.92 Tm
-(the) Tj
-1 0 0 1 215.879 454.92 Tm
-(client.) Tj
-1 0 0 1 246.239 454.92 Tm
-(Therefore,) Tj
-1 0 0 1 291.479 454.92 Tm
-(it) Tj
-1 0 0 1 72 442.92 Tm
-(does) Tj
-1 0 0 1 92.1599 442.92 Tm
-(not) Tj
-1 0 0 1 106.8 442.92 Tm
-(implement) Tj
-1 0 0 1 151.32 442.92 Tm
-(NFS) Tj
-1 0 0 1 171.48 442.92 Tm
-(V2) Tj
-1 0 0 1 185.52 442.92 Tm
-(protocol) Tj
-1 0 0 1 220.56 442.92 Tm
-(semantics,) Tj
-1 0 0 1 264.359 442.92 Tm
-(whereas) Tj
-1 0 0 1 72 431.04 Tm
-(both) Tj
-1 0 0 1 92.1599 431.04 Tm
-(BFS) Tj
-1 0 0 1 112.44 431.04 Tm
-(and) Tj
-1 0 0 1 129.24 431.04 Tm
-(NFS-std) Tj
-1 0 0 1 165 431.04 Tm
-(do.) Tj
-1 0 0 1 81.96 418.68 Tm
-(Out) Tj
-1 0 0 1 99.5999 418.68 Tm
-(of) Tj
-1 0 0 1 110.52 418.68 Tm
-(the) Tj
-1 0 0 1 125.4 418.68 Tm
-(18) Tj
-1 0 0 1 138.12 418.68 Tm
-(operations) Tj
-1 0 0 1 182.28 418.68 Tm
-(in) Tj
-1 0 0 1 192.72 418.68 Tm
-(the) Tj
-1 0 0 1 207.6 418.68 Tm
-(NFS) Tj
-1 0 0 1 228.479 418.68 Tm
-(V2) Tj
-1 0 0 1 243.359 418.68 Tm
-(protocol) Tj
-1 0 0 1 279.239 418.68 Tm
-(only) Tj
-ET
-endstream
-endobj
-733 0 obj
-1993
-endobj
-734 0 obj
-<< /Type /Font /Name /R734 /Subtype /Type1 /BaseFont /Courier >>
-endobj
-735 0 obj
-<< /Length 736 0 R >>
-stream
-BT
-/R734 10 Tf
-1 0 0 1 72 406.68 Tm
-(getattr) Tj
-/R725 10 Tf
-1 0 0 1 118.2 406.68 Tm
-(is) Tj
-1 0 0 1 129.12 406.68 Tm
-(read-only) Tj
-1 0 0 1 171.6 406.68 Tm
-(because) Tj
-1 0 0 1 207.479 406.68 Tm
-(the) Tj
-1 0 0 1 223.919 406.68 Tm
-(time-last-accessed) Tj
-1 0 0 1 72 394.8 Tm
-(attrib) Tj
-1 0 0 1 92.8799 394.8 Tm
-(ute) Tj
-1 0 0 1 110.16 394.8 Tm
-(of) Tj
-1 0 0 1 123.72 394.8 Tm
-(\256les) Tj
-1 0 0 1 145.44 394.8 Tm
-(and) Tj
-1 0 0 1 165 394.8 Tm
-(directories) Tj
-1 0 0 1 212.28 394.8 Tm
-(is) Tj
-1 0 0 1 224.04 394.8 Tm
-(set) Tj
-1 0 0 1 240.359 394.8 Tm
-(by) Tj
-1 0 0 1 255.479 394.8 Tm
-(operations) Tj
-1 0 0 1 72 382.8 Tm
-(that) Tj
-1 0 0 1 92.6399 382.8 Tm
-(w) Tj
-1 0 0 1 99.7199 382.8 Tm
-(ould) Tj
-1 0 0 1 123.24 382.8 Tm
-(otherwise) Tj
-1 0 0 1 167.76 382.8 Tm
-(be) Tj
-1 0 0 1 182.88 382.8 Tm
-(read-only) Tj
-1 0 0 1 220.8 382.8 Tm
-(,) Tj
-1 0 0 1 229.56 382.8 Tm
-(e.g.,) Tj
-/R734 10 Tf
-1 0 0 1 252.96 382.8 Tm
-(read) Tj
-/R725 10 Tf
-1 0 0 1 282.599 382.8 Tm
-(and) Tj
-/R734 10 Tf
-1 0 0 1 72 370.92 Tm
-(lookup) Tj
-/R725 10 Tf
-1 0 0 1 108 370.92 Tm
-(.) Tj
-1 0 0 1 117.12 370.92 Tm
-(The) Tj
-1 0 0 1 136.2 370.92 Tm
-(result) Tj
-1 0 0 1 161.88 370.92 Tm
-(is) Tj
-1 0 0 1 172.08 370.92 Tm
-(that) Tj
-1 0 0 1 190.559 370.92 Tm
-(our) Tj
-1 0 0 1 207.479 370.92 Tm
-(optimization) Tj
-1 0 0 1 261.359 370.92 Tm
-(for) Tj
-1 0 0 1 276.479 370.92 Tm
-(read-) Tj
-1 0 0 1 72 358.92 Tm
-(only) Tj
-1 0 0 1 92.6399 358.92 Tm
-(operations) Tj
-1 0 0 1 137.04 358.92 Tm
-(can) Tj
-1 0 0 1 153.84 358.92 Tm
-(rarely) Tj
-1 0 0 1 180 358.92 Tm
-(be) Tj
-1 0 0 1 192.24 358.92 Tm
-(used.) Tj
-1 0 0 1 217.92 358.92 Tm
-(T) Tj
-1 0 0 1 223.2 358.92 Tm
-(o) Tj
-1 0 0 1 231.119 358.92 Tm
-(sho) Tj
-1 0 0 1 244.799 358.92 Tm
-(w) Tj
-1 0 0 1 254.759 358.92 Tm
-(the) Tj
-1 0 0 1 269.879 358.92 Tm
-(impact) Tj
-1 0 0 1 72 347.04 Tm
-(of) Tj
-1 0 0 1 82.92 347.04 Tm
-(this) Tj
-1 0 0 1 99.8399 347.04 Tm
-(optimization,) Tj
-1 0 0 1 155.4 347.04 Tm
-(we) Tj
-1 0 0 1 169.56 347.04 Tm
-(also) Tj
-1 0 0 1 188.16 347.04 Tm
-(ran) Tj
-1 0 0 1 203.52 347.04 Tm
-(the) Tj
-1 0 0 1 218.28 347.04 Tm
-(Andre) Tj
-1 0 0 1 243.119 347.04 Tm
-(w) Tj
-1 0 0 1 252.719 347.04 Tm
-(benchmark) Tj
-1 0 0 1 72 335.04 Tm
-(on) Tj
-1 0 0 1 85.3199 335.04 Tm
-(a) Tj
-1 0 0 1 93.1199 335.04 Tm
-(second) Tj
-1 0 0 1 124.2 335.04 Tm
-(v) Tj
-1 0 0 1 129.12 335.04 Tm
-(ersion) Tj
-1 0 0 1 156.72 335.04 Tm
-(of) Tj
-1 0 0 1 168.48 335.04 Tm
-(BFS) Tj
-1 0 0 1 189.6 335.04 Tm
-(that) Tj
-1 0 0 1 207.84 335.04 Tm
-(modi\256es) Tj
-1 0 0 1 245.519 335.04 Tm
-(the) Tj
-/R734 10 Tf
-1 0 0 1 261.119 335.04 Tm
-(lookup) Tj
-/R725 10 Tf
-1 0 0 1 72 323.16 Tm
-(operation) Tj
-1 0 0 1 114 323.16 Tm
-(to) Tj
-1 0 0 1 126.12 323.16 Tm
-(be) Tj
-1 0 0 1 139.92 323.16 Tm
-(read-only) Tj
-1 0 0 1 177.84 323.16 Tm
-(.) Tj
-1 0 0 1 189.12 323.16 Tm
-(This) Tj
-1 0 0 1 211.32 323.16 Tm
-(modi\256cation) Tj
-1 0 0 1 266.039 323.16 Tm
-(violates) Tj
-1 0 0 1 72 311.16 Tm
-(strict) Tj
-1 0 0 1 95.0399 311.16 Tm
-(Unix) Tj
-1 0 0 1 117.96 311.16 Tm
-(\256le) Tj
-1 0 0 1 133.8 311.16 Tm
-(system) Tj
-1 0 0 1 164.52 311.16 Tm
-(semantics) Tj
-1 0 0 1 206.88 311.16 Tm
-(b) Tj
-1 0 0 1 211.68 311.16 Tm
-(ut) Tj
-1 0 0 1 222.36 311.16 Tm
-(is) Tj
-1 0 0 1 232.08 311.16 Tm
-(unlik) Tj
-1 0 0 1 252.599 311.16 Tm
-(ely) Tj
-1 0 0 1 267.719 311.16 Tm
-(to) Tj
-1 0 0 1 278.519 311.16 Tm
-(ha) Tj
-1 0 0 1 287.759 311.16 Tm
-(v) Tj
-1 0 0 1 292.679 311.16 Tm
-(e) Tj
-1 0 0 1 72 299.16 Tm
-(adv) Tj
-1 0 0 1 86.4 299.16 Tm
-(erse) Tj
-1 0 0 1 104.76 299.16 Tm
-(ef) Tj
-1 0 0 1 112.32 299.16 Tm
-(fects) Tj
-1 0 0 1 133.56 299.16 Tm
-(in) Tj
-1 0 0 1 143.76 299.16 Tm
-(practice.) Tj
-1 0 0 1 81.96 286.8 Tm
-(F) Tj
-1 0 0 1 87.36 286.8 Tm
-(or) Tj
-1 0 0 1 98.5199 286.8 Tm
-(all) Tj
-1 0 0 1 111.36 286.8 Tm
-(con\256gurations,) Tj
-1 0 0 1 173.76 286.8 Tm
-(the) Tj
-1 0 0 1 188.88 286.8 Tm
-(actual) Tj
-1 0 0 1 215.52 286.8 Tm
-(benchmark) Tj
-1 0 0 1 262.559 286.8 Tm
-(code) Tj
-1 0 0 1 284.279 286.8 Tm
-(ran) Tj
-1 0 0 1 72 274.92 Tm
-(at) Tj
-1 0 0 1 82.8 274.92 Tm
-(the) Tj
-1 0 0 1 98.5199 274.92 Tm
-(client) Tj
-1 0 0 1 124.2 274.92 Tm
-(w) Tj
-1 0 0 1 131.28 274.92 Tm
-(orkstation) Tj
-1 0 0 1 174.72 274.92 Tm
-(using) Tj
-1 0 0 1 199.92 274.92 Tm
-(the) Tj
-1 0 0 1 215.639 274.92 Tm
-(standard) Tj
-1 0 0 1 252.959 274.92 Tm
-(NFS) Tj
-1 0 0 1 274.919 274.92 Tm
-(client) Tj
-1 0 0 1 72 262.92 Tm
-(implementation) Tj
-1 0 0 1 137.04 262.92 Tm
-(in) Tj
-1 0 0 1 147.24 262.92 Tm
-(the) Tj
-1 0 0 1 161.88 262.92 Tm
-(Digital) Tj
-1 0 0 1 192 262.92 Tm
-(Unix) Tj
-1 0 0 1 214.44 262.92 Tm
-(k) Tj
-1 0 0 1 219.36 262.92 Tm
-(ernel) Tj
-1 0 0 1 241.679 262.92 Tm
-(with) Tj
-1 0 0 1 261.839 262.92 Tm
-(the) Tj
-1 0 0 1 276.479 262.92 Tm
-(same) Tj
-/R734 10 Tf
-1 0 0 1 72 251.04 Tm
-(mount) Tj
-/R725 10 Tf
-1 0 0 1 105 251.04 Tm
-(options.) Tj
-1 0 0 1 142.2 251.04 Tm
-(The) Tj
-1 0 0 1 160.8 251.04 Tm
-(most) Tj
-1 0 0 1 183.24 251.04 Tm
-(rele) Tj
-1 0 0 1 198 251.04 Tm
-(v) Tj
-1 0 0 1 202.8 251.04 Tm
-(ant) Tj
-1 0 0 1 218.04 251.04 Tm
-(of) Tj
-1 0 0 1 229.319 251.04 Tm
-(these) Tj
-1 0 0 1 252.959 251.04 Tm
-(options) Tj
-1 0 0 1 285.359 251.04 Tm
-(for) Tj
-1 0 0 1 72 239.04 Tm
-(the) Tj
-1 0 0 1 87.3599 239.04 Tm
-(benchmark) Tj
-1 0 0 1 134.76 239.04 Tm
-(are:) Tj
-1 0 0 1 154.56 239.04 Tm
-(UDP) Tj
-1 0 0 1 177.6 239.04 Tm
-(transport,) Tj
-1 0 0 1 218.76 239.04 Tm
-(4096-byte) Tj
-1 0 0 1 262.319 239.04 Tm
-(read) Tj
-1 0 0 1 282.599 239.04 Tm
-(and) Tj
-1 0 0 1 72 227.16 Tm
-(write) Tj
-1 0 0 1 95.9999 227.16 Tm
-(b) Tj
-1 0 0 1 100.8 227.16 Tm
-(uf) Tj
-1 0 0 1 108.96 227.16 Tm
-(fers,) Tj
-1 0 0 1 129.96 227.16 Tm
-(allo) Tj
-1 0 0 1 144.72 227.16 Tm
-(wing) Tj
-1 0 0 1 168.12 227.16 Tm
-(asynchronous) Tj
-1 0 0 1 226.44 227.16 Tm
-(client) Tj
-1 0 0 1 251.999 227.16 Tm
-(writes,) Tj
-1 0 0 1 282.599 227.16 Tm
-(and) Tj
-1 0 0 1 72 215.16 Tm
-(allo) Tj
-1 0 0 1 86.76 215.16 Tm
-(wing) Tj
-1 0 0 1 109.08 215.16 Tm
-(attrib) Tj
-1 0 0 1 129.96 215.16 Tm
-(ute) Tj
-1 0 0 1 144.6 215.16 Tm
-(caching.) Tj
-1 0 0 1 81.96 202.8 Tm
-(W) Tj
-1 0 0 1 90.48 202.8 Tm
-(e) Tj
-1 0 0 1 98.28 202.8 Tm
-(report) Tj
-1 0 0 1 125.28 202.8 Tm
-(the) Tj
-1 0 0 1 140.76 202.8 Tm
-(mean) Tj
-1 0 0 1 165.6 202.8 Tm
-(of) Tj
-1 0 0 1 177.24 202.8 Tm
-(10) Tj
-1 0 0 1 190.44 202.8 Tm
-(runs) Tj
-1 0 0 1 210.84 202.8 Tm
-(of) Tj
-1 0 0 1 222.36 202.8 Tm
-(the) Tj
-1 0 0 1 237.84 202.8 Tm
-(benchmark) Tj
-1 0 0 1 285.359 202.8 Tm
-(for) Tj
-1 0 0 1 72 190.92 Tm
-(each) Tj
-1 0 0 1 93.8399 190.92 Tm
-(con\256guration.) Tj
-1 0 0 1 156.48 190.92 Tm
-(The) Tj
-1 0 0 1 175.68 190.92 Tm
-(sample) Tj
-1 0 0 1 207.48 190.92 Tm
-(standard) Tj
-1 0 0 1 244.919 190.92 Tm
-(de) Tj
-1 0 0 1 254.159 190.92 Tm
-(viation) Tj
-1 0 0 1 285.359 190.92 Tm
-(for) Tj
-1 0 0 1 72 178.92 Tm
-(the) Tj
-1 0 0 1 87.8399 178.92 Tm
-(total) Tj
-1 0 0 1 109.2 178.92 Tm
-(time) Tj
-1 0 0 1 130.56 178.92 Tm
-(to) Tj
-1 0 0 1 141.96 178.92 Tm
-(run) Tj
-1 0 0 1 159 178.92 Tm
-(the) Tj
-1 0 0 1 174.84 178.92 Tm
-(benchmark) Tj
-1 0 0 1 222.719 178.92 Tm
-(w) Tj
-1 0 0 1 229.799 178.92 Tm
-(as) Tj
-1 0 0 1 241.799 178.92 Tm
-(al) Tj
-1 0 0 1 248.879 178.92 Tm
-(w) Tj
-1 0 0 1 255.959 178.92 Tm
-(ays) Tj
-1 0 0 1 272.879 178.92 Tm
-(belo) Tj
-1 0 0 1 289.919 178.92 Tm
-(w) Tj
-1 0 0 1 72 167.04 Tm
-(2.6%) Tj
-1 0 0 1 95.4 167.04 Tm
-(of) Tj
-1 0 0 1 106.32 167.04 Tm
-(the) Tj
-1 0 0 1 121.08 167.04 Tm
-(reported) Tj
-1 0 0 1 156.96 167.04 Tm
-(v) Tj
-1 0 0 1 161.76 167.04 Tm
-(alue) Tj
-1 0 0 1 180.96 167.04 Tm
-(b) Tj
-1 0 0 1 185.76 167.04 Tm
-(ut) Tj
-1 0 0 1 196.08 167.04 Tm
-(it) Tj
-1 0 0 1 204.24 167.04 Tm
-(w) Tj
-1 0 0 1 211.32 167.04 Tm
-(as) Tj
-1 0 0 1 222.24 167.04 Tm
-(as) Tj
-1 0 0 1 233.159 167.04 Tm
-(high) Tj
-1 0 0 1 253.559 167.04 Tm
-(as) Tj
-1 0 0 1 264.479 167.04 Tm
-(14%) Tj
-1 0 0 1 285.359 167.04 Tm
-(for) Tj
-1 0 0 1 72 155.04 Tm
-(the) Tj
-1 0 0 1 87.5999 155.04 Tm
-(indi) Tj
-1 0 0 1 102.96 155.04 Tm
-(vidual) Tj
-1 0 0 1 131.28 155.04 Tm
-(times) Tj
-1 0 0 1 156.24 155.04 Tm
-(of) Tj
-1 0 0 1 168 155.04 Tm
-(the) Tj
-1 0 0 1 183.6 155.04 Tm
-(\256rst) Tj
-1 0 0 1 202.56 155.04 Tm
-(four) Tj
-1 0 0 1 222.599 155.04 Tm
-(phases.) Tj
-1 0 0 1 258.119 155.04 Tm
-(This) Tj
-1 0 0 1 279.239 155.04 Tm
-(high) Tj
-1 0 0 1 72 143.04 Tm
-(v) Tj
-1 0 0 1 76.8 143.04 Tm
-(ariance) Tj
-1 0 0 1 108.72 143.04 Tm
-(w) Tj
-1 0 0 1 115.8 143.04 Tm
-(as) Tj
-1 0 0 1 127.32 143.04 Tm
-(also) Tj
-1 0 0 1 146.64 143.04 Tm
-(present) Tj
-1 0 0 1 178.56 143.04 Tm
-(in) Tj
-1 0 0 1 189.6 143.04 Tm
-(the) Tj
-1 0 0 1 204.96 143.04 Tm
-(NFS-std) Tj
-1 0 0 1 241.319 143.04 Tm
-(con\256guration.) Tj
-1 0 0 1 72 131.16 Tm
-(The) Tj
-1 0 0 1 91.6799 131.16 Tm
-(estimated) Tj
-1 0 0 1 134.16 131.16 Tm
-(error) Tj
-1 0 0 1 157.8 131.16 Tm
-(for) Tj
-1 0 0 1 173.64 131.16 Tm
-(the) Tj
-1 0 0 1 189.96 131.16 Tm
-(reported) Tj
-1 0 0 1 227.399 131.16 Tm
-(mean) Tj
-1 0 0 1 253.319 131.16 Tm
-(w) Tj
-1 0 0 1 260.399 131.16 Tm
-(as) Tj
-1 0 0 1 272.879 131.16 Tm
-(belo) Tj
-1 0 0 1 289.919 131.16 Tm
-(w) Tj
-1 0 0 1 72 119.16 Tm
-(4.5%) Tj
-1 0 0 1 95.2799 119.16 Tm
-(for) Tj
-1 0 0 1 109.32 119.16 Tm
-(the) Tj
-1 0 0 1 123.96 119.16 Tm
-(indi) Tj
-1 0 0 1 139.32 119.16 Tm
-(vidual) Tj
-1 0 0 1 166.68 119.16 Tm
-(phases) Tj
-1 0 0 1 195.72 119.16 Tm
-(and) Tj
-1 0 0 1 212.639 119.16 Tm
-(0.8%) Tj
-1 0 0 1 235.799 119.16 Tm
-(for) Tj
-1 0 0 1 249.959 119.16 Tm
-(the) Tj
-1 0 0 1 264.599 119.16 Tm
-(total.) Tj
-1 0 0 1 81.96 106.8 Tm
-(T) Tj
-1 0 0 1 87.24 106.8 Tm
-(able) Tj
-1 0 0 1 107.4 106.8 Tm
-(2) Tj
-1 0 0 1 115.92 106.8 Tm
-(sho) Tj
-1 0 0 1 129.6 106.8 Tm
-(ws) Tj
-1 0 0 1 144 106.8 Tm
-(the) Tj
-1 0 0 1 159.72 106.8 Tm
-(results) Tj
-1 0 0 1 189.24 106.8 Tm
-(for) Tj
-1 0 0 1 204.36 106.8 Tm
-(BFS) Tj
-1 0 0 1 225.6 106.8 Tm
-(and) Tj
-1 0 0 1 243.599 106.8 Tm
-(BFS-nr) Tj
-1 0 0 1 272.399 106.8 Tm
-(.) Tj
-1 0 0 1 281.519 106.8 Tm
-(The) Tj
-1 0 0 1 72 94.92 Tm
-(comparison) Tj
-1 0 0 1 122.04 94.92 Tm
-(between) Tj
-1 0 0 1 158.64 94.92 Tm
-(BFS-strict) Tj
-1 0 0 1 203.16 94.92 Tm
-(and) Tj
-1 0 0 1 221.04 94.92 Tm
-(BFS-nr) Tj
-1 0 0 1 253.919 94.92 Tm
-(sho) Tj
-1 0 0 1 267.599 94.92 Tm
-(ws) Tj
-1 0 0 1 281.999 94.92 Tm
-(that) Tj
-1 0 0 1 72 82.92 Tm
-(the) Tj
-1 0 0 1 86.5199 82.92 Tm
-(o) Tj
-1 0 0 1 91.4399 82.92 Tm
-(v) Tj
-1 0 0 1 96.3599 82.92 Tm
-(erhead) Tj
-1 0 0 1 125.16 82.92 Tm
-(of) Tj
-1 0 0 1 135.84 82.92 Tm
-(Byzantine) Tj
-1 0 0 1 178.56 82.92 Tm
-(f) Tj
-1 0 0 1 181.8 82.92 Tm
-(ault) Tj
-1 0 0 1 199.08 82.92 Tm
-(tolerance) Tj
-1 0 0 1 238.079 82.92 Tm
-(for) Tj
-1 0 0 1 251.999 82.92 Tm
-(this) Tj
-1 0 0 1 268.799 82.92 Tm
-(service) Tj
-1 0 0 1 72 71.04 Tm
-(is) Tj
-1 0 0 1 82.32 71.04 Tm
-(lo) Tj
-1 0 0 1 89.8799 71.04 Tm
-(w) Tj
-1 0 0 1 100.8 71.04 Tm
-(\320) Tj
-1 0 0 1 114.48 71.04 Tm
-(BFS-strict) Tj
-1 0 0 1 159.12 71.04 Tm
-(tak) Tj
-1 0 0 1 171.24 71.04 Tm
-(es) Tj
-1 0 0 1 183.24 71.04 Tm
-(only) Tj
-1 0 0 1 204.6 71.04 Tm
-(26%) Tj
-1 0 0 1 226.68 71.04 Tm
-(more) Tj
-1 0 0 1 250.799 71.04 Tm
-(time) Tj
-1 0 0 1 272.279 71.04 Tm
-(to) Tj
-1 0 0 1 283.679 71.04 Tm
-(run) Tj
-ET
-Q
-q
-W
-0 0 612 792 re
-n
-q
-184.32 0 0 -0.48 335.388 709.092 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 335.148 708.732 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 367.548 708.732 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 367.548 708.732 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-/R725 9 Tf
-1 0 0 1 416.52 700.92 Tm
-(BFS) Tj
-ET
-q
-0.48 0 0 -11.04 481.068 708.732 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 519.468 708.732 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-113.64 0 0 -0.48 367.668 697.812 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 335.148 697.812 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 341.28 690 Tm
-(phase) Tj
-ET
-q
-0.48 0 0 -11.04 367.548 697.812 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 387.12 690 Tm
-(strict) Tj
-ET
-q
-0.48 0 0 -11.04 424.308 697.812 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 434.28 690 Tm
-(r/o) Tj
-1 0 0 1 446.52 690 Tm
-(lookup) Tj
-ET
-q
-0.48 0 0 -11.04 481.068 697.812 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 487.32 690 Tm
-(BFS-nr) Tj
-ET
-q
-0.48 0 0 -11.04 519.468 697.812 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-184.32 0 0 -0.48 335.388 686.772 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 335.148 686.412 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 349.32 678.6 Tm
-(1) Tj
-ET
-q
-0.48 0 0 -11.04 367.548 686.412 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 375.96 678.6 Tm
-(0.55) Tj
-1 0 0 1 393.84 678.6 Tm
-(\(57%\)) Tj
-ET
-q
-0.48 0 0 -11.04 424.308 686.412 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 432.72 678.6 Tm
-(0.47) Tj
-1 0 0 1 450.6 678.6 Tm
-(\(34%\)) Tj
-ET
-q
-0.48 0 0 -11.04 481.068 686.412 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 492.6 678.6 Tm
-(0.35) Tj
-ET
-q
-0.48 0 0 -11.04 519.468 686.412 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 335.148 675.492 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 349.32 667.68 Tm
-(2) Tj
-ET
-q
-0.48 0 0 -11.04 367.548 675.492 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 375.96 667.68 Tm
-(9.24) Tj
-1 0 0 1 393.84 667.68 Tm
-(\(82%\)) Tj
-ET
-q
-0.48 0 0 -11.04 424.308 675.492 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 432.72 667.68 Tm
-(7.91) Tj
-1 0 0 1 450.6 667.68 Tm
-(\(56%\)) Tj
-ET
-q
-0.48 0 0 -11.04 481.068 675.492 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 492.6 667.68 Tm
-(5.08) Tj
-ET
-q
-0.48 0 0 -11.04 519.468 675.492 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 335.148 664.452 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 349.32 656.76 Tm
-(3) Tj
-ET
-q
-0.48 0 0 -11.04 367.548 664.452 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 375.96 656.76 Tm
-(7.24) Tj
-1 0 0 1 393.84 656.76 Tm
-(\(18%\)) Tj
-ET
-q
-0.48 0 0 -11.04 424.308 664.452 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 435 656.76 Tm
-(6.45) Tj
-1 0 0 1 452.88 656.76 Tm
-(\(6%\)) Tj
-ET
-q
-0.48 0 0 -11.04 481.068 664.452 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 492.6 656.76 Tm
-(6.11) Tj
-ET
-q
-0.48 0 0 -11.04 519.468 664.452 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 335.148 653.532 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 349.32 645.72 Tm
-(4) Tj
-ET
-q
-0.48 0 0 -11.04 367.548 653.532 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 375.96 645.72 Tm
-(8.77) Tj
-1 0 0 1 393.84 645.72 Tm
-(\(18%\)) Tj
-ET
-q
-0.48 0 0 -11.04 424.308 653.532 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 435 645.72 Tm
-(7.87) Tj
-1 0 0 1 452.88 645.72 Tm
-(\(6%\)) Tj
-ET
-q
-0.48 0 0 -11.04 481.068 653.532 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 492.6 645.72 Tm
-(7.41) Tj
-ET
-q
-0.48 0 0 -11.04 519.468 653.532 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 335.148 642.612 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 349.32 634.8 Tm
-(5) Tj
-ET
-q
-0.48 0 0 -11.04 367.548 642.612 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 373.68 634.8 Tm
-(38.68) Tj
-1 0 0 1 396.12 634.8 Tm
-(\(20%\)) Tj
-ET
-q
-0.48 0 0 -11.04 424.308 642.612 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 430.44 634.8 Tm
-(38.38) Tj
-1 0 0 1 452.88 634.8 Tm
-(\(19%\)) Tj
-ET
-q
-0.48 0 0 -11.04 481.068 642.612 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 490.319 634.8 Tm
-(32.12) Tj
-ET
-q
-0.48 0 0 -11.04 519.468 642.612 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-184.32 0 0 -0.48 335.388 631.572 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 335.148 631.212 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 343.56 623.52 Tm
-(total) Tj
-ET
-q
-0.48 0 0 -11.04 367.548 631.212 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 373.68 623.52 Tm
-(64.48) Tj
-1 0 0 1 396.12 623.52 Tm
-(\(26%\)) Tj
-ET
-q
-0.48 0 0 -11.04 424.308 631.212 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 430.44 623.52 Tm
-(61.07) Tj
-1 0 0 1 452.88 623.52 Tm
-(\(20%\)) Tj
-ET
-q
-0.48 0 0 -11.04 481.068 631.212 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 490.319 623.52 Tm
-(51.07) Tj
-ET
-q
-0.48 0 0 -11.04 519.468 631.212 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-184.32 0 0 -0.48 335.388 620.292 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-/R725 10 Tf
-1 0 0 1 315 606.36 Tm
-(T) Tj
-1 0 0 1 320.28 606.36 Tm
-(able) Tj
-1 0 0 1 339.12 606.36 Tm
-(2:) Tj
-1 0 0 1 350.28 606.36 Tm
-(Andre) Tj
-1 0 0 1 375.12 606.36 Tm
-(w) Tj
-1 0 0 1 384.36 606.36 Tm
-(benchmark:) Tj
-1 0 0 1 434.88 606.36 Tm
-(BFS) Tj
-1 0 0 1 454.8 606.36 Tm
-(vs) Tj
-1 0 0 1 465.96 606.36 Tm
-(BFS-nr) Tj
-1 0 0 1 494.759 606.36 Tm
-(.) Tj
-1 0 0 1 500.639 606.36 Tm
-(The) Tj
-1 0 0 1 518.399 606.36 Tm
-(times) Tj
-1 0 0 1 315 594.36 Tm
-(are) Tj
-1 0 0 1 329.64 594.36 Tm
-(in) Tj
-1 0 0 1 339.84 594.36 Tm
-(seconds.) Tj
-1 0 0 1 315 569.16 Tm
-(the) Tj
-1 0 0 1 331.08 569.16 Tm
-(complete) Tj
-1 0 0 1 371.64 569.16 Tm
-(benchmark.) Tj
-1 0 0 1 426.24 569.16 Tm
-(The) Tj
-1 0 0 1 445.68 569.16 Tm
-(o) Tj
-1 0 0 1 450.6 569.16 Tm
-(v) Tj
-1 0 0 1 455.52 569.16 Tm
-(erhead) Tj
-1 0 0 1 485.88 569.16 Tm
-(is) Tj
-1 0 0 1 496.44 569.16 Tm
-(lo) Tj
-1 0 0 1 503.999 569.16 Tm
-(wer) Tj
-1 0 0 1 522.839 569.16 Tm
-(than) Tj
-1 0 0 1 315 557.28 Tm
-(what) Tj
-1 0 0 1 338.4 557.28 Tm
-(w) Tj
-1 0 0 1 345.48 557.28 Tm
-(as) Tj
-1 0 0 1 357.84 557.28 Tm
-(observ) Tj
-1 0 0 1 384.48 557.28 Tm
-(ed) Tj
-1 0 0 1 397.8 557.28 Tm
-(for) Tj
-1 0 0 1 413.4 557.28 Tm
-(the) Tj
-1 0 0 1 429.72 557.28 Tm
-(micro-benchmarks) Tj
-1 0 0 1 508.439 557.28 Tm
-(because) Tj
-1 0 0 1 315 545.28 Tm
-(the) Tj
-1 0 0 1 329.28 545.28 Tm
-(client) Tj
-1 0 0 1 353.4 545.28 Tm
-(spends) Tj
-1 0 0 1 382.68 545.28 Tm
-(a) Tj
-1 0 0 1 389.16 545.28 Tm
-(signi\256cant) Tj
-1 0 0 1 432.72 545.28 Tm
-(fraction) Tj
-1 0 0 1 465.72 545.28 Tm
-(of) Tj
-1 0 0 1 476.159 545.28 Tm
-(the) Tj
-1 0 0 1 490.319 545.28 Tm
-(elapsed) Tj
-1 0 0 1 522.239 545.28 Tm
-(time) Tj
-1 0 0 1 315 533.4 Tm
-(computing) Tj
-1 0 0 1 361.56 533.4 Tm
-(between) Tj
-1 0 0 1 398.76 533.4 Tm
-(operations,) Tj
-1 0 0 1 447 533.4 Tm
-(i.e.,) Tj
-1 0 0 1 466.08 533.4 Tm
-(between) Tj
-1 0 0 1 503.16 533.4 Tm
-(recei) Tj
-1 0 0 1 522.359 533.4 Tm
-(ving) Tj
-1 0 0 1 315 521.4 Tm
-(the) Tj
-1 0 0 1 330.96 521.4 Tm
-(reply) Tj
-1 0 0 1 355.32 521.4 Tm
-(to) Tj
-1 0 0 1 366.84 521.4 Tm
-(an) Tj
-1 0 0 1 380.16 521.4 Tm
-(operation) Tj
-1 0 0 1 421.56 521.4 Tm
-(and) Tj
-1 0 0 1 439.8 521.4 Tm
-(issuing) Tj
-1 0 0 1 471.84 521.4 Tm
-(the) Tj
-1 0 0 1 487.919 521.4 Tm
-(ne) Tj
-1 0 0 1 497.279 521.4 Tm
-(xt) Tj
-1 0 0 1 508.679 521.4 Tm
-(request,) Tj
-1 0 0 1 315 509.52 Tm
-(and) Tj
-1 0 0 1 332.28 509.52 Tm
-(operations) Tj
-1 0 0 1 376.68 509.52 Tm
-(at) Tj
-1 0 0 1 386.76 509.52 Tm
-(the) Tj
-1 0 0 1 401.76 509.52 Tm
-(serv) Tj
-1 0 0 1 418.32 509.52 Tm
-(er) Tj
-1 0 0 1 428.88 509.52 Tm
-(perform) Tj
-1 0 0 1 463.799 509.52 Tm
-(some) Tj
-1 0 0 1 487.679 509.52 Tm
-(computation.) Tj
-1 0 0 1 315 497.52 Tm
-(But) Tj
-1 0 0 1 333.12 497.52 Tm
-(the) Tj
-1 0 0 1 348.96 497.52 Tm
-(o) Tj
-1 0 0 1 353.88 497.52 Tm
-(v) Tj
-1 0 0 1 358.8 497.52 Tm
-(erhead) Tj
-1 0 0 1 388.8 497.52 Tm
-(is) Tj
-1 0 0 1 399.12 497.52 Tm
-(not) Tj
-1 0 0 1 415.56 497.52 Tm
-(uniform) Tj
-1 0 0 1 451.32 497.52 Tm
-(across) Tj
-1 0 0 1 479.879 497.52 Tm
-(the) Tj
-1 0 0 1 495.719 497.52 Tm
-(benchmark) Tj
-1 0 0 1 315 485.52 Tm
-(phases.) Tj
-1 0 0 1 351.72 485.52 Tm
-(The) Tj
-1 0 0 1 371.04 485.52 Tm
-(main) Tj
-1 0 0 1 394.8 485.52 Tm
-(reason) Tj
-1 0 0 1 424.68 485.52 Tm
-(for) Tj
-1 0 0 1 440.16 485.52 Tm
-(this) Tj
-1 0 0 1 458.4 485.52 Tm
-(is) Tj
-1 0 0 1 468.96 485.52 Tm
-(a) Tj
-1 0 0 1 477.24 485.52 Tm
-(v) Tj
-1 0 0 1 482.04 485.52 Tm
-(ariation) Tj
-1 0 0 1 516.239 485.52 Tm
-(in) Tj
-1 0 0 1 527.879 485.52 Tm
-(the) Tj
-1 0 0 1 315 473.64 Tm
-(amount) Tj
-1 0 0 1 349.44 473.64 Tm
-(of) Tj
-1 0 0 1 362.28 473.64 Tm
-(time) Tj
-1 0 0 1 384.6 473.64 Tm
-(the) Tj
-1 0 0 1 401.28 473.64 Tm
-(client) Tj
-1 0 0 1 427.92 473.64 Tm
-(spends) Tj
-1 0 0 1 459.6 473.64 Tm
-(computing) Tj
-1 0 0 1 506.759 473.64 Tm
-(between) Tj
-1 0 0 1 315 461.64 Tm
-(operations;) Tj
-1 0 0 1 364.2 461.64 Tm
-(the) Tj
-1 0 0 1 380.52 461.64 Tm
-(\256rst) Tj
-1 0 0 1 400.2 461.64 Tm
-(tw) Tj
-1 0 0 1 410.04 461.64 Tm
-(o) Tj
-1 0 0 1 419.16 461.64 Tm
-(phases) Tj
-1 0 0 1 449.76 461.64 Tm
-(ha) Tj
-1 0 0 1 459 461.64 Tm
-(v) Tj
-1 0 0 1 463.92 461.64 Tm
-(e) Tj
-1 0 0 1 472.44 461.64 Tm
-(a) Tj
-1 0 0 1 480.959 461.64 Tm
-(higher) Tj
-1 0 0 1 510.479 461.64 Tm
-(relati) Tj
-1 0 0 1 530.759 461.64 Tm
-(v) Tj
-1 0 0 1 535.679 461.64 Tm
-(e) Tj
-1 0 0 1 315 449.76 Tm
-(o) Tj
-1 0 0 1 319.92 449.76 Tm
-(v) Tj
-1 0 0 1 324.84 449.76 Tm
-(erhead) Tj
-1 0 0 1 354.6 449.76 Tm
-(because) Tj
-1 0 0 1 389.4 449.76 Tm
-(the) Tj
-1 0 0 1 404.88 449.76 Tm
-(client) Tj
-1 0 0 1 430.44 449.76 Tm
-(spends) Tj
-1 0 0 1 460.799 449.76 Tm
-(approximately) Tj
-1 0 0 1 521.759 449.76 Tm
-(40%) Tj
-1 0 0 1 315 437.76 Tm
-(of) Tj
-1 0 0 1 325.68 437.76 Tm
-(the) Tj
-1 0 0 1 340.2 437.76 Tm
-(total) Tj
-1 0 0 1 360.36 437.76 Tm
-(time) Tj
-1 0 0 1 380.4 437.76 Tm
-(computing) Tj
-1 0 0 1 425.4 437.76 Tm
-(between) Tj
-1 0 0 1 460.919 437.76 Tm
-(operations,) Tj
-1 0 0 1 507.359 437.76 Tm
-(whereas) Tj
-1 0 0 1 315 425.88 Tm
-(it) Tj
-1 0 0 1 322.44 425.88 Tm
-(spends) Tj
-1 0 0 1 351.6 425.88 Tm
-(approximately) Tj
-1 0 0 1 411 425.88 Tm
-(70%) Tj
-1 0 0 1 431.28 425.88 Tm
-(during) Tj
-1 0 0 1 459.24 425.88 Tm
-(the) Tj
-1 0 0 1 473.279 425.88 Tm
-(last) Tj
-1 0 0 1 489.119 425.88 Tm
-(three) Tj
-1 0 0 1 510.959 425.88 Tm
-(phases.) Tj
-1 0 0 1 324.96 413.52 Tm
-(The) Tj
-1 0 0 1 342.96 413.52 Tm
-(table) Tj
-1 0 0 1 364.68 413.52 Tm
-(sho) Tj
-1 0 0 1 378.36 413.52 Tm
-(ws) Tj
-1 0 0 1 391.8 413.52 Tm
-(that) Tj
-1 0 0 1 409.2 413.52 Tm
-(applying) Tj
-1 0 0 1 446.519 413.52 Tm
-(the) Tj
-1 0 0 1 461.159 413.52 Tm
-(read-only) Tj
-1 0 0 1 501.839 413.52 Tm
-(optimiza-) Tj
-1 0 0 1 315 401.52 Tm
-(tion) Tj
-1 0 0 1 333.72 401.52 Tm
-(to) Tj
-/R734 10 Tf
-1 0 0 1 344.64 401.52 Tm
-(lookup) Tj
-/R725 10 Tf
-1 0 0 1 383.76 401.52 Tm
-(impro) Tj
-1 0 0 1 407.64 401.52 Tm
-(v) Tj
-1 0 0 1 412.56 401.52 Tm
-(es) Tj
-1 0 0 1 423.72 401.52 Tm
-(the) Tj
-1 0 0 1 439.079 401.52 Tm
-(performance) Tj
-1 0 0 1 492.599 401.52 Tm
-(of) Tj
-1 0 0 1 504.119 401.52 Tm
-(BFS) Tj
-1 0 0 1 524.999 401.52 Tm
-(sig-) Tj
-1 0 0 1 315 389.64 Tm
-(ni\256cantly) Tj
-1 0 0 1 356.64 389.64 Tm
-(and) Tj
-1 0 0 1 374.88 389.64 Tm
-(reduces) Tj
-1 0 0 1 409.32 389.64 Tm
-(the) Tj
-1 0 0 1 425.4 389.64 Tm
-(o) Tj
-1 0 0 1 430.32 389.64 Tm
-(v) Tj
-1 0 0 1 435.24 389.64 Tm
-(erhead) Tj
-1 0 0 1 465.6 389.64 Tm
-(relati) Tj
-1 0 0 1 485.879 389.64 Tm
-(v) Tj
-1 0 0 1 490.799 389.64 Tm
-(e) Tj
-1 0 0 1 498.959 389.64 Tm
-(to) Tj
-1 0 0 1 510.719 389.64 Tm
-(BFS-nr) Tj
-1 0 0 1 315 377.64 Tm
-(to) Tj
-1 0 0 1 326.52 377.64 Tm
-(20%.) Tj
-1 0 0 1 354.96 377.64 Tm
-(This) Tj
-1 0 0 1 376.44 377.64 Tm
-(optimization) Tj
-1 0 0 1 430.68 377.64 Tm
-(has) Tj
-1 0 0 1 447.72 377.64 Tm
-(a) Tj
-1 0 0 1 456 377.64 Tm
-(signi\256cant) Tj
-1 0 0 1 501.359 377.64 Tm
-(impact) Tj
-1 0 0 1 532.199 377.64 Tm
-(in) Tj
-1 0 0 1 315 365.76 Tm
-(the) Tj
-1 0 0 1 330.6 365.76 Tm
-(\256rst) Tj
-1 0 0 1 349.44 365.76 Tm
-(four) Tj
-1 0 0 1 369.36 365.76 Tm
-(phases) Tj
-1 0 0 1 399.36 365.76 Tm
-(because) Tj
-1 0 0 1 434.16 365.76 Tm
-(the) Tj
-1 0 0 1 449.76 365.76 Tm
-(time) Tj
-1 0 0 1 470.879 365.76 Tm
-(spent) Tj
-1 0 0 1 495.239 365.76 Tm
-(w) Tj
-1 0 0 1 502.319 365.76 Tm
-(aiting) Tj
-1 0 0 1 528.359 365.76 Tm
-(for) Tj
-/R734 10 Tf
-1 0 0 1 315 353.76 Tm
-(lookup) Tj
-/R725 10 Tf
-1 0 0 1 353.64 353.76 Tm
-(operations) Tj
-1 0 0 1 398.04 353.76 Tm
-(to) Tj
-1 0 0 1 408.6 353.76 Tm
-(complete) Tj
-1 0 0 1 447.96 353.76 Tm
-(in) Tj
-1 0 0 1 458.519 353.76 Tm
-(BFS-strict) Tj
-1 0 0 1 502.319 353.76 Tm
-(is) Tj
-1 0 0 1 511.679 353.76 Tm
-(at) Tj
-1 0 0 1 521.759 353.76 Tm
-(least) Tj
-1 0 0 1 315 341.88 Tm
-(20%) Tj
-1 0 0 1 336.48 341.88 Tm
-(of) Tj
-1 0 0 1 348.12 341.88 Tm
-(the) Tj
-1 0 0 1 363.48 341.88 Tm
-(elapsed) Tj
-1 0 0 1 396.6 341.88 Tm
-(time) Tj
-1 0 0 1 417.6 341.88 Tm
-(for) Tj
-1 0 0 1 432.48 341.88 Tm
-(these) Tj
-1 0 0 1 456.24 341.88 Tm
-(phases,) Tj
-1 0 0 1 488.639 341.88 Tm
-(whereas) Tj
-1 0 0 1 524.519 341.88 Tm
-(it) Tj
-1 0 0 1 533.399 341.88 Tm
-(is) Tj
-1 0 0 1 315 329.88 Tm
-(less) Tj
-1 0 0 1 332.4 329.88 Tm
-(than) Tj
-1 0 0 1 352.08 329.88 Tm
-(5%) Tj
-1 0 0 1 367.8 329.88 Tm
-(of) Tj
-1 0 0 1 378.6 329.88 Tm
-(the) Tj
-1 0 0 1 393.36 329.88 Tm
-(elapsed) Tj
-1 0 0 1 425.64 329.88 Tm
-(time) Tj
-1 0 0 1 445.919 329.88 Tm
-(for) Tj
-1 0 0 1 459.959 329.88 Tm
-(the) Tj
-1 0 0 1 474.599 329.88 Tm
-(last) Tj
-1 0 0 1 491.039 329.88 Tm
-(phase.) Tj
-ET
-q
-184.8 0 0 -0.48 335.148 316.452 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 334.908 315.972 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 367.308 315.972 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 367.308 315.972 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-/R725 9 Tf
-1 0 0 1 414.84 308.28 Tm
-(BFS) Tj
-ET
-q
-0.48 0 0 -11.04 477.828 315.972 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 519.708 315.972 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-110.64 0 0 -0.48 367.428 305.052 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 334.908 305.052 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 341.04 297.24 Tm
-(phase) Tj
-ET
-q
-0.48 0 0 -11.04 367.308 305.052 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 386.16 297.24 Tm
-(strict) Tj
-ET
-q
-0.48 0 0 -11.04 422.508 305.052 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 431.88 297.24 Tm
-(r/o) Tj
-1 0 0 1 444 297.24 Tm
-(lookup) Tj
-ET
-q
-0.48 0 0 -11.04 477.828 305.052 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 483.96 297.24 Tm
-(NFS-std) Tj
-ET
-q
-0.48 0 0 -11.04 519.708 305.052 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-184.8 0 0 -0.48 335.148 294.132 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 334.908 293.652 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 349.08 285.96 Tm
-(1) Tj
-ET
-q
-0.48 0 0 -11.04 367.308 293.652 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 373.44 285.96 Tm
-(0.55) Tj
-1 0 0 1 391.44 285.96 Tm
-(\(-69%\)) Tj
-ET
-q
-0.48 0 0 -11.04 422.508 293.652 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 428.76 285.96 Tm
-(0.47) Tj
-1 0 0 1 446.64 285.96 Tm
-(\(-73%\)) Tj
-ET
-q
-0.48 0 0 -11.04 477.828 293.652 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 491.16 285.96 Tm
-(1.75) Tj
-ET
-q
-0.48 0 0 -11.04 519.708 293.652 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 334.908 282.732 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 349.08 274.92 Tm
-(2) Tj
-ET
-q
-0.48 0 0 -11.04 367.308 282.732 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 375.72 274.92 Tm
-(9.24) Tj
-1 0 0 1 393.6 274.92 Tm
-(\(-2%\)) Tj
-ET
-q
-0.48 0 0 -11.04 422.508 282.732 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 428.76 274.92 Tm
-(7.91) Tj
-1 0 0 1 446.64 274.92 Tm
-(\(-16%\)) Tj
-ET
-q
-0.48 0 0 -11.04 477.828 282.732 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 491.16 274.92 Tm
-(9.46) Tj
-ET
-q
-0.48 0 0 -11.04 519.708 282.732 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 334.908 271.812 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 349.08 264 Tm
-(3) Tj
-ET
-q
-0.48 0 0 -11.04 367.308 271.812 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 375 264 Tm
-(7.24) Tj
-1 0 0 1 392.88 264 Tm
-(\(35%\)) Tj
-ET
-q
-0.48 0 0 -11.04 422.508 271.812 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 430.2 264 Tm
-(6.45) Tj
-1 0 0 1 448.2 264 Tm
-(\(20%\)) Tj
-ET
-q
-0.48 0 0 -11.04 477.828 271.812 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 491.16 264 Tm
-(5.36) Tj
-ET
-q
-0.48 0 0 -11.04 519.708 271.812 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 334.908 260.772 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 349.08 253.08 Tm
-(4) Tj
-ET
-q
-0.48 0 0 -11.04 367.308 260.772 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 375 253.08 Tm
-(8.77) Tj
-1 0 0 1 392.88 253.08 Tm
-(\(32%\)) Tj
-ET
-q
-0.48 0 0 -11.04 422.508 260.772 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 430.2 253.08 Tm
-(7.87) Tj
-1 0 0 1 448.2 253.08 Tm
-(\(19%\)) Tj
-ET
-q
-0.48 0 0 -11.04 477.828 260.772 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 491.16 253.08 Tm
-(6.60) Tj
-ET
-q
-0.48 0 0 -11.04 519.708 260.772 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 334.908 249.852 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 349.08 242.04 Tm
-(5) Tj
-ET
-q
-0.48 0 0 -11.04 367.308 249.852 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 373.44 242.04 Tm
-(38.68) Tj
-1 0 0 1 395.88 242.04 Tm
-(\(-2%\)) Tj
-ET
-q
-0.48 0 0 -11.04 422.508 249.852 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 428.76 242.04 Tm
-(38.38) Tj
-1 0 0 1 451.2 242.04 Tm
-(\(-2%\)) Tj
-ET
-q
-0.48 0 0 -11.04 477.828 249.852 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 488.88 242.04 Tm
-(39.35) Tj
-ET
-q
-0.48 0 0 -11.04 519.708 249.852 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-184.8 0 0 -0.48 335.148 238.932 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-0.48 0 0 -11.04 334.908 238.452 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 343.32 230.76 Tm
-(total) Tj
-ET
-q
-0.48 0 0 -11.04 367.308 238.452 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 375 230.76 Tm
-(64.48) Tj
-1 0 0 1 397.32 230.76 Tm
-(\(3%\)) Tj
-ET
-q
-0.48 0 0 -11.04 422.508 238.452 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 428.76 230.76 Tm
-(61.07) Tj
-1 0 0 1 451.2 230.76 Tm
-(\(-2%\)) Tj
-ET
-q
-0.48 0 0 -11.04 477.828 238.452 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-1 0 0 1 488.879 230.76 Tm
-(62.52) Tj
-ET
-q
-0.48 0 0 -11.04 519.708 238.452 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-184.8 0 0 -0.48 335.148 227.532 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-BT
-/R725 10 Tf
-1 0 0 1 315 213.6 Tm
-(T) Tj
-1 0 0 1 320.28 213.6 Tm
-(able) Tj
-1 0 0 1 341.04 213.6 Tm
-(3:) Tj
-1 0 0 1 355.68 213.6 Tm
-(Andre) Tj
-1 0 0 1 380.52 213.6 Tm
-(w) Tj
-1 0 0 1 391.56 213.6 Tm
-(benchmark:) Tj
-1 0 0 1 445.44 213.6 Tm
-(BFS) Tj
-1 0 0 1 467.28 213.6 Tm
-(vs) Tj
-1 0 0 1 480.36 213.6 Tm
-(NFS-std.) Tj
-1 0 0 1 524.519 213.6 Tm
-(The) Tj
-1 0 0 1 315 201.6 Tm
-(times) Tj
-1 0 0 1 339.12 201.6 Tm
-(are) Tj
-1 0 0 1 353.76 201.6 Tm
-(in) Tj
-1 0 0 1 363.96 201.6 Tm
-(seconds.) Tj
-1 0 0 1 324.96 178.92 Tm
-(T) Tj
-1 0 0 1 330.24 178.92 Tm
-(able) Tj
-1 0 0 1 349.68 178.92 Tm
-(3) Tj
-1 0 0 1 357.6 178.92 Tm
-(sho) Tj
-1 0 0 1 371.28 178.92 Tm
-(ws) Tj
-1 0 0 1 385.08 178.92 Tm
-(the) Tj
-1 0 0 1 400.08 178.92 Tm
-(results) Tj
-1 0 0 1 429 178.92 Tm
-(for) Tj
-1 0 0 1 443.519 178.92 Tm
-(BFS) Tj
-1 0 0 1 464.039 178.92 Tm
-(vs) Tj
-1 0 0 1 475.799 178.92 Tm
-(NFS-std.) Tj
-1 0 0 1 516.239 178.92 Tm
-(These) Tj
-1 0 0 1 315 166.92 Tm
-(results) Tj
-1 0 0 1 344.4 166.92 Tm
-(sho) Tj
-1 0 0 1 358.08 166.92 Tm
-(w) Tj
-1 0 0 1 368.52 166.92 Tm
-(that) Tj
-1 0 0 1 386.88 166.92 Tm
-(BFS) Tj
-1 0 0 1 408 166.92 Tm
-(can) Tj
-1 0 0 1 425.16 166.92 Tm
-(be) Tj
-1 0 0 1 438 166.92 Tm
-(used) Tj
-1 0 0 1 459.6 166.92 Tm
-(in) Tj
-1 0 0 1 470.759 166.92 Tm
-(practice) Tj
-1 0 0 1 505.679 166.92 Tm
-(\320) Tj
-1 0 0 1 518.999 166.92 Tm
-(BFS-) Tj
-1 0 0 1 315 155.04 Tm
-(strict) Tj
-1 0 0 1 339.96 155.04 Tm
-(tak) Tj
-1 0 0 1 352.08 155.04 Tm
-(es) Tj
-1 0 0 1 365.52 155.04 Tm
-(only) Tj
-1 0 0 1 388.32 155.04 Tm
-(3%) Tj
-1 0 0 1 406.68 155.04 Tm
-(more) Tj
-1 0 0 1 432.24 155.04 Tm
-(time) Tj
-1 0 0 1 455.04 155.04 Tm
-(to) Tj
-1 0 0 1 467.879 155.04 Tm
-(run) Tj
-1 0 0 1 486.239 155.04 Tm
-(the) Tj
-1 0 0 1 503.519 155.04 Tm
-(complete) Tj
-1 0 0 1 315 143.04 Tm
-(benchmark.) Tj
-1 0 0 1 374.88 143.04 Tm
-(Thus,) Tj
-1 0 0 1 403.8 143.04 Tm
-(one) Tj
-1 0 0 1 423.84 143.04 Tm
-(could) Tj
-1 0 0 1 451.56 143.04 Tm
-(replace) Tj
-1 0 0 1 486 143.04 Tm
-(the) Tj
-1 0 0 1 503.879 143.04 Tm
-(NFS) Tj
-1 0 0 1 527.879 143.04 Tm
-(V2) Tj
-1 0 0 1 315 131.16 Tm
-(implementation) Tj
-1 0 0 1 382.56 131.16 Tm
-(in) Tj
-1 0 0 1 395.28 131.16 Tm
-(Digital) Tj
-1 0 0 1 427.92 131.16 Tm
-(Unix,) Tj
-1 0 0 1 455.88 131.16 Tm
-(which) Tj
-1 0 0 1 485.279 131.16 Tm
-(is) Tj
-1 0 0 1 496.799 131.16 Tm
-(used) Tj
-1 0 0 1 520.079 131.16 Tm
-(daily) Tj
-1 0 0 1 315 119.16 Tm
-(by) Tj
-1 0 0 1 329.4 119.16 Tm
-(man) Tj
-1 0 0 1 346.56 119.16 Tm
-(y) Tj
-1 0 0 1 355.8 119.16 Tm
-(users,) Tj
-1 0 0 1 383.76 119.16 Tm
-(by) Tj
-1 0 0 1 398.16 119.16 Tm
-(BFS) Tj
-1 0 0 1 420.24 119.16 Tm
-(without) Tj
-1 0 0 1 455.16 119.16 Tm
-(af) Tj
-1 0 0 1 462.72 119.16 Tm
-(fecting) Tj
-1 0 0 1 494.76 119.16 Tm
-(the) Tj
-1 0 0 1 511.319 119.16 Tm
-(latenc) Tj
-1 0 0 1 535.079 119.16 Tm
-(y) Tj
-1 0 0 1 315 107.28 Tm
-(percei) Tj
-1 0 0 1 339.24 107.28 Tm
-(v) Tj
-1 0 0 1 344.16 107.28 Tm
-(ed) Tj
-1 0 0 1 357.36 107.28 Tm
-(by) Tj
-1 0 0 1 371.4 107.28 Tm
-(those) Tj
-1 0 0 1 396.48 107.28 Tm
-(users.) Tj
-1 0 0 1 427.56 107.28 Tm
-(Furthermore,) Tj
-1 0 0 1 484.319 107.28 Tm
-(BFS) Tj
-1 0 0 1 506.039 107.28 Tm
-(with) Tj
-1 0 0 1 527.879 107.28 Tm
-(the) Tj
-1 0 0 1 315 95.28 Tm
-(read-only) Tj
-1 0 0 1 358.56 95.28 Tm
-(optimization) Tj
-1 0 0 1 414.36 95.28 Tm
-(for) Tj
-1 0 0 1 431.4 95.28 Tm
-(the) Tj
-/R734 10 Tf
-1 0 0 1 449.04 95.28 Tm
-(lookup) Tj
-/R725 10 Tf
-1 0 0 1 490.319 95.28 Tm
-(operation) Tj
-1 0 0 1 533.399 95.28 Tm
-(is) Tj
-1 0 0 1 315 83.4 Tm
-(actually) Tj
-1 0 0 1 349.08 83.4 Tm
-(2%) Tj
-1 0 0 1 364.8 83.4 Tm
-(f) Tj
-1 0 0 1 368.04 83.4 Tm
-(aster) Tj
-1 0 0 1 389.28 83.4 Tm
-(than) Tj
-1 0 0 1 408.96 83.4 Tm
-(NFS-std.) Tj
-1 0 0 1 324.96 71.04 Tm
-(The) Tj
-1 0 0 1 344.4 71.04 Tm
-(o) Tj
-1 0 0 1 349.32 71.04 Tm
-(v) Tj
-1 0 0 1 354.24 71.04 Tm
-(erhead) Tj
-1 0 0 1 384.48 71.04 Tm
-(of) Tj
-1 0 0 1 396.72 71.04 Tm
-(BFS) Tj
-1 0 0 1 418.44 71.04 Tm
-(relati) Tj
-1 0 0 1 438.72 71.04 Tm
-(v) Tj
-1 0 0 1 443.64 71.04 Tm
-(e) Tj
-1 0 0 1 451.8 71.04 Tm
-(to) Tj
-1 0 0 1 463.44 71.04 Tm
-(NFS-std) Tj
-1 0 0 1 500.639 71.04 Tm
-(is) Tj
-1 0 0 1 511.199 71.04 Tm
-(not) Tj
-1 0 0 1 527.879 71.04 Tm
-(the) Tj
-1 0 0 1 300.96 35.16 Tm
-(12) Tj
-ET
-Q
-endstream
-endobj
-736 0 obj
-33893
-endobj
-737 0 obj
-<<
-/Type /Page
-/MediaBox [0 0 612 792]
-/Parent 2 0 R
-/Resources << /ProcSet [/PDF /ImageB /Text]
-/Font <<
-/R734 734 0 R
-/R731 731 0 R
-/R728 728 0 R
-/R725 725 0 R
->>
->>
-/Contents [
-726 0 R
-729 0 R
-732 0 R
-735 0 R
-]
->>
-endobj
-738 0 obj
-<< /Type /Font /Name /R738 /Subtype /Type1 /BaseFont /Times-Roman >>
-endobj
-739 0 obj
-<< /Length 740 0 R >>
-stream
-q
-BT
-/R738 10 Tf
-1 0 0 1 72 709.08 Tm
-(same) Tj
-1 0 0 1 96.6 709.08 Tm
-(for) Tj
-1 0 0 1 112.32 709.08 Tm
-(all) Tj
-1 0 0 1 126.36 709.08 Tm
-(phases.) Tj
-1 0 0 1 163.8 709.08 Tm
-(Both) Tj
-1 0 0 1 187.32 709.08 Tm
-(v) Tj
-1 0 0 1 192.24 709.08 Tm
-(ersions) Tj
-1 0 0 1 224.52 709.08 Tm
-(of) Tj
-1 0 0 1 236.879 709.08 Tm
-(BFS) Tj
-1 0 0 1 258.719 709.08 Tm
-(are) Tj
-1 0 0 1 274.919 709.08 Tm
-(f) Tj
-1 0 0 1 278.159 709.08 Tm
-(aster) Tj
-1 0 0 1 72 697.08 Tm
-(than) Tj
-1 0 0 1 92.6399 697.08 Tm
-(NFS-std) Tj
-1 0 0 1 129.48 697.08 Tm
-(for) Tj
-1 0 0 1 144.6 697.08 Tm
-(phases) Tj
-1 0 0 1 174.72 697.08 Tm
-(1,) Tj
-1 0 0 1 186 697.08 Tm
-(2,) Tj
-1 0 0 1 197.28 697.08 Tm
-(and) Tj
-1 0 0 1 215.16 697.08 Tm
-(5) Tj
-1 0 0 1 223.68 697.08 Tm
-(b) Tj
-1 0 0 1 228.48 697.08 Tm
-(ut) Tj
-1 0 0 1 239.759 697.08 Tm
-(slo) Tj
-1 0 0 1 251.159 697.08 Tm
-(wer) Tj
-1 0 0 1 269.639 697.08 Tm
-(for) Tj
-1 0 0 1 284.879 697.08 Tm
-(the) Tj
-1 0 0 1 72 685.2 Tm
-(other) Tj
-1 0 0 1 94.9199 685.2 Tm
-(phases.) Tj
-1 0 0 1 127.56 685.2 Tm
-(This) Tj
-1 0 0 1 147.72 685.2 Tm
-(is) Tj
-1 0 0 1 156.84 685.2 Tm
-(because) Tj
-1 0 0 1 190.92 685.2 Tm
-(during) Tj
-1 0 0 1 219.359 685.2 Tm
-(phases) Tj
-1 0 0 1 248.399 685.2 Tm
-(1,) Tj
-1 0 0 1 258.359 685.2 Tm
-(2,) Tj
-1 0 0 1 268.319 685.2 Tm
-(and) Tj
-1 0 0 1 285.119 685.2 Tm
-(5) Tj
-1 0 0 1 292.559 685.2 Tm
-(a) Tj
-1 0 0 1 72 673.2 Tm
-(lar) Tj
-1 0 0 1 82.4399 673.2 Tm
-(ge) Tj
-1 0 0 1 94.4399 673.2 Tm
-(fraction) Tj
-1 0 0 1 128.16 673.2 Tm
-(\(between) Tj
-1 0 0 1 167.28 673.2 Tm
-(21%) Tj
-1 0 0 1 188.28 673.2 Tm
-(and) Tj
-1 0 0 1 205.32 673.2 Tm
-(40%\)) Tj
-1 0 0 1 229.68 673.2 Tm
-(of) Tj
-1 0 0 1 240.6 673.2 Tm
-(the) Tj
-1 0 0 1 255.479 673.2 Tm
-(operations) Tj
-1 0 0 1 72 661.32 Tm
-(issued) Tj
-1 0 0 1 99.4799 661.32 Tm
-(by) Tj
-1 0 0 1 111.96 661.32 Tm
-(the) Tj
-1 0 0 1 126.6 661.32 Tm
-(client) Tj
-1 0 0 1 151.32 661.32 Tm
-(are) Tj
-ET
-endstream
-endobj
-740 0 obj
-1832
-endobj
-741 0 obj
-<< /Type /Font /Name /R741 /Subtype /Type1 /BaseFont /Times-Italic >>
-endobj
-742 0 obj
-<< /Length 743 0 R >>
-stream
-BT
-/R741 10 Tf
-1 0 0 1 165.96 661.32 Tm
-(sync) Tj
-1 0 0 1 183.6 661.32 Tm
-(hr) Tj
-1 0 0 1 192 661.32 Tm
-(onous) Tj
-/R738 10 Tf
-1 0 0 1 216 661.32 Tm
-(,) Tj
-1 0 0 1 220.8 661.32 Tm
-(i.e.,) Tj
-1 0 0 1 237.959 661.32 Tm
-(operations) Tj
-1 0 0 1 281.999 661.32 Tm
-(that) Tj
-1 0 0 1 72 649.32 Tm
-(require) Tj
-1 0 0 1 104.4 649.32 Tm
-(the) Tj
-1 0 0 1 120.84 649.32 Tm
-(NFS) Tj
-1 0 0 1 143.4 649.32 Tm
-(implementation) Tj
-1 0 0 1 210.12 649.32 Tm
-(to) Tj
-1 0 0 1 222.12 649.32 Tm
-(ensure) Tj
-1 0 0 1 252.359 649.32 Tm
-(stability) Tj
-1 0 0 1 288.719 649.32 Tm
-(of) Tj
-1 0 0 1 72 637.44 Tm
-(modi\256ed) Tj
-1 0 0 1 110.88 637.44 Tm
-(\256le) Tj
-1 0 0 1 127.08 637.44 Tm
-(system) Tj
-1 0 0 1 158.28 637.44 Tm
-(state) Tj
-1 0 0 1 180 637.44 Tm
-(before) Tj
-1 0 0 1 208.8 637.44 Tm
-(replying) Tj
-1 0 0 1 245.519 637.44 Tm
-(to) Tj
-1 0 0 1 256.679 637.44 Tm
-(the) Tj
-1 0 0 1 272.399 637.44 Tm
-(client.) Tj
-1 0 0 1 72 625.44 Tm
-(NFS-std) Tj
-1 0 0 1 108.84 625.44 Tm
-(achie) Tj
-1 0 0 1 129.72 625.44 Tm
-(v) Tj
-1 0 0 1 134.64 625.44 Tm
-(es) Tj
-1 0 0 1 146.4 625.44 Tm
-(stability) Tj
-1 0 0 1 182.16 625.44 Tm
-(by) Tj
-1 0 0 1 195.84 625.44 Tm
-(writing) Tj
-1 0 0 1 228.24 625.44 Tm
-(modi\256ed) Tj
-1 0 0 1 267.359 625.44 Tm
-(state) Tj
-1 0 0 1 289.199 625.44 Tm
-(to) Tj
-1 0 0 1 72 613.44 Tm
-(disk) Tj
-1 0 0 1 91.9199 613.44 Tm
-(whereas) Tj
-1 0 0 1 127.92 613.44 Tm
-(BFS) Tj
-1 0 0 1 148.92 613.44 Tm
-(achie) Tj
-1 0 0 1 169.8 613.44 Tm
-(v) Tj
-1 0 0 1 174.72 613.44 Tm
-(es) Tj
-1 0 0 1 186.12 613.44 Tm
-(stability) Tj
-1 0 0 1 221.64 613.44 Tm
-(with) Tj
-1 0 0 1 242.64 613.44 Tm
-(lo) Tj
-1 0 0 1 250.199 613.44 Tm
-(wer) Tj
-1 0 0 1 268.319 613.44 Tm
-(latenc) Tj
-1 0 0 1 292.079 613.44 Tm
-(y) Tj
-1 0 0 1 72 601.56 Tm
-(using) Tj
-1 0 0 1 95.6399 601.56 Tm
-(replication) Tj
-1 0 0 1 140.4 601.56 Tm
-(\(as) Tj
-1 0 0 1 154.08 601.56 Tm
-(in) Tj
-1 0 0 1 163.92 601.56 Tm
-(Harp) Tj
-1 0 0 1 185.88 601.56 Tm
-([20) Tj
-1 0 0 1 199.2 601.56 Tm
-(]\).) Tj
-1 0 0 1 211.68 601.56 Tm
-(NFS-std) Tj
-1 0 0 1 246.959 601.56 Tm
-(is) Tj
-1 0 0 1 255.719 601.56 Tm
-(f) Tj
-1 0 0 1 258.959 601.56 Tm
-(aster) Tj
-1 0 0 1 279.839 601.56 Tm
-(than) Tj
-1 0 0 1 72 589.56 Tm
-(BFS) Tj
-1 0 0 1 93 589.56 Tm
-(\(and) Tj
-1 0 0 1 113.88 589.56 Tm
-(BFS-nr\)) Tj
-1 0 0 1 149.76 589.56 Tm
-(in) Tj
-1 0 0 1 160.8 589.56 Tm
-(phases) Tj
-1 0 0 1 190.56 589.56 Tm
-(3) Tj
-1 0 0 1 198.84 589.56 Tm
-(and) Tj
-1 0 0 1 216.48 589.56 Tm
-(4) Tj
-1 0 0 1 224.64 589.56 Tm
-(because) Tj
-1 0 0 1 259.439 589.56 Tm
-(the) Tj
-1 0 0 1 274.919 589.56 Tm
-(client) Tj
-1 0 0 1 72 577.68 Tm
-(issues) Tj
-1 0 0 1 98.2799 577.68 Tm
-(no) Tj
-1 0 0 1 110.76 577.68 Tm
-(synchronous) Tj
-1 0 0 1 163.56 577.68 Tm
-(operations) Tj
-1 0 0 1 207.6 577.68 Tm
-(during) Tj
-1 0 0 1 236.04 577.68 Tm
-(these) Tj
-1 0 0 1 259.079 577.68 Tm
-(phases.) Tj
-ET
-endstream
-endobj
-743 0 obj
-2727
-endobj
-744 0 obj
-<< /Type /Font /Name /R744 /Subtype /Type1 /BaseFont /Times-Bold >>
-endobj
-745 0 obj
-<< /Length 746 0 R >>
-stream
-BT
-/R744 12 Tf
-1 0 0 1 72 546.6 Tm
-(8) Tj
-1 0 0 1 89.8799 546.6 Tm
-(Related) Tj
-1 0 0 1 132.12 546.6 Tm
-(W) Tj
-1 0 0 1 143.28 546.6 Tm
-(ork) Tj
-/R738 10 Tf
-1 0 0 1 72 528.12 Tm
-(Most) Tj
-1 0 0 1 96.5999 528.12 Tm
-(pre) Tj
-1 0 0 1 109.2 528.12 Tm
-(vious) Tj
-1 0 0 1 134.64 528.12 Tm
-(w) Tj
-1 0 0 1 141.72 528.12 Tm
-(ork) Tj
-1 0 0 1 159.12 528.12 Tm
-(on) Tj
-1 0 0 1 173.16 528.12 Tm
-(replication) Tj
-1 0 0 1 219.84 528.12 Tm
-(techniques) Tj
-1 0 0 1 266.519 528.12 Tm
-(ignored) Tj
-1 0 0 1 72 516.12 Tm
-(Byzantine) Tj
-1 0 0 1 118.68 516.12 Tm
-(f) Tj
-1 0 0 1 121.92 516.12 Tm
-(aults) Tj
-1 0 0 1 146.88 516.12 Tm
-(or) Tj
-1 0 0 1 161.52 516.12 Tm
-(assumed) Tj
-1 0 0 1 202.08 516.12 Tm
-(a) Tj
-1 0 0 1 212.76 516.12 Tm
-(synchronous) Tj
-1 0 0 1 269.28 516.12 Tm
-(system) Tj
-1 0 0 1 72 504.24 Tm
-(model) Tj
-1 0 0 1 101.88 504.24 Tm
-(\(e.g.,) Tj
-1 0 0 1 127.68 504.24 Tm
-([17) Tj
-1 0 0 1 140.88 504.24 Tm
-(,) Tj
-1 0 0 1 148.32 504.24 Tm
-(26) Tj
-1 0 0 1 158.28 504.24 Tm
-(,) Tj
-1 0 0 1 165.72 504.24 Tm
-(18) Tj
-1 0 0 1 175.68 504.24 Tm
-(,) Tj
-1 0 0 1 183.12 504.24 Tm
-(34) Tj
-1 0 0 1 193.08 504.24 Tm
-(,) Tj
-1 0 0 1 200.52 504.24 Tm
-(6,) Tj
-1 0 0 1 213 504.24 Tm
-(10) Tj
-1 0 0 1 222.96 504.24 Tm
-(]\).) Tj
-1 0 0 1 243.12 504.24 Tm
-(V) Tj
-1 0 0 1 249.72 504.24 Tm
-(ie) Tj
-1 0 0 1 256.68 504.24 Tm
-(wstamped) Tj
-1 0 0 1 72 492.24 Tm
-(replication) Tj
-1 0 0 1 117 492.24 Tm
-([26) Tj
-1 0 0 1 130.2 492.24 Tm
-(]) Tj
-1 0 0 1 135.96 492.24 Tm
-(and) Tj
-1 0 0 1 152.64 492.24 Tm
-(P) Tj
-1 0 0 1 158.04 492.24 Tm
-(axos) Tj
-1 0 0 1 178.68 492.24 Tm
-([18) Tj
-1 0 0 1 192 492.24 Tm
-(]) Tj
-1 0 0 1 197.64 492.24 Tm
-(use) Tj
-1 0 0 1 213.239 492.24 Tm
-(vie) Tj
-1 0 0 1 225.239 492.24 Tm
-(ws) Tj
-1 0 0 1 238.559 492.24 Tm
-(with) Tj
-1 0 0 1 258.719 492.24 Tm
-(a) Tj
-1 0 0 1 265.439 492.24 Tm
-(primary) Tj
-1 0 0 1 72 480.36 Tm
-(and) Tj
-1 0 0 1 88.8 480.36 Tm
-(backups) Tj
-1 0 0 1 123.84 480.36 Tm
-(to) Tj
-1 0 0 1 134.04 480.36 Tm
-(tolerate) Tj
-1 0 0 1 166.32 480.36 Tm
-(benign) Tj
-1 0 0 1 195.84 480.36 Tm
-(f) Tj
-1 0 0 1 199.08 480.36 Tm
-(aults) Tj
-1 0 0 1 220.199 480.36 Tm
-(in) Tj
-1 0 0 1 230.399 480.36 Tm
-(an) Tj
-1 0 0 1 242.159 480.36 Tm
-(asynchronous) Tj
-1 0 0 1 72 468.36 Tm
-(system.) Tj
-1 0 0 1 105.48 468.36 Tm
-(T) Tj
-1 0 0 1 110.76 468.36 Tm
-(olerating) Tj
-1 0 0 1 147.96 468.36 Tm
-(Byzantine) Tj
-1 0 0 1 190.08 468.36 Tm
-(f) Tj
-1 0 0 1 193.32 468.36 Tm
-(aults) Tj
-1 0 0 1 213.72 468.36 Tm
-(requires) Tj
-1 0 0 1 247.559 468.36 Tm
-(a) Tj
-1 0 0 1 253.559 468.36 Tm
-(mu) Tj
-1 0 0 1 266.279 468.36 Tm
-(ch) Tj
-1 0 0 1 277.199 468.36 Tm
-(mo) Tj
-1 0 0 1 289.919 468.36 Tm
-(re) Tj
-1 0 0 1 72 456.48 Tm
-(comple) Tj
-1 0 0 1 101.4 456.48 Tm
-(x) Tj
-1 0 0 1 109.32 456.48 Tm
-(protocol) Tj
-1 0 0 1 145.8 456.48 Tm
-(with) Tj
-1 0 0 1 166.68 456.48 Tm
-(cryptographic) Tj
-1 0 0 1 225.24 456.48 Tm
-(authentication,) Tj
-1 0 0 1 287.639 456.48 Tm
-(an) Tj
-1 0 0 1 72 444.48 Tm
-(e) Tj
-1 0 0 1 76.32 444.48 Tm
-(xtra) Tj
-1 0 0 1 96.5999 444.48 Tm
-(pre-prepare) Tj
-1 0 0 1 147.48 444.48 Tm
-(phase,) Tj
-1 0 0 1 178.08 444.48 Tm
-(and) Tj
-1 0 0 1 197.4 444.48 Tm
-(a) Tj
-1 0 0 1 206.64 444.48 Tm
-(dif) Tj
-1 0 0 1 217.559 444.48 Tm
-(ferent) Tj
-1 0 0 1 245.639 444.48 Tm
-(technique) Tj
-1 0 0 1 289.199 444.48 Tm
-(to) Tj
-1 0 0 1 72 432.6 Tm
-(trigger) Tj
-1 0 0 1 101.28 432.6 Tm
-(vie) Tj
-1 0 0 1 113.28 432.6 Tm
-(w) Tj
-1 0 0 1 123.12 432.6 Tm
-(changes) Tj
-1 0 0 1 157.92 432.6 Tm
-(and) Tj
-1 0 0 1 174.96 432.6 Tm
-(select) Tj
-1 0 0 1 200.4 432.6 Tm
-(primaries.) Tj
-1 0 0 1 244.679 432.6 Tm
-(Furthermore,) Tj
-1 0 0 1 72 420.6 Tm
-(our) Tj
-1 0 0 1 87 420.6 Tm
-(system) Tj
-1 0 0 1 116.28 420.6 Tm
-(uses) Tj
-1 0 0 1 135 420.6 Tm
-(vie) Tj
-1 0 0 1 147 420.6 Tm
-(w) Tj
-1 0 0 1 155.76 420.6 Tm
-(changes) Tj
-1 0 0 1 189.6 420.6 Tm
-(on) Tj
-1 0 0 1 199.56 420.6 Tm
-(ly) Tj
-1 0 0 1 208.92 420.6 Tm
-(to) Tj
-1 0 0 1 218.159 420.6 Tm
-(select) Tj
-1 0 0 1 242.399 420.6 Tm
-(a) Tj
-1 0 0 1 248.279 420.6 Tm
-(ne) Tj
-1 0 0 1 257.519 420.6 Tm
-(w) Tj
-1 0 0 1 266.159 420.6 Tm
-(pr) Tj
-1 0 0 1 274.439 420.6 Tm
-(imar) Tj
-1 0 0 1 292.679 420.6 Tm
-(y) Tj
-1 0 0 1 72 408.6 Tm
-(b) Tj
-1 0 0 1 76.8 408.6 Tm
-(ut) Tj
-1 0 0 1 87.4799 408.6 Tm
-(ne) Tj
-1 0 0 1 96.7199 408.6 Tm
-(v) Tj
-1 0 0 1 101.64 408.6 Tm
-(er) Tj
-1 0 0 1 112.08 408.6 Tm
-(to) Tj
-1 0 0 1 122.76 408.6 Tm
-(select) Tj
-1 0 0 1 148.44 408.6 Tm
-(a) Tj
-1 0 0 1 155.76 408.6 Tm
-(dif) Tj
-1 0 0 1 166.68 408.6 Tm
-(ferent) Tj
-1 0 0 1 192.719 408.6 Tm
-(set) Tj
-1 0 0 1 206.759 408.6 Tm
-(of) Tj
-1 0 0 1 217.919 408.6 Tm
-(replicas) Tj
-1 0 0 1 251.879 408.6 Tm
-(to) Tj
-1 0 0 1 262.559 408.6 Tm
-(form) Tj
-1 0 0 1 284.879 408.6 Tm
-(the) Tj
-1 0 0 1 72 396.72 Tm
-(ne) Tj
-1 0 0 1 81.24 396.72 Tm
-(w) Tj
-1 0 0 1 90.8399 396.72 Tm
-(vie) Tj
-1 0 0 1 102.84 396.72 Tm
-(w) Tj
-1 0 0 1 112.44 396.72 Tm
-(as) Tj
-1 0 0 1 123.24 396.72 Tm
-(in) Tj
-1 0 0 1 133.44 396.72 Tm
-([26) Tj
-1 0 0 1 146.76 396.72 Tm
-(,) Tj
-1 0 0 1 151.8 396.72 Tm
-(18) Tj
-1 0 0 1 161.76 396.72 Tm
-(].) Tj
-1 0 0 1 81.96 383.64 Tm
-(Some) Tj
-1 0 0 1 109.32 383.64 Tm
-(agreement) Tj
-1 0 0 1 155.52 383.64 Tm
-(and) Tj
-1 0 0 1 174.72 383.64 Tm
-(consensus) Tj
-1 0 0 1 219.84 383.64 Tm
-(algorithms) Tj
-1 0 0 1 267.12 383.64 Tm
-(tolerate) Tj
-1 0 0 1 72 371.76 Tm
-(Byzantine) Tj
-1 0 0 1 114.36 371.76 Tm
-(f) Tj
-1 0 0 1 117.6 371.76 Tm
-(aults) Tj
-1 0 0 1 138.24 371.76 Tm
-(in) Tj
-1 0 0 1 147.96 371.76 Tm
-(asynchronous) Tj
-1 0 0 1 204.6 371.76 Tm
-(systems) Tj
-1 0 0 1 238.079 371.76 Tm
-(\(e.g,[2) Tj
-1 0 0 1 264.119 371.76 Tm
-(,) Tj
-1 0 0 1 268.559 371.76 Tm
-(3) Tj
-1 0 0 1 273.479 371.76 Tm
-(,) Tj
-1 0 0 1 277.919 371.76 Tm
-(24) Tj
-1 0 0 1 287.879 371.76 Tm
-(]\).) Tj
-1 0 0 1 72 359.76 Tm
-(Ho) Tj
-1 0 0 1 84 359.76 Tm
-(we) Tj
-1 0 0 1 95.4 359.76 Tm
-(v) Tj
-1 0 0 1 100.32 359.76 Tm
-(er) Tj
-1 0 0 1 107.76 359.76 Tm
-(,) Tj
-1 0 0 1 114.36 359.76 Tm
-(the) Tj
-1 0 0 1 126.48 359.76 Tm
-(y) Tj
-1 0 0 1 135.36 359.76 Tm
-(do) Tj
-1 0 0 1 149.28 359.76 Tm
-(not) Tj
-1 0 0 1 166.08 359.76 Tm
-(pro) Tj
-1 0 0 1 179.4 359.76 Tm
-(vide) Tj
-1 0 0 1 200.28 359.76 Tm
-(a) Tj
-1 0 0 1 208.8 359.76 Tm
-(complete) Tj
-1 0 0 1 249.239 359.76 Tm
-(solution) Tj
-1 0 0 1 285.359 359.76 Tm
-(for) Tj
-1 0 0 1 72 347.88 Tm
-(state) Tj
-1 0 0 1 92.5199 347.88 Tm
-(machine) Tj
-1 0 0 1 128.52 347.88 Tm
-(replication,) Tj
-1 0 0 1 175.92 347.88 Tm
-(and) Tj
-1 0 0 1 192.48 347.88 Tm
-(furthermore,) Tj
-1 0 0 1 244.919 347.88 Tm
-(most) Tj
-1 0 0 1 266.519 347.88 Tm
-(of) Tj
-1 0 0 1 277.079 347.88 Tm
-(them) Tj
-1 0 0 1 72 335.88 Tm
-(were) Tj
-1 0 0 1 94.3199 335.88 Tm
-(designed) Tj
-1 0 0 1 132.6 335.88 Tm
-(to) Tj
-1 0 0 1 143.28 335.88 Tm
-(demonstrate) Tj
-1 0 0 1 194.88 335.88 Tm
-(theoretical) Tj
-1 0 0 1 239.879 335.88 Tm
-(feasibility) Tj
-1 0 0 1 282.599 335.88 Tm
-(and) Tj
-1 0 0 1 72 324 Tm
-(are) Tj
-1 0 0 1 89.0399 324 Tm
-(too) Tj
-1 0 0 1 106.68 324 Tm
-(slo) Tj
-1 0 0 1 118.08 324 Tm
-(w) Tj
-1 0 0 1 130.2 324 Tm
-(to) Tj
-1 0 0 1 142.8 324 Tm
-(be) Tj
-1 0 0 1 157.2 324 Tm
-(used) Tj
-1 0 0 1 180.36 324 Tm
-(in) Tj
-1 0 0 1 192.96 324 Tm
-(practice.) Tj
-1 0 0 1 237.839 324 Tm
-(Our) Tj
-1 0 0 1 258.239 324 Tm
-(algorithm) Tj
-1 0 0 1 72 312 Tm
-(during) Tj
-1 0 0 1 100.56 312 Tm
-(normal-case) Tj
-1 0 0 1 151.8 312 Tm
-(operation) Tj
-1 0 0 1 192 312 Tm
-(is) Tj
-1 0 0 1 201.24 312 Tm
-(similar) Tj
-1 0 0 1 231.48 312 Tm
-(to) Tj
-1 0 0 1 241.799 312 Tm
-(the) Tj
-1 0 0 1 256.559 312 Tm
-(Byzantine) Tj
-1 0 0 1 72 300.12 Tm
-(agreement) Tj
-1 0 0 1 116.76 300.12 Tm
-(algorithm) Tj
-1 0 0 1 158.76 300.12 Tm
-(in) Tj
-1 0 0 1 169.68 300.12 Tm
-([2]) Tj
-1 0 0 1 184.56 300.12 Tm
-(b) Tj
-1 0 0 1 189.36 300.12 Tm
-(ut) Tj
-1 0 0 1 200.4 300.12 Tm
-(that) Tj
-1 0 0 1 218.52 300.12 Tm
-(algorithm) Tj
-1 0 0 1 260.519 300.12 Tm
-(is) Tj
-1 0 0 1 270.479 300.12 Tm
-(unable) Tj
-1 0 0 1 72 288.12 Tm
-(to) Tj
-1 0 0 1 82.2 288.12 Tm
-(survi) Tj
-1 0 0 1 102 288.12 Tm
-(v) Tj
-1 0 0 1 106.92 288.12 Tm
-(e) Tj
-1 0 0 1 113.64 288.12 Tm
-(primary) Tj
-1 0 0 1 147.72 288.12 Tm
-(f) Tj
-1 0 0 1 150.96 288.12 Tm
-(ailures.) Tj
-1 0 0 1 81.96 275.16 Tm
-(The) Tj
-1 0 0 1 100.8 275.16 Tm
-(tw) Tj
-1 0 0 1 110.64 275.16 Tm
-(o) Tj
-1 0 0 1 119.04 275.16 Tm
-(systems) Tj
-1 0 0 1 153.96 275.16 Tm
-(that) Tj
-1 0 0 1 172.32 275.16 Tm
-(are) Tj
-1 0 0 1 187.8 275.16 Tm
-(most) Tj
-1 0 0 1 210.48 275.16 Tm
-(closely) Tj
-1 0 0 1 242.159 275.16 Tm
-(related) Tj
-1 0 0 1 272.639 275.16 Tm
-(to) Tj
-1 0 0 1 283.679 275.16 Tm
-(our) Tj
-1 0 0 1 72 263.16 Tm
-(w) Tj
-1 0 0 1 79.08 263.16 Tm
-(ork) Tj
-1 0 0 1 95.04 263.16 Tm
-(are) Tj
-1 0 0 1 109.92 263.16 Tm
-(Rampart) Tj
-1 0 0 1 146.88 263.16 Tm
-([29) Tj
-1 0 0 1 160.2 263.16 Tm
-(,) Tj
-1 0 0 1 165.36 263.16 Tm
-(30) Tj
-1 0 0 1 175.32 263.16 Tm
-(,) Tj
-1 0 0 1 180.48 263.16 Tm
-(31) Tj
-1 0 0 1 190.44 263.16 Tm
-(,) Tj
-1 0 0 1 195.72 263.16 Tm
-(22) Tj
-1 0 0 1 205.68 263.16 Tm
-(]) Tj
-1 0 0 1 211.68 263.16 Tm
-(and) Tj
-1 0 0 1 228.72 263.16 Tm
-(SecureRing) Tj
-1 0 0 1 277.919 263.16 Tm
-([16) Tj
-1 0 0 1 291.239 263.16 Tm
-(].) Tj
-1 0 0 1 72 251.28 Tm
-(The) Tj
-1 0 0 1 87.48 251.28 Tm
-(y) Tj
-1 0 0 1 95.5199 251.28 Tm
-(implement) Tj
-1 0 0 1 141.36 251.28 Tm
-(state) Tj
-1 0 0 1 162.72 251.28 Tm
-(machine) Tj
-1 0 0 1 199.68 251.28 Tm
-(replication) Tj
-1 0 0 1 245.519 251.28 Tm
-(b) Tj
-1 0 0 1 250.319 251.28 Tm
-(ut) Tj
-1 0 0 1 261.239 251.28 Tm
-(are) Tj
-1 0 0 1 276.479 251.28 Tm
-(more) Tj
-1 0 0 1 72 239.28 Tm
-(than) Tj
-1 0 0 1 92.0399 239.28 Tm
-(an) Tj
-1 0 0 1 104.28 239.28 Tm
-(order) Tj
-1 0 0 1 128.16 239.28 Tm
-(of) Tj
-1 0 0 1 139.32 239.28 Tm
-(magnitude) Tj
-1 0 0 1 184.2 239.28 Tm
-(slo) Tj
-1 0 0 1 195.6 239.28 Tm
-(wer) Tj
-1 0 0 1 213.48 239.28 Tm
-(than) Tj
-1 0 0 1 233.4 239.28 Tm
-(our) Tj
-1 0 0 1 249.599 239.28 Tm
-(system) Tj
-1 0 0 1 280.079 239.28 Tm
-(and,) Tj
-1 0 0 1 72 227.4 Tm
-(most) Tj
-1 0 0 1 93.8399 227.4 Tm
-(importantly) Tj
-1 0 0 1 140.04 227.4 Tm
-(,) Tj
-1 0 0 1 144.72 227.4 Tm
-(the) Tj
-1 0 0 1 156.84 227.4 Tm
-(y) Tj
-1 0 0 1 164.16 227.4 Tm
-(rely) Tj
-1 0 0 1 182.16 227.4 Tm
-(on) Tj
-1 0 0 1 194.64 227.4 Tm
-(synchron) Tj
-1 0 0 1 231.36 227.4 Tm
-(y) Tj
-1 0 0 1 238.439 227.4 Tm
-(assumptions.) Tj
-1 0 0 1 81.96 214.32 Tm
-(Both) Tj
-1 0 0 1 105.84 214.32 Tm
-(Rampart) Tj
-1 0 0 1 144.72 214.32 Tm
-(and) Tj
-1 0 0 1 163.56 214.32 Tm
-(SecureRing) Tj
-1 0 0 1 214.56 214.32 Tm
-(must) Tj
-1 0 0 1 238.56 214.32 Tm
-(e) Tj
-1 0 0 1 242.88 214.32 Tm
-(xclude) Tj
-1 0 0 1 273.839 214.32 Tm
-(f) Tj
-1 0 0 1 277.079 214.32 Tm
-(aulty) Tj
-1 0 0 1 72 202.32 Tm
-(replicas) Tj
-1 0 0 1 105 202.32 Tm
-(from) Tj
-1 0 0 1 126.48 202.32 Tm
-(the) Tj
-1 0 0 1 140.76 202.32 Tm
-(group) Tj
-1 0 0 1 166.08 202.32 Tm
-(to) Tj
-1 0 0 1 175.92 202.32 Tm
-(mak) Tj
-1 0 0 1 193.08 202.32 Tm
-(e) Tj
-1 0 0 1 199.44 202.32 Tm
-(progress) Tj
-1 0 0 1 235.199 202.32 Tm
-(\(e.g.,) Tj
-1 0 0 1 257.639 202.32 Tm
-(to) Tj
-1 0 0 1 267.479 202.32 Tm
-(remo) Tj
-1 0 0 1 287.999 202.32 Tm
-(v) Tj
-1 0 0 1 292.919 202.32 Tm
-(e) Tj
-1 0 0 1 72 190.44 Tm
-(a) Tj
-1 0 0 1 80.16 190.44 Tm
-(f) Tj
-1 0 0 1 83.3999 190.44 Tm
-(aulty) Tj
-1 0 0 1 107.04 190.44 Tm
-(primary) Tj
-1 0 0 1 142.32 190.44 Tm
-(and) Tj
-1 0 0 1 160.32 190.44 Tm
-(elect) Tj
-1 0 0 1 182.88 190.44 Tm
-(a) Tj
-1 0 0 1 191.04 190.44 Tm
-(ne) Tj
-1 0 0 1 200.28 190.44 Tm
-(w) Tj
-1 0 0 1 211.079 190.44 Tm
-(one\),) Tj
-1 0 0 1 235.319 190.44 Tm
-(and) Tj
-1 0 0 1 253.439 190.44 Tm
-(to) Tj
-1 0 0 1 264.959 190.44 Tm
-(perform) Tj
-1 0 0 1 72 178.44 Tm
-(garbage) Tj
-1 0 0 1 109.44 178.44 Tm
-(collection.) Tj
-1 0 0 1 165.36 178.44 Tm
-(The) Tj
-1 0 0 1 180.84 178.44 Tm
-(y) Tj
-1 0 0 1 191.64 178.44 Tm
-(rely) Tj
-1 0 0 1 213.12 178.44 Tm
-(on) Tj
-1 0 0 1 229.08 178.44 Tm
-(f) Tj
-1 0 0 1 232.32 178.44 Tm
-(ailure) Tj
-1 0 0 1 260.999 178.44 Tm
-(detectors) Tj
-1 0 0 1 72 166.56 Tm
-(to) Tj
-1 0 0 1 86.16 166.56 Tm
-(determine) Tj
-1 0 0 1 132.36 166.56 Tm
-(which) Tj
-1 0 0 1 162.96 166.56 Tm
-(replicas) Tj
-1 0 0 1 200.4 166.56 Tm
-(are) Tj
-1 0 0 1 218.88 166.56 Tm
-(f) Tj
-1 0 0 1 222.12 166.56 Tm
-(aulty) Tj
-1 0 0 1 241.56 166.56 Tm
-(.) Tj
-1 0 0 1 259.08 166.56 Tm
-(Ho) Tj
-1 0 0 1 271.079 166.56 Tm
-(we) Tj
-1 0 0 1 282.479 166.56 Tm
-(v) Tj
-1 0 0 1 287.399 166.56 Tm
-(er) Tj
-1 0 0 1 294.839 166.56 Tm
-(,) Tj
-1 0 0 1 72 154.56 Tm
-(f) Tj
-1 0 0 1 75.24 154.56 Tm
-(ailure) Tj
-1 0 0 1 101.04 154.56 Tm
-(detectors) Tj
-1 0 0 1 140.16 154.56 Tm
-(cannot) Tj
-1 0 0 1 169.92 154.56 Tm
-(be) Tj
-1 0 0 1 182.4 154.56 Tm
-(accurate) Tj
-1 0 0 1 218.759 154.56 Tm
-(in) Tj
-1 0 0 1 229.679 154.56 Tm
-(an) Tj
-1 0 0 1 242.159 154.56 Tm
-(asynchronous) Tj
-1 0 0 1 72 142.68 Tm
-(system) Tj
-1 0 0 1 101.88 142.68 Tm
-([21) Tj
-1 0 0 1 115.08 142.68 Tm
-(],) Tj
-1 0 0 1 123.24 142.68 Tm
-(i.e.,) Tj
-1 0 0 1 140.04 142.68 Tm
-(the) Tj
-1 0 0 1 152.16 142.68 Tm
-(y) Tj
-1 0 0 1 159.24 142.68 Tm
-(may) Tj
-1 0 0 1 178.68 142.68 Tm
-(misclassify) Tj
-1 0 0 1 225.6 142.68 Tm
-(a) Tj
-1 0 0 1 232.199 142.68 Tm
-(replica) Tj
-1 0 0 1 261.479 142.68 Tm
-(as) Tj
-1 0 0 1 272.039 142.68 Tm
-(f) Tj
-1 0 0 1 275.279 142.68 Tm
-(aulty) Tj
-1 0 0 1 294.719 142.68 Tm
-(.) Tj
-1 0 0 1 72 130.68 Tm
-(Since) Tj
-1 0 0 1 97.1999 130.68 Tm
-(correctness) Tj
-1 0 0 1 145.2 130.68 Tm
-(requires) Tj
-1 0 0 1 180.36 130.68 Tm
-(that) Tj
-1 0 0 1 198.48 130.68 Tm
-(fe) Tj
-1 0 0 1 206.04 130.68 Tm
-(wer) Tj
-1 0 0 1 224.04 130.68 Tm
-(than) Tj
-1 0 0 1 244.319 130.68 Tm
-(1) Tj
-ET
-Q
-q
-W
-0 0 612 792 re
-n
-endstream
-endobj
-746 0 obj
-12837
-endobj
-747 0 obj
-<< /Type /XObject /Name /R747 /Subtype /Image /Length 748 0 R
-/ImageMask true /Width 39 /Height 100 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 39 /BlackIs1 true >>]
->>
-stream
-02pd&_uAQfhsfOthtP%fhtQ$thtQ%&_uAQfhqUH1s02O;s1\Mfs1\N;s1\NIs+^Qfs02Iq'ECB$~>
-endstream
-endobj
-748 0 obj
-78
-endobj
-749 0 obj
-<< /Length 750 0 R >>
-stream
-q
-3.9 0 0 -10 249.9 138.2 cm
-/R747 Do
-Q
-BT
-/R738 10 Tf
-1 0 0 1 254.399 130.68 Tm
-(3) Tj
-1 0 0 1 262.319 130.68 Tm
-(of) Tj
-1 0 0 1 273.719 130.68 Tm
-(group) Tj
-1 0 0 1 72 118.8 Tm
-(members) Tj
-1 0 0 1 111.84 118.8 Tm
-(be) Tj
-1 0 0 1 124.56 118.8 Tm
-(f) Tj
-1 0 0 1 127.8 118.8 Tm
-(aulty) Tj
-1 0 0 1 147.24 118.8 Tm
-(,) Tj
-1 0 0 1 153.12 118.8 Tm
-(a) Tj
-1 0 0 1 160.8 118.8 Tm
-(misclassi\256cation) Tj
-1 0 0 1 230.64 118.8 Tm
-(can) Tj
-1 0 0 1 247.8 118.8 Tm
-(compromise) Tj
-1 0 0 1 72 106.8 Tm
-(correctness) Tj
-1 0 0 1 120.72 106.8 Tm
-(by) Tj
-1 0 0 1 134.64 106.8 Tm
-(remo) Tj
-1 0 0 1 155.16 106.8 Tm
-(ving) Tj
-1 0 0 1 176.64 106.8 Tm
-(a) Tj
-1 0 0 1 185.04 106.8 Tm
-(non-f) Tj
-1 0 0 1 206.76 106.8 Tm
-(aulty) Tj
-1 0 0 1 230.399 106.8 Tm
-(replica) Tj
-1 0 0 1 261.479 106.8 Tm
-(from) Tj
-1 0 0 1 284.879 106.8 Tm
-(the) Tj
-1 0 0 1 72 94.92 Tm
-(group.) Tj
-1 0 0 1 107.64 94.92 Tm
-(This) Tj
-1 0 0 1 129.96 94.92 Tm
-(opens) Tj
-1 0 0 1 157.8 94.92 Tm
-(an) Tj
-1 0 0 1 171.84 94.92 Tm
-(a) Tj
-1 0 0 1 176.04 94.92 Tm
-(v) Tj
-1 0 0 1 180.96 94.92 Tm
-(enue) Tj
-1 0 0 1 204.24 94.92 Tm
-(of) Tj
-1 0 0 1 217.2 94.92 Tm
-(attack:) Tj
-1 0 0 1 251.52 94.92 Tm
-(an) Tj
-1 0 0 1 265.559 94.92 Tm
-(attack) Tj
-1 0 0 1 289.319 94.92 Tm
-(er) Tj
-1 0 0 1 72 82.92 Tm
-(gains) Tj
-1 0 0 1 96.4799 82.92 Tm
-(control) Tj
-1 0 0 1 128.16 82.92 Tm
-(o) Tj
-1 0 0 1 133.08 82.92 Tm
-(v) Tj
-1 0 0 1 138 82.92 Tm
-(er) Tj
-1 0 0 1 149.04 82.92 Tm
-(a) Tj
-1 0 0 1 156.96 82.92 Tm
-(single) Tj
-1 0 0 1 184.2 82.92 Tm
-(replica) Tj
-1 0 0 1 214.799 82.92 Tm
-(b) Tj
-1 0 0 1 219.599 82.92 Tm
-(ut) Tj
-1 0 0 1 230.879 82.92 Tm
-(does) Tj
-1 0 0 1 252.599 82.92 Tm
-(not) Tj
-1 0 0 1 268.799 82.92 Tm
-(change) Tj
-1 0 0 1 72 71.04 Tm
-(its) Tj
-1 0 0 1 84.3599 71.04 Tm
-(beha) Tj
-1 0 0 1 103.08 71.04 Tm
-(vior) Tj
-1 0 0 1 121.92 71.04 Tm
-(in) Tj
-1 0 0 1 132.6 71.04 Tm
-(an) Tj
-1 0 0 1 141.96 71.04 Tm
-(y) Tj
-1 0 0 1 149.76 71.04 Tm
-(detectable) Tj
-1 0 0 1 193.08 71.04 Tm
-(w) Tj
-1 0 0 1 200.16 71.04 Tm
-(ay;) Tj
-1 0 0 1 215.4 71.04 Tm
-(then) Tj
-1 0 0 1 235.559 71.04 Tm
-(it) Tj
-1 0 0 1 243.959 71.04 Tm
-(slo) Tj
-1 0 0 1 255.359 71.04 Tm
-(ws) Tj
-1 0 0 1 269.399 71.04 Tm
-(correct) Tj
-1 0 0 1 315 709.08 Tm
-(replicas) Tj
-1 0 0 1 347.64 709.08 Tm
-(or) Tj
-1 0 0 1 357.6 709.08 Tm
-(the) Tj
-1 0 0 1 371.4 709.08 Tm
-(communication) Tj
-1 0 0 1 435.36 709.08 Tm
-(b) Tj
-1 0 0 1 440.28 709.08 Tm
-(etween) Tj
-1 0 0 1 470.04 709.08 Tm
-(them) Tj
-1 0 0 1 491.519 709.08 Tm
-(un) Tj
-1 0 0 1 501.479 709.08 Tm
-(til) Tj
-1 0 0 1 511.319 709.08 Tm
-(eno) Tj
-1 0 0 1 525.719 709.08 Tm
-(ug) Tj
-1 0 0 1 535.679 709.08 Tm
-(h) Tj
-1 0 0 1 315 697.08 Tm
-(are) Tj
-1 0 0 1 329.64 697.08 Tm
-(e) Tj
-1 0 0 1 333.96 697.08 Tm
-(xcluded) Tj
-1 0 0 1 367.92 697.08 Tm
-(from) Tj
-1 0 0 1 389.76 697.08 Tm
-(the) Tj
-1 0 0 1 404.52 697.08 Tm
-(group.) Tj
-1 0 0 1 324.96 685.2 Tm
-(T) Tj
-1 0 0 1 330.24 685.2 Tm
-(o) Tj
-1 0 0 1 338.4 685.2 Tm
-(reduce) Tj
-1 0 0 1 368.16 685.2 Tm
-(the) Tj
-1 0 0 1 383.52 685.2 Tm
-(probability) Tj
-1 0 0 1 430.32 685.2 Tm
-(of) Tj
-1 0 0 1 441.84 685.2 Tm
-(misclassi\256cation,) Tj
-1 0 0 1 514.079 685.2 Tm
-(f) Tj
-1 0 0 1 517.319 685.2 Tm
-(ailure) Tj
-1 0 0 1 315 673.2 Tm
-(detectors) Tj
-1 0 0 1 353.76 673.2 Tm
-(can) Tj
-1 0 0 1 370.44 673.2 Tm
-(be) Tj
-1 0 0 1 382.68 673.2 Tm
-(calibrated) Tj
-1 0 0 1 424.68 673.2 Tm
-(to) Tj
-1 0 0 1 435.24 673.2 Tm
-(delay) Tj
-1 0 0 1 459.719 673.2 Tm
-(classifying) Tj
-1 0 0 1 505.679 673.2 Tm
-(a) Tj
-1 0 0 1 512.879 673.2 Tm
-(replica) Tj
-1 0 0 1 315 661.32 Tm
-(as) Tj
-1 0 0 1 326.64 661.32 Tm
-(f) Tj
-1 0 0 1 329.88 661.32 Tm
-(aulty) Tj
-1 0 0 1 349.32 661.32 Tm
-(.) Tj
-1 0 0 1 357.6 661.32 Tm
-(Ho) Tj
-1 0 0 1 369.6 661.32 Tm
-(we) Tj
-1 0 0 1 381 661.32 Tm
-(v) Tj
-1 0 0 1 385.92 661.32 Tm
-(er) Tj
-1 0 0 1 393.36 661.32 Tm
-(,) Tj
-1 0 0 1 399.12 661.32 Tm
-(for) Tj
-1 0 0 1 414 661.32 Tm
-(the) Tj
-1 0 0 1 429.48 661.32 Tm
-(probability) Tj
-1 0 0 1 476.52 661.32 Tm
-(to) Tj
-1 0 0 1 487.559 661.32 Tm
-(be) Tj
-1 0 0 1 500.279 661.32 Tm
-(ne) Tj
-1 0 0 1 509.639 661.32 Tm
-(gligible) Tj
-1 0 0 1 315 649.32 Tm
-(the) Tj
-1 0 0 1 330.24 649.32 Tm
-(delay) Tj
-1 0 0 1 354.84 649.32 Tm
-(must) Tj
-1 0 0 1 377.16 649.32 Tm
-(be) Tj
-1 0 0 1 389.64 649.32 Tm
-(v) Tj
-1 0 0 1 394.56 649.32 Tm
-(ery) Tj
-1 0 0 1 410.28 649.32 Tm
-(lar) Tj
-1 0 0 1 420.72 649.32 Tm
-(ge,) Tj
-1 0 0 1 435.6 649.32 Tm
-(which) Tj
-1 0 0 1 462.959 649.32 Tm
-(is) Tj
-1 0 0 1 472.679 649.32 Tm
-(undesirable.) Tj
-1 0 0 1 526.319 649.32 Tm
-(F) Tj
-1 0 0 1 531.719 649.32 Tm
-(or) Tj
-1 0 0 1 315 637.44 Tm
-(e) Tj
-1 0 0 1 319.32 637.44 Tm
-(xample,) Tj
-1 0 0 1 353.16 637.44 Tm
-(if) Tj
-1 0 0 1 361.32 637.44 Tm
-(the) Tj
-1 0 0 1 375.48 637.44 Tm
-(primary) Tj
-1 0 0 1 409.08 637.44 Tm
-(has) Tj
-1 0 0 1 424.32 637.44 Tm
-(actually) Tj
-1 0 0 1 457.919 637.44 Tm
-(f) Tj
-1 0 0 1 461.159 637.44 Tm
-(ailed,) Tj
-1 0 0 1 485.039 637.44 Tm
-(the) Tj
-1 0 0 1 499.199 637.44 Tm
-(group) Tj
-1 0 0 1 524.519 637.44 Tm
-(will) Tj
-1 0 0 1 315 625.44 Tm
-(be) Tj
-1 0 0 1 327.84 625.44 Tm
-(unable) Tj
-1 0 0 1 357.96 625.44 Tm
-(to) Tj
-1 0 0 1 369.12 625.44 Tm
-(process) Tj
-1 0 0 1 402.48 625.44 Tm
-(client) Tj
-1 0 0 1 428.16 625.44 Tm
-(requests) Tj
-1 0 0 1 464.279 625.44 Tm
-(until) Tj
-1 0 0 1 485.999 625.44 Tm
-(the) Tj
-1 0 0 1 501.719 625.44 Tm
-(delay) Tj
-1 0 0 1 526.679 625.44 Tm
-(has) Tj
-1 0 0 1 315 613.44 Tm
-(e) Tj
-1 0 0 1 319.32 613.44 Tm
-(xpired.) Tj
-1 0 0 1 351 613.44 Tm
-(Our) Tj
-1 0 0 1 369.12 613.44 Tm
-(algorithm) Tj
-1 0 0 1 410.4 613.44 Tm
-(is) Tj
-1 0 0 1 419.64 613.44 Tm
-(not) Tj
-1 0 0 1 434.88 613.44 Tm
-(vulnerable) Tj
-1 0 0 1 479.519 613.44 Tm
-(to) Tj
-1 0 0 1 489.839 613.44 Tm
-(this) Tj
-1 0 0 1 506.759 613.44 Tm
-(problem) Tj
-1 0 0 1 315 601.56 Tm
-(because) Tj
-1 0 0 1 348.36 601.56 Tm
-(it) Tj
-1 0 0 1 355.8 601.56 Tm
-(ne) Tj
-1 0 0 1 365.04 601.56 Tm
-(v) Tj
-1 0 0 1 369.96 601.56 Tm
-(er) Tj
-1 0 0 1 379.32 601.56 Tm
-(needs) Tj
-1 0 0 1 403.92 601.56 Tm
-(to) Tj
-1 0 0 1 413.52 601.56 Tm
-(e) Tj
-1 0 0 1 417.84 601.56 Tm
-(xclude) Tj
-1 0 0 1 446.159 601.56 Tm
-(replicas) Tj
-1 0 0 1 479.039 601.56 Tm
-(from) Tj
-1 0 0 1 500.279 601.56 Tm
-(the) Tj
-1 0 0 1 514.319 601.56 Tm
-(group.) Tj
-1 0 0 1 324.96 589.56 Tm
-(Phalanx) Tj
-1 0 0 1 362.4 589.56 Tm
-([23) Tj
-1 0 0 1 375.72 589.56 Tm
-(,) Tj
-1 0 0 1 383.52 589.56 Tm
-(25) Tj
-1 0 0 1 393.48 589.56 Tm
-(]) Tj
-1 0 0 1 402.24 589.56 Tm
-(applies) Tj
-1 0 0 1 435.72 589.56 Tm
-(quorum) Tj
-1 0 0 1 472.079 589.56 Tm
-(replication) Tj
-1 0 0 1 520.079 589.56 Tm
-(tech-) Tj
-1 0 0 1 315 577.68 Tm
-(niques) Tj
-1 0 0 1 343.44 577.68 Tm
-([12) Tj
-1 0 0 1 356.76 577.68 Tm
-(]) Tj
-1 0 0 1 362.4 577.68 Tm
-(to) Tj
-1 0 0 1 372.6 577.68 Tm
-(achie) Tj
-1 0 0 1 393.48 577.68 Tm
-(v) Tj
-1 0 0 1 398.4 577.68 Tm
-(e) Tj
-1 0 0 1 405 577.68 Tm
-(Byzantine) Tj
-1 0 0 1 447.84 577.68 Tm
-(f) Tj
-1 0 0 1 451.079 577.68 Tm
-(ault-tolerance) Tj
-1 0 0 1 508.199 577.68 Tm
-(in) Tj
-1 0 0 1 518.399 577.68 Tm
-(asyn-) Tj
-1 0 0 1 315 565.68 Tm
-(chronous) Tj
-1 0 0 1 354.84 565.68 Tm
-(systems.) Tj
-1 0 0 1 394.8 565.68 Tm
-(This) Tj
-1 0 0 1 415.92 565.68 Tm
-(w) Tj
-1 0 0 1 423 565.68 Tm
-(ork) Tj
-1 0 0 1 439.56 565.68 Tm
-(does) Tj
-1 0 0 1 461.04 565.68 Tm
-(not) Tj
-1 0 0 1 477.12 565.68 Tm
-(pro) Tj
-1 0 0 1 490.44 565.68 Tm
-(vide) Tj
-1 0 0 1 510.719 565.68 Tm
-(generic) Tj
-1 0 0 1 315 553.8 Tm
-(state) Tj
-1 0 0 1 335.76 553.8 Tm
-(machine) Tj
-1 0 0 1 371.88 553.8 Tm
-(replication;) Tj
-1 0 0 1 419.76 553.8 Tm
-(instead,) Tj
-1 0 0 1 453 553.8 Tm
-(it) Tj
-1 0 0 1 460.919 553.8 Tm
-(of) Tj
-1 0 0 1 469.079 553.8 Tm
-(fers) Tj
-1 0 0 1 486.359 553.8 Tm
-(a) Tj
-1 0 0 1 493.319 553.8 Tm
-(data) Tj
-1 0 0 1 512.279 553.8 Tm
-(reposi-) Tj
-1 0 0 1 315 541.8 Tm
-(tory) Tj
-1 0 0 1 332.76 541.8 Tm
-(with) Tj
-1 0 0 1 352.32 541.8 Tm
-(operations) Tj
-1 0 0 1 395.52 541.8 Tm
-(to) Tj
-1 0 0 1 405.12 541.8 Tm
-(read) Tj
-1 0 0 1 423.96 541.8 Tm
-(and) Tj
-1 0 0 1 440.16 541.8 Tm
-(write) Tj
-1 0 0 1 462.359 541.8 Tm
-(indi) Tj
-1 0 0 1 477.719 541.8 Tm
-(vidual) Tj
-1 0 0 1 504.239 541.8 Tm
-(v) Tj
-1 0 0 1 509.039 541.8 Tm
-(ariables) Tj
-1 0 0 1 315 529.92 Tm
-(and) Tj
-1 0 0 1 332.16 529.92 Tm
-(to) Tj
-1 0 0 1 342.72 529.92 Tm
-(acquire) Tj
-1 0 0 1 374.76 529.92 Tm
-(locks.) Tj
-1 0 0 1 402.84 529.92 Tm
-(The) Tj
-1 0 0 1 421.08 529.92 Tm
-(semantics) Tj
-1 0 0 1 463.2 529.92 Tm
-(it) Tj
-1 0 0 1 471.479 529.92 Tm
-(pro) Tj
-1 0 0 1 484.799 529.92 Tm
-(vides) Tj
-1 0 0 1 508.439 529.92 Tm
-(for) Tj
-1 0 0 1 522.839 529.92 Tm
-(read) Tj
-1 0 0 1 315 517.92 Tm
-(and) Tj
-1 0 0 1 331.32 517.92 Tm
-(write) Tj
-1 0 0 1 353.88 517.92 Tm
-(operations) Tj
-1 0 0 1 397.32 517.92 Tm
-(are) Tj
-1 0 0 1 411.48 517.92 Tm
-(weak) Tj
-1 0 0 1 432.48 517.92 Tm
-(er) Tj
-1 0 0 1 442.08 517.92 Tm
-(than) Tj
-1 0 0 1 461.279 517.92 Tm
-(those) Tj
-1 0 0 1 484.319 517.92 Tm
-(of) Tj
-1 0 0 1 492.479 517.92 Tm
-(fered) Tj
-1 0 0 1 514.799 517.92 Tm
-(by) Tj
-1 0 0 1 526.679 517.92 Tm
-(our) Tj
-1 0 0 1 315 506.04 Tm
-(algorithm;) Tj
-1 0 0 1 358.56 506.04 Tm
-(we) Tj
-1 0 0 1 371.88 506.04 Tm
-(can) Tj
-1 0 0 1 387.48 506.04 Tm
-(implement) Tj
-1 0 0 1 431.88 506.04 Tm
-(arbitrary) Tj
-1 0 0 1 467.879 506.04 Tm
-(operations) Tj
-1 0 0 1 511.199 506.04 Tm
-(that) Tj
-1 0 0 1 527.879 506.04 Tm
-(ac-) Tj
-1 0 0 1 315 494.04 Tm
-(cess) Tj
-1 0 0 1 333.12 494.04 Tm
-(an) Tj
-1 0 0 1 342.48 494.04 Tm
-(y) Tj
-1 0 0 1 349.08 494.04 Tm
-(number) Tj
-1 0 0 1 381.36 494.04 Tm
-(of) Tj
-1 0 0 1 391.32 494.04 Tm
-(v) Tj
-1 0 0 1 396.12 494.04 Tm
-(ariables,) Tj
-1 0 0 1 430.8 494.04 Tm
-(whereas) Tj
-1 0 0 1 465.119 494.04 Tm
-(in) Tj
-1 0 0 1 474.479 494.04 Tm
-(Phalanx) Tj
-1 0 0 1 508.319 494.04 Tm
-(it) Tj
-1 0 0 1 515.399 494.04 Tm
-(w) Tj
-1 0 0 1 522.479 494.04 Tm
-(ould) Tj
-1 0 0 1 315 482.16 Tm
-(be) Tj
-1 0 0 1 326.64 482.16 Tm
-(necessary) Tj
-1 0 0 1 367.68 482.16 Tm
-(to) Tj
-1 0 0 1 377.76 482.16 Tm
-(acquire) Tj
-1 0 0 1 409.32 482.16 Tm
-(and) Tj
-1 0 0 1 426 482.16 Tm
-(release) Tj
-1 0 0 1 455.999 482.16 Tm
-(locks) Tj
-1 0 0 1 479.279 482.16 Tm
-(to) Tj
-1 0 0 1 489.359 482.16 Tm
-(e) Tj
-1 0 0 1 493.679 482.16 Tm
-(x) Tj
-1 0 0 1 498.599 482.16 Tm
-(ecute) Tj
-1 0 0 1 521.759 482.16 Tm
-(such) Tj
-1 0 0 1 315 470.16 Tm
-(operations.) Tj
-1 0 0 1 366.12 470.16 Tm
-(There) Tj
-1 0 0 1 393 470.16 Tm
-(are) Tj
-1 0 0 1 408.84 470.16 Tm
-(no) Tj
-1 0 0 1 422.52 470.16 Tm
-(published) Tj
-1 0 0 1 465 470.16 Tm
-(performance) Tj
-1 0 0 1 518.999 470.16 Tm
-(num-) Tj
-1 0 0 1 315 458.28 Tm
-(bers) Tj
-1 0 0 1 335.04 458.28 Tm
-(for) Tj
-1 0 0 1 350.16 458.28 Tm
-(Phalanx) Tj
-1 0 0 1 385.8 458.28 Tm
-(b) Tj
-1 0 0 1 390.6 458.28 Tm
-(ut) Tj
-1 0 0 1 401.88 458.28 Tm
-(we) Tj
-1 0 0 1 417 458.28 Tm
-(belie) Tj
-1 0 0 1 436.2 458.28 Tm
-(v) Tj
-1 0 0 1 441.12 458.28 Tm
-(e) Tj
-1 0 0 1 448.8 458.28 Tm
-(our) Tj
-1 0 0 1 465.599 458.28 Tm
-(algorithm) Tj
-1 0 0 1 507.839 458.28 Tm
-(is) Tj
-1 0 0 1 517.919 458.28 Tm
-(f) Tj
-1 0 0 1 521.159 458.28 Tm
-(aster) Tj
-1 0 0 1 315 446.28 Tm
-(because) Tj
-1 0 0 1 349.68 446.28 Tm
-(it) Tj
-1 0 0 1 358.32 446.28 Tm
-(has) Tj
-1 0 0 1 374.76 446.28 Tm
-(fe) Tj
-1 0 0 1 382.32 446.28 Tm
-(wer) Tj
-1 0 0 1 400.32 446.28 Tm
-(message) Tj
-1 0 0 1 437.28 446.28 Tm
-(delays) Tj
-1 0 0 1 465.84 446.28 Tm
-(in) Tj
-1 0 0 1 476.76 446.28 Tm
-(the) Tj
-1 0 0 1 491.999 446.28 Tm
-(critical) Tj
-1 0 0 1 522.839 446.28 Tm
-(path) Tj
-1 0 0 1 315 434.4 Tm
-(and) Tj
-1 0 0 1 332.4 434.4 Tm
-(because) Tj
-1 0 0 1 366.96 434.4 Tm
-(of) Tj
-1 0 0 1 378.36 434.4 Tm
-(our) Tj
-1 0 0 1 394.68 434.4 Tm
-(use) Tj
-1 0 0 1 410.88 434.4 Tm
-(of) Tj
-1 0 0 1 422.28 434.4 Tm
-(MA) Tj
-1 0 0 1 438 434.4 Tm
-(Cs) Tj
-1 0 0 1 451.44 434.4 Tm
-(rather) Tj
-1 0 0 1 477.719 434.4 Tm
-(than) Tj
-1 0 0 1 497.879 434.4 Tm
-(public) Tj
-1 0 0 1 525.839 434.4 Tm
-(k) Tj
-1 0 0 1 530.759 434.4 Tm
-(e) Tj
-1 0 0 1 535.079 434.4 Tm
-(y) Tj
-1 0 0 1 315 422.4 Tm
-(cryptography) Tj
-1 0 0 1 368.04 422.4 Tm
-(.) Tj
-1 0 0 1 373.44 422.4 Tm
-(The) Tj
-1 0 0 1 391.32 422.4 Tm
-(approach) Tj
-1 0 0 1 430.2 422.4 Tm
-(in) Tj
-1 0 0 1 440.28 422.4 Tm
-(Phalanx) Tj
-1 0 0 1 474.719 422.4 Tm
-(of) Tj
-1 0 0 1 482.879 422.4 Tm
-(fers) Tj
-1 0 0 1 500.039 422.4 Tm
-(the) Tj
-1 0 0 1 514.559 422.4 Tm
-(poten-) Tj
-1 0 0 1 315 410.52 Tm
-(tial) Tj
-1 0 0 1 330.24 410.52 Tm
-(for) Tj
-1 0 0 1 344.28 410.52 Tm
-(impro) Tj
-1 0 0 1 368.16 410.52 Tm
-(v) Tj
-1 0 0 1 373.08 410.52 Tm
-(ed) Tj
-1 0 0 1 384.6 410.52 Tm
-(scalability;) Tj
-1 0 0 1 430.8 410.52 Tm
-(each) Tj
-1 0 0 1 451.559 410.52 Tm
-(operation) Tj
-1 0 0 1 491.639 410.52 Tm
-(is) Tj
-1 0 0 1 500.759 410.52 Tm
-(processed) Tj
-1 0 0 1 315 398.52 Tm
-(by) Tj
-1 0 0 1 327.72 398.52 Tm
-(only) Tj
-1 0 0 1 348.36 398.52 Tm
-(a) Tj
-1 0 0 1 355.56 398.52 Tm
-(subset) Tj
-1 0 0 1 383.28 398.52 Tm
-(of) Tj
-1 0 0 1 394.44 398.52 Tm
-(replicas.) Tj
-1 0 0 1 432.48 398.52 Tm
-(But) Tj
-1 0 0 1 449.639 398.52 Tm
-(this) Tj
-1 0 0 1 466.919 398.52 Tm
-(approach) Tj
-1 0 0 1 506.159 398.52 Tm
-(to) Tj
-1 0 0 1 516.719 398.52 Tm
-(scala-) Tj
-1 0 0 1 315 386.52 Tm
-(bility) Tj
-1 0 0 1 339 386.52 Tm
-(is) Tj
-1 0 0 1 348.6 386.52 Tm
-(e) Tj
-1 0 0 1 352.92 386.52 Tm
-(xpensi) Tj
-1 0 0 1 378.84 386.52 Tm
-(v) Tj
-1 0 0 1 383.76 386.52 Tm
-(e:) Tj
-1 0 0 1 395.04 386.52 Tm
-(it) Tj
-1 0 0 1 403.56 386.52 Tm
-(requires) Tj
-ET
-endstream
-endobj
-750 0 obj
-12702
-endobj
-751 0 obj
-<< /Type /XObject /Name /R751 /Subtype /Image /Length 752 0 R
-/ImageMask true /Width 54 /Height 46 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 54 /BlackIs1 true >>]
->>
-stream
-4N]t,$m>7rl/"o@d!re,
-pYTohhg]lis4_o!aocV_^Yur>rVsXfR^`8
-endstream
-endobj
-752 0 obj
-102
-endobj
-753 0 obj
-<< /Length 754 0 R >>
-stream
-q
-5.4 0 0 -4.6 438.8 391 cm
-/R751 Do
-Q
-endstream
-endobj
-754 0 obj
-39
-endobj
-755 0 obj
-<< /Type /XObject /Name /R755 /Subtype /Image /Length 756 0 R
-/ImageMask true /Width 61 /Height 61 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 61 /BlackIs1 true >>]
->>
-stream
-,Ld57i8DMjL(5&>G[TII_hJX
-endstream
-endobj
-756 0 obj
-114
-endobj
-757 0 obj
-<< /Length 758 0 R >>
-stream
-q
-6.1 0 0 -6.1 448.8 392.1 cm
-/R755 Do
-Q
-BT
-1 0 0 1 458.999 386.52 Tm
-(4) Tj
-ET
-endstream
-endobj
-758 0 obj
-80
-endobj
-759 0 obj
-<< /Type /XObject /Name /R759 /Subtype /Image /Length 760 0 R
-/ImageMask true /Width 50 /Height 92 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 50 /BlackIs1 true >>]
->>
-stream
-5$eL7-b:K3p0<%?
-h1u#R]2'Mug].5is7$!eqtL-hqu?EZs5/V3iQXZVs7/ihqu?EZs4QRbJe-ans*o2/4DdB_@6aqq5Q~>
-endstream
-endobj
-760 0 obj
-96
-endobj
-761 0 obj
-<< /Length 762 0 R >>
-stream
-q
-5 0 0 -9.2 464.4 393.6 cm
-/R759 Do
-Q
-endstream
-endobj
-762 0 obj
-39
-endobj
-763 0 obj
-<< /Type /XObject /Name /R763 /Subtype /Image /Length 764 0 R
-/ImageMask true /Width 66 /Height 65 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 66 /BlackIs1 true >>]
->>
-stream
-,BZ6Ns8W-!s8W-!s-Eq9Iaj?!s8W-!s8W-!s8Uf'#QTA~>
-endstream
-endobj
-764 0 obj
-47
-endobj
-765 0 obj
-<< /Length 766 0 R >>
-stream
-q
-6.6 0 0 -6.5 472.9 392.3 cm
-/R763 Do
-Q
-BT
-1 0 0 1 482.639 386.52 Tm
-(1) Tj
-1 0 0 1 490.559 386.52 Tm
-(to) Tj
-1 0 0 1 501.239 386.52 Tm
-(tolerate) Tj
-ET
-q
-5 0 0 -9.2 534.4 393.6 cm
-/R759 Do
-Q
-BT
-1 0 0 1 315 374.64 Tm
-(f) Tj
-1 0 0 1 318.24 374.64 Tm
-(aults;) Tj
-1 0 0 1 342 374.64 Tm
-(each) Tj
-1 0 0 1 362.4 374.64 Tm
-(replica) Tj
-1 0 0 1 391.56 374.64 Tm
-(needs) Tj
-1 0 0 1 416.28 374.64 Tm
-(a) Tj
-1 0 0 1 422.88 374.64 Tm
-(cop) Tj
-1 0 0 1 437.279 374.64 Tm
-(y) Tj
-1 0 0 1 444.239 374.64 Tm
-(of) Tj
-1 0 0 1 454.559 374.64 Tm
-(the) Tj
-1 0 0 1 468.839 374.64 Tm
-(state;) Tj
-1 0 0 1 492.119 374.64 Tm
-(and) Tj
-1 0 0 1 508.559 374.64 Tm
-(the) Tj
-1 0 0 1 522.839 374.64 Tm
-(load) Tj
-1 0 0 1 315 362.64 Tm
-(on) Tj
-1 0 0 1 327.24 362.64 Tm
-(each) Tj
-1 0 0 1 347.88 362.64 Tm
-(replica) Tj
-1 0 0 1 377.28 362.64 Tm
-(decreases) Tj
-1 0 0 1 417.84 362.64 Tm
-(slo) Tj
-1 0 0 1 429.24 362.64 Tm
-(wly) Tj
-1 0 0 1 446.52 362.64 Tm
-(with) Tj
-ET
-q
-5.4 0 0 -4.6 466.8 367.1 cm
-/R751 Do
-Q
-BT
-1 0 0 1 474.839 362.64 Tm
-(\(it) Tj
-1 0 0 1 485.999 362.64 Tm
-(is) Tj
-1 0 0 1 494.999 362.64 Tm
-(O) Tj
-ET
-endstream
-endobj
-766 0 obj
-1078
-endobj
-767 0 obj
-<< /Type /XObject /Name /R767 /Subtype /Image /Length 768 0 R
-/ImageMask true /Width 24 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 24 /BlackIs1 true >>]
->>
-stream
-+rF]%*LO8IHL@*j8[taqp!<~>
-endstream
-endobj
-768 0 obj
-80
-endobj
-769 0 obj
-<< /Length 770 0 R >>
-stream
-q
-2.4 0 0 -9.9 503.1 370.1 cm
-/R767 Do
-Q
-BT
-1 0 0 1 506.039 362.64 Tm
-(1) Tj
-ET
-q
-3.9 0 0 -10 511.6 370.1 cm
-/R747 Do
-Q
-endstream
-endobj
-770 0 obj
-120
-endobj
-771 0 obj
-<< /Type /XObject /Name /R771 /Subtype /Image /Length 772 0 R
-/ImageMask true /Width 81 /Height 101 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 81 /BlackIs1 true >>]
->>
-stream
--4b4uVs4$gpeTs@FarU6?em+!o_%k6iI9W"?U;:&
-ks+gXYO>7?Ktk;+$eg@*p9#FpY3\,`pNM8F?c.A;p)i,bIguA6fRMZThqUEalp&,ZIrP;"Yl33N!<
-endstream
-endobj
-772 0 obj
-123
-endobj
-773 0 obj
-<< /Length 774 0 R >>
-stream
-q
-8.1 0 0 -10.1 516.6 370.3 cm
-/R771 Do
-Q
-q
-6 0 0 -0.48 524.268 370.332 cm
-BI
-/IM true /W 1 /H 1 /BPC 1 /F [/A85]
-ID !!~>
-EI
-Q
-q
-5.4 0 0 -4.6 524.5 367.1 cm
-/R751 Do
-Q
-endstream
-endobj
-774 0 obj
-168
-endobj
-775 0 obj
-<< /Type /XObject /Name /R775 /Subtype /Image /Length 776 0 R
-/ImageMask true /Width 24 /Height 99 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 24 /BlackIs1 true >>]
->>
-stream
-,JEO$loTRL4niC`hqS$`rnmKps6nkFp\Y!js6KW5s0(&RK)W@\(KK(`l\2@U?Bm&k<5,",!$D~>
-endstream
-endobj
-776 0 obj
-76
-endobj
-777 0 obj
-<< /Length 778 0 R >>
-stream
-q
-2.4 0 0 -9.9 530.7 370.1 cm
-/R775 Do
-Q
-BT
-1 0 0 1 534.12 362.64 Tm
-(\).) Tj
-/R744 12 Tf
-1 0 0 1 315 338.28 Tm
-(9) Tj
-1 0 0 1 332.88 338.28 Tm
-(Conclusions) Tj
-/R738 10 Tf
-1 0 0 1 315 321.84 Tm
-(This) Tj
-1 0 0 1 334.8 321.84 Tm
-(paper) Tj
-1 0 0 1 359.16 321.84 Tm
-(has) Tj
-1 0 0 1 374.52 321.84 Tm
-(described) Tj
-1 0 0 1 414.84 321.84 Tm
-(a) Tj
-1 0 0 1 421.44 321.84 Tm
-(ne) Tj
-1 0 0 1 430.68 321.84 Tm
-(w) Tj
-1 0 0 1 439.92 321.84 Tm
-(state-machine) Tj
-1 0 0 1 497.399 321.84 Tm
-(replication) Tj
-1 0 0 1 315 309.84 Tm
-(algorithm) Tj
-1 0 0 1 355.92 309.84 Tm
-(that) Tj
-1 0 0 1 373.08 309.84 Tm
-(is) Tj
-1 0 0 1 381.96 309.84 Tm
-(able) Tj
-1 0 0 1 400.68 309.84 Tm
-(to) Tj
-1 0 0 1 410.64 309.84 Tm
-(tolerate) Tj
-1 0 0 1 442.799 309.84 Tm
-(Byzantine) Tj
-1 0 0 1 485.399 309.84 Tm
-(f) Tj
-1 0 0 1 488.639 309.84 Tm
-(aults) Tj
-1 0 0 1 509.639 309.84 Tm
-(and) Tj
-1 0 0 1 526.199 309.84 Tm
-(can) Tj
-1 0 0 1 315 297.96 Tm
-(be) Tj
-1 0 0 1 328.2 297.96 Tm
-(used) Tj
-1 0 0 1 350.28 297.96 Tm
-(in) Tj
-1 0 0 1 361.8 297.96 Tm
-(practice:) Tj
-1 0 0 1 402.36 297.96 Tm
-(it) Tj
-1 0 0 1 411.6 297.96 Tm
-(is) Tj
-1 0 0 1 422.04 297.96 Tm
-(the) Tj
-1 0 0 1 438 297.96 Tm
-(\256rst) Tj
-1 0 0 1 457.32 297.96 Tm
-(to) Tj
-1 0 0 1 468.84 297.96 Tm
-(w) Tj
-1 0 0 1 475.92 297.96 Tm
-(ork) Tj
-1 0 0 1 493.079 297.96 Tm
-(correctly) Tj
-1 0 0 1 532.199 297.96 Tm
-(in) Tj
-1 0 0 1 315 285.96 Tm
-(an) Tj
-1 0 0 1 326.76 285.96 Tm
-(asynchronous) Tj
-1 0 0 1 383.76 285.96 Tm
-(system) Tj
-1 0 0 1 413.76 285.96 Tm
-(lik) Tj
-1 0 0 1 424.2 285.96 Tm
-(e) Tj
-1 0 0 1 430.92 285.96 Tm
-(the) Tj
-1 0 0 1 445.44 285.96 Tm
-(Internet) Tj
-1 0 0 1 478.679 285.96 Tm
-(and) Tj
-1 0 0 1 495.359 285.96 Tm
-(it) Tj
-1 0 0 1 503.159 285.96 Tm
-(impro) Tj
-1 0 0 1 527.039 285.96 Tm
-(v) Tj
-1 0 0 1 531.959 285.96 Tm
-(es) Tj
-1 0 0 1 315 274.08 Tm
-(the) Tj
-1 0 0 1 329.76 274.08 Tm
-(performance) Tj
-1 0 0 1 382.68 274.08 Tm
-(of) Tj
-1 0 0 1 393.48 274.08 Tm
-(pre) Tj
-1 0 0 1 406.08 274.08 Tm
-(vious) Tj
-1 0 0 1 430.08 274.08 Tm
-(algorithms) Tj
-1 0 0 1 475.319 274.08 Tm
-(by) Tj
-1 0 0 1 487.799 274.08 Tm
-(more) Tj
-1 0 0 1 510.839 274.08 Tm
-(than) Tj
-1 0 0 1 530.639 274.08 Tm
-(an) Tj
-1 0 0 1 315 262.08 Tm
-(order) Tj
-1 0 0 1 338.52 262.08 Tm
-(of) Tj
-1 0 0 1 349.32 262.08 Tm
-(magnitude.) Tj
-1 0 0 1 324.96 250.2 Tm
-(The) Tj
-1 0 0 1 345.96 250.2 Tm
-(paper) Tj
-1 0 0 1 373.68 250.2 Tm
-(also) Tj
-1 0 0 1 395.28 250.2 Tm
-(described) Tj
-1 0 0 1 439.08 250.2 Tm
-(BFS,) Tj
-1 0 0 1 464.88 250.2 Tm
-(a) Tj
-1 0 0 1 474.84 250.2 Tm
-(Byzantine-f) Tj
-1 0 0 1 521.999 250.2 Tm
-(ault-) Tj
-1 0 0 1 315 238.2 Tm
-(tolerant) Tj
-1 0 0 1 348.36 238.2 Tm
-(implementation) Tj
-1 0 0 1 413.88 238.2 Tm
-(of) Tj
-1 0 0 1 425.16 238.2 Tm
-(NFS.) Tj
-1 0 0 1 448.8 238.2 Tm
-(BFS) Tj
-1 0 0 1 469.56 238.2 Tm
-(demonstrates) Tj
-1 0 0 1 524.999 238.2 Tm
-(that) Tj
-1 0 0 1 315 226.32 Tm
-(it) Tj
-1 0 0 1 325.2 226.32 Tm
-(is) Tj
-1 0 0 1 336.48 226.32 Tm
-(possible) Tj
-1 0 0 1 373.8 226.32 Tm
-(to) Tj
-1 0 0 1 386.16 226.32 Tm
-(use) Tj
-1 0 0 1 404.04 226.32 Tm
-(our) Tj
-1 0 0 1 422.04 226.32 Tm
-(algorithm) Tj
-1 0 0 1 465.359 226.32 Tm
-(to) Tj
-1 0 0 1 477.839 226.32 Tm
-(implement) Tj
-1 0 0 1 525.119 226.32 Tm
-(real) Tj
-1 0 0 1 315 214.32 Tm
-(services) Tj
-1 0 0 1 348.96 214.32 Tm
-(with) Tj
-1 0 0 1 368.52 214.32 Tm
-(performance) Tj
-1 0 0 1 420.72 214.32 Tm
-(close) Tj
-1 0 0 1 443.04 214.32 Tm
-(to) Tj
-1 0 0 1 452.64 214.32 Tm
-(that) Tj
-1 0 0 1 469.319 214.32 Tm
-(of) Tj
-1 0 0 1 479.519 214.32 Tm
-(an) Tj
-1 0 0 1 490.799 214.32 Tm
-(unreplicated) Tj
-1 0 0 1 315 202.32 Tm
-(service) Tj
-1 0 0 1 345.24 202.32 Tm
-(\320) Tj
-1 0 0 1 357.12 202.32 Tm
-(the) Tj
-1 0 0 1 371.28 202.32 Tm
-(performance) Tj
-1 0 0 1 423.6 202.32 Tm
-(of) Tj
-1 0 0 1 433.92 202.32 Tm
-(BFS) Tj
-1 0 0 1 453.6 202.32 Tm
-(is) Tj
-1 0 0 1 462.24 202.32 Tm
-(only) Tj
-1 0 0 1 481.919 202.32 Tm
-(3%) Tj
-1 0 0 1 497.159 202.32 Tm
-(w) Tj
-1 0 0 1 504.239 202.32 Tm
-(orse) Tj
-1 0 0 1 522.839 202.32 Tm
-(than) Tj
-1 0 0 1 315 190.44 Tm
-(that) Tj
-1 0 0 1 332.04 190.44 Tm
-(of) Tj
-1 0 0 1 342.48 190.44 Tm
-(the) Tj
-1 0 0 1 356.88 190.44 Tm
-(standard) Tj
-1 0 0 1 392.76 190.44 Tm
-(NFS) Tj
-1 0 0 1 413.16 190.44 Tm
-(implementation) Tj
-1 0 0 1 477.839 190.44 Tm
-(in) Tj
-1 0 0 1 487.799 190.44 Tm
-(Digital) Tj
-1 0 0 1 517.559 190.44 Tm
-(Unix.) Tj
-1 0 0 1 315 178.44 Tm
-(This) Tj
-1 0 0 1 335.64 178.44 Tm
-(good) Tj
-1 0 0 1 358.44 178.44 Tm
-(performance) Tj
-1 0 0 1 411.72 178.44 Tm
-(is) Tj
-1 0 0 1 421.32 178.44 Tm
-(due) Tj
-1 0 0 1 438.6 178.44 Tm
-(to) Tj
-1 0 0 1 449.28 178.44 Tm
-(a) Tj
-1 0 0 1 456.72 178.44 Tm
-(number) Tj
-1 0 0 1 490.079 178.44 Tm
-(of) Tj
-1 0 0 1 501.239 178.44 Tm
-(important) Tj
-1 0 0 1 315 166.56 Tm
-(optimizations,) Tj
-1 0 0 1 374.52 166.56 Tm
-(including) Tj
-1 0 0 1 414.84 166.56 Tm
-(replacing) Tj
-1 0 0 1 454.56 166.56 Tm
-(public-k) Tj
-1 0 0 1 487.919 166.56 Tm
-(e) Tj
-1 0 0 1 492.239 166.56 Tm
-(y) Tj
-1 0 0 1 499.559 166.56 Tm
-(signatures) Tj
-1 0 0 1 315 154.56 Tm
-(by) Tj
-1 0 0 1 329.52 154.56 Tm
-(v) Tj
-1 0 0 1 334.44 154.56 Tm
-(ectors) Tj
-1 0 0 1 362.76 154.56 Tm
-(of) Tj
-1 0 0 1 375.6 154.56 Tm
-(message) Tj
-1 0 0 1 413.88 154.56 Tm
-(authentication) Tj
-1 0 0 1 474.84 154.56 Tm
-(codes,) Tj
-1 0 0 1 505.199 154.56 Tm
-(reducing) Tj
-1 0 0 1 315 142.68 Tm
-(the) Tj
-1 0 0 1 330.96 142.68 Tm
-(size) Tj
-1 0 0 1 350.16 142.68 Tm
-(and) Tj
-1 0 0 1 368.4 142.68 Tm
-(number) Tj
-1 0 0 1 402.6 142.68 Tm
-(of) Tj
-1 0 0 1 414.6 142.68 Tm
-(messages,) Tj
-1 0 0 1 458.88 142.68 Tm
-(and) Tj
-1 0 0 1 477 142.68 Tm
-(the) Tj
-1 0 0 1 492.96 142.68 Tm
-(incremental) Tj
-1 0 0 1 315 130.68 Tm
-(checkpoint-management) Tj
-1 0 0 1 415.44 130.68 Tm
-(techniques.) Tj
-1 0 0 1 324.96 118.8 Tm
-(One) Tj
-1 0 0 1 345.84 118.8 Tm
-(reason) Tj
-1 0 0 1 376.08 118.8 Tm
-(why) Tj
-1 0 0 1 397.44 118.8 Tm
-(Byzantine-f) Tj
-1 0 0 1 444.6 118.8 Tm
-(ault-tolerant) Tj
-1 0 0 1 497.399 118.8 Tm
-(algorithms) Tj
-1 0 0 1 315 106.8 Tm
-(will) Tj
-1 0 0 1 334.8 106.8 Tm
-(be) Tj
-1 0 0 1 348.6 106.8 Tm
-(important) Tj
-1 0 0 1 391.68 106.8 Tm
-(in) Tj
-1 0 0 1 403.68 106.8 Tm
-(the) Tj
-1 0 0 1 420.24 106.8 Tm
-(future) Tj
-1 0 0 1 448.32 106.8 Tm
-(is) Tj
-1 0 0 1 459.36 106.8 Tm
-(that) Tj
-1 0 0 1 478.559 106.8 Tm
-(the) Tj
-1 0 0 1 490.679 106.8 Tm
-(y) Tj
-1 0 0 1 499.919 106.8 Tm
-(can) Tj
-1 0 0 1 518.159 106.8 Tm
-(allo) Tj
-1 0 0 1 532.919 106.8 Tm
-(w) Tj
-1 0 0 1 315 94.92 Tm
-(systems) Tj
-1 0 0 1 350.04 94.92 Tm
-(to) Tj
-1 0 0 1 361.32 94.92 Tm
-(continue) Tj
-1 0 0 1 399.12 94.92 Tm
-(to) Tj
-1 0 0 1 410.28 94.92 Tm
-(w) Tj
-1 0 0 1 417.36 94.92 Tm
-(ork) Tj
-1 0 0 1 434.16 94.92 Tm
-(correctly) Tj
-1 0 0 1 473.159 94.92 Tm
-(e) Tj
-1 0 0 1 477.359 94.92 Tm
-(v) Tj
-1 0 0 1 482.279 94.92 Tm
-(en) Tj
-1 0 0 1 494.999 94.92 Tm
-(when) Tj
-1 0 0 1 520.079 94.92 Tm
-(there) Tj
-1 0 0 1 315 82.92 Tm
-(are) Tj
-1 0 0 1 333 82.92 Tm
-(softw) Tj
-1 0 0 1 355.08 82.92 Tm
-(are) Tj
-1 0 0 1 373.08 82.92 Tm
-(errors.) Tj
-1 0 0 1 412.44 82.92 Tm
-(Not) Tj
-1 0 0 1 433.32 82.92 Tm
-(all) Tj
-1 0 0 1 449.16 82.92 Tm
-(errors) Tj
-1 0 0 1 478.199 82.92 Tm
-(are) Tj
-1 0 0 1 496.199 82.92 Tm
-(survi) Tj
-1 0 0 1 515.999 82.92 Tm
-(v) Tj
-1 0 0 1 520.799 82.92 Tm
-(able;) Tj
-1 0 0 1 315 71.04 Tm
-(our) Tj
-1 0 0 1 331.92 71.04 Tm
-(approach) Tj
-1 0 0 1 372 71.04 Tm
-(cannot) Tj
-1 0 0 1 402.12 71.04 Tm
-(mask) Tj
-1 0 0 1 426.72 71.04 Tm
-(a) Tj
-1 0 0 1 434.76 71.04 Tm
-(softw) Tj
-1 0 0 1 456.84 71.04 Tm
-(are) Tj
-1 0 0 1 472.559 71.04 Tm
-(error) Tj
-1 0 0 1 495.479 71.04 Tm
-(that) Tj
-1 0 0 1 513.959 71.04 Tm
-(occurs) Tj
-1 0 0 1 300.96 35.16 Tm
-(13) Tj
-ET
-Q
-endstream
-endobj
-778 0 obj
-7318
-endobj
-779 0 obj
-<<
-/Type /Page
-/MediaBox [0 0 612 792]
-/Parent 2 0 R
-/Resources << /ProcSet [/PDF /ImageB /Text]
-/Font <<
-/R744 744 0 R
-/R741 741 0 R
-/R738 738 0 R
->>
-/XObject <<
-/R775 775 0 R
-/R751 751 0 R
-/R771 771 0 R
-/R747 747 0 R
-/R767 767 0 R
-/R759 759 0 R
-/R763 763 0 R
-/R755 755 0 R
->>
->>
-/Contents [
-739 0 R
-742 0 R
-745 0 R
-749 0 R
-753 0 R
-757 0 R
-761 0 R
-765 0 R
-769 0 R
-773 0 R
-777 0 R
-]
->>
-endobj
-780 0 obj
-<< /Type /Font /Name /R780 /Subtype /Type1 /BaseFont /Times-Roman >>
-endobj
-781 0 obj
-<< /Length 782 0 R >>
-stream
-q
-BT
-/R780 10 Tf
-1 0 0 1 72 709.08 Tm
-(at) Tj
-1 0 0 1 85.32 709.08 Tm
-(all) Tj
-1 0 0 1 101.28 709.08 Tm
-(replicas.) Tj
-1 0 0 1 149.16 709.08 Tm
-(Ho) Tj
-1 0 0 1 161.16 709.08 Tm
-(we) Tj
-1 0 0 1 172.56 709.08 Tm
-(v) Tj
-1 0 0 1 177.48 709.08 Tm
-(er) Tj
-1 0 0 1 184.92 709.08 Tm
-(,) Tj
-1 0 0 1 194.04 709.08 Tm
-(it) Tj
-1 0 0 1 205.68 709.08 Tm
-(can) Tj
-1 0 0 1 225.6 709.08 Tm
-(mask) Tj
-1 0 0 1 252.719 709.08 Tm
-(errors) Tj
-1 0 0 1 281.999 709.08 Tm
-(that) Tj
-1 0 0 1 72 697.08 Tm
-(occur) Tj
-1 0 0 1 100.68 697.08 Tm
-(independently) Tj
-1 0 0 1 163.8 697.08 Tm
-(at) Tj
-1 0 0 1 177.6 697.08 Tm
-(dif) Tj
-1 0 0 1 188.52 697.08 Tm
-(ferent) Tj
-1 0 0 1 218.28 697.08 Tm
-(replicas,) Tj
-1 0 0 1 259.319 697.08 Tm
-(including) Tj
-1 0 0 1 72 685.2 Tm
-(nondeterministic) Tj
-1 0 0 1 143.88 685.2 Tm
-(softw) Tj
-1 0 0 1 165.96 685.2 Tm
-(are) Tj
-1 0 0 1 183 685.2 Tm
-(errors,) Tj
-1 0 0 1 214.2 685.2 Tm
-(which) Tj
-1 0 0 1 243.479 685.2 Tm
-(are) Tj
-1 0 0 1 260.519 685.2 Tm
-(the) Tj
-1 0 0 1 277.679 685.2 Tm
-(most) Tj
-1 0 0 1 72 673.2 Tm
-(problematic) Tj
-1 0 0 1 125.28 673.2 Tm
-(and) Tj
-1 0 0 1 145.32 673.2 Tm
-(persistent) Tj
-1 0 0 1 189.24 673.2 Tm
-(errors) Tj
-1 0 0 1 218.16 673.2 Tm
-(since) Tj
-1 0 0 1 244.32 673.2 Tm
-(the) Tj
-1 0 0 1 256.439 673.2 Tm
-(y) Tj
-1 0 0 1 266.999 673.2 Tm
-(are) Tj
-1 0 0 1 284.879 673.2 Tm
-(the) Tj
-1 0 0 1 72 661.32 Tm
-(hardest) Tj
-1 0 0 1 102.72 661.32 Tm
-(to) Tj
-1 0 0 1 112.44 661.32 Tm
-(detect.) Tj
-1 0 0 1 142.2 661.32 Tm
-(In) Tj
-1 0 0 1 152.52 661.32 Tm
-(f) Tj
-1 0 0 1 155.76 661.32 Tm
-(act,) Tj
-1 0 0 1 171.84 661.32 Tm
-(we) Tj
-1 0 0 1 185.52 661.32 Tm
-(encountered) Tj
-1 0 0 1 236.159 661.32 Tm
-(such) Tj
-1 0 0 1 256.439 661.32 Tm
-(a) Tj
-1 0 0 1 262.799 661.32 Tm
-(softw) Tj
-1 0 0 1 284.879 661.32 Tm
-(are) Tj
-1 0 0 1 72 649.32 Tm
-(b) Tj
-1 0 0 1 76.8 649.32 Tm
-(ug) Tj
-1 0 0 1 88.4399 649.32 Tm
-(while) Tj
-1 0 0 1 112.2 649.32 Tm
-(running) Tj
-1 0 0 1 144.96 649.32 Tm
-(our) Tj
-1 0 0 1 159.84 649.32 Tm
-(system,) Tj
-1 0 0 1 191.88 649.32 Tm
-(and) Tj
-1 0 0 1 207.96 649.32 Tm
-(our) Tj
-1 0 0 1 222.959 649.32 Tm
-(algorithm) Tj
-1 0 0 1 263.279 649.32 Tm
-(w) Tj
-1 0 0 1 270.359 649.32 Tm
-(as) Tj
-1 0 0 1 280.439 649.32 Tm
-(able) Tj
-1 0 0 1 72 637.44 Tm
-(to) Tj
-1 0 0 1 82.2 637.44 Tm
-(continue) Tj
-1 0 0 1 119.04 637.44 Tm
-(running) Tj
-1 0 0 1 152.52 637.44 Tm
-(correctly) Tj
-1 0 0 1 190.44 637.44 Tm
-(in) Tj
-1 0 0 1 200.64 637.44 Tm
-(spite) Tj
-1 0 0 1 221.999 637.44 Tm
-(of) Tj
-1 0 0 1 232.799 637.44 Tm
-(it.) Tj
-1 0 0 1 81.96 625.44 Tm
-(There) Tj
-1 0 0 1 106.92 625.44 Tm
-(is) Tj
-1 0 0 1 115.08 625.44 Tm
-(still) Tj
-1 0 0 1 131.52 625.44 Tm
-(much) Tj
-1 0 0 1 155.4 625.44 Tm
-(w) Tj
-1 0 0 1 162.48 625.44 Tm
-(ork) Tj
-1 0 0 1 177.48 625.44 Tm
-(to) Tj
-1 0 0 1 186.84 625.44 Tm
-(do) Tj
-1 0 0 1 198.36 625.44 Tm
-(on) Tj
-1 0 0 1 209.88 625.44 Tm
-(imp) Tj
-1 0 0 1 225.36 625.44 Tm
-(ro) Tj
-1 0 0 1 233.519 625.44 Tm
-(v) Tj
-1 0 0 1 238.439 625.44 Tm
-(ing) Tj
-1 0 0 1 252.719 625.44 Tm
-(ou) Tj
-1 0 0 1 262.679 625.44 Tm
-(r) Tj
-1 0 0 1 267.599 625.44 Tm
-(sy) Tj
-1 0 0 1 276.359 625.44 Tm
-(stem.) Tj
-1 0 0 1 72 613.44 Tm
-(One) Tj
-1 0 0 1 91.92 613.44 Tm
-(problem) Tj
-1 0 0 1 128.4 613.44 Tm
-(of) Tj
-1 0 0 1 139.92 613.44 Tm
-(special) Tj
-1 0 0 1 170.88 613.44 Tm
-(interest) Tj
-1 0 0 1 203.52 613.44 Tm
-(is) Tj
-1 0 0 1 213.48 613.44 Tm
-(reducing) Tj
-1 0 0 1 251.639 613.44 Tm
-(the) Tj
-1 0 0 1 267.119 613.44 Tm
-(amount) Tj
-1 0 0 1 72 601.56 Tm
-(of) Tj
-1 0 0 1 83.52 601.56 Tm
-(resources) Tj
-1 0 0 1 124.44 601.56 Tm
-(required) Tj
-1 0 0 1 160.92 601.56 Tm
-(to) Tj
-1 0 0 1 171.96 601.56 Tm
-(implement) Tj
-1 0 0 1 217.8 601.56 Tm
-(our) Tj
-1 0 0 1 234.359 601.56 Tm
-(algorithm.) Tj
-1 0 0 1 281.519 601.56 Tm
-(The) Tj
-1 0 0 1 72 589.56 Tm
-(number) Tj
-1 0 0 1 105.96 589.56 Tm
-(of) Tj
-1 0 0 1 117.84 589.56 Tm
-(replicas) Tj
-1 0 0 1 152.4 589.56 Tm
-(can) Tj
-1 0 0 1 169.8 589.56 Tm
-(be) Tj
-1 0 0 1 182.76 589.56 Tm
-(reduced) Tj
-1 0 0 1 217.8 589.56 Tm
-(by) Tj
-1 0 0 1 231.359 589.56 Tm
-(using) Tj
-ET
-Q
-q
-W
-0 0 612 792 re
-n
-endstream
-endobj
-782 0 obj
-3920
-endobj
-783 0 obj
-<< /Type /XObject /Name /R783 /Subtype /Image /Length 784 0 R
-/ImageMask true /Width 50 /Height 92 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 50 /BlackIs1 true >>]
->>
-stream
-5$eL7-b:K3p0<%?
-h1u#R]2'Mug].5is7$!eqtL-hqu?EZs5/V3iQXZVs7/ihqu?EZs4QRbJe-ans*o2/4DdB_@6aqq5Q~>
-endstream
-endobj
-784 0 obj
-96
-endobj
-785 0 obj
-<< /Length 786 0 R >>
-stream
-q
-5 0 0 -9.2 257 596.7 cm
-/R783 Do
-Q
-BT
-/R780 10 Tf
-1 0 0 1 266.039 589.56 Tm
-(replicas) Tj
-1 0 0 1 72 577.68 Tm
-(as) Tj
-1 0 0 1 83.0399 577.68 Tm
-(witnesses) Tj
-1 0 0 1 123.96 577.68 Tm
-(that) Tj
-1 0 0 1 141.72 577.68 Tm
-(are) Tj
-1 0 0 1 156.6 577.68 Tm
-(in) Tj
-1 0 0 1 164.04 577.68 Tm
-(v) Tj
-1 0 0 1 168.84 577.68 Tm
-(olv) Tj
-1 0 0 1 181.56 577.68 Tm
-(ed) Tj
-1 0 0 1 193.56 577.68 Tm
-(in) Tj
-1 0 0 1 204 577.68 Tm
-(the) Tj
-1 0 0 1 219 577.68 Tm
-(protocol) Tj
-1 0 0 1 254.999 577.68 Tm
-(only) Tj
-1 0 0 1 275.399 577.68 Tm
-(when) Tj
-1 0 0 1 72 565.68 Tm
-(some) Tj
-1 0 0 1 95.5199 565.68 Tm
-(full) Tj
-1 0 0 1 111.84 565.68 Tm
-(replica) Tj
-1 0 0 1 141.48 565.68 Tm
-(f) Tj
-1 0 0 1 144.72 565.68 Tm
-(ails.) Tj
-1 0 0 1 164.76 565.68 Tm
-(W) Tj
-1 0 0 1 173.28 565.68 Tm
-(e) Tj
-1 0 0 1 180.24 565.68 Tm
-(also) Tj
-1 0 0 1 198.84 565.68 Tm
-(belie) Tj
-1 0 0 1 218.039 565.68 Tm
-(v) Tj
-1 0 0 1 222.959 565.68 Tm
-(e) Tj
-1 0 0 1 229.679 565.68 Tm
-(that) Tj
-1 0 0 1 247.079 565.68 Tm
-(it) Tj
-1 0 0 1 255.239 565.68 Tm
-(is) Tj
-1 0 0 1 264.359 565.68 Tm
-(possible) Tj
-1 0 0 1 72 553.8 Tm
-(to) Tj
-1 0 0 1 82.68 553.8 Tm
-(reduce) Tj
-1 0 0 1 112.08 553.8 Tm
-(the) Tj
-1 0 0 1 127.08 553.8 Tm
-(number) Tj
-1 0 0 1 160.44 553.8 Tm
-(of) Tj
-1 0 0 1 171.6 553.8 Tm
-(copies) Tj
-1 0 0 1 200.04 553.8 Tm
-(of) Tj
-1 0 0 1 211.2 553.8 Tm
-(the) Tj
-1 0 0 1 226.199 553.8 Tm
-(state) Tj
-1 0 0 1 247.439 553.8 Tm
-(to) Tj
-ET
-q
-5 0 0 -9.2 258.4 560.9 cm
-/R783 Do
-Q
-endstream
-endobj
-786 0 obj
-1426
-endobj
-787 0 obj
-<< /Type /XObject /Name /R787 /Subtype /Image /Length 788 0 R
-/ImageMask true /Width 66 /Height 65 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 66 /BlackIs1 true >>]
->>
-stream
-,BZ6Ns8W-!s8W-!s-Eq9Iaj?!s8W-!s8W-!s8Uf'#QTA~>
-endstream
-endobj
-788 0 obj
-47
-endobj
-789 0 obj
-<< /Length 790 0 R >>
-stream
-q
-6.6 0 0 -6.5 266.9 559.6 cm
-/R787 Do
-Q
-BT
-1 0 0 1 276.599 553.8 Tm
-(1) Tj
-1 0 0 1 284.519 553.8 Tm
-(b) Tj
-1 0 0 1 289.319 553.8 Tm
-(ut) Tj
-1 0 0 1 72 541.8 Tm
-(the) Tj
-1 0 0 1 86.6399 541.8 Tm
-(details) Tj
-1 0 0 1 115.2 541.8 Tm
-(remain) Tj
-1 0 0 1 145.32 541.8 Tm
-(to) Tj
-1 0 0 1 155.52 541.8 Tm
-(be) Tj
-1 0 0 1 167.52 541.8 Tm
-(w) Tj
-1 0 0 1 174.6 541.8 Tm
-(ork) Tj
-1 0 0 1 187.92 541.8 Tm
-(ed) Tj
-1 0 0 1 199.68 541.8 Tm
-(out.) Tj
-ET
-endstream
-endobj
-790 0 obj
-439
-endobj
-791 0 obj
-<< /Type /Font /Name /R791 /Subtype /Type1 /BaseFont /Times-Bold >>
-endobj
-792 0 obj
-<< /Length 793 0 R >>
-stream
-BT
-/R791 10 Tf
-1 0 0 1 72 521.16 Tm
-(Ackno) Tj
-1 0 0 1 99.6 521.16 Tm
-(wledgments) Tj
-/R780 10 Tf
-1 0 0 1 72 507 Tm
-(W) Tj
-1 0 0 1 80.52 507 Tm
-(e) Tj
-1 0 0 1 90.72 507 Tm
-(w) Tj
-1 0 0 1 97.8 507 Tm
-(ould) Tj
-1 0 0 1 121.32 507 Tm
-(lik) Tj
-1 0 0 1 131.76 507 Tm
-(e) Tj
-1 0 0 1 141.84 507 Tm
-(to) Tj
-1 0 0 1 155.28 507 Tm
-(thank) Tj
-1 0 0 1 183.24 507 Tm
-(Atul) Tj
-1 0 0 1 206.64 507 Tm
-(Adya,) Tj
-1 0 0 1 237.24 507 Tm
-(Chandrasekhar) Tj
-1 0 0 1 72 495 Tm
-(Bo) Tj
-1 0 0 1 83.5199 495 Tm
-(yapati,) Tj
-1 0 0 1 112.2 495 Tm
-(Nanc) Tj
-1 0 0 1 133.2 495 Tm
-(y) Tj
-1 0 0 1 139.8 495 Tm
-(L) Tj
-1 0 0 1 145.32 495 Tm
-(ynch,) Tj
-1 0 0 1 168.96 495 Tm
-(Sape) Tj
-1 0 0 1 190.08 495 Tm
-(Mullender) Tj
-1 0 0 1 231.48 495 Tm
-(,) Tj
-1 0 0 1 235.56 495 Tm
-(Andre) Tj
-1 0 0 1 260.4 495 Tm
-(w) Tj
-1 0 0 1 269.039 495 Tm
-(Myers,) Tj
-1 0 0 1 72 483 Tm
-(Liuba) Tj
-1 0 0 1 96.9599 483 Tm
-(Shrira,) Tj
-1 0 0 1 125.4 483 Tm
-(and) Tj
-1 0 0 1 141.48 483 Tm
-(the) Tj
-1 0 0 1 155.28 483 Tm
-(anon) Tj
-1 0 0 1 174.72 483 Tm
-(ymous) Tj
-1 0 0 1 203.04 483 Tm
-(referees) Tj
-1 0 0 1 236.279 483 Tm
-(for) Tj
-1 0 0 1 249.599 483 Tm
-(their) Tj
-1 0 0 1 269.519 483 Tm
-(h) Tj
-1 0 0 1 274.439 483 Tm
-(elpf) Tj
-1 0 0 1 289.919 483 Tm
-(ul) Tj
-1 0 0 1 72 471.12 Tm
-(comments) Tj
-1 0 0 1 115.44 471.12 Tm
-(on) Tj
-1 0 0 1 127.92 471.12 Tm
-(drafts) Tj
-1 0 0 1 153.12 471.12 Tm
-(of) Tj
-1 0 0 1 163.92 471.12 Tm
-(this) Tj
-1 0 0 1 180.72 471.12 Tm
-(paper) Tj
-1 0 0 1 202.44 471.12 Tm
-(.) Tj
-/R791 12 Tf
-1 0 0 1 72 448.32 Tm
-(Refer) Tj
-1 0 0 1 100.2 448.32 Tm
-(ences) Tj
-/R780 8 Tf
-1 0 0 1 75.96 435.36 Tm
-([1]) Tj
-1 0 0 1 90.2399 435.36 Tm
-(M.) Tj
-1 0 0 1 102 435.36 Tm
-(Bellare) Tj
-1 0 0 1 127.56 435.36 Tm
-(and) Tj
-1 0 0 1 141.72 435.36 Tm
-(D.) Tj
-1 0 0 1 152.04 435.36 Tm
-(Micciancio.) Tj
-1 0 0 1 194.399 435.36 Tm
-(A) Tj
-1 0 0 1 202.679 435.36 Tm
-(Ne) Tj
-1 0 0 1 211.679 435.36 Tm
-(w) Tj
-1 0 0 1 220.199 435.36 Tm
-(P) Tj
-1 0 0 1 224.519 435.36 Tm
-(aradigm) Tj
-1 0 0 1 253.199 435.36 Tm
-(for) Tj
-1 0 0 1 265.079 435.36 Tm
-(Collision-) Tj
-1 0 0 1 90.24 425.88 Tm
-(free) Tj
-1 0 0 1 105.36 425.88 Tm
-(Hashing:) Tj
-1 0 0 1 138.48 425.88 Tm
-(Incrementality) Tj
-1 0 0 1 187.68 425.88 Tm
-(at) Tj
-1 0 0 1 196.199 425.88 Tm
-(Reduced) Tj
-1 0 0 1 226.799 425.88 Tm
-(Cost.) Tj
-1 0 0 1 248.159 425.88 Tm
-(In) Tj
-ET
-endstream
-endobj
-793 0 obj
-2256
-endobj
-794 0 obj
-<< /Type /Font /Name /R794 /Subtype /Type1 /BaseFont /Times-Italic >>
-endobj
-795 0 obj
-<< /Length 796 0 R >>
-stream
-BT
-/R794 8 Tf
-1 0 0 1 257.519 425.88 Tm
-(Advances) Tj
-1 0 0 1 290.759 425.88 Tm
-(in) Tj
-1 0 0 1 90.24 416.4 Tm
-(Cryptolo) Tj
-1 0 0 1 118.2 416.4 Tm
-(gy) Tj
-1 0 0 1 128.04 416.4 Tm
-(\261) Tj
-1 0 0 1 134.04 416.4 Tm
-(Eur) Tj
-1 0 0 1 145.68 416.4 Tm
-(ocrypt) Tj
-1 0 0 1 168 416.4 Tm
-(97) Tj
-/R780 8 Tf
-1 0 0 1 175.92 416.4 Tm
-(,) Tj
-1 0 0 1 179.88 416.4 Tm
-(1997.) Tj
-1 0 0 1 75.96 403.32 Tm
-([2]) Tj
-1 0 0 1 90.2399 403.32 Tm
-(G.) Tj
-1 0 0 1 99.5999 403.32 Tm
-(Bracha) Tj
-1 0 0 1 123.72 403.32 Tm
-(and) Tj
-1 0 0 1 136.92 403.32 Tm
-(S.) Tj
-1 0 0 1 144.84 403.32 Tm
-(T) Tj
-1 0 0 1 149.16 403.32 Tm
-(oue) Tj
-1 0 0 1 160.44 403.32 Tm
-(g.) Tj
-1 0 0 1 168.72 403.32 Tm
-(Asynchronous) Tj
-1 0 0 1 216.359 403.32 Tm
-(Consensus) Tj
-1 0 0 1 251.999 403.32 Tm
-(and) Tj
-1 0 0 1 265.079 403.32 Tm
-(Broadcast) Tj
-1 0 0 1 90.24 393.96 Tm
-(Protocols.) Tj
-/R794 8 Tf
-1 0 0 1 125.28 393.96 Tm
-(J) Tj
-1 0 0 1 128.52 393.96 Tm
-(ournal) Tj
-1 0 0 1 151.8 393.96 Tm
-(of) Tj
-1 0 0 1 159.96 393.96 Tm
-(the) Tj
-1 0 0 1 171.72 393.96 Tm
-(A) Tj
-1 0 0 1 176.4 393.96 Tm
-(CM) Tj
-/R780 8 Tf
-1 0 0 1 188.28 393.96 Tm
-(,) Tj
-1 0 0 1 192.359 393.96 Tm
-(32\(4\),) Tj
-1 0 0 1 213.599 393.96 Tm
-(1995.) Tj
-1 0 0 1 75.96 380.88 Tm
-([3]) Tj
-1 0 0 1 90.2399 380.88 Tm
-(R.) Tj
-1 0 0 1 101.52 380.88 Tm
-(Canneti) Tj
-1 0 0 1 130.2 380.88 Tm
-(and) Tj
-1 0 0 1 145.56 380.88 Tm
-(T) Tj
-1 0 0 1 149.88 380.88 Tm
-(.) Tj
-1 0 0 1 155.76 380.88 Tm
-(Rabin.) Tj
-1 0 0 1 184.68 380.88 Tm
-(Optimal) Tj
-1 0 0 1 214.679 380.88 Tm
-(Asynchronous) Tj
-1 0 0 1 264.719 380.88 Tm
-(Byzantine) Tj
-1 0 0 1 90.24 371.4 Tm
-(Agreement.) Tj
-1 0 0 1 140.04 371.4 Tm
-(T) Tj
-1 0 0 1 144.36 371.4 Tm
-(echnical) Tj
-1 0 0 1 176.4 371.4 Tm
-(Report) Tj
-1 0 0 1 203.76 371.4 Tm
-(#92-15,) Tj
-1 0 0 1 234.719 371.4 Tm
-(Computer) Tj
-1 0 0 1 272.159 371.4 Tm
-(Science) Tj
-1 0 0 1 90.24 361.92 Tm
-(Department,) Tj
-1 0 0 1 131.88 361.92 Tm
-(Hebre) Tj
-1 0 0 1 150.96 361.92 Tm
-(w) Tj
-1 0 0 1 158.88 361.92 Tm
-(Uni) Tj
-1 0 0 1 170.52 361.92 Tm
-(v) Tj
-1 0 0 1 174.36 361.92 Tm
-(ersity) Tj
-1 0 0 1 191.4 361.92 Tm
-(,) Tj
-1 0 0 1 195.719 361.92 Tm
-(1992.) Tj
-1 0 0 1 75.96 348.96 Tm
-([4]) Tj
-1 0 0 1 90.2399 348.96 Tm
-(M.) Tj
-1 0 0 1 102.96 348.96 Tm
-(Castro) Tj
-1 0 0 1 127.32 348.96 Tm
-(and) Tj
-1 0 0 1 142.44 348.96 Tm
-(B.) Tj
-1 0 0 1 153.36 348.96 Tm
-(Lisk) Tj
-1 0 0 1 167.4 348.96 Tm
-(o) Tj
-1 0 0 1 171.24 348.96 Tm
-(v) Tj
-1 0 0 1 174.72 348.96 Tm
-(.) Tj
-1 0 0 1 183.84 348.96 Tm
-(A) Tj
-1 0 0 1 193.2 348.96 Tm
-(Correctness) Tj
-1 0 0 1 234.479 348.96 Tm
-(Proof) Tj
-1 0 0 1 255.719 348.96 Tm
-(for) Tj
-1 0 0 1 268.559 348.96 Tm
-(a) Tj
-1 0 0 1 275.759 348.96 Tm
-(Practi-) Tj
-1 0 0 1 90.24 339.48 Tm
-(cal) Tj
-1 0 0 1 102.48 339.48 Tm
-(Byzantine-F) Tj
-1 0 0 1 141.36 339.48 Tm
-(ault-T) Tj
-1 0 0 1 160.08 339.48 Tm
-(olera) Tj
-1 0 0 1 175.92 339.48 Tm
-(nt) Tj
-1 0 0 1 185.76 339.48 Tm
-(Replication) Tj
-1 0 0 1 225.479 339.48 Tm
-(Algorithm.) Tj
-1 0 0 1 266.159 339.48 Tm
-(T) Tj
-1 0 0 1 270.479 339.48 Tm
-(echnical) Tj
-1 0 0 1 90.24 330 Tm
-(Memo) Tj
-1 0 0 1 114.24 330 Tm
-(MIT/LCS/TM-590,) Tj
-1 0 0 1 180 330 Tm
-(MIT) Tj
-1 0 0 1 197.88 330 Tm
-(Laboratory) Tj
-1 0 0 1 236.519 330 Tm
-(for) Tj
-1 0 0 1 248.999 330 Tm
-(Computer) Tj
-1 0 0 1 284.159 330 Tm
-(Sci-) Tj
-1 0 0 1 90.24 320.52 Tm
-(ence,) Tj
-1 0 0 1 108.84 320.52 Tm
-(1999.) Tj
-1 0 0 1 75.96 307.56 Tm
-([5]) Tj
-1 0 0 1 90.2399 307.56 Tm
-(M.) Tj
-1 0 0 1 104.4 307.56 Tm
-(Castro) Tj
-1 0 0 1 130.2 307.56 Tm
-(and) Tj
-1 0 0 1 146.88 307.56 Tm
-(B.) Tj
-1 0 0 1 159.24 307.56 Tm
-(Lisk) Tj
-1 0 0 1 173.28 307.56 Tm
-(o) Tj
-1 0 0 1 177.12 307.56 Tm
-(v) Tj
-1 0 0 1 180.6 307.56 Tm
-(.) Tj
-1 0 0 1 193.56 307.56 Tm
-(Authenticated) Tj
-1 0 0 1 243.359 307.56 Tm
-(Byzantine) Tj
-1 0 0 1 280.679 307.56 Tm
-(F) Tj
-1 0 0 1 284.999 307.56 Tm
-(ault) Tj
-1 0 0 1 90.24 298.08 Tm
-(T) Tj
-1 0 0 1 94.56 298.08 Tm
-(olerance) Tj
-1 0 0 1 124.2 298.08 Tm
-(W) Tj
-1 0 0 1 131.4 298.08 Tm
-(ithout) Tj
-1 0 0 1 152.76 298.08 Tm
-(Public-K) Tj
-1 0 0 1 181.08 298.08 Tm
-(e) Tj
-1 0 0 1 184.44 298.08 Tm
-(y) Tj
-1 0 0 1 191.52 298.08 Tm
-(Cryptography.) Tj
-1 0 0 1 242.639 298.08 Tm
-(T) Tj
-1 0 0 1 246.959 298.08 Tm
-(echnical) Tj
-1 0 0 1 276.239 298.08 Tm
-(Memo) Tj
-1 0 0 1 90.24 288.6 Tm
-(MIT/LCS/TM-589,) Tj
-1 0 0 1 153.96 288.6 Tm
-(MIT) Tj
-1 0 0 1 170.04 288.6 Tm
-(Laboratory) Tj
-1 0 0 1 206.76 288.6 Tm
-(for) Tj
-1 0 0 1 217.439 288.6 Tm
-(Computer) Tj
-1 0 0 1 250.799 288.6 Tm
-(Science,) Tj
-1 0 0 1 279.119 288.6 Tm
-(1999.) Tj
-1 0 0 1 75.96 275.64 Tm
-([6]) Tj
-1 0 0 1 90.2399 275.64 Tm
-(F) Tj
-1 0 0 1 94.0799 275.64 Tm
-(.) Tj
-1 0 0 1 97.4399 275.64 Tm
-(Cristian,) Tj
-1 0 0 1 126.12 275.64 Tm
-(H.) Tj
-1 0 0 1 135.24 275.64 Tm
-(Aghili,) Tj
-1 0 0 1 159.12 275.64 Tm
-(H.) Tj
-1 0 0 1 168.24 275.64 Tm
-(Strong,) Tj
-1 0 0 1 193.079 275.64 Tm
-(and) Tj
-1 0 0 1 205.919 275.64 Tm
-(D.) Tj
-1 0 0 1 215.039 275.64 Tm
-(Dole) Tj
-1 0 0 1 230.159 275.64 Tm
-(v) Tj
-1 0 0 1 233.639 275.64 Tm
-(.) Tj
-1 0 0 1 237.599 275.64 Tm
-(Atomic) Tj
-1 0 0 1 262.919 275.64 Tm
-(Broadcast:) Tj
-1 0 0 1 90.24 266.16 Tm
-(From) Tj
-1 0 0 1 110.88 266.16 Tm
-(Simple) Tj
-1 0 0 1 136.68 266.16 Tm
-(Message) Tj
-1 0 0 1 167.88 266.16 Tm
-(Dif) Tj
-1 0 0 1 178.2 266.16 Tm
-(fusion) Tj
-1 0 0 1 201.48 266.16 Tm
-(to) Tj
-1 0 0 1 211.079 266.16 Tm
-(Byzantine) Tj
-1 0 0 1 246.599 266.16 Tm
-(Agreement.) Tj
-1 0 0 1 290.399 266.16 Tm
-(In) Tj
-/R794 8 Tf
-1 0 0 1 90.24 256.68 Tm
-(International) Tj
-1 0 0 1 134.28 256.68 Tm
-(Confer) Tj
-1 0 0 1 156 256.68 Tm
-(ence) Tj
-1 0 0 1 172.8 256.68 Tm
-(on) Tj
-1 0 0 1 182.76 256.68 Tm
-(F) Tj
-1 0 0 1 187.08 256.68 Tm
-(ault) Tj
-1 0 0 1 201.359 256.68 Tm
-(T) Tj
-1 0 0 1 205.079 256.68 Tm
-(oler) Tj
-1 0 0 1 217.679 256.68 Tm
-(ant) Tj
-1 0 0 1 230.039 256.68 Tm
-(Computing) Tj
-/R780 8 Tf
-1 0 0 1 265.199 256.68 Tm
-(,) Tj
-1 0 0 1 269.399 256.68 Tm
-(1985.) Tj
-1 0 0 1 75.96 243.72 Tm
-([7]) Tj
-1 0 0 1 90.2399 243.72 Tm
-(S.) Tj
-1 0 0 1 100.2 243.72 Tm
-(Deering) Tj
-1 0 0 1 129.48 243.72 Tm
-(and) Tj
-1 0 0 1 144.6 243.72 Tm
-(D.) Tj
-1 0 0 1 155.88 243.72 Tm
-(Cheriton.) Tj
-1 0 0 1 192.84 243.72 Tm
-(Multicast) Tj
-1 0 0 1 226.559 243.72 Tm
-(Routing) Tj
-1 0 0 1 255.839 243.72 Tm
-(in) Tj
-1 0 0 1 265.559 243.72 Tm
-(Datagram) Tj
-1 0 0 1 90.24 234.24 Tm
-(Internetw) Tj
-1 0 0 1 120.36 234.24 Tm
-(orks) Tj
-1 0 0 1 139.2 234.24 Tm
-(and) Tj
-1 0 0 1 155.4 234.24 Tm
-(Extended) Tj
-1 0 0 1 190.32 234.24 Tm
-(LANs.) Tj
-/R794 8 Tf
-1 0 0 1 221.88 234.24 Tm
-(A) Tj
-1 0 0 1 226.559 234.24 Tm
-(CM) Tj
-1 0 0 1 243.239 234.24 Tm
-(T) Tj
-1 0 0 1 247.199 234.24 Tm
-(r) Tj
-1 0 0 1 250.199 234.24 Tm
-(ansactions) Tj
-1 0 0 1 289.079 234.24 Tm
-(on) Tj
-1 0 0 1 90.24 224.76 Tm
-(Computer) Tj
-1 0 0 1 124.08 224.76 Tm
-(Systems) Tj
-/R780 8 Tf
-1 0 0 1 149.16 224.76 Tm
-(,) Tj
-1 0 0 1 153.36 224.76 Tm
-(8\(2\),) Tj
-1 0 0 1 170.64 224.76 Tm
-(1990.) Tj
-1 0 0 1 75.96 211.8 Tm
-([8]) Tj
-1 0 0 1 90.2399 211.8 Tm
-(H.) Tj
-1 0 0 1 100.56 211.8 Tm
-(Dobbertin.) Tj
-1 0 0 1 139.44 211.8 Tm
-(The) Tj
-1 0 0 1 154.44 211.8 Tm
-(Status) Tj
-1 0 0 1 176.52 211.8 Tm
-(of) Tj
-1 0 0 1 185.759 211.8 Tm
-(MD5) Tj
-1 0 0 1 205.199 211.8 Tm
-(After) Tj
-1 0 0 1 224.639 211.8 Tm
-(a) Tj
-1 0 0 1 230.759 211.8 Tm
-(Recent) Tj
-1 0 0 1 255.479 211.8 Tm
-(Attack.) Tj
-/R794 8 Tf
-1 0 0 1 283.319 211.8 Tm
-(RSA) Tj
-1 0 0 1 90.24 202.32 Tm
-(Labor) Tj
-1 0 0 1 109.56 202.32 Tm
-(atories') Tj
-1 0 0 1 136.44 202.32 Tm
-(CryptoBytes) Tj
-/R780 8 Tf
-1 0 0 1 175.56 202.32 Tm
-(,) Tj
-1 0 0 1 179.76 202.32 Tm
-(2\(2\),) Tj
-1 0 0 1 197.04 202.32 Tm
-(1996.) Tj
-1 0 0 1 75.96 189.24 Tm
-([9]) Tj
-1 0 0 1 90.2399 189.24 Tm
-(M.) Tj
-1 0 0 1 104.04 189.24 Tm
-(Fischer) Tj
-1 0 0 1 126.96 189.24 Tm
-(,) Tj
-1 0 0 1 134.52 189.24 Tm
-(N.) Tj
-1 0 0 1 147 189.24 Tm
-(L) Tj
-1 0 0 1 151.44 189.24 Tm
-(ynch,) Tj
-1 0 0 1 174.24 189.24 Tm
-(and) Tj
-1 0 0 1 190.44 189.24 Tm
-(M.) Tj
-1 0 0 1 204.24 189.24 Tm
-(P) Tj
-1 0 0 1 208.559 189.24 Tm
-(aterson.) Tj
-1 0 0 1 243.599 189.24 Tm
-(Impossibility) Tj
-1 0 0 1 290.399 189.24 Tm
-(of) Tj
-1 0 0 1 90.24 179.76 Tm
-(Distrib) Tj
-1 0 0 1 112.08 179.76 Tm
-(uted) Tj
-1 0 0 1 128.4 179.76 Tm
-(Consensus) Tj
-1 0 0 1 164.88 179.76 Tm
-(W) Tj
-1 0 0 1 172.08 179.76 Tm
-(ith) Tj
-1 0 0 1 182.88 179.76 Tm
-(One) Tj
-1 0 0 1 198.6 179.76 Tm
-(F) Tj
-1 0 0 1 202.92 179.76 Tm
-(aulty) Tj
-1 0 0 1 221.279 179.76 Tm
-(Process.) Tj
-/R794 8 Tf
-1 0 0 1 251.639 179.76 Tm
-(J) Tj
-1 0 0 1 254.879 179.76 Tm
-(ournal) Tj
-1 0 0 1 278.639 179.76 Tm
-(of) Tj
-1 0 0 1 287.279 179.76 Tm
-(the) Tj
-1 0 0 1 90.24 170.4 Tm
-(A) Tj
-1 0 0 1 94.92 170.4 Tm
-(CM) Tj
-/R780 8 Tf
-1 0 0 1 106.8 170.4 Tm
-(,) Tj
-1 0 0 1 110.88 170.4 Tm
-(32\(2\),) Tj
-1 0 0 1 132.12 170.4 Tm
-(1985.) Tj
-1 0 0 1 72 157.32 Tm
-([10]) Tj
-1 0 0 1 90.2399 157.32 Tm
-(J.) Tj
-1 0 0 1 97.6799 157.32 Tm
-(Garay) Tj
-1 0 0 1 119.4 157.32 Tm
-(and) Tj
-1 0 0 1 133.2 157.32 Tm
-(Y) Tj
-1 0 0 1 137.88 157.32 Tm
-(.) Tj
-1 0 0 1 142.32 157.32 Tm
-(Moses.) Tj
-1 0 0 1 168.72 157.32 Tm
-(Fully) Tj
-1 0 0 1 187.919 157.32 Tm
-(Polynomial) Tj
-1 0 0 1 226.919 157.32 Tm
-(Byzantine) Tj
-1 0 0 1 261.599 157.32 Tm
-(Agreement) Tj
-1 0 0 1 90.24 147.84 Tm
-(for) Tj
-1 0 0 1 101.16 147.84 Tm
-(n) Tj
-ET
-endstream
-endobj
-796 0 obj
-8830
-endobj
-797 0 obj
-<< /Type /XObject /Name /R797 /Subtype /Image /Length 798 0 R
-/ImageMask true /Width 51 /Height 52 /BitsPerComponent 1 /Decode [1 0] /Filter [/ASCII85Decode /CCITTFaxDecode] /DecodeParms [null << /K -1 /Columns 51 /BlackIs1 true >>]
->>
-stream
-,P3#f%e*lbLPH9X
-(i\tPiJ30s*#NYa@,Zlr$lg+'n6k41iF,"RKG515-p_9-!e_7'&1BhQ5lu]R((_l[@6jsf^'_`-#QTA~>
-endstream
-endobj
-798 0 obj
-98
-endobj
-799 0 obj
-<< /Length 800 0 R >>
-stream
-q
-5.1 0 0 -5.2 107.5 152.4 cm
-/R797 Do
-Q
-BT
-1 0 0 1 113.4 147.84 Tm
-(3t) Tj
-1 0 0 1 121.2 147.84 Tm
-(Processors) Tj
-1 0 0 1 156.96 147.84 Tm
-(in) Tj
-1 0 0 1 164.76 147.84 Tm
-(t+1) Tj
-1 0 0 1 177.12 147.84 Tm
-(Rounds.) Tj
-/R794 8 Tf
-1 0 0 1 205.679 147.84 Tm
-(SIAM) Tj
-1 0 0 1 225.479 147.84 Tm
-(J) Tj
-1 0 0 1 228.719 147.84 Tm
-(ournal) Tj
-1 0 0 1 251.759 147.84 Tm
-(of) Tj
-1 0 0 1 259.559 147.84 Tm
-(Computing) Tj
-/R780 8 Tf
-1 0 0 1 294.719 147.84 Tm
-(,) Tj
-1 0 0 1 90.24 138.36 Tm
-(27\(1\),) Tj
-1 0 0 1 111.48 138.36 Tm
-(1998.) Tj
-1 0 0 1 72 125.4 Tm
-([11]) Tj
-1 0 0 1 90.2399 125.4 Tm
-(D.) Tj
-1 0 0 1 99.8399 125.4 Tm
-(Ga) Tj
-1 0 0 1 108.96 125.4 Tm
-(wlick) Tj
-1 0 0 1 128.64 125.4 Tm
-(and) Tj
-1 0 0 1 142.08 125.4 Tm
-(D.) Tj
-1 0 0 1 151.68 125.4 Tm
-(Kinkade.) Tj
-1 0 0 1 183.359 125.4 Tm
-(V) Tj
-1 0 0 1 188.279 125.4 Tm
-(arieties) Tj
-1 0 0 1 213.119 125.4 Tm
-(of) Tj
-1 0 0 1 221.639 125.4 Tm
-(Concurrenc) Tj
-1 0 0 1 258.359 125.4 Tm
-(y) Tj
-1 0 0 1 264.599 125.4 Tm
-(Control) Tj
-1 0 0 1 290.759 125.4 Tm
-(in) Tj
-1 0 0 1 90.24 115.92 Tm
-(IMS/VS) Tj
-1 0 0 1 118.8 115.92 Tm
-(F) Tj
-1 0 0 1 123.12 115.92 Tm
-(ast) Tj
-1 0 0 1 134.04 115.92 Tm
-(P) Tj
-1 0 0 1 138.36 115.92 Tm
-(ath.) Tj
-/R794 8 Tf
-1 0 0 1 152.88 115.92 Tm
-(Database) Tj
-1 0 0 1 185.4 115.92 Tm
-(Engineering) Tj
-/R780 8 Tf
-1 0 0 1 224.519 115.92 Tm
-(,) Tj
-1 0 0 1 228.839 115.92 Tm
-(8\(2\),) Tj
-1 0 0 1 246.119 115.92 Tm
-(1985.) Tj
-1 0 0 1 72 102.96 Tm
-([12]) Tj
-1 0 0 1 90.2399 102.96 Tm
-(D.) Tj
-1 0 0 1 100.08 102.96 Tm
-(Gif) Tj
-1 0 0 1 110.4 102.96 Tm
-(ford.) Tj
-1 0 0 1 128.76 102.96 Tm
-(W) Tj
-1 0 0 1 135.72 102.96 Tm
-(eighted) Tj
-1 0 0 1 161.28 102.96 Tm
-(V) Tj
-1 0 0 1 165.96 102.96 Tm
-(oting) Tj
-1 0 0 1 184.44 102.96 Tm
-(for) Tj
-1 0 0 1 195.719 102.96 Tm
-(Replicated) Tj
-1 0 0 1 231.959 102.96 Tm
-(Data.) Tj
-1 0 0 1 251.999 102.96 Tm
-(In) Tj
-/R794 8 Tf
-1 0 0 1 260.639 102.96 Tm
-(Symposium) Tj
-1 0 0 1 90.24 93.48 Tm
-(on) Tj
-1 0 0 1 100.2 93.48 Tm
-(Oper) Tj
-1 0 0 1 116.4 93.48 Tm
-(ating) Tj
-1 0 0 1 134.88 93.48 Tm
-(Systems) Tj
-1 0 0 1 162.12 93.48 Tm
-(Principles) Tj
-/R780 8 Tf
-1 0 0 1 194.64 93.48 Tm
-(,) Tj
-1 0 0 1 198.84 93.48 Tm
-(1979.) Tj
-1 0 0 1 72 80.52 Tm
-([13]) Tj
-1 0 0 1 90.2399 80.52 Tm
-(M.) Tj
-1 0 0 1 102.24 80.52 Tm
-(Herlihy) Tj
-1 0 0 1 129.36 80.52 Tm
-(and) Tj
-1 0 0 1 143.76 80.52 Tm
-(J.) Tj
-1 0 0 1 151.8 80.52 Tm
-(T) Tj
-1 0 0 1 156.12 80.52 Tm
-(ygar) Tj
-1 0 0 1 169.68 80.52 Tm
-(.) Tj
-1 0 0 1 176.88 80.52 Tm
-(Ho) Tj
-1 0 0 1 186.359 80.52 Tm
-(w) Tj
-1 0 0 1 194.999 80.52 Tm
-(to) Tj
-1 0 0 1 204.119 80.52 Tm
-(mak) Tj
-1 0 0 1 217.679 80.52 Tm
-(e) Tj
-1 0 0 1 224.159 80.52 Tm
-(replicated) Tj
-1 0 0 1 258.479 80.52 Tm
-(data) Tj
-1 0 0 1 274.679 80.52 Tm
-(secure.) Tj
-/R794 8 Tf
-1 0 0 1 90.24 71.04 Tm
-(Advances) Tj
-1 0 0 1 122.76 71.04 Tm
-(in) Tj
-1 0 0 1 131.04 71.04 Tm
-(Cryptolo) Tj
-1 0 0 1 159 71.04 Tm
-(gy) Tj
-1 0 0 1 168.72 71.04 Tm
-(\(LNCS) Tj
-1 0 0 1 192.48 71.04 Tm
-(293\)) Tj
-/R780 8 Tf
-1 0 0 1 206.999 71.04 Tm
-(,) Tj
-1 0 0 1 211.079 71.04 Tm
-(1988.) Tj
-1 0 0 1 315 709.08 Tm
-([14]) Tj
-1 0 0 1 333.24 709.08 Tm
-(M.) Tj
-1 0 0 1 343.92 709.08 Tm
-(Herlihy) Tj
-1 0 0 1 369.84 709.08 Tm
-(and) Tj
-1 0 0 1 383.04 709.08 Tm
-(J.) Tj
-1 0 0 1 389.76 709.08 Tm
-(W) Tj
-1 0 0 1 396.96 709.08 Tm
-(ing.) Tj
-1 0 0 1 411.359 709.08 Tm
-(Axioms) Tj
-1 0 0 1 438.239 709.08 Tm
-(for) Tj
-1 0 0 1 449.159 709.08 Tm
-(Concurrent) Tj
-1 0 0 1 486.599 709.08 Tm
-(Objects.) Tj
-1 0 0 1 515.159 709.08 Tm
-(In) Tj
-/R794 8 Tf
-1 0 0 1 523.439 709.08 Tm
-(A) Tj
-1 0 0 1 528.119 709.08 Tm
-(CM) Tj
-1 0 0 1 333.24 699.6 Tm
-(Symposium) Tj
-1 0 0 1 371.52 699.6 Tm
-(on) Tj
-1 0 0 1 381.48 699.6 Tm
-(Principles) Tj
-1 0 0 1 416.28 699.6 Tm
-(of) Tj
-1 0 0 1 424.44 699.6 Tm
-(Pr) Tj
-1 0 0 1 432.12 699.6 Tm
-(o) Tj
-1 0 0 1 435.96 699.6 Tm
-(gr) Tj
-1 0 0 1 442.919 699.6 Tm
-(amming) Tj
-1 0 0 1 470.639 699.6 Tm
-(Langua) Tj
-1 0 0 1 494.759 699.6 Tm
-(g) Tj
-1 0 0 1 498.599 699.6 Tm
-(es) Tj
-/R780 8 Tf
-1 0 0 1 505.199 699.6 Tm
-(,) Tj
-1 0 0 1 509.399 699.6 Tm
-(1987.) Tj
-1 0 0 1 315 686.52 Tm
-([15]) Tj
-1 0 0 1 333.24 686.52 Tm
-(J.) Tj
-1 0 0 1 339.72 686.52 Tm
-(Ho) Tj
-1 0 0 1 349.2 686.52 Tm
-(w) Tj
-1 0 0 1 354.84 686.52 Tm
-(ard) Tj
-1 0 0 1 366.48 686.52 Tm
-(et) Tj
-1 0 0 1 373.68 686.52 Tm
-(al.) Tj
-1 0 0 1 383.28 686.52 Tm
-(Scale) Tj
-1 0 0 1 401.879 686.52 Tm
-(and) Tj
-1 0 0 1 414.839 686.52 Tm
-(performance) Tj
-1 0 0 1 456.479 686.52 Tm
-(in) Tj
-1 0 0 1 464.039 686.52 Tm
-(a) Tj
-1 0 0 1 468.959 686.52 Tm
-(distrib) Tj
-1 0 0 1 488.999 686.52 Tm
-(uted) Tj
-1 0 0 1 504.239 686.52 Tm
-(\256le) Tj
-1 0 0 1 515.879 686.52 Tm
-(system.) Tj
-/R794 8 Tf
-1 0 0 1 333.24 677.04 Tm
-(A) Tj
-1 0 0 1 337.92 677.04 Tm
-(CM) Tj
-1 0 0 1 351.84 677.04 Tm
-(T) Tj
-1 0 0 1 355.8 677.04 Tm
-(r) Tj
-1 0 0 1 358.8 677.04 Tm
-(ansactions) Tj
-1 0 0 1 394.92 677.04 Tm
-(on) Tj
-1 0 0 1 404.88 677.04 Tm
-(Computer) Tj
-1 0 0 1 438.719 677.04 Tm
-(Systems) Tj
-/R780 8 Tf
-1 0 0 1 463.799 677.04 Tm
-(,) Tj
-1 0 0 1 467.999 677.04 Tm
-(6\(1\),) Tj
-1 0 0 1 485.159 677.04 Tm
-(1988.) Tj
-1 0 0 1 315 663.96 Tm
-([16]) Tj
-1 0 0 1 333.24 663.96 Tm
-(K.) Tj
-1 0 0 1 343.56 663.96 Tm
-(Kihlstrom,) Tj
-1 0 0 1 380.52 663.96 Tm
-(L.) Tj
-1 0 0 1 389.88 663.96 Tm
-(Moser) Tj
-1 0 0 1 409.8 663.96 Tm
-(,) Tj
-1 0 0 1 414.6 663.96 Tm
-(and) Tj
-1 0 0 1 428.64 663.96 Tm
-(P) Tj
-1 0 0 1 432.24 663.96 Tm
-(.) Tj
-1 0 0 1 436.679 663.96 Tm
-(Melliar) Tj
-1 0 0 1 459.719 663.96 Tm
-(-Smith.) Tj
-1 0 0 1 487.919 663.96 Tm
-(The) Tj
-1 0 0 1 502.799 663.96 Tm
-(SecureRing) Tj
-1 0 0 1 333.24 654.48 Tm
-(Protocols) Tj
-1 0 0 1 368.28 654.48 Tm
-(for) Tj
-1 0 0 1 382.44 654.48 Tm
-(Securing) Tj
-1 0 0 1 415.68 654.48 Tm
-(Group) Tj
-1 0 0 1 441 654.48 Tm
-(Communication.) Tj
-1 0 0 1 504.959 654.48 Tm
-(In) Tj
-/R794 8 Tf
-1 0 0 1 516.479 654.48 Tm
-(Hawaii) Tj
-1 0 0 1 333.24 645 Tm
-(International) Tj
-1 0 0 1 377.28 645 Tm
-(Confer) Tj
-1 0 0 1 399 645 Tm
-(ence) Tj
-1 0 0 1 415.8 645 Tm
-(on) Tj
-1 0 0 1 425.76 645 Tm
-(System) Tj
-1 0 0 1 449.879 645 Tm
-(Sciences) Tj
-/R780 8 Tf
-1 0 0 1 476.999 645 Tm
-(,) Tj
-1 0 0 1 481.319 645 Tm
-(1998.) Tj
-1 0 0 1 315 632.04 Tm
-([17]) Tj
-1 0 0 1 333.24 632.04 Tm
-(L.) Tj
-1 0 0 1 343.68 632.04 Tm
-(Lamport.) Tj
-1 0 0 1 380.16 632.04 Tm
-(T) Tj
-1 0 0 1 384.84 632.04 Tm
-(ime,) Tj
-1 0 0 1 402.6 632.04 Tm
-(Clocks,) Tj
-1 0 0 1 430.679 632.04 Tm
-(and) Tj
-1 0 0 1 445.799 632.04 Tm
-(the) Tj
-1 0 0 1 458.999 632.04 Tm
-(Ordering) Tj
-1 0 0 1 491.399 632.04 Tm
-(of) Tj
-1 0 0 1 501.599 632.04 Tm
-(Ev) Tj
-1 0 0 1 510.359 632.04 Tm
-(ents) Tj
-1 0 0 1 526.679 632.04 Tm
-(in) Tj
-1 0 0 1 536.519 632.04 Tm
-(a) Tj
-1 0 0 1 333.24 622.56 Tm
-(Distrib) Tj
-1 0 0 1 355.08 622.56 Tm
-(uted) Tj
-1 0 0 1 370.92 622.56 Tm
-(System.) Tj
-/R794 8 Tf
-1 0 0 1 399.24 622.56 Tm
-(Commun.) Tj
-1 0 0 1 432 622.56 Tm
-(A) Tj
-1 0 0 1 436.679 622.56 Tm
-(CM) Tj
-/R780 8 Tf
-1 0 0 1 448.559 622.56 Tm
-(,) Tj
-1 0 0 1 452.639 622.56 Tm
-(21\(7\),) Tj
-1 0 0 1 473.879 622.56 Tm
-(1978.) Tj
-1 0 0 1 315 609.48 Tm
-([18]) Tj
-1 0 0 1 333.24 609.48 Tm
-(L.) Tj
-1 0 0 1 343.2 609.48 Tm
-(Lamport.) Tj
-1 0 0 1 378.36 609.48 Tm
-(The) Tj
-1 0 0 1 393.72 609.48 Tm
-(Part-Time) Tj
-1 0 0 1 429.119 609.48 Tm
-(Parliament.) Tj
-1 0 0 1 471.359 609.48 Tm
-(T) Tj
-1 0 0 1 475.679 609.48 Tm
-(echnical) Tj
-1 0 0 1 505.319 609.48 Tm
-(Report) Tj
-1 0 0 1 530.039 609.48 Tm
-(49,) Tj
-1 0 0 1 333.24 600 Tm
-(DEC) Tj
-1 0 0 1 351.24 600 Tm
-(Systems) Tj
-1 0 0 1 379.8 600 Tm
-(Research) Tj
-1 0 0 1 411 600 Tm
-(Center) Tj
-1 0 0 1 431.64 600 Tm
-(,) Tj
-1 0 0 1 435.84 600 Tm
-(1989.) Tj
-1 0 0 1 315 586.92 Tm
-([19]) Tj
-1 0 0 1 333.24 586.92 Tm
-(L.) Tj
-1 0 0 1 342.36 586.92 Tm
-(Lamport,) Tj
-1 0 0 1 374.16 586.92 Tm
-(R.) Tj
-1 0 0 1 383.76 586.92 Tm
-(Shostak,) Tj
-1 0 0 1 413.4 586.92 Tm
-(and) Tj
-1 0 0 1 427.199 586.92 Tm
-(M.) Tj
-1 0 0 1 438.599 586.92 Tm
-(Pease.) Tj
-1 0 0 1 462.359 586.92 Tm
-(The) Tj
-1 0 0 1 477.119 586.92 Tm
-(Byzantine) Tj
-1 0 0 1 511.679 586.92 Tm
-(Generals) Tj
-1 0 0 1 333.24 577.44 Tm
-(Problem.) Tj
-/R794 8 Tf
-1 0 0 1 368.04 577.44 Tm
-(A) Tj
-1 0 0 1 372.72 577.44 Tm
-(CM) Tj
-1 0 0 1 387.72 577.44 Tm
-(T) Tj
-1 0 0 1 391.68 577.44 Tm
-(r) Tj
-1 0 0 1 394.68 577.44 Tm
-(ansactions) Tj
-1 0 0 1 431.88 577.44 Tm
-(on) Tj
-1 0 0 1 442.92 577.44 Tm
-(Pr) Tj
-1 0 0 1 450.6 577.44 Tm
-(o) Tj
-1 0 0 1 454.44 577.44 Tm
-(gr) Tj
-1 0 0 1 461.399 577.44 Tm
-(amming) Tj
-1 0 0 1 490.199 577.44 Tm
-(Langua) Tj
-1 0 0 1 514.319 577.44 Tm
-(g) Tj
-1 0 0 1 518.159 577.44 Tm
-(es) Tj
-1 0 0 1 527.999 577.44 Tm
-(and) Tj
-1 0 0 1 333.24 567.96 Tm
-(Systems) Tj
-/R780 8 Tf
-1 0 0 1 358.32 567.96 Tm
-(,) Tj
-1 0 0 1 362.52 567.96 Tm
-(4\(3\),) Tj
-1 0 0 1 379.8 567.96 Tm
-(1982.) Tj
-1 0 0 1 315 554.88 Tm
-([20]) Tj
-1 0 0 1 333.24 554.88 Tm
-(B.) Tj
-1 0 0 1 343.32 554.88 Tm
-(Lisk) Tj
-1 0 0 1 357.36 554.88 Tm
-(o) Tj
-1 0 0 1 361.2 554.88 Tm
-(v) Tj
-1 0 0 1 367.92 554.88 Tm
-(et) Tj
-1 0 0 1 376.44 554.88 Tm
-(al.) Tj
-1 0 0 1 389.04 554.88 Tm
-(Replication) Tj
-1 0 0 1 428.519 554.88 Tm
-(in) Tj
-1 0 0 1 437.519 554.88 Tm
-(the) Tj
-1 0 0 1 449.999 554.88 Tm
-(Harp) Tj
-1 0 0 1 468.599 554.88 Tm
-(File) Tj
-1 0 0 1 483.719 554.88 Tm
-(System.) Tj
-1 0 0 1 514.079 554.88 Tm
-(In) Tj
-/R794 8 Tf
-1 0 0 1 523.439 554.88 Tm
-(A) Tj
-1 0 0 1 528.119 554.88 Tm
-(CM) Tj
-1 0 0 1 333.24 545.4 Tm
-(Symposium) Tj
-1 0 0 1 371.52 545.4 Tm
-(on) Tj
-1 0 0 1 381.48 545.4 Tm
-(Oper) Tj
-1 0 0 1 397.68 545.4 Tm
-(ating) Tj
-1 0 0 1 416.16 545.4 Tm
-(System) Tj
-1 0 0 1 440.279 545.4 Tm
-(Principles) Tj
-/R780 8 Tf
-1 0 0 1 472.799 545.4 Tm
-(,) Tj
-1 0 0 1 476.999 545.4 Tm
-(1991.) Tj
-1 0 0 1 315 532.44 Tm
-([21]) Tj
-1 0 0 1 333.24 532.44 Tm
-(N.) Tj
-1 0 0 1 342.48 532.44 Tm
-(L) Tj
-1 0 0 1 346.92 532.44 Tm
-(ynch.) Tj
-/R794 8 Tf
-1 0 0 1 366.24 532.44 Tm
-(Distrib) Tj
-1 0 0 1 388.56 532.44 Tm
-(uted) Tj
-1 0 0 1 403.92 532.44 Tm
-(Algorithms) Tj
-/R780 8 Tf
-1 0 0 1 439.199 532.44 Tm
-(.) Tj
-1 0 0 1 443.279 532.44 Tm
-(Mor) Tj
-1 0 0 1 456.839 532.44 Tm
-(gan) Tj
-1 0 0 1 469.679 532.44 Tm
-(Kaufmann) Tj
-1 0 0 1 504.839 532.44 Tm
-(Publishers,) Tj
-1 0 0 1 333.24 522.96 Tm
-(1996.) Tj
-1 0 0 1 315 509.88 Tm
-([22]) Tj
-1 0 0 1 333.24 509.88 Tm
-(D.) Tj
-1 0 0 1 343.8 509.88 Tm
-(Malkhi) Tj
-1 0 0 1 369.48 509.88 Tm
-(and) Tj
-1 0 0 1 383.76 509.88 Tm
-(M.) Tj
-1 0 0 1 395.64 509.88 Tm
-(Reiter) Tj
-1 0 0 1 414.359 509.88 Tm
-(.) Tj
-1 0 0 1 421.559 509.88 Tm
-(A) Tj
-1 0 0 1 430.079 509.88 Tm
-(High-Throughput) Tj
-1 0 0 1 488.999 509.88 Tm
-(Secure) Tj
-1 0 0 1 513.479 509.88 Tm
-(Reliable) Tj
-1 0 0 1 333.24 500.4 Tm
-(Multicast) Tj
-1 0 0 1 364.92 500.4 Tm
-(Protocol.) Tj
-1 0 0 1 396.12 500.4 Tm
-(In) Tj
-/R794 8 Tf
-1 0 0 1 404.28 500.4 Tm
-(Computer) Tj
-1 0 0 1 437.759 500.4 Tm
-(Security) Tj
-1 0 0 1 465.359 500.4 Tm
-(F) Tj
-1 0 0 1 469.439 500.4 Tm
-(oundations) Tj
-1 0 0 1 506.399 500.4 Tm
-(W) Tj
-1 0 0 1 512.279 500.4 Tm
-(orkshop) Tj
-/R780 8 Tf
-1 0 0 1 537.839 500.4 Tm
-(,) Tj
-1 0 0 1 333.24 490.92 Tm
-(1996.) Tj
-1 0 0 1 315 477.84 Tm
-([23]) Tj
-1 0 0 1 333.24 477.84 Tm
-(D.) Tj
-1 0 0 1 343.32 477.84 Tm
-(Malkhi) Tj
-1 0 0 1 368.64 477.84 Tm
-(and) Tj
-1 0 0 1 382.44 477.84 Tm
-(M.) Tj
-1 0 0 1 393.84 477.84 Tm
-(Reiter) Tj
-1 0 0 1 412.56 477.84 Tm
-(.) Tj
-1 0 0 1 418.679 477.84 Tm
-(Byzantine) Tj
-1 0 0 1 453.239 477.84 Tm
-(Quorum) Tj
-1 0 0 1 482.159 477.84 Tm
-(Systems.) Tj
-1 0 0 1 514.439 477.84 Tm
-(In) Tj
-/R794 8 Tf
-1 0 0 1 523.439 477.84 Tm
-(A) Tj
-1 0 0 1 528.119 477.84 Tm
-(CM) Tj
-1 0 0 1 333.24 468.36 Tm
-(Symposium) Tj
-1 0 0 1 371.52 468.36 Tm
-(on) Tj
-1 0 0 1 381.48 468.36 Tm
-(Theory) Tj
-1 0 0 1 406.08 468.36 Tm
-(of) Tj
-1 0 0 1 414.24 468.36 Tm
-(Computing) Tj
-/R780 8 Tf
-1 0 0 1 449.399 468.36 Tm
-(,) Tj
-1 0 0 1 453.719 468.36 Tm
-(1997.) Tj
-1 0 0 1 315 455.28 Tm
-([24]) Tj
-1 0 0 1 333.24 455.28 Tm
-(D.) Tj
-1 0 0 1 344.88 455.28 Tm
-(Malkhi) Tj
-1 0 0 1 371.76 455.28 Tm
-(and) Tj
-1 0 0 1 387.12 455.28 Tm
-(M.) Tj
-1 0 0 1 399.96 455.28 Tm
-(Reiter) Tj
-1 0 0 1 418.679 455.28 Tm
-(.) Tj
-1 0 0 1 428.879 455.28 Tm
-(Unreliable) Tj
-1 0 0 1 466.319 455.28 Tm
-(Intrusion) Tj
-1 0 0 1 498.959 455.28 Tm
-(Detection) Tj
-1 0 0 1 533.759 455.28 Tm
-(in) Tj
-1 0 0 1 333.24 445.92 Tm
-(Distrib) Tj
-1 0 0 1 355.08 445.92 Tm
-(uted) Tj
-1 0 0 1 372.36 445.92 Tm
-(Computations.) Tj
-1 0 0 1 425.64 445.92 Tm
-(In) Tj
-/R794 8 Tf
-1 0 0 1 435.72 445.92 Tm
-(Computer) Tj
-1 0 0 1 470.999 445.92 Tm
-(Security) Tj
-1 0 0 1 500.519 445.92 Tm
-(F) Tj
-1 0 0 1 504.599 445.92 Tm
-(oundations) Tj
-1 0 0 1 333.24 436.44 Tm
-(W) Tj
-1 0 0 1 339.12 436.44 Tm
-(orkshop) Tj
-/R780 8 Tf
-1 0 0 1 364.68 436.44 Tm
-(,) Tj
-1 0 0 1 368.88 436.44 Tm
-(1997.) Tj
-1 0 0 1 315 423.36 Tm
-([25]) Tj
-1 0 0 1 333.24 423.36 Tm
-(D.) Tj
-1 0 0 1 344.16 423.36 Tm
-(Malkhi) Tj
-1 0 0 1 370.32 423.36 Tm
-(and) Tj
-1 0 0 1 384.96 423.36 Tm
-(M.) Tj
-1 0 0 1 397.2 423.36 Tm
-(Reiter) Tj
-1 0 0 1 415.92 423.36 Tm
-(.) Tj
-1 0 0 1 424.199 423.36 Tm
-(Secure) Tj
-1 0 0 1 449.039 423.36 Tm
-(and) Tj
-1 0 0 1 463.679 423.36 Tm
-(Scalable) Tj
-1 0 0 1 493.919 423.36 Tm
-(Replication) Tj
-1 0 0 1 533.759 423.36 Tm
-(in) Tj
-1 0 0 1 333.24 413.88 Tm
-(Phalanx.) Tj
-1 0 0 1 365.64 413.88 Tm
-(In) Tj
-/R794 8 Tf
-1 0 0 1 375 413.88 Tm
-(IEEE) Tj
-1 0 0 1 395.04 413.88 Tm
-(Symposium) Tj
-1 0 0 1 434.04 413.88 Tm
-(on) Tj
-1 0 0 1 444.6 413.88 Tm
-(Reliable) Tj
-1 0 0 1 473.879 413.88 Tm
-(Distrib) Tj
-1 0 0 1 496.199 413.88 Tm
-(uted) Tj
-1 0 0 1 512.759 413.88 Tm
-(Systems) Tj
-/R780 8 Tf
-1 0 0 1 537.839 413.88 Tm
-(,) Tj
-1 0 0 1 333.24 404.4 Tm
-(1998.) Tj
-1 0 0 1 315 391.32 Tm
-([26]) Tj
-1 0 0 1 333.24 391.32 Tm
-(B.) Tj
-1 0 0 1 342.24 391.32 Tm
-(Oki) Tj
-1 0 0 1 355.92 391.32 Tm
-(and) Tj
-1 0 0 1 369.12 391.32 Tm
-(B.) Tj
-1 0 0 1 378.12 391.32 Tm
-(Lisk) Tj
-1 0 0 1 392.16 391.32 Tm
-(o) Tj
-1 0 0 1 396 391.32 Tm
-(v) Tj
-1 0 0 1 399.48 391.32 Tm
-(.) Tj
-1 0 0 1 403.8 391.32 Tm
-(V) Tj
-1 0 0 1 409.08 391.32 Tm
-(ie) Tj
-1 0 0 1 414.479 391.32 Tm
-(wstamped) Tj
-1 0 0 1 448.679 391.32 Tm
-(Replication:) Tj
-1 0 0 1 490.319 391.32 Tm
-(A) Tj
-1 0 0 1 497.759 391.32 Tm
-(Ne) Tj
-1 0 0 1 506.759 391.32 Tm
-(w) Tj
-1 0 0 1 514.319 391.32 Tm
-(Primary) Tj
-1 0 0 1 333.24 381.84 Tm
-(Cop) Tj
-1 0 0 1 346.32 381.84 Tm
-(y) Tj
-1 0 0 1 352.8 381.84 Tm
-(Method) Tj
-1 0 0 1 379.92 381.84 Tm
-(to) Tj
-1 0 0 1 388.44 381.84 Tm
-(Support) Tj
-1 0 0 1 416.04 381.84 Tm
-(Highly-A) Tj
-1 0 0 1 445.799 381.84 Tm
-(v) Tj
-1 0 0 1 449.519 381.84 Tm
-(ailable) Tj
-1 0 0 1 473.399 381.84 Tm
-(Distrib) Tj
-1 0 0 1 495.239 381.84 Tm
-(uted) Tj
-1 0 0 1 511.439 381.84 Tm
-(Systems.) Tj
-1 0 0 1 333.24 372.36 Tm
-(In) Tj
-/R794 8 Tf
-1 0 0 1 343.68 372.36 Tm
-(A) Tj
-1 0 0 1 348.36 372.36 Tm
-(CM) Tj
-1 0 0 1 364.08 372.36 Tm
-(Symposium) Tj
-1 0 0 1 404.28 372.36 Tm
-(on) Tj
-1 0 0 1 416.04 372.36 Tm
-(Principles) Tj
-1 0 0 1 452.64 372.36 Tm
-(of) Tj
-1 0 0 1 462.599 372.36 Tm
-(Distrib) Tj
-1 0 0 1 484.919 372.36 Tm
-(uted) Tj
-1 0 0 1 502.559 372.36 Tm
-(Computing) Tj
-/R780 8 Tf
-1 0 0 1 537.719 372.36 Tm
-(,) Tj
-1 0 0 1 333.24 363 Tm
-(1988.) Tj
-1 0 0 1 315 349.92 Tm
-([27]) Tj
-1 0 0 1 333.24 349.92 Tm
-(B.) Tj
-1 0 0 1 342.36 349.92 Tm
-(Preneel) Tj
-1 0 0 1 367.92 349.92 Tm
-(and) Tj
-1 0 0 1 381.24 349.92 Tm
-(P) Tj
-1 0 0 1 384.84 349.92 Tm
-(.) Tj
-1 0 0 1 388.56 349.92 Tm
-(Oorschot.) Tj
-1 0 0 1 422.159 349.92 Tm
-(MDx-MA) Tj
-1 0 0 1 454.079 349.92 Tm
-(C) Tj
-1 0 0 1 461.279 349.92 Tm
-(and) Tj
-1 0 0 1 474.479 349.92 Tm
-(Building) Tj
-1 0 0 1 504.119 349.92 Tm
-(F) Tj
-1 0 0 1 508.439 349.92 Tm
-(ast) Tj
-1 0 0 1 519.119 349.92 Tm
-(MA) Tj
-1 0 0 1 531.599 349.92 Tm
-(Cs) Tj
-1 0 0 1 333.24 340.44 Tm
-(from) Tj
-1 0 0 1 350.76 340.44 Tm
-(Hash) Tj
-1 0 0 1 369.12 340.44 Tm
-(Functions.) Tj
-1 0 0 1 405.48 340.44 Tm
-(In) Tj
-/R794 8 Tf
-1 0 0 1 414 340.44 Tm
-(Crypto) Tj
-1 0 0 1 438.24 340.44 Tm
-(95) Tj
-/R780 8 Tf
-1 0 0 1 446.159 340.44 Tm
-(,) Tj
-1 0 0 1 450.119 340.44 Tm
-(1995.) Tj
-1 0 0 1 315 327.36 Tm
-([28]) Tj
-1 0 0 1 333.24 327.36 Tm
-(C.) Tj
-1 0 0 1 343.56 327.36 Tm
-(Pu,) Tj
-1 0 0 1 357.24 327.36 Tm
-(A.) Tj
-1 0 0 1 367.92 327.36 Tm
-(Black,) Tj
-1 0 0 1 391.8 327.36 Tm
-(C.) Tj
-1 0 0 1 402.12 327.36 Tm
-(Co) Tj
-1 0 0 1 411.12 327.36 Tm
-(w) Tj
-1 0 0 1 416.759 327.36 Tm
-(an,) Tj
-1 0 0 1 429.599 327.36 Tm
-(and) Tj
-1 0 0 1 444.119 327.36 Tm
-(J.) Tj
-1 0 0 1 452.159 327.36 Tm
-(W) Tj
-1 0 0 1 459.119 327.36 Tm
-(alpole.) Tj
-1 0 0 1 486.119 327.36 Tm
-(A) Tj
-1 0 0 1 494.879 327.36 Tm
-(Specialization) Tj
-1 0 0 1 333.24 317.88 Tm
-(T) Tj
-1 0 0 1 337.56 317.88 Tm
-(oolkit) Tj
-1 0 0 1 357.72 317.88 Tm
-(to) Tj
-1 0 0 1 365.52 317.88 Tm
-(Increase) Tj
-1 0 0 1 393.6 317.88 Tm
-(the) Tj
-1 0 0 1 404.88 317.88 Tm
-(Di) Tj
-1 0 0 1 412.56 317.88 Tm
-(v) Tj
-1 0 0 1 416.4 317.88 Tm
-(ersity) Tj
-1 0 0 1 435.839 317.88 Tm
-(of) Tj
-1 0 0 1 444.119 317.88 Tm
-(Operating) Tj
-1 0 0 1 477.599 317.88 Tm
-(Systems.) Tj
-1 0 0 1 508.319 317.88 Tm
-(In) Tj
-/R794 8 Tf
-1 0 0 1 516.479 317.88 Tm
-(ICMAS) Tj
-1 0 0 1 333.24 308.4 Tm
-(W) Tj
-1 0 0 1 339.12 308.4 Tm
-(orkshop) Tj
-1 0 0 1 366.84 308.4 Tm
-(on) Tj
-1 0 0 1 376.8 308.4 Tm
-(Immunity-Based) Tj
-1 0 0 1 431.04 308.4 Tm
-(Systems) Tj
-/R780 8 Tf
-1 0 0 1 456.119 308.4 Tm
-(,) Tj
-1 0 0 1 460.199 308.4 Tm
-(1996.) Tj
-1 0 0 1 315 295.32 Tm
-([29]) Tj
-1 0 0 1 333.24 295.32 Tm
-(M.) Tj
-1 0 0 1 344.52 295.32 Tm
-(Reiter) Tj
-1 0 0 1 363.24 295.32 Tm
-(.) Tj
-1 0 0 1 368.88 295.32 Tm
-(Secure) Tj
-1 0 0 1 392.76 295.32 Tm
-(Agreement) Tj
-1 0 0 1 430.319 295.32 Tm
-(Protocols.) Tj
-1 0 0 1 465.839 295.32 Tm
-(In) Tj
-/R794 8 Tf
-1 0 0 1 474.599 295.32 Tm
-(A) Tj
-1 0 0 1 479.279 295.32 Tm
-(CM) Tj
-1 0 0 1 493.439 295.32 Tm
-(Confer) Tj
-1 0 0 1 515.159 295.32 Tm
-(ence) Tj
-1 0 0 1 532.079 295.32 Tm
-(on) Tj
-1 0 0 1 333.24 285.84 Tm
-(Computer) Tj
-1 0 0 1 367.08 285.84 Tm
-(and) Tj
-1 0 0 1 381.12 285.84 Tm
-(Communication) Tj
-1 0 0 1 434.04 285.84 Tm
-(Security) Tj
-/R780 8 Tf
-1 0 0 1 459.839 285.84 Tm
-(,) Tj
-1 0 0 1 464.039 285.84 Tm
-(1994.) Tj
-1 0 0 1 315 272.76 Tm
-([30]) Tj
-1 0 0 1 333.24 272.76 Tm
-(M.) Tj
-1 0 0 1 346.2 272.76 Tm
-(Reiter) Tj
-1 0 0 1 364.92 272.76 Tm
-(.) Tj
-1 0 0 1 375 272.76 Tm
-(The) Tj
-1 0 0 1 391.2 272.76 Tm
-(Rampart) Tj
-1 0 0 1 422.52 272.76 Tm
-(T) Tj
-1 0 0 1 426.84 272.76 Tm
-(oolkit) Tj
-1 0 0 1 449.159 272.76 Tm
-(for) Tj
-1 0 0 1 462.359 272.76 Tm
-(Building) Tj
-1 0 0 1 494.039 272.76 Tm
-(High-Inte) Tj
-1 0 0 1 524.639 272.76 Tm
-(grity) Tj
-1 0 0 1 333.24 263.4 Tm
-(Services.) Tj
-/R794 8 Tf
-1 0 0 1 368.88 263.4 Tm
-(Theory) Tj
-1 0 0 1 394.8 263.4 Tm
-(and) Tj
-1 0 0 1 410.16 263.4 Tm
-(Pr) Tj
-1 0 0 1 418.08 263.4 Tm
-(actice) Tj
-1 0 0 1 440.519 263.4 Tm
-(in) Tj
-1 0 0 1 450.119 263.4 Tm
-(Distrib) Tj
-1 0 0 1 472.439 263.4 Tm
-(uted) Tj
-1 0 0 1 489.599 263.4 Tm
-(Systems) Tj
-1 0 0 1 518.279 263.4 Tm
-(\(LNCS) Tj
-1 0 0 1 333.24 253.92 Tm
-(938\)) Tj
-/R780 8 Tf
-1 0 0 1 347.76 253.92 Tm
-(,) Tj
-1 0 0 1 351.84 253.92 Tm
-(1995.) Tj
-1 0 0 1 315 240.84 Tm
-([31]) Tj
-1 0 0 1 333.24 240.84 Tm
-(M.) Tj
-1 0 0 1 346.92 240.84 Tm
-(Reiter) Tj
-1 0 0 1 365.64 240.84 Tm
-(.) Tj
-1 0 0 1 377.64 240.84 Tm
-(A) Tj
-1 0 0 1 387.96 240.84 Tm
-(Secure) Tj
-1 0 0 1 414.24 240.84 Tm
-(Group) Tj
-1 0 0 1 439.199 240.84 Tm
-(Membership) Tj
-1 0 0 1 484.079 240.84 Tm
-(Protocol.) Tj
-/R794 8 Tf
-1 0 0 1 522.719 240.84 Tm
-(IEEE) Tj
-1 0 0 1 333.24 231.36 Tm
-(T) Tj
-1 0 0 1 337.2 231.36 Tm
-(r) Tj
-1 0 0 1 340.2 231.36 Tm
-(ansactions) Tj
-1 0 0 1 376.32 231.36 Tm
-(on) Tj
-1 0 0 1 386.28 231.36 Tm
-(Softwar) Tj
-1 0 0 1 410.64 231.36 Tm
-(e) Tj
-1 0 0 1 416.28 231.36 Tm
-(Engineering) Tj
-/R780 8 Tf
-1 0 0 1 455.399 231.36 Tm
-(,) Tj
-1 0 0 1 459.719 231.36 Tm
-(22\(1\),) Tj
-1 0 0 1 480.959 231.36 Tm
-(1996.) Tj
-1 0 0 1 315 218.28 Tm
-([32]) Tj
-1 0 0 1 333.24 218.28 Tm
-(R.) Tj
-1 0 0 1 342.84 218.28 Tm
-(Ri) Tj
-1 0 0 1 350.04 218.28 Tm
-(v) Tj
-1 0 0 1 353.88 218.28 Tm
-(est.) Tj
-1 0 0 1 368.64 218.28 Tm
-(The) Tj
-1 0 0 1 383.4 218.28 Tm
-(MD5) Tj
-1 0 0 1 402.6 218.28 Tm
-(Message-Digest) Tj
-1 0 0 1 456.239 218.28 Tm
-(Algorithm.) Tj
-1 0 0 1 495.119 218.28 Tm
-(Internet) Tj
-1 0 0 1 522.239 218.28 Tm
-(RFC-) Tj
-1 0 0 1 333.24 208.8 Tm
-(1321,) Tj
-1 0 0 1 353.16 208.8 Tm
-(1992.) Tj
-1 0 0 1 315 195.72 Tm
-([33]) Tj
-1 0 0 1 333.24 195.72 Tm
-(R.) Tj
-1 0 0 1 345.84 195.72 Tm
-(Ri) Tj
-1 0 0 1 353.04 195.72 Tm
-(v) Tj
-1 0 0 1 356.88 195.72 Tm
-(est,) Tj
-1 0 0 1 374.04 195.72 Tm
-(A.) Tj
-1 0 0 1 387 195.72 Tm
-(Shamir) Tj
-1 0 0 1 409.56 195.72 Tm
-(,) Tj
-1 0 0 1 417.84 195.72 Tm
-(and) Tj
-1 0 0 1 434.64 195.72 Tm
-(L.) Tj
-1 0 0 1 446.759 195.72 Tm
-(Adleman.) Tj
-1 0 0 1 489.599 195.72 Tm
-(A) Tj
-1 0 0 1 500.639 195.72 Tm
-(Method) Tj
-1 0 0 1 530.759 195.72 Tm
-(for) Tj
-1 0 0 1 333.24 186.24 Tm
-(Obtaining) Tj
-1 0 0 1 369.6 186.24 Tm
-(Digital) Tj
-1 0 0 1 396.12 186.24 Tm
-(Signatures) Tj
-1 0 0 1 434.279 186.24 Tm
-(and) Tj
-1 0 0 1 450.239 186.24 Tm
-(Public-K) Tj
-1 0 0 1 478.559 186.24 Tm
-(e) Tj
-1 0 0 1 481.919 186.24 Tm
-(y) Tj
-1 0 0 1 490.679 186.24 Tm
-(Cryptosystems.) Tj
-/R794 8 Tf
-1 0 0 1 333.24 176.88 Tm
-(Communications) Tj
-1 0 0 1 389.28 176.88 Tm
-(of) Tj
-1 0 0 1 397.44 176.88 Tm
-(the) Tj
-1 0 0 1 409.2 176.88 Tm
-(A) Tj
-1 0 0 1 413.88 176.88 Tm
-(CM) Tj
-/R780 8 Tf
-1 0 0 1 425.76 176.88 Tm
-(,) Tj
-1 0 0 1 429.719 176.88 Tm
-(21\(2\),) Tj
-1 0 0 1 450.959 176.88 Tm
-(1978.) Tj
-1 0 0 1 315 163.8 Tm
-([34]) Tj
-1 0 0 1 333.24 163.8 Tm
-(F) Tj
-1 0 0 1 337.08 163.8 Tm
-(.) Tj
-1 0 0 1 341.88 163.8 Tm
-(Schneider) Tj
-1 0 0 1 372.96 163.8 Tm
-(.) Tj
-1 0 0 1 380.28 163.8 Tm
-(Implementing) Tj
-1 0 0 1 427.799 163.8 Tm
-(F) Tj
-1 0 0 1 432.119 163.8 Tm
-(ault-T) Tj
-1 0 0 1 450.839 163.8 Tm
-(olerant) Tj
-1 0 0 1 475.919 163.8 Tm
-(Services) Tj
-1 0 0 1 505.799 163.8 Tm
-(Using) Tj
-1 0 0 1 527.639 163.8 Tm
-(The) Tj
-1 0 0 1 333.24 154.32 Tm
-(State) Tj
-1 0 0 1 351.36 154.32 Tm
-(Machine) Tj
-1 0 0 1 381.48 154.32 Tm
-(Approach:) Tj
-1 0 0 1 418.44 154.32 Tm
-(A) Tj
-1 0 0 1 426.36 154.32 Tm
-(T) Tj
-1 0 0 1 430.92 154.32 Tm
-(utorial.) Tj
-/R794 8 Tf
-1 0 0 1 457.079 154.32 Tm
-(A) Tj
-1 0 0 1 461.759 154.32 Tm
-(CM) Tj
-1 0 0 1 475.799 154.32 Tm
-(Computing) Tj
-1 0 0 1 513.479 154.32 Tm
-(Surve) Tj
-1 0 0 1 531.239 154.32 Tm
-(ys) Tj
-/R780 8 Tf
-1 0 0 1 537.839 154.32 Tm
-(,) Tj
-1 0 0 1 333.24 144.84 Tm
-(22\(4\),) Tj
-1 0 0 1 354.48 144.84 Tm
-(1990.) Tj
-1 0 0 1 315 131.76 Tm
-([35]) Tj
-1 0 0 1 333.24 131.76 Tm
-(A.) Tj
-1 0 0 1 343.08 131.76 Tm
-(Shamir) Tj
-1 0 0 1 365.52 131.76 Tm
-(.) Tj
-1 0 0 1 370.92 131.76 Tm
-(Ho) Tj
-1 0 0 1 380.4 131.76 Tm
-(w) Tj
-1 0 0 1 388.32 131.76 Tm
-(to) Tj
-1 0 0 1 396.72 131.76 Tm
-(share) Tj
-1 0 0 1 415.679 131.76 Tm
-(a) Tj
-1 0 0 1 421.319 131.76 Tm
-(secret.) Tj
-/R794 8 Tf
-1 0 0 1 445.079 131.76 Tm
-(Communications) Tj
-1 0 0 1 501.239 131.76 Tm
-(of) Tj
-1 0 0 1 509.519 131.76 Tm
-(the) Tj
-1 0 0 1 521.399 131.76 Tm
-(A) Tj
-1 0 0 1 526.079 131.76 Tm
-(CM) Tj
-/R780 8 Tf
-1 0 0 1 537.959 131.76 Tm
-(,) Tj
-1 0 0 1 333.24 122.28 Tm
-(22\(11\),) Tj
-1 0 0 1 358.44 122.28 Tm
-(1979.) Tj
-1 0 0 1 315 109.2 Tm
-([36]) Tj
-1 0 0 1 333.24 109.2 Tm
-(G.) Tj
-1 0 0 1 346.44 109.2 Tm
-(Tsudik.) Tj
-1 0 0 1 382.32 109.2 Tm
-(Message) Tj
-1 0 0 1 415.56 109.2 Tm
-(Authentication) Tj
-1 0 0 1 468.359 109.2 Tm
-(with) Tj
-1 0 0 1 487.919 109.2 Tm
-(One-W) Tj
-1 0 0 1 510.719 109.2 Tm
-(ay) Tj
-1 0 0 1 523.679 109.2 Tm
-(Hash) Tj
-1 0 0 1 333.24 99.72 Tm
-(Functions.) Tj
-/R794 8 Tf
-1 0 0 1 368.52 99.72 Tm
-(A) Tj
-1 0 0 1 373.2 99.72 Tm
-(CM) Tj
-1 0 0 1 386.4 99.72 Tm
-(Computer) Tj
-1 0 0 1 419.64 99.72 Tm
-(Communications) Tj
-1 0 0 1 475.079 99.72 Tm
-(Re) Tj
-1 0 0 1 483.359 99.72 Tm
-(vie) Tj
-1 0 0 1 492.359 99.72 Tm
-(w) Tj
-/R780 8 Tf
-1 0 0 1 497.639 99.72 Tm
-(,) Tj
-1 0 0 1 501.359 99.72 Tm
-(22\(5\),) Tj
-1 0 0 1 522.119 99.72 Tm
-(1992.) Tj
-1 0 0 1 315 86.76 Tm
-([37]) Tj
-1 0 0 1 333.24 86.76 Tm
-(M.) Tj
-1 0 0 1 344.76 86.76 Tm
-(W) Tj
-1 0 0 1 351.96 86.76 Tm
-(iener) Tj
-1 0 0 1 367.2 86.76 Tm
-(.) Tj
-1 0 0 1 373.2 86.76 Tm
-(Performance) Tj
-1 0 0 1 416.28 86.76 Tm
-(Comparison) Tj
-1 0 0 1 457.679 86.76 Tm
-(of) Tj
-1 0 0 1 466.679 86.76 Tm
-(Public-K) Tj
-1 0 0 1 494.999 86.76 Tm
-(e) Tj
-1 0 0 1 498.359 86.76 Tm
-(y) Tj
-1 0 0 1 504.959 86.76 Tm
-(Cryptosys-) Tj
-1 0 0 1 333.24 77.28 Tm
-(tems.) Tj
-/R794 8 Tf
-1 0 0 1 353.16 77.28 Tm
-(RSA) Tj
-1 0 0 1 368.88 77.28 Tm
-(Labor) Tj
-1 0 0 1 388.2 77.28 Tm
-(atories') Tj
-1 0 0 1 415.08 77.28 Tm
-(CryptoBytes) Tj
-/R780 8 Tf
-1 0 0 1 454.199 77.28 Tm
-(,) Tj
-1 0 0 1 458.399 77.28 Tm
-(4\(1\),) Tj
-1 0 0 1 475.679 77.28 Tm
-(1998.) Tj
-/R780 10 Tf
-1 0 0 1 300.96 35.16 Tm
-(14) Tj
-ET
-Q
-endstream
-endobj
-800 0 obj
-23490
-endobj
-801 0 obj
-<<
-/Type /Page
-/MediaBox [0 0 612 792]
-/Parent 2 0 R
-/Resources << /ProcSet [/PDF /ImageB /Text]
-/Font <<
-/R794 794 0 R
-/R791 791 0 R
-/R780 780 0 R
->>
-/XObject <<
-/R797 797 0 R
-/R787 787 0 R
-/R783 783 0 R
->>
->>
-/Contents [
-781 0 R
-785 0 R
-789 0 R
-792 0 R
-795 0 R
-799 0 R
-]
->>
-endobj
-2 0 obj
-<< /Type /Pages /Kids [
-47 0 R
-123 0 R
-237 0 R
-355 0 R
-444 0 R
-582 0 R
-640 0 R
-690 0 R
-700 0 R
-714 0 R
-724 0 R
-737 0 R
-779 0 R
-801 0 R
-] /Count 14
->>
-endobj
-1 0 obj
-<< /Type /Catalog /Pages 2 0 R
->>
-endobj
-802 0 obj
-<< /CreationDate (D:19990701175312)
-/Producer (Aladdin Ghostscript 4.03)
->>
-endobj
-xref
-0 803
-0000000000 65535 f 
-0000745281 00000 n 
-0000745116 00000 n 
-0000000009 00000 n 
-0000000091 00000 n 
-0000000264 00000 n 
-0000000283 00000 n 
-0000000366 00000 n 
-0000001199 00000 n 
-0000001218 00000 n 
-0000001299 00000 n 
-0000002850 00000 n 
-0000002871 00000 n 
-0000003240 00000 n 
-0000003260 00000 n 
-0000003353 00000 n 
-0000003372 00000 n 
-0000003452 00000 n 
-0000003567 00000 n 
-0000003586 00000 n 
-0000003950 00000 n 
-0000003969 00000 n 
-0000014178 00000 n 
-0000014200 00000 n 
-0000014527 00000 n 
-0000014546 00000 n 
-0000014640 00000 n 
-0000014659 00000 n 
-0000015002 00000 n 
-0000015021 00000 n 
-0000015115 00000 n 
-0000015134 00000 n 
-0000015412 00000 n 
-0000015431 00000 n 
-0000015698 00000 n 
-0000015718 00000 n 
-0000016031 00000 n 
-0000016050 00000 n 
-0000016328 00000 n 
-0000016348 00000 n 
-0000016717 00000 n 
-0000016737 00000 n 
-0000033928 00000 n 
-0000033950 00000 n 
-0000034265 00000 n 
-0000034284 00000 n 
-0000036033 00000 n 
-0000036054 00000 n 
-0000036434 00000 n 
-0000036513 00000 n 
-0000036532 00000 n 
-0000036847 00000 n 
-0000036866 00000 n 
-0000036959 00000 n 
-0000036978 00000 n 
-0000037062 00000 n 
-0000041913 00000 n 
-0000041934 00000 n 
-0000042017 00000 n 
-0000050049 00000 n 
-0000050070 00000 n 
-0000050476 00000 n 
-0000050496 00000 n 
-0000050701 00000 n 
-0000050721 00000 n 
-0000051068 00000 n 
-0000051087 00000 n 
-0000051220 00000 n 
-0000051239 00000 n 
-0000051586 00000 n 
-0000051605 00000 n 
-0000051737 00000 n 
-0000051756 00000 n 
-0000052101 00000 n 
-0000052120 00000 n 
-0000052212 00000 n 
-0000052231 00000 n 
-0000052559 00000 n 
-0000052578 00000 n 
-0000052672 00000 n 
-0000052691 00000 n 
-0000053003 00000 n 
-0000053022 00000 n 
-0000053371 00000 n 
-0000053391 00000 n 
-0000053767 00000 n 
-0000053787 00000 n 
-0000053881 00000 n 
-0000053900 00000 n 
-0000054247 00000 n 
-0000054266 00000 n 
-0000054400 00000 n 
-0000054419 00000 n 
-0000054762 00000 n 
-0000054781 00000 n 
-0000062506 00000 n 
-0000062527 00000 n 
-0000062612 00000 n 
-0000065080 00000 n 
-0000065101 00000 n 
-0000065471 00000 n 
-0000065492 00000 n 
-0000067104 00000 n 
-0000067126 00000 n 
-0000067456 00000 n 
-0000067476 00000 n 
-0000067573 00000 n 
-0000067593 00000 n 
-0000067939 00000 n 
-0000067959 00000 n 
-0000068056 00000 n 
-0000068076 00000 n 
-0000068357 00000 n 
-0000068377 00000 n 
-0000068649 00000 n 
-0000068670 00000 n 
-0000068986 00000 n 
-0000069006 00000 n 
-0000081761 00000 n 
-0000081784 00000 n 
-0000082122 00000 n 
-0000082142 00000 n 
-0000082394 00000 n 
-0000082415 00000 n 
-0000082960 00000 n 
-0000083046 00000 n 
-0000083310 00000 n 
-0000083331 00000 n 
-0000083669 00000 n 
-0000083689 00000 n 
-0000083917 00000 n 
-0000083938 00000 n 
-0000084025 00000 n 
-0000084134 00000 n 
-0000084154 00000 n 
-0000084504 00000 n 
-0000084524 00000 n 
-0000084662 00000 n 
-0000084682 00000 n 
-0000085028 00000 n 
-0000085048 00000 n 
-0000088804 00000 n 
-0000088826 00000 n 
-0000089192 00000 n 
-0000089212 00000 n 
-0000089307 00000 n 
-0000089327 00000 n 
-0000089644 00000 n 
-0000089664 00000 n 
-0000091615 00000 n 
-0000091637 00000 n 
-0000092009 00000 n 
-0000092030 00000 n 
-0000092125 00000 n 
-0000092145 00000 n 
-0000092427 00000 n 
-0000092447 00000 n 
-0000095046 00000 n 
-0000095068 00000 n 
-0000095452 00000 n 
-0000095473 00000 n 
-0000100713 00000 n 
-0000100735 00000 n 
-0000100820 00000 n 
-0000102949 00000 n 
-0000102971 00000 n 
-0000103399 00000 n 
-0000103420 00000 n 
-0000103837 00000 n 
-0000103858 00000 n 
-0000104230 00000 n 
-0000104251 00000 n 
-0000104385 00000 n 
-0000104405 00000 n 
-0000104708 00000 n 
-0000104728 00000 n 
-0000104823 00000 n 
-0000104843 00000 n 
-0000105131 00000 n 
-0000105151 00000 n 
-0000105367 00000 n 
-0000105388 00000 n 
-0000105699 00000 n 
-0000105719 00000 n 
-0000105973 00000 n 
-0000105994 00000 n 
-0000106361 00000 n 
-0000106381 00000 n 
-0000106841 00000 n 
-0000106862 00000 n 
-0000107157 00000 n 
-0000107177 00000 n 
-0000110878 00000 n 
-0000110900 00000 n 
-0000111279 00000 n 
-0000111300 00000 n 
-0000111551 00000 n 
-0000111572 00000 n 
-0000111926 00000 n 
-0000111946 00000 n 
-0000123472 00000 n 
-0000123495 00000 n 
-0000123842 00000 n 
-0000123862 00000 n 
-0000124285 00000 n 
-0000124306 00000 n 
-0000124663 00000 n 
-0000124683 00000 n 
-0000124889 00000 n 
-0000124910 00000 n 
-0000125260 00000 n 
-0000125280 00000 n 
-0000125702 00000 n 
-0000125723 00000 n 
-0000126071 00000 n 
-0000126091 00000 n 
-0000126188 00000 n 
-0000126208 00000 n 
-0000126539 00000 n 
-0000126559 00000 n 
-0000126656 00000 n 
-0000126676 00000 n 
-0000126986 00000 n 
-0000127006 00000 n 
-0000132994 00000 n 
-0000133016 00000 n 
-0000133366 00000 n 
-0000133386 00000 n 
-0000133522 00000 n 
-0000133542 00000 n 
-0000133880 00000 n 
-0000133900 00000 n 
-0000134079 00000 n 
-0000134100 00000 n 
-0000134415 00000 n 
-0000134435 00000 n 
-0000136756 00000 n 
-0000136778 00000 n 
-0000137577 00000 n 
-0000137663 00000 n 
-0000137866 00000 n 
-0000137887 00000 n 
-0000138225 00000 n 
-0000138245 00000 n 
-0000138776 00000 n 
-0000138797 00000 n 
-0000139163 00000 n 
-0000139183 00000 n 
-0000144084 00000 n 
-0000144106 00000 n 
-0000144191 00000 n 
-0000144806 00000 n 
-0000144827 00000 n 
-0000144914 00000 n 
-0000146305 00000 n 
-0000146327 00000 n 
-0000146706 00000 n 
-0000146727 00000 n 
-0000147068 00000 n 
-0000147089 00000 n 
-0000147498 00000 n 
-0000147519 00000 n 
-0000154065 00000 n 
-0000154087 00000 n 
-0000154459 00000 n 
-0000154480 00000 n 
-0000155594 00000 n 
-0000155616 00000 n 
-0000155966 00000 n 
-0000155986 00000 n 
-0000156293 00000 n 
-0000156314 00000 n 
-0000156617 00000 n 
-0000156637 00000 n 
-0000156732 00000 n 
-0000156752 00000 n 
-0000157106 00000 n 
-0000157126 00000 n 
-0000157340 00000 n 
-0000157361 00000 n 
-0000157748 00000 n 
-0000157769 00000 n 
-0000157866 00000 n 
-0000157886 00000 n 
-0000158234 00000 n 
-0000158254 00000 n 
-0000158351 00000 n 
-0000158371 00000 n 
-0000158702 00000 n 
-0000158722 00000 n 
-0000158819 00000 n 
-0000158839 00000 n 
-0000159167 00000 n 
-0000159187 00000 n 
-0000163786 00000 n 
-0000163808 00000 n 
-0000164126 00000 n 
-0000164146 00000 n 
-0000166553 00000 n 
-0000166575 00000 n 
-0000166953 00000 n 
-0000166974 00000 n 
-0000167315 00000 n 
-0000167336 00000 n 
-0000167708 00000 n 
-0000167729 00000 n 
-0000169297 00000 n 
-0000169319 00000 n 
-0000169669 00000 n 
-0000169689 00000 n 
-0000171540 00000 n 
-0000171562 00000 n 
-0000171877 00000 n 
-0000171897 00000 n 
-0000174315 00000 n 
-0000174337 00000 n 
-0000174687 00000 n 
-0000174707 00000 n 
-0000175083 00000 n 
-0000175104 00000 n 
-0000175450 00000 n 
-0000175470 00000 n 
-0000180272 00000 n 
-0000180294 00000 n 
-0000180600 00000 n 
-0000180620 00000 n 
-0000180912 00000 n 
-0000180933 00000 n 
-0000181295 00000 n 
-0000181315 00000 n 
-0000181906 00000 n 
-0000181927 00000 n 
-0000182222 00000 n 
-0000182242 00000 n 
-0000182678 00000 n 
-0000182699 00000 n 
-0000183078 00000 n 
-0000183099 00000 n 
-0000183356 00000 n 
-0000183377 00000 n 
-0000183733 00000 n 
-0000183753 00000 n 
-0000184754 00000 n 
-0000184775 00000 n 
-0000185086 00000 n 
-0000185106 00000 n 
-0000185200 00000 n 
-0000185220 00000 n 
-0000185648 00000 n 
-0000185669 00000 n 
-0000185920 00000 n 
-0000185941 00000 n 
-0000186258 00000 n 
-0000186278 00000 n 
-0000194682 00000 n 
-0000194704 00000 n 
-0000195525 00000 n 
-0000195611 00000 n 
-0000195823 00000 n 
-0000195844 00000 n 
-0000195931 00000 n 
-0000196409 00000 n 
-0000196430 00000 n 
-0000196780 00000 n 
-0000196800 00000 n 
-0000196897 00000 n 
-0000196917 00000 n 
-0000197326 00000 n 
-0000197347 00000 n 
-0000197444 00000 n 
-0000197464 00000 n 
-0000197767 00000 n 
-0000197787 00000 n 
-0000197882 00000 n 
-0000197902 00000 n 
-0000198256 00000 n 
-0000198276 00000 n 
-0000198410 00000 n 
-0000198430 00000 n 
-0000198802 00000 n 
-0000198823 00000 n 
-0000198920 00000 n 
-0000198940 00000 n 
-0000199286 00000 n 
-0000199306 00000 n 
-0000200015 00000 n 
-0000200036 00000 n 
-0000200386 00000 n 
-0000200406 00000 n 
-0000200873 00000 n 
-0000200894 00000 n 
-0000201260 00000 n 
-0000201280 00000 n 
-0000201374 00000 n 
-0000201394 00000 n 
-0000201711 00000 n 
-0000201731 00000 n 
-0000215646 00000 n 
-0000215669 00000 n 
-0000216070 00000 n 
-0000216091 00000 n 
-0000216449 00000 n 
-0000216470 00000 n 
-0000216559 00000 n 
-0000230221 00000 n 
-0000230244 00000 n 
-0000230329 00000 n 
-0000248912 00000 n 
-0000248935 00000 n 
-0000249285 00000 n 
-0000249305 00000 n 
-0000249577 00000 n 
-0000249598 00000 n 
-0000249985 00000 n 
-0000250006 00000 n 
-0000250181 00000 n 
-0000250202 00000 n 
-0000250550 00000 n 
-0000250570 00000 n 
-0000250667 00000 n 
-0000250687 00000 n 
-0000251018 00000 n 
-0000251038 00000 n 
-0000251135 00000 n 
-0000251155 00000 n 
-0000251470 00000 n 
-0000251490 00000 n 
-0000257925 00000 n 
-0000257947 00000 n 
-0000258325 00000 n 
-0000258346 00000 n 
-0000259001 00000 n 
-0000259022 00000 n 
-0000259394 00000 n 
-0000259415 00000 n 
-0000259512 00000 n 
-0000259532 00000 n 
-0000259827 00000 n 
-0000259847 00000 n 
-0000260024 00000 n 
-0000260045 00000 n 
-0000260434 00000 n 
-0000260455 00000 n 
-0000264335 00000 n 
-0000264357 00000 n 
-0000265024 00000 n 
-0000265110 00000 n 
-0000267477 00000 n 
-0000267499 00000 n 
-0000267849 00000 n 
-0000267869 00000 n 
-0000268153 00000 n 
-0000268174 00000 n 
-0000268528 00000 n 
-0000268548 00000 n 
-0000269253 00000 n 
-0000269274 00000 n 
-0000269591 00000 n 
-0000269611 00000 n 
-0000270353 00000 n 
-0000270374 00000 n 
-0000270724 00000 n 
-0000270744 00000 n 
-0000270985 00000 n 
-0000271006 00000 n 
-0000271309 00000 n 
-0000271329 00000 n 
-0000271591 00000 n 
-0000271612 00000 n 
-0000271984 00000 n 
-0000272005 00000 n 
-0000272141 00000 n 
-0000272161 00000 n 
-0000272539 00000 n 
-0000272560 00000 n 
-0000272696 00000 n 
-0000272716 00000 n 
-0000273120 00000 n 
-0000273141 00000 n 
-0000273316 00000 n 
-0000273337 00000 n 
-0000273685 00000 n 
-0000273705 00000 n 
-0000273802 00000 n 
-0000273822 00000 n 
-0000274153 00000 n 
-0000274173 00000 n 
-0000274270 00000 n 
-0000274290 00000 n 
-0000274605 00000 n 
-0000274625 00000 n 
-0000275271 00000 n 
-0000275292 00000 n 
-0000275648 00000 n 
-0000275668 00000 n 
-0000276161 00000 n 
-0000276182 00000 n 
-0000276548 00000 n 
-0000276568 00000 n 
-0000277465 00000 n 
-0000277486 00000 n 
-0000277858 00000 n 
-0000277879 00000 n 
-0000278086 00000 n 
-0000278107 00000 n 
-0000278516 00000 n 
-0000278537 00000 n 
-0000280729 00000 n 
-0000280751 00000 n 
-0000281130 00000 n 
-0000281151 00000 n 
-0000282648 00000 n 
-0000282670 00000 n 
-0000283053 00000 n 
-0000283074 00000 n 
-0000283208 00000 n 
-0000283228 00000 n 
-0000283647 00000 n 
-0000283668 00000 n 
-0000283847 00000 n 
-0000283868 00000 n 
-0000284196 00000 n 
-0000284216 00000 n 
-0000286802 00000 n 
-0000286824 00000 n 
-0000286911 00000 n 
-0000290840 00000 n 
-0000290862 00000 n 
-0000291249 00000 n 
-0000291270 00000 n 
-0000293321 00000 n 
-0000293343 00000 n 
-0000293689 00000 n 
-0000293709 00000 n 
-0000293806 00000 n 
-0000293826 00000 n 
-0000294172 00000 n 
-0000294192 00000 n 
-0000294289 00000 n 
-0000294309 00000 n 
-0000294631 00000 n 
-0000294651 00000 n 
-0000309821 00000 n 
-0000309844 00000 n 
-0000309929 00000 n 
-0000312270 00000 n 
-0000312292 00000 n 
-0000312642 00000 n 
-0000312662 00000 n 
-0000313040 00000 n 
-0000313061 00000 n 
-0000313407 00000 n 
-0000313427 00000 n 
-0000313803 00000 n 
-0000313824 00000 n 
-0000314130 00000 n 
-0000314150 00000 n 
-0000314446 00000 n 
-0000314467 00000 n 
-0000314829 00000 n 
-0000314849 00000 n 
-0000315435 00000 n 
-0000315456 00000 n 
-0000315751 00000 n 
-0000315771 00000 n 
-0000316189 00000 n 
-0000316210 00000 n 
-0000316589 00000 n 
-0000316610 00000 n 
-0000316871 00000 n 
-0000316892 00000 n 
-0000317248 00000 n 
-0000317268 00000 n 
-0000321167 00000 n 
-0000321189 00000 n 
-0000321588 00000 n 
-0000321609 00000 n 
-0000323508 00000 n 
-0000323530 00000 n 
-0000323914 00000 n 
-0000323935 00000 n 
-0000325980 00000 n 
-0000326002 00000 n 
-0000326933 00000 n 
-0000327019 00000 n 
-0000327148 00000 n 
-0000327168 00000 n 
-0000327567 00000 n 
-0000327588 00000 n 
-0000327805 00000 n 
-0000327826 00000 n 
-0000328192 00000 n 
-0000328212 00000 n 
-0000328307 00000 n 
-0000328327 00000 n 
-0000328644 00000 n 
-0000328664 00000 n 
-0000329613 00000 n 
-0000329634 00000 n 
-0000330023 00000 n 
-0000330044 00000 n 
-0000330791 00000 n 
-0000330812 00000 n 
-0000331221 00000 n 
-0000331242 00000 n 
-0000332529 00000 n 
-0000332551 00000 n 
-0000332923 00000 n 
-0000332944 00000 n 
-0000336806 00000 n 
-0000336828 00000 n 
-0000336913 00000 n 
-0000340816 00000 n 
-0000340838 00000 n 
-0000341192 00000 n 
-0000341212 00000 n 
-0000342343 00000 n 
-0000342365 00000 n 
-0000342721 00000 n 
-0000342741 00000 n 
-0000351020 00000 n 
-0000351042 00000 n 
-0000351421 00000 n 
-0000351442 00000 n 
-0000351657 00000 n 
-0000351678 00000 n 
-0000351973 00000 n 
-0000351993 00000 n 
-0000352129 00000 n 
-0000352149 00000 n 
-0000352236 00000 n 
-0000352344 00000 n 
-0000352364 00000 n 
-0000352675 00000 n 
-0000352695 00000 n 
-0000352791 00000 n 
-0000352811 00000 n 
-0000353239 00000 n 
-0000353260 00000 n 
-0000372673 00000 n 
-0000372696 00000 n 
-0000373187 00000 n 
-0000373273 00000 n 
-0000375629 00000 n 
-0000375651 00000 n 
-0000375738 00000 n 
-0000377960 00000 n 
-0000377982 00000 n 
-0000378348 00000 n 
-0000378368 00000 n 
-0000378462 00000 n 
-0000378482 00000 n 
-0000378799 00000 n 
-0000378819 00000 n 
-0000388199 00000 n 
-0000388221 00000 n 
-0000388306 00000 n 
-0000397142 00000 n 
-0000397164 00000 n 
-0000397540 00000 n 
-0000397561 00000 n 
-0000412908 00000 n 
-0000412931 00000 n 
-0000413303 00000 n 
-0000413324 00000 n 
-0000413419 00000 n 
-0000413439 00000 n 
-0000413769 00000 n 
-0000413789 00000 n 
-0000413886 00000 n 
-0000413906 00000 n 
-0000414252 00000 n 
-0000414272 00000 n 
-0000414365 00000 n 
-0000414385 00000 n 
-0000414666 00000 n 
-0000414686 00000 n 
-0000414958 00000 n 
-0000414979 00000 n 
-0000415295 00000 n 
-0000415315 00000 n 
-0000415919 00000 n 
-0000415940 00000 n 
-0000416312 00000 n 
-0000416333 00000 n 
-0000416429 00000 n 
-0000416449 00000 n 
-0000416842 00000 n 
-0000416863 00000 n 
-0000417754 00000 n 
-0000417775 00000 n 
-0000418222 00000 n 
-0000418307 00000 n 
-0000418457 00000 n 
-0000418477 00000 n 
-0000418563 00000 n 
-0000421287 00000 n 
-0000421309 00000 n 
-0000421396 00000 n 
-0000537414 00000 n 
-0000537438 00000 n 
-0000537650 00000 n 
-0000537736 00000 n 
-0000540987 00000 n 
-0000541009 00000 n 
-0000541094 00000 n 
-0000541464 00000 n 
-0000541485 00000 n 
-0000541572 00000 n 
-0000564917 00000 n 
-0000564940 00000 n 
-0000565327 00000 n 
-0000565348 00000 n 
-0000575726 00000 n 
-0000575749 00000 n 
-0000575998 00000 n 
-0000576084 00000 n 
-0000582672 00000 n 
-0000582694 00000 n 
-0000582779 00000 n 
-0000587585 00000 n 
-0000587607 00000 n 
-0000587694 00000 n 
-0000615768 00000 n 
-0000615791 00000 n 
-0000616003 00000 n 
-0000616089 00000 n 
-0000617641 00000 n 
-0000617663 00000 n 
-0000617748 00000 n 
-0000622663 00000 n 
-0000622685 00000 n 
-0000622772 00000 n 
-0000624821 00000 n 
-0000624843 00000 n 
-0000624925 00000 n 
-0000658874 00000 n 
-0000658897 00000 n 
-0000659131 00000 n 
-0000659217 00000 n 
-0000661105 00000 n 
-0000661127 00000 n 
-0000661214 00000 n 
-0000663997 00000 n 
-0000664019 00000 n 
-0000664104 00000 n 
-0000676997 00000 n 
-0000677020 00000 n 
-0000677369 00000 n 
-0000677389 00000 n 
-0000690147 00000 n 
-0000690170 00000 n 
-0000690542 00000 n 
-0000690563 00000 n 
-0000690658 00000 n 
-0000690678 00000 n 
-0000691062 00000 n 
-0000691083 00000 n 
-0000691219 00000 n 
-0000691239 00000 n 
-0000691605 00000 n 
-0000691625 00000 n 
-0000691720 00000 n 
-0000691740 00000 n 
-0000692057 00000 n 
-0000692077 00000 n 
-0000693211 00000 n 
-0000693233 00000 n 
-0000693583 00000 n 
-0000693603 00000 n 
-0000693779 00000 n 
-0000693800 00000 n 
-0000694194 00000 n 
-0000694215 00000 n 
-0000694439 00000 n 
-0000694460 00000 n 
-0000694806 00000 n 
-0000694826 00000 n 
-0000702200 00000 n 
-0000702222 00000 n 
-0000702625 00000 n 
-0000702711 00000 n 
-0000706687 00000 n 
-0000706709 00000 n 
-0000707075 00000 n 
-0000707095 00000 n 
-0000708577 00000 n 
-0000708599 00000 n 
-0000708916 00000 n 
-0000708936 00000 n 
-0000709431 00000 n 
-0000709452 00000 n 
-0000709537 00000 n 
-0000711849 00000 n 
-0000711871 00000 n 
-0000711958 00000 n 
-0000720844 00000 n 
-0000720866 00000 n 
-0000721234 00000 n 
-0000721254 00000 n 
-0000744800 00000 n 
-0000744823 00000 n 
-0000745330 00000 n 
-trailer
-<< /Size 803 /Root 1 0 R /Info 802 0 R
->>
-startxref
-745423
-%%EOF
diff --git a/docs/canonicalizing_human_readable_identifiers.html b/docs/canonicalizing_human_readable_identifiers.html
index e6ac791..cca81fa 100644
--- a/docs/canonicalizing_human_readable_identifiers.html
+++ b/docs/canonicalizing_human_readable_identifiers.html
@@ -12,7 +12,7 @@
 	
 	
 	Canonicalizing Human Readable Identifiers 
-  
+
   

To Home page

Canonicalizing Human Readable Identifiers

@@ -36,7 +36,6 @@ Isolated homoglyphs, homoglyphs that do not look like any member of the scripts If these rules result in any changes, the rule set is reapplied until no further changes ensue. 

These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

+Commons Attribution-Share Alike 3.0 License

- \ No newline at end of file diff --git a/docs/check_html.sh b/docs/check_html.sh index 5dbbc63..b34b61b 100644 --- a/docs/check_html.sh +++ b/docs/check_html.sh @@ -6,6 +6,3 @@ do tidy -lang en_us --doctype html5 -utf8 -access 4 -e -q -o $TMP/fred.html "$f" done echo "checked all html files for html5 compliance." - - - diff --git a/docs/client_server.md b/docs/client_server.md index 7212be4..f7a64dd 100644 --- a/docs/client_server.md +++ b/docs/client_server.md @@ -786,7 +786,7 @@ that make it possible to have the same API as xchacha20poly1305. [OCB patents were abandoned in February 2021](https://www.metzdowd.com/pipermail/cryptography/2021-February/036762.html) -One of these days I will produce a fork of libsodium that supports ``crypto_box_ristretto25519aes256ocb.\*easy.\*`, but that is hardly urgent. +One of these days I will produce a fork of libsodium that supports ``crypto_box_ristretto25519aes256ocb.\*easy.\*`, but that is hardly urgent. Just make sure the protocol negotiation allows new ciphers to be dropped in. # Getting something up and running diff --git a/docs/contributor_code_of_conduct.html b/docs/contributor_code_of_conduct.html index 6754dbf..4891844 100644 --- a/docs/contributor_code_of_conduct.html +++ b/docs/contributor_code_of_conduct.html @@ -24,7 +24,7 @@ margin-left: 1em; } p.center {text-align:center;} - + table { border-collapse: collapse; } @@ -38,7 +38,6 @@ } -

To Home page

diff --git a/docs/crypto_currency_and_the_beast.html b/docs/crypto_currency_and_the_beast.html index c86a1c7..6f3ed69 100644 --- a/docs/crypto_currency_and_the_beast.html +++ b/docs/crypto_currency_and_the_beast.html @@ -9,7 +9,7 @@ } p.center {text-align:center;} - + Crypto Currency and the Beast @@ -106,4 +106,4 @@ people who prefer banking in secrecy and do not trust each other all that much.< licensed under the Creative Commons Attribution-Share Alike 3.0 License

- \ No newline at end of file + diff --git a/docs/crypto_currency_launch.html b/docs/crypto_currency_launch.html index 70849fd..e8c178a 100644 --- a/docs/crypto_currency_launch.html +++ b/docs/crypto_currency_launch.html @@ -1,8 +1,8 @@ - - - Crypto Currency Launch + Crypto Currency Launch -

To Home page

-

Crypto Currency Launch

- +

To Home page

+

Crypto Currency Launch

+ The total value held in the form of gold is ten trillion. But gold has problems – if you try to transport it through an airport, security will likely take it from you. Hard to travel with it hidden.

- + Hard to transfer it from one person to another, or from one identity to another. Hard to do international transactions in gold, hard to pay for oil with gold, or be paid for oil with gold, because transporting large amounts of gold is slow and dangerous.

- + So, something better than gold, more transportable, more hideable, people would probably keep more than ten trillion in that form.

- + The current value of bitcoin is about three hundred billion. Arguably crypto currency, if it works, if safe against the state, should be rather more than ten trillion. Say thirty trillion. This provides an upside of another hundred fold increase in value. On the other hand, the bitcoin is traceable in ways that gold is not. People are waiting to see what happens when the government cracks down.

- + A crypto currency needs to be totally traceable and totally untraceable. Ann wants to be able to prove to Carol that she paid Bob, and that therefore her debt to Bob is cleared, or Bob has an obligation the Ann. But Ann and Bob likely do not want a powerful hostile party to be able to discover that Ann made a payment to Bob. Existing crypto currencies suffer from total traceability.

- + Money is a store of value, a medium of exchange, and a measure of value. Gold sucks as a medium of exchange, because of transportation risks and costs. Crypto currency is very good as a medium of exchange, better than anything else, because banks are so remarkably incompetent, inefficient, and lawless.

- + As a measure of value, gold has immense and ancient history, which makes it the best for long term measure of value. If you graph the prices of something, such as oil, over decades and centuries, you get far saner and more plausible data when you graph in terms of gold than in dollars, or even supposedly inflation adjusted dollars. Gold is the best measure of value over time. Inflation adjusted dollars give results that smell of politics and propaganda. Bitcoin, because of volatility and extremely rapid deflation, is really bad as a measure of value, but time will slowly fix this.

- + The current price of bitcoin reflects a substantial possibility that it replaces the dollar as the currency of international transactions, in which case the dollar finds itself on the bitcoin standard, like it or not.

- + To attract a significant portion of the wealth of the world, we do not want to have any mining, since this basically a fee against large accounts. We want a per account fee, because every account results in accountancy costs, and a transaction fee, because every transaction results in transaction costs, but not a charge against holding enormous amounts of wealth in an account. Mining is a charge against the value of accounts, which is a bad idea if we want wealth holders to hold their wealth in our crypto currency.

- + We want it to be impossible to find who holds a large account if he does not want to be found, so that he is safe from rubber hose cryptography. We want it to be easy for him to keep control, and hard for anyone else to get control. He should be able to take the wallet that controls the bulk of his money offline, so that it cannot sign anything, because he has the signing key on a scrap of paper hidden somewhere, or on several such scraps of paper.

- + And then, bringing together the scraps of paper that are the secret number that controls his account paper, he can sit down at a computer anywhere in the world, and send that money hither and yon.

Gold has problems as the medium of international exchange, because of the problems of moving it. So everyone left their gold in Fort Knox, and moved ownership of that gold around, but it gradually became more and more obvious that America has embezzled all that gold.

@@ -48,7 +48,7 @@ Bitcoin is moveable. Big advantage over gold.

Bitcoin is governed by consensus, which has serious problems because it is a consensus of miners, rather than a consensus of people who hold large amounts of bitcoin, but it has the advantage that the miners are rational, self interested, and competent, and are therefore predictable, while the US government is increasing crazy, self destructive, and criminal, and therefore unpredictable.

- + The coin to invest in needs to be able to scale all the way to wiping out the US$ as a world currency. But it also needs to gain initial critical mass.

diff --git a/docs/crypto_currency_new_index.html b/docs/crypto_currency_new_index.html index 8e85c4c..3058cec 100644 --- a/docs/crypto_currency_new_index.html +++ b/docs/crypto_currency_new_index.html @@ -25,7 +25,7 @@ Trouble with bitcoin is that it is not centerless – proof of work winds up bei Thus we need a system with proof of stake, and not only proof of stake, but proof of client stake – the power over the system needs to reside with peers that have a lot of wealthy clients – and it needs to be hard to find who the clients are, and where they are keeping their secrets, so that even if Mueller seizes important peers on charges of tax evasion and money laundering, does not thereby gain control.

-If the system handles an enormous number of transactions, peers are going to be big and expensive, thus vulnerable to people like Mueller armed with vague and open ended charges of tax evasion and money laundering. Hence the power of peer over the currency needs to be proportional to the wealth controlled by the secrets held by that peer’s clients. And that peer’s clients need to be free to move from one peer to the next, and apt to move to peers that make it difficult for Mueller to find their clients.

+If the system handles an enormous number of transactions, peers are going to be big and expensive, thus vulnerable to people like Mueller armed with vague and open ended charges of tax evasion and money laundering. Hence the power of peer over the currency needs to be proportional to the wealth controlled by the secrets held by that peer’s clients. And that peer’s clients need to be free to move from one peer to the next, and apt to move to peers that make it difficult for Mueller to find their clients.

Need a crypto currency where Bob can prove to the whole world that he paid Ann such and such amount, in accord with such and such a bill, but no one else can prove he paid Ann, nor that there ever was such a bill, except he shows them. Bitcoin is far too traceable. We need controlled traceability, where the parrticipants can prove a transaction to third parties and the world, but the world cannot. And Bob needs to be able to prove what the payment was about, that it was part of a conversation, a meeting of minds.

@@ -61,7 +61,6 @@ So, to accomplish the goal of shutting down crypto currency requires world wide

These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

+Commons Attribution-Share Alike 3.0 License

- \ No newline at end of file diff --git a/docs/crypto_currency_on_wide_area_distributed.html b/docs/crypto_currency_on_wide_area_distributed.html index 45a49ba..5ccff49 100644 --- a/docs/crypto_currency_on_wide_area_distributed.html +++ b/docs/crypto_currency_on_wide_area_distributed.html @@ -1,8 +1,8 @@ - - - Crypto Currency on wide area distributed database + Crypto Currency on wide area distributed database -

To Home page

-

Crypto Currency on wide area distributed database

- +

To Home page

+

Crypto Currency on wide area distributed database

+ Much of this material is shamelessly plaigarized without attribution.

diff --git a/docs/crypto_currency_transaction_volume.html b/docs/crypto_currency_transaction_volume.html index 05d0dfc..adb3986 100644 --- a/docs/crypto_currency_transaction_volume.html +++ b/docs/crypto_currency_transaction_volume.html @@ -1,30 +1,30 @@ - - - - Transaction Volume + + Transaction Volume -

To Home page

-

Transaction Volume

+

To Home page

+

Transaction Volume


Total number of bitcoin transactions

- +

Was four hundred million on 2019-05-04, occupying four hundred gigabytes on disk. I don’t know how many spent and unspent transaction outputs that adds up to, but probably a billion or two. Thus a hash table mapping coin public keys to transactions occupies 64 bytes for each coin, so fits in couple of hundred gigabytes. Not a huge problem today when four terabyte hard disks are standard, but in early versions of our competing rhocoin - system, simpler just to store all transaction outputs in an sqlite3 + system, simpler just to store all transaction outputs in an sqlite3 database, where an unspent transaction output goes in a table with a field linking it to its transaction, and a spent transaction output goes in another table with a field linking it to the transaction from which it is @@ -34,12 +34,12 @@ valid or invalid will work by will contain the hash chain deriving from the transaction, in transactions ordered by block number, and within blocks by hash.

- +

But our canonical tree is going to have to contain namecoins ordered by name order, rather than transaction order, to enable short proofs of the valid authority over a name.


Bandwidth

-

A bitcoin transaction is typically around 512 bytes, could be a lot less:  A transaction needs a transaction type, one or more inputs, one or more outputs. A simple input or output would consist of the type, the amount, the time, and a public key. Type sixteen bits, time forty eight bits bits, amount sixty four bits, public key two hundred and fifty six bits, total forty eight bytes.  A typical transaction has two inputs and two outputs, total 192 bytes. Frequently need another hash to link to relevant information, such as what this payment is for, another thirty two bytes, total 224 bytes. 

- +

A bitcoin transaction is typically around 512 bytes, could be a lot less:  A transaction needs a transaction type, one or more inputs, one or more outputs. A simple input or output would consist of the type, the amount, the time, and a public key. Type sixteen bits, time forty eight bits bits, amount sixty four bits, public key two hundred and fifty six bits, total forty eight bytes.  A typical transaction has two inputs and two outputs, total 192 bytes. Frequently need another hash to link to relevant information, such as what this payment is for, another thirty two bytes, total 224 bytes. 

+

We will frequently store the transaction and the resulting balances, as if together, though likely for internal optimization reasons, actually stored separately, so 196 bytes. 

Visa handles about 2000 transactions per second.  Burst rate about four thousand per second. 

Paypal 115 transactions per second. 

@@ -51,15 +51,15 @@

Common home internet connections are twelve mbps, common small business internet connections are one hundred mbps.  So you will be able to peer with even when we reach Visa volumes, but you probably will not want to unless you are moderately wealthy or you are operating a business, so need a high capability connection anyway.

The i2p hidden network can handle about 30 kbps, so we can put the whole thing on the i2p hidden network, until we are wiping the floor with Paypal.  Ideally, we want a client download, a host and peer download, and a business host and peer download, where you just say "install and next thing you know you have a website offering “<item name here> for <99.99999> megaros”. (During initial development, we will fix the price at one megaro per US$)

A peer on a laptop can easily handle Paypal volumes on a typical free advertising supported cofffee shop connection, which is around 10mbs down, 5mbs up. We need to allow peers to drop in and out. If you are a client, and the peer that hosts you drops out, you can go to another peer and ask another peer to host your wallet. If you are doing seriously anonymous transactions, well, just bring the laptop running your peer to the coffee shop.

- + Assuming a block happens ever five minutes, then visa is three hundred megabye blocks, 8Mbps.

Paypal is ten megabyte blocks, 0.5Mps.

Bitcoin is one megabyte blocks, 28Kbps.

- + After two years at bitcoin volumes, our blockchain will be two hundred gigabytes, at which point we might want to think of a custom format for sequential patricia trees as a collection of immutable files, append only files which grow into immutable files, and wal files that get idempotently accumulated into the append only files.

- + Initially, our volume will probably only be one transaction every thirty seconds or so, at which rate it will take two years to reach a gigabyte, and everything fits in memory, making thinking about the efficiency of disk access irrelevant. We just load up everything as necessary, and keep it till shutdown.

- + During initial development, need an ICO, including a market place buying and selling megaros. 


Sorting

@@ -75,89 +75,89 @@

Storage

Instead of only keeping transactions, we keep transactions and accounts. Thus peers can place old transactions in offline storage, or just plain dump them. The hash tree ensures that they are immutable, but you don’t actually have to keep old transactions and old account balances around. Thus, total chain volume bounded. We can replace branches of the Merkle tree in old blocks that lead only to used transactions by their hash – we operate with a potentially incomplete Merkle-patricia dac

- +

On the other hand, perhaps I worry too much about disk storage, which has been doubling every year. Since we only plan to have a thousand or so full peers, when we have seven billion client wallets, they will be able to afford to store every transaction for everyone ever. Visa volume of 2000 transactions per second implies fifty gigabytes per day. So, if when we reach visa volumes, a typical peer has sixteen disks each of sixty four terabytes, it will take fifty years to fill them up, by which time we will likely have figured out a way of ditching old transactions.,

- +

Suppose we have a thousand peers, and seven billion clients, and each client wants ten thousand transactions stored forever. Each peer has to store forty thousand terabytes of data. Each peer has seven million clients, so each peer is going to be quite large business, and by that time standard hard disks will probably be about one hundred terabytes, so each peer is going to need about four hundred hard disks on a local network of a hundred computers, twenty thousand clients per hard disk, which is not going to be a burdensome cost – other scaling problems will no doubt bite us hard before then. At present two hundred terabyte systems are common, though not among private individuals. Forty thousand is gigantic, though perhaps it will be less gigantic in a few years. OpenZFS handles hundreds of terabytes just fine. Not sure what will happen with tens of thousands of terabytes.

- +

The trouble with disk storage is that sector failure rates have not been falling. When one sector fails you tend to lose everything. One bad sector can take down the disk operating system, and one bad sector will take down an Sqlite database. We can mitigate this problem by having several Sqlite databases, with the most active blocks in solid state drive storage, and the immutable consensus blocks (immutable in having root hashes that have been the subject of consensus, though they can lose some branches) spread over several very large disk drives. Perhaps Sqlite will address this problem, so that bad sectors only cause minor local losses, which can easily be replaced by data from another peer, or perhaps when we get big enough that it is a problem we will then write a system that directly writes Merkle-patricia dac to raw disk storage in such a manner that failed sectors only cause minor losses of a few elements of the Merkle-patricia dac, easily fixed, by getting replacement data from peers.

- + The way Sqlite works at present, having all our data in one big Sqlite database is not going to work when the block chain gets too big, no matter how big disks become, for sooner or later one sector will fail, and we don’t want the failure of one sector to require a full rebuild of a potentially gigantic database.

- + A data structure that dies on the loss of one sector becomes unusable when it reaches two terabytes or so, and the trouble is that our existing disk operating systems, and databases such as Sqlite, are frequently fragile to the loss of single sector. To scale to our target size (every transaction, for everyone in the world, forever) we have to have a system that tolerates a few sectors dropping out here and there, and replaces them by requesting the lost data on those few sectors from peers. For the moment, however, we can get by using multiple Sqlite databases, each one limited to about six hundred gigabytes. They will die infrequently, and when they die, the peers should reload the lost data from other peers. The cost of disk sector bitrot increases as the square of the size of the Sqlite database, because the likelihood of the entire database dying of bit rot of a single sector increases proportionally to size, and the cost of recopying the data from peers increases proportionally to the size. Lose one sector of an Sqlite database, you may well lose the entire database, which is an increasing problem as disks and databases get bigger, and likely to become unbearable at around two to four terabytes.

- + But for the moment, three six terabyte drives don’t cost all that much, and with split databases, with some blocks in one Sqlite database, and other blocks in another, we could scale to twenty times the current size of bitcoin storage, and when we hit that limit, solve the problem when it becomes a problem. We don’t really need to purge old transactions, though we build the architecture so that it is doable.

- +

The architecture is that it is all one gigantic Merkle-patricia dac organized into blocks, with the older blocks immutable, and the way this data is stored on a particular peer is an implementation detail that can differ between one peer and the next. Each peer sees the other peer’s Merkle-patricia dac, not the way the other peer’s tree is stored on disk. It sees the canonical representation, not the way the particular peer represents the tree internally.This approach enables us to be flexible about storage as technology progresses, and as the amount of data to be stored increases. Maybe we will wind up storing the tree as architecture dependent representations of records written directly to raw disk sectors without any file system other than the tree itself. By the time sector bitrot becomes a problem, Sqlite may well be fixed so that it can lose a bit of data here and there to sector bitrot, and report that data lost and in need of recovery, rather than the entire database dying on its ass. And if not, by the time it becomes a problem, the community will be big enough and wealthy enough to issue a fix, either to Sqllite, or by creating a disk system that represents arbitrarily large Merkle-patricia dacs directly on disk sectors over multiple disks over multiple computers, rather than a database stored on files that are then represented on disk sectors.

- + For a database of two terabytes or so, can keep them in one Sqlite database, though probably more efficient to have tha active blocks on a solid state drive, and the older blocks on a disk drive, running on top of a standard operating system. Eight terabytes can store two billion transactions, which will fail horribly at handling all the world’s transactions, and can only keep up with visa for a few days, but we can keep up with paypal for long enough to hack up something that can handle massive disk arrays, and ditches stale transactions.

- + Assume clients keep their transactions forever, peers keep their own client transactions for a long time, but dump the transactions of other clients after a month or so. 

- +

Then to compete with Bitcoin, need about three gigabytes of storage, ever, about the size of a movie.  Typical home hard disks these days are one thousand gigabytes. 

- +

Then to compete with Paypal, need about fifty gigabytes of storage, ever, about the size of a television series.  Typical home hard disks these days are one thousand gigabytes. 

Then to compete with Visa, need about one terabyte of storage, ever, about the size of a typical home consumer hard disk drive. 

So when we are wiping the floor with visa, then only wealthy people with good internet connections will be peers. 

If keeping only live transactions, and assume each entity has only a hundred live transactions, then an eight terabyte hard drive can support a billion accounts. Paypal has about three hundred million accounts, so we can beat paypal using Sqlite on standard disk drives, without doing anything clever. And then we can start correspondent banking, and start using a custom storage system designed to support Merkle trees directly on raw disks.

If we put a block chain Merkle tree oriented storage system on top of Sqlite, then we can shard, write direct to disk, whatever, without disturbing the rest of the software, allowing us to beat visa. We always query the Merkle tree of the current block, with most of the lower branches of the Merkle tree pointing back into previous blocks. So if you ask, what is the record whose identifier is such and such in the current block, you will probably get the answer, "it is record such and such in a previous block", which will likely go through several steps of recursion, as if we had a billion sqllite databases. And why not have a billion Sqlite databases, in which a hundred are in one sqllite database, and hundred in another? And many processes. If we have one block every 256 seconds, then in ten years we have a million blocks, and a table locating each block in some arbitrary place, associated with some arbitrary channel to some arbitrary process is manageable, even without the trival optimization of handling ranges of blocks. This implies that once a block is immutable, it is handed off to some process whose job is to resolve read only Merkle queries on blocks on a certain range. So we have a table locating immutable blocks, and the processes that can read them, which allows us to trivially shard to many databases, each on its own hard disk, and near trivially shard to clusters of computers. Assume a per peer table that assigns groups of blocks to directories on particular disks on particular hosts with only one of these groups being mutable. Then we can have shardable storage on day one. And assume we can have multiple processes, some responsible for some blocks and some responsible for others. Each peer could be a large local network over many machines. Of course, we are still potentially bottlenecked on assembling the current block, which will be done by a single cpu attached to single local disk, but we are not bottlenecked for disk space.


-

Storage and transmission structure

+

Storage and transmission structure

We will not have a Bitcoin style chain of blocks, instead a binary Merkle-patricia dac.  But operations on this tree will be grouped into 256 second phases so we will be doing something very like a block every 256 seconds. (Or whatever time the global consensus configuration file specifies – there is global consensus config data, per peer config data, and per client config data, all of them in yaml.)

For block syncronization we need a tree of transaction events organized by block, hence organized by time, at least for the high order part. To prove balance to a client without giving him the entire tree, need a tree of balances. To prove to a client name key association, need a tree of names. To prove no monkey business with names, need a tree of events affecting names organized by names. To prove no monkey business with balances, need a tree of transactions organized by client. ((Leaves on the tree of transactions would consist of the key to the actual transaction) And, of course, a rather trivial tree to hold the global config data. There will be a chain of leap seconds in anticipation of the day that the standards authorities pull their fingers out of their ass. The leap second data has to be signed by an authority specified in the global configuration data, but this will serve no actual useful function until the day there really is such an authority. For the moment the world represents time as if leap seconds never happened, as for example in communication between mail servers, and no one cares about the precise value of durations – it only matters that time is monotonic and approximately linear.

- +

When we want more precise time comparisons, as when we are synchronizing and worried abouth the round trip time, we just get data on both computer’s clocks as relevant and give up on a global true time. So if one computer ticks a thousand times a second, and the other two fifty six times a second, then, for round trip concerns, no biggie.

- +

Data will be ordered, both in storage and transmission, by key, where the high order bits of the key are block number, which is the high order bits of the time. Transactions are applied according to the time designated by the sender, rounded to some multiple of a thousand milliseconds, and then the public key of the recipient. Order in which transactions are applied matters for bouncing transactions. Transactions between the same sender and the same recipient shall be limited to one per block period. If someone wants to transact more often than that, has to batch transactions using the microtransaction protocol. For internal optimization, there will be additional indexes, but that is what we are going to hash over, and that will be the order of our hash tree, our storage, and our transmissions. 

-

Our global hash will be a binary Merkle-patricia dac of hashes, with the leaf hashes corresponding to the above. 

- -

We use two kinds of time – millisecond time modulo 2^32 for managing connections, and second time for times that go into the global consensus block chain.

- - -

C++11 std::chrono:: seems to be the library that actually fixes these problems, with a steady clock for duration, which we will access in milliseconds modulo 2^32, and a system clock which we will access for global time in seconds since the epoch modulo 2^64

- -

Both kinds of time ignore the leap second issue. Whenever seconds are presented for human readership, then ISO 8601 format which evades the leap second issue. Whenever durations are employed internally, we use milliseconds past the epoch modulo 2^32, and do not assume computer clocks are synchronized, or even both running at the same rate, though we do assume that both are measuring something rather close to milliseconds.

- +

Our global hash will be a binary Merkle-patricia dac of hashes, with the leaf hashes corresponding to the above. 

+ +

We use two kinds of time – millisecond time modulo 2^32 for managing connections, and second time for times that go into the global consensus block chain.

+ + +

C++11 std::chrono:: seems to be the library that actually fixes these problems, with a steady clock for duration, which we will access in milliseconds modulo 2^32, and a system clock which we will access for global time in seconds since the epoch modulo 2^64

+ +

Both kinds of time ignore the leap second issue. Whenever seconds are presented for human readership, then ISO 8601 format which evades the leap second issue. Whenever durations are employed internally, we use milliseconds past the epoch modulo 2^32, and do not assume computer clocks are synchronized, or even both running at the same rate, though we do assume that both are measuring something rather close to milliseconds.

+

boost::posix_time::ptime sucks.

- -

We give up on handling leap seconds until the standards people get their act together and make it easy for everyone.

- -

Time will be stored as a binary UT1 value, and not stored as local time. When displayed for humans, time will be displayed as if UTC time, in accordance with RFC 3339 though it is actually an approximation to UT1. If the data is being displayed to the local user momentarily, will be displayed as local time plus the offset to UT1, for example 2019-04-12T23:20:50.52-5:00, representing 2019 April the twelfth, 8:50.52PM UT1 time in New York. If the data is not just being displayed momentarily, but will be recorded in a log file, it will always be recorded as UT1 time, as for example 2019-04-12T15:50.52Z, not UT1 time plus local time offset, because humans are likely to compare log files in different time zones, and when looking at logs long after the event, don’t care much what the local time was.

- + +

We give up on handling leap seconds until the standards people get their act together and make it easy for everyone.

+ +

Time will be stored as a binary UT1 value, and not stored as local time. When displayed for humans, time will be displayed as if UTC time, in accordance with RFC 3339 though it is actually an approximation to UT1. If the data is being displayed to the local user momentarily, will be displayed as local time plus the offset to UT1, for example 2019-04-12T23:20:50.52-5:00, representing 2019 April the twelfth, 8:50.52PM UT1 time in New York. If the data is not just being displayed momentarily, but will be recorded in a log file, it will always be recorded as UT1 time, as for example 2019-04-12T15:50.52Z, not UT1 time plus local time offset, because humans are likely to compare log files in different time zones, and when looking at logs long after the event, don’t care much what the local time was.

+

If we are recording the local time plus offset, remember that confusingly 1996-12-19T15:39:57-08:00 means that to get universal time from local time, we have to add eight hours, not substract eight hours.
1996-12-19T15:39:57-08:00 is, surprisingly and illogically, the same moment as:
1996-12-19T23:39:57+00:00 add it, don’t subtract it.

- + 1996-12-19T24:00:00+00:00 is, unsurprisingly and logically the same moment as:
1996-12-20T00:00:00+00:00

- +

We can store in any format, and transmit in any mutually agreed format, but the protocol will hash as if in full length binary. Any protocol is transmitting representation of the binary data, which should be uniquely and reversibly mapped to a human representation of the data, but we do not need global agreement on a human representation of the data. Because multiple human representations of the data are possible, any such representation should contain an identifier of the representation being used. Similarly storage and transmission. . Since global agreement on storage, transmission, and human representations of the data is not guaranteed, format identifiers for storage and transmission formats such will be 128 bits in the binary representation. Human readable formats will be in yaml. 

- +

For a hash to be well defined, we need a well defined mapping between a yaml text stream, and a binary stream. A single yaml document can have many equivalent text representations, so we have to hash the binary data specified by the yaml document. Which means a yaml document must be stored in an object of specific type defined outside the document, and we hash the canonical form of that object. The object type will be identified by a yaml directive %<typename>, and if the named fields of the yaml document fail to correspond to the location fields of the binary object, it is an error, and the document is rejected. 

- +

The yaml document representing a binary object has a human readable type name in the form of a percent directive, and human readable field names in the form of a mapping between namesd values, but the binary object it represents does not contain these field names, and its type identifier, it has one, is an integer.  The mapping between human readable names in the yaml document and offset locations within the binary object occurs outside the object, and outside the yaml document. 

- +

Different compilers tend to wind up implementing object padding differently, and of course there is always the endianness issue, big endian versus little endian. For a binary object to have one unique representation really requires ASN.1. 

- +

ASN.1 can generate aligned Canonical Packed encoding, which is what we are going to need to hash, and aligned packed encoding, which is what we will need for everything except human readability.  It can also generate JSON encoding rules, which is type information in JSON, which we manually edit into a human readable description of how the object should look in yaml, and manually edit into a yaml to and from Canonical Aligned packed encoding. - + For the data represented by a yaml document to have a unique well defined hash, the yaml document has to reference an ASN.1 specification in a percent directive. Try the III ASN.1 Mozilla library to compile ASN.1 into C++. Our yaml library should generate code to read yaml into and out of an object whose representation in memory is compiler and machine dependent, and our ASN.1 library should generate code to read data into and out of the same object whose representation in memory is compiler and machine dependent. 

- +

A connection between two peers will respresent the data in a ASN.1 PER format, but not necessarily canonical aligned PER format. The representation will be idiosyncratic to that particular connection. Every connection could use a different representation. They probably all use the same representation, but nothing requires them to do so. A machine could have a hundred connections active, each with a different representation, though it probably will not. 

- +

A branch our immutable binary tree, or the portion of the entire global immutable tree leading to a particular branch, can be output as yaml, or input from yaml in order that we can figure out what the machines are doing, and when we read a branch in yaml, we can always immediately learn whether than branch chains to the global consensus, albeit a portion of that chain may run through a local wallet, then to a transaction in that wallet, which transaction is globally known. 

- +

Our immutable tree can only contain types known to the code, and compiled into the code. ASN.1 and yaml can represent arbitrary structures, but our code will not be able to handle arbitrary structures, and shall swiftly reject lots of valid, but unexpected, yaml, though a wallet might well know types that are not globally known. ASN.1 canonical aligned PER can only represent types that are expected by the code, thus everything that can be read, has to be expected and capable of beig handled by canonical aligned PER. 

- +

A conversation involving many people is a tree in reverse temporal order to hash tree. However, we are only going to link such conversations into the block chain in relation to a financial transaction, in which case we want to link it in hash chain order – the bill or offer, and any documents explicitly included in the bill or offer. Texts in chat contain a time, an author, a chatroom identifier, and that they are a reply to a previous text. Constructing a tree forward in times involve a search for all replies.  It is not stored in tree form, texts do not contain links to what replies to them.  Within wallet storage such a text is globally identified by its hash. Which is globally meaningful for any participant in the conversation. Of course for payments, there are usually only two people in the conversation, but if a text is referenced by a transaction in the global consensus chain, you can send it to anyone, and what it is a reply to, and what that it is a reply to, whereupon they become meaningful, and immutable, for the recipients. So you can send a text to a third party that includes another text, or several such texts. If you include a third party text, and what this third party text is a reply to, then the reply link will become meaningul to the recipient. Otherwise, when he clicks on the reply link, will get an error. The wallet contains a bunch of records that are indexed by hash, the hash globally and uniquely identifying immutable data. Texts are almost free from, having a time, an orginator, a title of under 140 characters, which is likely to be the entire content of the text, and a destination, which may be a chatroom, or a particular sutype of chatroom, a chatroom with only two permitted members, and free form text which may contain references to other texts, generally in the form of a quote or title, which links to the actual prior in time text. 

- +

Clicking on the link expands it inline with a four tab indent, and a tree outline rooted on the left. If the tree gets too deep, say four tabs deep (configurable) we collapse it by hiding sister expansions, collapsing parent nodes, and applying tail recursion.  The tree of a conversation thread is similarly displayed, also in correct time order (collapsing and tail recursing as needed to prevent it drifting too far right) but it is not a hash tree, and you cannot link it into the block chain.  You can only link a particular text, and prior texts that it explicitly includes by hash, into the blockchain.  Only their root hash is actually stored in the blockchain.  The actual texts, though their hash globally identifies them across all wallets, are only stored in some particular wallets, and can easily wind up lost or erased. 

- -

When peers negotiate a protocol, they negotiate a representation of the data, which may be different for any pair of peers, but what is being represented is globally agreed. 

- -

What is being represented is a global binary Merkle-patricia dac of blocks of variable length binary data. In transmission we generally do not transmit the entire hash if the entire subtree is available, but a sample of the hash, which sample is different in every connection between every pair of peers. This means that a peer cannot easily fake keeping the data. Since the entire tree represents a global consensus, the content of every block must be understandable to every peer so that every peer can determine that every block is compliant with the global rules, so every block begins with a type identifier, which normally defines a fixed length for the block and the rule for generating a hash for that block. The tree never carries opaque data, though it may well carry a hash code that identifies off block chain opaque data.

-

Whatever protocol is employed, the software can and will routinely express the representation in its global canonical binary form, and in human readable form, so that when disagreements occur in reaching consensus the human masters of the machines can agree on what is going on and what should be done about it, regardless of the representation used internally to store and transmit data.. 

-

Although the consensus will be represented by both a human and a robotic board and CEO, there shall be no automatic rule update mechanism, except according to individual human choices. Each new consensus shall represent a consensus of peers managing a majority of the shares, and to change the rules will require that the board and the CEO persuade a substantial majority of the human masters of the peers to install new software, which they may do, or may refrain from doing.  The consensus will be continually updated according to robotic choices, but the rules the robots are following are installed by humans – or not.

+ +

When peers negotiate a protocol, they negotiate a representation of the data, which may be different for any pair of peers, but what is being represented is globally agreed. 

+ +

What is being represented is a global binary Merkle-patricia dac of blocks of variable length binary data. In transmission we generally do not transmit the entire hash if the entire subtree is available, but a sample of the hash, which sample is different in every connection between every pair of peers. This means that a peer cannot easily fake keeping the data. Since the entire tree represents a global consensus, the content of every block must be understandable to every peer so that every peer can determine that every block is compliant with the global rules, so every block begins with a type identifier, which normally defines a fixed length for the block and the rule for generating a hash for that block. The tree never carries opaque data, though it may well carry a hash code that identifies off block chain opaque data.

+

Whatever protocol is employed, the software can and will routinely express the representation in its global canonical binary form, and in human readable form, so that when disagreements occur in reaching consensus the human masters of the machines can agree on what is going on and what should be done about it, regardless of the representation used internally to store and transmit data.. 

+

Although the consensus will be represented by both a human and a robotic board and CEO, there shall be no automatic rule update mechanism, except according to individual human choices. Each new consensus shall represent a consensus of peers managing a majority of the shares, and to change the rules will require that the board and the CEO persuade a substantial majority of the human masters of the peers to install new software, which they may do, or may refrain from doing.  The consensus will be continually updated according to robotic choices, but the rules the robots are following are installed by humans – or not.

During each block period, peers will be accumulating and sharing transactions for the current and previous block periods. 

They will be trying to reach consensus for earlier block periods by sharing transactions or by excluding transactions that did not get widely shared. 

They will attempt the Paxos protocol to announce a hash reflecting a widely shared consensus for block periods before that (more than three block periods before the present), starting with the block for which no widely shared consensus has yet been announced.. 

@@ -184,12 +184,12 @@

Zooko’s quadrangle, human readable names

The root of the identity of every client and peer will be a public key, or the hash thereof. A client can reserve a human readable name, provided that they have <name_reservation_deposit> amount of money in the account. 

- +

The client UI will not let the user accidentally spend this money and lose the name, so it will be presented separately from the rest of his balance. A peer has to have such a name, which is also the name of the special client account that controls the peer. 

Retaining a human readable username require a minimum balance, which may be changed from time to time with due warning. This implies global consensus on a configuration YAML file. We have a rule that a new configuration file takes effect <transition_time> days after being voted in, provided that it is never voted out in the meantime, where <transition_time> is a value set by the configuration file currently in effect. 

- + You can reserve as many names as you please, but each requires a not altogether trivial amount of money. 

- + You can sell a username to another public key. 

The blockchain keeps the usernames, the owning key, and keeps the host for the owning key. You have to ask the host for further details, like contacting the actual owner of the user name.  Host links you to the wallet, wallet links you to a small graphic, a 140 character text, optionaly a larger text, and a web page.  The guy who controls the web page will be able to create a websocket connection to his wallet that logs you in, and sends messages to both wallets. 

@@ -207,9 +207,9 @@ It is useless to attempt immutable records of html pages, since they can, and do To get a logged on browser to server connection between two blockchain identities, your wallet client will talk to the other guy’s wallet client, which will talk to his webserver, and your wallet will launch the browser with a regular https connection with logon cookie representing that a browser obeying a wallet with one blockchain key is logged on to a webserver that obeys a wallet with the other blockchain key.

When the time comes to do a transation, the wallet clients will exchange encrypted non html messages, in response to websocket messages by browser and webserver, and the payment will be linked to one such signed message, held off blockchain by both parties in their wallets. Logging on will always be done in the blockchain client, not the browser and the keystroke that actually agrees to make the payment will be done in the blockchain client, not the browser.

- +

These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

+Commons Attribution-Share Alike 3.0 License

diff --git a/docs/cyperhpunk_manifesto.md b/docs/cyperhpunk_manifesto.md index a15a884..26dee4f 100644 --- a/docs/cyperhpunk_manifesto.md +++ b/docs/cyperhpunk_manifesto.md @@ -1,9 +1,9 @@ --- description: >- - “A Cypherpunk’s Manifesto” was written by Eric Hughes and published on March 9, 1993. + “A Cypherpunk’s Manifesto” was written by Eric Hughes and published on March 9, 1993. robots: 'index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1' title: >- - Eric Hughes: A Cypherpunk’s Manifesto + Eric Hughes: A Cypherpunk’s Manifesto viewport: 'width=device-width, initial-scale=1.0' --- **Privacy is necessary for an open society in the electronic age. Privacy is not secrecy. A private matter is something one doesn’t want the whole world to know, but a secret matter is something one doesn’t want anybody to know. Privacy is the power to selectively reveal oneself to the world.** diff --git a/docs/delegated_proof_of_stake.html b/docs/delegated_proof_of_stake.html index 9ab78f8..b963b61 100644 --- a/docs/delegated_proof_of_stake.html +++ b/docs/delegated_proof_of_stake.html @@ -1,8 +1,8 @@ - - - Crypto currency + Crypto currency -

To Home page

-

Delegated proof of stake

- +

To Home page

+

Delegated proof of stake

+

The consensus problem

- - + + In blockchains we call it the consensus problem. In the financial cryptography world, it’s the double spend problem, and in databases, atomicity. Which is to say this is a fundamental problem in all of computing science, not just blockchain.

But with crypto currency, and replacements for the corporate form, we want to solve this problem in ways that prevent someone powerful from capturing the system.

diff --git a/docs/development_plan.html b/docs/development_plan.html index 90305d9..26220b2 100644 --- a/docs/development_plan.html +++ b/docs/development_plan.html @@ -11,7 +11,7 @@ Development Plan - +

To Home page

@@ -35,7 +35,7 @@ Then we create one where the records are Zooko identities, and the petnames are, Then we create one where if you query with the private secret, you get the proof for public key. (This has a separate database table linking keys to Zooko identities, implemented in SQLite.

And one where, for a public key, you get Merkle proof about what network address will serve that public key, or what public key or authoritative petname will serve the network address for that public key.

- + Then a simple command line single threaded single client tcp time server, which we test using Putty in raw mode, and a simple command line client to test it, where the client outputs the result then shuts down the connection immediately.

Then, a simple command line multi client tcp time server, and a simple command line client to test it, where the clients shuts down the connection when the user hits carriage return.

@@ -43,7 +43,7 @@ Then, a simple command line multi client tcp time server, and a simple command l And then, implement the Merkle-patricia stuff, only with queries over the network between one keyed identity and another.

And then, implement the same thing, only with key chains over the network, and the capacity to look up rapidly changing keys from an unchanging authority.

- + Then, a client that runs a unit test when executed with the command line argument test, and displays all test results test v, only fail results test a, or halts awaiting user input at each fail test. The unit test, if run with an output file argument, outputs a file containing all failed test results.

Then, finally, transactions in a block chain, where each transaction threads to the previous transactions. And then we have a cash and name system – but not yet a decentralized distributed name system.

diff --git a/docs/dovecot.md b/docs/dovecot.md index e3a10e4..e6b76ad 100644 --- a/docs/dovecot.md +++ b/docs/dovecot.md @@ -1,5 +1,4 @@ --- -lang: en title: Install Dovecot on Debian 10 --- # Purpose @@ -129,11 +128,11 @@ Delete the old `service auth` definition, and replace it with: ```bash # Postfix smtp-auth service auth { - unix_listener /var/spool/postfix/private/auth { - mode = 0660 - user = postfix - group = postfix - } + unix_listener /var/spool/postfix/private/auth { + mode = 0660 + user = postfix + group = postfix + } } ``` @@ -160,28 +159,28 @@ Add the line `auto = subscribe` to the special folders entries: ```default mailbox Trash { - `auto = subscribe - special_use = \Trash + `auto = subscribe + special_use = \Trash } mailbox Junk { - `auto = subscribe - special_use = \Junk + `auto = subscribe + special_use = \Junk } mailbox Drafts { `auto = subscribe - special_use = \Drafts + special_use = \Drafts } mailbox Trash { - `auto = subscribe - special_use = \Trash + `auto = subscribe + special_use = \Trash } mailbox Sent { - `auto = subscribe - special_use = \Sent + `auto = subscribe + special_use = \Sent } ``` @@ -227,7 +226,7 @@ You did set ufw to default deny incoming, so that IMAP and POP3 are blocked. As before: ```bash - cat /var/log/mail.log | grep -E '(warning|error|fatal|panic)' + cat /var/log/mail.log | grep -E '(warning|error|fatal|panic)' ``` # Next steps diff --git a/docs/duck_typing.md b/docs/duck_typing.md index 538a261..5a5576e 100644 --- a/docs/duck_typing.md +++ b/docs/duck_typing.md @@ -94,4 +94,3 @@ the precise type is irrelevant noise and a useless distraction.  You generally want to know what is being done, not how it is being done. Further, if you explicitly specify how it is being done, you are likely to get it wrong, resulting in mysterious and disastrous type conversions. - diff --git a/docs/electronic_wallet.html b/docs/electronic_wallet.html index 90984e9..2e94ed7 100644 --- a/docs/electronic_wallet.html +++ b/docs/electronic_wallet.html @@ -77,6 +77,6 @@ proposed transaction, and then you speak the magic passphrase for that transaction.

These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

+Commons Attribution-Share Alike 3.0 License

diff --git a/docs/furtive_fork_attack.html b/docs/furtive_fork_attack.html index 68ecaa9..c07e46a 100644 --- a/docs/furtive_fork_attack.html +++ b/docs/furtive_fork_attack.html @@ -12,16 +12,16 @@ Furtive Fork Attack - +

To Home page

Furtive Fork Attack

- +

These documents are licensed under the Creative Commons Attribution-Share Alike 3.0 License

- \ No newline at end of file + diff --git a/docs/generating_numbers_unpredictable_to_an_attacker.md b/docs/generating_numbers_unpredictable_to_an_attacker.md index 731976e..dd73734 100644 --- a/docs/generating_numbers_unpredictable_to_an_attacker.md +++ b/docs/generating_numbers_unpredictable_to_an_attacker.md @@ -24,7 +24,7 @@ can't see. NTP is really great, I love it, so cool. It can set my computer's clock with a precision measured in milliseconds. Very impressive it can do this just by -applying algorithms to hardware that is already present. +applying algorithms to hardware that is already present. If one wants better, the next option is to get time from GPS. According to gps.gov a specialized receiver, at a fixed location, can know the time @@ -69,7 +69,7 @@ changed. Is there "entropy" in that system clock? Some, but only some. The PLL will have some jitter, the precision of the lower frequency input clock will have -iffy precision and be subject to drift. +iffy precision and be subject to drift. Is there "unguessability" in that system clock? Plenty! At least to any observer at any distance (i.e., outside the computer). diff --git a/docs/generic_client_server_program.html b/docs/generic_client_server_program.html index 4a07b5f..3ce8cb7 100644 --- a/docs/generic_client_server_program.html +++ b/docs/generic_client_server_program.html @@ -335,5 +335,5 @@ client threads and no prospect of getting new ones. 

These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

+Commons Attribution-Share Alike 3.0 License

\ No newline at end of file diff --git a/docs/generic_test.html b/docs/generic_test.html index e377879..ed9b539 100644 --- a/docs/generic_test.html +++ b/docs/generic_test.html @@ -337,6 +337,6 @@ client threads and no prospect of getting new ones. 

These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

+Commons Attribution-Share Alike 3.0 License

\ No newline at end of file diff --git a/docs/hello_world.html b/docs/hello_world.html index 9ef1093..2d78d69 100644 --- a/docs/hello_world.html +++ b/docs/hello_world.html @@ -1,8 +1,8 @@ - - - Hello World + Hello World -

To Home page

+

To Home page

Hello World

- +

In this day and age, a program that lives only on one machine, and a program without a gui (possibly a gui on another machine a thousand kilometers away) really is not much of a program

- +

So, the minimum hello world program has to request the indentifier of another machine, creat a connection to that machine, and then display the response that machine.

- +

And the minimum hello world program should preserve state from one invocation to the next, so should have an SQLite database.

- +

And we also have to support unit test, which requires a conventional procedural single thread with conventional unix style output stream.

- +

So the minimum hello world program is going to have a boost.asio multi thread event handler for IO events, io_service and boost::thread_group, and an event oriented GUI thread, which may well be running under boost::thread group. To communicate with the GUI, we use std::packaged_task, std::promise, and std::future. The GUI OnIdle event checks if the packaged task is ready for it to do, and executes it. Any thread that wants to talk to the GUI waits for any existing std::packaged_task waiting on OnIdle to be completed, sets a new packaged task, and awaits the future to be returned, the future typically being a unique smart pointer containing a return struct, but may be merely an error code.

- +

Create an io_service:

boost::asio::io_service io_service;
-	//  This object must outlive the threads that are 
-	//	attached to it by the run command, thus the threads 
+	//  This object must outlive the threads that are
+	//	attached to it by the run command, thus the threads
 	//	must be created in an inner scope
- Create a work object work to stop its run() function from exiting if it has nothing else to do:
-	{	boost::asio::io_service::work work(io_service);  
-		// The work object prevents io_context from 
-		// returning from the run command when it has 
+	 Create a work object work to stop its run() function from exiting if it has nothing else to do:
+	{	boost::asio::io_service::work work(io_service);
+		// The work object prevents io_context from
+		// returning from the run command when it has
 		// consumed all available tasks.
 
-		// Start some worker threads:	
-		// Probably should use C++14 threads, 
+		// Start some worker threads:
+		// Probably should use C++14 threads,
 		// but the example code uses boost threads.
 		boost::thread_group threads;
 		for (std::size_t i = 0; i < my_thread_count; ++i)
 		threads.create_thread(boost::bind(&asio::io_service::run, &io_service));
 		//	This executes the run() command in each thread.
-		//	Boost::bind is a currying function, that converts a function 
+		//	Boost::bind is a currying function, that converts a function
 		//	with arguments into a function with no arguments.
 		//	A half assed substitute for lambda
 
-		//	Post the tasks to the io_service so they can be 
+		//	Post the tasks to the io_service so they can be
 		//	performed by the worker threads:
 
 		io_service.post(boost::bind(an_expensive_calculation, 42));
@@ -62,66 +62,66 @@
 		//	);
 		io_service.post(boost::bind(a_long_running_task, 123));
 
-		//	Finally, before the program exits shut down the 
+		//	Finally, before the program exits shut down the
 		//	io_service and wait for all threads to exit:
-		
-		
+
+
 		...  Do unit test, wait for the ui thread to join
 
-		io_service.stop();  
+		io_service.stop();
 		// Stop will prevent new tasks from being run, even if they have been queued.
-		// If, on the other hand, we just let the work object go out of scope, 
+		// If, on the other hand, we just let the work object go out of scope,
 		// and stop new tasks from being queued,
-		// the threads will return 
-		// from the io_service object when it has run out of work		
+		// the threads will return
+		// from the io_service object when it has run out of work
 	}
 	threads.join_all();
-	//Thread group is just a vector of threads  Maybe should just use a vector, 
+	//Thread group is just a vector of threads  Maybe should just use a vector,
 	//so that I can address the gui thread separately.
 	// Now we can allow io_service to go out of scope.
- + So the starting thread of the program will run GUI unit tests through interthread communication to the OnIdle event of the GUI. - +

Alternatively we could have a separate daemo process that communicates with the GUI through SQLite, which has the advantage that someone else has already written a wxSQLite wrapper.

- +

So we are going to need a program with a UI, and a program that is a true daemon. The daemon program will be network asynch, and the UI program will be UI asynch, but the UI program will get and send network jobs that are complete in very short time with the daemon, its networking operations will be procedural. This is acceptable because interprocess communication is high bandwidth and highly reliable

- +

We are going to need to support chat capability, to combat seizure of names by the state, and to enable transactions to be firmly linked to agreements, and to enable people to transfer money without having to deal directly with cryptographic identities. The control and health interface to the daemon should be a chat capability on IPC. Which can be configured to only accept control from a certain wallet. Ideally one would like a general chatbot capability running python, but that is a project to be done after the minimum viable product release.

- +

We will eventually need a chat capability that supports forms and automation, using the existing html facilities, but under chat protocol, not under https protocol. But if we allow generic web interactions, generic web interactions will block. One solution is a browser to chat interface. Your browser can launch a chat message in your wallet, and a received chat message may contain a link. The link launches a browser window, which contains a form, which generates a chat message. End user has to click to launch the form, fill it out, click on the browser to submit, then click again to send the chat message to submit from username1 to username2. End user may configure certain links to autofire, so that a local server and local browser can deal with messages encapsulated by the chat system.

- +

We don’t want the SSL problem, where the same client continually negotiates new connections with the same host, resulting in many unnecessary round trips and gaping security holes. We want every connection between one identity on one machine, and another identity on another machine, to use the same shared secret for as long as both machines are up and talk to each other from time to time, so every identity on one machine talks to other identities through a single daemon on its own machine, and a single daemon on the other identity’s machine. If two identities on the same machine, talk though the one daemon. Each client machine talks IPC to the daemon.

- +

There might be many processes, each engaging in procedural IPC with one daemon, but the daemon is asynch, and talks internet protocol with other daemons on other systems in the outside world. Processes need to talk through the daemon, because we only want to have one system global body of data concerning network congestion, bandwidth, transient network addresses, and shared secrets. System Ann in Paris might have many conversations running with System Bob in Shanghai, but we want one body of data concerning network address, shared secrets, cryptographic identity, flow control, and bandwidth, shared by each of these many conversations.

- +

We assume conversations with the local daemon are IPC, hence fast, reliable, and high bandwidth. Failure of a conversation with the local daemon is a crash and debug. Failure of conversations across the internet is normal and frequent – there is no reliability layer outside your local system. Sending a request and not getting an answer is entirel normal and on the main path.

- +

The one asynch daemon has the job of accumulating block chains which implement mutable Merkle-patricia dacs out of a series of immutable Merkle-patricia dacs. Sometimes part of the data from transient mutable Merkle-patricia trees is extracted and recorded in a more durable Merkle patricial trie. Every connection is a mutable Merkle-patricia dac, which is deleted (and some of the information preserved in another mutable Merkle-patricia tree) when the connection is shut down.

- +

Every connection is itself a tree of connections, with flow control, bandwidth, crypto key, and network address information at the root connection, and every connection is the root of a mutable Merkle-patricia dac.

- +

Each daemon is a host, so everyone runs a host on his own machine. That host might be behind a NAT, so to rendevous, would need a rendevous mediated by another host.

- +

See also Generic Client Server Program, and Generic Test.

- +

And in this day and age, we have a problem with the name system, in that the name system is subject to centralized state control, and the tcp-ssl system is screwed by the state, which is currently seizing crimethink domain names, and will eventually seize untraceable currency domain names.

- +

So we not only need a decentralized system capable of generating consensus on who owns what cash, we need a system capable of generating consensus on who who owns which human readable globally unique names, and the mapping between human readable names, Zooko triangle names (which correspond to encryption public keys), and network addresses.

- +

Both a gui and inter machine communication daemon imply asynch, an event oriented architecture, which we should probably base on boost asynch. Have to implement the boost signal handling for shutdown signals.

- +

If, however, you are communicating between different machines, then the type has to be known at run time on both machines – both machines have to be working of the identical Cap'n Proto type declaration – but might, however, not know until run time which particular type declared in their identical Cap'n Proto declarations is arriving down the wire.

- +

When setting up a communication channel at run time, have to verify the hash of the type declaration of the objects coming down the wire at run time, so that a connection cannot be set up, except both bodies of source code have the identical source for values on the wire on this particular connection. - +

Obviously in this day and age, a program isolated on one solitary machine is kind of useless, so, what is needed is a machine that has a host of connections, each connection being an object, and the one running thread activates each connection object when data arrives for it, and then the object requests more data, and the thread abandons the object for a while, to deal with the next object for which data has arrived. When an object issues a request that may take a while to fullfill, provides a block of code, a function literal for that event.

- -

A language that has to handle Gui and a language that has to handle communication is event oriented. You continually declare handlers for events. Each handler is a particular method of a particular object, and new events of the same kind cannot be processed until the method returns. If handling the event might take a long time (disk access, user interface) the method declares new event handlers, and fires actions which will immediately or eventually lead to new events, and then immediately returns.

- + +

A language that has to handle Gui and a language that has to handle communication is event oriented. You continually declare handlers for events. Each handler is a particular method of a particular object, and new events of the same kind cannot be processed until the method returns. If handling the event might take a long time (disk access, user interface) the method declares new event handlers, and fires actions which will immediately or eventually lead to new events, and then immediately returns.

+

And when I say "immediately lead to new events", I mean "immediately after the method returns" – the method may add a new event handler and possibly also a new event to the event queue. Steal Boost asynch, if Cap'n Proto has not already stolen something like Boost Asynch.

- +

Each event is a message, and each message is a Cap'n Proto buffer, whose precise type may not necessarily be known until it actually arrives, but which has to be handled by code capable of handling that message type.

- +

This document is licensed under the CreativeCommons Attribution-Share Alike 3.0 License

diff --git a/docs/how_browser_security_should_be_done.html b/docs/how_browser_security_should_be_done.html index 39406c9..dda9913 100644 --- a/docs/how_browser_security_should_be_done.html +++ b/docs/how_browser_security_should_be_done.html @@ -215,6 +215,6 @@ can result in changes to user records on the server. 

These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

+Commons Attribution-Share Alike 3.0 License

\ No newline at end of file diff --git a/docs/how_to_do_VPNs.html b/docs/how_to_do_VPNs.html index 2dac363..a2c7bc6 100644 --- a/docs/how_to_do_VPNs.html +++ b/docs/how_to_do_VPNs.html @@ -194,5 +194,5 @@ needed. 

These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

+Commons Attribution-Share Alike 3.0 License

\ No newline at end of file diff --git a/docs/identity.md b/docs/identity.md index 8a4c730..ea45343 100644 --- a/docs/identity.md +++ b/docs/identity.md @@ -1,6 +1,6 @@ --- title: - Identity + Identity --- # Syntax and semantics of identity @@ -606,19 +606,19 @@ up to entity to the immediate left of the slash to interpret, and if it contains spaces and suchlike, use windows command line string representation rules, quote marks and escape codes. - rho:#4397439879483774378943798 - rho:Bob#4397439879483774378943798 - Bob@#4397439879483774378943798 - Receivables.#4397439879483774378943798 + rho:#4397439879483774378943798 + rho:Bob#4397439879483774378943798 + Bob@#4397439879483774378943798 + Receivables.#4397439879483774378943798 fit into the Uniform Resource Identifier scheme, poorly. - #4397439879483774378943798/foo + #4397439879483774378943798/foo fits into the catchall leftover part of the Uniform Resource Identifier scheme. - rho:Bob@Carol.Dave#4397439879483774378943798/foo + rho:Bob@Carol.Dave#4397439879483774378943798/foo Does not fit into it in the slightest, and I think the idea of compatibility with the URN system is a lost cause. @@ -742,11 +742,11 @@ between his network address and his public key. signed : anyone can check that some data is signed by key, and such data can - be passed around in a pool, usenet style. + be passed around in a pool, usenet style. authenticated : You got the data directly from an entity that has the key. You know - it came from that key, but cannot prove it to anyone else. + it came from that key, but cannot prove it to anyone else. access : A key with authorization from another key does something. @@ -756,10 +756,10 @@ authorization authority : A key with authority can give other keys authorization. Every key - has unlimited authority to do whatever it wants on its own - computers, and with its own reputation. It may grant other keys - authorization to access certain services on its computers and to - perform certain acts in the name of its reputation. + has unlimited authority to do whatever it wants on its own + computers, and with its own reputation. It may grant other keys + authorization to access certain services on its computers and to + perform certain acts in the name of its reputation. We do not want the key on the server to be the master key that owns the server name, because keys on servers are too easily stolen. So we want @@ -793,15 +793,15 @@ So, we need a collection of data akin to `/etc/hosts` : public data, the broad consensus, agreed data known to the wider - community. + community. `~/.ssh/known_hosts` : privately known data about the community that cannot be widely - shared because others might not trust it, and you might not trust - others. You may want to share this with those you trust, and get it - from those you trust, but your set of people that you trust is - unlikely to agree with someone else’s and needs to be curated by a - human. + shared because others might not trust it, and you might not trust + others. You may want to share this with those you trust, and get it + from those you trust, but your set of people that you trust is + unlikely to agree with someone else’s and needs to be curated by a + human. `~/.ssh/config` : And there is data you want to keep secret. @@ -1063,7 +1063,7 @@ behalf of this master key, sign as the entity at the root of the chain. One typically signs data that will be delivered to the recipient through an untrusted intermediary, as for example, downloading a rhocoin wallet, or a peer making an assertion about the most recent -root or block of the blockchain. +root or block of the blockchain. 0. Bit indicates that this key may be used to make an offer in the identity of the entity at the root of the chain. diff --git a/docs/iff.html b/docs/iff.html index f4a4224..cce80ec 100644 --- a/docs/iff.html +++ b/docs/iff.html @@ -14,9 +14,9 @@ p.center {text-align:center;}

IFF

Identification Friend or Foe

To Home page

- + The objective is to provide Identity Friend or Foe information, while leaking as little individual identity information as possible – to identify oneself as a member of a group, for example employees entitled to access certain information, or guests entitled to access certain services, without flagging their specific individual identity far and wide.

- + This outlines a scheme capable of being used for world domination and replacing everyone’s car keys, house keys, employee identification badge, and military dog tag, but before attempting that, we are going to start small by moving the corporate form to the blockchain, and putting your employee id in your crypto currency wallet, using it to escape dominion, rather than enforce it, a multiplicity of separate groups, rather than one enormous group. Then we conquer the world and enslave all the women, but our more modest initial target market is to support freedom of association, to put the corporate form on the blockchain.

Any id scheme has potentially totalitarian uses, and I can easily imagine a whole lot of oppressive ways for using this scheme, but a scheme that links every interaction to one unique identity rooted in state documents, which is what we have now, is a lot more totalitarian than this proposal, because this proposal only shows you are fellow member of the group, or a person authorized to use a certain facility. Unlike the current system, it does not show which particular member of the group you are to all. @@ -36,11 +36,11 @@ If a member of the larger group misbehaves to another member of the larger group This scheme inherently identifies you as a fellow member of a subgroup to another member of the same subgroup, but only identifies you as a member of the larger group to a member of the larger group who is not a member of your subgroup. We are going to start small (Hail fellow thought crime thinker, hail fellow black marketeer, hail fellow mafia member, hail fellow plotter, hail fellow employee of grey market block chain based business) but when we scale to embracing all of society someone is likely to be a member of multiple groups (reservist, employee, club member, family member) and will respond with the group of the pinger, if he is a member of that group as well. Your employee iff will unlock the door of your employer’s office building, and your family iff will unlock the door of your dad’s house.

Fine grained control

- + The signature on the individual member’s frequently changing public key may contain additional information, above and beyond "friend", and he may receive several such signatures, each of which contains a different item of information. However, a basic ping should only reveal the information necessary.

These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

+Commons Attribution-Share Alike 3.0 License

diff --git a/docs/images/postfix_cfg.png b/docs/images/postfix_cfg.png deleted file mode 100644 index 752269b..0000000 Binary files a/docs/images/postfix_cfg.png and /dev/null differ diff --git a/docs/images/postfix_cfg1.png b/docs/images/postfix_cfg1.png deleted file mode 100644 index 41e8ec5..0000000 Binary files a/docs/images/postfix_cfg1.png and /dev/null differ diff --git a/docs/images/postfix_cfg2.png b/docs/images/postfix_cfg2.png deleted file mode 100644 index 18420f9..0000000 Binary files a/docs/images/postfix_cfg2.png and /dev/null differ diff --git a/docs/images/postfix_cfg3.png b/docs/images/postfix_cfg3.png deleted file mode 100644 index 5174061..0000000 Binary files a/docs/images/postfix_cfg3.png and /dev/null differ diff --git a/docs/images/practical_byzantine_consensus_fig_1.webp b/docs/images/practical_byzantine_consensus_fig_1.webp new file mode 100644 index 0000000..e719bdf Binary files /dev/null and b/docs/images/practical_byzantine_consensus_fig_1.webp differ diff --git a/docs/images/practical_byzantine_consensus_fig_2.webp b/docs/images/practical_byzantine_consensus_fig_2.webp new file mode 100644 index 0000000..7b66c54 Binary files /dev/null and b/docs/images/practical_byzantine_consensus_fig_2.webp differ diff --git a/docs/implementation_steps.html b/docs/implementation_steps.html index d89ab2a..a1dc919 100644 --- a/docs/implementation_steps.html +++ b/docs/implementation_steps.html @@ -129,7 +129,7 @@ the server needs to model client guesses about client state, an estimate about an estimate.

Server ids contain a link to a list of protocols they accept, signed by an authority responsible for those protocols. Protocols are identified by stream of bytes, in which zero or bytes have their high bit set, the stream being terminated by a byte with the high bit cleared. Lists of protocols are maintained by the system responsible for the list of server ids, with new lists only being added by a human decision at the distinguished proposer.

- +

These lists only identify protocols capable of setting up a connection. When a connection is made, the client offers a list of subprotocols that it wants, and the server accepts the first one in the list that it recognizes and wants to handle. We will have no central authority for such subprotocol lists. Anyone can roll there own, and in the event that there come to be a lot of them, the implementer just chooses an identifier long enough and random enough that the risk of collision is small.

These documents are licensed under the Creative diff --git a/docs/interlockedxxx.html b/docs/interlockedxxx.html index c4694a8..8f91e5a 100644 --- a/docs/interlockedxxx.html +++ b/docs/interlockedxxx.html @@ -25,41 +25,41 @@ used to write any Interlockedxxx operation. 

 long InterlockedXxx(
-        __inout long  volatile *Target,
-        , whatever parameters we need for Xxx
-        )
-    {
-        long prevValue, prevCopy;
+		__inout long  volatile *Target,
+		, whatever parameters we need for Xxx
+		)
+	{
+		long prevValue, prevCopy;
 
-        prevValue = *Target;
+		prevValue = *Target;
 
-        do {
-            if Xxx operations is illegal on prevValue, return with error code
+		do {
+			if Xxx operations is illegal on prevValue, return with error code
 
-            prevCopy = prevValue;
+			prevCopy = prevValue;
 
-            //
-            // prevValue will be the value that used to be Target if the exchange was made
-            // or its current value if the exchange was not made.
-            //
-            prevValue = InterlockedCompareExchange(Target, Xxx operation on prevCopy, prevValue);
+			//
+			// prevValue will be the value that used to be Target if the exchange was made
+			// or its current value if the exchange was not made.
+			//
+			prevValue = InterlockedCompareExchange(Target, Xxx operation on prevCopy, prevValue);
 
-            //
-            // If prevCopy == prevValue, then no one updated Target in between the deref at the top
-            // and the InterlockecCompareExchange afterward and we are done
-            //
-        } while (prevCopy != prevValue);
+			//
+			// If prevCopy == prevValue, then no one updated Target in between the deref at the top
+			// and the InterlockecCompareExchange afterward and we are done
+			//
+		} while (prevCopy != prevValue);
 
-        //
-        // [value] can be anything you want, but it is typically either
-        // a) The new value stored in Target.  This is the type of return value that
-        //    InterlockedIncrement returns
-        // or
-        // b) The new value is the previous value that was in Target.  This si the
-        //     type of return value that InterlockedOr or InterlockedExchange return
-        //
-        return [value];
-    }

+ // + // [value] can be anything you want, but it is typically either + // a) The new value stored in Target. This is the type of return value that + // InterlockedIncrement returns + // or + // b) The new value is the previous value that was in Target. This si the + // type of return value that InterlockedOr or InterlockedExchange return + // + return [value]; + }

Structures larger than a long can be handled by using InterlockedCompareExchange to add to a @@ -70,6 +70,5 @@ it for you. 

These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

+Commons Attribution-Share Alike 3.0 License

- diff --git a/docs/libraries.md b/docs/libraries.md index 9c2cbf7..7fd537b 100644 --- a/docs/libraries.md +++ b/docs/libraries.md @@ -280,11 +280,11 @@ than polling it. And that second thread cannot use wxSockets. [recently updated version on github]:https://github.com/wxWidgets/wxWidgets/tree/master/samples/sockets -Programming sockets and networking in C is a mess. The [much praised guide -to sockets](https://beej.us/guide/bgnet/html/single/bgnet.html) goes on for -pages and pages describing a “simple” example client server. Trouble is that -C, and old type Cish C++ exposes all the dangly bits. The [QT client server -example](https://stackoverflow.com/questions/5773390/c-network-programming), +Programming sockets and networking in C is a mess. The [much praised guide +to sockets](https://beej.us/guide/bgnet/html/single/bgnet.html) goes on for +pages and pages describing a “simple” example client server. Trouble is that +C, and old type Cish C++ exposes all the dangly bits. The [QT client server +example](https://stackoverflow.com/questions/5773390/c-network-programming), on the other hand, is elegant, short, and self explanatory. The code project has [example code written in C++](https://www.codeproject.com/Articles/13071/Programming-Windows-TCP-Sockets-in-C-for-the-Begin), but it is still mighty intimidating compared to the QT client server example. I have yet to look at the wxWidgets client server examples – but looking for wxWidgets networking code has me worried that it is a casual afterthought, not adequately supported or adequately used. @@ -398,15 +398,15 @@ Which leads me to digress how we are going to handle protocol updates: 1. Distribute software capable of handling the update. 1. A proposed protocol update transaction is placed on the blockchain. 1. Peers indicate capability to handle the protocol update. Or ignore it, - or indicate that they cannot. If a significant number of peers - indicate capability, peers that lack capability push their owners for - an update. + or indicate that they cannot. If a significant number of peers + indicate capability, peers that lack capability push their owners for + an update. 1. A proposal to start emitting data that can only handled by more - recent peers is placed on the blockchain. + recent peers is placed on the blockchain. 1. If a significant number of peers vote yes, older peers push more - vigorously for an update. + vigorously for an update. 1. If a substantial supermajority votes yes by a date specified in the - proposal, then they start emitting data in the new format on a date + proposal, then they start emitting data in the new format on a date shortly afterwards. If no supermajority by the due date, the proposal is dead. @@ -546,12 +546,12 @@ nothing message passing between threads. ------------------------------------------------------------------------ -[Facebook Folly library]provides many tools, with such documentation as -exists amounting to “read the f\*\*\*\*\*g header files”. They are reputed -to have the highest efficiency queuing for interthread communication, and it -is plausible that they do, because facebook views efficiency as critical. +[Facebook Folly library]provides many tools, with such documentation as +exists amounting to “read the f\*\*\*\*\*g header files”. They are reputed +to have the highest efficiency queuing for interthread communication, and it +is plausible that they do, because facebook views efficiency as critical. Their [queuing header file] -(https://github.com/facebook/folly/blob/master/folly/MPMCQueue.h) gives us +(https://github.com/facebook/folly/blob/master/folly/MPMCQueue.h) gives us `MPMCQueue`. [Facebook Folly library]:https://github.com/facebook/folly/blob/master/folly/ @@ -712,11 +712,11 @@ wxWidget wraps WSASelect, which is the behavior we need. Microsoft has written the asynch sockets you need, and wxWidgets has wrapped them in an OS independent fashion. - WSAAsyncSelect + WSAAsyncSelect - WSAEventSelect + WSAEventSelect - select + select Using wxSockets commits us to having a single thread managing everything. To get around the power limit inherent in that, have multiple peers under diff --git a/docs/libraries/app.cpp b/docs/libraries/app.cpp index 0f39562..9c59f6e 100644 --- a/docs/libraries/app.cpp +++ b/docs/libraries/app.cpp @@ -18,4 +18,3 @@ bool app::OnInit() } wxIMPLEMENT_APP(app); - diff --git a/docs/libraries/cpp_automatic_memory_management.md b/docs/libraries/cpp_automatic_memory_management.md index 5382aef..9c1f80e 100644 --- a/docs/libraries/cpp_automatic_memory_management.md +++ b/docs/libraries/cpp_automatic_memory_management.md @@ -1,6 +1,6 @@ --- title: - C++ Automatic Memory Management + C++ Automatic Memory Management --- # Memory Safety Modern, mostly memory safe C++, is enforced by:\ @@ -14,7 +14,7 @@ Modern, mostly memory safe C++, is enforced by:\ complains about, in practice usually all of them, though I suppose that as the project gets bigger, some will slip through. - static_assert(__cplusplus >= 201703, "C version of out of date"); + static_assert(__cplusplus >= 201703, "C version of out of date"); The gsl adds span for pointer arithmetic, where the size of the array pointed to is kept with the pointer for safe iteration and @@ -29,75 +29,75 @@ std::make_unique, std::make_shared create pointers to memory managed objects. (But single objects, not an array, use spans for pointer arithmetic) - auto sp = std::make_shared(42); - std::weak_ptr wp{sp}; + auto sp = std::make_shared(42); + std::weak_ptr wp{sp}; # Array sizing and allocation - /* This code creates a bunch of "brown dog" strings on the heap to test automatic memory management. */ - char ca[]{ "red dog" }; //Automatic array sizing - std::array arr{"red dog"}; //Requires #include - /* No automatic array sizing, going to have to count your initializer list. */ - /* The pointer of the underlying array is referenced by &arr[0] but arr is not the underlying array, nor a pointer to it. */ - /* [0] invokes operator[], and operator[] is the member function that accesses the underlying array.*/ - /* The size of the underlying array is referenced by arr.size();*/ - /* size known at compile time, array can be returned from a function getting the benefits of stack allocation.*/ - // can be passed around like POD - char *p = new char[10]{ "brown dog" }; //No automatic array - // sizing for new - std::unique_ptrpuc{ p }; // Now you do not have - // to remember to delete p - auto puc2 = std::move(puc); /* No copy constructor. Pass by reference, or pass a view, such as a span.*/ - std::unique_ptr puc3{ new char[10]{ "brown dog" } }; - /* Array size unknown at compile or run time, needs a span, and you have to manually count the initialization list. */ - /* Compiler guards against overflow, but does not default to the correct size.*/ - /* You can just guess a way too small size, and the compiler in its error message will tell you what the size should be. */ - auto pu = std::make_unique(10); // uninitialized, - // needs procedural initialization. + /* This code creates a bunch of "brown dog" strings on the heap to test automatic memory management. */ + char ca[]{ "red dog" }; //Automatic array sizing + std::array arr{"red dog"}; //Requires #include + /* No automatic array sizing, going to have to count your initializer list. */ + /* The pointer of the underlying array is referenced by &arr[0] but arr is not the underlying array, nor a pointer to it. */ + /* [0] invokes operator[], and operator[] is the member function that accesses the underlying array.*/ + /* The size of the underlying array is referenced by arr.size();*/ + /* size known at compile time, array can be returned from a function getting the benefits of stack allocation.*/ + // can be passed around like POD + char *p = new char[10]{ "brown dog" }; //No automatic array + // sizing for new + std::unique_ptrpuc{ p }; // Now you do not have + // to remember to delete p + auto puc2 = std::move(puc); /* No copy constructor. Pass by reference, or pass a view, such as a span.*/ + std::unique_ptr puc3{ new char[10]{ "brown dog" } }; + /* Array size unknown at compile or run time, needs a span, and you have to manually count the initialization list. */ + /* Compiler guards against overflow, but does not default to the correct size.*/ + /* You can just guess a way too small size, and the compiler in its error message will tell you what the size should be. */ + auto pu = std::make_unique(10); // uninitialized, + // needs procedural initialization. - /* span can be trivially created from a compile time declared array, an std:array or from a run time std:: vector, but then these things already have the characteristics of a span, and they own their own storage. */ - /* You would use a span to point into an array, for example a large blob containing smaller blobs.*/ + /* span can be trivially created from a compile time declared array, an std:array or from a run time std:: vector, but then these things already have the characteristics of a span, and they own their own storage. */ + /* You would use a span to point into an array, for example a large blob containing smaller blobs.*/ - // Placement New: - char *buf = new char[1000]; //pre-allocated buffer - char *p = buf; - MyObject *pMyObject = new (p) MyObject(); - p += (sizeof(MyObject+7)/8)*8 - /* Problem is that you will have to explictly call the destructor on each object before freeing your buffer. */ - /* If your objects are POD plus code for operating on POD, you don’t have to worry about destructors.*/ - // A POD object cannot do run time polymorphism. - /* The pointer referencing it has to be of the correct compile time type, and it has to explicitly have the default constructor when constructed with no arguments.*/ - /* If, however, you are building a tree in the pre-allocated buffer, no sweat. */ - /* You just destruct the root of the tree, and it recursively destructs all its children. */ - /* If you want an arbitrary graph, just make sure you have owning and non owning pointers, and the owning pointers form a tree. */ - /* Anything you can do with run time polymorphism, you can likely do with a type flag.*/ + // Placement New: + char *buf = new char[1000]; //pre-allocated buffer + char *p = buf; + MyObject *pMyObject = new (p) MyObject(); + p += (sizeof(MyObject+7)/8)*8 + /* Problem is that you will have to explictly call the destructor on each object before freeing your buffer. */ + /* If your objects are POD plus code for operating on POD, you don’t have to worry about destructors.*/ + // A POD object cannot do run time polymorphism. + /* The pointer referencing it has to be of the correct compile time type, and it has to explicitly have the default constructor when constructed with no arguments.*/ + /* If, however, you are building a tree in the pre-allocated buffer, no sweat. */ + /* You just destruct the root of the tree, and it recursively destructs all its children. */ + /* If you want an arbitrary graph, just make sure you have owning and non owning pointers, and the owning pointers form a tree. */ + /* Anything you can do with run time polymorphism, you can likely do with a type flag.*/ - static_assert ( std::is_pod() , "MyType for some reason is not POD" ); - class MyClass - { - public: - MyClass()=default; // Otherwise unlikely to be POD - MyClass& operator=(const MyClass&) = default; // default assignment Not actually needed, but just a reminder. - }; + static_assert ( std::is_pod() , "MyType for some reason is not POD" ); + class MyClass + { + public: + MyClass()=default; // Otherwise unlikely to be POD + MyClass& operator=(const MyClass&) = default; // default assignment Not actually needed, but just a reminder. + }; - ### alignment + ### alignment - ```c++ - // every object of type struct_float will be aligned to alignof(float) boundary + ```c++ + // every object of type struct_float will be aligned to alignof(float) boundary // (usually 4) struct alignas(float) struct_float { - // your definition here + // your definition here }; - + // every object of type sse_t will be aligned to 256-byte boundary struct alignas(256) sse_t { - float sse_data[4]; + float sse_data[4]; }; - + // the array "cacheline" will be aligned to 128-byte boundary alignas(128) char cacheline[128]; - ``` + ``` # Construction, assignment, and destruction @@ -119,25 +119,25 @@ deleted. Copy constructors - A(const A& a) + A(const A& a) Copy assignment - A& operator=(const A other) + A& operator=(const A other) Move constructors - class_name ( class_name && other) - A(A&& o) - D(D&&) = default; + class_name ( class_name && other) + A(A&& o) + D(D&&) = default; Move assignment operator - V& operator=(V&& other) + V& operator=(V&& other) Move constructors - class_name ( class_name && ) + class_name ( class_name && ) ## rvalue references @@ -161,21 +161,21 @@ forwarding the resources. where `std::forward` is defined as follows: - template< class T > struct remove_reference { - typedef T type; - }; - template< class T > struct remove_reference { - typedef T type; - }; - template< class T > struct remove_reference { - typedef T type; - }; + template< class T > struct remove_reference { + typedef T type; + }; + template< class T > struct remove_reference { + typedef T type; + }; + template< class T > struct remove_reference { + typedef T type; + }; - template - S&& forward(typename std::remove_reference::type& a) noexcept - { - return static_cast(a); - } + template + S&& forward(typename std::remove_reference::type& a) noexcept + { + return static_cast(a); + } `std::move(t)` and `std::forward(t)` don't actually perform any action in themselves, rather they cause the code referencing `t` to use the intended @@ -192,12 +192,12 @@ anyway. When you declare your own constructors, copiers, movers, and deleters, you should generally mark them noexcept. - struct foo { - foo() noexcept {} - foo( const foo & ) noexcept { } - foo( foo && ) noexcept { } - ~foo() {} - }; + struct foo { + foo() noexcept {} + foo( const foo & ) noexcept { } + foo( foo && ) noexcept { } + ~foo() {} + }; Destructors are noexcept by default. If a destructor throws an exception as a result of a destruction caused by an exception, the result is undefined, @@ -207,8 +207,8 @@ ways that are unlikely to be satisfactory. If you need to define a copy constructor, probably also need to define an assignment operator. - t2 = t1; /* calls assignment operator, same as "t2.operator=(t1);" */ - Test t3 = t1; /* calls copy constructor, same as "Test t3(t1);" */ + t2 = t1; /* calls assignment operator, same as "t2.operator=(t1);" */ + Test t3 = t1; /* calls copy constructor, same as "Test t3(t1);" */ ## casts @@ -219,12 +219,12 @@ in the source class instead of the destination class, hence most useful when you are converting to a generic C type, or to the type of an external library that you do not want to change. - struct X { - int y; - operator int(){ return y; } - operator const int&(){ return y; } /* C habits would lead you to incorrectly expect "return &y;", which is what is implied under the hood. */ - operator int*(){ return &y; } // Hood is opened. - }; + struct X { + int y; + operator int(){ return y; } + operator const int&(){ return y; } /* C habits would lead you to incorrectly expect "return &y;", which is what is implied under the hood. */ + operator int*(){ return &y; } // Hood is opened. + }; Mpir, the Visual Studio skew of GMP infinite precision library, has some useful and ingenious template code for converting C type functions of @@ -257,20 +257,20 @@ allocation and redundant copy. # Template specialization - namespace N { - template class Y { /*...*/ }; // primary template - template<> class Y ; // forward declare specialization for double - } - template<> - class N::Y { /*...*/ }; // OK: specialization in same namespace + namespace N { + template class Y { /*...*/ }; // primary template + template<> class Y ; // forward declare specialization for double + } + template<> + class N::Y { /*...*/ }; // OK: specialization in same namespace is used when you have sophisticated template code, because you have to use recursion for looping as the Mpir system uses it to evaluate an arbitrarily complex recursive expression – but I think my rather crude implementation will not be nearly so clever. - extern template int fun(int); - /*prevents redundant instantiation of fun in this compilation unit – and thus renders the code for fun unnecessary in this compilation unit.*/ + extern template int fun(int); + /*prevents redundant instantiation of fun in this compilation unit – and thus renders the code for fun unnecessary in this compilation unit.*/ # Template traits, introspection @@ -308,34 +308,34 @@ implements that functionality entirely up to the derived class. Interface classes are often named beginning with an I. Here’s a sample interface class:. - class IErrorLog - { - public: - virtual bool openLog(const char *filename) = 0; - virtual bool closeLog() = 0; + class IErrorLog + { + public: + virtual bool openLog(const char *filename) = 0; + virtual bool closeLog() = 0; - virtual bool writeError(const char *errorMessage) = 0; + virtual bool writeError(const char *errorMessage) = 0; - virtual ~IErrorLog() {} // make a virtual destructor in case we delete an IErrorLog pointer, so the proper derived destructor is called - // Notice that the virtual destructor is declared to be trivial, but not declared =0; - }; + virtual ~IErrorLog() {} // make a virtual destructor in case we delete an IErrorLog pointer, so the proper derived destructor is called + // Notice that the virtual destructor is declared to be trivial, but not declared =0; + }; [Override specifier](https://en.cppreference.com/w/cpp/language/override) - struct A - { - virtual void foo(); - void bar(); - }; + struct A + { + virtual void foo(); + void bar(); + }; - struct B : A - { - void foo() const override; // Error: B::foo does not override A::foo - // (signature mismatch) - void foo() override; // OK: B::foo overrides A::foo - void bar() override; // Error: A::bar is not virtual - }; + struct B : A + { + void foo() const override; // Error: B::foo does not override A::foo + // (signature mismatch) + void foo() override; // OK: B::foo overrides A::foo + void bar() override; // Error: A::bar is not virtual + }; Similarly [Final specifier](https://en.cppreference.com/w/cpp/language/final) @@ -344,11 +344,11 @@ specifier](https://en.cppreference.com/w/cpp/language/final) storage](http://www.cplusplus.com/reference/type_traits/aligned_storage/)for use with placement new - void* p = aligned_alloc(sizeof(NotMyClass)); - MyClass* pmc = new (p) MyClass; //Placement new. - // ... - pmc->~MyClass(); //Explicit call to destructor. - aligned_free(p);. + void* p = aligned_alloc(sizeof(NotMyClass)); + MyClass* pmc = new (p) MyClass; //Placement new. + // ... + pmc->~MyClass(); //Explicit call to destructor. + aligned_free(p);. # GSL: Guideline Support Library @@ -357,10 +357,10 @@ are suggested for use by the C++ Core Guidelines maintained by the Standard C++ Foundation. This repo contains [Microsoft’s implementation of GSL](https://github.com/Microsoft/GSL). - git clone https://github.com/Microsoft/GSL.git - cd gsl - git tag - git checkout tags/v2.0.0 + git clone https://github.com/Microsoft/GSL.git + cd gsl + git tag + git checkout tags/v2.0.0 Which implementation mostly works on gcc/Linux, but is canonical on Visual Studio. @@ -393,37 +393,37 @@ makes the relationship between the templated base class or classes and the derived class cyclic, so that the derived class tends to function as real base class. Useful for mixin classes. - template class Mixin1{ - public: - // ... - void doSomething() //using the other mixin classes and the derived class T - { - T& derived = static_cast(*this); - // use derived... - } - private: - mixin1(){}; // prevents the class from being used outside the mix) - friend T; - }; + template class Mixin1{ + public: + // ... + void doSomething() //using the other mixin classes and the derived class T + { + T& derived = static_cast(*this); + // use derived... + } + private: + mixin1(){}; // prevents the class from being used outside the mix) + friend T; + }; - template class Mixin2{ - { - public: - // ... - void doSomethingElse() - { - T& derived = static_cast(*this); - // use derived... - } - private: - Mixin2(){}; - friend T; - }; + template class Mixin2{ + { + public: + // ... + void doSomethingElse() + { + T& derived = static_cast(*this); + // use derived... + } + private: + Mixin2(){}; + friend T; + }; - class composite: public mixin1, public mixin2{ - composite( int x, char * y): mixin1(x), mixin2(y[0]) { ...} - composite():composite(7,"a" ){ ...} - } + class composite: public mixin1, public mixin2{ + composite( int x, char * y): mixin1(x), mixin2(y[0]) { ...} + composite():composite(7,"a" ){ ...} + } # Aggregate initialization @@ -432,12 +432,12 @@ constructor is implied default. A class can be explicitly defined to take aggregate initialization - Class T{ - T(std::initializer_list in){ - for (auto i{in.begin); i in){ + for (auto i{in.begin); i - void myFunction(F&& lambda){ - //some things + template + void myFunction(F&& lambda){ + //some things You can put a lambda in a class using decltype,and pass it around for continuations, though you would probably need to template the class: - templateclass foo { - public: - T func; - foo(T in) :func{ in } {} - auto test(int x) { return func(x); } - }; - .... - auto bar = [](int x)->int {return x + 1; }; - foo<(bar)>foobar(bar); + templateclass foo { + public: + T func; + foo(T in) :func{ in } {} + auto test(int x) { return func(x); } + }; + .... + auto bar = [](int x)->int {return x + 1; }; + foo<(bar)>foobar(bar); But we had to introduce a name, bar, so that decltype would have something to work with, which lambdas are intended to avoid. If we are @@ -480,11 +480,11 @@ is very possibly pod. If we are sticking a lambda around to be called later, might copy it by value into a templated class, or might put it on the heap. - auto bar = []() {return 5;}; + auto bar = []() {return 5;}; You can give it to a std::function: - auto func_bar = std::function(bar); + auto func_bar = std::function(bar); In this case, it will get a copy of the value of bar. If bar had captured anything by value, there would be two copies of those values on @@ -495,9 +495,9 @@ bar, as per the rules of cleaning up stack variables. You could just as easily allocate one on the heap: - auto bar_ptr = std::make_unique(bar); + auto bar_ptr = std::make_unique(bar); - std::function increm{[](int arg{return arg+1;}} + std::function increm{[](int arg{return arg+1;}} presumably does this behind the scenes @@ -549,43 +549,43 @@ which can result in messy reallocations. One way is to drop back into old style C, and tell C++ not to fuck around. - struct Packet - { - unsigned int bytelength; - unsigned int data[]; + struct Packet + { + unsigned int bytelength; + unsigned int data[]; - private: - // Will cause compiler error if you misuse this struct - void Packet(const Packet&); - void operator=(const Packet&); - }; - Packet* CreatePacket(unsigned int length) - { - Packet *output = (Packet*) malloc((length+1)*sizeof(Packet)); - output->bytelength = length; - return output; - } + private: + // Will cause compiler error if you misuse this struct + void Packet(const Packet&); + void operator=(const Packet&); + }; + Packet* CreatePacket(unsigned int length) + { + Packet *output = (Packet*) malloc((length+1)*sizeof(Packet)); + output->bytelength = length; + return output; + } Another solution is to work around C++’s inability to handle variable sized objects by fixing your hash function to handle disconnected data. # for_each - template - Function for_each(InputIterator first, InputIterator last, Function fn){ - while (first!=last) { - fn (*first); - ++first; - } - return move(fn); - } + template + Function for_each(InputIterator first, InputIterator last, Function fn){ + while (first!=last) { + fn (*first); + ++first; + } + return move(fn); + } # Range-based for loop - for(auto x: temporary_with_begin_and_end_members{ code;} - for(auto& x: temporary_with_begin_and_end_members{ code;} - for(auto&& x: temporary_with_begin_and_end_members{ code;} - for (T thing = foo(); auto& x : thing.items()) { code; } + for(auto x: temporary_with_begin_and_end_members{ code;} + for(auto& x: temporary_with_begin_and_end_members{ code;} + for(auto&& x: temporary_with_begin_and_end_members{ code;} + for (T thing = foo(); auto& x : thing.items()) { code; } The types of the begin_expr and the end_expr do not have to be the same, and in fact the type of the end_expr does not have to be an iterator: it @@ -598,14 +598,14 @@ member named begin and a member named end (regardless of the type or accessibility of such member), then begin_expr is \_\_range.begin() and end_expr is \_\_range.end(); - for (T thing = foo(); auto x : thing.items()) { code; } + for (T thing = foo(); auto x : thing.items()) { code; } Produces code equivalent to: - T thing = foo(); - auto bar = thing.items(); - auto enditer = bar.end; - for (auto iter = bar.begin(); iter != enditer; ++iter) { - x = *iter; - code; - } + T thing = foo(); + auto bar = thing.items(); + auto enditer = bar.end; + for (auto iter = bar.begin(); iter != enditer; ++iter) { + x = *iter; + code; + } diff --git a/docs/libraries/cpp_multithreading.md b/docs/libraries/cpp_multithreading.md index 3fbb289..5f01d74 100644 --- a/docs/libraries/cpp_multithreading.md +++ b/docs/libraries/cpp_multithreading.md @@ -201,7 +201,7 @@ and whose extension to atomic locks is not obvious. Suppose you are doing atomic operations, but some operations might be expensive and lengthy. You really only want to spin lock on amending data that is small and all in close together in memory, so on your second spin, -the lock has likely been released. +the lock has likely been released. Well, if you might need to sleep a thread, you need a regular mutex, but how are you going to interface spin locks and regular mutexes? @@ -258,7 +258,7 @@ Thus one winds up with what suspect it the Tokio solution, a stack that is a tree, rather than a stack. Hence the equivalence between node.js and nginx event oriented -programming, and Go concurrent programming. +programming, and Go concurrent programming. # costs @@ -287,21 +287,21 @@ is not in fact terribly useful for anything you are interested in doing. ```C++ typedef enum memory_order { - memory_order_relaxed, // relaxed - memory_order_consume, // consume - /* No one, least of all compiler writers, understands what - "consume" does. - It has consequences which are difficult to understand or predict, - and which are apt to be inconsistent between architectures, - libraries, and compilers. */ - memory_order_acquire, // acquire - memory_order_release, // release - memory_order_acq_rel, // acquire/release - memory_order_seq_cst // sequentially consistent - /* "sequentially consistent" interacts with the more commonly\ - used acquire and release in ways difficult to understand or - predict, and in ways that compiler and library writers - disagree on. */ + memory_order_relaxed, // relaxed + memory_order_consume, // consume + /* No one, least of all compiler writers, understands what + "consume" does. + It has consequences which are difficult to understand or predict, + and which are apt to be inconsistent between architectures, + libraries, and compilers. */ + memory_order_acquire, // acquire + memory_order_release, // release + memory_order_acq_rel, // acquire/release + memory_order_seq_cst // sequentially consistent + /* "sequentially consistent" interacts with the more commonly\ + used acquire and release in ways difficult to understand or + predict, and in ways that compiler and library writers + disagree on. */ } memory_order; ``` @@ -337,8 +337,8 @@ between the two coprocesses, without any need for locks or atomics, but with a need for stack fixups. But Node.js seems to get by fine with code continuations instead of Go’s stack fixups. -A buffered channel is just a fixed size block of memory with alignment, -size, and atomic wrapping read and write pointers. +A buffered channel is just a fixed size block of memory with alignment, +size, and atomic wrapping read and write pointers. Why do they need to be atomic? @@ -384,7 +384,7 @@ immediately after firing the notify. But it could happen that if we try to avoid unnecessarily grabbing the mutex, one thread sees the other thread awake, just when it is going to -sleep, so I fear I have missed a spin lock somewhere in this story. +sleep, so I fear I have missed a spin lock somewhere in this story. If we want to avoid unnecessary resort to mutex, we have to spin lock on a state machine that governs entry into mutex resolution. Each thread makes @@ -440,54 +440,54 @@ static_assert(__STDCPP_THREADS__==1, "Needs threads"); // As thread resources have to be managed, need to be wrapped in // RAII class ThreadRAII { - std::thread & m_thread; + std::thread & m_thread; public: // As a thread object is moveable but not copyable, the thread obj // needs to be constructed inside the invocation of the ThreadRAII // constructor. */ - ThreadRAII(std::thread & threadObj) : m_thread(threadObj){} - ~ThreadRAII(){ - // Check if thread is joinable then detach the thread - if(m_thread.joinable()){ - m_thread.detach(); - } - } - }; + ThreadRAII(std::thread & threadObj) : m_thread(threadObj){} + ~ThreadRAII(){ + // Check if thread is joinable then detach the thread + if(m_thread.joinable()){ + m_thread.detach(); + } + } + }; ``` Examples of thread construction ```C++ - void foo(char *){ - … - } + void foo(char *){ + … + } - class foo_functor - { - public: - void operator()(char *){ - … - } - }; - + class foo_functor + { + public: + void operator()(char *){ + … + } + }; - int main(){ - ThreadRAII thread_one(std::thread (foo, "one")); - ThreadRAII thread_two( - std::thread ( - (foo_functor()), - "two" - ) - ); - const char three[]{"three"}; - ThreadRAII thread_lambda( - std::thread( - [three](){ - … - } - ) - ); - } + + int main(){ + ThreadRAII thread_one(std::thread (foo, "one")); + ThreadRAII thread_two( + std::thread ( + (foo_functor()), + "two" + ) + ); + const char three[]{"three"}; + ThreadRAII thread_lambda( + std::thread( + [three](){ + … + } + ) + ); + } ``` C++ has a bunch of threading facilities that are designed for the case that diff --git a/docs/libraries/git_bash_undocumented.md b/docs/libraries/git_bash_undocumented.md index 50e7134..ffd2eba 100644 --- a/docs/libraries/git_bash_undocumented.md +++ b/docs/libraries/git_bash_undocumented.md @@ -9,7 +9,7 @@ other processes that do the actual work. While git-bash.exe is undocumented, `m Example Windows shortcut to bash script: `/x/src/wallet/docs/mkdocs.sh` - "C:\Program Files\Git\git-bash.exe" --cd=X:\src\wallet --needs-console --no-hide --command=usr\bin\bash.exe --login -i docs/mkdocs.sh + "C:\Program Files\Git\git-bash.exe" --cd=X:\src\wallet --needs-console --no-hide --command=usr\bin\bash.exe --login -i docs/mkdocs.sh Notice that the paths to the left of the invocation of `bash` are in Windows format, and the paths to the right of the invocation of bash are in gnu @@ -46,7 +46,7 @@ Fails to ensure that there is a Win32 console `--hide` Hides the console window. This makes sense if you are launching a script and not expecting any feedback. But it means that the script has no means to -give you an error message. +give you an error message. `--no-hide` Does not hide the console window. diff --git a/docs/libraries/pandoc_templates/header.pandoc b/docs/libraries/pandoc_templates/header.pandoc index b386f15..30bad69 100644 --- a/docs/libraries/pandoc_templates/header.pandoc +++ b/docs/libraries/pandoc_templates/header.pandoc @@ -4,7 +4,7 @@ margin-left: 1em; } p.center {text-align:center;} - + table { border-collapse: collapse; } @@ -18,4 +18,3 @@ } - \ No newline at end of file diff --git a/docs/libraries/scripting.html b/docs/libraries/scripting.html deleted file mode 100644 index 355dcde..0000000 --- a/docs/libraries/scripting.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - Scripting - - -

To Home page

-

Scripting

- - Initially we intend to implement human to human secret messaging, with money that can be transferred in the message, and the capability to make messages public and provably linked with an identity

- - But obviously we are eventually going to need bot responses, and bot scripts that can interact with the recipient within a sandbox. Not wanting to repeat the mistakes of the internet, we will want the same bot language generating responses, and interacting with the recipient.

- - There is a list of embeddable scripting languages.

- - Lua and python are readily embeddable, but the language shootout tells us they are terribly slow.

- - Lisp is sort of embeddable, startlingly fast, and is enormously capable, but it is huge, and not all that portable.

- - ES (javascript) is impressively fast in its node.js implementation, which does not necessarily imply the embeddable versions are fast.

- - Very few of the scripting languages make promises about sandbox capability, and I know there is enormous grief over sandboxing Javascript. It can be done, but it is a big project.

- - Angelscript does make promises about sandbox capability, but I have absolutely no information its capability and performance.

- - Tcl is event loop oriented.

- - But hell, I have an event loop. I want my events to put data in memory, then launch a script for the event, the script does something with the data, generates some new data, fires some events that will make use of the data, and finishes.

- - Given that I want programs to be short and quickly terminate, maybe we do not need dynamic memory management and garbage collection. Maybe arkscript would handle it.

- -

This document is licensed under the CreativeCommons Attribution-Share Alike 3.0 License

- - diff --git a/docs/libraries/scripting.md b/docs/libraries/scripting.md new file mode 100644 index 0000000..0b27a16 --- /dev/null +++ b/docs/libraries/scripting.md @@ -0,0 +1,52 @@ +--- +title: Scripting +--- + +Initially we intend to implement human to human secret messaging, with +money that can be transferred in the message, and the capability to make +messages public and provably linked with an identity + +But obviously we are eventually going to need bot responses, and bot +scripts that can interact with the recipient within a sandbox. Not wanting +to repeat the mistakes of the internet, we will want the same bot language +generating responses, and interacting with the recipient. + +There is a [list](https://github.com/dbohdan/embedded-scripting-languages) of embeddable scripting languages. + +Lua and python are readily embeddable, but [the language shootout](https://benchmarksgame-team.pages.debian.net/benchmarksgame/) tells us +they are terribly slow. + +Lua, however, has `LuaJIT`, which is about ten times faster than `Lua`, which +makes it only about four or five times slower than JavaScript under +`node.js`. It is highly portable, though I get the feeling that porting it to +windows is going to be a pain, but then it is never going to be expected to +call the windows file and gui operations. + +Lisp is sort of embeddable, startlingly fast, and is enormously capable, but +it is huge, and not all that portable. + +ES (JavaScript) is impressively fast in its node.js implementation, which does +not necessarily imply the embeddable versions are fast. + +Very few of the scripting languages make promises about sandbox +capability, and I know there is enormous grief over sandboxing JavaScript. +It can be done, but it is a big project. + +Angelscript *does* make promises about sandbox capability, but I have +absolutely no information its capability and performance. + +Tcl is event loop oriented. + +But hell, I have an event loop. I want my events to put data in memory, +then launch a script for the event, the script does something with the data, +generates some new data, fires some events that will make use of the data, and +finishes. + +Given that I want programs to be short and quickly terminate, maybe we +do not need dynamic memory management and garbage collection. + +Lua is slowed by dynamic memory management. But with event +orientation, dynamic memory management is complete waste, since your +only memory management is allocating continuation objects to be fired on +the next event - which is to say, all memory management is explicit, when +an event handler detaches. diff --git a/docs/libraries/serialization_and_canonical_form.html b/docs/libraries/serialization_and_canonical_form.html index 40f5c8f..4311973 100644 --- a/docs/libraries/serialization_and_canonical_form.html +++ b/docs/libraries/serialization_and_canonical_form.html @@ -1,8 +1,8 @@ - - - Serialization and Canonical form + Serialization and Canonical form -

To Home page

-

Serialization and Canonical form

- +

To Home page

+

Serialization and Canonical form

+ On reflection, using a serialization library is massive overkill, since we are serializing records that always have a record type identifier, and we are serializing hashes, signatures, and utf8 strings, which should already be in network order, so the only thing we have to serialize is ints, for which we might as well write our own serialization code, in an object of type serialization buffer

 namespace ro {
 	template<class T> class iserial : public gsl::span<uint8_t> {
@@ -67,10 +67,10 @@ namespace ro {
 
 But all our money amounts will typically be around 32 bits or longer, maximum 64 bits, hence untranslatable to valid utf8.  Might represent them as a decimal exponent and small integer.

We might need floating point for graph analysis, but that is a long way in the future. Sqlite3 uses big-endian IEEE 754-2008 64-bit floating point numbers as its canonical interchange format, (no longer widely used by modern computers) but even if we do the analysis in floating point, we may well find it more convenient to interchange the data as integers, since the floating point values of groups of interest are all likely to be in a narrow range, and we may not care to interchange the graph analysis data at all, only the groupings and rankings. Really you only care about one group, the cooperating group. - + We also need to serialize signatures to human readable format, for embedding in human readable messages – base 58, because we are suppressing O, o, I, and lower case l, or base 64, which we get by including -+_$!* (permitted in urls) For error check, prefigure with enough hash bits to round up to a multiple of six bits. and make the output fixed size. Human readable messages that include sensitive records will always end with a hash of the entire human readable message, truncated to a multiple of three bytes, hence a multiple of six bits. Perhaps thirty bytes, two hundred and forty bits, forty u characters of u encoding, and the signed transaction output inside the message will always have the full signature of the full record. A full signature of a full record will thirty three bytes, 32 bytes of signature and one byte of hash of the signature, to make human transmission of signatures possible, though very difficult.

- - + + Review of serializers.

We don’t want the schema agility of protobuf and Avro. We want header only, and do not come with half a dozen tools that do half a dozen complicated things. We just want to serialize stuff to canonical form so that it can transported between different architectures and code generated by different compilers, and so that the same object always generates the same hash.

@@ -84,12 +84,12 @@ We don’t want the schema agility of protobuf and Avro. We want header only, a A typical high speed connection is 1Gbps one Gigabit per second. (GBps is gigabyte persecond, Gbps is gigabit per second.

Yas compact can handle 4Gbps, so storage and bandwidth are likely to be bottlenecks – and we can probably throw more cpus at the system easier than more bandwidth and storage. So we make canonical yas-compact, or a variant thereof, with customization on index fields.

- -

libnop: C++ Native Object Protocols

only seems to support Clang compiler. Visual Studio throws up.

- -

Cap'n Proto

Overkill. Too much stuff. But their zero compression is cool.

- -

These documents are licensed under the Creative Commons Attribution-Share Alike 3.0 License

+

libnop: C++ Native Object Protocols

only seems to support Clang compiler. Visual Studio throws up.

+ +

Cap'n Proto

Overkill. Too much stuff. But their zero compression is cool.

+ + +

These documents are licensed under the Creative Commons Attribution-Share Alike 3.0 License

diff --git a/docs/lightning_layer.md b/docs/lightning_layer.md index a98896c..5916718 100644 --- a/docs/lightning_layer.md +++ b/docs/lightning_layer.md @@ -1,6 +1,6 @@ --- title: - Lightning Layer + Lightning Layer --- # This discussion of the lightning layer may well be obsoleted @@ -15,7 +15,7 @@ Contingent payments can reveal a key to an alien blockchain on the bitcoin block [Anonymous Multi-Hop Locks]: anonymous_multihop_locks_lightning_network.pdf "Anonymous Multi-Hop Locks for Blockchain Scalability and Interoperability" -[zero knowledge contingent payments on the bitcoin chain]:https://bitcoincore.org/en/2016/02/26/zero-knowledge-contingent-payments-announcement/ +[zero knowledge contingent payments on the bitcoin chain]:https://bitcoincore.org/en/2016/02/26/zero-knowledge-contingent-payments-announcement/ "The first successful Zero-Knowledge Contingent Bitcoin Payment" I need to understand the [Anonymous Multi-Hop Locks] primitive, and diff --git a/docs/logon_protocol.html b/docs/logon_protocol.html index aabf67e..51703b5 100644 --- a/docs/logon_protocol.html +++ b/docs/logon_protocol.html @@ -10,20 +10,20 @@ p.center {text-align:center;} - + Logon protocol - +

To Home page

Logon Protocol

User functionality

- + Our immediate objective, in the minimum viable product, is that peers should be able to talk to each other to reach a consensus on who owns what coin, and clients should be able to connect to peers, should be hosted by peers, to get information about the consensus, to pay each other, and to communicate bills and contracts to each other.

- + Our ultimate objective is to replace the existing centralized internet name system, but for starters, just have a name system so that clients can make payments to entities identified by name.

- + We want our minimum viable system to be compatible with a future system where you can sign up with a host by giving it a name analogous to an email address, a name at which you can be contacted, and then the host contacts your client program on that machine on that machine, the client says "do you want to sign up", and thereafter you have automatic sign in with your client and a bookmark for that host on your client. Also the host can send you messages, and these messages can contain links that have the same effect as that bookmark link, except that the host knows what message you are responding to. But that is future compatibility that the minimum viable system needs to be compatible with, not what the minimum viable product will implement.

The minimum viable product will implement a subset of that as necessary for the payment system, capable of being compatibly extended to that in future.

@@ -80,4 +80,4 @@ But what does the host know about the client. licensed under the Creative Commons Attribution-Share Alike 3.0 License

- \ No newline at end of file + diff --git a/docs/merkle_patricia-dac.md b/docs/merkle_patricia-dac.md index 7201c5e..1838c89 100644 --- a/docs/merkle_patricia-dac.md +++ b/docs/merkle_patricia-dac.md @@ -1,6 +1,6 @@ --- title: - Merkle-patricia Dac + Merkle-patricia Dac # katex --- @@ -864,7 +864,7 @@ solve the problem of the number of items not being a power of two? d=" M71.36 234.686s2.145-.873 3.102 0c1.426 1.303 14.645 21.829 16.933 23.136 1.302.745 4.496.45 5-2.3 M145.916 220c0-.93.124-.992.992-1.364.869-.373 2.42-.373 3.04.558.62.93-2.852-4.94 18.607 38.394.715 1.443 2.348 1.186 4-2 - M147.218 218.5c1.303-.124 1.675.062 2.11.93.434.868.558 3.846.558 3.846-.25 2.496.31 3.597-1.365 19.166-1.675 15.568-1.54 21.825-.744 24.872.744 3.853 3.0 2.853 5.2 .295 + M147.218 218.5c1.303-.124 1.675.062 2.11.93.434.868.558 3.846.558 3.846-.25 2.496.31 3.597-1.365 19.166-1.675 15.568-1.54 21.825-.744 24.872.744 3.853 3.0 2.853 5.2 .295 M71.36 234.686c2.42-.434 2.916-.93 6.079-.186 3.163.745 4.466 1.551 12.715 5.52 8.25 3.97 37.774 3.66 41.31 2.606C134.999 241.57 136 240 137 239 M71.36 234.686s1.551-.558 2.171.186c.62.745 2.481 4.528 1.8 10.545-.683 6.016-2.854 20.719-2.854 22.577 0 2.171 1.116 2.482 2.543 1.8C76.447 269.11 76 268 77 264"/> - + diff --git a/docs/mkdocs.sh b/docs/mkdocs.sh index a03d151..7327332 100644 --- a/docs/mkdocs.sh +++ b/docs/mkdocs.sh @@ -3,39 +3,45 @@ set -e cd `dirname $0` if [[ "$OSTYPE" == "linux-gnu"* ]]; then - osoptions="" + osoptions="" elif [[ "$OSTYPE" == "darwin"* ]]; then - osoptions="" + osoptions="" elif [[ "$OSTYPE" == "cygwin" ]]; then - osoptions="--fail-if-warnings --eol=lf " + osoptions="--fail-if-warnings --eol=lf " elif [[ "$OSTYPE" == "msys" ]]; then - osoptions="--fail-if-warnings --eol=lf " + osoptions="--fail-if-warnings --eol=lf " fi templates="./pandoc_templates/" -options=$osoptions"--toc -N --toc-depth=5 --wrap=preserve --metadata=lang:en --include-in-header=$templates/header.pandoc --include-before-body=$templates/before.pandoc --include-after-body=$templates/after.pandoc --css=$templates/style.css -o" -for f in *.md +options=$osoptions"--toc -N --toc-depth=5 --wrap=preserve --metadata=lang:en --include-in-header=$templates/header.pandoc --include-before-body=$templates/before.pandoc --css=$templates/style.css -o" +for f in *.md do len=${#f} base=${f:0:($len-3)} if [ $f -nt $base.html ]; then katex="" - for i in 1 2 3 4 + mine="--include-after-body=$templates/after.pandoc " + for i in 1 2 3 4 5 6 do - read line + read line if [[ $line =~ katex$ ]]; - then - katex=" --katex=./" - fi + then + katex=" --katex=./" + fi +if [[ $line =~ notmine$ ]]; + then + mine=" " + fi done <$f - pandoc $katex $options $base.html $base.md + pandoc $katex $mine $options $base.html $base.md echo "$base.html from $f" + #else # echo " $base.html up to date" fi done cd libraries -for f in *.md +for f in *.md do len=${#f} base=${f:0:($len-3)} @@ -44,13 +50,13 @@ do katex="" for i in 1 2 3 4 do - read line + read line if [[ $line =~ katex ]]; - then - katex=" --katex=./" - fi + then + katex=" --katex=./" + fi done <$f - pandoc $katex $options $base.html $base.md + pandoc $katex $mine $options $base.html $base.md echo "$base.html from $f" #else # echo " $base.html up to date" @@ -58,7 +64,7 @@ do done cd ../.. templates=docs/pandoc_templates/ -for f in *.md +for f in *.md do len=${#f} base=${f:0:($len-3)} diff --git a/docs/multicore.html b/docs/multicore.html index a41fd59..234d219 100644 --- a/docs/multicore.html +++ b/docs/multicore.html @@ -1,8 +1,8 @@ - - - - Multicore + + Multicore -

To Home page

-

Multicore

-

At the same time as the security crisis has hit, the multicore crisis - has hit.  A short while ago we were dealing with isolated serial - machines, now our programs must utilize a sea of machines. 

-

Multithreading is hard.  Doing it routinely, doing it with large - programs, invariably fails. 

-

Intel, NVIDIA, and Google however have this crisis well in hand. 

-

Big Businesses are attacking the problem, with competence and success, - and we can leave them to it and not worry too much. Google is pioneering - the way, and Intel and NVIDIA are making similar tools available to the - masses. 

-

Since massive parallelism is a hard problem, requiring good people, much - thought, and much care, the meta solution is to solve that problem as few - times as possible, and re-use the resulting solutions as much as - possible.  If, for example, one uses the hash table provided by - Intel’s threaded building blocks library, the Intel library and Intel - compiler takes care of hash table related coordination issues that - otherwise the programmer would have to take care of, and would probably - foul up. 

-

Intel has provided a bunch of utilities that make it a good deal easier, - Vtune, thread checker, OpenMP, compiler auto parallelism, Intel Thread - Checker, Intel VTune Performance Analyzer, and most importantly, Threaded - Building Blocks.  it is still hard – but no longer damn near - impossible. 

-

Back in the days when there was one hardware thread of execution driving - multiple software threads, locking worked well. These day, not so - well.  Rather, it is often more desirable to use a lockless - transactional approach to handle any shared state.  Shared state is - hard, better to share nothing – or to leave any sharing to those utilities - that someone else has already written and debugged.  If rolling your - own, better to use InterlockedXxx than Lock.  Note that you construct - your own InterlockedXxx operation for - any Xxx using InterlockedCompareExchange.

-

The big solution, however is that pioneered by Google. Rather than each - programmer designing his own multithreading and multicore design, one has - a small number of very general massively parallel algorithms embodied in - useful software for massaging masses of data.  The programmer then - calls that software and lets it handle the parallelism.  Google’s Map - Reduce is the classic example of this, but every database servicing a web - application is also an example of this, since one typically has many web - servers running many processes all of which might potentially update the - same data at the same time, and the database is supposed to sort out any - resulting problems, while the developers write in single threaded python - or ruby on rails, and let the database handle any problems related to - massive parallelism. 

-

Google’s “app engine” allows programmers to write straightforward single - threaded python code in the easy to use Django framework that can be - executed in a massively parallel manner with coordination between many - parallel processes being performed by Google’s datastore. 

-

In short, the multicore crisis, unlike the other crises I describe in - this group of web pages, is well in hand. 

+

To Home page

+

Multicore

+

At the same time as the security crisis has hit, the multicore crisis + has hit.  A short while ago we were dealing with isolated serial + machines, now our programs must utilize a sea of machines. 

+

Multithreading is hard.  Doing it routinely, doing it with large + programs, invariably fails. 

+

Intel, NVIDIA, and Google however have this crisis well in hand. 

+

Big Businesses are attacking the problem, with competence and success, + and we can leave them to it and not worry too much. Google is pioneering + the way, and Intel and NVIDIA are making similar tools available to the + masses. 

+

Since massive parallelism is a hard problem, requiring good people, much + thought, and much care, the meta solution is to solve that problem as few + times as possible, and re-use the resulting solutions as much as + possible.  If, for example, one uses the hash table provided by + Intel’s threaded building blocks library, the Intel library and Intel + compiler takes care of hash table related coordination issues that + otherwise the programmer would have to take care of, and would probably + foul up. 

+

Intel has provided a bunch of utilities that make it a good deal easier, + Vtune, thread checker, OpenMP, compiler auto parallelism, Intel Thread + Checker, Intel VTune Performance Analyzer, and most importantly, Threaded + Building Blocks.  it is still hard – but no longer damn near + impossible. 

+

Back in the days when there was one hardware thread of execution driving + multiple software threads, locking worked well. These day, not so + well.  Rather, it is often more desirable to use a lockless + transactional approach to handle any shared state.  Shared state is + hard, better to share nothing – or to leave any sharing to those utilities + that someone else has already written and debugged.  If rolling your + own, better to use InterlockedXxx than Lock.  Note that you construct + your own InterlockedXxx operation for + any Xxx using InterlockedCompareExchange.

+

The big solution, however is that pioneered by Google. Rather than each + programmer designing his own multithreading and multicore design, one has + a small number of very general massively parallel algorithms embodied in + useful software for massaging masses of data.  The programmer then + calls that software and lets it handle the parallelism.  Google’s Map + Reduce is the classic example of this, but every database servicing a web + application is also an example of this, since one typically has many web + servers running many processes all of which might potentially update the + same data at the same time, and the database is supposed to sort out any + resulting problems, while the developers write in single threaded python + or ruby on rails, and let the database handle any problems related to + massive parallelism. 

+

Google’s “app engine” allows programmers to write straightforward single + threaded python code in the easy to use Django framework that can be + executed in a massively parallel manner with coordination between many + parallel processes being performed by Google’s datastore. 

+

In short, the multicore crisis, unlike the other crises I describe in + this group of web pages, is well in hand. 

These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

+Commons Attribution-Share Alike 3.0 License

diff --git a/docs/net_money.html b/docs/net_money.html index b4c3711..b098c39 100644 --- a/docs/net_money.html +++ b/docs/net_money.html @@ -169,6 +169,6 @@ quite a bit of work to design these things, and to get them deployed in a form that ordinary mortals can use.

These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

+Commons Attribution-Share Alike 3.0 License

\ No newline at end of file diff --git a/docs/networking_protocol.html b/docs/networking_protocol.html index cbac4e3..b32f6cc 100644 --- a/docs/networking_protocol.html +++ b/docs/networking_protocol.html @@ -8,7 +8,7 @@ } p.center {text-align:center;} - + Networking Protocol

To Home page

@@ -26,9 +26,9 @@ Trouble with bitcoin is that it is not centerless – proof of work winds up bei Thus we need a system with proof of stake, and not only proof of stake, but proof of client stake – the power over the system needs to reside with peers that have a lot of wealthy clients – and it needs to be hard to find who the clients are, and where they are keeping their secrets, so that even if Mueller seizes important peers on charges of tax evasion and money laundering, does not thereby gain control.

-If the system handles an enormous number of transactions, peers are going to be big and expensive, thus vulnerable to people like Mueller armed with vague and open ended charges of tax evasion and money laundering. Hence the power of peer over the currency needs to be proportional to the wealth controlled by the secrets held by that peer’s clients. And that peer’s clients need to be free to move from one peer to the next, and apt to move to peers that make it difficult for Mueller to find their clients.

+If the system handles an enormous number of transactions, peers are going to be big and expensive, thus vulnerable to people like Mueller armed with vague and open ended charges of tax evasion and money laundering. Hence the power of peer over the currency needs to be proportional to the wealth controlled by the secrets held by that peer’s clients. And that peer’s clients need to be free to move from one peer to the next, and apt to move to peers that make it difficult for Mueller to find their clients.

-Need a crypto currency where Bob can prove to the whole world that he paid Ann such and such amount, in accord with such and such a bill, but no one else can prove he paid Ann, nor that there ever was such a bill, except he shows them. Bitcoin is far too traceable. We need controlled traceability, where the parrticipants can prove a transaction to third parties and the world, but the world cannot. And Bob needs to be able to prove what the payment was about, that it was part of a conversation, a meeting of minds.

+Need a crypto currency where Bob can prove to the whole world that he paid Ann such and such amount, in accord with such and such a bill, but no one else can prove he paid Ann, nor that there ever was such a bill, except he shows them. Bitcoin is far too traceable. We need controlled traceability, where the participants can prove a transaction to third parties and the world, but the world cannot. And Bob needs to be able to prove what the payment was about, that it was part of a conversation, a meeting of minds.

The reason we have end user demand for crypto currency is the same as the reason we have end user demand for gold.

@@ -62,7 +62,6 @@ So, to accomplish the goal of shutting down crypto currency requires world wide

These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

+Commons Attribution-Share Alike 3.0 License

- \ No newline at end of file diff --git a/docs/normalizing_unicode_strings.html b/docs/normalizing_unicode_strings.html index eb0ce4c..a8c2380 100644 --- a/docs/normalizing_unicode_strings.html +++ b/docs/normalizing_unicode_strings.html @@ -1,8 +1,8 @@ - - - - Normalizing unicode strings + + Normalizing unicode strings -

To Home page

-

Normalizing unicode strings

- +

To Home page

+

Normalizing unicode strings

+ I would like strings that look similar to humans to map to the same item. Obviously trailing and leading whitespace needs to go, and whitespace map a single space.

- + The hard part, however is that unicode has an enormous number of near duplicate symbols.

- Have you already read
+ Have you already read
https://www.unicode.org/reports/tr15/tr15-45.html ?

- Our normalization code is in
+ Our normalization code is in
http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=tree;f=libraries/liblunicode;h=4896a6dc9ee5d3e78c15ed6c2e2ed2f21be70247;hb=HEAD

- + I am going to have to use NFKC canonical form for the key, and NFC canonical form for the display of the key.

Which once in a blue moon will drive someone crazy. "Its broken" he will say

diff --git a/docs/openvpn.html b/docs/openvpn.html index 330927c..3edbbec 100644 --- a/docs/openvpn.html +++ b/docs/openvpn.html @@ -9,14 +9,14 @@ } p.center {text-align:center;} - + Openvpn - +

To Home page

Openvpn on the cloud

- + Figure out what version of debian you are running:

 	cat /etc/*-release && cat /proc/version
 

diff --git a/docs/pandoc_templates/header.pandoc b/docs/pandoc_templates/header.pandoc index 6350b9a..aceb5b1 100644 --- a/docs/pandoc_templates/header.pandoc +++ b/docs/pandoc_templates/header.pandoc @@ -1,10 +1,10 @@ - \ No newline at end of file diff --git a/docs/passphrases.html b/docs/passphrases.html index 7ba9cbb..df8e143 100644 --- a/docs/passphrases.html +++ b/docs/passphrases.html @@ -1,35 +1,35 @@ - - - - Passphrases + + Passphrases -

To Home page

-

Passphrases

-

Passphrases are of course stronger and easier to +

To Home page

+

Passphrases

+

Passphrases are of course stronger and easier to remember than passwords, but whitespace causes endless problems, which in turn cause endless support calls

- +

Whitespace in a passphrase should therefore be canonicalized before hashing. Multiple spaces, tabs, and carriage returns should become a single space. Leading and - trailing whitespace should be stripped.

- + trailing whitespace should be stripped.

+

These documents are licensed under the Creative Commons Attribution-Share Alike 3.0 License

- + diff --git a/docs/payments_contracts_invoices_and_reputational_data.html b/docs/payments_contracts_invoices_and_reputational_data.html index e580197..822ddb3 100644 --- a/docs/payments_contracts_invoices_and_reputational_data.html +++ b/docs/payments_contracts_invoices_and_reputational_data.html @@ -1,8 +1,8 @@ - - - - Payments, Contracts, Invoices, and Reputational data + + Payments, Contracts, Invoices, and Reputational data -

To Home page

-

Payments, Contracts, Invoices, and Reputational data

-

The problem to be solved

-

*****

-

-

-

-

*****

-

-

-

-

Value and Exchange

-

An exchange of value consists of a contract to exchange ("trade"), two - transfers of value (value for value), coordination problems - ("settlement"), and dispute resolution services ("failure").

-

Hence, reliability of exchange is dominated by reliability of transfers. - And, transfers of value are dominated by reliability of basic issues of - value, including storage.

-

What might be seen as sort of semantic short-cut is that a value system - may be considered reliable if and only if it can participate in an - exchange.

-

 

-

These documents are - licensed under the Creative +

To Home page

+

Payments, Contracts, Invoices, and Reputational data

+

The problem to be solved

+

*****

+

+

+

+

*****

+

+

+

+

Value and Exchange

+

An exchange of value consists of a contract to exchange ("trade"), two + transfers of value (value for value), coordination problems + ("settlement"), and dispute resolution services ("failure").

+

Hence, reliability of exchange is dominated by reliability of transfers. + And, transfers of value are dominated by reliability of basic issues of + value, including storage.

+

What might be seen as sort of semantic short-cut is that a value system + may be considered reliable if and only if it can participate in an + exchange.

+

 

+

These documents are + licensed under the Creative Commons - Attribution-Share Alike 3.0 License

-

+ Attribution-Share Alike 3.0 License

+

diff --git a/docs/proof_of_stake.md b/docs/proof_of_stake.md index 1063df2..03fb952 100644 --- a/docs/proof_of_stake.md +++ b/docs/proof_of_stake.md @@ -1,6 +1,6 @@ --- title: - Proof of Stake + Proof of Stake --- ::: {style="background-color : #ffdddd; font-size:120%"} ![run!](tealdeer.gif)[TL;DR Map a blockdag algorithm equivalent to the @@ -681,4 +681,3 @@ for](trust_and_privacy_on_the_blockchain.html). Peers may have human readable names, and wallets may have names of the form `LoginName@PeerName`. - diff --git a/docs/protocol_negotiation.html b/docs/protocol_negotiation.html index 298e137..ecf1029 100644 --- a/docs/protocol_negotiation.html +++ b/docs/protocol_negotiation.html @@ -1,8 +1,8 @@ - - - - Protocol Negotiation + + Protocol Negotiation -

To Home page

-

Protocol Negotiation

-

Once a protocol is in use, it becomes very hard to change. If one person - updates the server, and the client is not updated, everything breaks.

-

And so, we are stuck with a lot of frozen protocols, many of which are - in urgent need of change, but to change, requires wide consensus, which - requires a big bunch of people showing up at a meeting, but at such - meetings very little gets done, and what gets done is stupid.

-

If a standard is successful, more and more people want to be in the - committee, many of whom represent business profit centers and government - special interests, and who really do not understand much about the - technology, except that any change might be adverse to the very important - people who sent them there.

-

As the committee gets larger, it gets more unworkable, and as it - represents more and more special interests, it gets more unworkable

-

In order to have to have a system where the internet’s protocols can be - upgraded, and new protocols introduced, without central coordination, - protocol negotiation, where client and server first discuss what protocol - version they will be using, has to be part of every protocol, all the way - down to the level of TCP and UDP.

-

These days everyone builds in protocol negotiation, often on top of SSL, which is on top of TCP, resulting in three additional round trips.

-

And then a widely distributed client or server breaks the protocol negotiation, which no one notices because it interorperates with all existing implementations, until someone tries to introduce a new protocol, whereupon the new code implementing the new protocol is blamed for its failure to interoperate with the existing clients and/or servers, and then we get another layer of protocol negotiation on top of all the existing layers of protocol negotiation.

-

TCP has built in protocol negotiation, eight bits worth, which turned - out, unsurprisingly, to be inadequate.

-

For the content of the internet to be free from central control, we need - to ensure that the address spaces and protocols are free from central - control.

-

When an old protocol is broken, clients and servers that have not - upgraded to a new improved protocol will remain forever, so the old - defective protocol has to be supported forever – without, however, - allowing an attacker a downgrade attack.

-

To prevent a downgrade attack, there has to be some way of disabling - protocols in the field, where the signed ban on certain protocols flood - fills from one program to the next.

-

Often, it is impossible to support the old clients, because protocol - negotiation was never adequately designed in, or because it was designed - in but was designed vulnerable to a downgrade attack.

-

But let us suppose the protocol negotiation was well designed:  The - committee has to assign a code.  And of course, they will only assign - this code to a protocol that they agree is right – and nothing gets done, - for there is always some vested interest that for some strange and obscure - reason does not want this protocol to exist.

-

One solution is to have quite large protocol identifiers, or arbitrarily - large variable length protocol identifiers, so that anyone can whip up a - protocol and assign it an identifier, and hack a client and server to use - it, without having to walk it past three dozen members of the committee.

-

But then, of course, we would probably wind up with a lot of protocols. -  This could potentially lead to a lot of protocol negotiation round - trips

-
-

Do you speak protocol A? No.

-

Do you speak protocol B? No.

-

Do you speak protocol C? No.

-

Do you speak protocol D? No.

-

Do you speak protocol E? Yes.

-
-

One solution to this problem is to have complete lists of protocols, call - it a protocol dictionary, which dictionary maps the long probabilistically - globally unique protocol names to short deterministically unique local - protocol names, and gives an order of preference.  If the client - names a dictionary that it supports, and/or the server names a dictionary - that it supports, then they can usually come to immediate agreement.
-

-

If, for example, the client wants to talk protocol X, it proposes one or - more dictionaries of updates to protocol X, implying that it can talk all - the updates listed in each dictionary, and an order of preference among - dictionaries

-

If the server recognizes one or more of the dictionaries, it then - responds with one of the protocols listed in the first dictionary that it - recognizes, by its short dictionary name, and the conversation proceeds.

-

An ordered list of dictionaries is identified by a public key and a short - human readable type name.  The typename is only unique with respect - to the dictionaries signed by this public key, thus ftp version 1, ftp - version 2, ftp version 4 ...

-

The globally unique identifier of a dictionary is the hash of the rule - identifying its public key, plus its typename and version number.

-

If the server recognizes the hash of the rule identifying the dictionary - public key, but not the version number, it responds with the highest - version number that it does recognize, and the most favored protocol in - that dictionary.  Thus if the client requests a protocol of - dictionary version n, it has to know dictionaries versions 1 to n, and be - able to deal with all protocols in versions 1 to n, if only to the extent - that it is able to fail the protocol gracefully.

-

The one true ciphersuite

-

Why would you want multiple ciphers?

-

In case one turns out to be weak.

-

OK, suppose one turns out to be weak.  Oops, Malloc can now launch a - downgrade attack.

-

So, if supporting multiple ciphers, you need a floodfill mechanism where - you can disable the bad ciphersuite in the field.

-

Each program supporting a set of ciphersuits has a set of signatures it - recognizes as authoritative.  If another program that it talks to has - a revocation of ciphersuite, and it recognizes one of the signatures on the - revocation, the revocation floodfills.

-

So, ideally you should support multiple ciphersuites – but if you do, - have a mechanism for field revocation.

- -

These documents are - licensed under the Creative +

To Home page

+

Protocol Negotiation

+

Once a protocol is in use, it becomes very hard to change. If one person + updates the server, and the client is not updated, everything breaks.

+

And so, we are stuck with a lot of frozen protocols, many of which are + in urgent need of change, but to change, requires wide consensus, which + requires a big bunch of people showing up at a meeting, but at such + meetings very little gets done, and what gets done is stupid.

+

If a standard is successful, more and more people want to be in the + committee, many of whom represent business profit centers and government + special interests, and who really do not understand much about the + technology, except that any change might be adverse to the very important + people who sent them there.

+

As the committee gets larger, it gets more unworkable, and as it + represents more and more special interests, it gets more unworkable

+

In order to have to have a system where the internet’s protocols can be + upgraded, and new protocols introduced, without central coordination, + protocol negotiation, where client and server first discuss what protocol + version they will be using, has to be part of every protocol, all the way + down to the level of TCP and UDP.

+

These days everyone builds in protocol negotiation, often on top of SSL, which is on top of TCP, resulting in three additional round trips.

+

And then a widely distributed client or server breaks the protocol negotiation, which no one notices because it interorperates with all existing implementations, until someone tries to introduce a new protocol, whereupon the new code implementing the new protocol is blamed for its failure to interoperate with the existing clients and/or servers, and then we get another layer of protocol negotiation on top of all the existing layers of protocol negotiation.

+

TCP has built in protocol negotiation, eight bits worth, which turned + out, unsurprisingly, to be inadequate.

+

For the content of the internet to be free from central control, we need + to ensure that the address spaces and protocols are free from central + control.

+

When an old protocol is broken, clients and servers that have not + upgraded to a new improved protocol will remain forever, so the old + defective protocol has to be supported forever – without, however, + allowing an attacker a downgrade attack.

+

To prevent a downgrade attack, there has to be some way of disabling + protocols in the field, where the signed ban on certain protocols flood + fills from one program to the next.

+

Often, it is impossible to support the old clients, because protocol + negotiation was never adequately designed in, or because it was designed + in but was designed vulnerable to a downgrade attack.

+

But let us suppose the protocol negotiation was well designed:  The + committee has to assign a code.  And of course, they will only assign + this code to a protocol that they agree is right – and nothing gets done, + for there is always some vested interest that for some strange and obscure + reason does not want this protocol to exist.

+

One solution is to have quite large protocol identifiers, or arbitrarily + large variable length protocol identifiers, so that anyone can whip up a + protocol and assign it an identifier, and hack a client and server to use + it, without having to walk it past three dozen members of the committee.

+

But then, of course, we would probably wind up with a lot of protocols. +  This could potentially lead to a lot of protocol negotiation round + trips

+
+

Do you speak protocol A? No.

+

Do you speak protocol B? No.

+

Do you speak protocol C? No.

+

Do you speak protocol D? No.

+

Do you speak protocol E? Yes.

+
+

One solution to this problem is to have complete lists of protocols, call + it a protocol dictionary, which dictionary maps the long probabilistically + globally unique protocol names to short deterministically unique local + protocol names, and gives an order of preference.  If the client + names a dictionary that it supports, and/or the server names a dictionary + that it supports, then they can usually come to immediate agreement.
+

+

If, for example, the client wants to talk protocol X, it proposes one or + more dictionaries of updates to protocol X, implying that it can talk all + the updates listed in each dictionary, and an order of preference among + dictionaries

+

If the server recognizes one or more of the dictionaries, it then + responds with one of the protocols listed in the first dictionary that it + recognizes, by its short dictionary name, and the conversation proceeds.

+

An ordered list of dictionaries is identified by a public key and a short + human readable type name.  The typename is only unique with respect + to the dictionaries signed by this public key, thus ftp version 1, ftp + version 2, ftp version 4 ...

+

The globally unique identifier of a dictionary is the hash of the rule + identifying its public key, plus its typename and version number.

+

If the server recognizes the hash of the rule identifying the dictionary + public key, but not the version number, it responds with the highest + version number that it does recognize, and the most favored protocol in + that dictionary.  Thus if the client requests a protocol of + dictionary version n, it has to know dictionaries versions 1 to n, and be + able to deal with all protocols in versions 1 to n, if only to the extent + that it is able to fail the protocol gracefully.

+

The one true ciphersuite

+

Why would you want multiple ciphers?

+

In case one turns out to be weak.

+

OK, suppose one turns out to be weak.  Oops, Malloc can now launch a + downgrade attack.

+

So, if supporting multiple ciphers, you need a floodfill mechanism where + you can disable the bad ciphersuite in the field.

+

Each program supporting a set of ciphersuits has a set of signatures it + recognizes as authoritative.  If another program that it talks to has + a revocation of ciphersuite, and it recognizes one of the signatures on the + revocation, the revocation floodfills.

+

So, ideally you should support multiple ciphersuites – but if you do, + have a mechanism for field revocation.

+ +

These documents are + licensed under the Creative Commons - Attribution-Share Alike 3.0 License

+ Attribution-Share Alike 3.0 License

diff --git a/docs/protocol_specification.html b/docs/protocol_specification.html index 5e74249..8ef9b11 100644 --- a/docs/protocol_specification.html +++ b/docs/protocol_specification.html @@ -1,8 +1,8 @@ - - - - Protocol Specification + + Protocol Specification -

To Home page

-

Protocol Specification

- +

To Home page

+

Protocol Specification

+ In general, supposing your server, written in Javascript in the node.js environment, is assembling a response to an end user from services provided by other servers, is there any reasonable alternative to having them all talk JSON?

- + RPC calls usually use XDR, which is binary, or JSON, which is ascii. There are handy libraries to take care of all the boring sockets stuff for you for these cases.

Node.js tools to use RPC are available for RPC in JSON, but is there any easy way to access RPC calls in binary formats such as XDR, ASN.1 PER, or Avro Apache from node.js. Or to do something similar?

I am not asking what is the best way, or what can be done, because anything can be done with enough hard work, but rather what ways have standards to avoid reinventing the wheel, and libraries to do as much of the work as possible.

- + asked Nov 15 at 3:33

avsc implements Avro’s RPC specification, you can use it to expose "type-safe" services over any transport (e.g. HTTP, TCP, WebSockets). The quickstart guide goes through a simple example that should help you get started.

- -Your avro is in javascript, and is, I assume, expected to run under node.js Apache provides avro to run as compiled C++, Java, Python, and C#. So it looks like an Avro service communicating in binary can communicate between any two environments – also avro can serialize to memory, which should make possible operating system and compiler independent hashing of data. Looks like a standardized solution. So this would seem to imply that Avro services adequately cover anyone who wants to talk to anyone in any environment.

- - - This question turned out to be problematic and insoluble, because I want hashes defined independently of a particular computer and compiler. Which turns out to be hard. ASN.1 theoretically solves this problem, but in practice sucks horribly.

- - I wish I had a MsgPack that was not dynamic, but would guarantee predefined MsgFormats. Human generation of on the wire message formats case by case should also be considered. Let us see how cryptonote deals with this problem.

- - Looks like Avro gives me what I want: Predefined message formats.

- - To render them human readable output them as YAML, but reading YAML is problematic, because YAML could represent anything, including something hostile. So any message from outside has to be presented in Avro.

- - Cryptonote: https://github.com/cryptonotefoundation/cryptonote

- - https://cryptonotestarter.org/create-wallet.html

- - What is a protocol? Protocols wind up being defined by implementations, - which people attempt, not very successfully, to reverse engineer. By trial - and error they get their client to work with the existing server, and - their server to work with the existing client, and so an ill defined - protocol becomes over time even worse defined.

- - To address this problem, we have ASN.1, ASN.1 PER, and ASN.1 DER

- - ASN.1 is a language for describing data.

- - It is also a compiler for generating C code to process the data described. Some people complain that DER is too complex for anyone to get right.

- - The library https://github.com/vlm/asn1c supports canonical per, but does not entirely support Visual Studio.

- +Your avro is in javascript, and is, I assume, expected to run under node.js Apache provides avro to run as compiled C++, Java, Python, and C#. So it looks like an Avro service communicating in binary can communicate between any two environments – also avro can serialize to memory, which should make possible operating system and compiler independent hashing of data. Looks like a standardized solution. So this would seem to imply that Avro services adequately cover anyone who wants to talk to anyone in any environment.

+ + + This question turned out to be problematic and insoluble, because I want hashes defined independently of a particular computer and compiler. Which turns out to be hard. ASN.1 theoretically solves this problem, but in practice sucks horribly.

+ + I wish I had a MsgPack that was not dynamic, but would guarantee predefined MsgFormats. Human generation of on the wire message formats case by case should also be considered. Let us see how cryptonote deals with this problem.

+ + Looks like Avro gives me what I want: Predefined message formats.

+ + To render them human readable output them as YAML, but reading YAML is problematic, because YAML could represent anything, including something hostile. So any message from outside has to be presented in Avro.

+ + Cryptonote: https://github.com/cryptonotefoundation/cryptonote

+ + https://cryptonotestarter.org/create-wallet.html

+ + What is a protocol? Protocols wind up being defined by implementations, + which people attempt, not very successfully, to reverse engineer. By trial + and error they get their client to work with the existing server, and + their server to work with the existing client, and so an ill defined + protocol becomes over time even worse defined.

+ + To address this problem, we have ASN.1, ASN.1 PER, and ASN.1 DER

+ + ASN.1 is a language for describing data.

+ + + It is also a compiler for generating C code to process the data described. Some people complain that DER is too complex for anyone to get right.

+ + The library https://github.com/vlm/asn1c supports canonical per, but does not entirely support Visual Studio.

+ On the other hand Avro apache seems to be a more complete solution, addressing the problem of protocol negotiation, RPC calls, and map reduce calls. I don’t think the ASN.1 crowd have even thought of map reduce.

- + And there is the oldie but goodie, XDR, which is just the simplest possible way of avoiding compiler and endian dependancy. There is a nice XDR RPC library. ONC RPC is standardized by the Internet Engineering Task Force (IETF) as RFC 1831. It is based on the External Data Representation standard (XDR), known as RFC 4506 (see References). But, on the other hand, everyone using node.js seems to be doing RPC ins JSON.

- + Maybe this whole canonicalization question is just too hard, and need ad hoc solutions. Surely crypto libraries have serialization formats? Let me see what cryptonote does. No point in reinventing the wheel.

- + A type that is becoming increasingly common is unordered name value mapping, where a lot of names have defaults, and people keep adding new names.

Now if you send the names with the message every single time, it is a huge overhead. Which is what you wind up with with JSON based rpc calls.

- + So you want compiled message types, which wind up as a C++ object – and when someone wants more fields, he has a derived type of the C++ object, with the new fields having default values, allowing you to cast the object to have additional names and derived types as needed.

- - + + MsgPack is binary, and has modules for every language and environment you have ever heard of, and lots of languages you have never heard of, and library code to do anything you want, but it is all dynamically typed, which means it is not as efficient as PER.

It is basically YAML in binary, in that MsgPack messages correspond closely to YAML documents. Because it supports every language, you can use MsgPack to talk C++ to node.js, and YAML to talk to humans.

@@ -80,66 +80,66 @@ Your avro is in javascript, and is, I assume, expected to run under node.js Apac Dynamic typing means that a hostile evil program could send no end of messages in MsgPack that your program is not equipped to deal with. The great thing about PER is that anything that you are not expecting just gets magically rejected.

Both of them, Per and MsgPack totally punt on the issue of protocol negotiation, whereas Avro apache has support for protocol negotiation. It combines static and dynamic typing, but dynamic requires both sides to play nice. Evil program with surprise data structures will just have the connection shut down on it.

- + ASN.1 Per punts by requiring both sides to be in total agreement about the ASN.1 schema at compile time, MsgPack punts in the opposite way by being able to send any schema, including hostile schemas that are totally suprising, unexpected, and impossible for the recipient to deal with.

- + Maybe the way to go would be to agree on a dictionary mapping numbers to ASN.1 schemas at connection establishment, and if agreement, send schema number and binary blob in a MsgPack message, if no agreement, send dynamic message with a schema GUI, and the end user has to deal with it as best he can. If receiving a message with a schema guid, then precompiled code to generate the corresponding C++ object from the MsgPack message, and to generate a MsgPack message from the C++ object. On reception, execute the generic object->process_on_receive(&connection) job on the received object. Which typically will look up the table for the object to which this is a response. Everything in the table is a pointer to a common base type, but, on getting the object, executes a derived operation. - + For an expected message, which is anticipated to be a response to a previous message, the response should contain an opaque callback which was sent with the previous message, which is an index into a table of local objects whose base type can run time check that the message is of the type that they expected. (All schemas corresponding to data that can be received, or loaded from files, derive from a base type that reports their schema, so any time you deal with a message, it is mapped into a C++ object that will only be dealt with by code that at compile time expects that object.) - + Thus every transmissable object has Yaml serialization, MsgPack serialization, Asn.1 Per serialization, Yaml serialization, Yaml serialization inside MsgPack, and Asn.1 Per serialization inside MsgPack. If MsgPack or Asn.1 throws on receiving a message, terminate the connection. If it throws on sending a message, it is a bug. But I don’t see that Avro Apache can talk to node.js, in part because it wisely refuses to be fully dynamic.

- + There is a review of more serializers than you can shake a stick at https://github.com/thekvs/cpp-serializers - + If you attempt to hand generate code for processing packets described by - ASN.1, you will probably get it wrong and your head will explode.  - Hence ASN.1 is much cursed and condemned. 

- - Don’t do that.  Don’t hand write code to generate or interpret ASN.1 - data packets.  You are unlikely to succeed, and your code will have - mystery bugs.

- -

ASN.1 PER is ASN.1 data description compiled to produce efficiently - compressed data packets that conform to a description in ASN.1, and - efficiently decompresses them.

- -

ASN.1 DER  that data description that generates data packets with a - description of what the data packet means, so that if two programs sign - the same ASN.1 DER data, they agree not only on the data, but on the - meaning of that data, and if one program means the same thing as the other - program, the signatures will come out the same.

-

Use it.  ASN.1, used right, is what is needed to rigorously define a - protocol so that a client written by one person will work with a server - written by another.

-

There is much loud cursing about the fact that the data on the wire is - humanly incomprehensible, and that the code that converts it into program - data structures is humanly incomprehensible.  No one should be - looking at machine generated code, because machine generated code is - notoriously incomprehensible.  The question then is, does the - compiler work, and is the compiler usable.

+ ASN.1, you will probably get it wrong and your head will explode.  + Hence ASN.1 is much cursed and condemned. 

+ + Don’t do that.  Don’t hand write code to generate or interpret ASN.1 + data packets.  You are unlikely to succeed, and your code will have + mystery bugs.

+ +

ASN.1 PER is ASN.1 data description compiled to produce efficiently + compressed data packets that conform to a description in ASN.1, and + efficiently decompresses them.

+ +

ASN.1 DER  that data description that generates data packets with a + description of what the data packet means, so that if two programs sign + the same ASN.1 DER data, they agree not only on the data, but on the + meaning of that data, and if one program means the same thing as the other + program, the signatures will come out the same.

+

Use it.  ASN.1, used right, is what is needed to rigorously define a + protocol so that a client written by one person will work with a server + written by another.

+

There is much loud cursing about the fact that the data on the wire is + humanly incomprehensible, and that the code that converts it into program + data structures is humanly incomprehensible.  No one should be + looking at machine generated code, because machine generated code is + notoriously incomprehensible.  The question then is, does the + compiler work, and is the compiler usable.

There is an internet tool for compiling asn.1 specifications into C code.

- + If a program reads DER or BER data, the result is apt to be disastrous.  BER and DER can express an arbitrary data structure – and thus can crash the program receiving the data, probably causing it to execute transmitted data as code.

-

You can’t depend on a DER or BER bit string being able to map back into any well-defined ASN.1 objectthat the program was designed to deal with.  

-

Incoming data should be parsed as the expected and bounded size data - structure, thus we need something that can generate parsing code from a - description of the data at compile time.  We need compile time - descriptions of the data, not run time descriptions, because the program - that uses the incoming data will unavoidably rely on compile time - description of the data. -
-
- PER, however cannot receive unexpected data structures, because the - expected data structure is specified at compile time, not run time.  - Malicious or faulty data will generate an error, not a crash.
-
- Thus all data should be received as PER or by a format with the properties - of PER. 

-

These documents are - licensed under the Creative +

You can’t depend on a DER or BER bit string being able to map back into any well-defined ASN.1 objectthat the program was designed to deal with.  

+

Incoming data should be parsed as the expected and bounded size data + structure, thus we need something that can generate parsing code from a + description of the data at compile time.  We need compile time + descriptions of the data, not run time descriptions, because the program + that uses the incoming data will unavoidably rely on compile time + description of the data. +
+
+ PER, however cannot receive unexpected data structures, because the + expected data structure is specified at compile time, not run time.  + Malicious or faulty data will generate an error, not a crash.
+
+ Thus all data should be received as PER or by a format with the properties + of PER. 

+

These documents are + licensed under the Creative Commons - Attribution-Share Alike 3.0 License

+ Attribution-Share Alike 3.0 License

diff --git a/docs/replacing_TCP.md b/docs/replacing_TCP.md index 2232fd7..9a190b6 100644 --- a/docs/replacing_TCP.md +++ b/docs/replacing_TCP.md @@ -121,7 +121,7 @@ that message. In the api, the application and api know the message type, because otherwise the api just would not work. But on the rare occasions when the -message is represented globally, outside the api, *then* it needs a message type header. +message is represented globally, outside the api, *then* it needs a message type header. # TCP is broken @@ -357,7 +357,7 @@ The the TCP replacement handshake needs to be a four phase handshake. 1. Server checks the keyed hash to ensure that this is a real client reply to a real and recent server reply. Then it checks the proof of - work. + work. If the proof of work passes, Server allocates memory diff --git a/docs/ripple.html b/docs/ripple.html index 8f29787..0a8aef0 100644 --- a/docs/ripple.html +++ b/docs/ripple.html @@ -190,6 +190,6 @@ the anonymity that comes from the faceless crowd of a power law network. 

These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

+Commons Attribution-Share Alike 3.0 License

\ No newline at end of file diff --git a/docs/rpc_to_theblockchain.html b/docs/rpc_to_theblockchain.html index 689aaa9..42bcec0 100644 --- a/docs/rpc_to_theblockchain.html +++ b/docs/rpc_to_theblockchain.html @@ -1,16 +1,16 @@ - - - - RPC to the blockchain + + RPC to the blockchain

To Home page

RPC to the blockchain

diff --git a/docs/safe_operating_system.html b/docs/safe_operating_system.html index 75e7188..46d6d64 100644 --- a/docs/safe_operating_system.html +++ b/docs/safe_operating_system.html @@ -11,7 +11,7 @@ p.center {text-align:center;} } - + Safe Operating System @@ -32,16 +32,16 @@ system that is largely immune to viruses, Trojans and spyware.  “Capdesk” was a demo of the design principles for a secure desktop operating system.  It has led to similar, though more realistic versions -retrofitted to windows and Linux, and +retrofitted to windows and Linux, and sandboxes based on the same concept.

    -
  • Resources, such as files and directories, should be -owned by packages, or package*user, not merely users, -so that one package cannot interfere with another package, -so that packages cannot run with the full authority -of the user, and so that a package cannot be furtively installed +
  • Resources, such as files and directories, should be +owned by packages, or package*user, not merely users, +so that one package cannot interfere with another package, +so that packages cannot run with the full authority +of the user, and so that a package cannot be furtively installed (for to be installed, has to be allocated resources, such as a directory for its executable files to live in)
  • @@ -352,6 +352,6 @@ particular processes, and for any particular installed package. 

    These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

    +Commons Attribution-Share Alike 3.0 License

    \ No newline at end of file diff --git a/docs/safe_operating_system_config_data.html b/docs/safe_operating_system_config_data.html index 7819281..c7fadcc 100644 --- a/docs/safe_operating_system_config_data.html +++ b/docs/safe_operating_system_config_data.html @@ -21,7 +21,7 @@ bottom: 0pt; } - + Configuration Data in a Safe Operating System @@ -95,6 +95,5 @@ message. 

    These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

    +Commons Attribution-Share Alike 3.0 License

    - diff --git a/docs/scalable_reputation_management.html b/docs/scalable_reputation_management.html index f308249..33c2fd2 100644 --- a/docs/scalable_reputation_management.html +++ b/docs/scalable_reputation_management.html @@ -54,12 +54,11 @@ Known link farms get colors from the bad palette.

    So, the main network of legitimate actors will tend to get all the same color mix, because every legitimate customer buys from lots of legitimate sellers, and every legitimate seller sells to lots of legitimate buyers.

    -Networks of fakes will get their own distinct color, because the reputation circulates inside that network. The big giveaway will not so much be bad colors versus good colors, but the failure of colors to homogenize. All the good actors will tend to develop rather similar colors, each link farm will have its own distinct color. Every transaction inside your own little group will tend to result in more of your group color, and less of the general mix.

    +Networks of fakes will get their own distinct color, because the reputation circulates inside that network. The big giveaway will not so much be bad colors versus good colors, but the failure of colors to homogenize. All the good actors will tend to develop rather similar colors, each link farm will have its own distinct color. Every transaction inside your own little group will tend to result in more of your group color, and less of the general mix.

    With forty colors, we have a trillion different composite colors, so we randomly assign each seller entity that collects reviews an initial pool of distinct color, and they get additional color from feedback on each transaction of the entity transacted with. If feedback from a wallet never seen before, it has no color, so they get more of their own color, and it gets a pool of the color of the entity they gave feedback to proportional to the amount paid. Every completely unknown seller entity gets one hundred units of various randomly chosen colors. External reputational indications result in additions of color reflecting that external information.which will get mixed in with throughout the network of real actors and real feedback.

    These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

    +Commons Attribution-Share Alike 3.0 License

    - diff --git a/docs/scale_clients_trust.md b/docs/scale_clients_trust.md index bba1eb7..ac50f28 100644 --- a/docs/scale_clients_trust.md +++ b/docs/scale_clients_trust.md @@ -196,7 +196,7 @@ Both problems are being actively worked on. Both problems need a good deal more work, last time I checked. For end user trust in client wallets relying on zk-snark verification to be valid, at least some of the end users of client wallets will need to themselves generate the verifiers from -the script. +the script. For trust based on zk-snarks to be valid, a very large number of people must themselves have the source code to a large program that was diff --git a/docs/seed_phrases.html b/docs/seed_phrases.html index c83c373..a8fb74b 100644 --- a/docs/seed_phrases.html +++ b/docs/seed_phrases.html @@ -1,8 +1,8 @@ - - - - Name System + + Name System -

    To Home page

    +

    To Home page

    Seed phrase wallets

    - +

    Bitcoin has had big problems with wallet security, and eventually converged on the seed phrase system. A seed phrase generates a sequence of key pairs.

    - +

    This is implemented as the BIP-039 standard.

    - +

    On the other hand, Warpwallet indicates that with password strengthening, forty eight bits of passphrase security suffices, which if using the BIP-039 system is five words.

    - +

    For durable storage, write the words on art low acid paper in pencil, and spray with art fixative to prevent the pencil from smudging.

    - +

    We want to be able to create a receive only wallet, that can sign on with a name controlled by its master wallet, and can receive money that only its master wallet can spend.

    - +

    In order for it to receive money, it has to be able to generate an indefinitely large number of public keys, that it cannot generate private keys for. It generates a pseudo random sequence, integer hashed with a 128 bit value, and multiplies the public key of the master by that pseudo random number. To spend the money, the master multiplies the private key by that pseudo random number.

    - +

    Example code for maintaining a tree of deterministically generated keys, which is not exactly what we want, but which is similar.

    - -

    One evident defect of this system is that leaking a single private key corresponding to the public keys generated by the receive only wallet, plus the information that enables the receive only wallet to generate an unlimited number of receive keys, leaks them all. It might be safer just to give the receive only wallet a great big bundle or receive keys. - + +

    One evident defect of this system is that leaking a single private key corresponding to the public keys generated by the receive only wallet, plus the information that enables the receive only wallet to generate an unlimited number of receive keys, leaks them all. It might be safer just to give the receive only wallet a great big bundle or receive keys. +

    A key that owns a name, can sign a statement allowing another key to use that name for some defined time, so the always logged on wallet can operate. If the always logged on wallet gets stolen, it will receive payments for some other key sequence,

    - +

    so, given a strong secret, we generate two wallets – one of which can receive money, can chat, can assert it rightly has a certain zooko or ro identity, and one of which can spend that money and assert the same identity. Chat includes making conversations and files available, either generally, or two identities that have a key . This implements sale of books by the receive only wallet.

    - +

    Everyone is converging to BIP0032 BIP0039 wallets

    - +

    But electrum has some powerful and convincing objections to BIP0039 wallets

    You want the wallet to depend only on the secret list of words, not on the wordlist, because the wordlist is likely to change. But you don’t want to let the user construct his own secret capriciously, because he will fuck up, so you need a checksum so that his own custom secret will not work.

    So here is my solution: You hash his word list through secret strengthening, but the strengthened secret has to have some zeroes in the right places. Our code for generating the word list generates a hundred or so wordlist till it finds one that works. If the user tries his own master passphrase, probably will not work.

    - +

    We need to have an explicit standard for generating the wallet from the passphrase, because with bitcoin a seed phrase only works with the same wallet software that created it. If storing for a long period of time, the seed phrase will stop working.

    - +

    Therefore, need a standard test vector: A wallet must generate this (empty) test wallet with this phrase, which test wallet is authorized to use the name "anon 1". We need to make the construction of a wallet from a test phrase part of the standard, so that future wallet software will give you access to the same account for the same passphrase as past wallet software.

    - +

    It has to be a standard for wallet software that for a given pass phrase that is valid for the standard wallet, any new wallet software shall give you access to the same accounts, and a test vector for this has to be part of the system from the beginning, giving a sequence of wallets authorized to use the names anonymous_1 anonymous_2, and anonymous_3

    - +

    coinb.in is the client wallet for bitcoin. Before I roll my own, I need to understand what they are doing and why they are doing it.

    - - + +

    This document is licensed under the CreativeCommons Attribution-Share Alike 3.0 License

    diff --git a/docs/set_up_build_environments.md b/docs/set_up_build_environments.md index 31ff95e..593289a 100644 --- a/docs/set_up_build_environments.md +++ b/docs/set_up_build_environments.md @@ -151,7 +151,7 @@ ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key Note that visual studio remote compile requires an `ecdsa-sha2-nistp256` key on the host machine that it is remote compiling for. If it is nist, it is backdoored -If the host has a domain name, the default in `/etc/bash.bashrc` will not display it in full at the prompt, which can lead to you being confused about which host on the internet you are commanding. +If the host has a domain name, the default in `/etc/bash.bashrc` will not display it in full at the prompt, which can lead to you being confused about which host on the internet you are commanding. ```bash nano /etc/bash.bashrc @@ -184,7 +184,7 @@ inadequate swap file, so that they will fail gracefully under overload, rather than locking up, needing to be powered down, and then needing to be recreated from scratch because of data corruption. -This looks to me like a kernel defect. The kernel should detect when it is +This looks to me like a kernel defect. The kernel should detect when it is thrashing the swap file, and respond by sleeping entire processes for lengthy and growing periods, and logging these abnormally long sleeps on wake. Swapping should never escalate to lockup, and if it does, bad @@ -463,7 +463,7 @@ Now that putty can do a non interactive login, you can use `plink` to have a script in a client window execute a program on the server, and echo the output to the client, and psftp to transfer files, though `scp` in the Git Bash window is better, and `rsync` (Unix to Unix only, requires `rsync` running on -both computers) is the best. `scp` and `rsync`, like `git`, get their keys from +both computers) is the best. `scp` and `rsync`, like `git`, get their keys from `~/.ssh/config` On windows, FileZilla uses putty private keys to do scp. This is a much @@ -743,7 +743,7 @@ and configuration ```bash apt-get -qy install certbot python-certbot-apache -certbot register --register-unsafely-without-email --agree-tos +certbot register --register-unsafely-without-email --agree-tos certbot --apache ``` @@ -784,7 +784,7 @@ Thus, after certbot has worked its magic, your conf file looks like ## Lemp stack on Debian ```bash -apt-get -qy update && apt-get -qy install nginx mariadb-server php php-cli php-xml php-mbstring php-mysql php7.3-fpm +apt-get -qy update && apt-get -qy install nginx mariadb-server php php-cli php-xml php-mbstring php-mysql php7.3-fpm nginx -t ufw status verbose ``` @@ -890,7 +890,7 @@ php fpm service for the fpm service. nginx -t # find the name of your php fpm service systemctl status php* | grep fpm.service -# substitute the actual php fpm service for +# substitute the actual php fpm service for # php7.3-fpm.sock in the configuration file. systemctl stop nginx rm -v /etc/nginx/sites-enabled/* @@ -978,21 +978,21 @@ If that works, then create the file `/var/www/reaction.la/index.php` containing: ```php TODO
      "; foreach($db->query("SELECT content FROM $table") as $row) { - echo "
    1. " . $row['content'] . "
    2. "; + echo "
    3. " . $row['content'] . "
    4. "; } - echo "
    "; + echo ""; } catch (PDOException $e) { print "Error!: " . $e->getMessage() . "
    "; - die(); + die(); } ?> ``` @@ -1065,7 +1065,7 @@ great. # certbots many mysterious, confusing, and frequently # changing behaviors expect a working environment. apt-get -qy install certbot python-certbot-nginx -certbot register --register-unsafely-without-email --agree-tos +certbot register --register-unsafely-without-email --agree-tos certbot --nginx # This also, by default, sets up automatic renewal, # and reconfigures everything to redirect to https @@ -1083,7 +1083,7 @@ map to the old server, until the new server works.) ```bash apt-get -qy install certbot python-certbot-nginx -certbot register --register-unsafely-without-email --agree-tos +certbot register --register-unsafely-without-email --agree-tos certbot run -a manual --preferred-challenges dns -i nginx -d reaction.la -d blog.reaction.la nginx -t ``` @@ -1101,7 +1101,7 @@ But if you are doing this, not on your test server, but on your live server, the If instead you already have a certificate, because you copied over your `/etc/letsencrypt` directory ```bash -apt-get -qy install certbot python-certbot-nginx +apt-get -qy install certbot python-certbot-nginx certbot install -i nginx nginx -t ``` @@ -1125,7 +1125,7 @@ automation, which mean you have to have given it the information\ To backup and restore letsencrypt, to move your certificates from one server to another, `rsync -HAvaX reaction.la:/etc/letsencrypt /etc`, as root on the computer which will receive the backup. The letsencrypt directory -gets mangled by `tar`, `scp` and `sftp`. +gets mangled by `tar`, `scp` and `sftp`. Again, browse to your server. You should get redirected to https, and https should work. @@ -1246,7 +1246,7 @@ Now you should delete the example user and the example database: ```sql mariadb -REVOKE ALL PRIVILEGES, GRANT OPTION FROM +REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'example_user'@'localhost'; DROP USER 'example_user'@'localhost'; DROP DATABASE example_database; @@ -1784,7 +1784,7 @@ Set `mydestination` to all dns names that map to your server (it probably alrea ```bash postconf -e mailbox_size_limit=268435456 postconf -e message_size_limit=67108864 -postconf +postconf postconf myhostname postconf mydestination postconf smtpd_banner @@ -2077,7 +2077,7 @@ dan@blog.reaction.la dan # eventually automatically deleted. # # The addresses without username catch all emails that do not -# have an entry. +# have an entry. # You don't want an error message response for invalid email # addresses, as this may reveal too much to your enemies. ``` @@ -2800,7 +2800,7 @@ when your subkey expires. ```bash save gpg --list-keys --with-subkey-fingerprints --with-keygrip «master key» -gpg -a --export-keys «master key» +gpg -a --export-keys «master key» gpg -a --export-secret-keys «master key» ``` diff --git a/docs/social_networking.md b/docs/social_networking.md index 5d37555..20f21cb 100644 --- a/docs/social_networking.md +++ b/docs/social_networking.md @@ -590,7 +590,7 @@ them, and receive money from them. If the wallet integrates an identity and messaging system, then making payments and receiving payments over the wallet can be made easier than -with any existing system. +with any existing system. We have to put the medium for communication about money, for communicating metadata about transactions, inside the wallet, as in the old @@ -637,7 +637,7 @@ justice. Debian broke Gnome3 and cannot fix it because of social justice. Business needs a currency and [book] keeping system that enables them to operate a business instead of a social justice crusade. -A blockchain is just a public ledger with an immense number of columns. +A blockchain is just a public ledger with an immense number of columns. Triple entry [book] keeping with immutable journal entries is a narrowly shared ledger with a considerably smaller number of columns. Every business needs its books on its own blockchain, to escape government @@ -856,7 +856,7 @@ This does not occupy mainchain space, because a single two fifty six bit hash on the mainchain can represent to the total state and total order of many very large sidechains, with the very large preimage of the hash being known to peers on the sidechain, but not to peers on the mainchain unless -they are also peers on the sidechain. +they are also peers on the sidechain. A two fifty six bit hash gives unlimited compression, which is lossy in the sense that it is one way compression, but lossless in that if you know the diff --git a/docs/spam_blogging_logon_email_money.html b/docs/spam_blogging_logon_email_money.html index 7ba7596..f4c3b77 100644 --- a/docs/spam_blogging_logon_email_money.html +++ b/docs/spam_blogging_logon_email_money.html @@ -12,7 +12,7 @@ text-align:center; } - + How to Save the World @@ -31,6 +31,6 @@ test

    These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

    +Commons Attribution-Share Alike 3.0 License

    diff --git a/docs/spam_filtering.html b/docs/spam_filtering.html index c25054a..93197a5 100644 --- a/docs/spam_filtering.html +++ b/docs/spam_filtering.html @@ -9,7 +9,7 @@ } p.center {text-align:center;} - + Spam filtering diff --git a/docs/squaring_zookos_triangle.html b/docs/squaring_zookos_triangle.html index 0fd300b..d69eafb 100644 --- a/docs/squaring_zookos_triangle.html +++ b/docs/squaring_zookos_triangle.html @@ -1,112 +1,112 @@ - - - - Squaring Zooko’s triangle + + Squaring Zooko’s triangle -

    To Home page

    -

    Squaring Zooko’s triangle

    - +

    To Home page

    +

    Squaring Zooko’s triangle

    +

    Need a system for handing one’s keys around that protects end users from the horrifying sight of actual keys or actual strong hashes of keys.

    But at the same time the system has to not say, "I can’t deliver your message to that person because an invisible gnotzaframmit that I won’t describe to you seems to be unavailable to me in the flabogrommit."

    - - - -

    It seems like the clever bit of CT is the insight that some actions, like - a CA signing a cert, are intended to be public, and so should be forced - (via clever crypto) to take place in public. This makes me wonder what - other crypto actions should also take place in public, in a way that - doesn’t permit hiding them from the world. 

    -

    Revocation 

    -

    Software releases 

    -

    Mapping of email address to public key 

    -

    Delegation of DNSSEC keys 

    -

     

    -

    Of course, globally visible events need to take place at a globally - visible time. The most widely available time is GPS time (which is 19 - seconds off the commonly used time), and which is available from the - seldom connected pps line.

    -

    At present, unfortunately, anyone who wants gps time has to do his own - soldering and hack his own software. There is a pre soldered device - available, but it is hard to get. 

    -

     

    -

     

    -

    - Imagine skype as originally designed, (central authority maps public and - private keys to user names) plus a key continuity feature, plus the seldom - used option of doing a zero knowledge shared passphrase to detect man in - the middle. 

    -

    - The possibility that the zero knowledge check could be used would deter - powerful adversaries, even if seldom used in practice. The more powerful, - the greater the deterrent effect. 

    -

    - It is not totally end to end, central authority can listen in, but the - check would limit the amount of listening. 

    -

    - It can be made completely end to end for strong passwords. Assume login is - by zero knowledge password protocol, which means that the central - authority does not know the end user’s password, for strong - passwords. 

    -

    - The secret key is generated from the strong secret supplied by central - authority, plus the password. 

    -

    - When you change your password, you generate a certificate mapping your new - public key to your old public key, which certificate makes other people’s - key continuity check happy. 

    -

    - If key continuity fails, people get a warning, but they don’t have to - click it away, for that just trains people to click it away. They can just - continue right on and not pay attention to it. 

    -

    - Or they could use the zero knowledge shared passphrase procedure to detect - man in the middle. 

    -

    - So, if non paranoid, and using easy passwords, works like skype used to - work. No interception except by central authority, and central authority - cannot intercept everyone, or even large numbers of people. 

    -

    - If paranoid and using strong passwords, provides OTR like end to end - capability. 

    -


    -

    -


    -

    -

    Key management is an unsolved problem.  In my biased opinion the - best
    - solution was my Crypto Kong, which received limited takeup.
    -
    - So, in conclusion, don’t make people manage keys, though that should be an - option for the seriously paranoid.
    -
    - Instead, autogenerate the keys with zero knowledge passphrase logon.
    -
    - If he uses a password weak enough to fall to an offline dictionary attack, - this is equivalent to the old skype system, where central authority - manages his keys and he has password logon.  If he uses a stronger - password, equivalent to a salted strong passphrase system.

    -

     

    -

     

    -

     

    -

     

    -

     

    -

     

    -

    These documents are - licensed under the Creative + + + +

    It seems like the clever bit of CT is the insight that some actions, like + a CA signing a cert, are intended to be public, and so should be forced + (via clever crypto) to take place in public. This makes me wonder what + other crypto actions should also take place in public, in a way that + doesn’t permit hiding them from the world. 

    +

    Revocation 

    +

    Software releases 

    +

    Mapping of email address to public key 

    +

    Delegation of DNSSEC keys 

    +

     

    +

    Of course, globally visible events need to take place at a globally + visible time. The most widely available time is GPS time (which is 19 + seconds off the commonly used time), and which is available from the + seldom connected pps line.

    +

    At present, unfortunately, anyone who wants gps time has to do his own + soldering and hack his own software. There is a pre soldered device + available, but it is hard to get. 

    +

     

    +

     

    +

    + Imagine skype as originally designed, (central authority maps public and + private keys to user names) plus a key continuity feature, plus the seldom + used option of doing a zero knowledge shared passphrase to detect man in + the middle. 

    +

    + The possibility that the zero knowledge check could be used would deter + powerful adversaries, even if seldom used in practice. The more powerful, + the greater the deterrent effect. 

    +

    + It is not totally end to end, central authority can listen in, but the + check would limit the amount of listening. 

    +

    + It can be made completely end to end for strong passwords. Assume login is + by zero knowledge password protocol, which means that the central + authority does not know the end user’s password, for strong + passwords. 

    +

    + The secret key is generated from the strong secret supplied by central + authority, plus the password. 

    +

    + When you change your password, you generate a certificate mapping your new + public key to your old public key, which certificate makes other people’s + key continuity check happy. 

    +

    + If key continuity fails, people get a warning, but they don’t have to + click it away, for that just trains people to click it away. They can just + continue right on and not pay attention to it. 

    +

    + Or they could use the zero knowledge shared passphrase procedure to detect + man in the middle. 

    +

    + So, if non paranoid, and using easy passwords, works like skype used to + work. No interception except by central authority, and central authority + cannot intercept everyone, or even large numbers of people. 

    +

    + If paranoid and using strong passwords, provides OTR like end to end + capability. 

    +


    +

    +


    +

    +

    Key management is an unsolved problem.  In my biased opinion the + best
    + solution was my Crypto Kong, which received limited takeup.
    +
    + So, in conclusion, don’t make people manage keys, though that should be an + option for the seriously paranoid.
    +
    + Instead, autogenerate the keys with zero knowledge passphrase logon.
    +
    + If he uses a password weak enough to fall to an offline dictionary attack, + this is equivalent to the old skype system, where central authority + manages his keys and he has password logon.  If he uses a stronger + password, equivalent to a salted strong passphrase system.

    +

     

    +

     

    +

     

    +

     

    +

     

    +

     

    +

    These documents are + licensed under the Creative Commons - Attribution-Share Alike 3.0 License

    + Attribution-Share Alike 3.0 License

    diff --git a/docs/the_internet_money_solution.html b/docs/the_internet_money_solution.html index ce71018..ec36a04 100644 --- a/docs/the_internet_money_solution.html +++ b/docs/the_internet_money_solution.html @@ -180,5 +180,5 @@ owed, and others less well placed.

    font-size:80%">These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

    +Commons Attribution-Share Alike 3.0 License

    \ No newline at end of file diff --git a/docs/the_login_problem.html b/docs/the_login_problem.html index ecbcc58..8bab529 100644 --- a/docs/the_login_problem.html +++ b/docs/the_login_problem.html @@ -159,5 +159,5 @@ mindlessly do a one click add.

    These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

    +Commons Attribution-Share Alike 3.0 License

    \ No newline at end of file diff --git a/docs/tim_may_on_bitcoin.html b/docs/tim_may_on_bitcoin.html index fd9f046..d8fffa4 100644 --- a/docs/tim_may_on_bitcoin.html +++ b/docs/tim_may_on_bitcoin.html @@ -138,7 +138,7 @@
  • Be interested in liberty and the freedom to transact and speak to get back to the original motivations. Don’t spend time trying to make government-friendly financial alternatives.
  • Remember, there are a lot tyrants out there.
- +

These documents are licensed under the Creative Commons Attribution-Share Alike 3.0 License

diff --git a/docs/triple_entry_accounting-by_Iang.mhtml b/docs/triple_entry_accounting-by_Iang.mhtml index 1be6d8c..f662eb0 100644 --- a/docs/triple_entry_accounting-by_Iang.mhtml +++ b/docs/triple_entry_accounting-by_Iang.mhtml @@ -253,7 +253,7 @@ by the Venetian Friar Luca Pacioli - [[LP]. In his treatise, Pacioli documented many standard techniques, including a chapter on accounting. @@ -284,7 +284,7 @@ was never capable of being fielded. The replacement double entry system was fielded in early 1996 and has never lost a transaction (although there have been some close shaves - [[IG1]).

@@ -417,7 +417,7 @@ effective form of signature, and public key cryptosystems provide another form where signers hold a private key and verifiers hold a public key - [[MB]. There are also many ways to attack the @@ -437,14 +437,14 @@ At first it was suggested that a variant known as the blinded signature would enable digital cash - [[DC]. Then, certificates would circulate as rights or contracts, in much the same way as the share certificates of old and thus replace centralised accounting systems - [[RAH]. These ideas took financial cryptography part of @@ -469,31 +469,31 @@ eipt">The Initial Role of a Receipt
- - - - - - - - - - - - - - - - - -
FromAlice
ToBob
UnitEuro
Quantity100
Date2005.12.25
+ + + + + + + + + + + + + + + + + +
FromAlice
ToBob
UnitEuro
Quantity100
Date2005.12.25
- - - - -
digital signature
+ + + + +
digital signature
@@ -508,7 +508,7 @@ the Internet, the capabilities of cryptography and the needs of governance led to the development of the signed receipt - [[GH]. In order to develop this concept, let us assume a simple three party payment system, @@ -571,66 +571,66 @@ of risks that we decided to address.

2: A Signed Receipt

- - - - - - - - - - - - - - - - - - - - -
User's Cheque - - - -
- - - - - - - - - - - - - - - - - - -
-
FromAlice
ToBob
UnitEuro
Qty100
ComPens
-
- - - - -
Alice's sig
-
-
FromAlice
ToBob
UnitEuro
Quantity100
Date2005.04.10
+ + + + + + + + + + + + + + + + + + + + +
User's Cheque + + + +
+ + + + + + + + + + + + + + + + + + +
+
FromAlice
ToBob
UnitEuro
Qty100
ComPens
+
+ + + + +
Alice's sig
+
+
FromAlice
ToBob
UnitEuro
Quantity100
Date2005.04.10
- - - - -
Ivan's signature
+ + + + +
Ivan's signature
@@ -780,7 +780,7 @@ directs that we store the primary records, in this case the set of receipts, and we construct derivative records, the accounting books, on the fly - [[4NF].

@@ -982,21 +982,21 @@ Todd Boyle looked at a similar problem from the point of view of small business needs in an Internet age, and reached the same conclusion - triple entry accounting - [[1]. His starting premises were that:

  1. - The major need is not accounting or payments, per se, - but patterns of exchange - complex patterns of trade; + The major need is not accounting or payments, per se, + but patterns of exchange - complex patterns of trade;

  2. - Small businesses could not afford large complex - systems that understood these patterns; + Small businesses could not afford large complex + systems that understood these patterns;

  3. - They would not lock themselves into proprietary - frameworks; + They would not lock themselves into proprietary + frameworks;

@@ -1137,9 +1137,9 @@ that it imposes well recognised.

Below are the list of requirements that we believed to be important - [[2] - [[3].

@@ -1310,7 +1310,7 @@ would have shown a clear audit trail of transactions and thus late timing and otherwise perverted or dropped transactions would have been clearly identified or eliminated completely - [[NG]. The emerging scandal in the USA known as Stockgate would have been impossible @@ -1435,30 +1435,30 @@ A Relational Model of Data for Large Shared Data Banks

[1] - Todd Boyle, - " - GLT and GLR: conceptual architecture for general ledgers," - Ledgerism.net, 1997-2005. + Todd Boyle, + " + GLT and GLR: conceptual architecture for general ledgers," + Ledgerism.net, 1997-2005.

[2] - Todd Boyle, - " - STR software specification," - Goals, 1-5. - This section adopts that numbering convention. + Todd Boyle, + " + STR software specification," + Goals, 1-5. + This section adopts that numbering convention.

[3] - Ian Grigg, - various design and requirements documents, - Systemics, unpublished. + Ian Grigg, + various design and requirements documents, + Systemics, unpublished.

diff --git a/docs/triple_entry_accounting.md b/docs/triple_entry_accounting.md index 0e7bccb..54dc263 100644 --- a/docs/triple_entry_accounting.md +++ b/docs/triple_entry_accounting.md @@ -1,6 +1,6 @@ --- title: >- - Triple Entry Accounting + Triple Entry Accounting --- See [Sox accounting], for why we need to replace Sox accounting with triple entry accounting. @@ -28,7 +28,7 @@ forms of cheating, and this design is profoundly difficult, complex, and notoriously subtle and difficult to correctly implement. The way of the future will be to move bookkeeping, accounting, and -various other measures against cheating to the blockchain. +various other measures against cheating to the blockchain. The fundamental force moving us to a blockchain based world is an untrusted and untrustworthy elite. diff --git a/docs/true_names_and_TCP.html b/docs/true_names_and_TCP.html index 4896414..472ed0b 100644 --- a/docs/true_names_and_TCP.html +++ b/docs/true_names_and_TCP.html @@ -2,19 +2,19 @@ - + - + <title> True Names and TCP - +

True Names and TCP

@@ -30,7 +30,7 @@ transaction.

Recently there have been moves to make your cell phone into a wallet. A big problem with this is that cell -phone cryptography is broken. Another problem is that +phone cryptography is broken. Another problem is that cell phones are not necessarily associated with true names, and as soon as the government hears that they might control money, it starts insisting that cell phones are associated with true names. The phone companies don’t like this, for if money is transferred from true name to true name, rather than cell phone to cell phone, it will make them a servant of the banking cartel, and the bankers will suck up all the gravy, but once people start stealing money through flaws in the encryption, they will be depressingly grateful that the government can track account holders down and punish them – except, of course, the government probably will not be much good at doing so.

TCP is all about creating connections.  It creates connections between network addresses, but network adresses correspond to the way networks are organized, not the way people are organized, so on top of networks we have domain names. 

@@ -71,6 +71,5 @@ Often the server wants to make sure that the client at one end of a connection i

These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

+Commons Attribution-Share Alike 3.0 License

- diff --git a/docs/trust_and_privacy_on_the_blockchain.html b/docs/trust_and_privacy_on_the_blockchain.html index ed485ba..f184ecc 100644 --- a/docs/trust_and_privacy_on_the_blockchain.html +++ b/docs/trust_and_privacy_on_the_blockchain.html @@ -26,7 +26,6 @@ Fred is in the business of buying and selling cryptocurrency for Filipino pesos, This plan reflects our intent to replace government mediated trust and cooperation, with blockchain mediated trust and cooperation, because government mediated trust and cooperation is conspicuously failing. 

These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

+Commons Attribution-Share Alike 3.0 License

- \ No newline at end of file diff --git a/docs/universal_code_for_integers.html b/docs/universal_code_for_integers.html index 19df4a3..f600be0 100644 --- a/docs/universal_code_for_integers.html +++ b/docs/universal_code_for_integers.html @@ -19,15 +19,15 @@ p.center {text-align:center;} upwards compatibility, we want to have variable precision numbers. This class of problem is that of a universal code for integers

- +

But all this stuff is too clever by half.

- +

A way simpler solution in context is that all numbers are potentially sixty four bit numbers. Communication is always preceded by protocol negotiation, in which both sides agree on a protocol that guarantees they both know the schemas that will be used to represent records and what is to be done with those records. Each record will be preceded by a schema number, which tells the recipient how to interpret the ensuing record. A potentially sixty four bit number is represented by a group of up to nine bytes in little endian order, each byte containing seven bits, with its high order bit indicating whether the next byte is part of the group, except for ninth byte, if there is a ninth byte, in which case we shift left by eight instead of seven, and use the entire eight bits of the ninth byte, thus making overflow integers unrepresentable. This schema is good for schema identifiers, protocol identifiers, block numbers, length counts, database record numbers, and times dated from after the start of the information epoch. Blobs of known size will directly stored in the record. In the unlikely event that a blob is of variable size, its size will be length count in the schema, usually followed directly by the blob. If a record contains a variable number of records, again, a length count of the number of records.

- +

Having spent an unreasonable amount of time and energy on figuring out optimal ways of representing variable precision numbers, and coming up with the extremely ingenious idea of representing the numbers from 2 to any positive number with an implied probability of n*(n+1)/(4^n)/8, where n is the number of bits following the first non zero bit, I decided to throw all that stuff away.

These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

+Commons Attribution-Share Alike 3.0 License

diff --git a/docs/verifiable_log_backed_map.html b/docs/verifiable_log_backed_map.html index 764bc9e..573db84 100644 --- a/docs/verifiable_log_backed_map.html +++ b/docs/verifiable_log_backed_map.html @@ -17,11 +17,11 @@

To Home page

Verifiable log backed map

- +

The point and purpose of the Verifiable Log Backed Map is to provide a mapping from identiers, such as phone numbers, email addresses, etc, to public keys, which mapping has to be the same for everyone – so that if you see your public key is such and such, you know that those you converse with also see your public key is such and such.

-

For this to be actually useful, needs to drive a blogging and messaging system with capabilities analogous to facebook, wordpress, or twitter, and each entity in the system needs to have a wallet analogous to a blockchain wallet. Not all wallets should be associated with entities that can be easily found on the network, but entities that can be easily found on the network should have wallets

- +

For this to be actually useful, needs to drive a blogging and messaging system with capabilities analogous to facebook, wordpress, or twitter, and each entity in the system needs to have a wallet analogous to a blockchain wallet. Not all wallets should be associated with entities that can be easily found on the network, but entities that can be easily found on the network should have wallets

+

A Verifiable Log Backed map is a Verifiable Map backed by a Verifiable Log that describes an ordered set of operations that result in predictable mutations to the map.

Clients of a verifiable log can:

    diff --git a/docs/vision_statement.html b/docs/vision_statement.html index 99e4bdb..49ef9e4 100644 --- a/docs/vision_statement.html +++ b/docs/vision_statement.html @@ -14,12 +14,12 @@

    To Home page

    Vision Statement

    - +

    Not yet written

    A vision statement is a one page version of the functional spec, saying what your software will do for users

    These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

    +Commons Attribution-Share Alike 3.0 License

    diff --git a/docs/wallet_design.html b/docs/wallet_design.html index 3728d29..7166f60 100644 --- a/docs/wallet_design.html +++ b/docs/wallet_design.html @@ -12,7 +12,7 @@ p.center {text-align:center;} Wallet Design - +

    To Home page

    Wallet Design

    @@ -25,7 +25,6 @@ It seems like a lot of work to implement, but that is only because you have not

    These documents are licensed under the Creative -Commons Attribution-Share Alike 3.0 License

    +Commons Attribution-Share Alike 3.0 License

    - \ No newline at end of file diff --git a/docs/wallet_implementation.html b/docs/wallet_implementation.html index 6d3e3f4..8815f19 100644 --- a/docs/wallet_implementation.html +++ b/docs/wallet_implementation.html @@ -26,7 +26,7 @@ In Bitcoin, this is simply a pile of random secrets, randomly generated, but obv We care very much about the case where a big important peer in a big central node of the internet, and the owner skips out with the paper key that owns the -peer’s reputation in his pocket, and sets up the same peer in another +peer’s reputation in his pocket, and sets up the same peer in another jurisdiction, and everyone else talks to the peer in the new jurisdiction, and ignores everything the government seized.

    @@ -55,13 +55,13 @@ initiation starts with a random transient public key, and any identifying information is encrypted in the shared secret formed from that transient public key, and the durable public key of the recipient.

    -We also want off the record messaging. So we want to prove to the recipient +We also want off the record messaging. So we want to prove to the recipient that the sender knows the shared secret formed from the recipients public key and the sender’s transient private key, and also the shared secret formed from -the recipient’s public key, the sender’s transient private key, and the +the recipient’s public key, the sender’s transient private key, and the sender’s durable private key. But the recipient, though he then knows the message came from someone who has the sender’s durable private key, cannot -prove that to a third party, because he could have constructed that shared +prove that to a third party, because he could have constructed that shared secret, even if the sender did not know it. The recipient could have forged the message and sent it to himself.

    @@ -125,13 +125,13 @@ master wallet secret and an,the first integer being the number of the transaction with the largest transaction in that name known to the master wallet, an integer that the slave wallet increments with every request for value. The master wallet needs to provide a name for the slave walle, and to -recover payments, needs that name. The payments are made to a public key of -the master wallet, multiplied by a pseudo random scalar constructed from the -hash of a sequential integer with an obfuscation secret supplied by the master -wallet, so that the master wallet can recover the payments without further -communication, and so that the person making the payment knows that any -payment can only be respent by someone who has the master wallet secret key, -which may itself be the key at the end of chain of signatures identity, +recover payments, needs that name. The payments are made to a public key of +the master wallet, multiplied by a pseudo random scalar constructed from the +hash of a sequential integer with an obfuscation secret supplied by the master +wallet, so that the master wallet can recover the payments without further +communication, and so that the person making the payment knows that any +payment can only be respent by someone who has the master wallet secret key, +which may itself be the key at the end of chain of signatures identity, which the master wallet posesses, but the slave wallet does not.

    For slave wallets to exist, the globally unique id has to be not a public @@ -140,8 +140,8 @@ The simplest case being hash(2|public key|name), which is the identifier used by a master wallet. A slave wallet would use the identifier hash(3|master public key|chain of signed ids) with the signatures and public keys in the chain omitted from the hash, so the durable public key and master secret of -the slave wallet does not need to be very durable at all. It can, and -probably should, have a short timeout and be frequently updated by messages +the slave wallet does not need to be very durable at all. It can, and +probably should, have a short timeout and be frequently updated by messages from the master wallet.

    The intent is that a slave wallet can arrange payments on behalf of an identity @@ -160,17 +160,17 @@ _@globally_unique_human_readable_name is closely held, and the master secret for globally_unique_human_readable_name written in pencil on a closely held piece of paper and is seldom in any computer at all.

    -For a name that is not globally unique, the human readable name is -non_unique_human_readable_nickname zero_or_more_whitespace +For a name that is not globally unique, the human readable name is +non_unique_human_readable_nickname zero_or_more_whitespace 42_characters_of_slash6_code zero_or_more_whitespace.

    -Supposing Carol wants to talk to Dave, and the base point is B. Carols secret is the scalar c, and her public key is elliptic point C=c*B. Similarly Dave’s secret is the scalar d, and his public key is elliptic point +Supposing Carol wants to talk to Dave, and the base point is B. Carols secret is the scalar c, and her public key is elliptic point C=c*B. Similarly Dave’s secret is the scalar d, and his public key is elliptic point D=d*B.

    His secret scalar d is probably derived from the hash of his master secret with his nickname, which we presume is "Dave".

    They could establish a shared secret by Carol calculating c*D, and -Dave calculating d*C. But if either party’s key is seized, their +Dave calculating d*C. But if either party’s key is seized, their past communications become decryptable. Plus this unnecessarily leaks metadata o people watching the interaction.

    diff --git a/docs/white_paper.md b/docs/white_paper.md index 0b0d36a..caa4428 100644 --- a/docs/white_paper.md +++ b/docs/white_paper.md @@ -48,7 +48,7 @@ the money changer business, rather than the jewelry business.) time to flee bitcoin.](http://reaction.la/security/bitcoin_vulnerable_to_currency_controls.html) Blockchain analysis is a big problem, though scaling is rapidly becoming a -bigger problem. +bigger problem. Monaro and other privacy currencies solve the privacy problem by padding the blockchain with chaff, to defeat blockchain analysis, but this diff --git a/docs/writing_and_editing_documentation.md b/docs/writing_and_editing_documentation.md index e5fff97..5c53cce 100644 --- a/docs/writing_and_editing_documentation.md +++ b/docs/writing_and_editing_documentation.md @@ -441,7 +441,7 @@ graphic in the markdown preview pane. - + ``` # Tables @@ -467,12 +467,12 @@ fruit| price apple|2.05 pear|1.37 orange|3.09 - + ## multiline without bothering with pipes Counting spaces to align. Only editable in fixed font -This allows multiline, but visual studio code does not like it. Visual Studio Code only supports tables that can be intellibly layed out in visual studio code. +This allows multiline, but visual studio code does not like it. Visual Studio Code only supports tables that can be intelligibly laid out in visual studio code. ------------------------------------------------------------- Centered Default Right Left @@ -501,7 +501,7 @@ In this table, edited in a fixed font, you are using whitespace and blank lines rows. ----------- ------- --------------- ------------------------- -## Grid tabless are safer, hard to count spaces +## Grid tables Allows multiline, and alignment, but visual studio does not like it, and you still have to count those spacees @@ -533,6 +533,3 @@ Alignments can be specified as with pipe tables, by putting colons at the bounda +--------------:+:--------------+:------------------:+ | Right | Left | Centered | +---------------+---------------+--------------------+ - - - diff --git a/docs/zookos_triangle.md b/docs/zookos_triangle.md index 2b2c3dd..2e289dc 100644 --- a/docs/zookos_triangle.md +++ b/docs/zookos_triangle.md @@ -70,7 +70,7 @@ fields, as @petname, but if “petname” is a local petname corresponding to a public key that corresponds to the other party’s private key, it is colored differently to the text and/or looks like a link in html. If you hover over the link, you see the other party’s display name and nickname, and if you click -on that link, you go to data about that person. +on that link, you go to data about that person. What actually gets sent, computer to computer, when Ann mentions Bob in a message to Carol, is not the the local petname that that Ann typed into @@ -131,7 +131,7 @@ All existing systems are half incomplete and unsatisfactory: > groups of nerds, the unfortunate few, who have coriously stumbled > here (for a minute, until they realize what the public channels look > like), or trolls that need an outlet for their mental diahrea. -> +> > As much as I think BitMessage is an interesting concept, you > cannot avoid realizing that it's massively unattractive for wide adoption. @@ -195,7 +195,7 @@ for the guid of that nameset. When receiving a message that references a known guid, the same guid always translates to the same local name, even if the nickname and -fullname is different. +fullname is different. The same guid can have many nicknames and full names, and the same nickname and full name might by used by many different entities with diff --git a/localization.cpp b/localization.cpp index 59ea323..3f173c8 100644 --- a/localization.cpp +++ b/localization.cpp @@ -456,4 +456,3 @@ bool IsValidUtf8String(const char* sz){ } return true; } - diff --git a/mpir_and_base58.cpp b/mpir_and_base58.cpp index 90f5b2d..93d1e08 100644 --- a/mpir_and_base58.cpp +++ b/mpir_and_base58.cpp @@ -1,7 +1,7 @@ #include "stdafx.h" using ristretto255::hash, ristretto255::hsh, ristretto255::scalar, ristretto255::point; namespace ro { - // fasthash fails at obliterating some forms of order in its input, but + // fasthash fails at obliterating some forms of order in its input, but // but this is OK, because our inputs are random to start with, and // all we care about is good mixing and dispersion of that randomness. uint32_t fasthash(uint64_t id, std::span sp) { @@ -64,4 +64,4 @@ namespace ro { } else assert(*terminal_null == '\0'); } -} \ No newline at end of file +} diff --git a/mpir_and_base58.h b/mpir_and_base58.h index 93102ac..f902693 100644 --- a/mpir_and_base58.h +++ b/mpir_and_base58.h @@ -33,7 +33,7 @@ namespace mpir { // and is therefore unable to correctly handle non pod thread local objects. It will // not correctly construct and // destruct thread_local objects by itself, because the model machine does not have a model -// for threading. It has a pile of matchsticks and a tub of glue with which you can build +// for threading. It has a pile of matchsticks and a tub of glue with which you can build // your own model. It supports all the stuff you need for threads, but has no idea how all // these moving parts fit together. // So you have to construct and destruct your non pod thread local objects in code. @@ -44,7 +44,7 @@ public: // These are used all over the place as temporaries. mpir::mpz q, r, n; }; -extern thread_local thread_local__*thl; //Constructor in app.obj. +extern thread_local thread_local__*thl; //Constructor in app.obj. // Destructor does not seem to get called, hence using a pointer // and destroying explicitly, rather than an std::unique_ptr // needs testing to figure out what is going on diff --git a/nmake/makefile b/nmake/makefile index d6fb486..2009d2a 100644 --- a/nmake/makefile +++ b/nmake/makefile @@ -1,23 +1,23 @@ wallet.exe: stdafx.pch app.obj frame.obj Ilog.obj ISqlit3Impl.obj sqlite3.obj - link /OUT:wallet.exe /LIBPATH:%WXWIN%\lib\vc_x64_lib *.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Comctl32.lib Rpcrt4.lib + link /OUT:wallet.exe /LIBPATH:%WXWIN%\lib\vc_x64_lib *.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Comctl32.lib Rpcrt4.lib stdafx.pch: ..\stdafx.cpp ..\app.h ..\frame.h ..\stdafx.h ..\ISqlite3.h CL.exe /c /ZI /I%ROINCLUDE% /I%WXWIN%\lib\vc_x64_lib\mswud /JMC /W3 /WX- /diagnostics:classic /sdl /Od /D _DEBUG /D _WINDOWS /D _UNICODE /D UNICODE /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /permissive- /Zc:wchar_t /Zc:forScope /Zc:inline /std:c++17 /Yc"stdafx.h" /Gd /TP /FC /errorReport:prompt ..\stdafx.cpp app.obj: ..\app.cpp stdafx.pch - CL.exe /c /ZI /JMC /W3 /WX- /diagnostics:classic /sdl /Od /D _DEBUG /D _WINDOWS /D _UNICODE /D UNICODE /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /permissive- /Zc:wchar_t /Zc:forScope /Zc:inline /std:c++17 /Yu"stdafx.h" /Gd /TP /FC /errorReport:prompt ..\app.cpp -# don't need /I%ROINCLUDE% /I%WXWIN%\lib\vc_x64_lib\mswud because it is included in \Yu"stdafx.h" + CL.exe /c /ZI /JMC /W3 /WX- /diagnostics:classic /sdl /Od /D _DEBUG /D _WINDOWS /D _UNICODE /D UNICODE /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /permissive- /Zc:wchar_t /Zc:forScope /Zc:inline /std:c++17 /Yu"stdafx.h" /Gd /TP /FC /errorReport:prompt ..\app.cpp +# don't need /I%ROINCLUDE% /I%WXWIN%\lib\vc_x64_lib\mswud because it is included in \Yu"stdafx.h" frame.obj: ..\frame.cpp stdafx.pch CL.exe /c /ZI /JMC /W3 /WX- /diagnostics:classic /sdl /Od /D _DEBUG /D _WINDOWS /D _UNICODE /D UNICODE /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /permissive- /Zc:wchar_t /Zc:forScope /Zc:inline /std:c++17 /Yu"stdafx.h" /Gd /TP /FC /errorReport:prompt ..\frame.cpp -# don't need /I%ROINCLUDE% /I%WXWIN%\lib\vc_x64_lib\mswud because it is included in \Yu"stdafx.h" - +# don't need /I%ROINCLUDE% /I%WXWIN%\lib\vc_x64_lib\mswud because it is included in \Yu"stdafx.h" + ILog.obj: ..\ILog.cpp stdafx.pch CL.exe /c /ZI /JMC /W3 /WX- /diagnostics:classic /sdl /Od /D _DEBUG /D _WINDOWS /D _UNICODE /D UNICODE /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /permissive- /Zc:wchar_t /Zc:forScope /Zc:inline /std:c++17 /Yu"stdafx.h" /Gd /TP /FC /errorReport:prompt ..\Ilog.cpp -# don't need /I%ROINCLUDE% /I%WXWIN%\lib\vc_x64_lib\mswud because it is included in \Yu"stdafx.h" - +# don't need /I%ROINCLUDE% /I%WXWIN%\lib\vc_x64_lib\mswud because it is included in \Yu"stdafx.h" + ISqlit3Impl.obj: ..\ISqlit3Impl.cpp ..\ISqlite3.h ..\sqlite3.h - CL.exe /c /ZI /I%ROINCLUDE% /JMC /W3 /WX- /diagnostics:classic /sdl /Od /D _DEBUG /D _WINDOWS /D _UNICODE /D UNICODE /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /permissive- /Zc:wchar_t /Zc:forScope /Zc:inline /std:c++17 /Gd /TP /FC /errorReport:prompt ..\ISqlit3Impl.cpp - + CL.exe /c /ZI /I%ROINCLUDE% /JMC /W3 /WX- /diagnostics:classic /sdl /Od /D _DEBUG /D _WINDOWS /D _UNICODE /D UNICODE /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /permissive- /Zc:wchar_t /Zc:forScope /Zc:inline /std:c++17 /Gd /TP /FC /errorReport:prompt ..\ISqlit3Impl.cpp + sqlite3.obj: ..\sqlite3.c ..\sqlite3.h CL.exe /c /ZI /JMC /nologo /W3 /WX- /diagnostics:classic /sdl /Od /D _DEBUG /D _WINDOWS /D _UNICODE /D UNICODE /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /permissive- /Zc:wchar_t /Zc:forScope /Zc:inline /std:c++17 /Gd /TC /FC /errorReport:prompt ..\sqlite3.c diff --git a/ristretto255.h b/ristretto255.h index 39c67bc..6c74a6c 100644 --- a/ristretto255.h +++ b/ristretto255.h @@ -10,7 +10,7 @@ // // It is nonetheless probably stupid to write my own high level interface to // LibSodium, when one has already been written, but I am going to do so -// anyway, because elliptic curves are just way cool, and because ... +// anyway, because elliptic curves are just way cool, and because ... // because ... I am having trouble thinking up a good excuse ... ah yes, // because when I read the NaCl documentation it says "X has not been // implemented yet" when X is something that is pretty easy to implement @@ -148,7 +148,7 @@ namespace ro { // null. // we assume the string is already machine independent, which is to say, we assume // it comes from a utf8 locale. - + inline auto serialize(const char* sp) { return std::span(static_cast(static_cast(sp)), strlen(sp) + 1); } inline auto serialize(const decltype(std::declval().ToUTF8()) sz){ @@ -160,10 +160,10 @@ namespace ro { } If we allowed wxwidgets string to be serializable, all sorts of surprising things would be serializable in surprising ways, because wxWidgets can convert all - sorts of things into strings that you were likely not expecting, in ways - unlikely to be machine independent, so you if you give an object to be + sorts of things into strings that you were likely not expecting, in ways + unlikely to be machine independent, so you if you give an object to be hashed that you have not provided some correct means for serializing, C++ is - apt to unhelpfully and unexpectedly turn it into a wxString, + apt to unhelpfully and unexpectedly turn it into a wxString, If you make wxStrings hashable, suprising things become hashable. */ @@ -223,7 +223,7 @@ namespace ro { // of what is left must have zero at bit 6 // for a negative signed integer, all the 0xFF bytes are left out, except // that the first byte of what is left must have a one bit at bit six. - // + // // small numbers get compressed. // primarily used by hash and hsh so that the same numbers on different // machines will generate the same hash @@ -322,7 +322,7 @@ namespace ro { The largest numbers occurring in well formed valid data will be currency amounts, and the total number of the smallest unit of - currency is fixed at 2^64-1 which will suffice for a thousand years. + currency is fixed at 2^64-1 which will suffice for a thousand years. Or we might allow arbitrary precision floating point with powers of a thousand, so that sensible numbers to a human are represented by sensible numbers in the actuall representation. @@ -500,7 +500,7 @@ namespace ristretto255 { // create a new overload for the function "serialize" // to hash a wxString, use its ToUTF8 member // wxString wxsHello(L"Hello world"); - // hash hashHello(wxsHello.ToUTF8()); + // hash hashHello(wxsHello.ToUTF8()); // C array arguments after the first are vulnerable to array decay to pointer, so use hsh and "<<" // for them. or wrap them in std::span(OldTypeCarray) // It always a wise precaution to not use old type C arays, or wrap them @@ -803,7 +803,7 @@ namespace ristretto255 { // Ristretto255 scalars are defined to be little endian on all hardware // regardless of the endianess of the underlying hardware. // though it is entirely possible that sometime in the future, this -// definition will be changed should big endian hardware ever be +// definition will be changed should big endian hardware ever be // sufficiently popular for anyone to care. // So, because scalars are in fact integers, displaying them as // biendian on all hardware when displayed in hex @@ -811,4 +811,3 @@ namespace ristretto255 { template<> ristretto255::scalar ro::hex2bin (const ro::CompileSizedString< (2 * sizeof(ristretto255::scalar))>&); template<> ro::CompileSizedString< (2 * sizeof(ristretto255::scalar)) > ro::bin2hex(const ristretto255::scalar&); template<> ro::CompileSizedString< (8 * sizeof(ristretto255::scalar) + 5) / 6> ro::to_base64_string (const ristretto255::scalar&); - diff --git a/rotime.cpp b/rotime.cpp index 4c190a1..d1ec61a 100644 --- a/rotime.cpp +++ b/rotime.cpp @@ -86,7 +86,4 @@ namespace ro { snprintf(&retval[0], retval.size(), "%7u.%03u", seconds, milliseconds); return retval.data(); } - - } - diff --git a/secrets.h b/secrets.h index 3df04de..b0f2115 100644 --- a/secrets.h +++ b/secrets.h @@ -8,7 +8,7 @@ ristretto255::scalar DeriveStrongSecret(const char* const passwd); //Derive scalar secret from another quickly. ristretto255::scalar DeriveSecret(const ristretto255::scalar &sc, uint_fast64_t i); -template , int> = 0> +template , int> = 0> constexpr int rounded_log2(const T val) noexcept { return std::numeric_limits::digits - std::countl_zero(val); -} \ No newline at end of file +} diff --git a/slash6.cpp b/slash6.cpp index 7393fe1..41f5e5a 100644 --- a/slash6.cpp +++ b/slash6.cpp @@ -4,7 +4,7 @@ #include #include //#include // for initializer_list -//#include +//#include #include // for shared_ptr, unique_ptr #include #include "ILog.h" @@ -29,11 +29,11 @@ static constexpr std::array ascii2six_ar{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //control characters 0xff, 0x3a, 0xff, 0xff, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3c, 0x3d, 0xff, 0x3e, 0xff, 0xff, // ! $ * + - permitted The characters "#%&'(),. are stops 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // 0-9 permitted The characters :;<=>? are stops - 0xff, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x01, 0x12, 0x13, 0x14, 0x15, 0x16, 0x00, + 0xff, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x01, 0x12, 0x13, 0x14, 0x15, 0x16, 0x00, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0xff, 0xff, 0xff, 0xff, 0x3f, // A-Z and _ permitted, @ and [\]^ are stops 0xff, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x01, 0x2d, 0x2e, 0x00, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0xff, 0xff, 0xff, 0xff, 0xff, //a-z the characters {|} ~` are stops, as is the mysterious control character 0x7F (del) - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, @@ -185,8 +185,8 @@ unsigned int base64_to_bits(uint8_t * bitBuffer, unsigned int start, unsigned in } /* Expects pointer to byte buffer and pointer to string. - Expects a string of exactly the correct number of numerals, - terminated by a non base64 character, such as null. + Expects a string of exactly the correct number of numerals, + terminated by a non base64 character, such as null. Throws exception if that is not what it gets. Fills the byte buffer exactly. Returns a uint8_t containing the excess bits of the last numeral in its low order part.*/ diff --git a/slash6.h b/slash6.h index 0ac2686..e543879 100644 --- a/slash6.h +++ b/slash6.h @@ -31,7 +31,3 @@ std::enable_if_t< >base64_to_bytes( T& byteRange, const char* base64Numerals) { return base64_to_bytes(static_cast(&byteRange[0]), static_cast(std::size(byteRange)), base64Numerals); } - - - - diff --git a/sqlite3.c b/sqlite3.c index faad19f..aead99e 100644 --- a/sqlite3.c +++ b/sqlite3.c @@ -83,7 +83,7 @@ #define CTIMEOPT_VAL2(opt) CTIMEOPT_VAL2_(opt) /* -** An array of names of all compile-time options. This array should +** An array of names of all compile-time options. This array should ** be sorted A-Z. ** ** This array looks large, but in a typical installation actually uses @@ -92,8 +92,8 @@ */ static const char * const sqlite3azCompileOpt[] = { -/* -** BEGIN CODE GENERATED BY tool/mkctime.tcl +/* +** BEGIN CODE GENERATED BY tool/mkctime.tcl */ #if SQLITE_32BIT_ROWID "32BIT_ROWID", @@ -798,8 +798,8 @@ static const char * const sqlite3azCompileOpt[] = { #if SQLITE_ZERO_MALLOC "ZERO_MALLOC", #endif -/* -** END CODE GENERATED BY tool/mkctime.tcl +/* +** END CODE GENERATED BY tool/mkctime.tcl */ }; @@ -849,10 +849,10 @@ SQLITE_PRIVATE const char **sqlite3CompileOptions(int *pnOpt){ ** ** PREVENTS-HARMLESS-OVERREAD - This branch prevents a buffer overread ** that would be harmless and undetectable -** if it did occur. +** if it did occur. ** ** In all cases, the special comment must be enclosed in the usual -** slash-asterisk...asterisk-slash comment marks, with no spaces between the +** slash-asterisk...asterisk-slash comment marks, with no spaces between the ** asterisks and the comment text. */ @@ -1171,7 +1171,7 @@ extern "C" { ** be held constant and Z will be incremented or else Y will be incremented ** and Z will be reset to zero. ** -** Since [version 3.6.18] ([dateof:3.6.18]), +** Since [version 3.6.18] ([dateof:3.6.18]), ** SQLite source code has been stored in the ** Fossil configuration management ** system. ^The SQLITE_SOURCE_ID macro evaluates to @@ -1214,8 +1214,8 @@ extern "C" { ** function is provided for use in DLLs since DLL users usually do not have ** direct access to string constants within the DLL. ^The ** sqlite3_libversion_number() function returns an integer equal to -** [SQLITE_VERSION_NUMBER]. ^(The sqlite3_sourceid() function returns -** a pointer to a string constant whose value is the same as the +** [SQLITE_VERSION_NUMBER]. ^(The sqlite3_sourceid() function returns +** a pointer to a string constant whose value is the same as the ** [SQLITE_SOURCE_ID] C preprocessor macro. Except if SQLite is built ** using an edited copy of [the amalgamation], then the last four characters ** of the hash might be different from [SQLITE_SOURCE_ID].)^ @@ -1230,20 +1230,20 @@ SQLITE_API int sqlite3_libversion_number(void); /* ** CAPI3REF: Run-Time Library Compilation Options Diagnostics ** -** ^The sqlite3_compileoption_used() function returns 0 or 1 -** indicating whether the specified option was defined at -** compile time. ^The SQLITE_ prefix may be omitted from the -** option name passed to sqlite3_compileoption_used(). +** ^The sqlite3_compileoption_used() function returns 0 or 1 +** indicating whether the specified option was defined at +** compile time. ^The SQLITE_ prefix may be omitted from the +** option name passed to sqlite3_compileoption_used(). ** ** ^The sqlite3_compileoption_get() function allows iterating ** over the list of options that were defined at compile time by ** returning the N-th compile time option string. ^If N is out of range, -** sqlite3_compileoption_get() returns a NULL pointer. ^The SQLITE_ -** prefix is omitted from any strings returned by +** sqlite3_compileoption_get() returns a NULL pointer. ^The SQLITE_ +** prefix is omitted from any strings returned by ** sqlite3_compileoption_get(). ** ** ^Support for the diagnostic functions sqlite3_compileoption_used() -** and sqlite3_compileoption_get() may be omitted by specifying the +** and sqlite3_compileoption_get() may be omitted by specifying the ** [SQLITE_OMIT_COMPILEOPTION_DIAGS] option at compile time. ** ** See also: SQL functions [sqlite_compileoption_used()] and @@ -1267,7 +1267,7 @@ SQLITE_API const char *sqlite3_compileoption_get(int N); ** SQLite can be compiled with or without mutexes. When ** the [SQLITE_THREADSAFE] C preprocessor macro is 1 or 2, mutexes ** are enabled and SQLite is threadsafe. When the -** [SQLITE_THREADSAFE] macro is 0, +** [SQLITE_THREADSAFE] macro is 0, ** the mutexes are omitted. Without the mutexes, it is not safe ** to use SQLite concurrently from more than one thread. ** @@ -1324,14 +1324,14 @@ typedef struct sqlite3 sqlite3; ** ** ^The sqlite3_int64 and sqlite_int64 types can store integer values ** between -9223372036854775808 and +9223372036854775807 inclusive. ^The -** sqlite3_uint64 and sqlite_uint64 types can store integer values +** sqlite3_uint64 and sqlite_uint64 types can store integer values ** between 0 and +18446744073709551615 inclusive. */ #ifdef SQLITE_INT64_TYPE typedef SQLITE_INT64_TYPE sqlite_int64; # ifdef SQLITE_UINT64_TYPE typedef SQLITE_UINT64_TYPE sqlite_uint64; -# else +# else typedef unsigned SQLITE_INT64_TYPE sqlite_uint64; # endif #elif defined(_MSC_VER) || defined(__BORLANDC__) @@ -1374,7 +1374,7 @@ typedef sqlite_uint64 sqlite3_uint64; ** destructors are called is arbitrary. ** ** Applications should [sqlite3_finalize | finalize] all [prepared statements], -** [sqlite3_blob_close | close] all [BLOB handles], and +** [sqlite3_blob_close | close] all [BLOB handles], and ** [sqlite3_backup_finish | finish] all [sqlite3_backup] objects associated ** with the [sqlite3] object prior to attempting to close the object. ^If ** sqlite3_close_v2() is called on a [database connection] that still has @@ -1411,7 +1411,7 @@ typedef int (*sqlite3_callback)(void*,int,char**, char**); ** The sqlite3_exec() interface is a convenience wrapper around ** [sqlite3_prepare_v2()], [sqlite3_step()], and [sqlite3_finalize()], ** that allows an application to run multiple statements of SQL -** without having to use a lot of C code. +** without having to use a lot of C code. ** ** ^The sqlite3_exec() interface runs zero or more UTF-8 encoded, ** semicolon-separate SQL statements passed into its 2nd argument, @@ -1451,7 +1451,7 @@ typedef int (*sqlite3_callback)(void*,int,char**, char**); ** from [sqlite3_column_name()]. ** ** ^If the 2nd parameter to sqlite3_exec() is a NULL pointer, a pointer -** to an empty string, or a pointer that contains only whitespace and/or +** to an empty string, or a pointer that contains only whitespace and/or ** SQL comments, then no SQL statements are evaluated and the database ** is not changed. ** @@ -1729,7 +1729,7 @@ SQLITE_API int sqlite3_exec( /* ** CAPI3REF: OS Interface Open File Handle ** -** An [sqlite3_file] object represents an open file in the +** An [sqlite3_file] object represents an open file in the ** [sqlite3_vfs | OS interface layer]. Individual OS interface ** implementations will ** want to subclass this object by appending additional fields @@ -1751,7 +1751,7 @@ struct sqlite3_file { ** This object defines the methods used to perform various operations ** against the open file represented by the [sqlite3_file] object. ** -** If the [sqlite3_vfs.xOpen] method sets the sqlite3_file.pMethods element +** If the [sqlite3_vfs.xOpen] method sets the sqlite3_file.pMethods element ** to a non-NULL pointer, then the sqlite3_io_methods.xClose method ** may be invoked even if the [sqlite3_vfs.xOpen] reported that it failed. The ** only way to prevent a call to xClose following a failed [sqlite3_vfs.xOpen] @@ -1901,7 +1901,7 @@ struct sqlite3_io_methods { **

  1. [[SQLITE_FCNTL_CHUNK_SIZE]] ** The [SQLITE_FCNTL_CHUNK_SIZE] opcode is used to request that the VFS ** extends and truncates the database file in chunks of a size specified -** by the user. The fourth argument to [sqlite3_file_control()] should +** by the user. The fourth argument to [sqlite3_file_control()] should ** point to an integer (type int) containing the new chunk-size to use ** for the nominated database. Allocating database file space in large ** chunks (say 1MB at a time), may reduce file-system fragmentation and @@ -1924,24 +1924,24 @@ struct sqlite3_io_methods { **
  2. [[SQLITE_FCNTL_SYNC]] ** The [SQLITE_FCNTL_SYNC] opcode is generated internally by SQLite and ** sent to the VFS immediately before the xSync method is invoked on a -** database file descriptor. Or, if the xSync method is not invoked -** because the user has configured SQLite with -** [PRAGMA synchronous | PRAGMA synchronous=OFF] it is invoked in place +** database file descriptor. Or, if the xSync method is not invoked +** because the user has configured SQLite with +** [PRAGMA synchronous | PRAGMA synchronous=OFF] it is invoked in place ** of the xSync method. In most cases, the pointer argument passed with ** this file-control is NULL. However, if the database file is being synced ** as part of a multi-database commit, the argument points to a nul-terminated -** string containing the transactions master-journal file name. VFSes that -** do not need this signal should silently ignore this opcode. Applications -** should not call [sqlite3_file_control()] with this opcode as doing so may -** disrupt the operation of the specialized VFSes that do require it. +** string containing the transactions master-journal file name. VFSes that +** do not need this signal should silently ignore this opcode. Applications +** should not call [sqlite3_file_control()] with this opcode as doing so may +** disrupt the operation of the specialized VFSes that do require it. ** **
  3. [[SQLITE_FCNTL_COMMIT_PHASETWO]] ** The [SQLITE_FCNTL_COMMIT_PHASETWO] opcode is generated internally by SQLite ** and sent to the VFS after a transaction has been committed immediately ** but before the database is unlocked. VFSes that do not need this signal ** should silently ignore this opcode. Applications should not call -** [sqlite3_file_control()] with this opcode as doing so may disrupt the -** operation of the specialized VFSes that do require it. +** [sqlite3_file_control()] with this opcode as doing so may disrupt the +** operation of the specialized VFSes that do require it. ** **
  4. [[SQLITE_FCNTL_WIN32_AV_RETRY]] ** ^The [SQLITE_FCNTL_WIN32_AV_RETRY] opcode is used to configure automatic @@ -1989,13 +1989,13 @@ struct sqlite3_io_methods { **
  5. [[SQLITE_FCNTL_OVERWRITE]] ** ^The [SQLITE_FCNTL_OVERWRITE] opcode is invoked by SQLite after opening ** a write transaction to indicate that, unless it is rolled back for some -** reason, the entire database file will be overwritten by the current +** reason, the entire database file will be overwritten by the current ** transaction. This is used by VACUUM operations. ** **
  6. [[SQLITE_FCNTL_VFSNAME]] ** ^The [SQLITE_FCNTL_VFSNAME] opcode can be used to obtain the names of ** all [VFSes] in the VFS stack. The names are of all VFS shims and the -** final bottom-level VFS are written into memory obtained from +** final bottom-level VFS are written into memory obtained from ** [sqlite3_malloc()] and the result is stored in the char* variable ** that the fourth parameter of [sqlite3_file_control()] points to. ** The caller is responsible for freeing the memory when done. As with @@ -2014,7 +2014,7 @@ struct sqlite3_io_methods { ** upper-most shim only. ** **
  7. [[SQLITE_FCNTL_PRAGMA]] -** ^Whenever a [PRAGMA] statement is parsed, an [SQLITE_FCNTL_PRAGMA] +** ^Whenever a [PRAGMA] statement is parsed, an [SQLITE_FCNTL_PRAGMA] ** file control is sent to the open [sqlite3_file] object corresponding ** to the database file to which the pragma statement refers. ^The argument ** to the [SQLITE_FCNTL_PRAGMA] file control is an array of @@ -2025,7 +2025,7 @@ struct sqlite3_io_methods { ** of the char** argument point to a string obtained from [sqlite3_mprintf()] ** or the equivalent and that string will become the result of the pragma or ** the error message if the pragma fails. ^If the -** [SQLITE_FCNTL_PRAGMA] file control returns [SQLITE_NOTFOUND], then normal +** [SQLITE_FCNTL_PRAGMA] file control returns [SQLITE_NOTFOUND], then normal ** [PRAGMA] processing continues. ^If the [SQLITE_FCNTL_PRAGMA] ** file control returns [SQLITE_OK], then the parser assumes that the ** VFS has handled the PRAGMA itself and the parser generates a no-op @@ -2065,7 +2065,7 @@ struct sqlite3_io_methods { ** The argument is a pointer to a value of type sqlite3_int64 that ** is an advisory maximum number of bytes in the file to memory map. The ** pointer is overwritten with the old value. The limit is not changed if -** the value originally pointed to is negative, and so the current limit +** the value originally pointed to is negative, and so the current limit ** can be queried by passing in a pointer to a negative number. This ** file-control is used internally to implement [PRAGMA mmap_size]. ** @@ -2109,7 +2109,7 @@ struct sqlite3_io_methods { **
  8. [[SQLITE_FCNTL_RBU]] ** The [SQLITE_FCNTL_RBU] opcode is implemented by the special VFS used by ** the RBU extension only. All other VFS should return SQLITE_NOTFOUND for -** this opcode. +** this opcode. ** **
  9. [[SQLITE_FCNTL_BEGIN_ATOMIC_WRITE]] ** If the [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] opcode returns SQLITE_OK, then @@ -2126,7 +2126,7 @@ struct sqlite3_io_methods { ** **
  10. [[SQLITE_FCNTL_COMMIT_ATOMIC_WRITE]] ** The [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE] opcode causes all write -** operations since the previous successful call to +** operations since the previous successful call to ** [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] to be performed atomically. ** This file control returns [SQLITE_OK] if and only if the writes were ** all performed successfully and have been committed to persistent storage. @@ -2138,7 +2138,7 @@ struct sqlite3_io_methods { ** **
  11. [[SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE]] ** The [SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE] opcode causes all write -** operations since the previous successful call to +** operations since the previous successful call to ** [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] to be rolled back. ** ^This file control takes the file descriptor out of batch write mode ** so that all subsequent write operations are independent. @@ -2148,7 +2148,7 @@ struct sqlite3_io_methods { **
  12. [[SQLITE_FCNTL_LOCK_TIMEOUT]] ** The [SQLITE_FCNTL_LOCK_TIMEOUT] opcode causes attempts to obtain ** a file lock using the xLock or xShmLock methods of the VFS to wait -** for up to M milliseconds before failing, where M is the single +** for up to M milliseconds before failing, where M is the single ** unsigned integer parameter. ** **
  13. [[SQLITE_FCNTL_DATA_VERSION]] @@ -2290,14 +2290,14 @@ typedef struct sqlite3_api_routines sqlite3_api_routines; ** the [sqlite3_file] can safely store a pointer to the ** filename if it needs to remember the filename for some reason. ** If the zFilename parameter to xOpen is a NULL pointer then xOpen -** must invent its own temporary name for the file. ^Whenever the +** must invent its own temporary name for the file. ^Whenever the ** xFilename parameter is NULL it will also be the case that the ** flags parameter will include [SQLITE_OPEN_DELETEONCLOSE]. ** ** The flags argument to xOpen() includes all bits set in ** the flags argument to [sqlite3_open_v2()]. Or if [sqlite3_open()] ** or [sqlite3_open16()] is used, then flags includes at least -** [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]. +** [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]. ** If xOpen() opens a file read-only then it sets *pOutFlags to ** include [SQLITE_OPEN_READONLY]. Other bits in *pOutFlags may be set. ** @@ -2339,10 +2339,10 @@ typedef struct sqlite3_api_routines sqlite3_api_routines; ** ^The [SQLITE_OPEN_EXCLUSIVE] flag is always used in conjunction ** with the [SQLITE_OPEN_CREATE] flag, which are both directly ** analogous to the O_EXCL and O_CREAT flags of the POSIX open() -** API. The SQLITE_OPEN_EXCLUSIVE flag, when paired with the +** API. The SQLITE_OPEN_EXCLUSIVE flag, when paired with the ** SQLITE_OPEN_CREATE, is used to indicate that file should always ** be created, and that it is an error if it already exists. -** It is not used to indicate the file should be opened +** It is not used to indicate the file should be opened ** for exclusive access. ** ** ^At least szOsFile bytes of memory are allocated by SQLite @@ -2366,7 +2366,7 @@ typedef struct sqlite3_api_routines sqlite3_api_routines; ** non-zero error code if there is an I/O error or if the name of ** the file given in the second argument is illegal. If SQLITE_OK ** is returned, then non-zero or zero is written into *pResOut to indicate -** whether or not the file is accessible. +** whether or not the file is accessible. ** ** ^SQLite will always allocate at least mxPathname+1 bytes for the ** output buffer xFullPathname. The exact size of the output buffer @@ -2386,16 +2386,16 @@ typedef struct sqlite3_api_routines sqlite3_api_routines; ** method returns a Julian Day Number for the current date and time as ** a floating point value. ** ^The xCurrentTimeInt64() method returns, as an integer, the Julian -** Day Number multiplied by 86400000 (the number of milliseconds in -** a 24-hour day). +** Day Number multiplied by 86400000 (the number of milliseconds in +** a 24-hour day). ** ^SQLite will use the xCurrentTimeInt64() method to get the current -** date and time if that method is available (if iVersion is 2 or +** date and time if that method is available (if iVersion is 2 or ** greater and the function pointer is not NULL) and will fall back ** to xCurrentTime() if xCurrentTimeInt64() is unavailable. ** ** ^The xSetSystemCall(), xGetSystemCall(), and xNestSystemCall() interfaces ** are not used by the SQLite core. These optional interfaces are provided -** by some VFSes to facilitate testing of the VFS code. By overriding +** by some VFSes to facilitate testing of the VFS code. By overriding ** system calls with functions under its control, a test program can ** simulate faults and error conditions that would otherwise be difficult ** or impossible to induce. The set of system calls that can be overridden @@ -2442,7 +2442,7 @@ struct sqlite3_vfs { /* ** The methods above are in versions 1 through 3 of the sqlite_vfs object. ** New fields may be appended in future versions. The iVersion - ** value will increment whenever this happens. + ** value will increment whenever this happens. */ }; @@ -2486,7 +2486,7 @@ struct sqlite3_vfs { ** ** ** When unlocking, the same SHARED or EXCLUSIVE flag must be supplied as -** was given on the corresponding lock. +** was given on the corresponding lock. ** ** The xShmLock method can transition between unlocked and SHARED or ** between unlocked and EXCLUSIVE. It cannot transition between SHARED @@ -2631,7 +2631,7 @@ SQLITE_API int sqlite3_config(int, ...); ** [database connection] (specified in the first argument). ** ** The second argument to sqlite3_db_config(D,V,...) is the -** [SQLITE_DBCONFIG_LOOKASIDE | configuration verb] - an integer code +** [SQLITE_DBCONFIG_LOOKASIDE | configuration verb] - an integer code ** that indicates what aspect of the [database connection] is being configured. ** Subsequent arguments vary depending on the configuration verb. ** @@ -2649,7 +2649,7 @@ SQLITE_API int sqlite3_db_config(sqlite3*, int op, ...); ** This object is used in only one place in the SQLite interface. ** A pointer to an instance of this object is the argument to ** [sqlite3_config()] when the configuration option is -** [SQLITE_CONFIG_MALLOC] or [SQLITE_CONFIG_GETMALLOC]. +** [SQLITE_CONFIG_MALLOC] or [SQLITE_CONFIG_GETMALLOC]. ** By creating an instance of this object ** and passing it to [sqlite3_config]([SQLITE_CONFIG_MALLOC]) ** during configuration, an application can specify an alternative @@ -2679,7 +2679,7 @@ SQLITE_API int sqlite3_db_config(sqlite3*, int op, ...); ** allocators round up memory allocations at least to the next multiple ** of 8. Some allocators round up to a larger multiple or to a power of 2. ** Every memory allocation request coming in through [sqlite3_malloc()] -** or [sqlite3_realloc()] first calls xRoundup. If xRoundup returns 0, +** or [sqlite3_realloc()] first calls xRoundup. If xRoundup returns 0, ** that causes the corresponding memory allocation to fail. ** ** The xInit method initializes the memory allocator. For example, @@ -2737,7 +2737,7 @@ struct sqlite3_mem_methods { ** by a single thread. ^If SQLite is compiled with ** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then ** it is not possible to change the [threading mode] from its default -** value of Single-thread and so [sqlite3_config()] will return +** value of Single-thread and so [sqlite3_config()] will return ** [SQLITE_ERROR] if called with the SQLITE_CONFIG_SINGLETHREAD ** configuration option. ** @@ -2772,7 +2772,7 @@ struct sqlite3_mem_methods { ** SQLITE_CONFIG_SERIALIZED configuration option. ** ** [[SQLITE_CONFIG_MALLOC]]
    SQLITE_CONFIG_MALLOC
    -**
    ^(The SQLITE_CONFIG_MALLOC option takes a single argument which is +**
    ^(The SQLITE_CONFIG_MALLOC option takes a single argument which is ** a pointer to an instance of the [sqlite3_mem_methods] structure. ** The argument specifies ** alternative low-level memory allocation routines to be used in place of @@ -2822,7 +2822,7 @@ struct sqlite3_mem_methods { ** [[SQLITE_CONFIG_PAGECACHE]]
    SQLITE_CONFIG_PAGECACHE
    **
    ^The SQLITE_CONFIG_PAGECACHE option specifies a memory pool ** that SQLite can use for the database page cache with the default page -** cache implementation. +** cache implementation. ** This configuration option is a no-op if an application-define page ** cache implementation is loaded using the [SQLITE_CONFIG_PCACHE2]. ** ^There are three arguments to SQLITE_CONFIG_PAGECACHE: A pointer to @@ -2850,7 +2850,7 @@ struct sqlite3_mem_methods { ** additional cache line.
    ** ** [[SQLITE_CONFIG_HEAP]]
    SQLITE_CONFIG_HEAP
    -**
    ^The SQLITE_CONFIG_HEAP option specifies a static memory buffer +**
    ^The SQLITE_CONFIG_HEAP option specifies a static memory buffer ** that SQLite will use for all of its dynamic memory allocation needs ** beyond those provided for by [SQLITE_CONFIG_PAGECACHE]. ** ^The SQLITE_CONFIG_HEAP option is only available if SQLite is compiled @@ -2905,7 +2905,7 @@ struct sqlite3_mem_methods { ** configuration on individual connections.)^
    ** ** [[SQLITE_CONFIG_PCACHE2]]
    SQLITE_CONFIG_PCACHE2
    -**
    ^(The SQLITE_CONFIG_PCACHE2 option takes a single argument which is +**
    ^(The SQLITE_CONFIG_PCACHE2 option takes a single argument which is ** a pointer to an [sqlite3_pcache_methods2] object. This object specifies ** the interface to a custom page cache implementation.)^ ** ^SQLite makes a copy of the [sqlite3_pcache_methods2] object.
    @@ -2919,7 +2919,7 @@ struct sqlite3_mem_methods { **
    The SQLITE_CONFIG_LOG option is used to configure the SQLite ** global [error log]. ** (^The SQLITE_CONFIG_LOG option takes two arguments: a pointer to a -** function with a call signature of void(*)(void*,int,const char*), +** function with a call signature of void(*)(void*,int,const char*), ** and a pointer to void. ^If the function pointer is not NULL, it is ** invoked by [sqlite3_log()] to process each logging event. ^If the ** function pointer is NULL, the [sqlite3_log()] interface becomes a no-op. @@ -3028,7 +3028,7 @@ struct sqlite3_mem_methods { ** [[SQLITE_CONFIG_STMTJRNL_SPILL]] **
    SQLITE_CONFIG_STMTJRNL_SPILL **
    ^The SQLITE_CONFIG_STMTJRNL_SPILL option takes a single parameter which -** becomes the [statement journal] spill-to-disk threshold. +** becomes the [statement journal] spill-to-disk threshold. ** [Statement journals] are held in memory until their size (in bytes) ** exceeds this threshold, at which point they are written to disk. ** Or if the threshold is -1, statement journals are always held @@ -3050,7 +3050,7 @@ struct sqlite3_mem_methods { ** than the configured sorter-reference size threshold - then a reference ** is stored in each sorted record and the required column values loaded ** from the database as records are returned in sorted order. The default -** value for this option is to never use this optimization. Specifying a +** value for this option is to never use this optimization. Specifying a ** negative value for this option restores the default behaviour. ** This option is only available if SQLite is compiled with the ** [SQLITE_ENABLE_SORTER_REFERENCES] compile-time option. @@ -3078,7 +3078,7 @@ struct sqlite3_mem_methods { #define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */ #define SQLITE_CONFIG_MUTEX 10 /* sqlite3_mutex_methods* */ #define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */ -/* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */ +/* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */ #define SQLITE_CONFIG_LOOKASIDE 13 /* int int */ #define SQLITE_CONFIG_PCACHE 14 /* no-op */ #define SQLITE_CONFIG_GETPCACHE 15 /* no-op */ @@ -3113,7 +3113,7 @@ struct sqlite3_mem_methods { **
    ** [[SQLITE_DBCONFIG_LOOKASIDE]] **
    SQLITE_DBCONFIG_LOOKASIDE
    -**
    ^This option takes three additional arguments that determine the +**
    ^This option takes three additional arguments that determine the ** [lookaside memory allocator] configuration for the [database connection]. ** ^The first argument (the third parameter to [sqlite3_db_config()] is a ** pointer to a memory buffer to use for lookaside memory. @@ -3131,7 +3131,7 @@ struct sqlite3_mem_methods { ** when the "current value" returned by ** [sqlite3_db_status](D,[SQLITE_CONFIG_LOOKASIDE],...) is zero. ** Any attempt to change the lookaside memory configuration when lookaside -** memory is in use leaves the configuration unchanged and returns +** memory is in use leaves the configuration unchanged and returns ** [SQLITE_BUSY].)^
    ** ** [[SQLITE_DBCONFIG_ENABLE_FKEY]] @@ -3208,11 +3208,11 @@ struct sqlite3_mem_methods { ** until after the database connection closes. **
    ** -** [[SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE]] +** [[SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE]] **
    SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE
    -**
    Usually, when a database in wal mode is closed or detached from a -** database handle, SQLite checks if this will mean that there are now no -** connections at all to the database. If so, it performs a checkpoint +**
    Usually, when a database in wal mode is closed or detached from a +** database handle, SQLite checks if this will mean that there are now no +** connections at all to the database. If so, it performs a checkpoint ** operation before closing the connection. This option may be used to ** override this behaviour. The first parameter passed to this operation ** is an integer - positive to disable checkpoints-on-close, or zero (the @@ -3231,7 +3231,7 @@ struct sqlite3_mem_methods { ** slower. But the QPSG has the advantage of more predictable behavior. With ** the QPSG active, SQLite will always use the same query plan in the field as ** was used during testing in the lab. -** The first argument to this setting is an integer which is 0 to disable +** The first argument to this setting is an integer which is 0 to disable ** the QPSG, positive to enable QPSG, or negative to leave the setting ** unchanged. The second parameter is a pointer to an integer into which ** is written 0 or 1 to indicate whether the QPSG is disabled or enabled @@ -3239,15 +3239,15 @@ struct sqlite3_mem_methods { **
    ** ** [[SQLITE_DBCONFIG_TRIGGER_EQP]]
    SQLITE_DBCONFIG_TRIGGER_EQP
    -**
    By default, the output of EXPLAIN QUERY PLAN commands does not +**
    By default, the output of EXPLAIN QUERY PLAN commands does not ** include output for any operations performed by trigger programs. This ** option is used to set or clear (the default) a flag that governs this ** behavior. The first parameter passed to this operation is an integer - ** positive to enable output for trigger programs, or zero to disable it, ** or negative to leave the setting unchanged. -** The second parameter is a pointer to an integer into which is written -** 0 or 1 to indicate whether output-for-triggers has been disabled - 0 if -** it is not disabled, 1 if it is. +** The second parameter is a pointer to an integer into which is written +** 0 or 1 to indicate whether output-for-triggers has been disabled - 0 if +** it is not disabled, 1 if it is. **
    ** ** [[SQLITE_DBCONFIG_RESET_DATABASE]]
    SQLITE_DBCONFIG_RESET_DATABASE
    @@ -3261,7 +3261,7 @@ struct sqlite3_mem_methods { ** database, or calling sqlite3_table_column_metadata(), ignoring any ** errors. This step is only necessary if the application desires to keep ** the database in WAL mode after the reset if it was in WAL mode before -** the reset. +** the reset. **
  14. sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 1, 0); **
  15. [sqlite3_exec](db, "[VACUUM]", 0, 0, 0); **
  16. sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 0, 0); @@ -3273,7 +3273,7 @@ struct sqlite3_mem_methods { ** [[SQLITE_DBCONFIG_DEFENSIVE]]
    SQLITE_DBCONFIG_DEFENSIVE
    **
    The SQLITE_DBCONFIG_DEFENSIVE option activates or deactivates the ** "defensive" flag for a database connection. When the defensive -** flag is enabled, language features that allow ordinary SQL to +** flag is enabled, language features that allow ordinary SQL to ** deliberately corrupt the database file are disabled. The disabled ** features include but are not limited to the following: **
      @@ -3288,7 +3288,7 @@ struct sqlite3_mem_methods { **
      The SQLITE_DBCONFIG_WRITABLE_SCHEMA option activates or deactivates the ** "writable_schema" flag. This has the same effect and is logically equivalent ** to setting [PRAGMA writable_schema=ON] or [PRAGMA writable_schema=OFF]. -** The first argument to this setting is an integer which is 0 to disable +** The first argument to this setting is an integer which is 0 to disable ** the writable_schema, positive to enable writable_schema, or negative to ** leave the setting unchanged. The second parameter is a pointer to an ** integer into which is written 0 or 1 to indicate whether the writable_schema @@ -3367,8 +3367,8 @@ SQLITE_API int sqlite3_extended_result_codes(sqlite3*, int onoff); ** ^The sqlite3_last_insert_rowid(D) interface usually returns the [rowid] of ** the most recent successful [INSERT] into a rowid table or [virtual table] ** on database connection D. ^Inserts into [WITHOUT ROWID] tables are not -** recorded. ^If no successful [INSERT]s into rowid tables have ever occurred -** on the database connection D, then sqlite3_last_insert_rowid(D) returns +** recorded. ^If no successful [INSERT]s into rowid tables have ever occurred +** on the database connection D, then sqlite3_last_insert_rowid(D) returns ** zero. ** ** As well as being set automatically as rows are inserted into database @@ -3378,15 +3378,15 @@ SQLITE_API int sqlite3_extended_result_codes(sqlite3*, int onoff); ** Some virtual table implementations may INSERT rows into rowid tables as ** part of committing a transaction (e.g. to flush data accumulated in memory ** to disk). In this case subsequent calls to this function return the rowid -** associated with these internal INSERT operations, which leads to +** associated with these internal INSERT operations, which leads to ** unintuitive results. Virtual table implementations that do write to rowid -** tables in this way can avoid this problem by restoring the original -** rowid value using [sqlite3_set_last_insert_rowid()] before returning +** tables in this way can avoid this problem by restoring the original +** rowid value using [sqlite3_set_last_insert_rowid()] before returning ** control to the user. ** -** ^(If an [INSERT] occurs within a trigger then this routine will -** return the [rowid] of the inserted row as long as the trigger is -** running. Once the trigger program ends, the value returned +** ^(If an [INSERT] occurs within a trigger then this routine will +** return the [rowid] of the inserted row as long as the trigger is +** running. Once the trigger program ends, the value returned ** by this routine reverts to what it was before the trigger was fired.)^ ** ** ^An [INSERT] that fails due to a constraint violation is not a @@ -3419,7 +3419,7 @@ SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*); ** METHOD: sqlite3 ** ** The sqlite3_set_last_insert_rowid(D, R) method allows the application to -** set the value returned by calling sqlite3_last_insert_rowid(D) to R +** set the value returned by calling sqlite3_last_insert_rowid(D) to R ** without inserting a row into the database. */ SQLITE_API void sqlite3_set_last_insert_rowid(sqlite3*,sqlite3_int64); @@ -3435,37 +3435,37 @@ SQLITE_API void sqlite3_set_last_insert_rowid(sqlite3*,sqlite3_int64); ** returned by this function. ** ** ^Only changes made directly by the INSERT, UPDATE or DELETE statement are -** considered - auxiliary changes caused by [CREATE TRIGGER | triggers], +** considered - auxiliary changes caused by [CREATE TRIGGER | triggers], ** [foreign key actions] or [REPLACE] constraint resolution are not counted. -** -** Changes to a view that are intercepted by -** [INSTEAD OF trigger | INSTEAD OF triggers] are not counted. ^The value -** returned by sqlite3_changes() immediately after an INSERT, UPDATE or -** DELETE statement run on a view is always zero. Only changes made to real +** +** Changes to a view that are intercepted by +** [INSTEAD OF trigger | INSTEAD OF triggers] are not counted. ^The value +** returned by sqlite3_changes() immediately after an INSERT, UPDATE or +** DELETE statement run on a view is always zero. Only changes made to real ** tables are counted. ** ** Things are more complicated if the sqlite3_changes() function is ** executed while a trigger program is running. This may happen if the ** program uses the [changes() SQL function], or if some other callback ** function invokes sqlite3_changes() directly. Essentially: -** +** **
        **
      • ^(Before entering a trigger program the value returned by -** sqlite3_changes() function is saved. After the trigger program +** sqlite3_changes() function is saved. After the trigger program ** has finished, the original value is restored.)^ -** -**
      • ^(Within a trigger program each INSERT, UPDATE and DELETE -** statement sets the value returned by sqlite3_changes() -** upon completion as normal. Of course, this value will not include -** any changes performed by sub-triggers, as the sqlite3_changes() +** +**
      • ^(Within a trigger program each INSERT, UPDATE and DELETE +** statement sets the value returned by sqlite3_changes() +** upon completion as normal. Of course, this value will not include +** any changes performed by sub-triggers, as the sqlite3_changes() ** value will be saved and restored after each sub-trigger has run.)^ **
      -** +** ** ^This means that if the changes() SQL function (or similar) is used -** by the first INSERT, UPDATE or DELETE statement within a trigger, it +** by the first INSERT, UPDATE or DELETE statement within a trigger, it ** returns the value as set when the calling statement began executing. -** ^If it is used by the second or subsequent such statement within a trigger -** program, the value returned reflects the number of rows modified by the +** ^If it is used by the second or subsequent such statement within a trigger +** program, the value returned reflects the number of rows modified by the ** previous INSERT, UPDATE or DELETE statement within the same trigger. ** ** If a separate thread makes changes on the same database connection @@ -3491,10 +3491,10 @@ SQLITE_API int sqlite3_changes(sqlite3*); ** since the database connection was opened, including those executed as ** part of trigger programs. ^Executing any other type of SQL statement ** does not affect the value returned by sqlite3_total_changes(). -** +** ** ^Changes made as part of [foreign key actions] are included in the ** count, but those made as part of REPLACE constraint resolution are -** not. ^Changes to a view that are intercepted by INSTEAD OF triggers +** not. ^Changes to a view that are intercepted by INSTEAD OF triggers ** are not counted. ** ** The [sqlite3_total_changes(D)] interface only reports the number @@ -3503,7 +3503,7 @@ SQLITE_API int sqlite3_changes(sqlite3*); ** To detect changes against a database file from other database ** connections use the [PRAGMA data_version] command or the ** [SQLITE_FCNTL_DATA_VERSION] [file control]. -** +** ** If a separate thread makes changes on the same database connection ** while [sqlite3_total_changes()] is running then the value ** returned is unpredictable and not meaningful. @@ -3545,7 +3545,7 @@ SQLITE_API int sqlite3_total_changes(sqlite3*); ** ** ^The sqlite3_interrupt(D) call is in effect until all currently running ** SQL statements on [database connection] D complete. ^Any new SQL statements -** that are started after the sqlite3_interrupt() call and before the +** that are started after the sqlite3_interrupt() call and before the ** running statements reaches zero are interrupted as if they had been ** running prior to the sqlite3_interrupt() call. ^New SQL statements ** that are started after the running statement count reaches zero are @@ -3577,7 +3577,7 @@ SQLITE_API void sqlite3_interrupt(sqlite3*); ** ^These routines do not parse the SQL statements thus ** will not detect syntactically incorrect SQL. ** -** ^(If SQLite has not been initialized using [sqlite3_initialize()] prior +** ^(If SQLite has not been initialized using [sqlite3_initialize()] prior ** to invoking sqlite3_complete16() then sqlite3_initialize() is invoked ** automatically by sqlite3_complete16(). If that initialization fails, ** then the return value from sqlite3_complete16() will be non-zero @@ -3622,7 +3622,7 @@ SQLITE_API int sqlite3_complete16(const void *sql); ** The presence of a busy handler does not guarantee that it will be invoked ** when there is lock contention. ^If SQLite determines that invoking the busy ** handler could result in a deadlock, it will go ahead and return [SQLITE_BUSY] -** to the application instead of invoking the +** to the application instead of invoking the ** busy handler. ** Consider a scenario where one process is holding a read lock that ** it is trying to promote to a reserved lock and @@ -3647,7 +3647,7 @@ SQLITE_API int sqlite3_complete16(const void *sql); ** database connection that invoked the busy handler. In other words, ** the busy handler is not reentrant. Any such actions ** result in undefined behavior. -** +** ** A busy handler must not close the database connection ** or [prepared statement] that invoked the busy handler. */ @@ -3765,7 +3765,7 @@ SQLITE_API void sqlite3_free_table(char **result); ** These routines are work-alikes of the "printf()" family of functions ** from the standard C library. ** These routines understand most of the common formatting options from -** the standard library printf() +** the standard library printf() ** plus some additional non-standard formats ([%q], [%Q], [%w], and [%z]). ** See the [built-in printf()] documentation for details. ** @@ -3974,7 +3974,7 @@ SQLITE_API void sqlite3_randomness(int N, void *P); ** requested is ok. ^When the callback returns [SQLITE_DENY], the ** [sqlite3_prepare_v2()] or equivalent call that triggered the ** authorizer will fail with an error message explaining that -** access is denied. +** access is denied. ** ** ^The first parameter to the authorizer callback is a copy of the third ** parameter to the sqlite3_set_authorizer() interface. ^The second parameter @@ -4027,7 +4027,7 @@ SQLITE_API void sqlite3_randomness(int N, void *P); ** database connections for the meaning of "modify" in this paragraph. ** ** ^When [sqlite3_prepare_v2()] is used to prepare a statement, the -** statement might be re-prepared during [sqlite3_step()] due to a +** statement might be re-prepared during [sqlite3_step()] due to a ** schema change. Hence, the application should ensure that the ** correct authorizer callback remains in place during the [sqlite3_step()]. ** @@ -4175,7 +4175,7 @@ SQLITE_API SQLITE_DEPRECATED void *sqlite3_profile(sqlite3*, ** execution of the prepared statement, such as at the start of each ** trigger subprogram. ^The P argument is a pointer to the ** [prepared statement]. ^The X argument is a pointer to a string which -** is the unexpanded SQL text of the prepared statement or an SQL comment +** is the unexpanded SQL text of the prepared statement or an SQL comment ** that indicates the invocation of a trigger. ^The callback can compute ** the same text that would have been returned by the legacy [sqlite3_trace()] ** interface by using the X argument when X begins with "--" and invoking @@ -4191,7 +4191,7 @@ SQLITE_API SQLITE_DEPRECATED void *sqlite3_profile(sqlite3*, ** ** [[SQLITE_TRACE_ROW]]
      SQLITE_TRACE_ROW
      **
      ^An SQLITE_TRACE_ROW callback is invoked whenever a prepared -** statement generates a single row of result. +** statement generates a single row of result. ** ^The P argument is a pointer to the [prepared statement] and the ** X argument is unused. ** @@ -4218,10 +4218,10 @@ SQLITE_API SQLITE_DEPRECATED void *sqlite3_profile(sqlite3*, ** M argument should be the bitwise OR-ed combination of ** zero or more [SQLITE_TRACE] constants. ** -** ^Each call to either sqlite3_trace() or sqlite3_trace_v2() overrides +** ^Each call to either sqlite3_trace() or sqlite3_trace_v2() overrides ** (cancels) any prior calls to sqlite3_trace() or sqlite3_trace_v2(). ** -** ^The X callback is invoked whenever any of the events identified by +** ^The X callback is invoked whenever any of the events identified by ** mask M occur. ^The integer return value from the callback is currently ** ignored, though this may change in future releases. Callback ** implementations should return zero to ensure future compatibility. @@ -4253,8 +4253,8 @@ SQLITE_API int sqlite3_trace_v2( ** database connection D. An example use for this ** interface is to keep a GUI updated during a large query. ** -** ^The parameter P is passed through as the only parameter to the -** callback function X. ^The parameter N is the approximate number of +** ^The parameter P is passed through as the only parameter to the +** callback function X. ^The parameter N is the approximate number of ** [virtual machine instructions] that are evaluated between successive ** invocations of the callback X. ^If N is less than one then the progress ** handler is disabled. @@ -4281,7 +4281,7 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** CAPI3REF: Opening A New Database Connection ** CONSTRUCTOR: sqlite3 ** -** ^These routines open an SQLite database file as specified by the +** ^These routines open an SQLite database file as specified by the ** filename argument. ^The filename argument is interpreted as UTF-8 for ** sqlite3_open() and sqlite3_open_v2() and as UTF-16 in the native byte ** order for sqlite3_open16(). ^(A [database connection] handle is usually @@ -4306,7 +4306,7 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** except that it accepts two additional parameters for additional control ** over the new database connection. ^(The flags parameter to ** sqlite3_open_v2() can take one of -** the following three values, optionally combined with the +** the following three values, optionally combined with the ** [SQLITE_OPEN_NOMUTEX], [SQLITE_OPEN_FULLMUTEX], [SQLITE_OPEN_SHAREDCACHE], ** [SQLITE_OPEN_PRIVATECACHE], and/or [SQLITE_OPEN_URI] flags:)^ ** @@ -4374,17 +4374,17 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** information. ** ** URI filenames are parsed according to RFC 3986. ^If the URI contains an -** authority, then it must be either an empty string or the string -** "localhost". ^If the authority is not an empty string or "localhost", an -** error is returned to the caller. ^The fragment component of a URI, if +** authority, then it must be either an empty string or the string +** "localhost". ^If the authority is not an empty string or "localhost", an +** error is returned to the caller. ^The fragment component of a URI, if ** present, is ignored. ** ** ^SQLite uses the path component of the URI as the name of the disk file -** which contains the database. ^If the path begins with a '/' character, -** then it is interpreted as an absolute path. ^If the path does not begin +** which contains the database. ^If the path begins with a '/' character, +** then it is interpreted as an absolute path. ^If the path does not begin ** with a '/' (meaning that the authority section is omitted from the URI) -** then the path is interpreted as a relative path. -** ^(On windows, the first component of an absolute path +** then the path is interpreted as a relative path. +** ^(On windows, the first component of an absolute path ** is a drive specification (e.g. "C:").)^ ** ** [[core URI query parameters]] @@ -4404,13 +4404,13 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** **
    • mode: ^(The mode parameter may be set to either "ro", "rw", ** "rwc", or "memory". Attempting to set it to any other value is -** an error)^. -** ^If "ro" is specified, then the database is opened for read-only -** access, just as if the [SQLITE_OPEN_READONLY] flag had been set in the -** third argument to sqlite3_open_v2(). ^If the mode option is set to -** "rw", then the database is opened for read-write (but not create) -** access, as if SQLITE_OPEN_READWRITE (but not SQLITE_OPEN_CREATE) had -** been set. ^Value "rwc" is equivalent to setting both +** an error)^. +** ^If "ro" is specified, then the database is opened for read-only +** access, just as if the [SQLITE_OPEN_READONLY] flag had been set in the +** third argument to sqlite3_open_v2(). ^If the mode option is set to +** "rw", then the database is opened for read-write (but not create) +** access, as if SQLITE_OPEN_READWRITE (but not SQLITE_OPEN_CREATE) had +** been set. ^Value "rwc" is equivalent to setting both ** SQLITE_OPEN_READWRITE and SQLITE_OPEN_CREATE. ^If the mode option is ** set to "memory" then a pure [in-memory database] that never reads ** or writes from disk is used. ^It is an error to specify a value for @@ -4420,7 +4420,7 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); **
    • cache: ^The cache parameter may be set to either "shared" or ** "private". ^Setting it to "shared" is equivalent to setting the ** SQLITE_OPEN_SHAREDCACHE bit in the flags argument passed to -** sqlite3_open_v2(). ^Setting the cache parameter to "private" is +** sqlite3_open_v2(). ^Setting the cache parameter to "private" is ** equivalent to setting the SQLITE_OPEN_PRIVATECACHE bit. ** ^If sqlite3_open_v2() is used and the "cache" parameter is present in ** a URI filename, its value overrides any behavior requested by setting @@ -4446,7 +4446,7 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** property on a database file that does in fact change can result ** in incorrect query results and/or [SQLITE_CORRUPT] errors. ** See also: [SQLITE_IOCAP_IMMUTABLE]. -** +** **
    ** ** ^Specifying an unknown parameter in the query component of a URI is not an @@ -4458,36 +4458,36 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** ** **
    URI filenames Results -**
    file:data.db +**
    file:data.db ** Open the file "data.db" in the current directory. **
    file:/home/fred/data.db
    -** file:///home/fred/data.db
    -** file://localhost/home/fred/data.db
    +** file:///home/fred/data.db
    +** file://localhost/home/fred/data.db
    ** Open the database file "/home/fred/data.db". -**
    file://darkstar/home/fred/data.db +**
    file://darkstar/home/fred/data.db ** An error. "darkstar" is not a recognized authority. -**
    +**
    ** file:///C:/Documents%20and%20Settings/fred/Desktop/data.db ** Windows only: Open the file "data.db" on fred's desktop on drive -** C:. Note that the %20 escaping in this example is not strictly +** C:. Note that the %20 escaping in this example is not strictly ** necessary - space characters can be used literally ** in URI filenames. -**
    file:data.db?mode=ro&cache=private +**
    file:data.db?mode=ro&cache=private ** Open file "data.db" in the current directory for read-only access. ** Regardless of whether or not shared-cache mode is enabled by ** default, use a private cache. **
    file:/home/fred/data.db?vfs=unix-dotfile ** Open file "/home/fred/data.db". Use the special VFS "unix-dotfile" ** that uses dot-files in place of posix advisory locking. -**
    file:data.db?mode=readonly +**
    file:data.db?mode=readonly ** An error. "readonly" is not a valid option for the "mode" parameter. **
    ** ** ^URI hexadecimal escape sequences (%HH) are supported within the path and ** query components of a URI. A hexadecimal escape sequence consists of a -** percent sign - "%" - followed by exactly two hexadecimal digits +** percent sign - "%" - followed by exactly two hexadecimal digits ** specifying an octet value. ^Before the path or query components of a -** URI filename are interpreted, they are encoded using UTF-8 and all +** URI filename are interpreted, they are encoded using UTF-8 and all ** hexadecimal escape sequences replaced by a single byte containing the ** corresponding octet. If this process generates an invalid UTF-8 encoding, ** the results are undefined. @@ -4523,15 +4523,15 @@ SQLITE_API int sqlite3_open_v2( ** CAPI3REF: Obtain Values For URI Parameters ** ** These are utility routines, useful to VFS implementations, that check -** to see if a database file was a URI that contained a specific query +** to see if a database file was a URI that contained a specific query ** parameter, and if so obtains the value of that query parameter. ** -** If F is the database filename pointer passed into the xOpen() method of -** a VFS implementation when the flags parameter to xOpen() has one or +** If F is the database filename pointer passed into the xOpen() method of +** a VFS implementation when the flags parameter to xOpen() has one or ** more of the [SQLITE_OPEN_URI] or [SQLITE_OPEN_MAIN_DB] bits set and ** P is the name of the query parameter, then ** sqlite3_uri_parameter(F,P) returns the value of the P -** parameter if it exists or a NULL pointer if P does not appear as a +** parameter if it exists or a NULL pointer if P does not appear as a ** query parameter on F. If P is a query parameter of F ** has no explicit value, then sqlite3_uri_parameter(F,P) returns ** a pointer to an empty string. @@ -4540,7 +4540,7 @@ SQLITE_API int sqlite3_open_v2( ** parameter and returns true (1) or false (0) according to the value ** of P. The sqlite3_uri_boolean(F,P,B) routine returns true (1) if the ** value of query parameter P is one of "yes", "true", or "on" in any -** case or if the value begins with a non-zero number. The +** case or if the value begins with a non-zero number. The ** sqlite3_uri_boolean(F,P,B) routines returns false (0) if the value of ** query parameter P is one of "no", "false", or "off" in any case or ** if the value begins with a numeric zero. If P is not a query @@ -4551,7 +4551,7 @@ SQLITE_API int sqlite3_open_v2( ** 64-bit signed integer and returns that integer, or D if P does not ** exist. If the value of P is something other than an integer, then ** zero is returned. -** +** ** If F is a NULL pointer, then sqlite3_uri_parameter(F,P) returns NULL and ** sqlite3_uri_boolean(F,P,B) returns B. If F is not a NULL pointer and ** is not a database file pathname pointer that SQLite passed into the xOpen @@ -4569,12 +4569,12 @@ SQLITE_API sqlite3_int64 sqlite3_uri_int64(const char*, const char*, sqlite3_int ** CAPI3REF: Error Codes And Messages ** METHOD: sqlite3 ** -** ^If the most recent sqlite3_* API call associated with +** ^If the most recent sqlite3_* API call associated with ** [database connection] D failed, then the sqlite3_errcode(D) interface ** returns the numeric [result code] or [extended result code] for that ** API call. ** ^The sqlite3_extended_errcode() -** interface is the same except that it always returns the +** interface is the same except that it always returns the ** [extended result code] even when extended result codes are ** disabled. ** @@ -4631,7 +4631,7 @@ SQLITE_API const char *sqlite3_errstr(int); ** has been compiled into binary form and is ready to be evaluated. ** ** Think of each SQL statement as a separate computer program. The -** original SQL text is source code. A prepared statement object +** original SQL text is source code. A prepared statement object ** is the compiled object code. All SQL must be converted into a ** prepared statement before it can be run. ** @@ -4661,7 +4661,7 @@ typedef struct sqlite3_stmt sqlite3_stmt; ** new limit for that construct.)^ ** ** ^If the new limit is a negative number, the limit is unchanged. -** ^(For each limit category SQLITE_LIMIT_NAME there is a +** ^(For each limit category SQLITE_LIMIT_NAME there is a ** [limits | hard upper bound] ** set at compile-time by a C preprocessor macro called ** [limits | SQLITE_MAX_NAME]. @@ -4669,7 +4669,7 @@ typedef struct sqlite3_stmt sqlite3_stmt; ** ^Attempts to increase a limit above its hard upper bound are ** silently truncated to the hard upper bound. ** -** ^Regardless of whether or not the limit was changed, the +** ^Regardless of whether or not the limit was changed, the ** [sqlite3_limit()] interface returns the prior value of the limit. ** ^Hence, to find the current value of a limit without changing it, ** simply invoke this interface with the third parameter set to -1. @@ -4774,7 +4774,7 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); **
    The SQLITE_PREPARE_PERSISTENT flag is a hint to the query planner ** that the prepared statement will be retained for a long time and ** probably reused many times.)^ ^Without this flag, [sqlite3_prepare_v3()] -** and [sqlite3_prepare16_v3()] assume that the prepared statement will +** and [sqlite3_prepare16_v3()] assume that the prepared statement will ** be used just once or at most a few times and then destroyed using ** [sqlite3_finalize()] relatively soon. The current implementation acts ** on this hint by avoiding the use of [lookaside memory] so as not to @@ -4881,12 +4881,12 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); **
  17. ** **
  18. -** ^If the specific value bound to [parameter | host parameter] in the +** ^If the specific value bound to [parameter | host parameter] in the ** WHERE clause might influence the choice of query plan for a statement, -** then the statement will be automatically recompiled, as if there had been +** then the statement will be automatically recompiled, as if there had been ** a schema change, on the first [sqlite3_step()] call following any change -** to the [sqlite3_bind_text | bindings] of that [parameter]. -** ^The specific value of WHERE-clause [parameter] might influence the +** to the [sqlite3_bind_text | bindings] of that [parameter]. +** ^The specific value of WHERE-clause [parameter] might influence the ** choice of query plan if the parameter is the left-hand side of a [LIKE] ** or [GLOB] operator or if the parameter is compared to an indexed column ** and the [SQLITE_ENABLE_STAT4] compile-time option is enabled. @@ -4995,8 +4995,8 @@ SQLITE_API const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt); ** the content of the database file. ** ** Note that [application-defined SQL functions] or -** [virtual tables] might change the database indirectly as a side effect. -** ^(For example, if an application defines a function "eval()" that +** [virtual tables] might change the database indirectly as a side effect. +** ^(For example, if an application defines a function "eval()" that ** calls [sqlite3_exec()], then the following SQL statement would ** change the database file through side-effects: ** @@ -5010,10 +5010,10 @@ SQLITE_API const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt); ** ^Transaction control statements such as [BEGIN], [COMMIT], [ROLLBACK], ** [SAVEPOINT], and [RELEASE] cause sqlite3_stmt_readonly() to return true, ** since the statements themselves do not actually modify the database but -** rather they control the timing of when other statements modify the +** rather they control the timing of when other statements modify the ** database. ^The [ATTACH] and [DETACH] statements also cause ** sqlite3_stmt_readonly() to return true since, while those statements -** change the configuration of a database connection, they do not make +** change the configuration of a database connection, they do not make ** changes to the content of the database files on disk. ** ^The sqlite3_stmt_readonly() interface returns true for [BEGIN] since ** [BEGIN] merely sets internal flags, but the [BEGIN|BEGIN IMMEDIATE] and @@ -5039,18 +5039,18 @@ SQLITE_API int sqlite3_stmt_isexplain(sqlite3_stmt *pStmt); ** METHOD: sqlite3_stmt ** ** ^The sqlite3_stmt_busy(S) interface returns true (non-zero) if the -** [prepared statement] S has been stepped at least once using +** [prepared statement] S has been stepped at least once using ** [sqlite3_step(S)] but has neither run to completion (returned ** [SQLITE_DONE] from [sqlite3_step(S)]) nor ** been reset using [sqlite3_reset(S)]. ^The sqlite3_stmt_busy(S) -** interface returns false if S is a NULL pointer. If S is not a +** interface returns false if S is a NULL pointer. If S is not a ** NULL pointer and is not a pointer to a valid [prepared statement] ** object, then the behavior is undefined and probably undesirable. ** ** This interface can be used in combination [sqlite3_next_stmt()] -** to locate all prepared statements associated with a database +** to locate all prepared statements associated with a database ** connection that are in need of being reset. This can be used, -** for example, in diagnostic routines to search for prepared +** for example, in diagnostic routines to search for prepared ** statements that are holding a transaction open. */ SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt*); @@ -5069,7 +5069,7 @@ SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt*); ** will accept either a protected or an unprotected sqlite3_value. ** Every interface that accepts sqlite3_value arguments specifies ** whether or not it requires a protected sqlite3_value. The -** [sqlite3_value_dup()] interface can be used to construct a new +** [sqlite3_value_dup()] interface can be used to construct a new ** protected sqlite3_value from an unprotected sqlite3_value. ** ** The terms "protected" and "unprotected" refer to whether or not @@ -5077,7 +5077,7 @@ SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt*); ** sqlite3_value object but no mutex is held for an unprotected ** sqlite3_value object. If SQLite is compiled to be single-threaded ** (with [SQLITE_THREADSAFE=0] and with [sqlite3_threadsafe()] returning 0) -** or if SQLite is run in one of reduced mutex modes +** or if SQLite is run in one of reduced mutex modes ** [SQLITE_CONFIG_SINGLETHREAD] or [SQLITE_CONFIG_MULTITHREAD] ** then there is no distinction between protected and unprotected ** sqlite3_value objects and they can be used interchangeably. However, @@ -5165,7 +5165,7 @@ typedef struct sqlite3_context sqlite3_context; ** or sqlite3_bind_text16() or sqlite3_bind_text64() then ** that parameter must be the byte offset ** where the NUL terminator would occur assuming the string were NUL -** terminated. If any NUL characters occur at byte offsets less than +** terminated. If any NUL characters occur at byte offsets less than ** the value of the fourth parameter then the resulting string value will ** contain embedded NULs. The result of expressions involving strings ** with embedded NULs is undefined. @@ -5327,7 +5327,7 @@ SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt*); ** METHOD: sqlite3_stmt ** ** ^Return the number of columns in the result set returned by the -** [prepared statement]. ^If this routine returns 0, that means the +** [prepared statement]. ^If this routine returns 0, that means the ** [prepared statement] returns no data (for example an [UPDATE]). ** ^However, just because this routine returns a positive number does not ** mean that one or more rows of data will be returned. ^A SELECT statement @@ -5513,7 +5513,7 @@ SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int); ** For all versions of SQLite up to and including 3.6.23.1, a call to ** [sqlite3_reset()] was required after sqlite3_step() returned anything ** other than [SQLITE_ROW] before any subsequent invocation of -** sqlite3_step(). Failure to reset the prepared statement using +** sqlite3_step(). Failure to reset the prepared statement using ** [sqlite3_reset()] would result in an [SQLITE_MISUSE] return from ** sqlite3_step(). But after [version 3.6.23.1] ([dateof:3.6.23.1], ** sqlite3_step() began @@ -5604,7 +5604,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** sqlite3_column_int64→64-bit INTEGER result ** sqlite3_column_text→UTF-8 TEXT result ** sqlite3_column_text16→UTF-16 TEXT result -** sqlite3_column_value→The result as an +** sqlite3_column_value→The result as an ** [sqlite3_value|unprotected sqlite3_value] object. **     ** sqlite3_column_bytes→Size of a BLOB @@ -5652,7 +5652,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** The return value of sqlite3_column_type() can be used to decide which ** of the first six interface should be used to extract the column value. ** The value returned by sqlite3_column_type() is only meaningful if no -** automatic type conversions have occurred for the value in question. +** automatic type conversions have occurred for the value in question. ** After a type conversion, the result of calling sqlite3_column_type() ** is undefined, though harmless. Future ** versions of SQLite may change the behavior of sqlite3_column_type() @@ -5680,7 +5680,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** the number of bytes in that string. ** ^If the result is NULL, then sqlite3_column_bytes16() returns zero. ** -** ^The values returned by [sqlite3_column_bytes()] and +** ^The values returned by [sqlite3_column_bytes()] and ** [sqlite3_column_bytes16()] do not include the zero terminators at the end ** of the string. ^For clarity: the values returned by ** [sqlite3_column_bytes()] and [sqlite3_column_bytes16()] are the number of @@ -5699,7 +5699,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** to routines like [sqlite3_value_int()], [sqlite3_value_text()], ** or [sqlite3_value_bytes()], the behavior is not threadsafe. ** Hence, the sqlite3_column_value() interface -** is normally only useful within the implementation of +** is normally only useful within the implementation of ** [application-defined SQL functions] or [virtual tables], not within ** top-level application code. ** @@ -5876,8 +5876,8 @@ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); ** ^These functions (collectively known as "function creation routines") ** are used to add SQL functions or aggregates or to redefine the behavior ** of existing SQL functions or aggregates. The only differences between -** the three "sqlite3_create_function*" routines are the text encoding -** expected for the second parameter (the name of the function being +** the three "sqlite3_create_function*" routines are the text encoding +** expected for the second parameter (the name of the function being ** created) and the presence or absence of a destructor callback for ** the application data pointer. Function sqlite3_create_window_function() ** is similar, but allows the user to supply the extra callback functions @@ -5891,7 +5891,7 @@ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); ** ^The second parameter is the name of the SQL function to be created or ** redefined. ^The length of the name is limited to 255 bytes in a UTF-8 ** representation, exclusive of the zero-terminator. ^Note that the name -** length limit is in UTF-8 bytes, not characters nor UTF-16 bytes. +** length limit is in UTF-8 bytes, not characters nor UTF-16 bytes. ** ^Any attempt to create a function with a longer name ** will result in [SQLITE_MISUSE] being returned. ** @@ -5906,7 +5906,7 @@ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); ** ^The fourth parameter, eTextRep, specifies what ** [SQLITE_UTF8 | text encoding] this SQL function prefers for ** its parameters. The application should set this parameter to -** [SQLITE_UTF16LE] if the function implementation invokes +** [SQLITE_UTF16LE] if the function implementation invokes ** [sqlite3_value_text16le()] on an input, or [SQLITE_UTF16BE] if the ** implementation invokes [sqlite3_value_text16be()] on an input, or ** [SQLITE_UTF16] if [sqlite3_value_text16()] is used, or [SQLITE_UTF8] @@ -5943,21 +5943,21 @@ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); ** SQL function or aggregate, pass NULL pointers for all three function ** callbacks. ** -** ^The sixth, seventh, eighth and ninth parameters (xStep, xFinal, xValue +** ^The sixth, seventh, eighth and ninth parameters (xStep, xFinal, xValue ** and xInverse) passed to sqlite3_create_window_function are pointers to ** C-language callbacks that implement the new function. xStep and xFinal ** must both be non-NULL. xValue and xInverse may either both be NULL, in -** which case a regular aggregate function is created, or must both be +** which case a regular aggregate function is created, or must both be ** non-NULL, in which case the new function may be used as either an aggregate ** or aggregate window function. More details regarding the implementation -** of aggregate window functions are +** of aggregate window functions are ** [user-defined window functions|available here]. ** ** ^(If the final parameter to sqlite3_create_function_v2() or ** sqlite3_create_window_function() is not NULL, then it is destructor for -** the application data pointer. The destructor is invoked when the function -** is deleted, either by being overloaded or when the database connection -** closes.)^ ^The destructor is also invoked if the call to +** the application data pointer. The destructor is invoked when the function +** is deleted, either by being overloaded or when the database connection +** closes.)^ ^The destructor is also invoked if the call to ** sqlite3_create_function_v2() fails. ^When the destructor callback is ** invoked, it is passed a single argument which is a copy of the application ** data pointer which was the fifth parameter to sqlite3_create_function_v2(). @@ -5970,7 +5970,7 @@ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); ** nArg parameter is a better match than a function implementation with ** a negative nArg. ^A function where the preferred text encoding ** matches the database encoding is a better -** match than a function where the encoding is different. +** match than a function where the encoding is different. ** ^A function where the encoding difference is between UTF16le and UTF16be ** is a closer match than a function where the encoding difference is ** between UTF8 and UTF16. @@ -6042,7 +6042,7 @@ SQLITE_API int sqlite3_create_window_function( /* ** CAPI3REF: Function Flags ** -** These constants may be ORed together with the +** These constants may be ORed together with the ** [SQLITE_UTF8 | preferred text encoding] as the fourth argument ** to [sqlite3_create_function()], [sqlite3_create_function16()], or ** [sqlite3_create_function_v2()]. @@ -6053,9 +6053,9 @@ SQLITE_API int sqlite3_create_window_function( ** ** The SQLITE_DIRECTONLY flag means that the function may only be invoked ** from top-level SQL, and cannot be used in VIEWs or TRIGGERs. This is -** a security feature which is recommended for all -** [application-defined SQL functions] that have side-effects. This flag -** prevents an attacker from adding triggers and views to a schema then +** a security feature which is recommended for all +** [application-defined SQL functions] that have side-effects. This flag +** prevents an attacker from adding triggers and views to a schema then ** tricking a high-privilege application into causing unintended side-effects ** while performing ordinary queries. ** @@ -6076,7 +6076,7 @@ SQLITE_API int sqlite3_create_window_function( ** DEPRECATED ** ** These functions are [deprecated]. In order to maintain -** backwards compatibility with older code, these functions continue +** backwards compatibility with older code, these functions continue ** to be supported. However, new applications should avoid ** the use of these functions. To encourage programmers to avoid ** these functions, we will not explain what they do. @@ -6144,11 +6144,11 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6 ** sqlite3_value_text16be() and sqlite3_value_text16le() interfaces ** extract UTF-16 strings as big-endian and little-endian respectively. ** -** ^If [sqlite3_value] object V was initialized +** ^If [sqlite3_value] object V was initialized ** using [sqlite3_bind_pointer(S,I,P,X,D)] or [sqlite3_result_pointer(C,P,X,D)] ** and if X and Y are strings that compare equal according to strcmp(X,Y), ** then sqlite3_value_pointer(V,Y) will return the pointer P. ^Otherwise, -** sqlite3_value_pointer(V,Y) returns a NULL. The sqlite3_bind_pointer() +** sqlite3_value_pointer(V,Y) returns a NULL. The sqlite3_bind_pointer() ** routine is part of the [pointer passing interface] added for SQLite 3.20.0. ** ** ^(The sqlite3_value_type(V) interface returns the @@ -6271,7 +6271,7 @@ SQLITE_API void sqlite3_value_free(sqlite3_value*); ** Implementations of aggregate SQL functions use this ** routine to allocate memory for storing their state. ** -** ^The first time the sqlite3_aggregate_context(C,N) routine is called +** ^The first time the sqlite3_aggregate_context(C,N) routine is called ** for a particular aggregate function, SQLite ** allocates N of memory, zeroes out that memory, and returns a pointer ** to the new memory. ^On second and subsequent calls to @@ -6284,7 +6284,7 @@ SQLITE_API void sqlite3_value_free(sqlite3_value*); ** In those cases, sqlite3_aggregate_context() might be called for the ** first time from within xFinal().)^ ** -** ^The sqlite3_aggregate_context(C,N) routine returns a NULL pointer +** ^The sqlite3_aggregate_context(C,N) routine returns a NULL pointer ** when first called if N is less than or equal to zero or if a memory ** allocate error occurs. ** @@ -6293,10 +6293,10 @@ SQLITE_API void sqlite3_value_free(sqlite3_value*); ** value of N in subsequent call to sqlite3_aggregate_context() within ** the same aggregate function instance will not resize the memory ** allocation.)^ Within the xFinal callback, it is customary to set -** N=0 in calls to sqlite3_aggregate_context(C,N) so that no +** N=0 in calls to sqlite3_aggregate_context(C,N) so that no ** pointless memory allocations occur. ** -** ^SQLite automatically frees the memory allocated by +** ^SQLite automatically frees the memory allocated by ** sqlite3_aggregate_context() when the aggregate query concludes. ** ** The first parameter must be a copy of the @@ -6346,7 +6346,7 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); ** some circumstances the associated metadata may be preserved. An example ** of where this might be useful is in a regular-expression matching ** function. The compiled version of the regular expression can be stored as -** metadata associated with the pattern string. +** metadata associated with the pattern string. ** Then as long as the pattern string remains the same, ** the compiled regular expression can be reused on multiple ** invocations of the same function. @@ -6372,10 +6372,10 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); ** SQL statement)^, or **
  19. ^(when sqlite3_set_auxdata() is invoked again on the same ** parameter)^, or -**
  20. ^(during the original sqlite3_set_auxdata() call when a memory +**
  21. ^(during the original sqlite3_set_auxdata() call when a memory ** allocation error occurs.)^ ** -** Note the last bullet in particular. The destructor X in +** Note the last bullet in particular. The destructor X in ** sqlite3_set_auxdata(C,N,P,X) might be called immediately, before the ** sqlite3_set_auxdata() interface even returns. Hence sqlite3_set_auxdata() ** should be called near the end of the function implementation and the @@ -6528,7 +6528,7 @@ typedef void (*sqlite3_destructor_type)(void*); ** ** ^The sqlite3_result_pointer(C,P,T,D) interface sets the result to an ** SQL NULL value, just like [sqlite3_result_null(C)], except that it -** also associates the host-language pointer P or type T with that +** also associates the host-language pointer P or type T with that ** NULL value such that the pointer can be retrieved within an ** [application-defined SQL function] using [sqlite3_value_pointer()]. ** ^If the D parameter is not NULL, then it is a pointer to a destructor @@ -6570,8 +6570,8 @@ SQLITE_API int sqlite3_result_zeroblob64(sqlite3_context*, sqlite3_uint64 n); ** METHOD: sqlite3_context ** ** The sqlite3_result_subtype(C,T) function causes the subtype of -** the result from the [application-defined SQL function] with -** [sqlite3_context] C to be the value T. Only the lower 8 bits +** the result from the [application-defined SQL function] with +** [sqlite3_context] C to be the value T. Only the lower 8 bits ** of the subtype T are preserved in current versions of SQLite; ** higher order bits are discarded. ** The number of subtype bytes preserved by SQLite might increase @@ -6618,7 +6618,7 @@ SQLITE_API void sqlite3_result_subtype(sqlite3_context*,unsigned int); ** deleted. ^When all collating functions having the same name are deleted, ** that collation is no longer usable. ** -** ^The collating function callback is invoked with a copy of the pArg +** ^The collating function callback is invoked with a copy of the pArg ** application data pointer and with two strings in the encoding specified ** by the eTextRep argument. The collating function must return an ** integer that is negative, zero, or positive @@ -6648,36 +6648,36 @@ SQLITE_API void sqlite3_result_subtype(sqlite3_context*,unsigned int); ** calls to the collation creation functions or when the ** [database connection] is closed using [sqlite3_close()]. ** -** ^The xDestroy callback is not called if the +** ^The xDestroy callback is not called if the ** sqlite3_create_collation_v2() function fails. Applications that invoke -** sqlite3_create_collation_v2() with a non-NULL xDestroy argument should +** sqlite3_create_collation_v2() with a non-NULL xDestroy argument should ** check the return code and dispose of the application data pointer ** themselves rather than expecting SQLite to deal with it for them. -** This is different from every other SQLite interface. The inconsistency -** is unfortunate but cannot be changed without breaking backwards +** This is different from every other SQLite interface. The inconsistency +** is unfortunate but cannot be changed without breaking backwards ** compatibility. ** ** See also: [sqlite3_collation_needed()] and [sqlite3_collation_needed16()]. */ SQLITE_API int sqlite3_create_collation( - sqlite3*, - const char *zName, - int eTextRep, + sqlite3*, + const char *zName, + int eTextRep, void *pArg, int(*xCompare)(void*,int,const void*,int,const void*) ); SQLITE_API int sqlite3_create_collation_v2( - sqlite3*, - const char *zName, - int eTextRep, + sqlite3*, + const char *zName, + int eTextRep, void *pArg, int(*xCompare)(void*,int,const void*,int,const void*), void(*xDestroy)(void*) ); SQLITE_API int sqlite3_create_collation16( - sqlite3*, + sqlite3*, const void *zName, - int eTextRep, + int eTextRep, void *pArg, int(*xCompare)(void*,int,const void*,int,const void*) ); @@ -6710,12 +6710,12 @@ SQLITE_API int sqlite3_create_collation16( ** [sqlite3_create_collation_v2()]. */ SQLITE_API int sqlite3_collation_needed( - sqlite3*, - void*, + sqlite3*, + void*, void(*)(void*,sqlite3*,int eTextRep,const char*) ); SQLITE_API int sqlite3_collation_needed16( - sqlite3*, + sqlite3*, void*, void(*)(void*,sqlite3*,int eTextRep,const void*) ); @@ -6757,7 +6757,7 @@ SQLITE_API int sqlite3_rekey_v2( ); /* -** Specify the activation key for a SEE database. Unless +** Specify the activation key for a SEE database. Unless ** activated, none of the SEE routines will work. */ SQLITE_API void sqlite3_activate_see( @@ -6767,7 +6767,7 @@ SQLITE_API void sqlite3_activate_see( #ifdef SQLITE_ENABLE_CEROD /* -** Specify the activation key for a CEROD database. Unless +** Specify the activation key for a CEROD database. Unless ** activated, none of the CEROD routines will work. */ SQLITE_API void sqlite3_activate_cerod( @@ -6823,7 +6823,7 @@ SQLITE_API int sqlite3_sleep(int); ** ^The [temp_store_directory pragma] may modify this variable and cause ** it to point to memory obtained from [sqlite3_malloc]. ^Furthermore, ** the [temp_store_directory pragma] always assumes that any string -** that this variable points to is held in memory obtained from +** that this variable points to is held in memory obtained from ** [sqlite3_malloc] and the pragma may attempt to free that memory ** using [sqlite3_free]. ** Hence, if this variable is modified directly, either it should be @@ -6880,7 +6880,7 @@ SQLITE_API char *sqlite3_temp_directory; ** ^The [data_store_directory pragma] may modify this variable and cause ** it to point to memory obtained from [sqlite3_malloc]. ^Furthermore, ** the [data_store_directory pragma] always assumes that any string -** that this variable points to is held in memory obtained from +** that this variable points to is held in memory obtained from ** [sqlite3_malloc] and the pragma may attempt to free that memory ** using [sqlite3_free]. ** Hence, if this variable is modified directly, either it should be @@ -7104,7 +7104,7 @@ SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); ** and [sqlite3_preupdate_hook()] interfaces. */ SQLITE_API void *sqlite3_update_hook( - sqlite3*, + sqlite3*, void(*)(void *,int ,char const *,char const *,sqlite3_int64), void* ); @@ -7118,7 +7118,7 @@ SQLITE_API void *sqlite3_update_hook( ** and disabled if the argument is false.)^ ** ** ^Cache sharing is enabled and disabled for an entire process. -** This is a change as of SQLite [version 3.5.0] ([dateof:3.5.0]). +** This is a change as of SQLite [version 3.5.0] ([dateof:3.5.0]). ** In prior versions of SQLite, ** sharing was enabled or disabled for each thread separately. ** @@ -7135,8 +7135,8 @@ SQLITE_API void *sqlite3_update_hook( ** cache setting should set it explicitly. ** ** Note: This method is disabled on MacOS X 10.7 and iOS version 5.0 -** and will always return SQLITE_MISUSE. On those systems, -** shared cache mode should be enabled per-database connection via +** and will always return SQLITE_MISUSE. On those systems, +** shared cache mode should be enabled per-database connection via ** [sqlite3_open_v2()] with [SQLITE_OPEN_SHAREDCACHE]. ** ** This interface is threadsafe on processors where writing a @@ -7186,7 +7186,7 @@ SQLITE_API int sqlite3_db_release_memory(sqlite3*); ** as heap memory usages approaches the limit. ** ^The soft heap limit is "soft" because even though SQLite strives to stay ** below the limit, it will exceed the limit rather than generate -** an [SQLITE_NOMEM] error. In other words, the soft heap limit +** an [SQLITE_NOMEM] error. In other words, the soft heap limit ** is advisory only. ** ** ^The return value from sqlite3_soft_heap_limit64() is the size of @@ -7213,7 +7213,7 @@ SQLITE_API int sqlite3_db_release_memory(sqlite3*); ** from the heap. ** )^ ** -** Beginning with SQLite [version 3.7.3] ([dateof:3.7.3]), +** Beginning with SQLite [version 3.7.3] ([dateof:3.7.3]), ** the soft heap limit is enforced ** regardless of whether or not the [SQLITE_ENABLE_MEMORY_MANAGEMENT] ** compile-time option is invoked. With [SQLITE_ENABLE_MEMORY_MANAGEMENT], @@ -7291,7 +7291,7 @@ SQLITE_API SQLITE_DEPRECATED void sqlite3_soft_heap_limit(int N); ** ** ^If the specified table is actually a view, an [error code] is returned. ** -** ^If the specified column is "rowid", "oid" or "_rowid_" and the table +** ^If the specified column is "rowid", "oid" or "_rowid_" and the table ** is not a [WITHOUT ROWID] table and an ** [INTEGER PRIMARY KEY] column has been explicitly declared, then the output ** parameters are set for the explicitly declared column. ^(If there is no @@ -7357,7 +7357,7 @@ SQLITE_API int sqlite3_table_column_metadata( ** prior to calling this API, ** otherwise an error will be returned. ** -** Security warning: It is recommended that the +** Security warning: It is recommended that the ** [SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION] method be used to enable only this ** interface. The use of the [sqlite3_enable_load_extension()] interface ** should be avoided. This will keep the SQL function [load_extension()] @@ -7444,7 +7444,7 @@ SQLITE_API int sqlite3_auto_extension(void(*xEntryPoint)(void)); ** ^The [sqlite3_cancel_auto_extension(X)] interface unregisters the ** initialization routine X that was registered using a prior call to ** [sqlite3_auto_extension(X)]. ^The [sqlite3_cancel_auto_extension(X)] -** routine returns 1 if initialization routine X was successfully +** routine returns 1 if initialization routine X was successfully ** unregistered and it returns 0 if X was not on the list of initialization ** routines. */ @@ -7479,8 +7479,8 @@ typedef struct sqlite3_module sqlite3_module; ** CAPI3REF: Virtual Table Object ** KEYWORDS: sqlite3_module {virtual table module} ** -** This structure, sometimes called a "virtual table module", -** defines the implementation of a [virtual tables]. +** This structure, sometimes called a "virtual table module", +** defines the implementation of a [virtual tables]. ** This structure consists mostly of methods for the module. ** ** ^A virtual table module is created by filling in a persistent @@ -7519,7 +7519,7 @@ struct sqlite3_module { void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), void **ppArg); int (*xRename)(sqlite3_vtab *pVtab, const char *zNew); - /* The methods above are in version 1 of the sqlite_module object. Those + /* The methods above are in version 1 of the sqlite_module object. Those ** below are for version 2 and greater. */ int (*xSavepoint)(sqlite3_vtab *pVTab, int); int (*xRelease)(sqlite3_vtab *pVTab, int); @@ -7569,7 +7569,7 @@ struct sqlite3_module { ** required by SQLite. If the table has at least 64 columns and any column ** to the right of the first 63 is required, then bit 63 of colUsed is also ** set. In other words, column iCol may be required if the expression -** (colUsed & ((sqlite3_uint64)1 << (iCol>=63 ? 63 : iCol))) evaluates to +** (colUsed & ((sqlite3_uint64)1 << (iCol>=63 ? 63 : iCol))) evaluates to ** non-zero. ** ** The [xBestIndex] method must fill aConstraintUsage[] with information @@ -7590,17 +7590,17 @@ struct sqlite3_module { ** ** ^The estimatedCost value is an estimate of the cost of a particular ** strategy. A cost of N indicates that the cost of the strategy is similar -** to a linear scan of an SQLite table with N rows. A cost of log(N) +** to a linear scan of an SQLite table with N rows. A cost of log(N) ** indicates that the expense of the operation is similar to that of a ** binary search on a unique indexed field of an SQLite table with N rows. ** ** ^The estimatedRows value is an estimate of the number of rows that ** will be returned by the strategy. ** -** The xBestIndex method may optionally populate the idxFlags field with a +** The xBestIndex method may optionally populate the idxFlags field with a ** mask of SQLITE_INDEX_SCAN_* flags. Currently there is only one such flag - ** SQLITE_INDEX_SCAN_UNIQUE. If the xBestIndex method sets this flag, SQLite -** assumes that the strategy may visit at most one row. +** assumes that the strategy may visit at most one row. ** ** Additionally, if xBestIndex sets the SQLITE_INDEX_SCAN_UNIQUE flag, then ** SQLite also assumes that if a call to the xUpdate() method is made as @@ -7613,14 +7613,14 @@ struct sqlite3_module { ** the xUpdate method are automatically rolled back by SQLite. ** ** IMPORTANT: The estimatedRows field was added to the sqlite3_index_info -** structure for SQLite [version 3.8.2] ([dateof:3.8.2]). +** structure for SQLite [version 3.8.2] ([dateof:3.8.2]). ** If a virtual table extension is -** used with an SQLite version earlier than 3.8.2, the results of attempting -** to read or write the estimatedRows field are undefined (but are likely +** used with an SQLite version earlier than 3.8.2, the results of attempting +** to read or write the estimatedRows field are undefined (but are likely ** to included crashing the application). The estimatedRows field should ** therefore only be used if [sqlite3_libversion_number()] returns a ** value greater than or equal to 3008002. Similarly, the idxFlags field -** was added for [version 3.9.0] ([dateof:3.9.0]). +** was added for [version 3.9.0] ([dateof:3.9.0]). ** It may therefore only be used if ** sqlite3_libversion_number() returns a value greater than or equal to ** 3009000. @@ -7660,7 +7660,7 @@ struct sqlite3_index_info { /* ** CAPI3REF: Virtual Table Scan Flags ** -** Virtual table implementations are allowed to set the +** Virtual table implementations are allowed to set the ** [sqlite3_index_info].idxFlags field to some combination of ** these bits. */ @@ -7700,7 +7700,7 @@ struct sqlite3_index_info { ** preexisting [virtual table] for the module. ** ** ^The module name is registered on the [database connection] specified -** by the first parameter. ^The name of the module is given by the +** by the first parameter. ^The name of the module is given by the ** second parameter. ^The third parameter is a pointer to ** the implementation of the [virtual table module]. ^The fourth ** parameter is an arbitrary client data pointer that is passed through @@ -7815,7 +7815,7 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3*, const char *zSQL); ** METHOD: sqlite3 ** ** ^(Virtual tables can provide alternative implementations of functions -** using the [xFindFunction] method of the [virtual table module]. +** using the [xFindFunction] method of the [virtual table module]. ** But global versions of those functions ** must exist in order to be overloaded.)^ ** @@ -7866,7 +7866,7 @@ typedef struct sqlite3_blob sqlite3_blob; ** SELECT zColumn FROM zDb.zTable WHERE [rowid] = iRow; **
)^ ** -** ^(Parameter zDb is not the filename that contains the database, but +** ^(Parameter zDb is not the filename that contains the database, but ** rather the symbolic name of the database. For attached databases, this is ** the name that appears after the AS keyword in the [ATTACH] statement. ** For the main database file, the database name is "main". For TEMP @@ -7879,28 +7879,28 @@ typedef struct sqlite3_blob sqlite3_blob; ** ^(On success, [SQLITE_OK] is returned and the new [BLOB handle] is stored ** in *ppBlob. Otherwise an [error code] is returned and, unless the error ** code is SQLITE_MISUSE, *ppBlob is set to NULL.)^ ^This means that, provided -** the API is not misused, it is always safe to call [sqlite3_blob_close()] +** the API is not misused, it is always safe to call [sqlite3_blob_close()] ** on *ppBlob after this function it returns. ** ** This function fails with SQLITE_ERROR if any of the following are true: **
    -**
  • ^(Database zDb does not exist)^, -**
  • ^(Table zTable does not exist within database zDb)^, -**
  • ^(Table zTable is a WITHOUT ROWID table)^, +**
  • ^(Database zDb does not exist)^, +**
  • ^(Table zTable does not exist within database zDb)^, +**
  • ^(Table zTable is a WITHOUT ROWID table)^, **
  • ^(Column zColumn does not exist)^, **
  • ^(Row iRow is not present in the table)^, **
  • ^(The specified column of row iRow contains a value that is not ** a TEXT or BLOB value)^, -**
  • ^(Column zColumn is part of an index, PRIMARY KEY or UNIQUE +**
  • ^(Column zColumn is part of an index, PRIMARY KEY or UNIQUE ** constraint and the blob is being opened for read/write access)^, -**
  • ^([foreign key constraints | Foreign key constraints] are enabled, +**
  • ^([foreign key constraints | Foreign key constraints] are enabled, ** column zColumn is part of a [child key] definition and the blob is ** being opened for read/write access)^. **
** -** ^Unless it returns SQLITE_MISUSE, this function sets the -** [database connection] error code and message accessible via -** [sqlite3_errcode()] and [sqlite3_errmsg()] and related functions. +** ^Unless it returns SQLITE_MISUSE, this function sets the +** [database connection] error code and message accessible via +** [sqlite3_errcode()] and [sqlite3_errmsg()] and related functions. ** ** A BLOB referenced by sqlite3_blob_open() may be read using the ** [sqlite3_blob_read()] interface and modified by using @@ -7926,7 +7926,7 @@ typedef struct sqlite3_blob sqlite3_blob; ** blob. ** ** ^The [sqlite3_bind_zeroblob()] and [sqlite3_result_zeroblob()] interfaces -** and the built-in [zeroblob] SQL function may be used to create a +** and the built-in [zeroblob] SQL function may be used to create a ** zero-filled blob to read or write using the incremental-blob interface. ** ** To avoid a resource leak, every open [BLOB handle] should eventually @@ -7976,7 +7976,7 @@ SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *, sqlite3_int64); ** DESTRUCTOR: sqlite3_blob ** ** ^This function closes an open [BLOB handle]. ^(The BLOB handle is closed -** unconditionally. Even if this routine returns an error code, the +** unconditionally. Even if this routine returns an error code, the ** handle is still closed.)^ ** ** ^If the blob handle being closed was opened for read-write access, and if @@ -7986,10 +7986,10 @@ SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *, sqlite3_int64); ** code is returned and the transaction rolled back. ** ** Calling this function with an argument that is not a NULL pointer or an -** open blob handle results in undefined behaviour. ^Calling this routine -** with a null pointer (such as would be returned by a failed call to +** open blob handle results in undefined behaviour. ^Calling this routine +** with a null pointer (such as would be returned by a failed call to ** [sqlite3_blob_open()]) is a harmless no-op. ^Otherwise, if this function -** is passed a valid open blob handle, the values returned by the +** is passed a valid open blob handle, the values returned by the ** sqlite3_errcode() and sqlite3_errmsg() functions are set before returning. */ SQLITE_API int sqlite3_blob_close(sqlite3_blob *); @@ -7998,7 +7998,7 @@ SQLITE_API int sqlite3_blob_close(sqlite3_blob *); ** CAPI3REF: Return The Size Of An Open BLOB ** METHOD: sqlite3_blob ** -** ^Returns the size in bytes of the BLOB accessible via the +** ^Returns the size in bytes of the BLOB accessible via the ** successfully opened [BLOB handle] in its only argument. ^The ** incremental blob I/O routines can only read or overwriting existing ** blob content; they cannot change the size of a blob. @@ -8049,9 +8049,9 @@ SQLITE_API int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset); ** ** ^(On success, sqlite3_blob_write() returns SQLITE_OK. ** Otherwise, an [error code] or an [extended error code] is returned.)^ -** ^Unless SQLITE_MISUSE is returned, this function sets the -** [database connection] error code and message accessible via -** [sqlite3_errcode()] and [sqlite3_errmsg()] and related functions. +** ^Unless SQLITE_MISUSE is returned, this function sets the +** [database connection] error code and message accessible via +** [sqlite3_errcode()] and [sqlite3_errmsg()] and related functions. ** ** ^If the [BLOB handle] passed as the first argument was not opened for ** writing (the flags parameter to [sqlite3_blob_open()] was zero), @@ -8060,9 +8060,9 @@ SQLITE_API int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset); ** This function may only modify the contents of the BLOB; it is ** not possible to increase the size of a BLOB using this API. ** ^If offset iOffset is less than N bytes from the end of the BLOB, -** [SQLITE_ERROR] is returned and no data is written. The size of the -** BLOB (and hence the maximum value of N+iOffset) can be determined -** using the [sqlite3_blob_bytes()] interface. ^If N or iOffset are less +** [SQLITE_ERROR] is returned and no data is written. The size of the +** BLOB (and hence the maximum value of N+iOffset) can be determined +** using the [sqlite3_blob_bytes()] interface. ^If N or iOffset are less ** than zero [SQLITE_ERROR] is returned and no data is written. ** ** ^An attempt to write to an expired [BLOB handle] fails with an @@ -8214,7 +8214,7 @@ SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*); ** ^(Some systems (for example, Windows 95) do not support the operation ** implemented by sqlite3_mutex_try(). On those systems, sqlite3_mutex_try() ** will always return SQLITE_BUSY. The SQLite core only ever uses -** sqlite3_mutex_try() as an optimization so this is acceptable +** sqlite3_mutex_try() as an optimization so this is acceptable ** behavior.)^ ** ** ^The sqlite3_mutex_leave() routine exits a mutex that was @@ -8377,7 +8377,7 @@ SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex*); ** CAPI3REF: Retrieve the mutex for a database connection ** METHOD: sqlite3 ** -** ^This interface returns a pointer the [sqlite3_mutex] object that +** ^This interface returns a pointer the [sqlite3_mutex] object that ** serializes access to the [database connection] given in the argument ** when the [threading mode] is Serialized. ** ^If the [threading mode] is Single-thread or Multi-thread then this @@ -8404,7 +8404,7 @@ SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*); ** method becomes the return value of this routine. ** ** A few opcodes for [sqlite3_file_control()] are handled directly -** by the SQLite core and never invoke the +** by the SQLite core and never invoke the ** sqlite3_io_methods.xFileControl method. ** ^The [SQLITE_FCNTL_FILE_POINTER] value for the op parameter causes ** a pointer to the underlying [sqlite3_file] object to be written into @@ -8491,7 +8491,7 @@ SQLITE_API int sqlite3_test_control(int op, ...); /* ** CAPI3REF: SQL Keyword Checking ** -** These routines provide access to the set of SQL language keywords +** These routines provide access to the set of SQL language keywords ** recognized by SQLite. Applications can uses these routines to determine ** whether or not a specific identifier needs to be escaped (for example, ** by enclosing in double-quotes) so as not to confuse the parser. @@ -8563,14 +8563,14 @@ typedef struct sqlite3_str sqlite3_str; ** ** ^The [sqlite3_str_new(D)] interface allocates and initializes ** a new [sqlite3_str] object. To avoid memory leaks, the object returned by -** [sqlite3_str_new()] must be freed by a subsequent call to +** [sqlite3_str_new()] must be freed by a subsequent call to ** [sqlite3_str_finish(X)]. ** ** ^The [sqlite3_str_new(D)] interface always returns a pointer to a ** valid [sqlite3_str] object, though in the event of an out-of-memory ** error the returned object might be a special singleton that will -** silently reject new text, always return SQLITE_NOMEM from -** [sqlite3_str_errcode()], always return 0 for +** silently reject new text, always return SQLITE_NOMEM from +** [sqlite3_str_errcode()], always return 0 for ** [sqlite3_str_length()], and always return NULL from ** [sqlite3_str_finish(X)]. It is always safe to use the value ** returned by [sqlite3_str_new(D)] as the sqlite3_str parameter @@ -8606,9 +8606,9 @@ SQLITE_API char *sqlite3_str_finish(sqlite3_str*); ** These interfaces add content to an sqlite3_str object previously obtained ** from [sqlite3_str_new()]. ** -** ^The [sqlite3_str_appendf(X,F,...)] and +** ^The [sqlite3_str_appendf(X,F,...)] and ** [sqlite3_str_vappendf(X,F,V)] interfaces uses the [built-in printf] -** functionality of SQLite to append formatted text onto the end of +** functionality of SQLite to append formatted text onto the end of ** [sqlite3_str] object X. ** ** ^The [sqlite3_str_append(X,S,N)] method appends exactly N bytes from string S @@ -8625,7 +8625,7 @@ SQLITE_API char *sqlite3_str_finish(sqlite3_str*); ** ^This method can be used, for example, to add whitespace indentation. ** ** ^The [sqlite3_str_reset(X)] method resets the string under construction -** inside [sqlite3_str] object X back to zero bytes in length. +** inside [sqlite3_str] object X back to zero bytes in length. ** ** These methods do not return a result code. ^If an error occurs, that fact ** is recorded in the [sqlite3_str] object and can be recovered by a @@ -8727,7 +8727,7 @@ SQLITE_API int sqlite3_status64( **
This parameter records the largest memory allocation request ** handed to [sqlite3_malloc()] or [sqlite3_realloc()] (or their ** internal equivalents). Only the value returned in the -** *pHighwater parameter to [sqlite3_status()] is of interest. +** *pHighwater parameter to [sqlite3_status()] is of interest. ** The value written into the *pCurrent parameter is undefined.
)^ ** ** [[SQLITE_STATUS_MALLOC_COUNT]] ^(
SQLITE_STATUS_MALLOC_COUNT
@@ -8736,11 +8736,11 @@ SQLITE_API int sqlite3_status64( ** ** [[SQLITE_STATUS_PAGECACHE_USED]] ^(
SQLITE_STATUS_PAGECACHE_USED
**
This parameter returns the number of pages used out of the -** [pagecache memory allocator] that was configured using +** [pagecache memory allocator] that was configured using ** [SQLITE_CONFIG_PAGECACHE]. The ** value returned is in pages, not in bytes.
)^ ** -** [[SQLITE_STATUS_PAGECACHE_OVERFLOW]] +** [[SQLITE_STATUS_PAGECACHE_OVERFLOW]] ** ^(
SQLITE_STATUS_PAGECACHE_OVERFLOW
**
This parameter returns the number of bytes of page cache ** allocation which could not be satisfied by the [SQLITE_CONFIG_PAGECACHE] @@ -8753,7 +8753,7 @@ SQLITE_API int sqlite3_status64( ** [[SQLITE_STATUS_PAGECACHE_SIZE]] ^(
SQLITE_STATUS_PAGECACHE_SIZE
**
This parameter records the largest memory allocation request ** handed to [pagecache memory allocator]. Only the value returned in the -** *pHighwater parameter to [sqlite3_status()] is of interest. +** *pHighwater parameter to [sqlite3_status()] is of interest. ** The value written into the *pCurrent parameter is undefined.
)^ ** ** [[SQLITE_STATUS_SCRATCH_USED]]
SQLITE_STATUS_SCRATCH_USED
@@ -8766,7 +8766,7 @@ SQLITE_API int sqlite3_status64( **
No longer used.
** ** [[SQLITE_STATUS_PARSER_STACK]] ^(
SQLITE_STATUS_PARSER_STACK
-**
The *pHighwater parameter records the deepest parser stack. +**
The *pHighwater parameter records the deepest parser stack. ** The *pCurrent value is undefined. The *pHighwater value is only ** meaningful if SQLite is compiled with [YYTRACKMAXSTACKDEPTH].
)^ ** @@ -8788,12 +8788,12 @@ SQLITE_API int sqlite3_status64( ** CAPI3REF: Database Connection Status ** METHOD: sqlite3 ** -** ^This interface is used to retrieve runtime status information +** ^This interface is used to retrieve runtime status information ** about a single [database connection]. ^The first argument is the ** database connection object to be interrogated. ^The second argument ** is an integer constant, taken from the set of ** [SQLITE_DBSTATUS options], that -** determines the parameter to interrogate. The set of +** determines the parameter to interrogate. The set of ** [SQLITE_DBSTATUS options] is likely ** to grow in future releases of SQLite. ** @@ -8828,7 +8828,7 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r ** checked out.)^ ** ** [[SQLITE_DBSTATUS_LOOKASIDE_HIT]] ^(
SQLITE_DBSTATUS_LOOKASIDE_HIT
-**
This parameter returns the number malloc attempts that were +**
This parameter returns the number malloc attempts that were ** satisfied using lookaside memory. Only the high-water value is meaningful; ** the current value is always zero.)^ ** @@ -8853,7 +8853,7 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r ** memory used by all pager caches associated with the database connection.)^ ** ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_USED is always 0. ** -** [[SQLITE_DBSTATUS_CACHE_USED_SHARED]] +** [[SQLITE_DBSTATUS_CACHE_USED_SHARED]] ** ^(
SQLITE_DBSTATUS_CACHE_USED_SHARED
**
This parameter is similar to DBSTATUS_CACHE_USED, except that if a ** pager cache is shared between two or more connections the bytes of heap @@ -8868,7 +8868,7 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r ** [[SQLITE_DBSTATUS_SCHEMA_USED]] ^(
SQLITE_DBSTATUS_SCHEMA_USED
**
This parameter returns the approximate number of bytes of heap ** memory used to store the schema for all databases associated -** with the connection - main, temp, and any [ATTACH]-ed databases.)^ +** with the connection - main, temp, and any [ATTACH]-ed databases.)^ ** ^The full amount of memory used by the schemas is reported, even if the ** schema memory is shared with other database connections due to ** [shared cache mode] being enabled. @@ -8883,13 +8883,13 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r ** ** [[SQLITE_DBSTATUS_CACHE_HIT]] ^(
SQLITE_DBSTATUS_CACHE_HIT
**
This parameter returns the number of pager cache hits that have -** occurred.)^ ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_HIT +** occurred.)^ ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_HIT ** is always 0. **
** ** [[SQLITE_DBSTATUS_CACHE_MISS]] ^(
SQLITE_DBSTATUS_CACHE_MISS
**
This parameter returns the number of pager cache misses that have -** occurred.)^ ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_MISS +** occurred.)^ ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_MISS ** is always 0. **
** @@ -8947,7 +8947,7 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r ** statements. For example, if the number of table steps greatly exceeds ** the number of table searches or result rows, that would tend to indicate ** that the prepared statement is using a full table scan rather than -** an index. +** an index. ** ** ^(This interface is used to retrieve and reset counter values from ** a [prepared statement]. The first argument is the prepared statement @@ -8974,7 +8974,7 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); ** [[SQLITE_STMTSTATUS_FULLSCAN_STEP]]
SQLITE_STMTSTATUS_FULLSCAN_STEP
**
^This is the number of times that SQLite has stepped forward in ** a table as part of a full table scan. Large numbers for this counter -** may indicate opportunities for performance improvement through +** may indicate opportunities for performance improvement through ** careful use of indices.
** ** [[SQLITE_STMTSTATUS_SORT]]
SQLITE_STMTSTATUS_SORT
@@ -8992,14 +8992,14 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); ** [[SQLITE_STMTSTATUS_VM_STEP]]
SQLITE_STMTSTATUS_VM_STEP
**
^This is the number of virtual machine operations executed ** by the prepared statement if that number is less than or equal -** to 2147483647. The number of virtual machine operations can be +** to 2147483647. The number of virtual machine operations can be ** used as a proxy for the total work done by the prepared statement. ** If the number of virtual machine operations exceeds 2147483647 ** then the value returned by this statement status code is undefined. ** ** [[SQLITE_STMTSTATUS_REPREPARE]]
SQLITE_STMTSTATUS_REPREPARE
**
^This is the number of times that the prepare statement has been -** automatically regenerated due to schema changes or change to +** automatically regenerated due to schema changes or change to ** [bound parameters] that might affect the query plan. ** ** [[SQLITE_STMTSTATUS_RUN]]
SQLITE_STMTSTATUS_RUN
@@ -9059,15 +9059,15 @@ struct sqlite3_pcache_page { ** KEYWORDS: {page cache} ** ** ^(The [sqlite3_config]([SQLITE_CONFIG_PCACHE2], ...) interface can -** register an alternative page cache implementation by passing in an +** register an alternative page cache implementation by passing in an ** instance of the sqlite3_pcache_methods2 structure.)^ -** In many applications, most of the heap memory allocated by +** In many applications, most of the heap memory allocated by ** SQLite is used for the page cache. -** By implementing a +** By implementing a ** custom page cache using this API, an application can better control -** the amount of memory consumed by SQLite, the way in which -** that memory is allocated and released, and the policies used to -** determine exactly which parts of a database file are cached and for +** the amount of memory consumed by SQLite, the way in which +** that memory is allocated and released, and the policies used to +** determine exactly which parts of a database file are cached and for ** how long. ** ** The alternative page cache mechanism is an @@ -9080,19 +9080,19 @@ struct sqlite3_pcache_page { ** [sqlite3_config()] returns.)^ ** ** [[the xInit() page cache method]] -** ^(The xInit() method is called once for each effective +** ^(The xInit() method is called once for each effective ** call to [sqlite3_initialize()])^ ** (usually only once during the lifetime of the process). ^(The xInit() ** method is passed a copy of the sqlite3_pcache_methods2.pArg value.)^ -** The intent of the xInit() method is to set up global data structures -** required by the custom page cache implementation. -** ^(If the xInit() method is NULL, then the +** The intent of the xInit() method is to set up global data structures +** required by the custom page cache implementation. +** ^(If the xInit() method is NULL, then the ** built-in default page cache is used instead of the application defined ** page cache.)^ ** ** [[the xShutdown() page cache method]] ** ^The xShutdown() method is called by [sqlite3_shutdown()]. -** It can be used to clean up +** It can be used to clean up ** any outstanding resources before process shutdown, if required. ** ^The xShutdown() method may be NULL. ** @@ -9111,7 +9111,7 @@ struct sqlite3_pcache_page { ** though this is not guaranteed. ^The ** first parameter, szPage, is the size in bytes of the pages that must ** be allocated by the cache. ^szPage will always a power of two. ^The -** second parameter szExtra is a number of bytes of extra storage +** second parameter szExtra is a number of bytes of extra storage ** associated with each page cache entry. ^The szExtra parameter will ** a number less than 250. SQLite will use the ** extra szExtra bytes on each page to store metadata about the underlying @@ -9124,7 +9124,7 @@ struct sqlite3_pcache_page { ** it is purely advisory. ^On a cache where bPurgeable is false, SQLite will ** never invoke xUnpin() except to deliberately delete a page. ** ^In other words, calls to xUnpin() on a cache with bPurgeable set to -** false will always have the "discard" flag set to true. +** false will always have the "discard" flag set to true. ** ^Hence, a cache created with bPurgeable false will ** never contain any unpinned pages. ** @@ -9139,12 +9139,12 @@ struct sqlite3_pcache_page { ** [[the xPagecount() page cache methods]] ** The xPagecount() method must return the number of pages currently ** stored in the cache, both pinned and unpinned. -** +** ** [[the xFetch() page cache methods]] -** The xFetch() method locates a page in the cache and returns a pointer to +** The xFetch() method locates a page in the cache and returns a pointer to ** an sqlite3_pcache_page object associated with that page, or a NULL pointer. ** The pBuf element of the returned sqlite3_pcache_page object will be a -** pointer to a buffer of szPage bytes used to store the content of a +** pointer to a buffer of szPage bytes used to store the content of a ** single database page. The pExtra element of sqlite3_pcache_page will be ** a pointer to the szExtra bytes of extra storage that SQLite has requested ** for each entry in the page cache. @@ -9183,8 +9183,8 @@ struct sqlite3_pcache_page { ** page cache implementation. ^The page cache implementation ** may choose to evict unpinned pages at any time. ** -** The cache must not perform any reference counting. A single -** call to xUnpin() unpins the page regardless of the number of prior calls +** The cache must not perform any reference counting. A single +** call to xUnpin() unpins the page regardless of the number of prior calls ** to xFetch(). ** ** [[the xRekey() page cache methods]] @@ -9224,7 +9224,7 @@ struct sqlite3_pcache_methods2 { int (*xPagecount)(sqlite3_pcache*); sqlite3_pcache_page *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag); void (*xUnpin)(sqlite3_pcache*, sqlite3_pcache_page*, int discard); - void (*xRekey)(sqlite3_pcache*, sqlite3_pcache_page*, + void (*xRekey)(sqlite3_pcache*, sqlite3_pcache_page*, unsigned oldKey, unsigned newKey); void (*xTruncate)(sqlite3_pcache*, unsigned iLimit); void (*xDestroy)(sqlite3_pcache*); @@ -9269,7 +9269,7 @@ typedef struct sqlite3_backup sqlite3_backup; ** ** The backup API copies the content of one database into another. ** It is useful either for creating backups of databases or -** for copying in-memory databases to or from persistent files. +** for copying in-memory databases to or from persistent files. ** ** See Also: [Using the SQLite Online Backup API] ** @@ -9280,36 +9280,36 @@ typedef struct sqlite3_backup sqlite3_backup; ** ^Thus, the backup may be performed on a live source database without ** preventing other database connections from ** reading or writing to the source database while the backup is underway. -** -** ^(To perform a backup operation: +** +** ^(To perform a backup operation: **
    **
  1. sqlite3_backup_init() is called once to initialize the -** backup, -**
  2. sqlite3_backup_step() is called one or more times to transfer +** backup, +**
  3. sqlite3_backup_step() is called one or more times to transfer ** the data between the two databases, and finally -**
  4. sqlite3_backup_finish() is called to release all resources -** associated with the backup operation. +**
  5. sqlite3_backup_finish() is called to release all resources +** associated with the backup operation. **
)^ ** There should be exactly one call to sqlite3_backup_finish() for each ** successful call to sqlite3_backup_init(). ** ** [[sqlite3_backup_init()]] sqlite3_backup_init() ** -** ^The D and N arguments to sqlite3_backup_init(D,N,S,M) are the -** [database connection] associated with the destination database +** ^The D and N arguments to sqlite3_backup_init(D,N,S,M) are the +** [database connection] associated with the destination database ** and the database name, respectively. ** ^The database name is "main" for the main database, "temp" for the ** temporary database, or the name specified after the AS keyword in ** an [ATTACH] statement for an attached database. -** ^The S and M arguments passed to +** ^The S and M arguments passed to ** sqlite3_backup_init(D,N,S,M) identify the [database connection] ** and database name of the source database, respectively. ** ^The source and destination [database connections] (parameters S and D) ** must be different or else sqlite3_backup_init(D,N,S,M) will fail with ** an error. ** -** ^A call to sqlite3_backup_init() will fail, returning NULL, if -** there is already a read or read-write transaction open on the +** ^A call to sqlite3_backup_init() will fail, returning NULL, if +** there is already a read or read-write transaction open on the ** destination database. ** ** ^If an error occurs within sqlite3_backup_init(D,N,S,M), then NULL is @@ -9321,14 +9321,14 @@ typedef struct sqlite3_backup sqlite3_backup; ** ^A successful call to sqlite3_backup_init() returns a pointer to an ** [sqlite3_backup] object. ** ^The [sqlite3_backup] object may be used with the sqlite3_backup_step() and -** sqlite3_backup_finish() functions to perform the specified backup +** sqlite3_backup_finish() functions to perform the specified backup ** operation. ** ** [[sqlite3_backup_step()]] sqlite3_backup_step() ** -** ^Function sqlite3_backup_step(B,N) will copy up to N pages between +** ^Function sqlite3_backup_step(B,N) will copy up to N pages between ** the source and destination databases specified by [sqlite3_backup] object B. -** ^If N is negative, all remaining source pages are copied. +** ^If N is negative, all remaining source pages are copied. ** ^If sqlite3_backup_step(B,N) successfully copies N pages and there ** are still more pages to be copied, then the function returns [SQLITE_OK]. ** ^If sqlite3_backup_step(B,N) successfully finishes copying all pages @@ -9350,8 +9350,8 @@ typedef struct sqlite3_backup sqlite3_backup; ** ** ^If sqlite3_backup_step() cannot obtain a required file-system lock, then ** the [sqlite3_busy_handler | busy-handler function] -** is invoked (if one is specified). ^If the -** busy-handler returns non-zero before the lock is available, then +** is invoked (if one is specified). ^If the +** busy-handler returns non-zero before the lock is available, then ** [SQLITE_BUSY] is returned to the caller. ^In this case the call to ** sqlite3_backup_step() can be retried later. ^If the source ** [database connection] @@ -9359,15 +9359,15 @@ typedef struct sqlite3_backup sqlite3_backup; ** is called, then [SQLITE_LOCKED] is returned immediately. ^Again, in this ** case the call to sqlite3_backup_step() can be retried later on. ^(If ** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX], [SQLITE_NOMEM], or -** [SQLITE_READONLY] is returned, then -** there is no point in retrying the call to sqlite3_backup_step(). These -** errors are considered fatal.)^ The application must accept -** that the backup operation has failed and pass the backup operation handle +** [SQLITE_READONLY] is returned, then +** there is no point in retrying the call to sqlite3_backup_step(). These +** errors are considered fatal.)^ The application must accept +** that the backup operation has failed and pass the backup operation handle ** to the sqlite3_backup_finish() to release associated resources. ** ** ^The first call to sqlite3_backup_step() obtains an exclusive lock -** on the destination file. ^The exclusive lock is not released until either -** sqlite3_backup_finish() is called or the backup operation is complete +** on the destination file. ^The exclusive lock is not released until either +** sqlite3_backup_finish() is called or the backup operation is complete ** and sqlite3_backup_step() returns [SQLITE_DONE]. ^Every call to ** sqlite3_backup_step() obtains a [shared lock] on the source database that ** lasts for the duration of the sqlite3_backup_step() call. @@ -9376,18 +9376,18 @@ typedef struct sqlite3_backup sqlite3_backup; ** through the backup process. ^If the source database is modified by an ** external process or via a database connection other than the one being ** used by the backup operation, then the backup will be automatically -** restarted by the next call to sqlite3_backup_step(). ^If the source +** restarted by the next call to sqlite3_backup_step(). ^If the source ** database is modified by the using the same database connection as is used ** by the backup operation, then the backup database is automatically ** updated at the same time. ** ** [[sqlite3_backup_finish()]] sqlite3_backup_finish() ** -** When sqlite3_backup_step() has returned [SQLITE_DONE], or when the +** When sqlite3_backup_step() has returned [SQLITE_DONE], or when the ** application wishes to abandon the backup operation, the application ** should destroy the [sqlite3_backup] by passing it to sqlite3_backup_finish(). ** ^The sqlite3_backup_finish() interfaces releases all -** resources associated with the [sqlite3_backup] object. +** resources associated with the [sqlite3_backup] object. ** ^If sqlite3_backup_step() has not yet returned [SQLITE_DONE], then any ** active write-transaction on the destination database is rolled back. ** The [sqlite3_backup] object is invalid @@ -9427,8 +9427,8 @@ typedef struct sqlite3_backup sqlite3_backup; ** connections, then the source database connection may be used concurrently ** from within other threads. ** -** However, the application must guarantee that the destination -** [database connection] is not passed to any other API (by any thread) after +** However, the application must guarantee that the destination +** [database connection] is not passed to any other API (by any thread) after ** sqlite3_backup_init() is called and before the corresponding call to ** sqlite3_backup_finish(). SQLite does not currently check to see ** if the application incorrectly accesses the destination [database connection] @@ -9439,11 +9439,11 @@ typedef struct sqlite3_backup sqlite3_backup; ** If running in [shared cache mode], the application must ** guarantee that the shared cache used by the destination database ** is not accessed while the backup is running. In practice this means -** that the application must guarantee that the disk file being +** that the application must guarantee that the disk file being ** backed up to is not accessed by any connection within the process, ** not just the specific connection that was passed to sqlite3_backup_init(). ** -** The [sqlite3_backup] object itself is partially threadsafe. Multiple +** The [sqlite3_backup] object itself is partially threadsafe. Multiple ** threads may safely make multiple concurrent calls to sqlite3_backup_step(). ** However, the sqlite3_backup_remaining() and sqlite3_backup_pagecount() ** APIs are not strictly speaking threadsafe. If they are invoked at the @@ -9468,8 +9468,8 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); ** ^When running in shared-cache mode, a database operation may fail with ** an [SQLITE_LOCKED] error if the required locks on the shared-cache or ** individual tables within the shared-cache cannot be obtained. See -** [SQLite Shared-Cache Mode] for a description of shared-cache locking. -** ^This API may be used to register a callback that SQLite will invoke +** [SQLite Shared-Cache Mode] for a description of shared-cache locking. +** ^This API may be used to register a callback that SQLite will invoke ** when the connection currently holding the required lock relinquishes it. ** ^This API is only available if the library was compiled with the ** [SQLITE_ENABLE_UNLOCK_NOTIFY] C-preprocessor symbol defined. @@ -9477,14 +9477,14 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); ** See Also: [Using the SQLite Unlock Notification Feature]. ** ** ^Shared-cache locks are released when a database connection concludes -** its current transaction, either by committing it or rolling it back. +** its current transaction, either by committing it or rolling it back. ** ** ^When a connection (known as the blocked connection) fails to obtain a ** shared-cache lock and SQLITE_LOCKED is returned to the caller, the ** identity of the database connection (the blocking connection) that -** has locked the required resource is stored internally. ^After an +** has locked the required resource is stored internally. ^After an ** application receives an SQLITE_LOCKED error, it may call the -** sqlite3_unlock_notify() method with the blocked connection handle as +** sqlite3_unlock_notify() method with the blocked connection handle as ** the first argument to register for a callback that will be invoked ** when the blocking connections current transaction is concluded. ^The ** callback is invoked from within the [sqlite3_step] or [sqlite3_close] @@ -9498,15 +9498,15 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); ** ** ^If the blocked connection is attempting to obtain a write-lock on a ** shared-cache table, and more than one other connection currently holds -** a read-lock on the same table, then SQLite arbitrarily selects one of +** a read-lock on the same table, then SQLite arbitrarily selects one of ** the other connections to use as the blocking connection. ** -** ^(There may be at most one unlock-notify callback registered by a +** ^(There may be at most one unlock-notify callback registered by a ** blocked connection. If sqlite3_unlock_notify() is called when the ** blocked connection already has a registered unlock-notify callback, ** then the new callback replaces the old.)^ ^If sqlite3_unlock_notify() is ** called with a NULL pointer as its second argument, then any existing -** unlock-notify callback is canceled. ^The blocked connections +** unlock-notify callback is canceled. ^The blocked connections ** unlock-notify callback may also be canceled by closing the blocked ** connection using [sqlite3_close()]. ** @@ -9519,7 +9519,7 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); ** ** Callback Invocation Details ** -** When an unlock-notify callback is registered, the application provides a +** When an unlock-notify callback is registered, the application provides a ** single void* pointer that is passed to the callback when it is invoked. ** However, the signature of the callback function allows SQLite to pass ** it an array of void* context pointers. The first argument passed to @@ -9532,12 +9532,12 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); ** same callback function, then instead of invoking the callback function ** multiple times, it is invoked once with the set of void* context pointers ** specified by the blocked connections bundled together into an array. -** This gives the application an opportunity to prioritize any actions +** This gives the application an opportunity to prioritize any actions ** related to the set of unblocked database connections. ** ** Deadlock Detection ** -** Assuming that after registering for an unlock-notify callback a +** Assuming that after registering for an unlock-notify callback a ** database waits for the callback to be issued before taking any further ** action (a reasonable assumption), then using this API may cause the ** application to deadlock. For example, if connection X is waiting for @@ -9560,7 +9560,7 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); ** ** The "DROP TABLE" Exception ** -** When a call to [sqlite3_step()] returns SQLITE_LOCKED, it is almost +** When a call to [sqlite3_step()] returns SQLITE_LOCKED, it is almost ** always appropriate to call sqlite3_unlock_notify(). There is however, ** one exception. When executing a "DROP TABLE" or "DROP INDEX" statement, ** SQLite checks if there are any currently executing SELECT statements @@ -9573,7 +9573,7 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); ** One way around this problem is to check the extended error code returned ** by an sqlite3_step() call. ^(If there is a blocking connection, then the ** extended error code is set to SQLITE_LOCKED_SHAREDCACHE. Otherwise, in -** the special "DROP TABLE/INDEX" case, the extended error code is just +** the special "DROP TABLE/INDEX" case, the extended error code is just ** SQLITE_LOCKED.)^ */ SQLITE_API int sqlite3_unlock_notify( @@ -9664,8 +9664,8 @@ SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...); ** ^The [sqlite3_wal_hook()] function is used to register a callback that ** is invoked each time data is committed to a database in wal mode. ** -** ^(The callback is invoked by SQLite after the commit has taken place and -** the associated write-lock on the database released)^, so the implementation +** ^(The callback is invoked by SQLite after the commit has taken place and +** the associated write-lock on the database released)^, so the implementation ** may read, write or [checkpoint] the database as required. ** ** ^The first parameter passed to the callback function when it is invoked @@ -9684,7 +9684,7 @@ SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...); ** that does not correspond to any valid SQLite error code, the results ** are undefined. ** -** A single database handle may have at most a single write-ahead log callback +** A single database handle may have at most a single write-ahead log callback ** registered at one time. ^Calling [sqlite3_wal_hook()] replaces any ** previously registered write-ahead log callback. ^Note that the ** [sqlite3_wal_autocheckpoint()] interface and the @@ -9692,7 +9692,7 @@ SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...); ** overwrite any prior [sqlite3_wal_hook()] settings. */ SQLITE_API void *sqlite3_wal_hook( - sqlite3*, + sqlite3*, int(*)(void *,sqlite3*,const char*,int), void* ); @@ -9705,7 +9705,7 @@ SQLITE_API void *sqlite3_wal_hook( ** [sqlite3_wal_hook()] that causes any database on [database connection] D ** to automatically [checkpoint] ** after committing a transaction if there are N or -** more frames in the [write-ahead log] file. ^Passing zero or +** more frames in the [write-ahead log] file. ^Passing zero or ** a negative value as the nFrame parameter disables automatic ** checkpoints entirely. ** @@ -9735,7 +9735,7 @@ SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3 *db, int N); ** ^(The sqlite3_wal_checkpoint(D,X) is equivalent to ** [sqlite3_wal_checkpoint_v2](D,X,[SQLITE_CHECKPOINT_PASSIVE],0,0).)^ ** -** In brief, sqlite3_wal_checkpoint(D,X) causes the content in the +** In brief, sqlite3_wal_checkpoint(D,X) causes the content in the ** [write-ahead log] for database X on [database connection] D to be ** transferred into the database file and for the write-ahead log to ** be reset. See the [checkpointing] documentation for addition @@ -9761,10 +9761,10 @@ SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb); ** **
**
SQLITE_CHECKPOINT_PASSIVE
-** ^Checkpoint as many frames as possible without waiting for any database -** readers or writers to finish, then sync the database file if all frames +** ^Checkpoint as many frames as possible without waiting for any database +** readers or writers to finish, then sync the database file if all frames ** in the log were checkpointed. ^The [busy-handler callback] -** is never invoked in the SQLITE_CHECKPOINT_PASSIVE mode. +** is never invoked in the SQLITE_CHECKPOINT_PASSIVE mode. ** ^On the other hand, passive mode might leave the checkpoint unfinished ** if there are concurrent readers or writers. ** @@ -9778,9 +9778,9 @@ SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb); ** **
SQLITE_CHECKPOINT_RESTART
** ^This mode works the same way as SQLITE_CHECKPOINT_FULL with the addition -** that after checkpointing the log file it blocks (calls the +** that after checkpointing the log file it blocks (calls the ** [busy-handler callback]) -** until all readers are reading from the database file only. ^This ensures +** until all readers are reading from the database file only. ^This ensures ** that the next writer will restart the log file from the beginning. ** ^Like SQLITE_CHECKPOINT_FULL, this mode blocks new ** database writer attempts while it is pending, but does not impede readers. @@ -9802,31 +9802,31 @@ SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb); ** truncated to zero bytes and so both *pnLog and *pnCkpt will be set to zero. ** ** ^All calls obtain an exclusive "checkpoint" lock on the database file. ^If -** any other process is running a checkpoint operation at the same time, the -** lock cannot be obtained and SQLITE_BUSY is returned. ^Even if there is a +** any other process is running a checkpoint operation at the same time, the +** lock cannot be obtained and SQLITE_BUSY is returned. ^Even if there is a ** busy-handler configured, it will not be invoked in this case. ** -** ^The SQLITE_CHECKPOINT_FULL, RESTART and TRUNCATE modes also obtain the +** ^The SQLITE_CHECKPOINT_FULL, RESTART and TRUNCATE modes also obtain the ** exclusive "writer" lock on the database file. ^If the writer lock cannot be ** obtained immediately, and a busy-handler is configured, it is invoked and ** the writer lock retried until either the busy-handler returns 0 or the lock ** is successfully obtained. ^The busy-handler is also invoked while waiting for ** database readers as described above. ^If the busy-handler returns 0 before ** the writer lock is obtained or while waiting for database readers, the -** checkpoint operation proceeds from that point in the same way as -** SQLITE_CHECKPOINT_PASSIVE - checkpointing as many frames as possible +** checkpoint operation proceeds from that point in the same way as +** SQLITE_CHECKPOINT_PASSIVE - checkpointing as many frames as possible ** without blocking any further. ^SQLITE_BUSY is returned in this case. ** ** ^If parameter zDb is NULL or points to a zero length string, then the -** specified operation is attempted on all WAL databases [attached] to +** specified operation is attempted on all WAL databases [attached] to ** [database connection] db. In this case the -** values written to output parameters *pnLog and *pnCkpt are undefined. ^If -** an SQLITE_BUSY error is encountered when processing one or more of the -** attached WAL databases, the operation is still attempted on any remaining -** attached databases and SQLITE_BUSY is returned at the end. ^If any other -** error occurs while processing an attached database, processing is abandoned -** and the error code is returned to the caller immediately. ^If no error -** (SQLITE_BUSY or otherwise) is encountered while processing the attached +** values written to output parameters *pnLog and *pnCkpt are undefined. ^If +** an SQLITE_BUSY error is encountered when processing one or more of the +** attached WAL databases, the operation is still attempted on any remaining +** attached databases and SQLITE_BUSY is returned at the end. ^If any other +** error occurs while processing an attached database, processing is abandoned +** and the error code is returned to the caller immediately. ^If no error +** (SQLITE_BUSY or otherwise) is encountered while processing the attached ** databases, SQLITE_OK is returned. ** ** ^If database zDb is the name of an attached database that is not in WAL @@ -9903,20 +9903,20 @@ SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...); ** If X is non-zero, then the virtual table implementation guarantees ** that if [xUpdate] returns [SQLITE_CONSTRAINT], it will do so before ** any modifications to internal or persistent data structures have been made. -** If the [ON CONFLICT] mode is ABORT, FAIL, IGNORE or ROLLBACK, SQLite +** If the [ON CONFLICT] mode is ABORT, FAIL, IGNORE or ROLLBACK, SQLite ** is able to roll back a statement or database transaction, and abandon -** or continue processing the current SQL statement as appropriate. +** or continue processing the current SQL statement as appropriate. ** If the ON CONFLICT mode is REPLACE and the [xUpdate] method returns ** [SQLITE_CONSTRAINT], SQLite handles this as if the ON CONFLICT mode ** had been ABORT. ** ** Virtual table implementations that are required to handle OR REPLACE -** must do so within the [xUpdate] method. If a call to the -** [sqlite3_vtab_on_conflict()] function indicates that the current ON -** CONFLICT policy is REPLACE, the virtual table implementation should +** must do so within the [xUpdate] method. If a call to the +** [sqlite3_vtab_on_conflict()] function indicates that the current ON +** CONFLICT policy is REPLACE, the virtual table implementation should ** silently replace the appropriate rows within the xUpdate callback and ** return SQLITE_OK. Or, if this is not possible, it may return -** SQLITE_CONSTRAINT, in which case SQLite falls back to OR ABORT +** SQLITE_CONSTRAINT, in which case SQLite falls back to OR ABORT ** constraint handling. **
*/ @@ -9957,12 +9957,12 @@ SQLITE_API int sqlite3_vtab_nochange(sqlite3_context*); ** CAPI3REF: Determine The Collation For a Virtual Table Constraint ** ** This function may only be called from within a call to the [xBestIndex] -** method of a [virtual table]. +** method of a [virtual table]. ** ** The first argument must be the sqlite3_index_info object that is the ** first parameter to the xBestIndex() method. The second argument must be ** an index into the aConstraint[] array belonging to the sqlite3_index_info -** structure passed to xBestIndex. This function returns a pointer to a buffer +** structure passed to xBestIndex. This function returns a pointer to a buffer ** containing the name of the collation sequence for the corresponding ** constraint. */ @@ -10076,7 +10076,7 @@ SQLITE_API int sqlite3_stmt_scanstatus( int idx, /* Index of loop to report on */ int iScanStatusOp, /* Information desired. SQLITE_SCANSTAT_* */ void *pOut /* Result written here */ -); +); /* ** CAPI3REF: Zero Scan-Status Counters @@ -10094,15 +10094,15 @@ SQLITE_API void sqlite3_stmt_scanstatus_reset(sqlite3_stmt*); ** ** ^If a write-transaction is open on [database connection] D when the ** [sqlite3_db_cacheflush(D)] interface invoked, any dirty -** pages in the pager-cache that are not currently in use are written out +** pages in the pager-cache that are not currently in use are written out ** to disk. A dirty page may be in use if a database cursor created by an ** active SQL statement is reading from it, or if it is page 1 of a database ** file (page 1 is always "in use"). ^The [sqlite3_db_cacheflush(D)] ** interface flushes caches for all schemas - "main", "temp", and ** any [attached] databases. ** -** ^If this function needs to obtain extra database locks before dirty pages -** can be flushed to disk, it does so. ^If those locks cannot be obtained +** ^If this function needs to obtain extra database locks before dirty pages +** can be flushed to disk, it does so. ^If those locks cannot be obtained ** immediately and there is a busy-handler callback configured, it is invoked ** in the usual manner. ^If the required lock still cannot be obtained, then ** the database is skipped and an attempt made to flush any dirty pages @@ -10149,16 +10149,16 @@ SQLITE_API int sqlite3_db_cacheflush(sqlite3*); ** kind of update operation that is about to occur. ** ^(The fourth parameter to the preupdate callback is the name of the ** database within the database connection that is being modified. This -** will be "main" for the main database or "temp" for TEMP tables or +** will be "main" for the main database or "temp" for TEMP tables or ** the name given after the AS keyword in the [ATTACH] statement for attached ** databases.)^ ** ^The fifth parameter to the preupdate callback is the name of the ** table that is being modified. ** ** For an UPDATE or DELETE operation on a [rowid table], the sixth -** parameter passed to the preupdate callback is the initial [rowid] of the +** parameter passed to the preupdate callback is the initial [rowid] of the ** row being modified or deleted. For an INSERT operation on a rowid table, -** or any operation on a WITHOUT ROWID table, the value of the sixth +** or any operation on a WITHOUT ROWID table, the value of the sixth ** parameter is undefined. For an INSERT or UPDATE on a rowid table the ** seventh parameter is the final rowid value of the row being inserted ** or updated. The value of the seventh parameter passed to the callback @@ -10197,7 +10197,7 @@ SQLITE_API int sqlite3_db_cacheflush(sqlite3*); ** ** ^The [sqlite3_preupdate_depth(D)] interface returns 0 if the preupdate ** callback was invoked as a result of a direct insert, update, or delete -** operation; or 1 for inserts, updates, or deletes invoked by top-level +** operation; or 1 for inserts, updates, or deletes invoked by top-level ** triggers; or 2 for changes resulting from triggers called by top-level ** triggers; and so forth. ** @@ -10231,7 +10231,7 @@ SQLITE_API int sqlite3_preupdate_new(sqlite3 *, int, sqlite3_value **); ** The return value is OS-dependent. For example, on unix systems, after ** [sqlite3_open_v2()] returns [SQLITE_CANTOPEN], this interface could be ** called to get back the underlying "errno" that caused the problem, such -** as ENOSPC, EAUTH, EISDIR, and so forth. +** as ENOSPC, EAUTH, EISDIR, and so forth. */ SQLITE_API int sqlite3_system_errno(sqlite3*); @@ -10269,12 +10269,12 @@ typedef struct sqlite3_snapshot { ** [sqlite3_snapshot_get(D,S,P)] interface writes a pointer to the newly ** created [sqlite3_snapshot] object into *P and returns SQLITE_OK. ** If there is not already a read-transaction open on schema S when -** this function is called, one is opened automatically. +** this function is called, one is opened automatically. ** ** The following must be true for this function to succeed. If any of ** the following statements are false when sqlite3_snapshot_get() is ** called, SQLITE_ERROR is returned. The final value of *P is undefined -** in this case. +** in this case. ** **
    **
  • The database handle must not be in [autocommit mode]. @@ -10286,13 +10286,13 @@ typedef struct sqlite3_snapshot { ** **
  • One or more transactions must have been written to the current wal ** file since it was created on disk (by any connection). This means -** that a snapshot cannot be taken on a wal mode database with no wal +** that a snapshot cannot be taken on a wal mode database with no wal ** file immediately after it is first opened. At least one transaction ** must be written to it first. **
** ** This function may also return SQLITE_NOMEM. If it is called with the -** database handle in autocommit mode but fails for some other reason, +** database handle in autocommit mode but fails for some other reason, ** whether or not a read transaction is opened on schema S is undefined. ** ** The [sqlite3_snapshot] object returned from a successful call to @@ -10312,38 +10312,38 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_get( ** CAPI3REF: Start a read transaction on an historical snapshot ** METHOD: sqlite3_snapshot ** -** ^The [sqlite3_snapshot_open(D,S,P)] interface either starts a new read -** transaction or upgrades an existing one for schema S of -** [database connection] D such that the read transaction refers to -** historical [snapshot] P, rather than the most recent change to the -** database. ^The [sqlite3_snapshot_open()] interface returns SQLITE_OK +** ^The [sqlite3_snapshot_open(D,S,P)] interface either starts a new read +** transaction or upgrades an existing one for schema S of +** [database connection] D such that the read transaction refers to +** historical [snapshot] P, rather than the most recent change to the +** database. ^The [sqlite3_snapshot_open()] interface returns SQLITE_OK ** on success or an appropriate [error code] if it fails. ** -** ^In order to succeed, the database connection must not be in +** ^In order to succeed, the database connection must not be in ** [autocommit mode] when [sqlite3_snapshot_open(D,S,P)] is called. If there ** is already a read transaction open on schema S, then the database handle ** must have no active statements (SELECT statements that have been passed -** to sqlite3_step() but not sqlite3_reset() or sqlite3_finalize()). +** to sqlite3_step() but not sqlite3_reset() or sqlite3_finalize()). ** SQLITE_ERROR is returned if either of these conditions is violated, or ** if schema S does not exist, or if the snapshot object is invalid. ** ** ^A call to sqlite3_snapshot_open() will fail to open if the specified -** snapshot has been overwritten by a [checkpoint]. In this case +** snapshot has been overwritten by a [checkpoint]. In this case ** SQLITE_ERROR_SNAPSHOT is returned. ** -** If there is already a read transaction open when this function is +** If there is already a read transaction open when this function is ** invoked, then the same read transaction remains open (on the same ** database snapshot) if SQLITE_ERROR, SQLITE_BUSY or SQLITE_ERROR_SNAPSHOT ** is returned. If another error code - for example SQLITE_PROTOCOL or an ** SQLITE_IOERR error code - is returned, then the final state of the -** read transaction is undefined. If SQLITE_OK is returned, then the +** read transaction is undefined. If SQLITE_OK is returned, then the ** read transaction is now open on database snapshot P. ** ** ^(A call to [sqlite3_snapshot_open(D,S,P)] will fail if the ** database connection D does not know that the database file for ** schema S is in [WAL mode]. A database connection might not know ** that the database file is in [WAL mode] if there has been no prior -** I/O on that database connection, or if the database entered [WAL mode] +** I/O on that database connection, or if the database entered [WAL mode] ** after the most recent I/O on the database connection.)^ ** (Hint: Run "[PRAGMA application_id]" against a newly opened ** database connection in order to make it ready to use snapshots.) @@ -10375,17 +10375,17 @@ SQLITE_API SQLITE_EXPERIMENTAL void sqlite3_snapshot_free(sqlite3_snapshot*); ** METHOD: sqlite3_snapshot ** ** The sqlite3_snapshot_cmp(P1, P2) interface is used to compare the ages -** of two valid snapshot handles. +** of two valid snapshot handles. ** -** If the two snapshot handles are not associated with the same database -** file, the result of the comparison is undefined. +** If the two snapshot handles are not associated with the same database +** file, the result of the comparison is undefined. ** ** Additionally, the result of the comparison is only valid if both of the ** snapshot handles were obtained by calling sqlite3_snapshot_get() since the ** last time the wal file was deleted. The wal file is deleted when the ** database is changed back to rollback mode or when the number of database -** clients drops to zero. If either snapshot handle was obtained before the -** wal file was last deleted, the value returned by this function +** clients drops to zero. If either snapshot handle was obtained before the +** wal file was last deleted, the value returned by this function ** is undefined. ** ** Otherwise, this API returns a negative value if P1 refers to an older @@ -10450,7 +10450,7 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_recover(sqlite3 *db, const c ** representation of the database will usually only exist if there has ** been a prior call to [sqlite3_deserialize(D,S,...)] with the same ** values of D and S. -** The size of the database is written into *P even if the +** The size of the database is written into *P even if the ** SQLITE_SERIALIZE_NOCOPY bit is set but no contiguous copy ** of the database exists. ** @@ -10487,7 +10487,7 @@ SQLITE_API unsigned char *sqlite3_serialize( /* ** CAPI3REF: Deserialize a database ** -** The sqlite3_deserialize(D,S,P,N,M,F) interface causes the +** The sqlite3_deserialize(D,S,P,N,M,F) interface causes the ** [database connection] D to disconnect from database S and then ** reopen S as an in-memory database based on the serialization contained ** in P. The serialized database P is N bytes in size. M is the size of @@ -10506,7 +10506,7 @@ SQLITE_API unsigned char *sqlite3_serialize( ** database is currently in a read transaction or is involved in a backup ** operation. ** -** If sqlite3_deserialize(D,S,P,N,M,F) fails for any reason and if the +** If sqlite3_deserialize(D,S,P,N,M,F) fails for any reason and if the ** SQLITE_DESERIALIZE_FREEONCLOSE bit is set in argument F, then ** [sqlite3_free()] is invoked on argument P prior to returning. ** @@ -10621,7 +10621,7 @@ struct sqlite3_rtree_geometry { }; /* -** Register a 2nd-generation geometry callback named zScore that can be +** Register a 2nd-generation geometry callback named zScore that can be ** used as part of an R-Tree geometry query as follows: ** ** SELECT ... FROM WHERE MATCH $zQueryFunc(... params ...) @@ -10636,7 +10636,7 @@ SQLITE_API int sqlite3_rtree_query_callback( /* -** A pointer to a structure of the following type is passed as the +** A pointer to a structure of the following type is passed as the ** argument to scored geometry callback registered using ** sqlite3_rtree_query_callback(). ** @@ -10731,7 +10731,7 @@ typedef struct sqlite3_changeset_iter sqlite3_changeset_iter; ** is not possible for an application to register a pre-update hook on a ** database handle that has one or more session objects attached. Nor is ** it possible to create a session object attached to a database handle for -** which a pre-update hook is already defined. The results of attempting +** which a pre-update hook is already defined. The results of attempting ** either of these things are undefined. ** ** The session object will be used to create changesets for tables in @@ -10749,13 +10749,13 @@ SQLITE_API int sqlite3session_create( ** CAPI3REF: Delete A Session Object ** DESTRUCTOR: sqlite3_session ** -** Delete a session object previously allocated using +** Delete a session object previously allocated using ** [sqlite3session_create()]. Once a session object has been deleted, the ** results of attempting to use pSession with any other session module ** function are undefined. ** ** Session objects must be deleted before the database handle to which they -** are attached is closed. Refer to the documentation for +** are attached is closed. Refer to the documentation for ** [sqlite3session_create()] for details. */ SQLITE_API void sqlite3session_delete(sqlite3_session *pSession); @@ -10773,10 +10773,10 @@ SQLITE_API void sqlite3session_delete(sqlite3_session *pSession); ** the eventual changesets. ** ** Passing zero to this function disables the session. Passing a value -** greater than zero enables it. Passing a value less than zero is a +** greater than zero enables it. Passing a value less than zero is a ** no-op, and may be used to query the current state of the session. ** -** The return value indicates the final state of the session object: 0 if +** The return value indicates the final state of the session object: 0 if ** the session is disabled, or 1 if it is enabled. */ SQLITE_API int sqlite3session_enable(sqlite3_session *pSession, int bEnable); @@ -10791,7 +10791,7 @@ SQLITE_API int sqlite3session_enable(sqlite3_session *pSession, int bEnable); **
    **
  • The session object "indirect" flag is set when the change is ** made, or -**
  • The change is made by an SQL trigger or foreign key action +**
  • The change is made by an SQL trigger or foreign key action ** instead of directly as a result of a users SQL statement. **
** @@ -10803,10 +10803,10 @@ SQLITE_API int sqlite3session_enable(sqlite3_session *pSession, int bEnable); ** flag. If the second argument passed to this function is zero, then the ** indirect flag is cleared. If it is greater than zero, the indirect flag ** is set. Passing a value less than zero does not modify the current value -** of the indirect flag, and may be used to query the current state of the +** of the indirect flag, and may be used to query the current state of the ** indirect flag for the specified session object. ** -** The return value indicates the final state of the indirect flag: 0 if +** The return value indicates the final state of the indirect flag: 0 if ** it is clear, or 1 if it is set. */ SQLITE_API int sqlite3session_indirect(sqlite3_session *pSession, int bIndirect); @@ -10816,20 +10816,20 @@ SQLITE_API int sqlite3session_indirect(sqlite3_session *pSession, int bIndirect) ** METHOD: sqlite3_session ** ** If argument zTab is not NULL, then it is the name of a table to attach -** to the session object passed as the first argument. All subsequent changes -** made to the table while the session object is enabled will be recorded. See +** to the session object passed as the first argument. All subsequent changes +** made to the table while the session object is enabled will be recorded. See ** documentation for [sqlite3session_changeset()] for further details. ** ** Or, if argument zTab is NULL, then changes are recorded for all tables -** in the database. If additional tables are added to the database (by -** executing "CREATE TABLE" statements) after this call is made, changes for +** in the database. If additional tables are added to the database (by +** executing "CREATE TABLE" statements) after this call is made, changes for ** the new tables are also recorded. ** ** Changes can only be recorded for tables that have a PRIMARY KEY explicitly -** defined as part of their CREATE TABLE statement. It does not matter if the +** defined as part of their CREATE TABLE statement. It does not matter if the ** PRIMARY KEY is an "INTEGER PRIMARY KEY" (rowid alias) or not. The PRIMARY ** KEY may consist of a single column, or may be a composite key. -** +** ** It is not an error if the named table does not exist in the database. Nor ** is it an error if the named table does not have a PRIMARY KEY. However, ** no changes will be recorded in either of these scenarios. @@ -10837,29 +10837,29 @@ SQLITE_API int sqlite3session_indirect(sqlite3_session *pSession, int bIndirect) ** Changes are not recorded for individual rows that have NULL values stored ** in one or more of their PRIMARY KEY columns. ** -** SQLITE_OK is returned if the call completes without error. Or, if an error +** SQLITE_OK is returned if the call completes without error. Or, if an error ** occurs, an SQLite error code (e.g. SQLITE_NOMEM) is returned. ** **

Special sqlite_stat1 Handling

** -** As of SQLite version 3.22.0, the "sqlite_stat1" table is an exception to +** As of SQLite version 3.22.0, the "sqlite_stat1" table is an exception to ** some of the rules above. In SQLite, the schema of sqlite_stat1 is: **
-**        CREATE TABLE sqlite_stat1(tbl,idx,stat)  
+**        CREATE TABLE sqlite_stat1(tbl,idx,stat)
 **  
** -** Even though sqlite_stat1 does not have a PRIMARY KEY, changes are -** recorded for it as if the PRIMARY KEY is (tbl,idx). Additionally, changes +** Even though sqlite_stat1 does not have a PRIMARY KEY, changes are +** recorded for it as if the PRIMARY KEY is (tbl,idx). Additionally, changes ** are recorded for rows for which (idx IS NULL) is true. However, for such ** rows a zero-length blob (SQL value X'') is stored in the changeset or ** patchset instead of a NULL value. This allows such changesets to be ** manipulated by legacy implementations of sqlite3changeset_invert(), ** concat() and similar. ** -** The sqlite3changeset_apply() function automatically converts the +** The sqlite3changeset_apply() function automatically converts the ** zero-length blob back to a NULL value when updating the sqlite_stat1 ** table. However, if the application calls sqlite3changeset_new(), -** sqlite3changeset_old() or sqlite3changeset_conflict on a changeset +** sqlite3changeset_old() or sqlite3changeset_conflict on a changeset ** iterator directly (including on a changeset iterator passed to a ** conflict-handler callback) then the X'' value is returned. The application ** must translate X'' to NULL itself if required. @@ -10878,10 +10878,10 @@ SQLITE_API int sqlite3session_attach( ** CAPI3REF: Set a table filter on a Session Object. ** METHOD: sqlite3_session ** -** The second argument (xFilter) is the "filter callback". For changes to rows +** The second argument (xFilter) is the "filter callback". For changes to rows ** in tables that are not attached to the Session object, the filter is called -** to determine whether changes to the table's rows should be tracked or not. -** If xFilter returns 0, changes is not tracked. Note that once a table is +** to determine whether changes to the table's rows should be tracked or not. +** If xFilter returns 0, changes is not tracked. Note that once a table is ** attached, xFilter will not be called again. */ SQLITE_API void sqlite3session_table_filter( @@ -10897,9 +10897,9 @@ SQLITE_API void sqlite3session_table_filter( ** CAPI3REF: Generate A Changeset From A Session Object ** METHOD: sqlite3_session ** -** Obtain a changeset containing changes to the tables attached to the -** session object passed as the first argument. If successful, -** set *ppChangeset to point to a buffer containing the changeset +** Obtain a changeset containing changes to the tables attached to the +** session object passed as the first argument. If successful, +** set *ppChangeset to point to a buffer containing the changeset ** and *pnChangeset to the size of the changeset in bytes before returning ** SQLITE_OK. If an error occurs, set both *ppChangeset and *pnChangeset to ** zero and return an SQLite error code. @@ -10914,7 +10914,7 @@ SQLITE_API void sqlite3session_table_filter( ** modifies the values of primary key columns. If such a change is made, it ** is represented in a changeset as a DELETE followed by an INSERT. ** -** Changes are not recorded for rows that have NULL values stored in one or +** Changes are not recorded for rows that have NULL values stored in one or ** more of their PRIMARY KEY columns. If such a row is inserted or deleted, ** no corresponding change is present in the changesets returned by this ** function. If an existing row with one or more NULL values stored in @@ -10967,14 +10967,14 @@ SQLITE_API void sqlite3session_table_filter( **
    **
  • For each record generated by an insert, the database is queried ** for a row with a matching primary key. If one is found, an INSERT -** change is added to the changeset. If no such row is found, no change +** change is added to the changeset. If no such row is found, no change ** is added to the changeset. ** -**
  • For each record generated by an update or delete, the database is +**
  • For each record generated by an update or delete, the database is ** queried for a row with a matching primary key. If such a row is ** found and one or more of the non-primary key fields have been -** modified from their original values, an UPDATE change is added to -** the changeset. Or, if no such row is found in the table, a DELETE +** modified from their original values, an UPDATE change is added to +** the changeset. Or, if no such row is found in the table, a DELETE ** change is added to the changeset. If there is a row with a matching ** primary key in the database, but all fields contain their original ** values, no change is added to the changeset. @@ -10982,7 +10982,7 @@ SQLITE_API void sqlite3session_table_filter( ** ** This means, amongst other things, that if a row is inserted and then later ** deleted while a session object is active, neither the insert nor the delete -** will be present in the changeset. Or if a row is deleted and then later a +** will be present in the changeset. Or if a row is deleted and then later a ** row with the same primary key values inserted while a session object is ** active, the resulting changeset will contain an UPDATE change instead of ** a DELETE and an INSERT. @@ -10991,10 +10991,10 @@ SQLITE_API void sqlite3session_table_filter( ** it does not accumulate records when rows are inserted, updated or deleted. ** This may appear to have some counter-intuitive effects if a single row ** is written to more than once during a session. For example, if a row -** is inserted while a session object is enabled, then later deleted while +** is inserted while a session object is enabled, then later deleted while ** the same session object is disabled, no INSERT record will appear in the ** changeset, even though the delete took place while the session was disabled. -** Or, if one field of a row is updated while a session is disabled, and +** Or, if one field of a row is updated while a session is disabled, and ** another field of the same row is updated while the session is enabled, the ** resulting changeset will contain an UPDATE change that updates both fields. */ @@ -11015,7 +11015,7 @@ SQLITE_API int sqlite3session_changeset( ** an error). ** ** Argument zFromDb must be the name of a database ("main", "temp" etc.) -** attached to the same database handle as the session object that contains +** attached to the same database handle as the session object that contains ** a table compatible with the table attached to the session by this function. ** A table is considered compatible if it: ** @@ -11031,25 +11031,25 @@ SQLITE_API int sqlite3session_changeset( ** APIs, tables without PRIMARY KEYs are simply ignored. ** ** This function adds a set of changes to the session object that could be -** used to update the table in database zFrom (call this the "from-table") -** so that its content is the same as the table attached to the session +** used to update the table in database zFrom (call this the "from-table") +** so that its content is the same as the table attached to the session ** object (call this the "to-table"). Specifically: ** **
      -**
    • For each row (primary key) that exists in the to-table but not in +**
    • For each row (primary key) that exists in the to-table but not in ** the from-table, an INSERT record is added to the session object. ** -**
    • For each row (primary key) that exists in the to-table but not in +**
    • For each row (primary key) that exists in the to-table but not in ** the from-table, a DELETE record is added to the session object. ** -**
    • For each row (primary key) that exists in both tables, but features +**
    • For each row (primary key) that exists in both tables, but features ** different non-PK values in each, an UPDATE record is added to the -** session. +** session. **
    ** ** To clarify, if this function is called and then a changeset constructed -** using [sqlite3session_changeset()], then after applying that changeset to -** database zFrom the contents of the two compatible tables would be +** using [sqlite3session_changeset()], then after applying that changeset to +** database zFrom the contents of the two compatible tables would be ** identical. ** ** It an error if database zFrom does not exist or does not contain the @@ -11057,7 +11057,7 @@ SQLITE_API int sqlite3session_changeset( ** ** If the operation successful, SQLITE_OK is returned. Otherwise, an SQLite ** error code. In this case, if argument pzErrMsg is not NULL, *pzErrMsg -** may be set to point to a buffer containing an English language error +** may be set to point to a buffer containing an English language error ** message. It is the responsibility of the caller to free this buffer using ** sqlite3_free(). */ @@ -11076,19 +11076,19 @@ SQLITE_API int sqlite3session_diff( ** The differences between a patchset and a changeset are that: ** **
      -**
    • DELETE records consist of the primary key fields only. The +**
    • DELETE records consist of the primary key fields only. The ** original values of other fields are omitted. -**
    • The original values of any modified fields are omitted from +**
    • The original values of any modified fields are omitted from ** UPDATE records. **
    ** -** A patchset blob may be used with up to date versions of all -** sqlite3changeset_xxx API functions except for sqlite3changeset_invert(), +** A patchset blob may be used with up to date versions of all +** sqlite3changeset_xxx API functions except for sqlite3changeset_invert(), ** which returns SQLITE_CORRUPT if it is passed a patchset. Similarly, ** attempting to use a patchset blob with old versions of the -** sqlite3changeset_xxx APIs also provokes an SQLITE_CORRUPT error. +** sqlite3changeset_xxx APIs also provokes an SQLITE_CORRUPT error. ** -** Because the non-primary key "old.*" fields are omitted, no +** Because the non-primary key "old.*" fields are omitted, no ** SQLITE_CHANGESET_DATA conflicts can be detected or reported if a patchset ** is passed to the sqlite3changeset_apply() API. Other conflict types work ** in the same way as for changesets. @@ -11107,22 +11107,22 @@ SQLITE_API int sqlite3session_patchset( /* ** CAPI3REF: Test if a changeset has recorded any changes. ** -** Return non-zero if no changes to attached tables have been recorded by -** the session object passed as the first argument. Otherwise, if one or +** Return non-zero if no changes to attached tables have been recorded by +** the session object passed as the first argument. Otherwise, if one or ** more changes have been recorded, return zero. ** ** Even if this function returns zero, it is possible that calling ** [sqlite3session_changeset()] on the session handle may still return a -** changeset that contains no changes. This can happen when a row in -** an attached table is modified and then later on the original values +** changeset that contains no changes. This can happen when a row in +** an attached table is modified and then later on the original values ** are restored. However, if this function returns non-zero, then it is -** guaranteed that a call to sqlite3session_changeset() will return a +** guaranteed that a call to sqlite3session_changeset() will return a ** changeset containing zero changes. */ SQLITE_API int sqlite3session_isempty(sqlite3_session *pSession); /* -** CAPI3REF: Create An Iterator To Traverse A Changeset +** CAPI3REF: Create An Iterator To Traverse A Changeset ** CONSTRUCTOR: sqlite3_changeset_iter ** ** Create an iterator used to iterate through the contents of a changeset. @@ -11130,7 +11130,7 @@ SQLITE_API int sqlite3session_isempty(sqlite3_session *pSession); ** is returned. Otherwise, if an error occurs, *pp is set to zero and an ** SQLite error code is returned. ** -** The following functions can be used to advance and query a changeset +** The following functions can be used to advance and query a changeset ** iterator created by this function: ** **
      @@ -11147,12 +11147,12 @@ SQLITE_API int sqlite3session_isempty(sqlite3_session *pSession); ** ** Assuming the changeset blob was created by one of the ** [sqlite3session_changeset()], [sqlite3changeset_concat()] or -** [sqlite3changeset_invert()] functions, all changes within the changeset -** that apply to a single table are grouped together. This means that when -** an application iterates through a changeset using an iterator created by -** this function, all changes that relate to a single table are visited -** consecutively. There is no chance that the iterator will visit a change -** the applies to table X, then one for table Y, and then later on visit +** [sqlite3changeset_invert()] functions, all changes within the changeset +** that apply to a single table are grouped together. This means that when +** an application iterates through a changeset using an iterator created by +** this function, all changes that relate to a single table are visited +** consecutively. There is no chance that the iterator will visit a change +** the applies to table X, then one for table Y, and then later on visit ** another change for table X. ** ** The behavior of sqlite3changeset_start_v2() and its streaming equivalent @@ -11203,12 +11203,12 @@ SQLITE_API int sqlite3changeset_start_v2( ** point to the first change in the changeset. Each subsequent call advances ** the iterator to point to the next change in the changeset (if any). If ** no error occurs and the iterator points to a valid change after a call -** to sqlite3changeset_next() has advanced it, SQLITE_ROW is returned. +** to sqlite3changeset_next() has advanced it, SQLITE_ROW is returned. ** Otherwise, if all changes in the changeset have already been visited, ** SQLITE_DONE is returned. ** -** If an error occurs, an SQLite error code is returned. Possible error -** codes include SQLITE_CORRUPT (if the changeset buffer is corrupt) or +** If an error occurs, an SQLite error code is returned. Possible error +** codes include SQLITE_CORRUPT (if the changeset buffer is corrupt) or ** SQLITE_NOMEM. */ SQLITE_API int sqlite3changeset_next(sqlite3_changeset_iter *pIter); @@ -11226,14 +11226,14 @@ SQLITE_API int sqlite3changeset_next(sqlite3_changeset_iter *pIter); ** If argument pzTab is not NULL, then *pzTab is set to point to a ** nul-terminated utf-8 encoded string containing the name of the table ** affected by the current change. The buffer remains valid until either -** sqlite3changeset_next() is called on the iterator or until the -** conflict-handler function returns. If pnCol is not NULL, then *pnCol is +** sqlite3changeset_next() is called on the iterator or until the +** conflict-handler function returns. If pnCol is not NULL, then *pnCol is ** set to the number of columns in the table affected by the change. If ** pbIndirect is not NULL, then *pbIndirect is set to true (1) if the change ** is an indirect change, or false (0) otherwise. See the documentation for ** [sqlite3session_indirect()] for a description of direct and indirect -** changes. Finally, if pOp is not NULL, then *pOp is set to one of -** [SQLITE_INSERT], [SQLITE_DELETE] or [SQLITE_UPDATE], depending on the +** changes. Finally, if pOp is not NULL, then *pOp is set to one of +** [SQLITE_INSERT], [SQLITE_DELETE] or [SQLITE_UPDATE], depending on the ** type of change that the iterator currently points to. ** ** If no error occurs, SQLITE_OK is returned. If an error does occur, an @@ -11287,7 +11287,7 @@ SQLITE_API int sqlite3changeset_pk( ** The pIter argument passed to this function may either be an iterator ** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator ** created by [sqlite3changeset_start()]. In the latter case, the most recent -** call to [sqlite3changeset_next()] must have returned SQLITE_ROW. +** call to [sqlite3changeset_next()] must have returned SQLITE_ROW. ** Furthermore, it may only be called if the type of change that the iterator ** currently points to is either [SQLITE_DELETE] or [SQLITE_UPDATE]. Otherwise, ** this function returns [SQLITE_MISUSE] and sets *ppValue to NULL. @@ -11297,9 +11297,9 @@ SQLITE_API int sqlite3changeset_pk( ** [SQLITE_RANGE] is returned and *ppValue is set to NULL. ** ** If successful, this function sets *ppValue to point to a protected -** sqlite3_value object containing the iVal'th value from the vector of +** sqlite3_value object containing the iVal'th value from the vector of ** original row values stored as part of the UPDATE or DELETE change and -** returns SQLITE_OK. The name of the function comes from the fact that this +** returns SQLITE_OK. The name of the function comes from the fact that this ** is similar to the "old.*" columns available to update or delete triggers. ** ** If some other error occurs (e.g. an OOM condition), an SQLite error code @@ -11318,7 +11318,7 @@ SQLITE_API int sqlite3changeset_old( ** The pIter argument passed to this function may either be an iterator ** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator ** created by [sqlite3changeset_start()]. In the latter case, the most recent -** call to [sqlite3changeset_next()] must have returned SQLITE_ROW. +** call to [sqlite3changeset_next()] must have returned SQLITE_ROW. ** Furthermore, it may only be called if the type of change that the iterator ** currently points to is either [SQLITE_UPDATE] or [SQLITE_INSERT]. Otherwise, ** this function returns [SQLITE_MISUSE] and sets *ppValue to NULL. @@ -11328,12 +11328,12 @@ SQLITE_API int sqlite3changeset_old( ** [SQLITE_RANGE] is returned and *ppValue is set to NULL. ** ** If successful, this function sets *ppValue to point to a protected -** sqlite3_value object containing the iVal'th value from the vector of +** sqlite3_value object containing the iVal'th value from the vector of ** new row values stored as part of the UPDATE or INSERT change and ** returns SQLITE_OK. If the change is an UPDATE and does not include -** a new value for the requested column, *ppValue is set to NULL and -** SQLITE_OK returned. The name of the function comes from the fact that -** this is similar to the "new.*" columns available to update or delete +** a new value for the requested column, *ppValue is set to NULL and +** SQLITE_OK returned. The name of the function comes from the fact that +** this is similar to the "new.*" columns available to update or delete ** triggers. ** ** If some other error occurs (e.g. an OOM condition), an SQLite error code @@ -11360,7 +11360,7 @@ SQLITE_API int sqlite3changeset_new( ** [SQLITE_RANGE] is returned and *ppValue is set to NULL. ** ** If successful, this function sets *ppValue to point to a protected -** sqlite3_value object containing the iVal'th value from the +** sqlite3_value object containing the iVal'th value from the ** "conflicting row" associated with the current conflict-handler callback ** and returns SQLITE_OK. ** @@ -11404,7 +11404,7 @@ SQLITE_API int sqlite3changeset_fk_conflicts( ** call has no effect. ** ** If an error was encountered within a call to an sqlite3changeset_xxx() -** function (for example an [SQLITE_CORRUPT] in [sqlite3changeset_next()] or an +** function (for example an [SQLITE_CORRUPT] in [sqlite3changeset_next()] or an ** [SQLITE_NOMEM] in [sqlite3changeset_new()]) then an error code corresponding ** to that error is returned by this function. Otherwise, SQLITE_OK is ** returned. This is to allow the following pattern (pseudo-code): @@ -11416,7 +11416,7 @@ SQLITE_API int sqlite3changeset_fk_conflicts( ** } ** rc = sqlite3changeset_finalize(); ** if( rc!=SQLITE_OK ){ -** // An error has occurred +** // An error has occurred ** } **
*/ @@ -11444,7 +11444,7 @@ SQLITE_API int sqlite3changeset_finalize(sqlite3_changeset_iter *pIter); ** zeroed and an SQLite error code returned. ** ** It is the responsibility of the caller to eventually call sqlite3_free() -** on the *ppOut pointer to free the buffer allocation following a successful +** on the *ppOut pointer to free the buffer allocation following a successful ** call to this function. ** ** WARNING/TODO: This function currently assumes that the input is a valid @@ -11458,11 +11458,11 @@ SQLITE_API int sqlite3changeset_invert( /* ** CAPI3REF: Concatenate Two Changeset Objects ** -** This function is used to concatenate two changesets, A and B, into a +** This function is used to concatenate two changesets, A and B, into a ** single changeset. The result is a changeset equivalent to applying -** changeset A followed by changeset B. +** changeset A followed by changeset B. ** -** This function combines the two input changesets using an +** This function combines the two input changesets using an ** sqlite3_changegroup object. Calling it produces similar results as the ** following code fragment: ** @@ -11494,7 +11494,7 @@ SQLITE_API int sqlite3changeset_concat( /* ** CAPI3REF: Changegroup Handle ** -** A changegroup is an object used to combine two or more +** A changegroup is an object used to combine two or more ** [changesets] or [patchsets] */ typedef struct sqlite3_changegroup sqlite3_changegroup; @@ -11510,7 +11510,7 @@ typedef struct sqlite3_changegroup sqlite3_changegroup; ** ** If successful, this function returns SQLITE_OK and populates (*pp) with ** a pointer to a new sqlite3_changegroup object before returning. The caller -** should eventually free the returned object using a call to +** should eventually free the returned object using a call to ** sqlite3changegroup_delete(). If an error occurs, an SQLite error code ** (i.e. SQLITE_NOMEM) is returned and *pp is set to NULL. ** @@ -11522,7 +11522,7 @@ typedef struct sqlite3_changegroup sqlite3_changegroup; **
  • Zero or more changesets (or patchsets) are added to the object ** by calling sqlite3changegroup_add(). ** -**
  • The result of combining all input changesets together is obtained +**
  • The result of combining all input changesets together is obtained ** by the application via a call to sqlite3changegroup_output(). ** **
  • The object is deleted using a call to sqlite3changegroup_delete(). @@ -11531,7 +11531,7 @@ typedef struct sqlite3_changegroup sqlite3_changegroup; ** Any number of calls to add() and output() may be made between the calls to ** new() and delete(), and in any order. ** -** As well as the regular sqlite3changegroup_add() and +** As well as the regular sqlite3changegroup_add() and ** sqlite3changegroup_output() functions, also available are the streaming ** versions sqlite3changegroup_add_strm() and sqlite3changegroup_output_strm(). */ @@ -11542,7 +11542,7 @@ SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp); ** METHOD: sqlite3_changegroup ** ** Add all changes within the changeset (or patchset) in buffer pData (size -** nData bytes) to the changegroup. +** nData bytes) to the changegroup. ** ** If the buffer contains a patchset, then all prior calls to this function ** on the same changegroup object must also have specified patchsets. Or, if @@ -11569,7 +11569,7 @@ SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp); ** changeset was recorded immediately after the changesets already ** added to the changegroup. ** INSERT UPDATE -** The INSERT change remains in the changegroup. The values in the +** The INSERT change remains in the changegroup. The values in the ** INSERT change are modified as if the row was inserted by the ** existing change and then updated according to the new change. ** INSERT DELETE @@ -11580,17 +11580,17 @@ SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp); ** changeset was recorded immediately after the changesets already ** added to the changegroup. ** UPDATE UPDATE -** The existing UPDATE remains within the changegroup. It is amended -** so that the accompanying values are as if the row was updated once +** The existing UPDATE remains within the changegroup. It is amended +** so that the accompanying values are as if the row was updated once ** by the existing change and then again by the new change. ** UPDATE DELETE ** The existing UPDATE is replaced by the new DELETE within the ** changegroup. ** DELETE INSERT ** If one or more of the column values in the row inserted by the -** new change differ from those in the row deleted by the existing +** new change differ from those in the row deleted by the existing ** change, the existing DELETE is replaced by an UPDATE within the -** changegroup. Otherwise, if the inserted row is exactly the same +** changegroup. Otherwise, if the inserted row is exactly the same ** as the deleted row, the existing DELETE is simply discarded. ** DELETE UPDATE ** The new change is ignored. This case does not occur if the new @@ -11635,7 +11635,7 @@ SQLITE_API int sqlite3changegroup_add(sqlite3_changegroup*, int nData, void *pDa ** ** If an error occurs, an SQLite error code is returned and the output ** variables (*pnData) and (*ppData) are set to 0. Otherwise, SQLITE_OK -** is returned and the output variables are set to the size of and a +** is returned and the output variables are set to the size of and a ** pointer to the output buffer, respectively. In this case it is the ** responsibility of the caller to eventually free the buffer using a ** call to sqlite3_free(). @@ -11657,7 +11657,7 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*); ** ** Apply a changeset or patchset to a database. These functions attempt to ** update the "main" database attached to handle db with the changes found in -** the changeset passed via the second and third arguments. +** the changeset passed via the second and third arguments. ** ** The fourth argument (xFilter) passed to these functions is the "filter ** callback". If it is not NULL, then for each table affected by at least one @@ -11668,16 +11668,16 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*); ** Otherwise, if the return value is non-zero or the xFilter argument to ** is NULL, all changes related to the table are attempted. ** -** For each table that is not excluded by the filter callback, this function -** tests that the target database contains a compatible table. A table is +** For each table that is not excluded by the filter callback, this function +** tests that the target database contains a compatible table. A table is ** considered compatible if all of the following are true: ** **
      -**
    • The table has the same name as the name recorded in the +**
    • The table has the same name as the name recorded in the ** changeset, and -**
    • The table has at least as many columns as recorded in the +**
    • The table has at least as many columns as recorded in the ** changeset, and -**
    • The table has primary key columns in the same position as +**
    • The table has primary key columns in the same position as ** recorded in the changeset. **
    ** @@ -11686,11 +11686,11 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*); ** via the sqlite3_log() mechanism with the error code SQLITE_SCHEMA. At most ** one such warning is issued for each table in the changeset. ** -** For each change for which there is a compatible table, an attempt is made -** to modify the table contents according to the UPDATE, INSERT or DELETE -** change. If a change cannot be applied cleanly, the conflict handler -** function passed as the fifth argument to sqlite3changeset_apply() may be -** invoked. A description of exactly when the conflict handler is invoked for +** For each change for which there is a compatible table, an attempt is made +** to modify the table contents according to the UPDATE, INSERT or DELETE +** change. If a change cannot be applied cleanly, the conflict handler +** function passed as the fifth argument to sqlite3changeset_apply() may be +** invoked. A description of exactly when the conflict handler is invoked for ** each type of change is below. ** ** Unlike the xFilter argument, xConflict may not be passed NULL. The results @@ -11698,23 +11698,23 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*); ** argument are undefined. ** ** Each time the conflict handler function is invoked, it must return one -** of [SQLITE_CHANGESET_OMIT], [SQLITE_CHANGESET_ABORT] or +** of [SQLITE_CHANGESET_OMIT], [SQLITE_CHANGESET_ABORT] or ** [SQLITE_CHANGESET_REPLACE]. SQLITE_CHANGESET_REPLACE may only be returned ** if the second argument passed to the conflict handler is either ** SQLITE_CHANGESET_DATA or SQLITE_CHANGESET_CONFLICT. If the conflict-handler ** returns an illegal value, any changes already made are rolled back and -** the call to sqlite3changeset_apply() returns SQLITE_MISUSE. Different +** the call to sqlite3changeset_apply() returns SQLITE_MISUSE. Different ** actions are taken by sqlite3changeset_apply() depending on the value ** returned by each invocation of the conflict-handler function. Refer to -** the documentation for the three +** the documentation for the three ** [SQLITE_CHANGESET_OMIT|available return values] for details. ** **
    **
    DELETE Changes
    -** For each DELETE change, the function checks if the target database -** contains a row with the same primary key value (or values) as the -** original row values stored in the changeset. If it does, and the values -** stored in all non-primary key columns also match the values stored in +** For each DELETE change, the function checks if the target database +** contains a row with the same primary key value (or values) as the +** original row values stored in the changeset. If it does, and the values +** stored in all non-primary key columns also match the values stored in ** the changeset the row is deleted from the target database. ** ** If a row with matching primary key values is found, but one or more of @@ -11743,22 +11743,22 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*); ** database table, the trailing fields are populated with their default ** values. ** -** If the attempt to insert the row fails because the database already +** If the attempt to insert the row fails because the database already ** contains a row with the same primary key values, the conflict handler -** function is invoked with the second argument set to +** function is invoked with the second argument set to ** [SQLITE_CHANGESET_CONFLICT]. ** ** If the attempt to insert the row fails because of some other constraint -** violation (e.g. NOT NULL or UNIQUE), the conflict handler function is +** violation (e.g. NOT NULL or UNIQUE), the conflict handler function is ** invoked with the second argument set to [SQLITE_CHANGESET_CONSTRAINT]. -** This includes the case where the INSERT operation is re-attempted because -** an earlier call to the conflict handler function returned +** This includes the case where the INSERT operation is re-attempted because +** an earlier call to the conflict handler function returned ** [SQLITE_CHANGESET_REPLACE]. ** **
    UPDATE Changes
    -** For each UPDATE change, the function checks if the target database -** contains a row with the same primary key value (or values) as the -** original row values stored in the changeset. If it does, and the values +** For each UPDATE change, the function checks if the target database +** contains a row with the same primary key value (or values) as the +** original row values stored in the changeset. If it does, and the values ** stored in all modified non-primary key columns also match the values ** stored in the changeset the row is updated within the target database. ** @@ -11774,12 +11774,12 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*); ** the conflict-handler function is invoked with [SQLITE_CHANGESET_NOTFOUND] ** passed as the second argument. ** -** If the UPDATE operation is attempted, but SQLite returns -** SQLITE_CONSTRAINT, the conflict-handler function is invoked with +** If the UPDATE operation is attempted, but SQLite returns +** SQLITE_CONSTRAINT, the conflict-handler function is invoked with ** [SQLITE_CHANGESET_CONSTRAINT] passed as the second argument. -** This includes the case where the UPDATE operation is attempted after +** This includes the case where the UPDATE operation is attempted after ** an earlier call to the conflict handler function returned -** [SQLITE_CHANGESET_REPLACE]. +** [SQLITE_CHANGESET_REPLACE]. **
    ** ** It is safe to execute SQL statements, including those that write to the @@ -11790,12 +11790,12 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*); ** All changes made by these functions are enclosed in a savepoint transaction. ** If any other error (aside from a constraint failure when attempting to ** write to the target database) occurs, then the savepoint transaction is -** rolled back, restoring the target database to its original state, and an +** rolled back, restoring the target database to its original state, and an ** SQLite error code returned. ** ** If the output parameters (ppRebase) and (pnRebase) are non-NULL and ** the input is a changeset (not a patchset), then sqlite3changeset_apply_v2() -** may set (*ppRebase) to point to a "rebase" that may be used with the +** may set (*ppRebase) to point to a "rebase" that may be used with the ** sqlite3_rebaser APIs buffer before returning. In this case (*pnRebase) ** is set to the size of the buffer in bytes. It is the responsibility of the ** caller to eventually free any such buffer using sqlite3_free(). The buffer @@ -11856,7 +11856,7 @@ SQLITE_API int sqlite3changeset_apply_v2( ** SAVEPOINT is committed if the changeset or patchset is successfully ** applied, or rolled back if an error occurs. Specifying this flag ** causes the sessions module to omit this savepoint. In this case, if the -** caller has an open transaction or savepoint when apply_v2() is called, +** caller has an open transaction or savepoint when apply_v2() is called, ** it may revert the partially applied changeset by rolling it back. ** **
    SQLITE_CHANGESETAPPLY_INVERT
    @@ -11867,7 +11867,7 @@ SQLITE_API int sqlite3changeset_apply_v2( #define SQLITE_CHANGESETAPPLY_NOSAVEPOINT 0x0001 #define SQLITE_CHANGESETAPPLY_INVERT 0x0002 -/* +/* ** CAPI3REF: Constants Passed To The Conflict Handler ** ** Values that may be passed as the second argument to a conflict-handler. @@ -11876,32 +11876,32 @@ SQLITE_API int sqlite3changeset_apply_v2( **
    SQLITE_CHANGESET_DATA
    ** The conflict handler is invoked with CHANGESET_DATA as the second argument ** when processing a DELETE or UPDATE change if a row with the required -** PRIMARY KEY fields is present in the database, but one or more other -** (non primary-key) fields modified by the update do not contain the +** PRIMARY KEY fields is present in the database, but one or more other +** (non primary-key) fields modified by the update do not contain the ** expected "before" values. -** +** ** The conflicting row, in this case, is the database row with the matching ** primary key. -** +** **
    SQLITE_CHANGESET_NOTFOUND
    ** The conflict handler is invoked with CHANGESET_NOTFOUND as the second ** argument when processing a DELETE or UPDATE change if a row with the ** required PRIMARY KEY fields is not present in the database. -** +** ** There is no conflicting row in this case. The results of invoking the ** sqlite3changeset_conflict() API are undefined. -** +** **
    SQLITE_CHANGESET_CONFLICT
    ** CHANGESET_CONFLICT is passed as the second argument to the conflict -** handler while processing an INSERT change if the operation would result +** handler while processing an INSERT change if the operation would result ** in duplicate primary key values. -** +** ** The conflicting row in this case is the database row with the matching ** primary key. ** **
    SQLITE_CHANGESET_FOREIGN_KEY
    ** If foreign key handling is enabled, and applying a changeset leaves the -** database in a state containing foreign key violations, the conflict +** database in a state containing foreign key violations, the conflict ** handler is invoked with CHANGESET_FOREIGN_KEY as the second argument ** exactly once before the changeset is committed. If the conflict handler ** returns CHANGESET_OMIT, the changes, including those that caused the @@ -11911,12 +11911,12 @@ SQLITE_API int sqlite3changeset_apply_v2( ** No current or conflicting row information is provided. The only function ** it is possible to call on the supplied sqlite3_changeset_iter handle ** is sqlite3changeset_fk_conflicts(). -** +** **
    SQLITE_CHANGESET_CONSTRAINT
    -** If any other constraint violation occurs while applying a change (i.e. -** a UNIQUE, CHECK or NOT NULL constraint), the conflict handler is +** If any other constraint violation occurs while applying a change (i.e. +** a UNIQUE, CHECK or NOT NULL constraint), the conflict handler is ** invoked with CHANGESET_CONSTRAINT as the second argument. -** +** ** There is no conflicting row in this case. The results of invoking the ** sqlite3changeset_conflict() API are undefined. ** @@ -11928,7 +11928,7 @@ SQLITE_API int sqlite3changeset_apply_v2( #define SQLITE_CHANGESET_CONSTRAINT 4 #define SQLITE_CHANGESET_FOREIGN_KEY 5 -/* +/* ** CAPI3REF: Constants Returned By The Conflict Handler ** ** A conflict handler callback must return one of the following three values. @@ -11936,13 +11936,13 @@ SQLITE_API int sqlite3changeset_apply_v2( **
    **
    SQLITE_CHANGESET_OMIT
    ** If a conflict handler returns this value no special action is taken. The -** change that caused the conflict is not applied. The session module +** change that caused the conflict is not applied. The session module ** continues to the next change in the changeset. ** **
    SQLITE_CHANGESET_REPLACE
    ** This value may only be returned if the second argument to the conflict ** handler was SQLITE_CHANGESET_DATA or SQLITE_CHANGESET_CONFLICT. If this -** is not the case, any changes applied so far are rolled back and the +** is not the case, any changes applied so far are rolled back and the ** call to sqlite3changeset_apply() returns SQLITE_MISUSE. ** ** If CHANGESET_REPLACE is returned by an SQLITE_CHANGESET_DATA conflict @@ -11955,7 +11955,7 @@ SQLITE_API int sqlite3changeset_apply_v2( ** the original row is restored to the database before continuing. ** **
    SQLITE_CHANGESET_ABORT
    -** If this value is returned, any changes applied so far are rolled back +** If this value is returned, any changes applied so far are rolled back ** and the call to sqlite3changeset_apply() returns SQLITE_ABORT. **
    */ @@ -11963,20 +11963,20 @@ SQLITE_API int sqlite3changeset_apply_v2( #define SQLITE_CHANGESET_REPLACE 1 #define SQLITE_CHANGESET_ABORT 2 -/* +/* ** CAPI3REF: Rebasing changesets ** EXPERIMENTAL ** ** Suppose there is a site hosting a database in state S0. And that ** modifications are made that move that database to state S1 and a ** changeset recorded (the "local" changeset). Then, a changeset based -** on S0 is received from another site (the "remote" changeset) and -** applied to the database. The database is then in state +** on S0 is received from another site (the "remote" changeset) and +** applied to the database. The database is then in state ** (S1+"remote"), where the exact state depends on any conflict ** resolution decisions (OMIT or REPLACE) made while applying "remote". -** Rebasing a changeset is to update it to take those conflict +** Rebasing a changeset is to update it to take those conflict ** resolution decisions into account, so that the same conflicts -** do not have to be resolved elsewhere in the network. +** do not have to be resolved elsewhere in the network. ** ** For example, if both the local and remote changesets contain an ** INSERT of the same key on "CREATE TABLE t1(a PRIMARY KEY, b)": @@ -11995,7 +11995,7 @@ SQLITE_API int sqlite3changeset_apply_v2( ** **
    **
    Local INSERT
    -** This may only conflict with a remote INSERT. If the conflict +** This may only conflict with a remote INSERT. If the conflict ** resolution was OMIT, then add an UPDATE change to the rebased ** changeset. Or, if the conflict resolution was REPLACE, add ** nothing to the rebased changeset. @@ -12019,12 +12019,12 @@ SQLITE_API int sqlite3changeset_apply_v2( ** the old.* values are rebased using the new.* values in the remote ** change. Or, if the resolution is REPLACE, then the change is copied ** into the rebased changeset with updates to columns also updated by -** the conflicting remote UPDATE removed. If this means no columns would +** the conflicting remote UPDATE removed. If this means no columns would ** be updated, the change is omitted. **
    ** -** A local change may be rebased against multiple remote changes -** simultaneously. If a single key is modified by multiple remote +** A local change may be rebased against multiple remote changes +** simultaneously. If a single key is modified by multiple remote ** changesets, they are combined as follows before the local changeset ** is rebased: ** @@ -12037,10 +12037,10 @@ SQLITE_API int sqlite3changeset_apply_v2( ** of the OMIT resolutions. ** ** -** Note that conflict resolutions from multiple remote changesets are -** combined on a per-field basis, not per-row. This means that in the -** case of multiple remote UPDATE operations, some fields of a single -** local change may be rebased for REPLACE while others are rebased for +** Note that conflict resolutions from multiple remote changesets are +** combined on a per-field basis, not per-row. This means that in the +** case of multiple remote UPDATE operations, some fields of a single +** local change may be rebased for REPLACE while others are rebased for ** OMIT. ** ** In order to rebase a local changeset, the remote changeset must first @@ -12048,7 +12048,7 @@ SQLITE_API int sqlite3changeset_apply_v2( ** the buffer of rebase information captured. Then: ** **
      -**
    1. An sqlite3_rebaser object is created by calling +**
    2. An sqlite3_rebaser object is created by calling ** sqlite3rebaser_create(). **
    3. The new object is configured with the rebase buffer obtained from ** sqlite3changeset_apply_v2() by calling sqlite3rebaser_configure(). @@ -12069,8 +12069,8 @@ typedef struct sqlite3_rebaser sqlite3_rebaser; ** ** Allocate a new changeset rebaser object. If successful, set (*ppNew) to ** point to the new object and return SQLITE_OK. Otherwise, if an error -** occurs, return an SQLite error code (e.g. SQLITE_NOMEM) and set (*ppNew) -** to NULL. +** occurs, return an SQLite error code (e.g. SQLITE_NOMEM) and set (*ppNew) +** to NULL. */ SQLITE_API int sqlite3rebaser_create(sqlite3_rebaser **ppNew); @@ -12084,9 +12084,9 @@ SQLITE_API int sqlite3rebaser_create(sqlite3_rebaser **ppNew); ** sqlite3changeset_apply_v2(). */ SQLITE_API int sqlite3rebaser_configure( - sqlite3_rebaser*, + sqlite3_rebaser*, int nRebase, const void *pRebase -); +); /* ** CAPI3REF: Rebase a changeset @@ -12096,7 +12096,7 @@ SQLITE_API int sqlite3rebaser_configure( ** in size. This function allocates and populates a buffer with a copy ** of the changeset rebased rebased according to the configuration of the ** rebaser object passed as the first argument. If successful, (*ppOut) -** is set to point to the new buffer containing the rebased changeset and +** is set to point to the new buffer containing the rebased changeset and ** (*pnOut) to its size in bytes and SQLITE_OK returned. It is the ** responsibility of the caller to eventually free the new buffer using ** sqlite3_free(). Otherwise, if an error occurs, (*ppOut) and (*pnOut) @@ -12104,8 +12104,8 @@ SQLITE_API int sqlite3rebaser_configure( */ SQLITE_API int sqlite3rebaser_rebase( sqlite3_rebaser*, - int nIn, const void *pIn, - int *pnOut, void **ppOut + int nIn, const void *pIn, + int *pnOut, void **ppOut ); /* @@ -12116,30 +12116,30 @@ SQLITE_API int sqlite3rebaser_rebase( ** should be one call to this function for each successful invocation ** of sqlite3rebaser_create(). */ -SQLITE_API void sqlite3rebaser_delete(sqlite3_rebaser *p); +SQLITE_API void sqlite3rebaser_delete(sqlite3_rebaser *p); /* ** CAPI3REF: Streaming Versions of API functions. ** -** The six streaming API xxx_strm() functions serve similar purposes to the +** The six streaming API xxx_strm() functions serve similar purposes to the ** corresponding non-streaming API functions: ** ** ** -**
      Streaming functionNon-streaming equivalent
      sqlite3changeset_apply_strm[sqlite3changeset_apply] -**
      sqlite3changeset_apply_strm_v2[sqlite3changeset_apply_v2] -**
      sqlite3changeset_concat_strm[sqlite3changeset_concat] -**
      sqlite3changeset_invert_strm[sqlite3changeset_invert] -**
      sqlite3changeset_start_strm[sqlite3changeset_start] -**
      sqlite3session_changeset_strm[sqlite3session_changeset] -**
      sqlite3session_patchset_strm[sqlite3session_patchset] +**
      sqlite3changeset_apply_strm[sqlite3changeset_apply] +**
      sqlite3changeset_apply_strm_v2[sqlite3changeset_apply_v2] +**
      sqlite3changeset_concat_strm[sqlite3changeset_concat] +**
      sqlite3changeset_invert_strm[sqlite3changeset_invert] +**
      sqlite3changeset_start_strm[sqlite3changeset_start] +**
      sqlite3session_changeset_strm[sqlite3session_changeset] +**
      sqlite3session_patchset_strm[sqlite3session_patchset] **
      ** ** Non-streaming functions that accept changesets (or patchsets) as input -** require that the entire changeset be stored in a single buffer in memory. -** Similarly, those that return a changeset or patchset do so by returning -** a pointer to a single large buffer allocated using sqlite3_malloc(). -** Normally this is convenient. However, if an application running in a +** require that the entire changeset be stored in a single buffer in memory. +** Similarly, those that return a changeset or patchset do so by returning +** a pointer to a single large buffer allocated using sqlite3_malloc(). +** Normally this is convenient. However, if an application running in a ** low-memory environment is required to handle very large changesets, the ** large contiguous memory allocations required can become onerous. ** @@ -12161,12 +12161,12 @@ SQLITE_API void sqlite3rebaser_delete(sqlite3_rebaser *p); **
  • ** ** Each time the xInput callback is invoked by the sessions module, the first -** argument passed is a copy of the supplied pIn context pointer. The second -** argument, pData, points to a buffer (*pnData) bytes in size. Assuming no -** error occurs the xInput method should copy up to (*pnData) bytes of data -** into the buffer and set (*pnData) to the actual number of bytes copied -** before returning SQLITE_OK. If the input is completely exhausted, (*pnData) -** should be set to zero to indicate this. Or, if an error occurs, an SQLite +** argument passed is a copy of the supplied pIn context pointer. The second +** argument, pData, points to a buffer (*pnData) bytes in size. Assuming no +** error occurs the xInput method should copy up to (*pnData) bytes of data +** into the buffer and set (*pnData) to the actual number of bytes copied +** before returning SQLITE_OK. If the input is completely exhausted, (*pnData) +** should be set to zero to indicate this. Or, if an error occurs, an SQLite ** error code should be returned. In all cases, if an xInput callback returns ** an error, all processing is abandoned and the streaming API function ** returns a copy of the error code to the caller. @@ -12174,7 +12174,7 @@ SQLITE_API void sqlite3rebaser_delete(sqlite3_rebaser *p); ** In the case of sqlite3changeset_start_strm(), the xInput callback may be ** invoked by the sessions module at any point during the lifetime of the ** iterator. If such an xInput callback returns an error, the iterator enters -** an error state, whereby all subsequent calls to iterator functions +** an error state, whereby all subsequent calls to iterator functions ** immediately fail with the same error code as returned by xInput. ** ** Similarly, streaming API functions that return changesets (or patchsets) @@ -12204,7 +12204,7 @@ SQLITE_API void sqlite3rebaser_delete(sqlite3_rebaser *p); ** is immediately abandoned and the streaming API function returns a copy ** of the xOutput error code to the application. ** -** The sessions module never invokes an xOutput callback with the third +** The sessions module never invokes an xOutput callback with the third ** parameter set to a value less than or equal to zero. Other than this, ** no guarantees are made as to the size of the chunks of data returned. */ @@ -12275,12 +12275,12 @@ SQLITE_API int sqlite3session_patchset_strm( int (*xOutput)(void *pOut, const void *pData, int nData), void *pOut ); -SQLITE_API int sqlite3changegroup_add_strm(sqlite3_changegroup*, +SQLITE_API int sqlite3changegroup_add_strm(sqlite3_changegroup*, int (*xInput)(void *pIn, void *pData, int *pnData), void *pIn ); SQLITE_API int sqlite3changegroup_output_strm(sqlite3_changegroup*, - int (*xOutput)(void *pOut, const void *pData, int nData), + int (*xOutput)(void *pOut, const void *pData, int nData), void *pOut ); SQLITE_API int sqlite3rebaser_rebase_strm( @@ -12295,16 +12295,16 @@ SQLITE_API int sqlite3rebaser_rebase_strm( ** CAPI3REF: Configure global parameters ** ** The sqlite3session_config() interface is used to make global configuration -** changes to the sessions module in order to tune it to the specific needs +** changes to the sessions module in order to tune it to the specific needs ** of the application. ** ** The sqlite3session_config() interface is not threadsafe. If it is invoked ** while any other thread is inside any other sessions method then the ** results are undefined. Furthermore, if it is invoked after any sessions -** related objects have been created, the results are also undefined. +** related objects have been created, the results are also undefined. ** ** The first argument to the sqlite3session_config() function must be one -** of the SQLITE_SESSION_CONFIG_XXX constants defined below. The +** of the SQLITE_SESSION_CONFIG_XXX constants defined below. The ** interpretation of the (void*) value passed as the second parameter and ** the effect of calling this function depends on the value of the first ** parameter. @@ -12354,7 +12354,7 @@ SQLITE_API int sqlite3session_config(int op, void *pArg); ** ****************************************************************************** ** -** Interfaces to extend FTS5. Using the interfaces defined in this file, +** Interfaces to extend FTS5. Using the interfaces defined in this file, ** FTS5 may be extended with: ** ** * custom tokenizers, and @@ -12398,19 +12398,19 @@ struct Fts5PhraseIter { ** EXTENSION API FUNCTIONS ** ** xUserData(pFts): -** Return a copy of the context pointer the extension function was +** Return a copy of the context pointer the extension function was ** registered with. ** ** xColumnTotalSize(pFts, iCol, pnToken): ** If parameter iCol is less than zero, set output variable *pnToken ** to the total number of tokens in the FTS5 table. Or, if iCol is ** non-negative but less than the number of columns in the table, return -** the total number of tokens in column iCol, considering all rows in +** the total number of tokens in column iCol, considering all rows in ** the FTS5 table. ** ** If parameter iCol is greater than or equal to the number of columns ** in the table, SQLITE_RANGE is returned. Or, if an error occurs (e.g. -** an OOM condition or IO error), an appropriate SQLite error code is +** an OOM condition or IO error), an appropriate SQLite error code is ** returned. ** ** xColumnCount(pFts): @@ -12424,7 +12424,7 @@ struct Fts5PhraseIter { ** ** If parameter iCol is greater than or equal to the number of columns ** in the table, SQLITE_RANGE is returned. Or, if an error occurs (e.g. -** an OOM condition or IO error), an appropriate SQLite error code is +** an OOM condition or IO error), an appropriate SQLite error code is ** returned. ** ** This function may be quite inefficient if used with an FTS5 table @@ -12451,8 +12451,8 @@ struct Fts5PhraseIter { ** an error code (i.e. SQLITE_NOMEM) if an error occurs. ** ** This API can be quite slow if used with an FTS5 table created with the -** "detail=none" or "detail=column" option. If the FTS5 table is created -** with either "detail=none" or "detail=column" and "content=" option +** "detail=none" or "detail=column" option. If the FTS5 table is created +** with either "detail=none" or "detail=column" and "content=" option ** (i.e. if it is a contentless table), then this API always returns 0. ** ** xInst: @@ -12467,7 +12467,7 @@ struct Fts5PhraseIter { ** code (i.e. SQLITE_NOMEM) if an error occurs. ** ** This API can be quite slow if used with an FTS5 table created with the -** "detail=none" or "detail=column" option. +** "detail=none" or "detail=column" option. ** ** xRowid: ** Returns the rowid of the current row. @@ -12483,11 +12483,11 @@ struct Fts5PhraseIter { ** ** with $p set to a phrase equivalent to the phrase iPhrase of the ** current query is executed. Any column filter that applies to -** phrase iPhrase of the current query is included in $p. For each -** row visited, the callback function passed as the fourth argument -** is invoked. The context and API objects passed to the callback +** phrase iPhrase of the current query is included in $p. For each +** row visited, the callback function passed as the fourth argument +** is invoked. The context and API objects passed to the callback ** function may be used to access the properties of each matched row. -** Invoking Api.xUserData() returns a copy of the pointer passed as +** Invoking Api.xUserData() returns a copy of the pointer passed as ** the third argument to pUserData. ** ** If the callback function returns any value other than SQLITE_OK, the @@ -12502,14 +12502,14 @@ struct Fts5PhraseIter { ** ** xSetAuxdata(pFts5, pAux, xDelete) ** -** Save the pointer passed as the second argument as the extension functions +** Save the pointer passed as the second argument as the extension functions ** "auxiliary data". The pointer may then be retrieved by the current or any ** future invocation of the same fts5 extension function made as part of ** the same MATCH query using the xGetAuxdata() API. ** ** Each extension function is allocated a single auxiliary data slot for -** each FTS query (MATCH expression). If the extension function is invoked -** more than once for a single FTS query, then all invocations share a +** each FTS query (MATCH expression). If the extension function is invoked +** more than once for a single FTS query, then all invocations share a ** single auxiliary data context. ** ** If there is already an auxiliary data pointer when this function is @@ -12528,7 +12528,7 @@ struct Fts5PhraseIter { ** ** xGetAuxdata(pFts5, bClear) ** -** Returns the current auxiliary data pointer for the fts5 extension +** Returns the current auxiliary data pointer for the fts5 extension ** function. See the xSetAuxdata() method for details. ** ** If the bClear argument is non-zero, then the auxiliary data is cleared @@ -12548,7 +12548,7 @@ struct Fts5PhraseIter { ** method, to iterate through all instances of a single query phrase within ** the current row. This is the same information as is accessible via the ** xInstCount/xInst APIs. While the xInstCount/xInst APIs are more convenient -** to use, this API may be faster under some circumstances. To iterate +** to use, this API may be faster under some circumstances. To iterate ** through instances of phrase iPhrase, use the following code: ** ** Fts5PhraseIter iter; @@ -12566,8 +12566,8 @@ struct Fts5PhraseIter { ** xPhraseFirstColumn() and xPhraseNextColumn() as illustrated below). ** ** This API can be quite slow if used with an FTS5 table created with the -** "detail=none" or "detail=column" option. If the FTS5 table is created -** with either "detail=none" or "detail=column" and "content=" option +** "detail=none" or "detail=column" option. If the FTS5 table is created +** with either "detail=none" or "detail=column" and "content=" option ** (i.e. if it is a contentless table), then this API always iterates ** through an empty set (all calls to xPhraseFirst() set iCol to -1). ** @@ -12591,16 +12591,16 @@ struct Fts5PhraseIter { ** } ** ** This API can be quite slow if used with an FTS5 table created with the -** "detail=none" option. If the FTS5 table is created with either -** "detail=none" "content=" option (i.e. if it is a contentless table), -** then this API always iterates through an empty set (all calls to +** "detail=none" option. If the FTS5 table is created with either +** "detail=none" "content=" option (i.e. if it is a contentless table), +** then this API always iterates through an empty set (all calls to ** xPhraseFirstColumn() set iCol to -1). ** ** The information accessed using this API and its companion ** xPhraseFirstColumn() may also be obtained using xPhraseFirst/xPhraseNext ** (or xInst/xInstCount). The chief advantage of this API is that it is ** significantly more efficient than those alternatives when used with -** "detail=column" tables. +** "detail=column" tables. ** ** xPhraseNextColumn() ** See xPhraseFirstColumn above. @@ -12614,7 +12614,7 @@ struct Fts5ExtensionApi { int (*xRowCount)(Fts5Context*, sqlite3_int64 *pnRow); int (*xColumnTotalSize)(Fts5Context*, int iCol, sqlite3_int64 *pnToken); - int (*xTokenize)(Fts5Context*, + int (*xTokenize)(Fts5Context*, const char *pText, int nText, /* Text to tokenize */ void *pCtx, /* Context passed to xToken() */ int (*xToken)(void*, int, const char*, int, int, int) /* Callback */ @@ -12643,15 +12643,15 @@ struct Fts5ExtensionApi { void (*xPhraseNextColumn)(Fts5Context*, Fts5PhraseIter*, int *piCol); }; -/* +/* ** CUSTOM AUXILIARY FUNCTIONS *************************************************************************/ /************************************************************************* ** CUSTOM TOKENIZERS ** -** Applications may also register custom tokenizer types. A tokenizer -** is registered by providing fts5 with a populated instance of the +** Applications may also register custom tokenizer types. A tokenizer +** is registered by providing fts5 with a populated instance of the ** following structure. All structure methods must be defined, setting ** any member of the fts5_tokenizer struct to NULL leads to undefined ** behaviour. The structure methods are expected to function as follows: @@ -12662,16 +12662,16 @@ struct Fts5ExtensionApi { ** ** The first argument passed to this function is a copy of the (void*) ** pointer provided by the application when the fts5_tokenizer object -** was registered with FTS5 (the third argument to xCreateTokenizer()). +** was registered with FTS5 (the third argument to xCreateTokenizer()). ** The second and third arguments are an array of nul-terminated strings ** containing the tokenizer arguments, if any, specified following the ** tokenizer name as part of the CREATE VIRTUAL TABLE statement used ** to create the FTS5 table. ** -** The final argument is an output variable. If successful, (*ppOut) +** The final argument is an output variable. If successful, (*ppOut) ** should be set to point to the new tokenizer handle and SQLITE_OK ** returned. If an error occurs, some value other than SQLITE_OK should -** be returned. In this case, fts5 assumes that the final value of *ppOut +** be returned. In this case, fts5 assumes that the final value of *ppOut ** is undefined. ** ** xDelete: @@ -12680,7 +12680,7 @@ struct Fts5ExtensionApi { ** be invoked exactly once for each successful call to xCreate(). ** ** xTokenize: -** This function is expected to tokenize the nText byte string indicated +** This function is expected to tokenize the nText byte string indicated ** by argument pText. pText may or may not be nul-terminated. The first ** argument passed to this function is a pointer to an Fts5Tokenizer object ** returned by an earlier call to xCreate(). @@ -12694,8 +12694,8 @@ struct Fts5ExtensionApi { ** determine the set of tokens to add to (or delete from) the ** FTS index. ** -**
  • FTS5_TOKENIZE_QUERY - A MATCH query is being executed -** against the FTS index. The tokenizer is being called to tokenize +**
  • FTS5_TOKENIZE_QUERY - A MATCH query is being executed +** against the FTS index. The tokenizer is being called to tokenize ** a bareword or quoted string specified as part of the query. ** **
  • (FTS5_TOKENIZE_QUERY | FTS5_TOKENIZE_PREFIX) - Same as @@ -12703,10 +12703,10 @@ struct Fts5ExtensionApi { ** followed by a "*" character, indicating that the last token ** returned by the tokenizer will be treated as a token prefix. ** -**
  • FTS5_TOKENIZE_AUX - The tokenizer is being invoked to +**
  • FTS5_TOKENIZE_AUX - The tokenizer is being invoked to ** satisfy an fts5_api.xTokenize() request made by an auxiliary ** function. Or an fts5_api.xColumnSize() request made by the same -** on a columnsize=0 database. +** on a columnsize=0 database. ** ** ** For each token in the input string, the supplied callback xToken() must @@ -12718,10 +12718,10 @@ struct Fts5ExtensionApi { ** which the token is derived within the input. ** ** The second argument passed to the xToken() callback ("tflags") should -** normally be set to 0. The exception is if the tokenizer supports +** normally be set to 0. The exception is if the tokenizer supports ** synonyms. In this case see the discussion below for details. ** -** FTS5 assumes the xToken() callback is invoked for each token in the +** FTS5 assumes the xToken() callback is invoked for each token in the ** order that they occur within the input text. ** ** If an xToken() callback returns any value other than SQLITE_OK, then @@ -12735,7 +12735,7 @@ struct Fts5ExtensionApi { ** SYNONYM SUPPORT ** ** Custom tokenizers may also support synonyms. Consider a case in which a -** user wishes to query for a phrase such as "first place". Using the +** user wishes to query for a phrase such as "first place". Using the ** built-in tokenizers, the FTS5 query 'first + place' will match instances ** of "first place" within the document set, but not alternative forms ** such as "1st place". In some applications, it would be better to match @@ -12744,7 +12744,7 @@ struct Fts5ExtensionApi { ** ** There are several ways to approach this in FTS5: ** -**
    1. By mapping all synonyms to a single token. In this case, the +**
      1. By mapping all synonyms to a single token. In this case, the ** In the above example, this means that the tokenizer returns the ** same token for inputs "first" and "1st". Say that token is in ** fact "first", so that when the user inserts the document "I won @@ -12755,34 +12755,34 @@ struct Fts5ExtensionApi { ** **
      2. By querying the index for all synonyms of each query term ** separately. In this case, when tokenizing query text, the -** tokenizer may provide multiple synonyms for a single term -** within the document. FTS5 then queries the index for each +** tokenizer may provide multiple synonyms for a single term +** within the document. FTS5 then queries the index for each ** synonym individually. For example, faced with the query: ** ** ** ... MATCH 'first place' ** ** the tokenizer offers both "1st" and "first" as synonyms for the -** first token in the MATCH query and FTS5 effectively runs a query +** first token in the MATCH query and FTS5 effectively runs a query ** similar to: ** ** ** ... MATCH '(first OR 1st) place' ** ** except that, for the purposes of auxiliary functions, the query -** still appears to contain just two phrases - "(first OR 1st)" +** still appears to contain just two phrases - "(first OR 1st)" ** being treated as a single phrase. ** **
      3. By adding multiple synonyms for a single term to the FTS index. ** Using this method, when tokenizing document text, the tokenizer -** provides multiple synonyms for each token. So that when a +** provides multiple synonyms for each token. So that when a ** document such as "I won first place" is tokenized, entries are ** added to the FTS index for "i", "won", "first", "1st" and ** "place". ** ** This way, even if the tokenizer does not provide synonyms ** when tokenizing query text (it should not - to do so would be -** inefficient), it doesn't matter if the user queries for +** inefficient), it doesn't matter if the user queries for ** 'first + place' or '1st + place', as there are entries in the ** FTS index corresponding to both forms of the first token. **
      @@ -12803,11 +12803,11 @@ struct Fts5ExtensionApi { ** ** It is an error to specify the FTS5_TOKEN_COLOCATED flag the first time ** xToken() is called. Multiple synonyms may be specified for a single token -** by making multiple calls to xToken(FTS5_TOKEN_COLOCATED) in sequence. +** by making multiple calls to xToken(FTS5_TOKEN_COLOCATED) in sequence. ** There is no limit to the number of synonyms that may be provided for a ** single token. ** -** In many cases, method (1) above is the best approach. It does not add +** In many cases, method (1) above is the best approach. It does not add ** extra data to the FTS index or require FTS5 to query for multiple terms, ** so it is efficient in terms of disk space and query speed. However, it ** does not support prefix queries very well. If, as suggested above, the @@ -12819,18 +12819,18 @@ struct Fts5ExtensionApi { ** will not match documents that contain the token "1st" (as the tokenizer ** will probably not map "1s" to any prefix of "first"). ** -** For full prefix support, method (3) may be preferred. In this case, +** For full prefix support, method (3) may be preferred. In this case, ** because the index contains entries for both "first" and "1st", prefix ** queries such as 'fi*' or '1s*' will match correctly. However, because ** extra entries are added to the FTS index, this method uses more space ** within the database. ** ** Method (2) offers a midpoint between (1) and (3). Using this method, -** a query such as '1s*' will match documents that contain the literal +** a query such as '1s*' will match documents that contain the literal ** token "1st", but not "first" (assuming the tokenizer is not able to ** provide synonyms for prefixes). However, a non-prefix query like '1st' ** will match against "1st" and "first". This method does not require -** extra disk space, as no extra entries are added to the FTS index. +** extra disk space, as no extra entries are added to the FTS index. ** On the other hand, it may require more CPU cycles to run MATCH queries, ** as separate queries of the FTS index are required for each synonym. ** @@ -12844,10 +12844,10 @@ typedef struct fts5_tokenizer fts5_tokenizer; struct fts5_tokenizer { int (*xCreate)(void*, const char **azArg, int nArg, Fts5Tokenizer **ppOut); void (*xDelete)(Fts5Tokenizer*); - int (*xTokenize)(Fts5Tokenizer*, + int (*xTokenize)(Fts5Tokenizer*, void *pCtx, int flags, /* Mask of FTS5_TOKENIZE_* flags */ - const char *pText, int nText, + const char *pText, int nText, int (*xToken)( void *pCtx, /* Copy of 2nd argument to xTokenize() */ int tflags, /* Mask of FTS5_TOKEN_* flags */ @@ -12944,7 +12944,7 @@ struct fts5_api { ** May you share freely, never taking more than you give. ** ************************************************************************* -** +** ** This file defines various limits of what SQLite can process. */ @@ -12992,9 +12992,9 @@ struct fts5_api { #endif /* -** The maximum depth of an expression tree. This is limited to -** some extent by SQLITE_MAX_SQL_LENGTH. But sometime you might -** want to place more severe limits on the complexity of an +** The maximum depth of an expression tree. This is limited to +** some extent by SQLITE_MAX_SQL_LENGTH. But sometime you might +** want to place more severe limits on the complexity of an ** expression. ** ** A value of 0 used to mean that the limit was not enforced. @@ -13076,10 +13076,10 @@ struct fts5_api { ** ** Earlier versions of SQLite allowed the user to change this value at ** compile time. This is no longer permitted, on the grounds that it creates -** a library that is technically incompatible with an SQLite library -** compiled with a different limit. If a process operating on a database -** with a page-size of 65536 bytes crashes, then an instance of SQLite -** compiled with the default page-size limit will not be able to rollback +** a library that is technically incompatible with an SQLite library +** compiled with a different limit. If a process operating on a database +** with a page-size of 65536 bytes crashes, then an instance of SQLite +** compiled with the default page-size limit will not be able to rollback ** the aborted transaction. This could lead to database corruption. */ #ifdef SQLITE_MAX_PAGE_SIZE @@ -13138,7 +13138,7 @@ struct fts5_api { ** Maximum depth of recursion for triggers. ** ** A value of 1 means that a trigger program will not be able to itself -** fire any triggers. A value of 0 means that no trigger programs at all +** fire any triggers. A value of 0 means that no trigger programs at all ** may be executed. */ #ifndef SQLITE_MAX_TRIGGER_DEPTH @@ -13536,7 +13536,7 @@ typedef struct HashElem HashElem; ** element pointed to plus the next _ht.count-1 elements in the list. ** ** Hash.htsize and Hash.ht may be zero. In that case lookup is done -** by a linear search of the global list. For small tables, the +** by a linear search of the global list. For small tables, the ** Hash.ht table is never allocated because if there are few elements ** in the table, it is faster to do a linear search than to manage ** the hash table. @@ -13551,7 +13551,7 @@ struct Hash { } *ht; }; -/* Each element in the hash table is an instance of the following +/* Each element in the hash table is an instance of the following ** structure. All elements are stored on a single doubly-linked list. ** ** Again, this structure is intended to be opaque, but it can't really @@ -13898,7 +13898,7 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); #endif /* -** The compile-time options SQLITE_MMAP_READWRITE and +** The compile-time options SQLITE_MMAP_READWRITE and ** SQLITE_ENABLE_BATCH_ATOMIC_WRITE are not compatible with one another. ** You must choose one or the other (or neither) but not both. */ @@ -14521,7 +14521,7 @@ SQLITE_PRIVATE int sqlite3BtreeNewDb(Btree *p); /* ** The second parameter to sqlite3BtreeGetMeta or sqlite3BtreeUpdateMeta -** should be one of the following values. The integer values are assigned +** should be one of the following values. The integer values are assigned ** to constants so that the offset of the corresponding field in an ** SQLite database header may be found using the following formula: ** @@ -14592,7 +14592,7 @@ SQLITE_PRIVATE int sqlite3BtreeNewDb(Btree *p); #define BTREE_BULKLOAD 0x00000001 /* Used to full index in sorted order */ #define BTREE_SEEK_EQ 0x00000002 /* EQ seeks only - no range seeks */ -/* +/* ** Flags passed as the third argument to sqlite3BtreeCursor(). ** ** For read-only cursors the wrFlag argument is always zero. For read-write @@ -14660,7 +14660,7 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor*, u8 flags); ** The nMem field might be zero, indicating that no decomposition is available. ** ** Table btrees (used for rowid tables) contain an integer rowid used as -** the key and passed in the nKey field. The pKey field is zero. +** the key and passed in the nKey field. The pKey field is zero. ** pData,nData hold the content of the new entry. nZero extra zero bytes ** are appended to the end of the content when constructing the entry. ** The aMem,nMem fields are uninitialized for table btrees. @@ -14679,7 +14679,7 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor*, u8 flags); ** ** This object is used to pass information into sqlite3BtreeInsert(). The ** same information used to be passed as five separate parameters. But placing -** the information into this object helps to keep the interface more +** the information into this object helps to keep the interface more ** organized and understandable, and it also helps the resulting code to ** run a little faster by using fewer registers for parameter passing. */ @@ -14754,7 +14754,7 @@ SQLITE_PRIVATE int sqlite3BtreeSharable(Btree*); SQLITE_PRIVATE void sqlite3BtreeEnterCursor(BtCursor*); SQLITE_PRIVATE int sqlite3BtreeConnectionCount(Btree*); #else -# define sqlite3BtreeEnter(X) +# define sqlite3BtreeEnter(X) # define sqlite3BtreeEnterAll(X) # define sqlite3BtreeSharable(X) 0 # define sqlite3BtreeEnterCursor(X) @@ -14928,7 +14928,7 @@ typedef struct VdbeOpList VdbeOpList; #define P5_ConstraintFK 4 /* -** The Vdbe.aColName array contains 5n Mem structures, where n is the +** The Vdbe.aColName array contains 5n Mem structures, where n is the ** number of columns of data returned by the statement. */ #define COLNAME_NAME 0 @@ -15421,8 +15421,8 @@ SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE*, int, VdbeOp*); #define SQLITE_PAGER_H /* -** Default maximum size for persistent journal files. A negative -** value means no limit. This value may be overridden using the +** Default maximum size for persistent journal files. A negative +** value means no limit. This value may be overridden using the ** sqlite3PagerJournalSizeLimit() API. See also "PRAGMA journal_size_limit". */ #ifndef SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT @@ -15448,9 +15448,9 @@ typedef struct PgHdr DbPage; /* ** Page number PAGER_MJ_PGNO is never used in an SQLite database (it is ** reserved for working around a windows/posix incompatibility). It is -** used in the journal to signify that the remainder of the journal file +** used in the journal to signify that the remainder of the journal file ** is devoted to storing a master journal name - there are no more pages to -** roll back. See comments for function writeMasterJournal() in pager.c +** roll back. See comments for function writeMasterJournal() in pager.c ** for details. */ #define PAGER_MJ_PGNO(x) ((Pgno)((PENDING_BYTE/((x)->pageSize))+1)) @@ -15511,11 +15511,11 @@ typedef struct PgHdr DbPage; /* ** The remainder of this file contains the declarations of the functions -** that make up the Pager sub-system API. See source code comments for +** that make up the Pager sub-system API. See source code comments for ** a detailed description of each routine. */ -/* Open and close a Pager connection. */ +/* Open and close a Pager connection. */ SQLITE_PRIVATE int sqlite3PagerOpen( sqlite3_vfs*, Pager **ppPager, @@ -15548,7 +15548,7 @@ SQLITE_PRIVATE i64 sqlite3PagerJournalSizeLimit(Pager *, i64); SQLITE_PRIVATE sqlite3_backup **sqlite3PagerBackupPtr(Pager*); SQLITE_PRIVATE int sqlite3PagerFlush(Pager*); -/* Functions used to obtain and release page references. */ +/* Functions used to obtain and release page references. */ SQLITE_PRIVATE int sqlite3PagerGet(Pager *pPager, Pgno pgno, DbPage **ppPage, int clrFlag); SQLITE_PRIVATE DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno); SQLITE_PRIVATE void sqlite3PagerRef(DbPage*); @@ -15561,8 +15561,8 @@ SQLITE_PRIVATE int sqlite3PagerWrite(DbPage*); SQLITE_PRIVATE void sqlite3PagerDontWrite(DbPage*); SQLITE_PRIVATE int sqlite3PagerMovepage(Pager*,DbPage*,Pgno,int); SQLITE_PRIVATE int sqlite3PagerPageRefcount(DbPage*); -SQLITE_PRIVATE void *sqlite3PagerGetData(DbPage *); -SQLITE_PRIVATE void *sqlite3PagerGetExtra(DbPage *); +SQLITE_PRIVATE void *sqlite3PagerGetData(DbPage *); +SQLITE_PRIVATE void *sqlite3PagerGetExtra(DbPage *); /* Functions used to manage pager transactions and savepoints. */ SQLITE_PRIVATE void sqlite3PagerPagecount(Pager*, int*); @@ -15664,7 +15664,7 @@ SQLITE_PRIVATE void sqlite3PagerRefdump(Pager*); ** ************************************************************************* ** This header file defines the interface that the sqlite page cache -** subsystem. +** subsystem. */ #ifndef _PCACHE_H_ @@ -15690,7 +15690,7 @@ struct PgHdr { u16 flags; /* PGHDR flags defined below */ /********************************************************************** - ** Elements above, except pCache, are public. All that follow are + ** Elements above, except pCache, are public. All that follow are ** private to pcache.c and should not be accessed by other modules. ** pCache is grouped with the public elements for efficiency. */ @@ -15743,7 +15743,7 @@ SQLITE_PRIVATE int sqlite3PcacheSetPageSize(PCache *, int); SQLITE_PRIVATE int sqlite3PcacheSize(void); /* One release per successful fetch. Page is pinned until released. -** Reference counted. +** Reference counted. */ SQLITE_PRIVATE sqlite3_pcache_page *sqlite3PcacheFetch(PCache*, Pgno, int createFlag); SQLITE_PRIVATE int sqlite3PcacheFetchStress(PCache*, Pgno, sqlite3_pcache_page**); @@ -15787,7 +15787,7 @@ SQLITE_PRIVATE int sqlite3PcachePagecount(PCache*); #if defined(SQLITE_CHECK_PAGES) || defined(SQLITE_DEBUG) /* Iterate through all dirty pages currently stored in the cache. This -** interface is only available if SQLITE_CHECK_PAGES is defined when the +** interface is only available if SQLITE_CHECK_PAGES is defined when the ** library is built. */ SQLITE_PRIVATE void sqlite3PcacheIterateDirty(PCache *pCache, void (*xIter)(PgHdr *)); @@ -15962,10 +15962,10 @@ SQLITE_PRIVATE int sqlite3PCacheIsDirty(PCache *pCache); ** 2006-10-31: The default prefix used to be "sqlite_". But then ** Mcafee started using SQLite in their anti-virus product and it ** started putting files with the "sqlite" name in the c:/temp folder. -** This annoyed many windows users. Those users would then do a +** This annoyed many windows users. Those users would then do a ** Google search for "sqlite", find the telephone numbers of the ** developers and call to wake them up at night and complain. -** For this reason, the default name prefix is changed to be "sqlite" +** For this reason, the default name prefix is changed to be "sqlite" ** spelled backwards. So the temp files are still identified, but ** anybody smart enough to figure out the code is also likely smart ** enough to know that calling the developer will not help get rid @@ -16006,9 +16006,9 @@ SQLITE_PRIVATE int sqlite3PCacheIsDirty(PCache *pCache); ** UnlockFile(). ** ** LockFile() prevents not just writing but also reading by other processes. -** A SHARED_LOCK is obtained by locking a single randomly-chosen -** byte out of a specific range of bytes. The lock byte is obtained at -** random so two separate readers can probably access the file at the +** A SHARED_LOCK is obtained by locking a single randomly-chosen +** byte out of a specific range of bytes. The lock byte is obtained at +** random so two separate readers can probably access the file at the ** same time, unless they are unlucky and choose the same lock byte. ** An EXCLUSIVE_LOCK is obtained by locking all bytes in the range. ** There can only be one writer. A RESERVED_LOCK is obtained by locking @@ -16027,7 +16027,7 @@ SQLITE_PRIVATE int sqlite3PCacheIsDirty(PCache *pCache); ** The following #defines specify the range of bytes used for locking. ** SHARED_SIZE is the number of bytes available in the pool from which ** a random byte is selected for a shared lock. The pool of bytes for -** shared locks begins at SHARED_FIRST. +** shared locks begins at SHARED_FIRST. ** ** The same locking strategy and ** byte ranges are used for Unix. This leaves open the possibility of having @@ -16043,7 +16043,7 @@ SQLITE_PRIVATE int sqlite3PCacheIsDirty(PCache *pCache); ** that all locks will fit on a single page even at the minimum page size. ** PENDING_BYTE defines the beginning of the locks. By default PENDING_BYTE ** is set high so that we don't have to allocate an unused page except -** for very large databases. But one should test the page skipping logic +** for very large databases. But one should test the page skipping logic ** by setting PENDING_BYTE low and running the entire regression suite. ** ** Changing the value of PENDING_BYTE results in a subtly incompatible @@ -16067,8 +16067,8 @@ SQLITE_PRIVATE int sqlite3PCacheIsDirty(PCache *pCache); */ SQLITE_PRIVATE int sqlite3OsInit(void); -/* -** Functions for accessing sqlite3_file methods +/* +** Functions for accessing sqlite3_file methods */ SQLITE_PRIVATE void sqlite3OsClose(sqlite3_file*); SQLITE_PRIVATE int sqlite3OsRead(sqlite3_file*, void*, int amt, i64 offset); @@ -16094,8 +16094,8 @@ SQLITE_PRIVATE int sqlite3OsFetch(sqlite3_file *id, i64, int, void **); SQLITE_PRIVATE int sqlite3OsUnfetch(sqlite3_file *, i64, void *); -/* -** Functions for accessing sqlite3_vfs methods +/* +** Functions for accessing sqlite3_vfs methods */ SQLITE_PRIVATE int sqlite3OsOpen(sqlite3_vfs *, const char *, sqlite3_file*, int, int *); SQLITE_PRIVATE int sqlite3OsDelete(sqlite3_vfs *, const char *, int); @@ -16113,7 +16113,7 @@ SQLITE_PRIVATE int sqlite3OsGetLastError(sqlite3_vfs*); SQLITE_PRIVATE int sqlite3OsCurrentTimeInt64(sqlite3_vfs *, sqlite3_int64*); /* -** Convenience functions for opening and closing files using +** Convenience functions for opening and closing files using ** sqlite3_malloc() to obtain space for the file-handle structure. */ SQLITE_PRIVATE int sqlite3OsOpenMalloc(sqlite3_vfs *, const char *, sqlite3_file **, int,int*); @@ -16183,9 +16183,9 @@ SQLITE_PRIVATE void sqlite3OsCloseFree(sqlite3_file *); */ #define sqlite3_mutex_alloc(X) ((sqlite3_mutex*)8) #define sqlite3_mutex_free(X) -#define sqlite3_mutex_enter(X) +#define sqlite3_mutex_enter(X) #define sqlite3_mutex_try(X) SQLITE_OK -#define sqlite3_mutex_leave(X) +#define sqlite3_mutex_leave(X) #define sqlite3_mutex_held(X) ((void)(X),1) #define sqlite3_mutex_notheld(X) ((void)(X),1) #define sqlite3MutexAlloc(X) ((sqlite3_mutex*)8) @@ -16767,7 +16767,7 @@ struct FuncDestructor { ** PURE_DATE(zName, nArg, iArg, bNC, xFunc) ** Used for "pure" date/time functions, this macro is like DFUNCTION ** except that it does set the SQLITE_FUNC_CONSTANT flags. iArg is -** ignored and the user-data for these functions is set to an +** ignored and the user-data for these functions is set to an ** arbitrary non-NULL pointer. The bNC parameter is not used. ** ** AGGREGATE(zName, nArg, iArg, bNC, xStep, xFinal) @@ -17877,7 +17877,7 @@ struct NameContext { ** conflict-target clause.) The pUpsertTargetWhere is the optional ** WHERE clause used to identify partial unique indexes. ** -** pUpsertSet is the list of column=expr terms of the UPDATE statement. +** pUpsertSet is the list of column=expr terms of the UPDATE statement. ** The pUpsertSet field is NULL for a ON CONFLICT DO NOTHING. The ** pUpsertWhere is the WHERE clause for the UPDATE and is NULL if the ** WHERE clause is omitted. @@ -19441,10 +19441,10 @@ SQLITE_PRIVATE int sqlite3KeyInfoIsWriteable(KeyInfo*); #endif SQLITE_PRIVATE int sqlite3CreateFunc(sqlite3 *, const char *, int, int, void *, void (*)(sqlite3_context*,int,sqlite3_value **), - void (*)(sqlite3_context*,int,sqlite3_value **), + void (*)(sqlite3_context*,int,sqlite3_value **), void (*)(sqlite3_context*), void (*)(sqlite3_context*), - void (*)(sqlite3_context*,int,sqlite3_value **), + void (*)(sqlite3_context*,int,sqlite3_value **), FuncDestructor *pDestructor ); SQLITE_PRIVATE void sqlite3NoopDestructor(void*); @@ -19795,7 +19795,7 @@ SQLITE_PRIVATE const char **sqlite3CompileOptions(int *pnOpt); /* #include "sqliteInt.h" */ /* An array to map all upper-case characters into their corresponding -** lower-case character. +** lower-case character. ** ** SQLite only considers US-ASCII (or EBCDIC) characters. We do not ** handle case conversions for the UTF character set since the tables @@ -19862,7 +19862,7 @@ SQLITE_PRIVATE const unsigned char sqlite3UpperToLower[] = { ** The equivalent of tolower() is implemented using the sqlite3UpperToLower[] ** array. tolower() is used more often than toupper() by SQLite. ** -** Bit 0x40 is set if the character is non-alphanumeric and can be used in an +** Bit 0x40 is set if the character is non-alphanumeric and can be used in an ** SQLite identifier. Identifiers are alphanumerics, "_", "$", and any ** non-ASCII UTF character. Hence the test for whether or not a character is ** part of an identifier is 0x46. @@ -19936,7 +19936,7 @@ SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[256] = { #if !defined(SQLITE_ALLOW_COVERING_INDEX_SCAN) # define SQLITE_ALLOW_COVERING_INDEX_SCAN 1 #else -# if !SQLITE_ALLOW_COVERING_INDEX_SCAN +# if !SQLITE_ALLOW_COVERING_INDEX_SCAN # error "Compile-time disabling of covering index scan using the\ -DSQLITE_ALLOW_COVERING_INDEX_SCAN=0 option is deprecated.\ Contact SQLite developers if this is a problem for you, and\ @@ -19959,7 +19959,7 @@ SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[256] = { ** if journal_mode=MEMORY or if temp_store=MEMORY, regardless of this ** setting.) */ -#ifndef SQLITE_STMTJRNL_SPILL +#ifndef SQLITE_STMTJRNL_SPILL # define SQLITE_STMTJRNL_SPILL (64*1024) #endif @@ -20086,7 +20086,7 @@ SQLITE_PRIVATE int sqlite3PendingByte = 0x40000000; ** Properties of opcodes. The OPFLG_INITIALIZER macro is ** created by mkopcodeh.awk during compilation. Data is obtained ** from the comments following the "case OP_xxxx:" statements in -** the vdbe.c file. +** the vdbe.c file. */ SQLITE_PRIVATE const unsigned char sqlite3OpcodeProperty[] = OPFLG_INITIALIZER; @@ -20257,7 +20257,7 @@ struct VdbeCursor { ** When a sub-program is executed (OP_Program), a structure of this type ** is allocated to store the current value of the program counter, as ** well as the current memory cell array and various other frame specific -** values stored in the Vdbe struct. When the sub-program is finished, +** values stored in the Vdbe struct. When the sub-program is finished, ** these values are copied back to the Vdbe from the VdbeFrame structure, ** restoring the state of the VM to as it was before the sub-program ** began executing. @@ -20354,7 +20354,7 @@ struct sqlite3_value { ** If the MEM_Str flag is set then Mem.z points at a string representation. ** Usually this is encoded in the same unicode encoding as the main ** database (see below for exceptions). If the MEM_Term flag is also -** set, then the string is nul terminated. The MEM_Int and MEM_Real +** set, then the string is nul terminated. The MEM_Int and MEM_Real ** flags may coexist with the MEM_Str flag. */ #define MEM_Null 0x0001 /* Value is NULL (or a pointer) */ @@ -20414,7 +20414,7 @@ struct sqlite3_value { #endif /* -** Each auxiliary data pointer stored by a user defined function +** Each auxiliary data pointer stored by a user defined function ** implementation calling sqlite3_set_auxdata() is stored in an instance ** of this structure. All such structures associated with a single VM ** are stored in a linked list headed at Vdbe.pAuxData. All are destroyed @@ -20574,7 +20574,7 @@ struct Vdbe { #define VDBE_MAGIC_DEAD 0x5606c3c8 /* The VDBE has been deallocated */ /* -** Structure used to store the context required by the +** Structure used to store the context required by the ** sqlite3_preupdate_*() API functions. */ struct PreUpdate { @@ -20589,7 +20589,7 @@ struct PreUpdate { i64 iKey1; /* First key value passed to hook */ i64 iKey2; /* Second key value passed to hook */ Mem *aNew; /* Array of new.* values */ - Table *pTab; /* Schema object being upated */ + Table *pTab; /* Schema object being upated */ Index *pPk; /* PK index if pTab is WITHOUT ROWID */ }; @@ -20686,7 +20686,7 @@ SQLITE_PRIVATE void sqlite3VdbeAssertAbortable(Vdbe*); # define sqlite3VdbeAssertAbortable(V) #endif -#if !defined(SQLITE_OMIT_SHARED_CACHE) +#if !defined(SQLITE_OMIT_SHARED_CACHE) SQLITE_PRIVATE void sqlite3VdbeEnter(Vdbe*); #else # define sqlite3VdbeEnter(X) @@ -20955,7 +20955,7 @@ SQLITE_API int sqlite3_db_status( break; } - /* + /* ** Return an approximation for the amount of memory currently used ** by all pagers associated with the given database connection. The ** highwater mark is meaningless and is returned as zero. @@ -20999,7 +20999,7 @@ SQLITE_API int sqlite3_db_status( HashElem *p; nByte += sqlite3GlobalConfig.m.xRoundup(sizeof(HashElem)) * ( - pSchema->tblHash.count + pSchema->tblHash.count + pSchema->trigHash.count + pSchema->idxHash.count + pSchema->fkeyHash.count @@ -21049,7 +21049,7 @@ SQLITE_API int sqlite3_db_status( /* ** Set *pCurrent to the total cache hits or misses encountered by all - ** pagers the database handle is connected to. *pHighwater is always set + ** pagers the database handle is connected to. *pHighwater is always set ** to zero. */ case SQLITE_DBSTATUS_CACHE_SPILL: @@ -21108,7 +21108,7 @@ SQLITE_API int sqlite3_db_status( ** ************************************************************************* ** This file contains the C functions that implement date and time -** functions for SQLite. +** functions for SQLite. ** ** There is only one exported symbol in this file - the function ** sqlite3RegisterDateTimeFunctions() found at the bottom of the file. @@ -21117,7 +21117,7 @@ SQLITE_API int sqlite3_db_status( ** SQLite processes all times and dates as julian day numbers. The ** dates and times are stored as the number of days since noon ** in Greenwich on November 24, 4714 B.C. according to the Gregorian -** calendar system. +** calendar system. ** ** 1970-01-01 00:00:00 is JD 2440587.5 ** 2000-01-01 00:00:00 is JD 2451544.5 @@ -21465,7 +21465,7 @@ static void setRawDateNumber(DateTime *p, double r){ ** The following are acceptable forms for the input string: ** ** YYYY-MM-DD HH:MM:SS.FFF +/-HH:MM -** DDDD.DD +** DDDD.DD ** now ** ** In the first form, the +/-HH:MM is always optional. The fractional @@ -21475,8 +21475,8 @@ static void setRawDateNumber(DateTime *p, double r){ ** as there is a year and date. */ static int parseDateOrTime( - sqlite3_context *context, - const char *zDate, + sqlite3_context *context, + const char *zDate, DateTime *p ){ double r; @@ -21497,7 +21497,7 @@ static int parseDateOrTime( ** Multiplying this by 86400000 gives 464269060799999 as the maximum value ** for DateTime.iJD. ** -** But some older compilers (ex: gcc 4.2.1 on older Macs) cannot deal with +** But some older compilers (ex: gcc 4.2.1 on older Macs) cannot deal with ** such a large integer literal, so we have to encode it. */ #define INT_464269060799999 ((((i64)0x1a640)<<32)|0x1072fdff) @@ -21579,14 +21579,14 @@ static void clearYMD_HMS_TZ(DateTime *p){ #ifndef SQLITE_OMIT_LOCALTIME /* ** On recent Windows platforms, the localtime_s() function is available -** as part of the "Secure CRT". It is essentially equivalent to -** localtime_r() available under most POSIX platforms, except that the +** as part of the "Secure CRT". It is essentially equivalent to +** localtime_r() available under most POSIX platforms, except that the ** order of the parameters is reversed. ** ** See http://msdn.microsoft.com/en-us/library/a442x3ye(VS.80).aspx. ** ** If the user has not indicated to use localtime_r() or localtime_s() -** already, check for an MSVC build environment that provides +** already, check for an MSVC build environment that provides ** localtime_s(). */ #if !HAVE_LOCALTIME_R && !HAVE_LOCALTIME_S \ @@ -21642,7 +21642,7 @@ static int osLocaltime(time_t *t, struct tm *pTm){ /* ** Compute the difference (in milliseconds) between localtime and UTC ** (a.k.a. GMT) for the time value p where p is in UTC. If no error occurs, -** return this value and set *pRc to SQLITE_OK. +** return this value and set *pRc to SQLITE_OK. ** ** Or, if an error does occur, set *pRc to SQLITE_ERROR. The returned value ** is undefined in this case. @@ -21969,9 +21969,9 @@ static int parseModifier( ** then assume a default value of "now" for argv[0]. */ static int isDate( - sqlite3_context *context, - int argc, - sqlite3_value **argv, + sqlite3_context *context, + int argc, + sqlite3_value **argv, DateTime *p ){ int i, n; @@ -22616,7 +22616,7 @@ SQLITE_PRIVATE int sqlite3OsRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufO }else{ return pVfs->xRandomness(pVfs, nByte, zBufOut); } - + } SQLITE_PRIVATE int sqlite3OsSleep(sqlite3_vfs *pVfs, int nMicro){ return pVfs->xSleep(pVfs, nMicro); @@ -22794,17 +22794,17 @@ SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs *pVfs){ ** ************************************************************************* ** -** This file contains code to support the concept of "benign" +** This file contains code to support the concept of "benign" ** malloc failures (when the xMalloc() or xRealloc() method of the ** sqlite3_mem_methods structure fails to allocate a block of memory -** and returns 0). +** and returns 0). ** ** Most malloc failures are non-benign. After they occur, SQLite ** abandons the current operation and returns an error code (usually ** SQLITE_NOMEM) to the user. However, sometimes a fault is not necessarily -** fatal. For example, if a malloc fails while resizing a hash table, this -** is completely recoverable simply by not carrying out the resize. The -** hash table will continue to function normally. So a malloc failure +** fatal. For example, if a malloc fails while resizing a hash table, this +** is completely recoverable simply by not carrying out the resize. The +** hash table will continue to function normally. So a malloc failure ** during a hash table resize is a benign fault. */ @@ -23006,7 +23006,7 @@ static malloc_zone_t* _sqliteZone_; #else /* if not __APPLE__ */ /* -** Use standard C library malloc and free on non-Apple systems. +** Use standard C library malloc and free on non-Apple systems. ** Also used by Apple systems if SQLITE_WITHOUT_ZONEMALLOC is defined. */ #define SQLITE_MALLOC(x) malloc(x) @@ -23186,7 +23186,7 @@ static int sqlite3MemInit(void *NotUsed){ /* defer MT decisions to system malloc */ _sqliteZone_ = malloc_default_zone(); }else{ - /* only 1 core, use our own zone to contention over global locks, + /* only 1 core, use our own zone to contention over global locks, ** e.g. we have our own dedicated locks */ _sqliteZone_ = malloc_create_zone(4096, 0); malloc_set_zone_name(_sqliteZone_, "Sqlite_Heap"); @@ -23310,7 +23310,7 @@ struct MemBlockHdr { ** when this module is combined with other in the amalgamation. */ static struct { - + /* ** Mutex to control access to the memory allocation subsystem. */ @@ -23321,7 +23321,7 @@ static struct { */ struct MemBlockHdr *pFirst; struct MemBlockHdr *pLast; - + /* ** The number of levels of backtrace to save in new allocations. */ @@ -23334,7 +23334,7 @@ static struct { int nTitle; /* Bytes of zTitle to save. Includes '\0' and padding */ char zTitle[100]; /* The title text */ - /* + /* ** sqlite3MallocDisallow() increments the following counter. ** sqlite3MallocAllow() decrements it. */ @@ -23393,7 +23393,7 @@ static struct MemBlockHdr *sqlite3MemsysGetHeader(void *pAllocation){ pU8 = (u8*)pAllocation; assert( pInt[nReserve/sizeof(int)]==(int)REARGUARD ); /* This checks any of the "extra" bytes allocated due - ** to rounding up to an 8 byte boundary to ensure + ** to rounding up to an 8 byte boundary to ensure ** they haven't been overwritten. */ while( nReserve-- > p->iSize ) assert( pU8[nReserve]==0x65 ); @@ -23522,7 +23522,7 @@ static void *sqlite3MemMalloc(int nByte){ p = (void*)pInt; } sqlite3_mutex_leave(mem.mutex); - return p; + return p; } /* @@ -23532,7 +23532,7 @@ static void sqlite3MemFree(void *pPrior){ struct MemBlockHdr *pHdr; void **pBt; char *z; - assert( sqlite3GlobalConfig.bMemstat || sqlite3GlobalConfig.bCoreMutex==0 + assert( sqlite3GlobalConfig.bMemstat || sqlite3GlobalConfig.bCoreMutex==0 || mem.mutex!=0 ); pHdr = sqlite3MemsysGetHeader(pPrior); pBt = (void**)pHdr; @@ -23558,15 +23558,15 @@ static void sqlite3MemFree(void *pPrior){ randomFill(z, sizeof(void*)*pHdr->nBacktraceSlots + sizeof(*pHdr) + (int)pHdr->iSize + sizeof(int) + pHdr->nTitle); free(z); - sqlite3_mutex_leave(mem.mutex); + sqlite3_mutex_leave(mem.mutex); } /* ** Change the size of an existing memory allocation. ** ** For this debugging implementation, we *always* make a copy of the -** allocation into a new place in memory. In this way, if the -** higher level code is using pointer to the old allocation, it is +** allocation into a new place in memory. In this way, if the +** higher level code is using pointer to the old allocation, it is ** much more likely to break and we are much more liking to find ** the error. */ @@ -23700,7 +23700,7 @@ SQLITE_PRIVATE void sqlite3MemdebugSync(){ } /* -** Open the file indicated and write a log of all unfreed memory +** Open the file indicated and write a log of all unfreed memory ** allocations into that log. */ SQLITE_PRIVATE void sqlite3MemdebugDump(const char *zFilename){ @@ -23717,7 +23717,7 @@ SQLITE_PRIVATE void sqlite3MemdebugDump(const char *zFilename){ for(pHdr=mem.pFirst; pHdr; pHdr=pHdr->pNext){ char *z = (char*)pHdr; z -= pHdr->nBacktraceSlots*sizeof(void*) + pHdr->nTitle; - fprintf(out, "**** %lld bytes at %p from %s ****\n", + fprintf(out, "**** %lld bytes at %p from %s ****\n", pHdr->iSize, &pHdr[1], pHdr->nTitle ? z : "???"); if( pHdr->nBacktrace ){ fflush(out); @@ -23730,7 +23730,7 @@ SQLITE_PRIVATE void sqlite3MemdebugDump(const char *zFilename){ fprintf(out, "COUNTS:\n"); for(i=0; i= M*(1 + log2(n)/2) - n + 1 @@ -24502,7 +24502,7 @@ SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys3(void){ /* #include "sqliteInt.h" */ /* -** This version of the memory allocator is used only when +** This version of the memory allocator is used only when ** SQLITE_ENABLE_MEMSYS5 is defined. */ #ifdef SQLITE_ENABLE_MEMSYS5 @@ -24547,7 +24547,7 @@ static SQLITE_WSD struct Mem5Global { int szAtom; /* Smallest possible allocation in bytes */ int nBlock; /* Number of szAtom sized blocks in zPool */ u8 *zPool; /* Memory available to be allocated */ - + /* ** Mutex to control access to the memory allocation subsystem. */ @@ -24566,7 +24566,7 @@ static SQLITE_WSD struct Mem5Global { u32 maxCount; /* Maximum instantaneous currentCount */ u32 maxRequest; /* Largest allocation (exclusive of internal frag) */ #endif - + /* ** Lists of free blocks. aiFreelist[0] is a list of free blocks of ** size mem5.szAtom. aiFreelist[1] holds blocks of size szAtom*2. @@ -24742,7 +24742,7 @@ static void memsys5FreeUnsafe(void *pOld){ u32 size, iLogsize; int iBlock; - /* Set iBlock to the index of the block pointed to by pOld in + /* Set iBlock to the index of the block pointed to by pOld in ** the array of mem5.szAtom byte blocks pointed to by mem5.zPool. */ iBlock = (int)(((u8 *)pOld-mem5.zPool)/mem5.szAtom); @@ -24811,7 +24811,7 @@ static void *memsys5Malloc(int nBytes){ p = memsys5MallocUnsafe(nBytes); memsys5Leave(); } - return (void*)p; + return (void*)p; } /* @@ -24824,14 +24824,14 @@ static void memsys5Free(void *pPrior){ assert( pPrior!=0 ); memsys5Enter(); memsys5FreeUnsafe(pPrior); - memsys5Leave(); + memsys5Leave(); } /* ** Change the size of an existing memory allocation. ** ** The outer layer memory allocator prevents this routine from -** being called with pPrior==0. +** being called with pPrior==0. ** ** nBytes is always a value obtained from a prior call to ** memsys5Round(). Hence nBytes is always a non-negative power @@ -24964,7 +24964,7 @@ static void memsys5Shutdown(void *NotUsed){ #ifdef SQLITE_TEST /* -** Open the file indicated and write a log of all unfreed memory +** Open the file indicated and write a log of all unfreed memory ** allocations into that log. */ SQLITE_PRIVATE void sqlite3Memsys5Dump(const char *zFilename){ @@ -25006,7 +25006,7 @@ SQLITE_PRIVATE void sqlite3Memsys5Dump(const char *zFilename){ #endif /* -** This routine is the only routine in this file with external +** This routine is the only routine in this file with external ** linkage. It returns a pointer to a static sqlite3_mem_methods ** struct populated with the memsys5 methods. */ @@ -25061,7 +25061,7 @@ static SQLITE_WSD int mutexIsInit = 0; /* ** This block (enclosed by SQLITE_ENABLE_MULTITHREADED_CHECKS) contains ** the implementation of a wrapper around the system default mutex -** implementation (sqlite3DefaultMutex()). +** implementation (sqlite3DefaultMutex()). ** ** Most calls are passed directly through to the underlying default ** mutex implementation. Except, if a mutex is configured by calling @@ -25072,7 +25072,7 @@ static SQLITE_WSD int mutexIsInit = 0; ** apps that usually use SQLITE_CONFIG_MULTITHREAD mode. */ -/* +/* ** Type for all mutexes used when SQLITE_ENABLE_MULTITHREADED_CHECKS ** is defined. Variable CheckMutex.mutex is a pointer to the real mutex ** allocated by the system mutex implementation. Variable iType is usually set @@ -25089,9 +25089,9 @@ struct CheckMutex { #define SQLITE_MUTEX_WARNONCONTENTION (-1) -/* +/* ** Pointer to real mutex methods object used by the CheckMutex -** implementation. Set by checkMutexInit(). +** implementation. Set by checkMutexInit(). */ static SQLITE_WSD const sqlite3_mutex_methods *pGlobalMutexMethods; @@ -25107,13 +25107,13 @@ static int checkMutexNotheld(sqlite3_mutex *p){ /* ** Initialize and deinitialize the mutex subsystem. */ -static int checkMutexInit(void){ +static int checkMutexInit(void){ pGlobalMutexMethods = sqlite3DefaultMutex(); - return SQLITE_OK; + return SQLITE_OK; } -static int checkMutexEnd(void){ +static int checkMutexEnd(void){ pGlobalMutexMethods = 0; - return SQLITE_OK; + return SQLITE_OK; } /* @@ -25187,7 +25187,7 @@ static void checkMutexEnter(sqlite3_mutex *p){ if( SQLITE_OK==pGlobalMutexMethods->xMutexTry(pCheck->mutex) ){ return; } - sqlite3_log(SQLITE_MISUSE, + sqlite3_log(SQLITE_MISUSE, "illegal multi-threaded access to database connection" ); } @@ -25246,11 +25246,11 @@ SQLITE_PRIVATE void sqlite3MutexWarnOnContention(sqlite3_mutex *p){ /* ** Initialize the mutex system. */ -SQLITE_PRIVATE int sqlite3MutexInit(void){ +SQLITE_PRIVATE int sqlite3MutexInit(void){ int rc = SQLITE_OK; if( !sqlite3GlobalConfig.mutex.xMutexAlloc ){ /* If the xMutexAlloc method has not been set, then the user did not - ** install a mutex implementation via sqlite3_config() prior to + ** install a mutex implementation via sqlite3_config() prior to ** sqlite3_initialize() being called. This block copies pointers to ** the default implementation into the sqlite3GlobalConfig structure. */ @@ -25361,7 +25361,7 @@ SQLITE_API int sqlite3_mutex_try(sqlite3_mutex *p){ /* ** The sqlite3_mutex_leave() routine exits a mutex that was previously -** entered by the same thread. The behavior is undefined if the mutex +** entered by the same thread. The behavior is undefined if the mutex ** is not currently entered. If a NULL pointer is passed as an argument ** this function is a no-op. */ @@ -25430,9 +25430,9 @@ SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex *p){ */ static int noopMutexInit(void){ return SQLITE_OK; } static int noopMutexEnd(void){ return SQLITE_OK; } -static sqlite3_mutex *noopMutexAlloc(int id){ +static sqlite3_mutex *noopMutexAlloc(int id){ UNUSED_PARAMETER(id); - return (sqlite3_mutex*)8; + return (sqlite3_mutex*)8; } static void noopMutexFree(sqlite3_mutex *p){ UNUSED_PARAMETER(p); return; } static void noopMutexEnter(sqlite3_mutex *p){ UNUSED_PARAMETER(p); return; } @@ -25497,7 +25497,7 @@ static int debugMutexEnd(void){ return SQLITE_OK; } /* ** The sqlite3_mutex_alloc() routine allocates a new ** mutex and returns a pointer to it. If it returns NULL -** that means that a mutex could not be allocated. +** that means that a mutex could not be allocated. */ static sqlite3_mutex *debugMutexAlloc(int id){ static sqlite3_debug_mutex aStatic[SQLITE_MUTEX_STATIC_VFS3 - 1]; @@ -25675,7 +25675,7 @@ struct sqlite3_mutex { ** there might be race conditions that can cause these routines to ** deliver incorrect results. In particular, if pthread_equal() is ** not an atomic operation, then these routines might delivery -** incorrect results. On most platforms, pthread_equal() is a +** incorrect results. On most platforms, pthread_equal() is a ** comparison of two integers and is therefore atomic. But we are ** told that HPUX is not such a platform. If so, then these routines ** will not always work correctly on HPUX. @@ -25757,7 +25757,7 @@ static int pthreadMutexEnd(void){ return SQLITE_OK; } ** ** Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST ** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc() -** returns a different mutex on every call. But for the static +** returns a different mutex on every call. But for the static ** mutex types, the same mutex is returned on every call that has ** the same type number. */ @@ -25868,7 +25868,7 @@ static void pthreadMutexEnter(sqlite3_mutex *p){ ** is atomic - that it cannot be deceived into thinking self ** and p->owner are equal if p->owner changes between two values ** that are not equal to self while the comparison is taking place. - ** This implementation also assumes a coherent cache - that + ** This implementation also assumes a coherent cache - that ** separate processes cannot read different values from the same ** address at the same time. If either of these two conditions ** are not met, then the mutexes will fail and problems will result. @@ -25911,7 +25911,7 @@ static int pthreadMutexTry(sqlite3_mutex *p){ ** is atomic - that it cannot be deceived into thinking self ** and p->owner are equal if p->owner changes between two values ** that are not equal to self while the comparison is taking place. - ** This implementation also assumes a coherent cache - that + ** This implementation also assumes a coherent cache - that ** separate processes cannot read different values from the same ** address at the same time. If either of these two conditions ** are not met, then the mutexes will fail and problems will result. @@ -26123,7 +26123,7 @@ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ __asm__ __volatile__ ("rdtsc" : "=A" (val)); return val; } - + #elif (defined(__GNUC__) && defined(__ppc__)) __inline__ sqlite_uint64 sqlite3Hwtime(void){ @@ -26774,7 +26774,7 @@ SQLITE_API int sqlite3_memory_alarm( #endif /* -** Set the soft heap-size limit for the library. Passing a zero or +** Set the soft heap-size limit for the library. Passing a zero or ** negative value indicates no limit. */ SQLITE_API sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 n){ @@ -26864,7 +26864,7 @@ SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag){ } /* -** Trigger the alarm +** Trigger the alarm */ static void sqlite3MallocAlarm(int nByte){ if( mem0.alarmThreshold<=0 ) return; @@ -27098,7 +27098,7 @@ SQLITE_PRIVATE void *sqlite3Realloc(void *pOld, u64 nBytes){ sqlite3_mutex_enter(mem0.mutex); sqlite3StatusHighwater(SQLITE_STATUS_MALLOC_SIZE, (int)nBytes); nDiff = nNew - nOld; - if( nDiff>0 && sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED) >= + if( nDiff>0 && sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED) >= mem0.alarmThreshold-nDiff ){ sqlite3MallocAlarm(nDiff); } @@ -27140,7 +27140,7 @@ SQLITE_API void *sqlite3_realloc64(void *pOld, sqlite3_uint64 n){ /* ** Allocate and zero memory. -*/ +*/ SQLITE_PRIVATE void *sqlite3MallocZero(u64 n){ void *p = sqlite3Malloc(n); if( p ){ @@ -27170,13 +27170,13 @@ static SQLITE_NOINLINE void *dbMallocRawFinish(sqlite3 *db, u64 n){ assert( db!=0 ); p = sqlite3Malloc(n); if( !p ) sqlite3OomFault(db); - sqlite3MemdebugSetType(p, + sqlite3MemdebugSetType(p, (db->lookaside.bDisable==0) ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP); return p; } /* -** Allocate memory, either lookaside (if possible) or heap. +** Allocate memory, either lookaside (if possible) or heap. ** If the allocation fails, set the mallocFailed flag in ** the connection pointer. ** @@ -27293,9 +27293,9 @@ SQLITE_PRIVATE void *sqlite3DbReallocOrFree(sqlite3 *db, void *p, u64 n){ } /* -** Make a copy of a string in memory obtained from sqliteMalloc(). These +** Make a copy of a string in memory obtained from sqliteMalloc(). These ** functions call sqlite3MallocRaw() directly instead of sqliteMalloc(). This -** is because when memory debugging is turned on, these two functions are +** is because when memory debugging is turned on, these two functions are ** called via macros that record the current file and line number in the ** ThreadData structure. */ @@ -27393,20 +27393,20 @@ static SQLITE_NOINLINE int apiOomError(sqlite3 *db){ } /* -** This function must be called before exiting any API function (i.e. +** This function must be called before exiting any API function (i.e. ** returning control to the user) that has called sqlite3_malloc or ** sqlite3_realloc. ** ** The returned value is normally a copy of the second argument to this ** function. However, if a malloc() failure has occurred since the previous -** invocation SQLITE_NOMEM is returned instead. +** invocation SQLITE_NOMEM is returned instead. ** ** If an OOM as occurred, then the connection error-code (the value ** returned by sqlite3_errcode()) is set to SQLITE_NOMEM. */ SQLITE_PRIVATE int sqlite3ApiExit(sqlite3* db, int rc){ /* If the db handle must hold the connection handle mutex here. - ** Otherwise the read (and possible write) of db->mallocFailed + ** Otherwise the read (and possible write) of db->mallocFailed ** is unsafe, as is the call to sqlite3Error(). */ assert( db!=0 ); @@ -27421,7 +27421,7 @@ SQLITE_PRIVATE int sqlite3ApiExit(sqlite3* db, int rc){ /************** Begin file printf.c ******************************************/ /* ** The "printf" code that follows dates from the 1980's. It is in -** the public domain. +** the public domain. ** ************************************************************************** ** @@ -27656,7 +27656,7 @@ SQLITE_API void sqlite3_str_vappendf( PrintfArguments *pArgList = 0; /* Arguments for SQLITE_PRINTF_SQLFUNC */ char buf[etBUFSIZE]; /* Conversion buffer */ - /* pAccum never starts out with an empty buffer that was obtained from + /* pAccum never starts out with an empty buffer that was obtained from ** malloc(). This precondition is required by the mprintf("%z...") ** optimization. */ assert( pAccum->nChar>0 || (pAccum->printfFlags&SQLITE_PRINTF_MALLOCED)==0 ); @@ -27821,7 +27821,7 @@ SQLITE_API void sqlite3_str_vappendf( sizeof(char*)==sizeof(long int) ? 1 : 0; /* Fall through into the next case */ case etORDINAL: - case etRADIX: + case etRADIX: cThousand = 0; /* Fall through into the next case */ case etDECIMAL: @@ -28574,7 +28574,7 @@ SQLITE_API char *sqlite3_vmprintf(const char *zFormat, va_list ap){ char zBase[SQLITE_PRINT_BUF_SIZE]; StrAccum acc; -#ifdef SQLITE_ENABLE_API_ARMOR +#ifdef SQLITE_ENABLE_API_ARMOR if( zFormat==0 ){ (void)SQLITE_MISUSE_BKPT; return 0; @@ -28733,7 +28733,7 @@ SQLITE_API void sqlite3_str_appendf(StrAccum *p, const char *zFormat, ...){ ** ** This file contains C code to implement the TreeView debugging routines. ** These routines print a parse tree to standard output for debugging and -** analysis. +** analysis. ** ** The interfaces in this file is only available when compiling ** with SQLITE_DEBUG. @@ -28869,7 +28869,7 @@ SQLITE_PRIVATE void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc) sqlite3_str_appendf(&x, " LEFT-JOIN"); } sqlite3StrAccumFinish(&x); - sqlite3TreeViewItem(pView, zLine, inSrc-1); + sqlite3TreeViewItem(pView, zLine, inSrc-1); if( pItem->pSelect ){ sqlite3TreeViewSelect(pView, pItem->pSelect, 0); } @@ -28889,7 +28889,7 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m if( p==0 ){ sqlite3TreeViewLine(pView, "nil-SELECT"); return; - } + } pView = sqlite3TreeViewPush(pView, moreToFollow); if( p->pWith ){ sqlite3TreeViewWith(pView, p->pWith, 1); @@ -29282,7 +29282,7 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m pWin = pExpr->y.pWin; #else pWin = 0; -#endif +#endif } if( pExpr->op==TK_AGG_FUNCTION ){ sqlite3TreeViewLine(pView, "AGG_FUNCTION%d %Q%s", @@ -29352,7 +29352,7 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m ** is set to the column of the pseudo-table to read, or to -1 to ** read the rowid field. */ - sqlite3TreeViewLine(pView, "%s(%d)", + sqlite3TreeViewLine(pView, "%s(%d)", pExpr->iTable ? "NEW" : "OLD", pExpr->iColumn); break; } @@ -29671,13 +29671,13 @@ SQLITE_PRIVATE int sqlite3ThreadCreate( memset(p, 0, sizeof(*p)); p->xTask = xTask; p->pIn = pIn; - /* If the SQLITE_TESTCTRL_FAULT_INSTALL callback is registered to a + /* If the SQLITE_TESTCTRL_FAULT_INSTALL callback is registered to a ** function that returns SQLITE_ERROR when passed the argument 200, that - ** forces worker threads to run sequentially and deterministically + ** forces worker threads to run sequentially and deterministically ** for testing purposes. */ if( sqlite3FaultSim(200) ){ rc = 1; - }else{ + }else{ rc = pthread_create(&p->tid, 0, xTask, pIn); } if( rc ){ @@ -29759,9 +29759,9 @@ SQLITE_PRIVATE int sqlite3ThreadCreate( *ppThread = 0; p = sqlite3Malloc(sizeof(*p)); if( p==0 ) return SQLITE_NOMEM_BKPT; - /* If the SQLITE_TESTCTRL_FAULT_INSTALL callback is registered to a + /* If the SQLITE_TESTCTRL_FAULT_INSTALL callback is registered to a ** function that returns SQLITE_ERROR when passed the argument 200, that - ** forces worker threads to run sequentially and deterministically + ** forces worker threads to run sequentially and deterministically ** (via the sqlite3FaultSim() term of the conditional) for testing ** purposes. */ if( sqlite3GlobalConfig.bCoreMutex==0 || sqlite3FaultSim(200) ){ @@ -29890,7 +29890,7 @@ SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread *p, void **ppOut){ ** May you share freely, never taking more than you give. ** ************************************************************************* -** This file contains routines used to translate between UTF-8, +** This file contains routines used to translate between UTF-8, ** UTF-16, UTF-16BE, and UTF-16LE. ** ** Notes on UTF-8: @@ -30071,7 +30071,7 @@ SQLITE_PRIVATE u32 sqlite3Utf8Read( /* ** If the TRANSLATE_TRACE macro is defined, the value of each Mem is ** printed on stderr on the way into and out of sqlite3VdbeMemTranslate(). -*/ +*/ /* #define TRANSLATE_TRACE 1 */ #ifndef SQLITE_OMIT_UTF16 @@ -30102,7 +30102,7 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desired } #endif - /* If the translation is between UTF-16 little and big endian, then + /* If the translation is between UTF-16 little and big endian, then ** all that is required is to swap the byte order. This case is handled ** differently from the others. */ @@ -30180,13 +30180,13 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desired if( pMem->enc==SQLITE_UTF16LE ){ /* UTF-16 Little-endian -> UTF-8 */ while( zIn UTF-8 */ while( zIn The input string is a pure integer ** 2 or more => The input has a decimal point or eNNN clause ** 0 or less => The input string is not a valid number -** -1 => Not a valid number, but has a valid prefix which +** -1 => Not a valid number, but has a valid prefix which ** includes a decimal point and/or an eNNN clause ** ** Valid numbers are in one of these formats: @@ -30877,7 +30877,7 @@ SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 en eValid = 0; eType++; - /* This branch is needed to avoid a (harmless) buffer overread. The + /* This branch is needed to avoid a (harmless) buffer overread. The ** special comment alerts the mutation tester that the correct answer ** is obtained even if the branch is omitted */ if( z>=zEnd ) goto do_atof_calc; /*PREVENTS-HARMLESS-OVERREAD*/ @@ -31270,7 +31270,7 @@ static int SQLITE_NOINLINE putVarint64(unsigned char *p, u64 v){ v >>= 7; } return 9; - } + } n = 0; do{ buf[n++] = (u8)((v & 0x7f) | 0x80); @@ -31470,8 +31470,8 @@ SQLITE_PRIVATE u8 sqlite3GetVarint(const unsigned char *p, u64 *v){ ** If the varint stored in p[0] is larger than can fit in a 32-bit unsigned ** integer, then set *v to 0xffffffff. ** -** A MACRO version, getVarint32, is provided which inlines the -** single-byte case. All code should use the MACRO version as +** A MACRO version, getVarint32, is provided which inlines the +** single-byte case. All code should use the MACRO version as ** this function assumes the single-byte case has already been handled. */ SQLITE_PRIVATE u8 sqlite3GetVarint32(const unsigned char *p, u32 *v){ @@ -31689,7 +31689,7 @@ SQLITE_PRIVATE void *sqlite3HexToBlob(sqlite3 *db, const char *z, int n){ ** argument. The zType is a word like "NULL" or "closed" or "invalid". */ static void logBadConnection(const char *zType){ - sqlite3_log(SQLITE_MISUSE, + sqlite3_log(SQLITE_MISUSE, "API call with %s database connection pointer", zType ); @@ -31763,7 +31763,7 @@ SQLITE_PRIVATE int sqlite3AddInt64(i64 *pA, i64 iB){ if( iA<0 && -(iA + LARGEST_INT64) > iB + 1 ) return 1; } *pA += iB; - return 0; + return 0; #endif } SQLITE_PRIVATE int sqlite3SubInt64(i64 *pA, i64 iB){ @@ -31804,7 +31804,7 @@ SQLITE_PRIVATE int sqlite3MulInt64(i64 *pA, i64 iB){ } /* -** Compute the absolute value of a 32-bit signed integer, of possible. Or +** Compute the absolute value of a 32-bit signed integer, of possible. Or ** if the integer has a value of -2147483648, return +2147483647 */ SQLITE_PRIVATE int sqlite3AbsInt32(int x){ @@ -31844,11 +31844,11 @@ SQLITE_PRIVATE void sqlite3FileSuffix3(const char *zBaseFilename, char *z){ } #endif -/* +/* ** Find (an approximate) sum of two LogEst values. This computation is ** not a simple "+" operator because LogEst is stored as a logarithmic ** value. -** +** */ SQLITE_PRIVATE LogEst sqlite3LogEstAdd(LogEst a, LogEst b){ static const unsigned char x[] = { @@ -31962,8 +31962,8 @@ SQLITE_PRIVATE u64 sqlite3LogEstToInt(LogEst x){ ** Conceptually: ** ** struct VList { -** int nAlloc; // Number of allocated slots -** int nUsed; // Number of used slots +** int nAlloc; // Number of allocated slots +** int nUsed; // Number of used slots ** struct VListEntry { ** int iValue; // Value for this entry ** int nSlot; // Slots used by this entry @@ -31972,7 +31972,7 @@ SQLITE_PRIVATE u64 sqlite3LogEstToInt(LogEst x){ ** } ** ** During code generation, pointers to the variable names within the -** VList are taken. When that happens, nAlloc is set to zero as an +** VList are taken. When that happens, nAlloc is set to zero as an ** indication that the VList may never again be enlarged, since the ** accompanying realloc() would invalidate the pointers. */ @@ -32163,7 +32163,7 @@ static int rehash(Hash *pH, unsigned int new_size){ /* The inability to allocates space for a larger hash table is ** a performance hit but it is not a fatal error. So mark the - ** allocation as a benign. Use sqlite3Malloc()/memset(0) instead of + ** allocation as a benign. Use sqlite3Malloc()/memset(0) instead of ** sqlite3MallocZero() to make the allocation, as sqlite3MallocZero() ** only zeroes the requested number of bytes whereas this module will ** use the actual amount of space allocated for the hash table (which @@ -32215,7 +32215,7 @@ static HashElem *findElementWithHash( if( pHash ) *pHash = h; while( count-- ){ assert( elem!=0 ); - if( sqlite3StrICmp(elem->pKey,pKey)==0 ){ + if( sqlite3StrICmp(elem->pKey,pKey)==0 ){ return elem; } elem = elem->next; @@ -32233,7 +32233,7 @@ static void removeElementGivenHash( ){ struct _ht *pEntry; if( elem->prev ){ - elem->prev->next = elem->next; + elem->prev->next = elem->next; }else{ pH->first = elem->next; } @@ -32572,7 +32572,7 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ ** Styles 4, 5, and 7 are only available of SQLITE_ENABLE_LOCKING_STYLE ** is defined to 1. The SQLITE_ENABLE_LOCKING_STYLE also enables automatic ** selection of the appropriate locking style based on the filesystem -** where the database is located. +** where the database is located. */ #if !defined(SQLITE_ENABLE_LOCKING_STYLE) # if defined(__APPLE__) @@ -32698,7 +32698,7 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ #define osGetpid(X) (pid_t)getpid() /* -** Only set the lastErrno if the error code is a real error and not +** Only set the lastErrno if the error code is a real error and not ** a normal expected return code of SQLITE_BUSY or SQLITE_OK */ #define IS_LOCK_ERROR(x) ((x != SQLITE_OK) && (x != SQLITE_BUSY)) @@ -32766,7 +32766,7 @@ struct unixFile { ** whenever any part of the database changes. An assertion fault will ** occur if a file is updated without also updating the transaction ** counter. This test is made to avoid new problems similar to the - ** one described by ticket #3584. + ** one described by ticket #3584. */ unsigned char transCntrChng; /* True if the transaction counter changed */ unsigned char dbUpdate; /* True if any part of database file changed */ @@ -32775,7 +32775,7 @@ struct unixFile { #endif #ifdef SQLITE_TEST - /* In test mode, increase the size of this structure a bit so that + /* In test mode, increase the size of this structure a bit so that ** it is larger than the struct CrashFile defined in test6.c. */ char aPadding[32]; @@ -32905,7 +32905,7 @@ static pid_t randomnessPid = 0; __asm__ __volatile__ ("rdtsc" : "=A" (val)); return val; } - + #elif (defined(__GNUC__) && defined(__ppc__)) __inline__ sqlite_uint64 sqlite3Hwtime(void){ @@ -33118,7 +33118,7 @@ static struct unix_syscall { #ifdef __DJGPP__ { "fstat", 0, 0 }, #define osFstat(a,b,c) 0 -#else +#else { "fstat", (sqlite3_syscall_ptr)fstat, 0 }, #define osFstat ((int(*)(int,struct stat*))aSyscall[5].pCurrent) #endif @@ -33356,7 +33356,7 @@ static const char *unixNextSystemCall(sqlite3_vfs *p, const char *zName){ /* ** Do not accept any file descriptor less than this value, in order to avoid -** opening database file using file descriptors that are commonly used for +** opening database file using file descriptors that are commonly used for ** standard input, output, and error. */ #ifndef SQLITE_MINIMUM_FILE_DESCRIPTOR @@ -33395,7 +33395,7 @@ static int robust_open(const char *z, int f, mode_t m){ } if( fd>=SQLITE_MINIMUM_FILE_DESCRIPTOR ) break; osClose(fd); - sqlite3_log(SQLITE_WARNING, + sqlite3_log(SQLITE_WARNING, "attempt to open \"%s\" as file descriptor %d", z, fd); fd = -1; if( osOpen("/dev/null", f, m)<0 ) break; @@ -33403,9 +33403,9 @@ static int robust_open(const char *z, int f, mode_t m){ if( fd>=0 ){ if( m!=0 ){ struct stat statbuf; - if( osFstat(fd, &statbuf)==0 + if( osFstat(fd, &statbuf)==0 && statbuf.st_size==0 - && (statbuf.st_mode&0777)!=m + && (statbuf.st_mode&0777)!=m ){ osFchmod(fd, m); } @@ -33420,11 +33420,11 @@ static int robust_open(const char *z, int f, mode_t m){ /* ** Helper functions to obtain and relinquish the global mutex. The ** global mutex is used to protect the unixInodeInfo and -** vxworksFileId objects used by this file, all of which may be +** vxworksFileId objects used by this file, all of which may be ** shared by multiple threads. ** -** Function unixMutexHeld() is used to assert() that the global mutex -** is held when required. This function is only used as part of assert() +** Function unixMutexHeld() is used to assert() that the global mutex +** is held when required. This function is only used as part of assert() ** statements. e.g. ** ** unixEnterMutex() @@ -33546,7 +33546,7 @@ static int lockTrace(int fd, int op, struct flock *p){ static int robust_ftruncate(int h, sqlite3_int64 sz){ int rc; #ifdef __ANDROID__ - /* On Android, ftruncate() always uses 32-bit offsets, even if + /* On Android, ftruncate() always uses 32-bit offsets, even if ** _FILE_OFFSET_BITS=64 is defined. This means it is unsafe to attempt to ** truncate a file to any size larger than 2GiB. Silently ignore any ** such attempts. */ @@ -33562,32 +33562,32 @@ static int robust_ftruncate(int h, sqlite3_int64 sz){ ** This routine translates a standard POSIX errno code into something ** useful to the clients of the sqlite3 functions. Specifically, it is ** intended to translate a variety of "try again" errors into SQLITE_BUSY -** and a variety of "please close the file descriptor NOW" errors into +** and a variety of "please close the file descriptor NOW" errors into ** SQLITE_IOERR -** +** ** Errors during initialization of locks, or file system support for locks, ** should handle ENOLCK, ENOTSUP, EOPNOTSUPP separately. */ static int sqliteErrorFromPosixError(int posixError, int sqliteIOErr) { - assert( (sqliteIOErr == SQLITE_IOERR_LOCK) || - (sqliteIOErr == SQLITE_IOERR_UNLOCK) || + assert( (sqliteIOErr == SQLITE_IOERR_LOCK) || + (sqliteIOErr == SQLITE_IOERR_UNLOCK) || (sqliteIOErr == SQLITE_IOERR_RDLOCK) || (sqliteIOErr == SQLITE_IOERR_CHECKRESERVEDLOCK) ); switch (posixError) { - case EACCES: + case EACCES: case EAGAIN: case ETIMEDOUT: case EBUSY: case EINTR: - case ENOLCK: - /* random NFS retry error, unless during file system support + case ENOLCK: + /* random NFS retry error, unless during file system support * introspection, in which it actually means what it says */ return SQLITE_BUSY; - - case EPERM: + + case EPERM: return SQLITE_PERM; - - default: + + default: return sqliteIOErr; } } @@ -33602,7 +33602,7 @@ static int sqliteErrorFromPosixError(int posixError, int sqliteIOErr) { ** ** A pointer to an instance of the following structure can be used as a ** unique file ID in VxWorks. Each instance of this structure contains -** a copy of the canonical filename. There is also a reference count. +** a copy of the canonical filename. There is also a reference count. ** The structure is reclaimed when the number of pointers to it drops to ** zero. ** @@ -33618,7 +33618,7 @@ struct vxworksFileId { }; #if OS_VXWORKS -/* +/* ** All unique filenames are held on a linked list headed by this ** variable: */ @@ -33690,7 +33690,7 @@ static struct vxworksFileId *vxworksFindFileId(const char *zAbsoluteName){ */ unixEnterMutex(); for(pCandidate=vxworksFileList; pCandidate; pCandidate=pCandidate->pNext){ - if( pCandidate->nName==n + if( pCandidate->nName==n && memcmp(pCandidate->zCanonicalName, pNew->zCanonicalName, n)==0 ){ sqlite3_free(pNew); @@ -33783,7 +33783,7 @@ static void vxworksReleaseFileId(struct vxworksFileId *pId){ ** cnt>0 means there are cnt shared locks on the file. ** ** Any attempt to lock or unlock a file first checks the locking -** structure. The fcntl() system call is only invoked to set a +** structure. The fcntl() system call is only invoked to set a ** POSIX lock if the internal lock structure transitions between ** a locked and an unlocked state. ** @@ -33816,7 +33816,7 @@ static void vxworksReleaseFileId(struct vxworksFileId *pId){ ** ** SQLite used to support LinuxThreads. But support for LinuxThreads ** was dropped beginning with version 3.7.0. SQLite will still work with -** LinuxThreads provided that (1) there is no more than one connection +** LinuxThreads provided that (1) there is no more than one connection ** per database file in the same process and (2) database connections ** do not move across threads. */ @@ -33833,7 +33833,7 @@ struct unixFileId { /* We are told that some versions of Android contain a bug that ** sizes ino_t at only 32-bits instead of 64-bits. (See ** https://android-review.googlesource.com/#/c/115351/3/dist/sqlite3.c) - ** To work around this, always allocate 64-bits for the inode number. + ** To work around this, always allocate 64-bits for the inode number. ** On small machines that only have 32-bit inodes, this wastes 4 bytes, ** but that should not be a big deal. */ /* WAS: ino_t ino; */ @@ -33921,7 +33921,7 @@ int unixFileMutexNotheld(unixFile *pFile){ ** strerror_r(). ** ** The first argument passed to the macro should be the error code that -** will be returned to SQLite (e.g. SQLITE_IOERR_DELETE, SQLITE_CANTOPEN). +** will be returned to SQLite (e.g. SQLITE_IOERR_DELETE, SQLITE_CANTOPEN). ** The two subsequent arguments should be the name of the OS function that ** failed (e.g. "unlink", "open") and the associated file-system path, ** if any. @@ -33939,7 +33939,7 @@ static int unixLogErrorAtLine( /* If this is not a threadsafe build (SQLITE_THREADSAFE==0), then use ** the strerror() function to obtain the human-readable error message ** equivalent to errno. Otherwise, use strerror_r(). - */ + */ #if SQLITE_THREADSAFE && defined(HAVE_STRERROR_R) char aErr[80]; memset(aErr, 0, sizeof(aErr)); @@ -33947,18 +33947,18 @@ static int unixLogErrorAtLine( /* If STRERROR_R_CHAR_P (set by autoconf scripts) or __USE_GNU is defined, ** assume that the system provides the GNU version of strerror_r() that - ** returns a pointer to a buffer containing the error message. That pointer - ** may point to aErr[], or it may point to some static storage somewhere. - ** Otherwise, assume that the system provides the POSIX version of + ** returns a pointer to a buffer containing the error message. That pointer + ** may point to aErr[], or it may point to some static storage somewhere. + ** Otherwise, assume that the system provides the POSIX version of ** strerror_r(), which always writes an error message into aErr[]. ** ** If the code incorrectly assumes that it is the POSIX version that is ** available, the error message will often be an empty string. Not a - ** huge problem. Incorrectly concluding that the GNU version is available + ** huge problem. Incorrectly concluding that the GNU version is available ** could lead to a segfault though. */ #if defined(STRERROR_R_CHAR_P) || defined(__USE_GNU) - zErr = + zErr = # endif strerror_r(iErrno, aErr, sizeof(aErr)-1); @@ -34009,7 +34009,7 @@ static void storeLastErrno(unixFile *pFile, int error){ /* ** Close all file descriptors accumuated in the unixInodeInfo->pUnused list. -*/ +*/ static void closePendingFds(unixFile *pFile){ unixInodeInfo *pInode = pFile->pInode; UnixUnusedFd *p; @@ -34164,7 +34164,7 @@ static int fileHasMoved(unixFile *pFile){ #else struct stat buf; return pFile->pInode!=0 && - (osStat(pFile->zPath, &buf)!=0 + (osStat(pFile->zPath, &buf)!=0 || (u64)buf.st_ino!=pFile->pInode->fileId.ino); #endif } @@ -34245,7 +34245,7 @@ static int unixCheckReservedLock(sqlite3_file *id, int *pResOut){ } } #endif - + sqlite3_mutex_leave(pFile->pInode->pLockMutex); OSTRACE(("TEST WR-LOCK %d %d %d (unix)\n", pFile->h, rc, reserved)); @@ -34291,7 +34291,7 @@ static int osSetPosixAdvisoryLock( /* -** Attempt to set a system-lock on the file pFile. The lock is +** Attempt to set a system-lock on the file pFile. The lock is ** described by pLock. ** ** If the pFile was opened read/write from unix-excl, then the only lock @@ -34383,7 +34383,7 @@ static int unixLock(sqlite3_file *id, int eFileLock){ ** ** A process may only obtain a RESERVED lock after it has a SHARED lock. ** A RESERVED lock is implemented by grabbing a write-lock on the - ** 'reserved byte'. + ** 'reserved byte'. ** ** A process may only obtain a PENDING lock after it has obtained a ** SHARED lock. A PENDING lock is implemented by obtaining a write-lock @@ -34397,7 +34397,7 @@ static int unixLock(sqlite3_file *id, int eFileLock){ ** implemented by obtaining a write-lock on the entire 'shared byte ** range'. Since all other locks require a read-lock on one of the bytes ** within this range, this ensures that no other locks are held on the - ** database. + ** database. */ int rc = SQLITE_OK; unixFile *pFile = (unixFile*)id; @@ -34438,7 +34438,7 @@ static int unixLock(sqlite3_file *id, int eFileLock){ /* If some thread using this PID has a lock via a different unixFile* ** handle that precludes the requested lock, return BUSY. */ - if( (pFile->eFileLock!=pInode->eFileLock && + if( (pFile->eFileLock!=pInode->eFileLock && (pInode->eFileLock>=PENDING_LOCK || eFileLock>SHARED_LOCK)) ){ rc = SQLITE_BUSY; @@ -34449,7 +34449,7 @@ static int unixLock(sqlite3_file *id, int eFileLock){ ** has a SHARED or RESERVED lock, then increment reference counts and ** return SQLITE_OK. */ - if( eFileLock==SHARED_LOCK && + if( eFileLock==SHARED_LOCK && (pInode->eFileLock==SHARED_LOCK || pInode->eFileLock==RESERVED_LOCK) ){ assert( eFileLock==SHARED_LOCK ); assert( pFile->eFileLock==0 ); @@ -34467,7 +34467,7 @@ static int unixLock(sqlite3_file *id, int eFileLock){ */ lock.l_len = 1L; lock.l_whence = SEEK_SET; - if( eFileLock==SHARED_LOCK + if( eFileLock==SHARED_LOCK || (eFileLock==EXCLUSIVE_LOCK && pFile->eFileLockpLockMutex); - OSTRACE(("LOCK %d %s %s (unix)\n", pFile->h, azFileLock(eFileLock), + OSTRACE(("LOCK %d %s %s (unix)\n", pFile->h, azFileLock(eFileLock), rc==SQLITE_OK ? "ok" : "failed")); return rc; } @@ -34602,11 +34602,11 @@ static void setPendingFd(unixFile *pFile){ ** ** If the locking level of the file descriptor is already at or below ** the requested locking level, this routine is a no-op. -** +** ** If handleNFSUnlock is true, then on downgrading an EXCLUSIVE_LOCK to SHARED ** the byte range is divided into 2 parts and the first part is unlocked then -** set to a read lock, then the other part is simply unlocked. This works -** around a bug in BSD NFS lockd (also seen on MacOSX 10.3+) that fails to +** set to a read lock, then the other part is simply unlocked. This works +** around a bug in BSD NFS lockd (also seen on MacOSX 10.3+) that fails to ** remove the write lock on a region when a read lock is set. */ static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){ @@ -34644,7 +34644,7 @@ static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){ /* downgrading to a shared lock on NFS involves clearing the write lock ** before establishing the readlock - to avoid a race condition we downgrade - ** the lock in 2 blocks, so that part of the range will be covered by a + ** the lock in 2 blocks, so that part of the range will be covered by a ** write lock until the rest is covered by a read lock: ** 1: [WWWWW] ** 2: [....W] @@ -34660,7 +34660,7 @@ static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){ if( handleNFSUnlock ){ int tErrno; /* Error code from system call errors */ off_t divSize = SHARED_SIZE - 1; - + lock.l_type = F_UNLCK; lock.l_whence = SEEK_SET; lock.l_start = SHARED_FIRST; @@ -34702,11 +34702,11 @@ static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){ lock.l_len = SHARED_SIZE; if( unixFileLock(pFile, &lock) ){ /* In theory, the call to unixFileLock() cannot fail because another - ** process is holding an incompatible lock. If it does, this + ** process is holding an incompatible lock. If it does, this ** indicates that the other process is not following the locking ** protocol. If this happens, return SQLITE_IOERR_RDLOCK. Returning - ** SQLITE_BUSY would confuse the upper layer (in practice it causes - ** an assert to fail). */ + ** SQLITE_BUSY would confuse the upper layer (in practice it causes + ** an assert to fail). */ rc = SQLITE_IOERR_RDLOCK; storeLastErrno(pFile, errno); goto end_unlock; @@ -34782,7 +34782,7 @@ static void unixUnmapfile(unixFile *pFd); #endif /* -** This function performs the parts of the "close file" operation +** This function performs the parts of the "close file" operation ** common to all locking schemes. It closes the directory and file ** handles, if they are valid, and sets all fields of the unixFile ** structure to 0. @@ -34845,7 +34845,7 @@ static int unixClose(sqlite3_file *id){ if( pInode->nLock ){ /* If there are outstanding locks, do not actually close the file just ** yet because that would clear those locks. Instead, add the file - ** descriptor to pInode->pUnused list. It will be automatically closed + ** descriptor to pInode->pUnused list. It will be automatically closed ** when the last lock is cleared. */ setPendingFd(pFile); @@ -34945,7 +34945,7 @@ static int dotlockCheckReservedLock(sqlite3_file *id, int *pResOut) { unixFile *pFile = (unixFile*)id; SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); - + assert( pFile ); reserved = osAccess((const char*)pFile->lockingContext, 0)==0; OSTRACE(("TEST WR-LOCK %d %d %d (dotlock)\n", pFile->h, rc, reserved)); @@ -34999,7 +34999,7 @@ static int dotlockLock(sqlite3_file *id, int eFileLock) { #endif return SQLITE_OK; } - + /* grab an exclusive lock */ rc = osMkdir(zLockFile, 0777); if( rc<0 ){ @@ -35014,8 +35014,8 @@ static int dotlockLock(sqlite3_file *id, int eFileLock) { } } return rc; - } - + } + /* got it, set the type and return ok */ pFile->eFileLock = eFileLock; return rc; @@ -35039,7 +35039,7 @@ static int dotlockUnlock(sqlite3_file *id, int eFileLock) { OSTRACE(("UNLOCK %d %d was %d pid=%d (dotlock)\n", pFile->h, eFileLock, pFile->eFileLock, osGetpid(0))); assert( eFileLock<=SHARED_LOCK ); - + /* no-op if possible */ if( pFile->eFileLock==eFileLock ){ return SQLITE_OK; @@ -35052,7 +35052,7 @@ static int dotlockUnlock(sqlite3_file *id, int eFileLock) { pFile->eFileLock = SHARED_LOCK; return SQLITE_OK; } - + /* To fully unlock the database, delete the lock file */ assert( eFileLock==NO_LOCK ); rc = osRmdir(zLockFile); @@ -35064,7 +35064,7 @@ static int dotlockUnlock(sqlite3_file *id, int eFileLock) { rc = SQLITE_IOERR_UNLOCK; storeLastErrno(pFile, tErrno); } - return rc; + return rc; } pFile->eFileLock = NO_LOCK; return SQLITE_OK; @@ -35111,7 +35111,7 @@ static int robust_flock(int fd, int op){ #else # define robust_flock(a,b) flock(a,b) #endif - + /* ** This routine checks if there is a RESERVED lock held on the specified @@ -35123,16 +35123,16 @@ static int flockCheckReservedLock(sqlite3_file *id, int *pResOut){ int rc = SQLITE_OK; int reserved = 0; unixFile *pFile = (unixFile*)id; - + SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); - + assert( pFile ); - + /* Check if a thread in this process holds such a lock */ if( pFile->eFileLock>SHARED_LOCK ){ reserved = 1; } - + /* Otherwise see if some other process holds it. */ if( !reserved ){ /* attempt to get the lock */ @@ -35143,7 +35143,7 @@ static int flockCheckReservedLock(sqlite3_file *id, int *pResOut){ if ( lrc ) { int tErrno = errno; /* unlock failed with an error */ - lrc = SQLITE_IOERR_UNLOCK; + lrc = SQLITE_IOERR_UNLOCK; storeLastErrno(pFile, tErrno); rc = lrc; } @@ -35151,7 +35151,7 @@ static int flockCheckReservedLock(sqlite3_file *id, int *pResOut){ int tErrno = errno; reserved = 1; /* someone else might have it reserved */ - lrc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); + lrc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); if( IS_LOCK_ERROR(lrc) ){ storeLastErrno(pFile, tErrno); rc = lrc; @@ -35205,15 +35205,15 @@ static int flockLock(sqlite3_file *id, int eFileLock) { assert( pFile ); - /* if we already have a lock, it is exclusive. + /* if we already have a lock, it is exclusive. ** Just adjust level and punt on outta here. */ if (pFile->eFileLock > NO_LOCK) { pFile->eFileLock = eFileLock; return SQLITE_OK; } - + /* grab an exclusive lock */ - + if (robust_flock(pFile->h, LOCK_EX | LOCK_NB)) { int tErrno = errno; /* didn't get, must be busy */ @@ -35225,7 +35225,7 @@ static int flockLock(sqlite3_file *id, int eFileLock) { /* got it, set the type and return ok */ pFile->eFileLock = eFileLock; } - OSTRACE(("LOCK %d %s %s (flock)\n", pFile->h, azFileLock(eFileLock), + OSTRACE(("LOCK %d %s %s (flock)\n", pFile->h, azFileLock(eFileLock), rc==SQLITE_OK ? "ok" : "failed")); #ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS if( (rc & 0xff) == SQLITE_IOERR ){ @@ -35245,23 +35245,23 @@ static int flockLock(sqlite3_file *id, int eFileLock) { */ static int flockUnlock(sqlite3_file *id, int eFileLock) { unixFile *pFile = (unixFile*)id; - + assert( pFile ); OSTRACE(("UNLOCK %d %d was %d pid=%d (flock)\n", pFile->h, eFileLock, pFile->eFileLock, osGetpid(0))); assert( eFileLock<=SHARED_LOCK ); - + /* no-op if possible */ if( pFile->eFileLock==eFileLock ){ return SQLITE_OK; } - + /* shared can just be set because we always have an exclusive */ if (eFileLock==SHARED_LOCK) { pFile->eFileLock = eFileLock; return SQLITE_OK; } - + /* no, really, unlock. */ if( robust_flock(pFile->h, LOCK_UN) ){ #ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS @@ -35312,14 +35312,14 @@ static int semXCheckReservedLock(sqlite3_file *id, int *pResOut) { unixFile *pFile = (unixFile*)id; SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); - + assert( pFile ); /* Check if a thread in this process holds such a lock */ if( pFile->eFileLock>SHARED_LOCK ){ reserved = 1; } - + /* Otherwise see if some other process holds it. */ if( !reserved ){ sem_t *pSem = pFile->pInode->pSem; @@ -35378,14 +35378,14 @@ static int semXLock(sqlite3_file *id, int eFileLock) { sem_t *pSem = pFile->pInode->pSem; int rc = SQLITE_OK; - /* if we already have a lock, it is exclusive. + /* if we already have a lock, it is exclusive. ** Just adjust level and punt on outta here. */ if (pFile->eFileLock > NO_LOCK) { pFile->eFileLock = eFileLock; rc = SQLITE_OK; goto sem_end_lock; } - + /* lock semaphore now but bail out when already locked. */ if( sem_trywait(pSem)==-1 ){ rc = SQLITE_BUSY; @@ -35415,18 +35415,18 @@ static int semXUnlock(sqlite3_file *id, int eFileLock) { OSTRACE(("UNLOCK %d %d was %d pid=%d (sem)\n", pFile->h, eFileLock, pFile->eFileLock, osGetpid(0))); assert( eFileLock<=SHARED_LOCK ); - + /* no-op if possible */ if( pFile->eFileLock==eFileLock ){ return SQLITE_OK; } - + /* shared can just be set because we always have an exclusive */ if (eFileLock==SHARED_LOCK) { pFile->eFileLock = eFileLock; return SQLITE_OK; } - + /* no, really unlock. */ if ( sem_post(pSem)==-1 ) { int rc, tErrno = errno; @@ -35434,7 +35434,7 @@ static int semXUnlock(sqlite3_file *id, int eFileLock) { if( IS_LOCK_ERROR(rc) ){ storeLastErrno(pFile, tErrno); } - return rc; + return rc; } pFile->eFileLock = NO_LOCK; return SQLITE_OK; @@ -35500,7 +35500,7 @@ struct ByteRangeLockPB2 /* ** This is a utility for setting or clearing a bit-range lock on an ** AFP filesystem. -** +** ** Return SQLITE_OK on success, SQLITE_BUSY on failure. */ static int afpSetLock( @@ -35512,14 +35512,14 @@ static int afpSetLock( ){ struct ByteRangeLockPB2 pb; int err; - + pb.unLockFlag = setLockFlag ? 0 : 1; pb.startEndFlag = 0; pb.offset = offset; - pb.length = length; + pb.length = length; pb.fd = pFile->h; - - OSTRACE(("AFPSETLOCK [%s] for %d%s in range %llx:%llx\n", + + OSTRACE(("AFPSETLOCK [%s] for %d%s in range %llx:%llx\n", (setLockFlag?"ON":"OFF"), pFile->h, (pb.fd==-1?"[testval-1]":""), offset, length)); err = fsctl(path, afpfsByteRangeLock2FSCTL, &pb, 0); @@ -35554,9 +35554,9 @@ static int afpCheckReservedLock(sqlite3_file *id, int *pResOut){ int reserved = 0; unixFile *pFile = (unixFile*)id; afpLockingContext *context; - + SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); - + assert( pFile ); context = (afpLockingContext *) pFile->lockingContext; if( context->reserved ){ @@ -35568,12 +35568,12 @@ static int afpCheckReservedLock(sqlite3_file *id, int *pResOut){ if( pFile->pInode->eFileLock>SHARED_LOCK ){ reserved = 1; } - + /* Otherwise see if some other process holds it. */ if( !reserved ){ /* lock the RESERVED byte */ - int lrc = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1,1); + int lrc = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1,1); if( SQLITE_OK==lrc ){ /* if we succeeded in taking the reserved lock, unlock it to restore ** the original state */ @@ -35586,10 +35586,10 @@ static int afpCheckReservedLock(sqlite3_file *id, int *pResOut){ rc=lrc; } } - + sqlite3_mutex_leave(pFile->pInode->pLockMutex); OSTRACE(("TEST WR-LOCK %d %d %d (afp)\n", pFile->h, rc, reserved)); - + *pResOut = reserved; return rc; } @@ -35623,7 +35623,7 @@ static int afpLock(sqlite3_file *id, int eFileLock){ unixFile *pFile = (unixFile*)id; unixInodeInfo *pInode = pFile->pInode; afpLockingContext *context = (afpLockingContext *) pFile->lockingContext; - + assert( pFile ); OSTRACE(("LOCK %d %s was %s(%s,%d) pid=%d (afp)\n", pFile->h, azFileLock(eFileLock), azFileLock(pFile->eFileLock), @@ -35647,7 +35647,7 @@ static int afpLock(sqlite3_file *id, int eFileLock){ assert( pFile->eFileLock!=NO_LOCK || eFileLock==SHARED_LOCK ); assert( eFileLock!=PENDING_LOCK ); assert( eFileLock!=RESERVED_LOCK || pFile->eFileLock==SHARED_LOCK ); - + /* This mutex is needed because pFile->pInode is shared across threads */ pInode = pFile->pInode; @@ -35656,18 +35656,18 @@ static int afpLock(sqlite3_file *id, int eFileLock){ /* If some thread using this PID has a lock via a different unixFile* ** handle that precludes the requested lock, return BUSY. */ - if( (pFile->eFileLock!=pInode->eFileLock && + if( (pFile->eFileLock!=pInode->eFileLock && (pInode->eFileLock>=PENDING_LOCK || eFileLock>SHARED_LOCK)) ){ rc = SQLITE_BUSY; goto afp_end_lock; } - + /* If a SHARED lock is requested, and some thread using this PID already ** has a SHARED or RESERVED lock, then increment reference counts and ** return SQLITE_OK. */ - if( eFileLock==SHARED_LOCK && + if( eFileLock==SHARED_LOCK && (pInode->eFileLock==SHARED_LOCK || pInode->eFileLock==RESERVED_LOCK) ){ assert( eFileLock==SHARED_LOCK ); assert( pFile->eFileLock==0 ); @@ -35677,12 +35677,12 @@ static int afpLock(sqlite3_file *id, int eFileLock){ pInode->nLock++; goto afp_end_lock; } - + /* A PENDING lock is needed before acquiring a SHARED lock and before ** acquiring an EXCLUSIVE lock. For the SHARED lock, the PENDING will ** be released. */ - if( eFileLock==SHARED_LOCK + if( eFileLock==SHARED_LOCK || (eFileLock==EXCLUSIVE_LOCK && pFile->eFileLocknShared==0 ); assert( pInode->eFileLock==0 ); - + mask = (sizeof(long)==8) ? LARGEST_INT64 : 0x7fffffff; /* Now get the read-lock SHARED_LOCK */ /* note that the quality of the randomness doesn't matter that much */ - lk = random(); + lk = random(); pInode->sharedByte = (lk & mask)%(SHARED_SIZE - 1); - lrc1 = afpSetLock(context->dbPath, pFile, + lrc1 = afpSetLock(context->dbPath, pFile, SHARED_FIRST+pInode->sharedByte, 1, 1); if( IS_LOCK_ERROR(lrc1) ){ lrc1Errno = pFile->lastErrno; } /* Drop the temporary PENDING lock */ lrc2 = afpSetLock(context->dbPath, pFile, PENDING_BYTE, 1, 0); - + if( IS_LOCK_ERROR(lrc1) ) { storeLastErrno(pFile, lrc1Errno); rc = lrc1; @@ -35750,34 +35750,34 @@ static int afpLock(sqlite3_file *id, int eFileLock){ } if (!failed && eFileLock == EXCLUSIVE_LOCK) { /* Acquire an EXCLUSIVE lock */ - - /* Remove the shared lock before trying the range. we'll need to + + /* Remove the shared lock before trying the range. we'll need to ** reestablish the shared lock if we can't get the afpUnlock */ if( !(failed = afpSetLock(context->dbPath, pFile, SHARED_FIRST + pInode->sharedByte, 1, 0)) ){ int failed2 = SQLITE_OK; /* now attemmpt to get the exclusive lock range */ - failed = afpSetLock(context->dbPath, pFile, SHARED_FIRST, + failed = afpSetLock(context->dbPath, pFile, SHARED_FIRST, SHARED_SIZE, 1); - if( failed && (failed2 = afpSetLock(context->dbPath, pFile, + if( failed && (failed2 = afpSetLock(context->dbPath, pFile, SHARED_FIRST + pInode->sharedByte, 1, 1)) ){ /* Can't reestablish the shared lock. Sqlite can't deal, this is ** a critical I/O error */ - rc = ((failed & 0xff) == SQLITE_IOERR) ? failed2 : + rc = ((failed & 0xff) == SQLITE_IOERR) ? failed2 : SQLITE_IOERR_LOCK; goto afp_end_lock; - } + } }else{ - rc = failed; + rc = failed; } } if( failed ){ rc = failed; } } - + if( rc==SQLITE_OK ){ pFile->eFileLock = eFileLock; pInode->eFileLock = eFileLock; @@ -35785,10 +35785,10 @@ static int afpLock(sqlite3_file *id, int eFileLock){ pFile->eFileLock = PENDING_LOCK; pInode->eFileLock = PENDING_LOCK; } - + afp_end_lock: sqlite3_mutex_leave(pInode->pLockMutex); - OSTRACE(("LOCK %d %s %s (afp)\n", pFile->h, azFileLock(eFileLock), + OSTRACE(("LOCK %d %s %s (afp)\n", pFile->h, azFileLock(eFileLock), rc==SQLITE_OK ? "ok" : "failed")); return rc; } @@ -35827,7 +35827,7 @@ static int afpUnlock(sqlite3_file *id, int eFileLock) { SimulateIOErrorBenign(1); SimulateIOError( h=(-1) ) SimulateIOErrorBenign(0); - + #ifdef SQLITE_DEBUG /* When reducing a lock such that other processes can start ** reading the database file again, make sure that the @@ -35842,7 +35842,7 @@ static int afpUnlock(sqlite3_file *id, int eFileLock) { || pFile->transCntrChng==1 ); pFile->inNormalWrite = 0; #endif - + if( pFile->eFileLock==EXCLUSIVE_LOCK ){ rc = afpSetLock(context->dbPath, pFile, SHARED_FIRST, SHARED_SIZE, 0); if( rc==SQLITE_OK && (eFileLock==SHARED_LOCK || pInode->nShared>1) ){ @@ -35855,11 +35855,11 @@ static int afpUnlock(sqlite3_file *id, int eFileLock) { } if( rc==SQLITE_OK && pFile->eFileLock>=PENDING_LOCK ){ rc = afpSetLock(context->dbPath, pFile, PENDING_BYTE, 1, 0); - } + } if( rc==SQLITE_OK && pFile->eFileLock>=RESERVED_LOCK && context->reserved ){ rc = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1, 0); - if( !rc ){ - context->reserved = 0; + if( !rc ){ + context->reserved = 0; } } if( rc==SQLITE_OK && (eFileLock==SHARED_LOCK || pInode->nShared>1)){ @@ -35892,7 +35892,7 @@ static int afpUnlock(sqlite3_file *id, int eFileLock) { if( pInode->nLock==0 ) closePendingFds(pFile); } } - + sqlite3_mutex_leave(pInode->pLockMutex); if( rc==SQLITE_OK ){ pFile->eFileLock = eFileLock; @@ -35901,7 +35901,7 @@ static int afpUnlock(sqlite3_file *id, int eFileLock) { } /* -** Close a file & cleanup AFP specific locking context +** Close a file & cleanup AFP specific locking context */ static int afpClose(sqlite3_file *id) { int rc = SQLITE_OK; @@ -35959,7 +35959,7 @@ static int nfsUnlock(sqlite3_file *id, int eFileLock){ /* ** The code above is the NFS lock implementation. The code is specific ** to MacOSX and does not work on other unix platforms. No alternative -** is available. +** is available. ** ********************* End of the NFS lock implementation ********************** ******************************************************************************/ @@ -35967,7 +35967,7 @@ static int nfsUnlock(sqlite3_file *id, int eFileLock){ /****************************************************************************** **************** Non-locking sqlite3_file methods ***************************** ** -** The next division contains implementations for all methods of the +** The next division contains implementations for all methods of the ** sqlite3_file object other than the locking methods. The locking ** methods were defined in divisions above (one locking method per ** division). Those methods that are common to all locking modes @@ -35975,7 +35975,7 @@ static int nfsUnlock(sqlite3_file *id, int eFileLock){ */ /* -** Seek to the offset passed as the second argument, then read cnt +** Seek to the offset passed as the second argument, then read cnt ** bytes into pBuf. Return the number of bytes actually read. ** ** NB: If you define USE_PREAD or USE_PREAD64, then it might also @@ -36037,8 +36037,8 @@ static int seekAndRead(unixFile *id, sqlite3_int64 offset, void *pBuf, int cnt){ ** wrong. */ static int unixRead( - sqlite3_file *id, - void *pBuf, + sqlite3_file *id, + void *pBuf, int amt, sqlite3_int64 offset ){ @@ -36053,7 +36053,7 @@ static int unixRead( #if 0 assert( pFile->pPreallocatedUnused==0 || offset>=PENDING_BYTE+512 - || offset+amt<=PENDING_BYTE + || offset+amt<=PENDING_BYTE ); #endif @@ -36091,7 +36091,7 @@ static int unixRead( /* ** Attempt to seek the file-descriptor passed as the first argument to ** absolute offset iOff, then attempt to write nBuf bytes of data from -** pBuf to it. If an error occurs, return -1 and set *piErrno. Otherwise, +** pBuf to it. If an error occurs, return -1 and set *piErrno. Otherwise, ** return the actual number of bytes written (which may be less than ** nBuf). */ @@ -36151,10 +36151,10 @@ static int seekAndWrite(unixFile *id, i64 offset, const void *pBuf, int cnt){ ** or some other error code on failure. */ static int unixWrite( - sqlite3_file *id, - const void *pBuf, + sqlite3_file *id, + const void *pBuf, int amt, - sqlite3_int64 offset + sqlite3_int64 offset ){ unixFile *pFile = (unixFile*)id; int wrote = 0; @@ -36166,7 +36166,7 @@ static int unixWrite( #if 0 assert( pFile->pPreallocatedUnused==0 || offset>=PENDING_BYTE+512 - || offset+amt<=PENDING_BYTE + || offset+amt<=PENDING_BYTE ); #endif @@ -36208,7 +36208,7 @@ static int unixWrite( } } #endif - + while( (wrote = seekAndWrite(pFile, offset, pBuf, amt))0 ){ amt -= wrote; offset += wrote; @@ -36274,8 +36274,8 @@ SQLITE_API int sqlite3_fullsync_count = 0; ** ** SQLite sets the dataOnly flag if the size of the file is unchanged. ** The idea behind dataOnly is that it should only write the file content -** to disk, not the inode. We only set dataOnly if the file size is -** unchanged since the file size is part of the inode. However, +** to disk, not the inode. We only set dataOnly if the file size is +** unchanged since the file size is part of the inode. However, ** Ted Ts'o tells us that fdatasync() will also write the inode if the ** file size has changed. The only real difference between fdatasync() ** and fsync(), Ted tells us, is that fdatasync() will not flush the @@ -36289,7 +36289,7 @@ static int full_fsync(int fd, int fullSync, int dataOnly){ int rc; /* The following "ifdef/elif/else/" block has the same structure as - ** the one below. It is replicated here solely to avoid cluttering + ** the one below. It is replicated here solely to avoid cluttering ** up the real code with the UNUSED_PARAMETER() macros. */ #ifdef SQLITE_NO_SYNC @@ -36303,7 +36303,7 @@ static int full_fsync(int fd, int fullSync, int dataOnly){ UNUSED_PARAMETER(dataOnly); #endif - /* Record the number of times that we do a normal fsync() and + /* Record the number of times that we do a normal fsync() and ** FULLSYNC. This is used during testing to verify that this procedure ** gets called with the correct arguments. */ @@ -36329,11 +36329,11 @@ static int full_fsync(int fd, int fullSync, int dataOnly){ rc = 1; } /* If the FULLFSYNC failed, fall back to attempting an fsync(). - ** It shouldn't be possible for fullfsync to fail on the local + ** It shouldn't be possible for fullfsync to fail on the local ** file system (on OSX), so failure indicates that FULLFSYNC - ** isn't supported for this file system. So, attempt an fsync - ** and (for now) ignore the overhead of a superfluous fcntl call. - ** It'd be better to detect fullfsync support once and avoid + ** isn't supported for this file system. So, attempt an fsync + ** and (for now) ignore the overhead of a superfluous fcntl call. + ** It'd be better to detect fullfsync support once and avoid ** the fcntl call every time sync is called. */ if( rc ) rc = fsync(fd); @@ -36343,7 +36343,7 @@ static int full_fsync(int fd, int fullSync, int dataOnly){ ** so currently we default to the macro that redefines fdatasync to fsync */ rc = fsync(fd); -#else +#else rc = fdatasync(fd); #if OS_VXWORKS if( rc==-1 && errno==ENOTSUP ){ @@ -36504,7 +36504,7 @@ static int unixTruncate(sqlite3_file *id, i64 nByte){ #if SQLITE_MAX_MMAP_SIZE>0 /* If the file was just truncated to a size smaller than the currently ** mapped region, reduce the effective mapping size as well. SQLite will - ** use read() and write() to access data beyond this point from now on. + ** use read() and write() to access data beyond this point from now on. */ if( nBytemmapSize ){ pFile->mmapSize = nByte; @@ -36550,8 +36550,8 @@ static int unixFileSize(sqlite3_file *id, i64 *pSize){ static int proxyFileControl(sqlite3_file*,int,void*); #endif -/* -** This function is called to handle the SQLITE_FCNTL_SIZE_HINT +/* +** This function is called to handle the SQLITE_FCNTL_SIZE_HINT ** file-control operation. Enlarge the database to nBytes in size ** (rounded up to the next chunk-size). If the database is already ** nBytes or larger, this routine is a no-op. @@ -36560,7 +36560,7 @@ static int fcntlSizeHint(unixFile *pFile, i64 nByte){ if( pFile->szChunk>0 ){ i64 nSize; /* Required file size */ struct stat buf; /* Used to hold return values of fstat() */ - + if( osFstat(pFile->h, &buf) ){ return SQLITE_IOERR_FSTAT; } @@ -36569,8 +36569,8 @@ static int fcntlSizeHint(unixFile *pFile, i64 nByte){ if( nSize>(i64)buf.st_size ){ #if defined(HAVE_POSIX_FALLOCATE) && HAVE_POSIX_FALLOCATE - /* The code below is handling the return value of osFallocate() - ** correctly. posix_fallocate() is defined to "returns zero on success, + /* The code below is handling the return value of osFallocate() + ** correctly. posix_fallocate() is defined to "returns zero on success, ** or an error number on failure". See the manpage for details. */ int err; do{ @@ -36578,7 +36578,7 @@ static int fcntlSizeHint(unixFile *pFile, i64 nByte){ }while( err==EINTR ); if( err && err!=EINVAL ) return SQLITE_IOERR_WRITE; #else - /* If the OS does not have posix_fallocate(), fake it. Write a + /* If the OS does not have posix_fallocate(), fake it. Write a ** single byte to the last byte in each block that falls entirely ** within the extended region. Then, if required, a single byte ** at offset (nSize-1), to set the size of the file correctly. @@ -36757,9 +36757,9 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){ /* ** If pFd->sectorSize is non-zero when this function is called, it is a -** no-op. Otherwise, the values of pFd->sectorSize and -** pFd->deviceCharacteristics are set according to the file-system -** characteristics. +** no-op. Otherwise, the values of pFd->sectorSize and +** pFd->deviceCharacteristics are set according to the file-system +** characteristics. ** ** There are two versions of this function. One for QNX and one for all ** other systems. @@ -36793,7 +36793,7 @@ static void setDeviceCharacteristics(unixFile *pFd){ static void setDeviceCharacteristics(unixFile *pFile){ if( pFile->sectorSize == 0 ){ struct statvfs fsInfo; - + /* Set defaults for non-supported filesystems */ pFile->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE; pFile->deviceCharacteristics = 0; @@ -36902,7 +36902,7 @@ static int unixDeviceCharacteristics(sqlite3_file *id){ /* ** Return the system page size. ** -** This function should not be called directly by other code in this file. +** This function should not be called directly by other code in this file. ** Instead, it should be called via macro osGetpagesize(). */ static int unixGetpagesize(void){ @@ -36920,7 +36920,7 @@ static int unixGetpagesize(void){ #ifndef SQLITE_OMIT_WAL /* -** Object used to represent an shared memory buffer. +** Object used to represent an shared memory buffer. ** ** When multiple threads all reference the same wal-index, each thread ** has its own unixShm object, but they all point to a single instance @@ -36940,7 +36940,7 @@ static int unixGetpagesize(void){ ** nRef ** ** The following fields are read-only after the object is created: -** +** ** hShm ** zFilename ** @@ -37067,7 +37067,7 @@ static int unixShmSystemLock( } #endif - return rc; + return rc; } /* @@ -37123,7 +37123,7 @@ static void unixShmPurge(unixFile *pFd){ ** take it now. Return SQLITE_OK if successful, or an SQLite error ** code otherwise. ** -** If the DMS cannot be locked because this is a readonly_shm=1 +** If the DMS cannot be locked because this is a readonly_shm=1 ** connection and no other process already holds a lock, return ** SQLITE_READONLY_CANTINIT and set pShmNode->isUnlocked=1. */ @@ -37134,7 +37134,7 @@ static int unixLockSharedMemory(unixFile *pDbFd, unixShmNode *pShmNode){ /* Use F_GETLK to determine the locks other processes are holding ** on the DMS byte. If it indicates that another process is holding ** a SHARED lock, then this process may also take a SHARED lock - ** and proceed with opening the *-shm file. + ** and proceed with opening the *-shm file. ** ** Or, if no other process is holding any lock, then this process ** is the first to open it. In this case take an EXCLUSIVE lock on the @@ -37182,20 +37182,20 @@ static int unixLockSharedMemory(unixFile *pDbFd, unixShmNode *pShmNode){ } /* -** Open a shared-memory area associated with open database file pDbFd. +** Open a shared-memory area associated with open database file pDbFd. ** This particular implementation uses mmapped files. ** ** The file used to implement shared-memory is in the same directory ** as the open database file and has the same name as the open database ** file with the "-shm" suffix added. For example, if the database file ** is "/home/user1/config.db" then the file that is created and mmapped -** for shared memory will be called "/home/user1/config.db-shm". +** for shared memory will be called "/home/user1/config.db-shm". ** ** Another approach to is to use files in /dev/shm or /dev/tmp or an ** some other tmpfs mount. But if a file in a different directory ** from the database file is used, then differing access permissions ** or a chroot() might cause two different processes on the same -** database to end up using different files for shared memory - +** database to end up using different files for shared memory - ** meaning that their memory would not really be shared - resulting ** in database corruption. Nevertheless, this tmpfs file usage ** can be enabled at compile-time using -DSQLITE_SHM_DIRECTORY="/dev/shm" @@ -37265,7 +37265,7 @@ static int unixOpenSharedMemory(unixFile *pDbFd){ memset(pShmNode, 0, sizeof(*pShmNode)+nShmFilename); zShm = pShmNode->zFilename = (char*)&pShmNode[1]; #ifdef SQLITE_SHM_DIRECTORY - sqlite3_snprintf(nShmFilename, zShm, + sqlite3_snprintf(nShmFilename, zShm, SQLITE_SHM_DIRECTORY "/sqlite-shm-%x-%x", (u32)sStat.st_ino, (u32)sStat.st_dev); #else @@ -37338,22 +37338,22 @@ shm_open_err: } /* -** This function is called to obtain a pointer to region iRegion of the -** shared-memory associated with the database file fd. Shared-memory regions -** are numbered starting from zero. Each shared-memory region is szRegion +** This function is called to obtain a pointer to region iRegion of the +** shared-memory associated with the database file fd. Shared-memory regions +** are numbered starting from zero. Each shared-memory region is szRegion ** bytes in size. ** ** If an error occurs, an error code is returned and *pp is set to NULL. ** ** Otherwise, if the bExtend parameter is 0 and the requested shared-memory ** region has not been allocated (by any client, including one running in a -** separate process), then *pp is set to NULL and SQLITE_OK returned. If -** bExtend is non-zero and the requested shared-memory region has not yet +** separate process), then *pp is set to NULL and SQLITE_OK returned. If +** bExtend is non-zero and the requested shared-memory region has not yet ** been allocated, it is allocated by this function. ** ** If the shared-memory region has already been allocated or is allocated by -** this call as described above, then it is mapped into this processes -** address space (if it is not already), *pp is set to point to the mapped +** this call as described above, then it is mapped into this processes +** address space (if it is not already), *pp is set to point to the mapped ** memory and SQLITE_OK returned. */ static int unixShmMap( @@ -37408,7 +37408,7 @@ static int unixShmMap( rc = SQLITE_IOERR_SHMSIZE; goto shmpage_out; } - + if( sStat.st_sizehShm>=0 ){ pMem = osMmap(0, nMap, - pShmNode->isReadonly ? PROT_READ : PROT_READ|PROT_WRITE, + pShmNode->isReadonly ? PROT_READ : PROT_READ|PROT_WRITE, MAP_SHARED, pShmNode->hShm, szRegion*(i64)pShmNode->nRegion ); if( pMem==MAP_FAILED ){ @@ -37548,7 +37548,7 @@ static int unixShmLock( if( rc==SQLITE_OK ){ p->exclMask &= ~mask; p->sharedMask &= ~mask; - } + } }else if( flags & SQLITE_SHM_SHARED ){ u16 allShared = 0; /* Union of locks held by connections other than "p" */ @@ -37587,7 +37587,7 @@ static int unixShmLock( break; } } - + /* Get the exclusive locks at the system level. Then if successful ** also mark the local connection as being locked. */ @@ -37606,7 +37606,7 @@ static int unixShmLock( } /* -** Implement a memory barrier or memory fence on shared memory. +** Implement a memory barrier or memory fence on shared memory. ** ** All loads and stores begun before the barrier must complete before ** any load or store begun after the barrier. @@ -37616,15 +37616,15 @@ static void unixShmBarrier( ){ UNUSED_PARAMETER(fd); sqlite3MemoryBarrier(); /* compiler-defined memory barrier */ - assert( fd->pMethods->xLock==nolockLock - || unixFileMutexNotheld((unixFile*)fd) + assert( fd->pMethods->xLock==nolockLock + || unixFileMutexNotheld((unixFile*)fd) ); unixEnterMutex(); /* Also mutex, for redundancy */ unixLeaveMutex(); } /* -** Close a connection to shared-memory. Delete the underlying +** Close a connection to shared-memory. Delete the underlying ** storage if deleteFlag is true. ** ** If there is no shared memory associated with the connection then this @@ -37698,7 +37698,7 @@ static void unixUnmapfile(unixFile *pFd){ } /* -** Attempt to set the size of the memory mapping maintained by file +** Attempt to set the size of the memory mapping maintained by file ** descriptor pFd to nNew bytes. Any existing mapping is discarded. ** ** If successful, this function sets the following variables: @@ -37790,14 +37790,14 @@ static void unixRemapfile( /* ** Memory map or remap the file opened by file-descriptor pFd (if the file -** is already mapped, the existing mapping is replaced by the new). Or, if -** there already exists a mapping for this file, and there are still +** is already mapped, the existing mapping is replaced by the new). Or, if +** there already exists a mapping for this file, and there are still ** outstanding xFetch() references to it, this function is a no-op. ** -** If parameter nByte is non-negative, then it is the requested size of -** the mapping to create. Otherwise, if nByte is less than zero, then the +** If parameter nByte is non-negative, then it is the requested size of +** the mapping to create. Otherwise, if nByte is less than zero, then the ** requested size is the size of the file on disk. The actual size of the -** created mapping is either the requested size or the value configured +** created mapping is either the requested size or the value configured ** using SQLITE_FCNTL_MMAP_LIMIT, whichever is smaller. ** ** SQLITE_OK is returned if no error occurs (even if the mapping is not @@ -37838,7 +37838,7 @@ static int unixMapfile(unixFile *pFd, i64 nMap){ ** Finally, if an error does occur, return an SQLite error code. The final ** value of *pp is undefined in this case. ** -** If this function does return a pointer, the caller must eventually +** If this function does return a pointer, the caller must eventually ** release the reference by calling unixUnfetch(). */ static int unixFetch(sqlite3_file *fd, i64 iOff, int nAmt, void **pp){ @@ -37863,13 +37863,13 @@ static int unixFetch(sqlite3_file *fd, i64 iOff, int nAmt, void **pp){ } /* -** If the third argument is non-NULL, then this function releases a +** If the third argument is non-NULL, then this function releases a ** reference obtained by an earlier call to unixFetch(). The second ** argument passed to this function must be the same as the corresponding -** argument that was passed to the unixFetch() invocation. +** argument that was passed to the unixFetch() invocation. ** -** Or, if the third argument is NULL, then this function is being called -** to inform the VFS layer that, according to POSIX, any existing mapping +** Or, if the third argument is NULL, then this function is being called +** to inform the VFS layer that, according to POSIX, any existing mapping ** may now be invalid and should be unmapped. */ static int unixUnfetch(sqlite3_file *fd, i64 iOff, void *p){ @@ -37877,7 +37877,7 @@ static int unixUnfetch(sqlite3_file *fd, i64 iOff, void *p){ unixFile *pFd = (unixFile *)fd; /* The underlying database file */ UNUSED_PARAMETER(iOff); - /* If p==0 (unmap the entire file) then there must be no outstanding + /* If p==0 (unmap the entire file) then there must be no outstanding ** xFetch references. Or, if p!=0 (meaning it is an xFetch reference), ** then there must be at least one outstanding. */ assert( (p==0)==(pFd->nFetchOut==0) ); @@ -38085,8 +38085,8 @@ IOMETHODS( #endif #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE -/* -** This "finder" function attempts to determine the best locking strategy +/* +** This "finder" function attempts to determine the best locking strategy ** for the database file "filePath". It then returns the sqlite3_io_methods ** object that implements that strategy. ** @@ -38128,8 +38128,8 @@ static const sqlite3_io_methods *autolockIoFinderImpl( } /* Default case. Handles, amongst others, "nfs". - ** Test byte-range lock using fcntl(). If the call succeeds, - ** assume that the file-system supports POSIX style locks. + ** Test byte-range lock using fcntl(). If the call succeeds, + ** assume that the file-system supports POSIX style locks. */ lockInfo.l_len = 1; lockInfo.l_start = 0; @@ -38145,7 +38145,7 @@ static const sqlite3_io_methods *autolockIoFinderImpl( return &dotlockIoMethods; } } -static const sqlite3_io_methods +static const sqlite3_io_methods *(*const autolockIoFinder)(const char*,unixFile*) = autolockIoFinderImpl; #endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */ @@ -38181,7 +38181,7 @@ static const sqlite3_io_methods *vxworksIoFinderImpl( return &semIoMethods; } } -static const sqlite3_io_methods +static const sqlite3_io_methods *(*const vxworksIoFinder)(const char*,unixFile*) = vxworksIoFinderImpl; #endif /* OS_VXWORKS */ @@ -38309,14 +38309,14 @@ static int fillInUnixFile( robust_close(pNew, h, __LINE__); h = -1; } - unixLeaveMutex(); + unixLeaveMutex(); } } #endif else if( pLockingStyle == &dotlockIoMethods ){ /* Dotfile locking uses the file path so it needs to be included in - ** the dotlockLockingContext + ** the dotlockLockingContext */ char *zLockFile; int nFilename; @@ -38354,7 +38354,7 @@ static int fillInUnixFile( unixLeaveMutex(); } #endif - + storeLastErrno(pNew, 0); #if OS_VXWORKS if( rc!=SQLITE_OK ){ @@ -38418,7 +38418,7 @@ static int unixGetTempname(int nBuf, char *zBuf){ /* It's odd to simulate an io-error here, but really this is just ** using the io-error infrastructure to test that SQLite handles this - ** function failing. + ** function failing. */ zBuf[0] = 0; SimulateIOError( return SQLITE_IOERR ); @@ -38447,7 +38447,7 @@ static int proxyTransformUnixFile(unixFile*, const char*); #endif /* -** Search for an unused file descriptor that was opened on the database +** Search for an unused file descriptor that was opened on the database ** file (not a journal or master-journal file) identified by pathname ** zPath with SQLITE_OPEN_XXX flags matching those passed as the second ** argument to this function. @@ -38456,7 +38456,7 @@ static int proxyTransformUnixFile(unixFile*, const char*); ** but the associated file descriptor could not be closed because some ** other file descriptor open on the same file is holding a file-lock. ** Refer to comments in the unixClose() function and the lengthy comment -** describing "Posix Advisory Locking" at the start of this file for +** describing "Posix Advisory Locking" at the start of this file for ** further details. Also, ticket #4018. ** ** If a suitable file descriptor is found, then it is returned. If no @@ -38467,8 +38467,8 @@ static UnixUnusedFd *findReusableFd(const char *zPath, int flags){ /* Do not search for an unused file descriptor on vxworks. Not because ** vxworks would not benefit from the change (it might, we're not sure), - ** but because no way to test it is currently available. It is better - ** not to risk breaking vxworks support for the sake of such an obscure + ** but because no way to test it is currently available. It is better + ** not to risk breaking vxworks support for the sake of such an obscure ** feature. */ #if !OS_VXWORKS struct stat sStat; /* Results of stat() call */ @@ -38510,7 +38510,7 @@ static UnixUnusedFd *findReusableFd(const char *zPath, int flags){ } /* -** Find the mode, uid and gid of file zFile. +** Find the mode, uid and gid of file zFile. */ static int getFileMode( const char *zFile, /* File name */ @@ -38534,16 +38534,16 @@ static int getFileMode( ** This function is called by unixOpen() to determine the unix permissions ** to create new files with. If no error occurs, then SQLITE_OK is returned ** and a value suitable for passing as the third argument to open(2) is -** written to *pMode. If an IO error occurs, an SQLite error code is +** written to *pMode. If an IO error occurs, an SQLite error code is ** returned and the value of *pMode is not modified. ** ** In most cases, this routine sets *pMode to 0, which will become ** an indication to robust_open() to create the file using ** SQLITE_DEFAULT_FILE_PERMISSIONS adjusted by the umask. -** But if the file being opened is a WAL or regular journal file, then -** this function queries the file-system for the permissions on the -** corresponding database file and sets *pMode to this value. Whenever -** possible, WAL and journal files are created using the same permissions +** But if the file being opened is a WAL or regular journal file, then +** this function queries the file-system for the permissions on the +** corresponding database file and sets *pMode to this value. Whenever +** possible, WAL and journal files are created using the same permissions ** as the associated database file. ** ** If the SQLITE_ENABLE_8_3_NAMES option is enabled, then the @@ -38575,10 +38575,10 @@ static int findCreateFileMode( ** "-journalNN" ** "-walNN" ** - ** where NN is a decimal number. The NN naming schemes are + ** where NN is a decimal number. The NN naming schemes are ** used by the test_multiplex.c module. */ - nDb = sqlite3Strlen30(zPath) - 1; + nDb = sqlite3Strlen30(zPath) - 1; while( zPath[nDb]!='-' ){ /* In normal operation, the journal file name will always contain ** a '-' character. However in 8+3 filename mode, or if a corrupt @@ -38608,7 +38608,7 @@ static int findCreateFileMode( /* ** Open the file zPath. -** +** ** Previously, the SQLite OS layer used three functions in place of this ** one: ** @@ -38619,13 +38619,13 @@ static int findCreateFileMode( ** These calls correspond to the following combinations of flags: ** ** ReadWrite() -> (READWRITE | CREATE) -** ReadOnly() -> (READONLY) +** ReadOnly() -> (READONLY) ** OpenExclusive() -> (READWRITE | CREATE | EXCLUSIVE) ** ** The old OpenExclusive() accepted a boolean argument - "delFlag". If ** true, the file was configured to be automatically deleted when the -** file handle closed. To achieve the same effect using this new -** interface, add the DELETEONCLOSE flag to those specified above for +** file handle closed. To achieve the same effect using this new +** interface, add the DELETEONCLOSE flag to those specified above for ** OpenExclusive(). */ static int unixOpen( @@ -38660,8 +38660,8 @@ static int unixOpen( ** is called the directory file descriptor will be fsync()ed and close()d. */ int isNewJrnl = (isCreate && ( - eType==SQLITE_OPEN_MASTER_JOURNAL - || eType==SQLITE_OPEN_MAIN_JOURNAL + eType==SQLITE_OPEN_MASTER_JOURNAL + || eType==SQLITE_OPEN_MAIN_JOURNAL || eType==SQLITE_OPEN_WAL )); @@ -38671,9 +38671,9 @@ static int unixOpen( char zTmpname[MAX_PATHNAME+2]; const char *zName = zPath; - /* Check the following statements are true: + /* Check the following statements are true: ** - ** (a) Exactly one of the READWRITE and READONLY flags must be set, and + ** (a) Exactly one of the READWRITE and READONLY flags must be set, and ** (b) if CREATE is set, then READWRITE must also be set, and ** (c) if EXCLUSIVE is set, then CREATE must also be set. ** (d) if DELETEONCLOSE is set, then CREATE must also be set. @@ -38683,7 +38683,7 @@ static int unixOpen( assert(isExclusive==0 || isCreate); assert(isDelete==0 || isCreate); - /* The main DB, main journal, WAL file and master journal are never + /* The main DB, main journal, WAL file and master journal are never ** automatically deleted. Nor are they ever temporary files. */ assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_DB ); assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_JOURNAL ); @@ -38691,9 +38691,9 @@ static int unixOpen( assert( (!isDelete && zName) || eType!=SQLITE_OPEN_WAL ); /* Assert that the upper layer has set one of the "file-type" flags. */ - assert( eType==SQLITE_OPEN_MAIN_DB || eType==SQLITE_OPEN_TEMP_DB - || eType==SQLITE_OPEN_MAIN_JOURNAL || eType==SQLITE_OPEN_TEMP_JOURNAL - || eType==SQLITE_OPEN_SUBJOURNAL || eType==SQLITE_OPEN_MASTER_JOURNAL + assert( eType==SQLITE_OPEN_MAIN_DB || eType==SQLITE_OPEN_TEMP_DB + || eType==SQLITE_OPEN_MAIN_JOURNAL || eType==SQLITE_OPEN_TEMP_JOURNAL + || eType==SQLITE_OPEN_SUBJOURNAL || eType==SQLITE_OPEN_MASTER_JOURNAL || eType==SQLITE_OPEN_TRANSIENT_DB || eType==SQLITE_OPEN_WAL ); @@ -38742,7 +38742,7 @@ static int unixOpen( /* Determine the value of the flags parameter passed to POSIX function ** open(). These must be calculated even if open() is not called, as - ** they may be stored as part of the file handle and used by the + ** they may be stored as part of the file handle and used by the ** 'conch file' locking functions later on. */ if( isReadonly ) openFlags |= O_RDONLY; if( isReadWrite ) openFlags |= O_RDWR; @@ -38807,7 +38807,7 @@ static int unixOpen( if( p->pPreallocatedUnused ){ p->pPreallocatedUnused->fd = fd; - p->pPreallocatedUnused->flags = + p->pPreallocatedUnused->flags = flags & (SQLITE_OPEN_READONLY|SQLITE_OPEN_READWRITE); } @@ -38829,7 +38829,7 @@ static int unixOpen( p->openFlags = openFlags; } #endif - + #if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE if( fstatfs(fd, &fsInfo) == -1 ){ storeLastErrno(p, errno); @@ -38860,7 +38860,7 @@ static int unixOpen( char *envforce = getenv("SQLITE_FORCE_PROXY_LOCKING"); int useProxy = 0; - /* SQLITE_FORCE_PROXY_LOCKING==1 means force always use proxy, 0 means + /* SQLITE_FORCE_PROXY_LOCKING==1 means force always use proxy, 0 means ** never use proxy, NULL means use proxy for non-local files only. */ if( envforce!=NULL ){ useProxy = atoi(envforce)>0; @@ -38872,9 +38872,9 @@ static int unixOpen( if( rc==SQLITE_OK ){ rc = proxyTransformUnixFile((unixFile*)pFile, ":auto:"); if( rc!=SQLITE_OK ){ - /* Use unixClose to clean up the resources added in fillInUnixFile - ** and clear all the structure's references. Specifically, - ** pFile->pMethods will be NULL so sqlite3OsClose will be a no-op + /* Use unixClose to clean up the resources added in fillInUnixFile + ** and clear all the structure's references. Specifically, + ** pFile->pMethods will be NULL so sqlite3OsClose will be a no-op */ unixClose(pFile); return rc; @@ -38884,9 +38884,9 @@ static int unixOpen( } } #endif - - assert( zPath==0 || zPath[0]=='/' - || eType==SQLITE_OPEN_MASTER_JOURNAL || eType==SQLITE_OPEN_MAIN_JOURNAL + + assert( zPath==0 || zPath[0]=='/' + || eType==SQLITE_OPEN_MASTER_JOURNAL || eType==SQLITE_OPEN_MAIN_JOURNAL ); rc = fillInUnixFile(pVfs, fd, pFile, zPath, ctrlFlags); @@ -39003,9 +39003,9 @@ static int mkFullPathname( /* ** Turn a relative pathname into a full pathname. The relative path ** is stored as a nul-terminated string in the buffer pointed to by -** zPath. +** zPath. ** -** zOut points to a buffer of at least sqlite3_vfs.mxPathname bytes +** zOut points to a buffer of at least sqlite3_vfs.mxPathname bytes ** (in this case, MAX_PATHNAME bytes). The full-path is written to ** this buffer before returning. */ @@ -39122,7 +39122,7 @@ static void unixDlError(sqlite3_vfs *NotUsed, int nBuf, char *zBufOut){ unixLeaveMutex(); } static void (*unixDlSym(sqlite3_vfs *NotUsed, void *p, const char*zSym))(void){ - /* + /* ** GCC with -pedantic-errors says that C90 does not allow a void* to be ** cast into a pointer to a function. And yet the library dlsym() routine ** returns a void* which is really a pointer to a function. So how do we @@ -39132,7 +39132,7 @@ static void (*unixDlSym(sqlite3_vfs *NotUsed, void *p, const char*zSym))(void){ ** parameters void* and const char* and returning a pointer to a function. ** We initialize x by assigning it a pointer to the dlsym() function. ** (That assignment requires a cast.) Then we call the function that - ** x points to. + ** x points to. ** ** This work-around is unlikely to work correctly on any system where ** you really cannot cast a function pointer into void*. But then, on the @@ -39175,7 +39175,7 @@ static int unixRandomness(sqlite3_vfs *NotUsed, int nBuf, char *zBuf){ ** tests repeatable. */ memset(zBuf, 0, nBuf); - randomnessPid = osGetpid(0); + randomnessPid = osGetpid(0); #if !defined(SQLITE_TEST) && !defined(SQLITE_OMIT_RANDOMNESS) { int fd, got; @@ -39242,7 +39242,7 @@ SQLITE_API int sqlite3_current_time = 0; /* Fake system time in seconds since 1 ** epoch of noon in Greenwich on November 24, 4714 B.C according to the ** proleptic Gregorian calendar. ** -** On success, return SQLITE_OK. Return SQLITE_ERROR if the time and date +** On success, return SQLITE_OK. Return SQLITE_ERROR if the time and date ** cannot be found. */ static int unixCurrentTimeInt64(sqlite3_vfs *NotUsed, sqlite3_int64 *piNow){ @@ -39349,7 +39349,7 @@ static int unixGetLastError(sqlite3_vfs *NotUsed, int NotUsed2, char *NotUsed3){ ** To address the performance and cache coherency issues, proxy file locking ** changes the way database access is controlled by limiting access to a ** single host at a time and moving file locks off of the database file -** and onto a proxy file on the local file system. +** and onto a proxy file on the local file system. ** ** ** Using proxy locks @@ -39375,19 +39375,19 @@ static int unixGetLastError(sqlite3_vfs *NotUsed, int NotUsed2, char *NotUsed3){ ** actual proxy file name is generated from the name and path of the ** database file. For example: ** -** For database path "/Users/me/foo.db" +** For database path "/Users/me/foo.db" ** The lock path will be "/sqliteplocks/_Users_me_foo.db:auto:") ** ** Once a lock proxy is configured for a database connection, it can not ** be removed, however it may be switched to a different proxy path via ** the above APIs (assuming the conch file is not being held by another -** connection or process). +** connection or process). ** ** ** How proxy locking works ** ----------------------- ** -** Proxy file locking relies primarily on two new supporting files: +** Proxy file locking relies primarily on two new supporting files: ** ** * conch file to limit access to the database file to a single host ** at a time @@ -39414,11 +39414,11 @@ static int unixGetLastError(sqlite3_vfs *NotUsed, int NotUsed2, char *NotUsed3){ ** host (the conch ensures that they all use the same local lock file). ** ** Requesting the lock proxy does not immediately take the conch, it is -** only taken when the first request to lock database file is made. +** only taken when the first request to lock database file is made. ** This matches the semantics of the traditional locking behavior, where ** opening a connection to a database file does not take a lock on it. -** The shared lock and an open file descriptor are maintained until -** the connection to the database is closed. +** The shared lock and an open file descriptor are maintained until +** the connection to the database is closed. ** ** The proxy file and the lock file are never deleted so they only need ** to be created the first time they are used. @@ -39432,7 +39432,7 @@ static int unixGetLastError(sqlite3_vfs *NotUsed, int NotUsed2, char *NotUsed3){ ** automatically configured for proxy locking, lock files are ** named automatically using the same logic as ** PRAGMA lock_proxy_file=":auto:" -** +** ** SQLITE_PROXY_DEBUG ** ** Enables the logging of error messages during host id file @@ -39447,8 +39447,8 @@ static int unixGetLastError(sqlite3_vfs *NotUsed, int NotUsed2, char *NotUsed3){ ** ** Permissions to use when creating a directory for storing the ** lock proxy files, only used when LOCKPROXYDIR is not set. -** -** +** +** ** As mentioned above, when compiled with SQLITE_PREFER_PROXY_LOCKING, ** setting the environment variable SQLITE_FORCE_PROXY_LOCKING to 1 will ** force proxy locking to be used for every database file opened, and 0 @@ -39458,12 +39458,12 @@ static int unixGetLastError(sqlite3_vfs *NotUsed, int NotUsed2, char *NotUsed3){ */ /* -** Proxy locking is only available on MacOSX +** Proxy locking is only available on MacOSX */ #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE /* -** The proxyLockingContext has the path and file structures for the remote +** The proxyLockingContext has the path and file structures for the remote ** and local proxy files in it */ typedef struct proxyLockingContext proxyLockingContext; @@ -39479,10 +39479,10 @@ struct proxyLockingContext { sqlite3_io_methods const *pOldMethod; /* Original I/O methods for close */ }; -/* -** The proxy lock file path for the database at dbPath is written into lPath, +/* +** The proxy lock file path for the database at dbPath is written into lPath, ** which must point to valid, writable memory large enough for a maxLen length -** file path. +** file path. */ static int proxyGetLockPath(const char *dbPath, char *lPath, size_t maxLen){ int len; @@ -39499,7 +39499,7 @@ static int proxyGetLockPath(const char *dbPath, char *lPath, size_t maxLen){ lPath, errno, osGetpid(0))); return SQLITE_IOERR_LOCK; } - len = strlcat(lPath, "sqliteplocks", maxLen); + len = strlcat(lPath, "sqliteplocks", maxLen); } # else len = strlcpy(lPath, "/tmp/", maxLen); @@ -39509,7 +39509,7 @@ static int proxyGetLockPath(const char *dbPath, char *lPath, size_t maxLen){ if( lPath[len-1]!='/' ){ len = strlcat(lPath, "/", maxLen); } - + /* transform the db path to a unique cache name */ dbLen = (int)strlen(dbPath); for( i=0; i 0) ){ /* only mkdir if leaf dir != "." or "/" or ".." */ - if( i-start>2 || (i-start==1 && buf[start] != '.' && buf[start] != '/') + if( i-start>2 || (i-start==1 && buf[start] != '.' && buf[start] != '/') || (i-start==2 && buf[start] != '.' && buf[start+1] != '.') ){ buf[i]='\0'; if( osMkdir(buf, SQLITE_DEFAULT_PROXYDIR_PERMISSIONS) ){ @@ -39614,13 +39614,13 @@ static int proxyCreateUnixFile( switch (terrno) { case EACCES: return SQLITE_PERM; - case EIO: + case EIO: return SQLITE_IOERR_LOCK; /* even though it is the conch */ default: return SQLITE_CANTOPEN_BKPT; } } - + pNew = (unixFile *)sqlite3_malloc64(sizeof(*pNew)); if( pNew==NULL ){ rc = SQLITE_NOMEM_BKPT; @@ -39634,13 +39634,13 @@ static int proxyCreateUnixFile( pUnused->fd = fd; pUnused->flags = openFlags; pNew->pPreallocatedUnused = pUnused; - + rc = fillInUnixFile(&dummyVfs, fd, (sqlite3_file*)pNew, path, 0); if( rc==SQLITE_OK ){ *ppFile = pNew; return SQLITE_OK; } -end_create_proxy: +end_create_proxy: robust_close(pNew, fd, __LINE__); sqlite3_free(pNew); sqlite3_free(pUnused); @@ -39659,7 +39659,7 @@ SQLITE_API int sqlite3_hostid_num = 0; extern int gethostuuid(uuid_t id, const struct timespec *wait); #endif -/* get the host ID via gethostuuid(), pHostID must point to PROXY_HOSTIDLEN +/* get the host ID via gethostuuid(), pHostID must point to PROXY_HOSTIDLEN ** bytes of writable memory. */ static int proxyGetHostID(unsigned char *pHostID, int *pError){ @@ -39685,7 +39685,7 @@ static int proxyGetHostID(unsigned char *pHostID, int *pError){ pHostID[0] = (char)(pHostID[0] + (char)(sqlite3_hostid_num & 0xFF)); } #endif - + return SQLITE_OK; } @@ -39696,14 +39696,14 @@ static int proxyGetHostID(unsigned char *pHostID, int *pError){ #define PROXY_PATHINDEX (PROXY_HEADERLEN+PROXY_HOSTIDLEN) #define PROXY_MAXCONCHLEN (PROXY_HEADERLEN+PROXY_HOSTIDLEN+MAXPATHLEN) -/* -** Takes an open conch file, copies the contents to a new path and then moves +/* +** Takes an open conch file, copies the contents to a new path and then moves ** it back. The newly created file's file descriptor is assigned to the -** conch file structure and finally the original conch file descriptor is +** conch file structure and finally the original conch file descriptor is ** closed. Returns zero if successful. */ static int proxyBreakConchLock(unixFile *pFile, uuid_t myHostID){ - proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; + proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; unixFile *conchFile = pCtx->conchFile; char tPath[MAXPATHLEN]; char buf[PROXY_MAXCONCHLEN]; @@ -39717,7 +39717,7 @@ static int proxyBreakConchLock(unixFile *pFile, uuid_t myHostID){ /* create a new path by replace the trailing '-conch' with '-break' */ pathLen = strlcpy(tPath, cPath, MAXPATHLEN); - if( pathLen>MAXPATHLEN || pathLen<6 || + if( pathLen>MAXPATHLEN || pathLen<6 || (strlcpy(&tPath[pathLen-5], "break", 6) != 5) ){ sqlite3_snprintf(sizeof(errmsg),errmsg,"path error (len %d)",(int)pathLen); goto end_breaklock; @@ -39759,24 +39759,24 @@ end_breaklock: return rc; } -/* Take the requested lock on the conch file and break a stale lock if the +/* Take the requested lock on the conch file and break a stale lock if the ** host id matches. */ static int proxyConchLock(unixFile *pFile, uuid_t myHostID, int lockType){ - proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; + proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; unixFile *conchFile = pCtx->conchFile; int rc = SQLITE_OK; int nTries = 0; struct timespec conchModTime; - + memset(&conchModTime, 0, sizeof(conchModTime)); do { rc = conchFile->pMethod->xLock((sqlite3_file*)conchFile, lockType); nTries ++; if( rc==SQLITE_BUSY ){ /* If the lock failed (busy): - * 1st try: get the mod time of the conch, wait 0.5s and try again. - * 2nd try: fail if the mod time changed or host id is different, wait + * 1st try: get the mod time of the conch, wait 0.5s and try again. + * 2nd try: fail if the mod time changed or host id is different, wait * 10 sec and try again * 3rd try: break the lock unless the mod time has changed. */ @@ -39785,20 +39785,20 @@ static int proxyConchLock(unixFile *pFile, uuid_t myHostID, int lockType){ storeLastErrno(pFile, errno); return SQLITE_IOERR_LOCK; } - + if( nTries==1 ){ conchModTime = buf.st_mtimespec; usleep(500000); /* wait 0.5 sec and try the lock again*/ - continue; + continue; } assert( nTries>1 ); - if( conchModTime.tv_sec != buf.st_mtimespec.tv_sec || + if( conchModTime.tv_sec != buf.st_mtimespec.tv_sec || conchModTime.tv_nsec != buf.st_mtimespec.tv_nsec ){ return SQLITE_BUSY; } - - if( nTries==2 ){ + + if( nTries==2 ){ char tBuf[PROXY_MAXCONCHLEN]; int len = osPread(conchFile->h, tBuf, PROXY_MAXCONCHLEN, 0); if( len<0 ){ @@ -39815,9 +39815,9 @@ static int proxyConchLock(unixFile *pFile, uuid_t myHostID, int lockType){ return SQLITE_BUSY; } usleep(10000000); /* wait 10 sec and try the lock again */ - continue; + continue; } - + assert( nTries==3 ); if( 0==proxyBreakConchLock(pFile, myHostID) ){ rc = SQLITE_OK; @@ -39830,19 +39830,19 @@ static int proxyConchLock(unixFile *pFile, uuid_t myHostID, int lockType){ } } } while( rc==SQLITE_BUSY && nTries<3 ); - + return rc; } -/* Takes the conch by taking a shared lock and read the contents conch, if -** lockPath is non-NULL, the host ID and lock file path must match. A NULL -** lockPath means that the lockPath in the conch file will be used if the -** host IDs match, or a new lock path will be generated automatically +/* Takes the conch by taking a shared lock and read the contents conch, if +** lockPath is non-NULL, the host ID and lock file path must match. A NULL +** lockPath means that the lockPath in the conch file will be used if the +** host IDs match, or a new lock path will be generated automatically ** and written to the conch file. */ static int proxyTakeConch(unixFile *pFile){ - proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; - + proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; + if( pCtx->conchHeld!=0 ){ return SQLITE_OK; }else{ @@ -39858,7 +39858,7 @@ static int proxyTakeConch(unixFile *pFile){ int readLen = 0; int tryOldLockPath = 0; int forceNewLockPath = 0; - + OSTRACE(("TAKECONCH %d for %s pid=%d\n", conchFile->h, (pCtx->lockProxyPath ? pCtx->lockProxyPath : ":auto:"), osGetpid(0))); @@ -39879,21 +39879,21 @@ static int proxyTakeConch(unixFile *pFile){ storeLastErrno(pFile, conchFile->lastErrno); rc = SQLITE_IOERR_READ; goto end_takeconch; - }else if( readLen<=(PROXY_HEADERLEN+PROXY_HOSTIDLEN) || + }else if( readLen<=(PROXY_HEADERLEN+PROXY_HOSTIDLEN) || readBuf[0]!=(char)PROXY_CONCHVERSION ){ - /* a short read or version format mismatch means we need to create a new - ** conch file. + /* a short read or version format mismatch means we need to create a new + ** conch file. */ createConch = 1; } /* if the host id matches and the lock path already exists in the conch - ** we'll try to use the path there, if we can't open that path, we'll - ** retry with a new auto-generated path + ** we'll try to use the path there, if we can't open that path, we'll + ** retry with a new auto-generated path */ do { /* in case we need to try again for an :auto: named lock file */ if( !createConch && !forceNewLockPath ){ - hostIdMatch = !memcmp(&readBuf[PROXY_HEADERLEN], myHostID, + hostIdMatch = !memcmp(&readBuf[PROXY_HEADERLEN], myHostID, PROXY_HOSTIDLEN); /* if the conch has data compare the contents */ if( !pCtx->lockProxyPath ){ @@ -39902,7 +39902,7 @@ static int proxyTakeConch(unixFile *pFile){ */ if( hostIdMatch ){ size_t pathLen = (readLen - PROXY_PATHINDEX); - + if( pathLen>=MAXPATHLEN ){ pathLen=MAXPATHLEN-1; } @@ -39918,23 +39918,23 @@ static int proxyTakeConch(unixFile *pFile){ readLen-PROXY_PATHINDEX) ){ /* conch host and lock path match */ - goto end_takeconch; + goto end_takeconch; } } - + /* if the conch isn't writable and doesn't match, we can't take it */ if( (conchFile->openFlags&O_RDWR) == 0 ){ rc = SQLITE_BUSY; goto end_takeconch; } - + /* either the conch didn't match or we need to create a new one */ if( !pCtx->lockProxyPath ){ proxyGetLockPath(pCtx->dbPath, lockPath, MAXPATHLEN); tempLockPath = lockPath; /* create a copy of the lock path _only_ if the conch is taken */ } - + /* update conch with host and path (this will fail if other process ** has a shared lock already), if the host id matches, use the big ** stick. @@ -39945,7 +39945,7 @@ static int proxyTakeConch(unixFile *pFile){ /* We are trying for an exclusive lock but another thread in this ** same process is still holding a shared lock. */ rc = SQLITE_BUSY; - } else { + } else { rc = proxyConchLock(pFile, myHostID, EXCLUSIVE_LOCK); } }else{ @@ -39954,7 +39954,7 @@ static int proxyTakeConch(unixFile *pFile){ if( rc==SQLITE_OK ){ char writeBuffer[PROXY_MAXCONCHLEN]; int writeSize = 0; - + writeBuffer[0] = (char)PROXY_CONCHVERSION; memcpy(&writeBuffer[PROXY_HEADERLEN], myHostID, PROXY_HOSTIDLEN); if( pCtx->lockProxyPath!=NULL ){ @@ -39967,8 +39967,8 @@ static int proxyTakeConch(unixFile *pFile){ robust_ftruncate(conchFile->h, writeSize); rc = unixWrite((sqlite3_file *)conchFile, writeBuffer, writeSize, 0); full_fsync(conchFile->h,0,0); - /* If we created a new conch file (not just updated the contents of a - ** valid conch file), try to match the permissions of the database + /* If we created a new conch file (not just updated the contents of a + ** valid conch file), try to match the permissions of the database */ if( rc==SQLITE_OK && createConch ){ struct stat buf; @@ -39992,14 +39992,14 @@ static int proxyTakeConch(unixFile *pFile){ } }else{ int code = errno; - fprintf(stderr, "STAT FAILED[%d] with %d %s\n", + fprintf(stderr, "STAT FAILED[%d] with %d %s\n", err, code, strerror(code)); #endif } } } conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, SHARED_LOCK); - + end_takeconch: OSTRACE(("TRANSPROXY: CLOSE %d\n", pFile->h)); if( rc==SQLITE_OK && pFile->openFlags ){ @@ -40022,7 +40022,7 @@ static int proxyTakeConch(unixFile *pFile){ rc = proxyCreateUnixFile(path, &pCtx->lockProxy, 1); if( rc!=SQLITE_OK && rc!=SQLITE_NOMEM && tryOldLockPath ){ /* we couldn't create the proxy lock file with the old lock file path - ** so try again via auto-naming + ** so try again via auto-naming */ forceNewLockPath = 1; tryOldLockPath = 0; @@ -40042,7 +40042,7 @@ static int proxyTakeConch(unixFile *pFile){ } if( rc==SQLITE_OK ){ pCtx->conchHeld = 1; - + if( pCtx->lockProxy->pMethod == &afpIoMethods ){ afpLockingContext *afpCtx; afpCtx = (afpLockingContext *)pCtx->lockProxy->lockingContext; @@ -40054,7 +40054,7 @@ static int proxyTakeConch(unixFile *pFile){ OSTRACE(("TAKECONCH %d %s\n", conchFile->h, rc==SQLITE_OK?"ok":"failed")); return rc; - } while (1); /* in case we need to retry the :auto: lock file - + } while (1); /* in case we need to retry the :auto: lock file - ** we should never get here except via the 'continue' call. */ } } @@ -40070,7 +40070,7 @@ static int proxyReleaseConch(unixFile *pFile){ pCtx = (proxyLockingContext *)pFile->lockingContext; conchFile = pCtx->conchFile; OSTRACE(("RELEASECONCH %d for %s pid=%d\n", conchFile->h, - (pCtx->lockProxyPath ? pCtx->lockProxyPath : ":auto:"), + (pCtx->lockProxyPath ? pCtx->lockProxyPath : ":auto:"), osGetpid(0))); if( pCtx->conchHeld>0 ){ rc = conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, NO_LOCK); @@ -40098,13 +40098,13 @@ static int proxyCreateConchPathname(char *dbPath, char **pConchPath){ char *conchPath; /* buffer in which to construct conch name */ /* Allocate space for the conch filename and initialize the name to - ** the name of the original database file. */ + ** the name of the original database file. */ *pConchPath = conchPath = (char *)sqlite3_malloc64(len + 8); if( conchPath==0 ){ return SQLITE_NOMEM_BKPT; } memcpy(conchPath, dbPath, len+1); - + /* now insert a "." before the last / character */ for( i=(len-1); i>=0; i-- ){ if( conchPath[i]=='/' ){ @@ -40127,7 +40127,7 @@ static int proxyCreateConchPathname(char *dbPath, char **pConchPath){ /* Takes a fully configured proxy locking-style unix file and switches -** the local lock file path +** the local lock file path */ static int switchLockProxyPath(unixFile *pFile, const char *path) { proxyLockingContext *pCtx = (proxyLockingContext*)pFile->lockingContext; @@ -40136,7 +40136,7 @@ static int switchLockProxyPath(unixFile *pFile, const char *path) { if( pFile->eFileLock!=NO_LOCK ){ return SQLITE_BUSY; - } + } /* nothing to do if the path is NULL, :auto: or matches the existing path */ if( !path || path[0]=='\0' || !strcmp(path, ":auto:") || @@ -40154,7 +40154,7 @@ static int switchLockProxyPath(unixFile *pFile, const char *path) { sqlite3_free(oldPath); pCtx->lockProxyPath = sqlite3DbStrDup(0, path); } - + return rc; } @@ -40168,7 +40168,7 @@ static int switchLockProxyPath(unixFile *pFile, const char *path) { static int proxyGetDbPathForUnixFile(unixFile *pFile, char *dbPath){ #if defined(__APPLE__) if( pFile->pMethod == &afpIoMethods ){ - /* afp style keeps a reference to the db path in the filePath field + /* afp style keeps a reference to the db path in the filePath field ** of the struct */ assert( (int)strlen((char*)pFile->lockingContext)<=MAXPATHLEN ); strlcpy(dbPath, ((afpLockingContext *)pFile->lockingContext)->dbPath, @@ -40189,9 +40189,9 @@ static int proxyGetDbPathForUnixFile(unixFile *pFile, char *dbPath){ } /* -** Takes an already filled in unix file and alters it so all file locking +** Takes an already filled in unix file and alters it so all file locking ** will be performed on the local proxy lock file. The following fields -** are preserved in the locking context so that they can be restored and +** are preserved in the locking context so that they can be restored and ** the unix structure properly cleaned up at close time: ** ->lockingContext ** ->pMethod @@ -40201,7 +40201,7 @@ static int proxyTransformUnixFile(unixFile *pFile, const char *path) { char dbPath[MAXPATHLEN+1]; /* Name of the database file */ char *lockPath=NULL; int rc = SQLITE_OK; - + if( pFile->eFileLock!=NO_LOCK ){ return SQLITE_BUSY; } @@ -40211,7 +40211,7 @@ static int proxyTransformUnixFile(unixFile *pFile, const char *path) { }else{ lockPath=(char *)path; } - + OSTRACE(("TRANSPROXY %d for %s pid=%d\n", pFile->h, (lockPath ? lockPath : ":auto:"), osGetpid(0))); @@ -40245,7 +40245,7 @@ static int proxyTransformUnixFile(unixFile *pFile, const char *path) { rc = SQLITE_OK; } } - } + } if( rc==SQLITE_OK && lockPath ){ pCtx->lockProxyPath = sqlite3DbStrDup(0, lockPath); } @@ -40257,7 +40257,7 @@ static int proxyTransformUnixFile(unixFile *pFile, const char *path) { } } if( rc==SQLITE_OK ){ - /* all memory is allocated, proxys are created and assigned, + /* all memory is allocated, proxys are created and assigned, ** switch the locking context and pMethod then return. */ pCtx->oldLockingContext = pFile->lockingContext; @@ -40265,12 +40265,12 @@ static int proxyTransformUnixFile(unixFile *pFile, const char *path) { pCtx->pOldMethod = pFile->pMethod; pFile->pMethod = &proxyIoMethods; }else{ - if( pCtx->conchFile ){ + if( pCtx->conchFile ){ pCtx->conchFile->pMethod->xClose((sqlite3_file *)pCtx->conchFile); sqlite3_free(pCtx->conchFile); } sqlite3DbFree(0, pCtx->lockProxyPath); - sqlite3_free(pCtx->conchFilePath); + sqlite3_free(pCtx->conchFilePath); sqlite3_free(pCtx); } OSTRACE(("TRANSPROXY %d %s\n", pFile->h, @@ -40308,7 +40308,7 @@ static int proxyFileControl(sqlite3_file *id, int op, void *pArg){ if( isProxyStyle ){ /* turn off proxy locking - not supported. If support is added for ** switching proxy locking mode off then it will need to fail if - ** the journal mode is WAL mode. + ** the journal mode is WAL mode. */ rc = SQLITE_ERROR /*SQLITE_PROTOCOL? SQLITE_MISUSE?*/; }else{ @@ -40318,9 +40318,9 @@ static int proxyFileControl(sqlite3_file *id, int op, void *pArg){ }else{ const char *proxyPath = (const char *)pArg; if( isProxyStyle ){ - proxyLockingContext *pCtx = + proxyLockingContext *pCtx = (proxyLockingContext*)pFile->lockingContext; - if( !strcmp(pArg, ":auto:") + if( !strcmp(pArg, ":auto:") || (pCtx->lockProxyPath && !strncmp(pCtx->lockProxyPath, proxyPath, MAXPATHLEN)) ){ @@ -40445,7 +40445,7 @@ static int proxyClose(sqlite3_file *id) { unixFile *lockProxy = pCtx->lockProxy; unixFile *conchFile = pCtx->conchFile; int rc = SQLITE_OK; - + if( lockProxy ){ rc = lockProxy->pMethod->xUnlock((sqlite3_file*)lockProxy, NO_LOCK); if( rc ) return rc; @@ -40482,7 +40482,7 @@ static int proxyClose(sqlite3_file *id) { ** The proxy locking style is intended for use with AFP filesystems. ** And since AFP is only supported on MacOSX, the proxy locking is also ** restricted to MacOSX. -** +** ** ******************* End of the proxy lock implementation ********************** ******************************************************************************/ @@ -40500,8 +40500,8 @@ static int proxyClose(sqlite3_file *id) { ** necessarily been initialized when this routine is called, and so they ** should not be used. */ -SQLITE_API int sqlite3_os_init(void){ - /* +SQLITE_API int sqlite3_os_init(void){ + /* ** The following macro defines an initializer for an sqlite3_vfs object. ** The name of the VFS is NAME. The pAppData is a pointer to a pointer ** to the "finder" function. (pAppData is a pointer to a pointer because @@ -40517,7 +40517,7 @@ SQLITE_API int sqlite3_os_init(void){ ** ** Most finders simply return a pointer to a fixed sqlite3_io_methods ** object. But the "autolockIoFinder" available on MacOSX does a little - ** more than that; it looks at the filesystem type that hosts the + ** more than that; it looks at the filesystem type that hosts the ** database file and tries to choose an locking method appropriate for ** that filesystem time. */ @@ -40590,7 +40590,7 @@ SQLITE_API int sqlite3_os_init(void){ sqlite3_vfs_register(&aVfs[i], i==0); } unixBigLock = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1); - return SQLITE_OK; + return SQLITE_OK; } /* @@ -40600,11 +40600,11 @@ SQLITE_API int sqlite3_os_init(void){ ** to release dynamically allocated objects. But not on unix. ** This routine is a no-op for unix. */ -SQLITE_API int sqlite3_os_end(void){ +SQLITE_API int sqlite3_os_end(void){ unixBigLock = 0; - return SQLITE_OK; + return SQLITE_OK; } - + #endif /* SQLITE_OS_UNIX */ /************** End of os_unix.c *********************************************/ @@ -40727,7 +40727,7 @@ SQLITE_API int sqlite3_os_end(void){ __asm__ __volatile__ ("rdtsc" : "=A" (val)); return val; } - + #elif (defined(__GNUC__) && defined(__ppc__)) __inline__ sqlite_uint64 sqlite3Hwtime(void){ @@ -47029,7 +47029,7 @@ static sqlite3_vfs memdb_vfs = { 1024, /* mxPathname */ 0, /* pNext */ "memdb", /* zName */ - 0, /* pAppData (set when registered) */ + 0, /* pAppData (set when registered) */ memdbOpen, /* xOpen */ 0, /* memdbDelete, */ /* xDelete */ memdbAccess, /* xAccess */ @@ -47054,7 +47054,7 @@ static const sqlite3_io_methods memdb_io_methods = { memdbSync, /* xSync */ memdbFileSize, /* xFileSize */ memdbLock, /* xLock */ - memdbLock, /* xUnlock - same as xLock in this case */ + memdbLock, /* xUnlock - same as xLock in this case */ 0, /* memdbCheckReservedLock, */ /* xCheckReservedLock */ memdbFileControl, /* xFileControl */ 0, /* memdbSectorSize,*/ /* xSectorSize */ @@ -47085,9 +47085,9 @@ static int memdbClose(sqlite3_file *pFile){ ** Read data from an memdb-file. */ static int memdbRead( - sqlite3_file *pFile, - void *zBuf, - int iAmt, + sqlite3_file *pFile, + void *zBuf, + int iAmt, sqlite_int64 iOfst ){ MemFile *p = (MemFile *)pFile; @@ -47155,7 +47155,7 @@ static int memdbWrite( static int memdbTruncate(sqlite3_file *pFile, sqlite_int64 size){ MemFile *p = (MemFile *)pFile; if( NEVER(size>p->sz) ) return SQLITE_FULL; - p->sz = size; + p->sz = size; return SQLITE_OK; } @@ -47180,7 +47180,7 @@ static int memdbFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){ */ static int memdbLock(sqlite3_file *pFile, int eLock){ MemFile *p = (MemFile *)pFile; - if( eLock>SQLITE_LOCK_SHARED + if( eLock>SQLITE_LOCK_SHARED && (p->mFlags & SQLITE_DESERIALIZE_READONLY)!=0 ){ return SQLITE_READONLY; @@ -47238,7 +47238,7 @@ static int memdbSectorSize(sqlite3_file *pFile){ ** Return the device characteristic flags supported by an memdb-file. */ static int memdbDeviceCharacteristics(sqlite3_file *pFile){ - return SQLITE_IOCAP_ATOMIC | + return SQLITE_IOCAP_ATOMIC | SQLITE_IOCAP_POWERSAFE_OVERWRITE | SQLITE_IOCAP_SAFE_APPEND | SQLITE_IOCAP_SEQUENTIAL; @@ -47310,9 +47310,9 @@ static int memdbDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ ** With memdb, no files ever exist on disk. So always return false. */ static int memdbAccess( - sqlite3_vfs *pVfs, - const char *zPath, - int flags, + sqlite3_vfs *pVfs, + const char *zPath, + int flags, int *pResOut ){ *pResOut = 0; @@ -47325,9 +47325,9 @@ static int memdbAccess( ** of at least (INST_MAX_PATHNAME+1) bytes. */ static int memdbFullPathname( - sqlite3_vfs *pVfs, - const char *zPath, - int nOut, + sqlite3_vfs *pVfs, + const char *zPath, + int nOut, char *zOut ){ sqlite3_snprintf(nOut, zOut, "%s", zPath); @@ -47343,7 +47343,7 @@ static void *memdbDlOpen(sqlite3_vfs *pVfs, const char *zPath){ /* ** Populate the buffer zErrMsg (size nByte bytes) with a human readable -** utf-8 string describing the most recent error encountered associated +** utf-8 string describing the most recent error encountered associated ** with dynamic libraries. */ static void memdbDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){ @@ -47365,7 +47365,7 @@ static void memdbDlClose(sqlite3_vfs *pVfs, void *pHandle){ } /* -** Populate the buffer pointed to by zBufOut with nByte bytes of +** Populate the buffer pointed to by zBufOut with nByte bytes of ** random data. */ static int memdbRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ @@ -47373,7 +47373,7 @@ static int memdbRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ } /* -** Sleep for nMicro microseconds. Return the number of microseconds +** Sleep for nMicro microseconds. Return the number of microseconds ** actually slept. */ static int memdbSleep(sqlite3_vfs *pVfs, int nMicro){ @@ -47479,7 +47479,7 @@ SQLITE_API unsigned char *sqlite3_serialize( }else{ memset(pTo, 0, szPage); } - sqlite3PagerUnref(pPage); + sqlite3PagerUnref(pPage); } } } @@ -47518,7 +47518,7 @@ SQLITE_API int sqlite3_deserialize( if( iDb<0 ){ rc = SQLITE_ERROR; goto end_deserialize; - } + } zSql = sqlite3_mprintf("ATTACH x AS %Q", zSchema); rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); sqlite3_free(zSql); @@ -47552,7 +47552,7 @@ end_deserialize: return rc; } -/* +/* ** This routine is called when the extension is loaded. ** Register the new VFS. */ @@ -47590,8 +47590,8 @@ SQLITE_PRIVATE int sqlite3MemdbInit(void){ ** property. Usually only a few pages are meet either condition. ** So the bitmap is usually sparse and has low cardinality. ** But sometimes (for example when during a DROP of a large table) most -** or all of the pages in a database can get journalled. In those cases, -** the bitmap becomes dense with high cardinality. The algorithm needs +** or all of the pages in a database can get journalled. In those cases, +** the bitmap becomes dense with high cardinality. The algorithm needs ** to handle both cases well. ** ** The size of the bitmap is fixed when the object is created. @@ -47612,13 +47612,13 @@ SQLITE_PRIVATE int sqlite3MemdbInit(void){ /* Size of the Bitvec structure in bytes. */ #define BITVEC_SZ 512 -/* Round the union size down to the nearest pointer boundary, since that's how +/* Round the union size down to the nearest pointer boundary, since that's how ** it will be aligned within the Bitvec struct. */ #define BITVEC_USIZE \ (((BITVEC_SZ-(3*sizeof(u32)))/sizeof(Bitvec*))*sizeof(Bitvec*)) -/* Type of the array "element" for the bitmap representation. -** Should be a power of 2, and ideally, evenly divide into BITVEC_USIZE. +/* Type of the array "element" for the bitmap representation. +** Should be a power of 2, and ideally, evenly divide into BITVEC_USIZE. ** Setting this to the "natural word" size of your CPU may improve ** performance. */ #define BITVEC_TELEM u8 @@ -47631,12 +47631,12 @@ SQLITE_PRIVATE int sqlite3MemdbInit(void){ /* Number of u32 values in hash table. */ #define BITVEC_NINT (BITVEC_USIZE/sizeof(u32)) -/* Maximum number of entries in hash table before +/* Maximum number of entries in hash table before ** sub-dividing and re-hashing. */ #define BITVEC_MXHASH (BITVEC_NINT/2) /* Hashing function for the aHash representation. -** Empirical testing showed that the *37 multiplier -** (an arbitrary prime)in the hash function provided +** Empirical testing showed that the *37 multiplier +** (an arbitrary prime)in the hash function provided ** no fewer collisions than the no-op *1. */ #define BITVEC_HASH(X) (((X)*1)%BITVEC_NINT) @@ -47682,7 +47682,7 @@ struct Bitvec { /* ** Create a new bitmap object able to handle bits between 0 and iSize, -** inclusive. Return a pointer to the new object. Return NULL if +** inclusive. Return a pointer to the new object. Return NULL if ** malloc fails. */ SQLITE_PRIVATE Bitvec *sqlite3BitvecCreate(u32 iSize){ @@ -47938,7 +47938,7 @@ SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int sz, int *aOp){ break; } case 3: - case 4: + case 4: default: { nx = 2; sqlite3_randomness(sizeof(i), &i); @@ -48018,7 +48018,7 @@ bitvec_end: ** ** The PCache.pSynced variable is used to optimize searching for a dirty ** page to eject from the cache mid-transaction. It is better to eject -** a page that does not require a journal sync than one that does. +** a page that does not require a journal sync than one that does. ** Therefore, pSynced is maintained so that it *almost* always points ** to either the oldest page in the pDirty/pDirtyTail list that has a ** clear PGHDR_NEED_SYNC flag or to a page that is older than this one @@ -48059,7 +48059,7 @@ struct PCache { sqlite3_pcache_page *pLower; PgHdr *pPg; unsigned char *a; - + if( sqlite3PcacheTrace<2 ) return; if( pCache->pCache==0 ) return; N = sqlite3PcachePagecount(pCache); @@ -48151,12 +48151,12 @@ static void pcacheManageDirtyList(PgHdr *pPage, u8 addRemove){ if( addRemove & PCACHE_DIRTYLIST_REMOVE ){ assert( pPage->pDirtyNext || pPage==p->pDirtyTail ); assert( pPage->pDirtyPrev || pPage==p->pDirty ); - + /* Update the PCache1.pSynced variable if necessary. */ if( p->pSynced==pPage ){ p->pSynced = pPage->pDirtyPrev; } - + if( pPage->pDirtyNext ){ pPage->pDirtyNext->pDirtyPrev = pPage->pDirtyPrev; }else{ @@ -48166,7 +48166,7 @@ static void pcacheManageDirtyList(PgHdr *pPage, u8 addRemove){ if( pPage->pDirtyPrev ){ pPage->pDirtyPrev->pDirtyNext = pPage->pDirtyNext; }else{ - /* If there are now no dirty pages in the cache, set eCreate to 2. + /* If there are now no dirty pages in the cache, set eCreate to 2. ** This is an optimization that allows sqlite3PcacheFetch() to skip ** searching for a dirty page to eject from the cache when it might ** otherwise have to. */ @@ -48195,11 +48195,11 @@ static void pcacheManageDirtyList(PgHdr *pPage, u8 addRemove){ p->pDirty = pPage; /* If pSynced is NULL and this page has a clear NEED_SYNC flag, set - ** pSynced to point to it. Checking the NEED_SYNC flag is an + ** pSynced to point to it. Checking the NEED_SYNC flag is an ** optimization, as if pSynced points to a page with the NEED_SYNC - ** flag set sqlite3PcacheFetchStress() searches through all newer + ** flag set sqlite3PcacheFetchStress() searches through all newer ** entries of the dirty-list for a page with NEED_SYNC clear anyway. */ - if( !p->pSynced + if( !p->pSynced && 0==(pPage->flags&PGHDR_NEED_SYNC) /*OPTIMIZATION-IF-FALSE*/ ){ p->pSynced = pPage; @@ -48240,7 +48240,7 @@ static int numberOfCachePages(PCache *p){ /*************************************************** General Interfaces ****** ** -** Initialize and shutdown the page cache subsystem. Neither of these +** Initialize and shutdown the page cache subsystem. Neither of these ** functions are threadsafe. */ SQLITE_PRIVATE int sqlite3PcacheInitialize(void){ @@ -48267,8 +48267,8 @@ SQLITE_PRIVATE int sqlite3PcacheSize(void){ return sizeof(PCache); } /* ** Create a new PCache object. Storage space to hold the object -** has already been allocated and is passed in as the p pointer. -** The caller discovers how much space needs to be allocated by +** has already been allocated and is passed in as the p pointer. +** The caller discovers how much space needs to be allocated by ** calling sqlite3PcacheSize(). ** ** szExtra is some extra space allocated for each page. The first @@ -48380,7 +48380,7 @@ SQLITE_PRIVATE sqlite3_pcache_page *sqlite3PcacheFetch( /* ** If the sqlite3PcacheFetch() routine is unable to allocate a new ** page because no clean pages are available for reuse and the cache -** size limit has been reached, then this routine can be invoked to +** size limit has been reached, then this routine can be invoked to ** try harder to allocate a page. This routine might invoke the stress ** callback to spill dirty pages to the journal. It will then try to ** allocate the new page and will only fail to allocate a new page on @@ -48397,17 +48397,17 @@ SQLITE_PRIVATE int sqlite3PcacheFetchStress( if( pCache->eCreate==2 ) return 0; if( sqlite3PcachePagecount(pCache)>pCache->szSpill ){ - /* Find a dirty page to write-out and recycle. First try to find a + /* Find a dirty page to write-out and recycle. First try to find a ** page that does not require a journal-sync (one with PGHDR_NEED_SYNC - ** cleared), but if that is not possible settle for any other + ** cleared), but if that is not possible settle for any other ** unreferenced dirty page. ** ** If the LRU page in the dirty list that has a clear PGHDR_NEED_SYNC ** flag is currently referenced, then the following may leave pSynced ** set incorrectly (pointing to other than the LRU page with NEED_SYNC ** cleared). This is Ok, as pSynced is just an optimization. */ - for(pPg=pCache->pSynced; - pPg && (pPg->nRef || (pPg->flags&PGHDR_NEED_SYNC)); + for(pPg=pCache->pSynced; + pPg && (pPg->nRef || (pPg->flags&PGHDR_NEED_SYNC)); pPg=pPg->pDirtyPrev ); pCache->pSynced = pPg; @@ -48417,7 +48417,7 @@ SQLITE_PRIVATE int sqlite3PcacheFetchStress( if( pPg ){ int rc; #ifdef SQLITE_LOG_CACHE_SPILL - sqlite3_log(SQLITE_FULL, + sqlite3_log(SQLITE_FULL, "spill page %d making room for %d - cache used: %d/%d", pPg->pgno, pgno, sqlite3GlobalConfig.pcache2.xPagecount(pCache->pCache), @@ -48602,7 +48602,7 @@ SQLITE_PRIVATE void sqlite3PcacheClearSyncFlags(PCache *pCache){ } /* -** Change the page number of page p to newPgno. +** Change the page number of page p to newPgno. */ SQLITE_PRIVATE void sqlite3PcacheMove(PgHdr *p, Pgno newPgno){ PCache *pCache = p->pCache; @@ -48665,7 +48665,7 @@ SQLITE_PRIVATE void sqlite3PcacheClose(PCache *pCache){ sqlite3GlobalConfig.pcache2.xDestroy(pCache->pCache); } -/* +/* ** Discard the contents of the cache. */ SQLITE_PRIVATE void sqlite3PcacheClear(PCache *pCache){ @@ -48756,7 +48756,7 @@ SQLITE_PRIVATE PgHdr *sqlite3PcacheDirtyList(PCache *pCache){ return pcacheSortDirtyList(pCache->pDirty); } -/* +/* ** Return the total number of references to all pages held by the cache. ** ** This is not the total number of pages referenced, but the sum of the @@ -48773,7 +48773,7 @@ SQLITE_PRIVATE int sqlite3PcachePageRefcount(PgHdr *p){ return p->nRef; } -/* +/* ** Return the total number of pages in the cache. */ SQLITE_PRIVATE int sqlite3PcachePagecount(PCache *pCache){ @@ -48815,7 +48815,7 @@ SQLITE_PRIVATE int sqlite3PcacheSetSpillsize(PCache *p, int mxPage){ p->szSpill = mxPage; } res = numberOfCachePages(p); - if( resszSpill ) res = p->szSpill; + if( resszSpill ) res = p->szSpill; return res; } @@ -48846,7 +48846,7 @@ SQLITE_PRIVATE int sqlite3PCachePercentDirty(PCache *pCache){ } #ifdef SQLITE_DIRECT_OVERFLOW_READ -/* +/* ** Return true if there are one or more dirty pages in the cache. Else false. */ SQLITE_PRIVATE int sqlite3PCacheIsDirty(PCache *pCache){ @@ -48935,7 +48935,7 @@ SQLITE_PRIVATE void sqlite3PcacheIterateDirty(PCache *pCache, void (*xIter)(PgHd ** ** The third case is a chunk of heap memory (defaulting to 100 pages worth) ** that is allocated when the page cache is created. The size of the local -** bulk allocation can be adjusted using +** bulk allocation can be adjusted using ** ** sqlite3_config(SQLITE_CONFIG_PAGECACHE, (void*)0, 0, N). ** @@ -48960,16 +48960,16 @@ typedef struct PgFreeslot PgFreeslot; typedef struct PGroup PGroup; /* -** Each cache entry is represented by an instance of the following +** Each cache entry is represented by an instance of the following ** structure. Unless SQLITE_PCACHE_SEPARATE_HEADER is defined, a buffer of -** PgHdr1.pCache->szPage bytes is allocated directly before this structure +** PgHdr1.pCache->szPage bytes is allocated directly before this structure ** in memory. ** ** Note: Variables isBulkLocal and isAnchor were once type "u8". That works, -** but causes a 2-byte gap in the structure for most architectures (since +** but causes a 2-byte gap in the structure for most architectures (since ** pointers must be either 4 or 8-byte aligned). As this structure is located ** in memory directly after the associated page data, if the database is -** corrupt, code at the b-tree layer may overread the page buffer and +** corrupt, code at the b-tree layer may overread the page buffer and ** read part of this structure before the corruption is detected. This ** can cause a valgrind error if the unitialized gap is accessed. Using u16 ** ensures there is no such gap, and therefore no bytes of unitialized memory @@ -48994,7 +48994,7 @@ struct PgHdr1 { #define PAGE_IS_PINNED(p) ((p)->pLruNext==0) #define PAGE_IS_UNPINNED(p) ((p)->pLruNext!=0) -/* Each page cache (or PCache) belongs to a PGroup. A PGroup is a set +/* Each page cache (or PCache) belongs to a PGroup. A PGroup is a set ** of one or more PCaches that are able to recycle each other's unpinned ** pages when they are under memory pressure. A PGroup is an instance of ** the following object. @@ -49030,13 +49030,13 @@ struct PGroup { ** temporary or transient database) has a single page cache which ** is an instance of this object. ** -** Pointers to structures of this type are cast and returned as +** Pointers to structures of this type are cast and returned as ** opaque sqlite3_pcache* handles. */ struct PCache1 { /* Cache configuration parameters. Page size (szPage) and the purgeable ** flag (bPurgeable) and the pnPurgeable pointer are all set when the - ** cache is created and are never changed thereafter. nMax may be + ** cache is created and are never changed thereafter. nMax may be ** modified at any time by a call to the pcache1Cachesize() method. ** The PGroup mutex must be held when accessing nMax. */ @@ -49084,7 +49084,7 @@ static SQLITE_WSD struct PCacheGlobal { */ int isInit; /* True if initialized */ int separateCache; /* Use a new PGroup for each PCache */ - int nInitPage; /* Initial bulk allocation size */ + int nInitPage; /* Initial bulk allocation size */ int szSlot; /* Size of each free slot */ int nSlot; /* The number of pcache slots */ int nReserve; /* Try to keep nFreeSlot above this */ @@ -49125,7 +49125,7 @@ static SQLITE_WSD struct PCacheGlobal { /* -** This function is called during initialization if a static buffer is +** This function is called during initialization if a static buffer is ** supplied to use for the page-cache by passing the SQLITE_CONFIG_PAGECACHE ** verb to sqlite3_config(). Parameter pBuf points to an allocation large ** enough to contain 'n' buffers of 'sz' bytes each. @@ -49195,8 +49195,8 @@ static int pcache1InitBulk(PCache1 *pCache){ /* ** Malloc function used within this file to allocate space from the buffer -** configured using sqlite3_config(SQLITE_CONFIG_PAGECACHE) option. If no -** such buffer exists or there is no space left in it, this function falls +** configured using sqlite3_config(SQLITE_CONFIG_PAGECACHE) option. If no +** such buffer exists or there is no space left in it, this function falls ** back to sqlite3Malloc(). ** ** Multiple threads can run this routine at the same time. Global variables @@ -49303,7 +49303,7 @@ static PgHdr1 *pcache1AllocPage(PCache1 *pCache, int benignMalloc){ }else{ #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT /* The group mutex must be released before pcache1Alloc() is called. This - ** is because it might call sqlite3_release_memory(), which assumes that + ** is because it might call sqlite3_release_memory(), which assumes that ** this mutex is not held. */ assert( pcache1.separateCache==0 ); assert( pCache->pGroup==&pcache1.grp ); @@ -49442,7 +49442,7 @@ static void pcache1ResizeHash(PCache1 *p){ } /* -** This function is used internally to remove the page pPage from the +** This function is used internally to remove the page pPage from the ** PGroup LRU list, if is part of it. If pPage is not part of the PGroup ** LRU list, then this function is a no-op. ** @@ -49467,7 +49467,7 @@ static PgHdr1 *pcache1PinPage(PgHdr1 *pPage){ /* -** Remove the page supplied as an argument from the hash table +** Remove the page supplied as an argument from the hash table ** (PCache1.apHash structure) that it is currently stored in. ** Also free the page if freePage is true. ** @@ -49510,8 +49510,8 @@ static void pcache1EnforceMaxPage(PCache1 *pCache){ } /* -** Discard all pages from cache pCache with a page number (key value) -** greater than or equal to iLimit. Any pinned pages that meet this +** Discard all pages from cache pCache with a page number (key value) +** greater than or equal to iLimit. Any pinned pages that meet this ** criteria are unpinned before they are discarded. ** ** The PCache mutex must be held when this function is called. @@ -49543,7 +49543,7 @@ static void pcache1TruncateUnsafe( PgHdr1 **pp; PgHdr1 *pPage; assert( hnHash ); - pp = &pCache->apHash[h]; + pp = &pCache->apHash[h]; while( (pPage = *pp)!=0 ){ if( pPage->iKey>=iLimit ){ pCache->nPage--; @@ -49582,7 +49582,7 @@ static int pcache1Init(void *NotUsed){ ** ** * Use a unified cache in single-threaded applications that have ** configured a start-time buffer for use as page-cache memory using - ** sqlite3_config(SQLITE_CONFIG_PAGECACHE, pBuf, sz, N) with non-NULL + ** sqlite3_config(SQLITE_CONFIG_PAGECACHE, pBuf, sz, N) with non-NULL ** pBuf argument. ** ** * Otherwise use separate caches (mode-1) @@ -49617,7 +49617,7 @@ static int pcache1Init(void *NotUsed){ /* ** Implementation of the sqlite3_pcache.xShutdown method. -** Note that the static mutex allocated in xInit does +** Note that the static mutex allocated in xInit does ** not need to be freed. */ static void pcache1Shutdown(void *NotUsed){ @@ -49680,7 +49680,7 @@ static sqlite3_pcache *pcache1Create(int szPage, int szExtra, int bPurgeable){ } /* -** Implementation of the sqlite3_pcache.xCachesize method. +** Implementation of the sqlite3_pcache.xCachesize method. ** ** Configure the cache_size limit for a cache. */ @@ -49699,7 +49699,7 @@ static void pcache1Cachesize(sqlite3_pcache *p, int nMax){ } /* -** Implementation of the sqlite3_pcache.xShrink method. +** Implementation of the sqlite3_pcache.xShrink method. ** ** Free up as much memory as possible. */ @@ -49718,7 +49718,7 @@ static void pcache1Shrink(sqlite3_pcache *p){ } /* -** Implementation of the sqlite3_pcache.xPagecount method. +** Implementation of the sqlite3_pcache.xPagecount method. */ static int pcache1Pagecount(sqlite3_pcache *p){ int n; @@ -49739,8 +49739,8 @@ static int pcache1Pagecount(sqlite3_pcache *p){ ** for these steps, the main pcache1Fetch() procedure can run faster. */ static SQLITE_NOINLINE PgHdr1 *pcache1FetchStage2( - PCache1 *pCache, - unsigned int iKey, + PCache1 *pCache, + unsigned int iKey, int createFlag ){ unsigned int nPinned; @@ -49782,8 +49782,8 @@ static SQLITE_NOINLINE PgHdr1 *pcache1FetchStage2( } } - /* Step 5. If a usable page buffer has still not been found, - ** attempt to allocate a new one. + /* Step 5. If a usable page buffer has still not been found, + ** attempt to allocate a new one. */ if( !pPage ){ pPage = pcache1AllocPage(pCache, createFlag==1); @@ -49808,13 +49808,13 @@ static SQLITE_NOINLINE PgHdr1 *pcache1FetchStage2( } /* -** Implementation of the sqlite3_pcache.xFetch method. +** Implementation of the sqlite3_pcache.xFetch method. ** ** Fetch a page by key value. ** ** Whether or not a new page may be allocated by this function depends on ** the value of the createFlag argument. 0 means do not allocate a new -** page. 1 means allocate a new page if space is easily available. 2 +** page. 1 means allocate a new page if space is easily available. 2 ** means to try really hard to allocate a new page. ** ** For a non-purgeable cache (a cache used as the storage for an in-memory @@ -49825,7 +49825,7 @@ static SQLITE_NOINLINE PgHdr1 *pcache1FetchStage2( ** There are three different approaches to obtaining space for a page, ** depending on the value of parameter createFlag (which may be 0, 1 or 2). ** -** 1. Regardless of the value of createFlag, the cache is searched for a +** 1. Regardless of the value of createFlag, the cache is searched for a ** copy of the requested page. If one is found, it is returned. ** ** 2. If createFlag==0 and the page is not already in the cache, NULL is @@ -49839,13 +49839,13 @@ static SQLITE_NOINLINE PgHdr1 *pcache1FetchStage2( ** PCache1.nMax, or ** ** (b) the number of pages pinned by the cache is greater than -** the sum of nMax for all purgeable caches, less the sum of +** the sum of nMax for all purgeable caches, less the sum of ** nMin for all other purgeable caches, or ** ** 4. If none of the first three conditions apply and the cache is marked ** as purgeable, and if one of the following is true: ** -** (a) The number of pages allocated for the cache is already +** (a) The number of pages allocated for the cache is already ** PCache1.nMax, or ** ** (b) The number of pages allocated for all purgeable caches is @@ -49857,7 +49857,7 @@ static SQLITE_NOINLINE PgHdr1 *pcache1FetchStage2( ** ** then attempt to recycle a page from the LRU list. If it is the right ** size, return the recycled buffer. Otherwise, free the buffer and -** proceed to step 5. +** proceed to step 5. ** ** 5. Otherwise, allocate and return a new page buffer. ** @@ -49867,8 +49867,8 @@ static SQLITE_NOINLINE PgHdr1 *pcache1FetchStage2( ** invokes the appropriate routine. */ static PgHdr1 *pcache1FetchNoMutex( - sqlite3_pcache *p, - unsigned int iKey, + sqlite3_pcache *p, + unsigned int iKey, int createFlag ){ PCache1 *pCache = (PCache1 *)p; @@ -49897,8 +49897,8 @@ static PgHdr1 *pcache1FetchNoMutex( } #if PCACHE1_MIGHT_USE_GROUP_MUTEX static PgHdr1 *pcache1FetchWithMutex( - sqlite3_pcache *p, - unsigned int iKey, + sqlite3_pcache *p, + unsigned int iKey, int createFlag ){ PCache1 *pCache = (PCache1 *)p; @@ -49912,8 +49912,8 @@ static PgHdr1 *pcache1FetchWithMutex( } #endif static sqlite3_pcache_page *pcache1Fetch( - sqlite3_pcache *p, - unsigned int iKey, + sqlite3_pcache *p, + unsigned int iKey, int createFlag ){ #if PCACHE1_MIGHT_USE_GROUP_MUTEX || defined(SQLITE_DEBUG) @@ -49943,18 +49943,18 @@ static sqlite3_pcache_page *pcache1Fetch( ** Mark a page as unpinned (eligible for asynchronous recycling). */ static void pcache1Unpin( - sqlite3_pcache *p, - sqlite3_pcache_page *pPg, + sqlite3_pcache *p, + sqlite3_pcache_page *pPg, int reuseUnlikely ){ PCache1 *pCache = (PCache1 *)p; PgHdr1 *pPage = (PgHdr1 *)pPg; PGroup *pGroup = pCache->pGroup; - + assert( pPage->pCache==pCache ); pcache1EnterMutex(pGroup); - /* It is an error to call this function if the page is already + /* It is an error to call this function if the page is already ** part of the PGroup LRU list. */ assert( pPage->pLruNext==0 ); @@ -49975,7 +49975,7 @@ static void pcache1Unpin( } /* -** Implementation of the sqlite3_pcache.xRekey method. +** Implementation of the sqlite3_pcache.xRekey method. */ static void pcache1Rekey( sqlite3_pcache *p, @@ -49986,7 +49986,7 @@ static void pcache1Rekey( PCache1 *pCache = (PCache1 *)p; PgHdr1 *pPage = (PgHdr1 *)pPg; PgHdr1 **pp; - unsigned int h; + unsigned int h; assert( pPage->iKey==iOld ); assert( pPage->pCache==pCache ); @@ -50011,7 +50011,7 @@ static void pcache1Rekey( } /* -** Implementation of the sqlite3_pcache.xTruncate method. +** Implementation of the sqlite3_pcache.xTruncate method. ** ** Discard all unpinned pages in the cache with a page number equal to ** or greater than parameter iLimit. Any pinned pages with a page number @@ -50028,7 +50028,7 @@ static void pcache1Truncate(sqlite3_pcache *p, unsigned int iLimit){ } /* -** Implementation of the sqlite3_pcache.xDestroy method. +** Implementation of the sqlite3_pcache.xDestroy method. ** ** Destroy a cache allocated using pcache1Create(). */ @@ -50094,7 +50094,7 @@ SQLITE_PRIVATE sqlite3_mutex *sqlite3Pcache1Mutex(void){ ** by the current thread may be sqlite3_free()ed. ** ** nReq is the number of bytes of memory required. Once this much has -** been released, the function returns. The return value is the total number +** been released, the function returns. The return value is the total number ** of bytes of memory released. */ SQLITE_PRIVATE int sqlite3PcacheReleaseMemory(int nReq){ @@ -50185,7 +50185,7 @@ SQLITE_PRIVATE void sqlite3PcacheStats( ** extracts the least value from the RowSet. ** ** The INSERT primitive might allocate additional memory. Memory is -** allocated in chunks so most INSERTs do no allocation. There is an +** allocated in chunks so most INSERTs do no allocation. There is an ** upper bound on the size of allocated memory. No memory is freed ** until DESTROY. ** @@ -50233,7 +50233,7 @@ SQLITE_PRIVATE void sqlite3PcacheStats( ** in the list, pLeft points to the tree, and v is unused. The ** RowSet.pForest value points to the head of this forest list. */ -struct RowSetEntry { +struct RowSetEntry { i64 v; /* ROWID value for this entry */ struct RowSetEntry *pRight; /* Right subtree (larger entries) or list */ struct RowSetEntry *pLeft; /* Left subtree (smaller entries) */ @@ -50385,7 +50385,7 @@ SQLITE_PRIVATE void sqlite3RowSetInsert(RowSet *p, i64 rowid){ /* ** Merge two lists of RowSetEntry objects. Remove duplicates. ** -** The input lists are connected via pRight pointers and are +** The input lists are connected via pRight pointers and are ** assumed to each already be in sorted order. */ static struct RowSetEntry *rowSetEntryMerge( @@ -50422,7 +50422,7 @@ static struct RowSetEntry *rowSetEntryMerge( /* ** Sort all elements on the list of RowSetEntry objects into order of ** increasing v. -*/ +*/ static struct RowSetEntry *rowSetEntrySort(struct RowSetEntry *pIn){ unsigned int i; struct RowSetEntry *pNext, *aBucket[40]; @@ -50495,7 +50495,7 @@ static struct RowSetEntry *rowSetNDeepTree( struct RowSetEntry *pLeft; /* Left subtree */ if( *ppList==0 ){ /*OPTIMIZATION-IF-TRUE*/ /* Prevent unnecessary deep recursion when we run out of entries */ - return 0; + return 0; } if( iDepth>1 ){ /*OPTIMIZATION-IF-TRUE*/ /* This branch causes a *balanced* tree to be generated. A valid tree @@ -50665,7 +50665,7 @@ SQLITE_PRIVATE int sqlite3RowSetTest(RowSet *pRowSet, int iBatch, sqlite3_int64 ** ************************************************************************* ** This is the implementation of the page cache subsystem or "pager". -** +** ** The pager is used to access a database disk file. It implements ** atomic commit and rollback through the use of a journal file that ** is separate from the database file. The pager also implements file @@ -50688,8 +50688,8 @@ SQLITE_PRIVATE int sqlite3RowSetTest(RowSet *pRowSet, int iBatch, sqlite3_int64 ** May you share freely, never taking more than you give. ** ************************************************************************* -** This header file defines the interface to the write-ahead logging -** system. Refer to the comments below and the header comment attached to +** This header file defines the interface to the write-ahead logging +** system. Refer to the comments below and the header comment attached to ** the implementation of each function in log.c for further details. */ @@ -50728,8 +50728,8 @@ SQLITE_PRIVATE int sqlite3RowSetTest(RowSet *pRowSet, int iBatch, sqlite3_int64 #define WAL_SAVEPOINT_NDATA 4 -/* Connection to a write-ahead log (WAL) file. -** There is one object of this type for each pager. +/* Connection to a write-ahead log (WAL) file. +** There is one object of this type for each pager. */ typedef struct Wal Wal; @@ -50740,7 +50740,7 @@ SQLITE_PRIVATE int sqlite3WalClose(Wal *pWal, sqlite3*, int sync_flags, int, u8 /* Set the limiting size of a WAL file. */ SQLITE_PRIVATE void sqlite3WalLimit(Wal*, i64); -/* Used by readers to open (lock) and close (unlock) a snapshot. A +/* Used by readers to open (lock) and close (unlock) a snapshot. A ** snapshot is like a read-transaction. It is the state of the database ** at an instant in time. sqlite3WalOpenSnapshot gets a read lock and ** preserves the current state even if the other threads or processes @@ -50775,7 +50775,7 @@ SQLITE_PRIVATE int sqlite3WalSavepointUndo(Wal *pWal, u32 *aWalData); /* Write a frame or frames to the log. */ SQLITE_PRIVATE int sqlite3WalFrames(Wal *pWal, int, PgHdr *, Pgno, int, int); -/* Copy pages from the log to the database file */ +/* Copy pages from the log to the database file */ SQLITE_PRIVATE int sqlite3WalCheckpoint( Wal *pWal, /* Write-ahead log connection */ sqlite3 *db, /* Check this handle's interrupt flag */ @@ -50803,7 +50803,7 @@ SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal *pWal, int op); /* Return true if the argument is non-NULL and the WAL module is using ** heap-memory for the wal-index. Otherwise, if the argument is NULL or the -** WAL module is using shared-memory, return false. +** WAL module is using shared-memory, return false. */ SQLITE_PRIVATE int sqlite3WalHeapMemory(Wal *pWal); @@ -50845,60 +50845,60 @@ SQLITE_PRIVATE sqlite3_file *sqlite3WalFile(Wal *pWal); ** ** Definition: A page of the database file is said to be "overwriteable" if ** one or more of the following are true about the page: -** +** ** (a) The original content of the page as it was at the beginning of ** the transaction has been written into the rollback journal and ** synced. -** +** ** (b) The page was a freelist leaf page at the start of the transaction. -** +** ** (c) The page number is greater than the largest page that existed in ** the database file at the start of the transaction. -** +** ** (1) A page of the database file is never overwritten unless one of the ** following are true: -** +** ** (a) The page and all other pages on the same sector are overwriteable. -** +** ** (b) The atomic page write optimization is enabled, and the entire ** transaction other than the update of the transaction sequence ** number consists of a single page change. -** +** ** (2) The content of a page written into the rollback journal exactly matches ** both the content in the database when the rollback journal was written ** and the content in the database at the beginning of the current ** transaction. -** +** ** (3) Writes to the database file are an integer multiple of the page size ** in length and are aligned on a page boundary. -** +** ** (4) Reads from the database file are either aligned on a page boundary and ** an integer multiple of the page size in length or are taken from the ** first 100 bytes of the database file. -** +** ** (5) All writes to the database file are synced prior to the rollback journal ** being deleted, truncated, or zeroed. -** +** ** (6) If a master journal file is used, then all writes to the database file ** are synced prior to the master journal being deleted. -** +** ** Definition: Two databases (or the same database at two points it time) ** are said to be "logically equivalent" if they give the same answer to ** all queries. Note in particular the content of freelist leaf ** pages can be changed arbitrarily without affecting the logical equivalence ** of the database. -** +** ** (7) At any time, if any subset, including the empty set and the total set, -** of the unsynced changes to a rollback journal are removed and the +** of the unsynced changes to a rollback journal are removed and the ** journal is rolled back, the resulting database file will be logically ** equivalent to the database file at the beginning of the transaction. -** +** ** (8) When a transaction is rolled back, the xTruncate method of the VFS ** is called to restore the database file to the same size it was at ** the beginning of the transaction. (In some VFSes, the xTruncate ** method is a no-op, but that does not change the fact the SQLite will ** invoke it.) -** +** ** (9) Whenever the database file is modified, at least one bit in the range ** of bytes from 24 through 39 inclusive will be changed prior to releasing ** the EXCLUSIVE lock, thus signaling other connections on the same @@ -50931,7 +50931,7 @@ int sqlite3PagerTrace=1; /* True to enable tracing */ /* ** The following two macros are used within the PAGERTRACE() macros above -** to print out file-descriptors. +** to print out file-descriptors. ** ** PAGERID() takes a pointer to a Pager struct as its argument. The ** associated file-descriptor is returned. FILEHANDLEID() takes an sqlite3_file @@ -50952,7 +50952,7 @@ int sqlite3PagerTrace=1; /* True to enable tracing */ ** | | | ** | V | ** |<-------WRITER_LOCKED------> ERROR -** | | ^ +** | | ^ ** | V | ** |<------WRITER_CACHEMOD-------->| ** | | | @@ -50964,7 +50964,7 @@ int sqlite3PagerTrace=1; /* True to enable tracing */ ** ** ** List of state transitions and the C [function] that performs each: -** +** ** OPEN -> READER [sqlite3PagerSharedLock] ** READER -> OPEN [pager_unlock] ** @@ -50976,7 +50976,7 @@ int sqlite3PagerTrace=1; /* True to enable tracing */ ** ** WRITER_*** -> ERROR [pager_error] ** ERROR -> OPEN [pager_unlock] -** +** ** ** OPEN: ** @@ -50990,9 +50990,9 @@ int sqlite3PagerTrace=1; /* True to enable tracing */ ** ** READER: ** -** In this state all the requirements for reading the database in +** In this state all the requirements for reading the database in ** rollback (non-WAL) mode are met. Unless the pager is (or recently -** was) in exclusive-locking mode, a user-level read transaction is +** was) in exclusive-locking mode, a user-level read transaction is ** open. The database size is known in this state. ** ** A connection running with locking_mode=normal enters this state when @@ -51002,28 +51002,28 @@ int sqlite3PagerTrace=1; /* True to enable tracing */ ** this state even after the read-transaction is closed. The only way ** a locking_mode=exclusive connection can transition from READER to OPEN ** is via the ERROR state (see below). -** +** ** * A read transaction may be active (but a write-transaction cannot). ** * A SHARED or greater lock is held on the database file. -** * The dbSize variable may be trusted (even if a user-level read +** * The dbSize variable may be trusted (even if a user-level read ** transaction is not active). The dbOrigSize and dbFileSize variables ** may not be trusted at this point. ** * If the database is a WAL database, then the WAL connection is open. -** * Even if a read-transaction is not open, it is guaranteed that +** * Even if a read-transaction is not open, it is guaranteed that ** there is no hot-journal in the file-system. ** ** WRITER_LOCKED: ** ** The pager moves to this state from READER when a write-transaction -** is first opened on the database. In WRITER_LOCKED state, all locks -** required to start a write-transaction are held, but no actual +** is first opened on the database. In WRITER_LOCKED state, all locks +** required to start a write-transaction are held, but no actual ** modifications to the cache or database have taken place. ** -** In rollback mode, a RESERVED or (if the transaction was opened with +** In rollback mode, a RESERVED or (if the transaction was opened with ** BEGIN EXCLUSIVE) EXCLUSIVE lock is obtained on the database file when -** moving to this state, but the journal file is not written to or opened -** to in this state. If the transaction is committed or rolled back while -** in WRITER_LOCKED state, all that is required is to unlock the database +** moving to this state, but the journal file is not written to or opened +** to in this state. If the transaction is committed or rolled back while +** in WRITER_LOCKED state, all that is required is to unlock the database ** file. ** ** IN WAL mode, WalBeginWriteTransaction() is called to lock the log file. @@ -51031,7 +51031,7 @@ int sqlite3PagerTrace=1; /* True to enable tracing */ ** is made to obtain an EXCLUSIVE lock on the database file. ** ** * A write transaction is active. -** * If the connection is open in rollback-mode, a RESERVED or greater +** * If the connection is open in rollback-mode, a RESERVED or greater ** lock is held on the database file. ** * If the connection is open in WAL-mode, a WAL write transaction ** is open (i.e. sqlite3WalBeginWriteTransaction() has been successfully @@ -51050,7 +51050,7 @@ int sqlite3PagerTrace=1; /* True to enable tracing */ ** ** * A write transaction is active. ** * A RESERVED or greater lock is held on the database file. -** * The journal file is open and the first header has been written +** * The journal file is open and the first header has been written ** to it, but the header has not been synced to disk. ** * The contents of the page cache have been modified. ** @@ -51063,7 +51063,7 @@ int sqlite3PagerTrace=1; /* True to enable tracing */ ** ** * A write transaction is active. ** * An EXCLUSIVE or greater lock is held on the database file. -** * The journal file is open and the first header has been written +** * The journal file is open and the first header has been written ** and synced to disk. ** * The contents of the page cache have been modified (and possibly ** written to disk). @@ -51075,8 +51075,8 @@ int sqlite3PagerTrace=1; /* True to enable tracing */ ** A rollback-mode pager changes to WRITER_FINISHED state from WRITER_DBMOD ** state after the entire transaction has been successfully written into the ** database file. In this state the transaction may be committed simply -** by finalizing the journal file. Once in WRITER_FINISHED state, it is -** not possible to modify the database further. At this point, the upper +** by finalizing the journal file. Once in WRITER_FINISHED state, it is +** not possible to modify the database further. At this point, the upper ** layer must either commit or rollback the transaction. ** ** * A write transaction is active. @@ -51084,19 +51084,19 @@ int sqlite3PagerTrace=1; /* True to enable tracing */ ** * All writing and syncing of journal and database data has finished. ** If no error occurred, all that remains is to finalize the journal to ** commit the transaction. If an error did occur, the caller will need -** to rollback the transaction. +** to rollback the transaction. ** ** ERROR: ** ** The ERROR state is entered when an IO or disk-full error (including -** SQLITE_IOERR_NOMEM) occurs at a point in the code that makes it -** difficult to be sure that the in-memory pager state (cache contents, +** SQLITE_IOERR_NOMEM) occurs at a point in the code that makes it +** difficult to be sure that the in-memory pager state (cache contents, ** db size etc.) are consistent with the contents of the file-system. ** ** Temporary pager files may enter the ERROR state, but in-memory pagers ** cannot. ** -** For example, if an IO error occurs while performing a rollback, +** For example, if an IO error occurs while performing a rollback, ** the contents of the page-cache may be left in an inconsistent state. ** At this point it would be dangerous to change back to READER state ** (as usually happens after a rollback). Any subsequent readers might @@ -51106,13 +51106,13 @@ int sqlite3PagerTrace=1; /* True to enable tracing */ ** instead of READER following such an error. ** ** Once it has entered the ERROR state, any attempt to use the pager -** to read or write data returns an error. Eventually, once all +** to read or write data returns an error. Eventually, once all ** outstanding transactions have been abandoned, the pager is able to -** transition back to OPEN state, discarding the contents of the +** transition back to OPEN state, discarding the contents of the ** page-cache and any other in-memory state at the same time. Everything ** is reloaded from disk (and, if necessary, hot-journal rollback peformed) ** when a read-transaction is next opened on the pager (transitioning -** the pager into READER state). At that point the system has recovered +** the pager into READER state). At that point the system has recovered ** from the error. ** ** Specifically, the pager jumps into the ERROR state if: @@ -51128,21 +51128,21 @@ int sqlite3PagerTrace=1; /* True to enable tracing */ ** memory. ** ** In other cases, the error is returned to the b-tree layer. The b-tree -** layer then attempts a rollback operation. If the error condition +** layer then attempts a rollback operation. If the error condition ** persists, the pager enters the ERROR state via condition (1) above. ** ** Condition (3) is necessary because it can be triggered by a read-only ** statement executed within a transaction. In this case, if the error ** code were simply returned to the user, the b-tree layer would not ** automatically attempt a rollback, as it assumes that an error in a -** read-only statement cannot leave the pager in an internally inconsistent +** read-only statement cannot leave the pager in an internally inconsistent ** state. ** ** * The Pager.errCode variable is set to something other than SQLITE_OK. ** * There are one or more outstanding references to pages (after the ** last reference is dropped the pager should move back to OPEN state). ** * The pager is not an in-memory pager. -** +** ** ** Notes: ** @@ -51152,7 +51152,7 @@ int sqlite3PagerTrace=1; /* True to enable tracing */ ** ** * Normally, a connection open in exclusive mode is never in PAGER_OPEN ** state. There are two exceptions: immediately after exclusive-mode has -** been turned on (and before any read or write transactions are +** been turned on (and before any read or write transactions are ** executed), and when the pager is leaving the "error state". ** ** * See also: assert_pager_state(). @@ -51166,7 +51166,7 @@ int sqlite3PagerTrace=1; /* True to enable tracing */ #define PAGER_ERROR 6 /* -** The Pager.eLock variable is almost always set to one of the +** The Pager.eLock variable is almost always set to one of the ** following locking-states, according to the lock currently held on ** the database file: NO_LOCK, SHARED_LOCK, RESERVED_LOCK or EXCLUSIVE_LOCK. ** This variable is kept up to date as locks are taken and released by @@ -51181,20 +51181,20 @@ int sqlite3PagerTrace=1; /* True to enable tracing */ ** to a less exclusive (lower) value than the lock that is actually held ** at the system level, but it is never set to a more exclusive value. ** -** This is usually safe. If an xUnlock fails or appears to fail, there may +** This is usually safe. If an xUnlock fails or appears to fail, there may ** be a few redundant xLock() calls or a lock may be held for longer than ** required, but nothing really goes wrong. ** ** The exception is when the database file is unlocked as the pager moves -** from ERROR to OPEN state. At this point there may be a hot-journal file +** from ERROR to OPEN state. At this point there may be a hot-journal file ** in the file-system that needs to be rolled back (as part of an OPEN->SHARED ** transition, by the same pager or any other). If the call to xUnlock() ** fails at this point and the pager is left holding an EXCLUSIVE lock, this ** can confuse the call to xCheckReservedLock() call made later as part ** of hot-journal detection. ** -** xCheckReservedLock() is defined as returning true "if there is a RESERVED -** lock held by this process or any others". So xCheckReservedLock may +** xCheckReservedLock() is defined as returning true "if there is a RESERVED +** lock held by this process or any others". So xCheckReservedLock may ** return true because the caller itself is holding an EXCLUSIVE lock (but ** doesn't know it because of a previous error in xUnlock). If this happens ** a hot-journal may be mistaken for a journal being created by an active @@ -51205,12 +51205,12 @@ int sqlite3PagerTrace=1; /* True to enable tracing */ ** database in the ERROR state, Pager.eLock is set to UNKNOWN_LOCK. It ** is only changed back to a real locking state after a successful call ** to xLock(EXCLUSIVE). Also, the code to do the OPEN->SHARED state transition -** omits the check for a hot-journal if Pager.eLock is set to UNKNOWN_LOCK +** omits the check for a hot-journal if Pager.eLock is set to UNKNOWN_LOCK ** lock. Instead, it assumes a hot-journal exists and obtains an EXCLUSIVE ** lock on the database file before attempting to roll it back. See function ** PagerSharedLock() for more detail. ** -** Pager.eLock may only be set to UNKNOWN_LOCK when the pager is in +** Pager.eLock may only be set to UNKNOWN_LOCK when the pager is in ** PAGER_OPEN state. */ #define UNKNOWN_LOCK (EXCLUSIVE_LOCK+1) @@ -51230,7 +51230,7 @@ int sqlite3PagerTrace=1; /* True to enable tracing */ #endif /* -** The maximum allowed sector size. 64KiB. If the xSectorsize() method +** The maximum allowed sector size. 64KiB. If the xSectorsize() method ** returns a value larger than this, then MAX_SECTOR_SIZE is used instead. ** This could conceivably cause corruption following a power failure on ** such a system. This is currently an undocumented limit. @@ -51246,7 +51246,7 @@ int sqlite3PagerTrace=1; /* True to enable tracing */ ** ** When a savepoint is created, the PagerSavepoint.iHdrOffset field is ** set to 0. If a journal-header is written into the main journal while -** the savepoint is active, then iHdrOffset is set to the byte offset +** the savepoint is active, then iHdrOffset is set to the byte offset ** immediately following the last journal record written into the main ** journal before the journal-header. This is required during savepoint ** rollback (see pagerPlaybackSavepoint()). @@ -51296,34 +51296,34 @@ struct PagerSavepoint { ** ** changeCountDone ** -** This boolean variable is used to make sure that the change-counter -** (the 4-byte header field at byte offset 24 of the database file) is -** not updated more often than necessary. +** This boolean variable is used to make sure that the change-counter +** (the 4-byte header field at byte offset 24 of the database file) is +** not updated more often than necessary. ** -** It is set to true when the change-counter field is updated, which +** It is set to true when the change-counter field is updated, which ** can only happen if an exclusive lock is held on the database file. -** It is cleared (set to false) whenever an exclusive lock is +** It is cleared (set to false) whenever an exclusive lock is ** relinquished on the database file. Each time a transaction is committed, ** The changeCountDone flag is inspected. If it is true, the work of ** updating the change-counter is omitted for the current transaction. ** -** This mechanism means that when running in exclusive mode, a connection +** This mechanism means that when running in exclusive mode, a connection ** need only update the change-counter once, for the first transaction ** committed. ** ** setMaster ** ** When PagerCommitPhaseOne() is called to commit a transaction, it may -** (or may not) specify a master-journal name to be written into the +** (or may not) specify a master-journal name to be written into the ** journal file before it is synced to disk. ** -** Whether or not a journal file contains a master-journal pointer affects -** the way in which the journal file is finalized after the transaction is +** Whether or not a journal file contains a master-journal pointer affects +** the way in which the journal file is finalized after the transaction is ** committed or rolled back when running in "journal_mode=PERSIST" mode. ** If a journal file does not contain a master-journal pointer, it is ** finalized by overwriting the first journal header with zeroes. If -** it does contain a master-journal pointer the journal file is finalized -** by truncating it to zero bytes, just as if the connection were +** it does contain a master-journal pointer the journal file is finalized +** by truncating it to zero bytes, just as if the connection were ** running in "journal_mode=truncate" mode. ** ** Journal files that contain master journal pointers cannot be finalized @@ -51349,12 +51349,12 @@ struct PagerSavepoint { ** to allocate a new page to prevent the journal file from being written ** while it is being traversed by code in pager_playback(). The SPILLFLAG_OFF ** case is a user preference. -** +** ** If the SPILLFLAG_NOSYNC bit is set, writing to the database from ** pagerStress() is permitted, but syncing the journal file is not. ** This flag is set by sqlite3PagerWrite() when the file-system sector-size ** is larger than the database page-size in order to prevent a journal sync -** from happening in between the journalling of two pages on the same sector. +** from happening in between the journalling of two pages on the same sector. ** ** subjInMemory ** @@ -51362,16 +51362,16 @@ struct PagerSavepoint { ** is opened as an in-memory journal file. If false, then in-memory ** sub-journals are only used for in-memory pager files. ** -** This variable is updated by the upper layer each time a new +** This variable is updated by the upper layer each time a new ** write-transaction is opened. ** ** dbSize, dbOrigSize, dbFileSize ** ** Variable dbSize is set to the number of pages in the database file. ** It is valid in PAGER_READER and higher states (all states except for -** OPEN and ERROR). +** OPEN and ERROR). ** -** dbSize is set based on the size of the database file, which may be +** dbSize is set based on the size of the database file, which may be ** larger than the size of the database (the value stored at offset ** 28 of the database header by the btree). If the size of the file ** is not an integer multiple of the page-size, the value stored in @@ -51382,10 +51382,10 @@ struct PagerSavepoint { ** ** During a write-transaction, if pages with page-numbers greater than ** dbSize are modified in the cache, dbSize is updated accordingly. -** Similarly, if the database is truncated using PagerTruncateImage(), +** Similarly, if the database is truncated using PagerTruncateImage(), ** dbSize is updated. ** -** Variables dbOrigSize and dbFileSize are valid in states +** Variables dbOrigSize and dbFileSize are valid in states ** PAGER_WRITER_LOCKED and higher. dbOrigSize is a copy of the dbSize ** variable at the start of the transaction. It is used during rollback, ** and to determine whether or not pages need to be journalled before @@ -51394,12 +51394,12 @@ struct PagerSavepoint { ** Throughout a write-transaction, dbFileSize contains the size of ** the file on disk in pages. It is set to a copy of dbSize when the ** write-transaction is first opened, and updated when VFS calls are made -** to write or truncate the database file on disk. +** to write or truncate the database file on disk. ** -** The only reason the dbFileSize variable is required is to suppress -** unnecessary calls to xTruncate() after committing a transaction. If, -** when a transaction is committed, the dbFileSize variable indicates -** that the database file is larger than the database image (Pager.dbSize), +** The only reason the dbFileSize variable is required is to suppress +** unnecessary calls to xTruncate() after committing a transaction. If, +** when a transaction is committed, the dbFileSize variable indicates +** that the database file is larger than the database image (Pager.dbSize), ** pager_truncate() is called. The pager_truncate() call uses xFilesize() ** to measure the database file on disk, and then truncates it if required. ** dbFileSize is not used when rolling back a transaction. In this case @@ -51410,20 +51410,20 @@ struct PagerSavepoint { ** dbHintSize ** ** The dbHintSize variable is used to limit the number of calls made to -** the VFS xFileControl(FCNTL_SIZE_HINT) method. +** the VFS xFileControl(FCNTL_SIZE_HINT) method. ** ** dbHintSize is set to a copy of the dbSize variable when a ** write-transaction is opened (at the same time as dbFileSize and ** dbOrigSize). If the xFileControl(FCNTL_SIZE_HINT) method is called, ** dbHintSize is increased to the number of pages that correspond to the -** size-hint passed to the method call. See pager_write_pagelist() for +** size-hint passed to the method call. See pager_write_pagelist() for ** details. ** ** errCode ** ** The Pager.errCode variable is only ever used in PAGER_ERROR state. It -** is set to zero in all other states. In PAGER_ERROR state, Pager.errCode -** is always set to SQLITE_FULL, SQLITE_IOERR or one of the SQLITE_IOERR_XXX +** is set to zero in all other states. In PAGER_ERROR state, Pager.errCode +** is always set to SQLITE_FULL, SQLITE_IOERR or one of the SQLITE_IOERR_XXX ** sub-codes. ** ** syncFlags, walSyncFlags @@ -51530,7 +51530,7 @@ struct Pager { /* ** Indexes for use with Pager.aStat[]. The Pager.aStat[] array contains -** the values accessed by passing SQLITE_DBSTATUS_CACHE_HIT, CACHE_MISS +** the values accessed by passing SQLITE_DBSTATUS_CACHE_HIT, CACHE_MISS ** or CACHE_WRITE to sqlite3_db_status(). */ #define PAGER_STAT_HIT 0 @@ -51588,7 +51588,7 @@ static const unsigned char aJournalMagic[] = { #define JOURNAL_PG_SZ(pPager) ((pPager->pageSize) + 8) /* -** The journal header size for this pager. This is usually the same +** The journal header size for this pager. This is usually the same ** size as a single disk sector. See also setSectorSize(). */ #define JOURNAL_HDR_SZ(pPager) (pPager->sectorSize) @@ -51671,7 +51671,7 @@ SQLITE_PRIVATE int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){ # define pagerBeginReadTransaction(z) SQLITE_OK #endif -#ifndef NDEBUG +#ifndef NDEBUG /* ** Usage: ** @@ -51700,25 +51700,25 @@ static int assert_pager_state(Pager *p){ assert( p->tempFile==0 || p->eLock==EXCLUSIVE_LOCK ); assert( p->tempFile==0 || pPager->changeCountDone ); - /* If the useJournal flag is clear, the journal-mode must be "OFF". + /* If the useJournal flag is clear, the journal-mode must be "OFF". ** And if the journal-mode is "OFF", the journal file must not be open. */ assert( p->journalMode==PAGER_JOURNALMODE_OFF || p->useJournal ); assert( p->journalMode!=PAGER_JOURNALMODE_OFF || !isOpen(p->jfd) ); - /* Check that MEMDB implies noSync. And an in-memory journal. Since - ** this means an in-memory pager performs no IO at all, it cannot encounter - ** either SQLITE_IOERR or SQLITE_FULL during rollback or while finalizing - ** a journal file. (although the in-memory journal implementation may - ** return SQLITE_IOERR_NOMEM while the journal file is being written). It - ** is therefore not possible for an in-memory pager to enter the ERROR + /* Check that MEMDB implies noSync. And an in-memory journal. Since + ** this means an in-memory pager performs no IO at all, it cannot encounter + ** either SQLITE_IOERR or SQLITE_FULL during rollback or while finalizing + ** a journal file. (although the in-memory journal implementation may + ** return SQLITE_IOERR_NOMEM while the journal file is being written). It + ** is therefore not possible for an in-memory pager to enter the ERROR ** state. */ if( MEMDB ){ assert( !isOpen(p->fd) ); assert( p->noSync ); - assert( p->journalMode==PAGER_JOURNALMODE_OFF - || p->journalMode==PAGER_JOURNALMODE_MEMORY + assert( p->journalMode==PAGER_JOURNALMODE_OFF + || p->journalMode==PAGER_JOURNALMODE_MEMORY ); assert( p->eState!=PAGER_ERROR && p->eState!=PAGER_OPEN ); assert( pagerUseWal(p)==0 ); @@ -51765,9 +51765,9 @@ static int assert_pager_state(Pager *p){ ** to journal_mode=wal. */ assert( p->eLock>=RESERVED_LOCK ); - assert( isOpen(p->jfd) - || p->journalMode==PAGER_JOURNALMODE_OFF - || p->journalMode==PAGER_JOURNALMODE_WAL + assert( isOpen(p->jfd) + || p->journalMode==PAGER_JOURNALMODE_OFF + || p->journalMode==PAGER_JOURNALMODE_WAL ); } assert( pPager->dbOrigSize==pPager->dbFileSize ); @@ -51779,9 +51779,9 @@ static int assert_pager_state(Pager *p){ assert( pPager->errCode==SQLITE_OK ); assert( !pagerUseWal(pPager) ); assert( p->eLock>=EXCLUSIVE_LOCK ); - assert( isOpen(p->jfd) - || p->journalMode==PAGER_JOURNALMODE_OFF - || p->journalMode==PAGER_JOURNALMODE_WAL + assert( isOpen(p->jfd) + || p->journalMode==PAGER_JOURNALMODE_OFF + || p->journalMode==PAGER_JOURNALMODE_WAL || (sqlite3OsDeviceCharacteristics(p->fd)&SQLITE_IOCAP_BATCH_ATOMIC) ); assert( pPager->dbOrigSize<=pPager->dbHintSize ); @@ -51791,9 +51791,9 @@ static int assert_pager_state(Pager *p){ assert( p->eLock==EXCLUSIVE_LOCK ); assert( pPager->errCode==SQLITE_OK ); assert( !pagerUseWal(pPager) ); - assert( isOpen(p->jfd) - || p->journalMode==PAGER_JOURNALMODE_OFF - || p->journalMode==PAGER_JOURNALMODE_WAL + assert( isOpen(p->jfd) + || p->journalMode==PAGER_JOURNALMODE_OFF + || p->journalMode==PAGER_JOURNALMODE_WAL || (sqlite3OsDeviceCharacteristics(p->fd)&SQLITE_IOCAP_BATCH_ATOMIC) ); break; @@ -51812,7 +51812,7 @@ static int assert_pager_state(Pager *p){ } #endif /* ifndef NDEBUG */ -#ifdef SQLITE_DEBUG +#ifdef SQLITE_DEBUG /* ** Return a pointer to a human readable string in a static buffer ** containing the state of the Pager object passed as an argument. This @@ -51964,7 +51964,7 @@ static int write32bits(sqlite3_file *fd, i64 offset, u32 val){ ** succeeds, set the Pager.eLock variable to match the (attempted) new lock. ** ** Except, if Pager.eLock is set to UNKNOWN_LOCK when this function is -** called, do not modify it. See the comment above the #define of +** called, do not modify it. See the comment above the #define of ** UNKNOWN_LOCK for an explanation of this. */ static int pagerUnlockDb(Pager *pPager, int eLock){ @@ -51987,11 +51987,11 @@ static int pagerUnlockDb(Pager *pPager, int eLock){ /* ** Lock the database file to level eLock, which must be either SHARED_LOCK, ** RESERVED_LOCK or EXCLUSIVE_LOCK. If the caller is successful, set the -** Pager.eLock variable to the new locking state. +** Pager.eLock variable to the new locking state. ** -** Except, if Pager.eLock is set to UNKNOWN_LOCK when this function is -** called, do not modify it unless the new locking state is EXCLUSIVE_LOCK. -** See the comment above the #define of UNKNOWN_LOCK for an explanation +** Except, if Pager.eLock is set to UNKNOWN_LOCK when this function is +** called, do not modify it unless the new locking state is EXCLUSIVE_LOCK. +** See the comment above the #define of UNKNOWN_LOCK for an explanation ** of this. */ static int pagerLockDb(Pager *pPager, int eLock){ @@ -52018,7 +52018,7 @@ static int pagerLockDb(Pager *pPager, int eLock){ ** (b) the value returned by OsSectorSize() is less than or equal ** to the page size. ** -** If it can be used, then the value returned is the size of the journal +** If it can be used, then the value returned is the size of the journal ** file when it contains rollback data for exactly one page. ** ** The atomic-batch-write optimization can be used if OsDeviceCharacteristics() @@ -52109,8 +52109,8 @@ static void checkPage(PgHdr *pPg){ /* ** When this is called the journal file for pager pPager must be open. -** This function attempts to read a master journal file name from the -** end of the file and, if successful, copies it into memory supplied +** This function attempts to read a master journal file name from the +** end of the file and, if successful, copies it into memory supplied ** by the caller. See comments above writeMasterJournal() for the format ** used to store a master journal file name at the end of a journal file. ** @@ -52126,7 +52126,7 @@ static void checkPage(PgHdr *pPg){ ** nul-terminator byte is appended to the buffer following the master ** journal file name. ** -** If it is determined that no master journal file name is present +** If it is determined that no master journal file name is present ** zMaster[0] is set to 0 and SQLITE_OK returned. ** ** If an error occurs while reading from the journal file, an SQLite @@ -52144,9 +52144,9 @@ static int readMasterJournal(sqlite3_file *pJrnl, char *zMaster, u32 nMaster){ if( SQLITE_OK!=(rc = sqlite3OsFileSize(pJrnl, &szJ)) || szJ<16 || SQLITE_OK!=(rc = read32bits(pJrnl, szJ-16, &len)) - || len>=nMaster + || len>=nMaster || len>szJ-16 - || len==0 + || len==0 || SQLITE_OK!=(rc = read32bits(pJrnl, szJ-12, &cksum)) || SQLITE_OK!=(rc = sqlite3OsRead(pJrnl, aMagic, 8, szJ-8)) || memcmp(aMagic, aJournalMagic, 8) @@ -52168,13 +52168,13 @@ static int readMasterJournal(sqlite3_file *pJrnl, char *zMaster, u32 nMaster){ len = 0; } zMaster[len] = '\0'; - + return SQLITE_OK; } /* -** Return the offset of the sector boundary at or immediately -** following the value in pPager->journalOff, assuming a sector +** Return the offset of the sector boundary at or immediately +** following the value in pPager->journalOff, assuming a sector ** size of pPager->sectorSize bytes. ** ** i.e for a sector size of 512: @@ -52185,7 +52185,7 @@ static int readMasterJournal(sqlite3_file *pJrnl, char *zMaster, u32 nMaster){ ** 512 512 ** 100 512 ** 2000 2048 -** +** */ static i64 journalHdrOffset(Pager *pPager){ i64 offset = 0; @@ -52207,12 +52207,12 @@ static i64 journalHdrOffset(Pager *pPager){ ** ** If doTruncate is non-zero or the Pager.journalSizeLimit variable is ** set to 0, then truncate the journal file to zero bytes in size. Otherwise, -** zero the 28-byte header at the start of the journal file. In either case, -** if the pager is not in no-sync mode, sync the journal file immediately +** zero the 28-byte header at the start of the journal file. In either case, +** if the pager is not in no-sync mode, sync the journal file immediately ** after writing or truncating it. ** ** If Pager.journalSizeLimit is set to a positive, non-zero value, and -** following the truncation or zeroing described above the size of the +** following the truncation or zeroing described above the size of the ** journal file in bytes is larger than this value, then truncate the ** journal file to Pager.journalSizeLimit bytes. The journal file does ** not need to be synced following this operation. @@ -52238,8 +52238,8 @@ static int zeroJournalHdr(Pager *pPager, int doTruncate){ rc = sqlite3OsSync(pPager->jfd, SQLITE_SYNC_DATAONLY|pPager->syncFlags); } - /* At this point the transaction is committed but the write lock - ** is still held on the file. If there is a size limit configured for + /* At this point the transaction is committed but the write lock + ** is still held on the file. If there is a size limit configured for ** the persistent journal and the journal file currently consumes more ** space than that limit allows for, truncate it now. There is no need ** to sync the file following this operation. @@ -52267,7 +52267,7 @@ static int zeroJournalHdr(Pager *pPager, int doTruncate){ ** - 4 bytes: Initial database page count. ** - 4 bytes: Sector size used by the process that wrote this journal. ** - 4 bytes: Database page size. -** +** ** Followed by (JOURNAL_HDR_SZ - 28) bytes of unused space. */ static int writeJournalHdr(Pager *pPager){ @@ -52283,8 +52283,8 @@ static int writeJournalHdr(Pager *pPager){ nHeader = JOURNAL_HDR_SZ(pPager); } - /* If there are active savepoints and any of them were created - ** since the most recent journal header was written, update the + /* If there are active savepoints and any of them were created + ** since the most recent journal header was written, update the ** PagerSavepoint.iHdrOffset fields now. */ for(ii=0; iinSavepoint; ii++){ @@ -52295,10 +52295,10 @@ static int writeJournalHdr(Pager *pPager){ pPager->journalHdr = pPager->journalOff = journalHdrOffset(pPager); - /* + /* ** Write the nRec Field - the number of page records that follow this ** journal header. Normally, zero is written to this value at this time. - ** After the records are added to the journal (and the journal synced, + ** After the records are added to the journal (and the journal synced, ** if in full-sync mode), the zero is overwritten with the true number ** of records (see syncJournal()). ** @@ -52317,7 +52317,7 @@ static int writeJournalHdr(Pager *pPager){ */ assert( isOpen(pPager->fd) || pPager->noSync ); if( pPager->noSync || (pPager->journalMode==PAGER_JOURNALMODE_MEMORY) - || (sqlite3OsDeviceCharacteristics(pPager->fd)&SQLITE_IOCAP_SAFE_APPEND) + || (sqlite3OsDeviceCharacteristics(pPager->fd)&SQLITE_IOCAP_SAFE_APPEND) ){ memcpy(zHeader, aJournalMagic, sizeof(aJournalMagic)); put32bits(&zHeader[sizeof(aJournalMagic)], 0xffffffff); @@ -52325,7 +52325,7 @@ static int writeJournalHdr(Pager *pPager){ memset(zHeader, 0, sizeof(aJournalMagic)+4); } - /* The random check-hash initializer */ + /* The random check-hash initializer */ sqlite3_randomness(sizeof(pPager->cksumInit), &pPager->cksumInit); put32bits(&zHeader[sizeof(aJournalMagic)+4], pPager->cksumInit); /* The initial database size */ @@ -52344,23 +52344,23 @@ static int writeJournalHdr(Pager *pPager){ memset(&zHeader[sizeof(aJournalMagic)+20], 0, nHeader-(sizeof(aJournalMagic)+20)); - /* In theory, it is only necessary to write the 28 bytes that the - ** journal header consumes to the journal file here. Then increment the - ** Pager.journalOff variable by JOURNAL_HDR_SZ so that the next + /* In theory, it is only necessary to write the 28 bytes that the + ** journal header consumes to the journal file here. Then increment the + ** Pager.journalOff variable by JOURNAL_HDR_SZ so that the next ** record is written to the following sector (leaving a gap in the file ** that will be implicitly filled in by the OS). ** - ** However it has been discovered that on some systems this pattern can + ** However it has been discovered that on some systems this pattern can ** be significantly slower than contiguously writing data to the file, - ** even if that means explicitly writing data to the block of + ** even if that means explicitly writing data to the block of ** (JOURNAL_HDR_SZ - 28) bytes that will not be used. So that is what - ** is done. + ** is done. ** - ** The loop is required here in case the sector-size is larger than the + ** The loop is required here in case the sector-size is larger than the ** database page size. Since the zHeader buffer is only Pager.pageSize ** bytes in size, more than one call to sqlite3OsWrite() may be required ** to populate the entire journal header sector. - */ + */ for(nWrite=0; rc==SQLITE_OK&&nWritejournalHdr, nHeader)) rc = sqlite3OsWrite(pPager->jfd, zHeader, nHeader, pPager->journalOff); @@ -52458,29 +52458,29 @@ static int readJournalHdr( /* Check that the values read from the page-size and sector-size fields ** are within range. To be 'in range', both values need to be a power - ** of two greater than or equal to 512 or 32, and not greater than their + ** of two greater than or equal to 512 or 32, and not greater than their ** respective compile time maximum limits. */ if( iPageSize<512 || iSectorSize<32 || iPageSize>SQLITE_MAX_PAGE_SIZE || iSectorSize>MAX_SECTOR_SIZE - || ((iPageSize-1)&iPageSize)!=0 || ((iSectorSize-1)&iSectorSize)!=0 + || ((iPageSize-1)&iPageSize)!=0 || ((iSectorSize-1)&iSectorSize)!=0 ){ - /* If the either the page-size or sector-size in the journal-header is - ** invalid, then the process that wrote the journal-header must have - ** crashed before the header was synced. In this case stop reading + /* If the either the page-size or sector-size in the journal-header is + ** invalid, then the process that wrote the journal-header must have + ** crashed before the header was synced. In this case stop reading ** the journal file here. */ return SQLITE_DONE; } - /* Update the page-size to match the value read from the journal. - ** Use a testcase() macro to make sure that malloc failure within + /* Update the page-size to match the value read from the journal. + ** Use a testcase() macro to make sure that malloc failure within ** PagerSetPagesize() is tested. */ rc = sqlite3PagerSetPagesize(pPager, &iPageSize, -1); testcase( rc!=SQLITE_OK ); - /* Update the assumed sector-size to match the value used by + /* Update the assumed sector-size to match the value used by ** the process that created this journal. If this journal was ** created by a process other than this one, then this routine ** is being called from within pager_playback(). The local value @@ -52510,7 +52510,7 @@ static int readJournalHdr( ** The master journal page checksum is the sum of the bytes in the master ** journal name, where each byte is interpreted as a signed 8-bit integer. ** -** If zMaster is a NULL pointer (occurs for a single database transaction), +** If zMaster is a NULL pointer (occurs for a single database transaction), ** this call is a no-op. */ static int writeMasterJournal(Pager *pPager, const char *zMaster){ @@ -52523,8 +52523,8 @@ static int writeMasterJournal(Pager *pPager, const char *zMaster){ assert( pPager->setMaster==0 ); assert( !pagerUseWal(pPager) ); - if( !zMaster - || pPager->journalMode==PAGER_JOURNALMODE_MEMORY + if( !zMaster + || pPager->journalMode==PAGER_JOURNALMODE_MEMORY || !isOpen(pPager->jfd) ){ return SQLITE_OK; @@ -52560,16 +52560,16 @@ static int writeMasterJournal(Pager *pPager, const char *zMaster){ } pPager->journalOff += (nMaster+20); - /* If the pager is in peristent-journal mode, then the physical + /* If the pager is in peristent-journal mode, then the physical ** journal-file may extend past the end of the master-journal name - ** and 8 bytes of magic data just written to the file. This is + ** and 8 bytes of magic data just written to the file. This is ** dangerous because the code to rollback a hot-journal file - ** will not be able to find the master-journal name to determine - ** whether or not the journal is hot. + ** will not be able to find the master-journal name to determine + ** whether or not the journal is hot. ** - ** Easiest thing to do in this scenario is to truncate the journal + ** Easiest thing to do in this scenario is to truncate the journal ** file to the required size. - */ + */ if( SQLITE_OK==(rc = sqlite3OsFileSize(pPager->jfd, &jrnlSize)) && jrnlSize>pPager->journalOff ){ @@ -52614,7 +52614,7 @@ static void releaseAllSavepoints(Pager *pPager){ } /* -** Set the bit number pgno in the PagerSavepoint.pInSavepoint +** Set the bit number pgno in the PagerSavepoint.pInSavepoint ** bitvecs of all open savepoints. Return SQLITE_OK if successful ** or SQLITE_NOMEM if a malloc failure occurs. */ @@ -52643,8 +52643,8 @@ static int addToSavepointBitvecs(Pager *pPager, Pgno pgno){ ** not exhibit the UNDELETABLE_WHEN_OPEN property, the journal file is ** closed (if it is open). ** -** If the pager is in ERROR state when this function is called, the -** contents of the pager cache are discarded before switching back to +** If the pager is in ERROR state when this function is called, the +** contents of the pager cache are discarded before switching back to ** the OPEN state. Regardless of whether the pager is in exclusive-mode ** or not, any journal file left in the file-system will be treated ** as a hot-journal and rolled back the next time a read-transaction @@ -52652,9 +52652,9 @@ static int addToSavepointBitvecs(Pager *pPager, Pgno pgno){ */ static void pager_unlock(Pager *pPager){ - assert( pPager->eState==PAGER_READER - || pPager->eState==PAGER_OPEN - || pPager->eState==PAGER_ERROR + assert( pPager->eState==PAGER_READER + || pPager->eState==PAGER_OPEN + || pPager->eState==PAGER_ERROR ); sqlite3BitvecDestroy(pPager->pInJournal); @@ -52732,17 +52732,17 @@ static void pager_unlock(Pager *pPager){ /* ** This function is called whenever an IOERR or FULL error that requires ** the pager to transition into the ERROR state may ahve occurred. -** The first argument is a pointer to the pager structure, the second -** the error-code about to be returned by a pager API function. The -** value returned is a copy of the second argument to this function. +** The first argument is a pointer to the pager structure, the second +** the error-code about to be returned by a pager API function. The +** value returned is a copy of the second argument to this function. ** ** If the second argument is SQLITE_FULL, SQLITE_IOERR or one of the ** IOERR sub-codes, the pager enters the ERROR state and the error code ** is stored in Pager.errCode. While the pager remains in the ERROR state, ** all major API calls on the Pager will immediately return Pager.errCode. ** -** The ERROR state indicates that the contents of the pager-cache -** cannot be trusted. This state can be cleared by completely discarding +** The ERROR state indicates that the contents of the pager-cache +** cannot be trusted. This state can be cleared by completely discarding ** the contents of the pager-cache. If a transaction was active when ** the persistent error occurred, then the rollback journal may need ** to be replayed to restore the contents of the database file (as if @@ -52790,27 +52790,27 @@ static int pagerFlushOnCommit(Pager *pPager, int bCommit){ } /* -** This routine ends a transaction. A transaction is usually ended by -** either a COMMIT or a ROLLBACK operation. This routine may be called +** This routine ends a transaction. A transaction is usually ended by +** either a COMMIT or a ROLLBACK operation. This routine may be called ** after rollback of a hot-journal, or if an error occurs while opening ** the journal file or writing the very first journal-header of a ** database transaction. -** +** ** This routine is never called in PAGER_ERROR state. If it is called ** in PAGER_NONE or PAGER_SHARED state and the lock held is less ** exclusive than a RESERVED lock, it is a no-op. ** ** Otherwise, any active savepoints are released. ** -** If the journal file is open, then it is "finalized". Once a journal -** file has been finalized it is not possible to use it to roll back a +** If the journal file is open, then it is "finalized". Once a journal +** file has been finalized it is not possible to use it to roll back a ** transaction. Nor will it be considered to be a hot-journal by this ** or any other database connection. Exactly how a journal is finalized ** depends on whether or not the pager is running in exclusive mode and ** the current journal-mode (Pager.journalMode value), as follows: ** ** journalMode==MEMORY -** Journal file descriptor is simply closed. This destroys an +** Journal file descriptor is simply closed. This destroys an ** in-memory journal. ** ** journalMode==TRUNCATE @@ -52830,12 +52830,12 @@ static int pagerFlushOnCommit(Pager *pPager, int bCommit){ ** journalMode==PERSIST is used instead. ** ** After the journal is finalized, the pager moves to PAGER_READER state. -** If running in non-exclusive rollback mode, the lock on the file is +** If running in non-exclusive rollback mode, the lock on the file is ** downgraded to a SHARED_LOCK. ** ** SQLITE_OK is returned if no error occurs. If an error occurs during ** any of the IO operations to finalize the journal file or unlock the -** database then the IO error code is returned to the user. If the +** database then the IO error code is returned to the user. If the ** operation to finalize the journal file fails, then the code still ** tries to unlock the database file if not in exclusive mode. If the ** unlock operation fails as well, then the first error code related @@ -52854,9 +52854,9 @@ static int pager_end_transaction(Pager *pPager, int hasMaster, int bCommit){ ** 1. After a successful hot-journal rollback, it is called with ** eState==PAGER_NONE and eLock==EXCLUSIVE_LOCK. ** - ** 2. If a connection with locking_mode=exclusive holding an EXCLUSIVE + ** 2. If a connection with locking_mode=exclusive holding an EXCLUSIVE ** lock switches back to locking_mode=normal and then executes a - ** read-transaction, this function is called with eState==PAGER_READER + ** read-transaction, this function is called with eState==PAGER_READER ** and eLock==EXCLUSIVE_LOCK when the read-transaction is closed. */ assert( assert_pager_state(pPager) ); @@ -52866,7 +52866,7 @@ static int pager_end_transaction(Pager *pPager, int hasMaster, int bCommit){ } releaseAllSavepoints(pPager); - assert( isOpen(pPager->jfd) || pPager->pInJournal==0 + assert( isOpen(pPager->jfd) || pPager->pInJournal==0 || (sqlite3OsDeviceCharacteristics(pPager->fd)&SQLITE_IOCAP_BATCH_ATOMIC) ); if( isOpen(pPager->jfd) ){ @@ -52904,9 +52904,9 @@ static int pager_end_transaction(Pager *pPager, int hasMaster, int bCommit){ */ int bDelete = !pPager->tempFile; assert( sqlite3JournalIsInMemory(pPager->jfd)==0 ); - assert( pPager->journalMode==PAGER_JOURNALMODE_DELETE - || pPager->journalMode==PAGER_JOURNALMODE_MEMORY - || pPager->journalMode==PAGER_JOURNALMODE_WAL + assert( pPager->journalMode==PAGER_JOURNALMODE_DELETE + || pPager->journalMode==PAGER_JOURNALMODE_MEMORY + || pPager->journalMode==PAGER_JOURNALMODE_WAL ); sqlite3OsClose(pPager->jfd); if( bDelete ){ @@ -52939,8 +52939,8 @@ static int pager_end_transaction(Pager *pPager, int hasMaster, int bCommit){ } if( pagerUseWal(pPager) ){ - /* Drop the WAL write-lock, if any. Also, if the connection was in - ** locking_mode=exclusive mode but is no longer, drop the EXCLUSIVE + /* Drop the WAL write-lock, if any. Also, if the connection was in + ** locking_mode=exclusive mode but is no longer, drop the EXCLUSIVE ** lock held on the database file. */ rc2 = sqlite3WalEndWriteTransaction(pPager->pWal); @@ -52948,7 +52948,7 @@ static int pager_end_transaction(Pager *pPager, int hasMaster, int bCommit){ }else if( rc==SQLITE_OK && bCommit && pPager->dbFileSize>pPager->dbSize ){ /* This branch is taken when committing a transaction in rollback-journal ** mode if the database file on disk is larger than the database image. - ** At this point the journal has been finalized and the transaction + ** At this point the journal has been finalized and the transaction ** successfully committed, but the EXCLUSIVE lock is still held on the ** file. So it is safe to truncate the database file to its minimum ** required size. */ @@ -52961,7 +52961,7 @@ static int pager_end_transaction(Pager *pPager, int hasMaster, int bCommit){ if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; } - if( !pPager->exclusiveMode + if( !pPager->exclusiveMode && (!pagerUseWal(pPager) || sqlite3WalExclusiveMode(pPager->pWal, 0)) ){ rc2 = pagerUnlockDb(pPager, SHARED_LOCK); @@ -52974,19 +52974,19 @@ static int pager_end_transaction(Pager *pPager, int hasMaster, int bCommit){ } /* -** Execute a rollback if a transaction is active and unlock the -** database file. +** Execute a rollback if a transaction is active and unlock the +** database file. ** -** If the pager has already entered the ERROR state, do not attempt +** If the pager has already entered the ERROR state, do not attempt ** the rollback at this time. Instead, pager_unlock() is called. The ** call to pager_unlock() will discard all in-memory pages, unlock -** the database file and move the pager back to OPEN state. If this -** means that there is a hot-journal left in the file-system, the next -** connection to obtain a shared lock on the pager (which may be this one) +** the database file and move the pager back to OPEN state. If this +** means that there is a hot-journal left in the file-system, the next +** connection to obtain a shared lock on the pager (which may be this one) ** will roll it back. ** ** If the pager has not already entered the ERROR state, but an IO or -** malloc error occurs during a rollback, then this will itself cause +** malloc error occurs during a rollback, then this will itself cause ** the pager to enter the ERROR state. Which will be cleared by the ** call to pager_unlock(), as described above. */ @@ -53007,10 +53007,10 @@ static void pagerUnlockAndRollback(Pager *pPager){ /* ** Parameter aData must point to a buffer of pPager->pageSize bytes -** of data. Compute and return a checksum based ont the contents of the +** of data. Compute and return a checksum based ont the contents of the ** page of data and the current value of pPager->cksumInit. ** -** This is not a real checksum. It is really just the sum of the +** This is not a real checksum. It is really just the sum of the ** random initial value (pPager->cksumInit) and every 200th byte ** of the page data, starting with byte offset (pPager->pageSize%200). ** Each byte is interpreted as an 8-bit unsigned integer. @@ -53018,8 +53018,8 @@ static void pagerUnlockAndRollback(Pager *pPager){ ** Changing the formula used to compute this checksum results in an ** incompatible journal file format. ** -** If journal corruption occurs due to a power failure, the most likely -** scenario is that one end or the other of the record will be changed. +** If journal corruption occurs due to a power failure, the most likely +** scenario is that one end or the other of the record will be changed. ** It is much less likely that the two ends of the journal record will be ** correct and the middle be corrupt. Thus, this "checksum" scheme, ** though fast and simple, catches the mostly likely kind of corruption. @@ -53069,7 +53069,7 @@ SQLITE_PRIVATE void sqlite3PagerAlignReserve(Pager *pDest, Pager *pSrc){ ** The page begins at offset *pOffset into the file. The *pOffset ** value is increased to the start of the next page in the journal. ** -** The main rollback journal uses checksums - the statement journal does +** The main rollback journal uses checksums - the statement journal does ** not. ** ** If the page number of the page record read from the (sub-)journal file @@ -53089,7 +53089,7 @@ SQLITE_PRIVATE void sqlite3PagerAlignReserve(Pager *pDest, Pager *pSrc){ ** is successfully read from the (sub-)journal file but appears to be ** corrupted, SQLITE_DONE is returned. Data is considered corrupted in ** two circumstances: -** +** ** * If the record page-number is illegal (0 or PAGER_MJ_PGNO), or ** * If the record is being rolled back from the main journal file ** and the checksum field does not match the record content. @@ -53129,7 +53129,7 @@ static int pager_playback_one_page( assert( aData ); /* Temp storage must have already been allocated */ assert( pagerUseWal(pPager)==0 || (!isMainJrnl && isSavepnt) ); - /* Either the state is greater than PAGER_WRITER_CACHEMOD (a transaction + /* Either the state is greater than PAGER_WRITER_CACHEMOD (a transaction ** or savepoint rollback done at the request of the caller) or this is ** a hot-journal rollback. If it is a hot-journal rollback, the pager ** is in state OPEN and holds an EXCLUSIVE lock. Hot-journal rollback @@ -53196,7 +53196,7 @@ static int pager_playback_one_page( ** assert()able. ** ** If in WRITER_DBMOD, WRITER_FINISHED or OPEN state, then we update the - ** pager cache if it exists and the main file. The page is then marked + ** pager cache if it exists and the main file. The page is then marked ** not dirty. Since this code is only executed in PAGER_OPEN state for ** a hot-journal rollback, it is guaranteed that the page-cache is empty ** if the pager is in OPEN state. @@ -53274,18 +53274,18 @@ static int pager_playback_one_page( }else if( !isMainJrnl && pPg==0 ){ /* If this is a rollback of a savepoint and data was not written to ** the database and the page is not in-memory, there is a potential - ** problem. When the page is next fetched by the b-tree layer, it - ** will be read from the database file, which may or may not be - ** current. + ** problem. When the page is next fetched by the b-tree layer, it + ** will be read from the database file, which may or may not be + ** current. ** ** There are a couple of different ways this can happen. All are quite - ** obscure. When running in synchronous mode, this can only happen + ** obscure. When running in synchronous mode, this can only happen ** if the page is on the free-list at the start of the transaction, then ** populated, then moved using sqlite3PagerMovepage(). ** ** The solution is to add an in-memory page to the cache containing - ** the data just read from the sub-journal. Mark the page as dirty - ** and if the pager requires a journal-sync, then mark the page as + ** the data just read from the sub-journal. Mark the page as dirty + ** and if the pager requires a journal-sync, then mark the page as ** requiring a journal-sync before it is written. */ assert( isSavepnt ); @@ -53335,26 +53335,26 @@ static int pager_playback_one_page( ** This routine checks if it is possible to delete the master journal file, ** and does so if it is. ** -** Argument zMaster may point to Pager.pTmpSpace. So that buffer is not +** Argument zMaster may point to Pager.pTmpSpace. So that buffer is not ** available for use within this function. ** -** When a master journal file is created, it is populated with the names -** of all of its child journals, one after another, formatted as utf-8 -** encoded text. The end of each child journal file is marked with a +** When a master journal file is created, it is populated with the names +** of all of its child journals, one after another, formatted as utf-8 +** encoded text. The end of each child journal file is marked with a ** nul-terminator byte (0x00). i.e. the entire contents of a master journal ** file for a transaction involving two databases might be: ** ** "/home/bill/a.db-journal\x00/home/bill/b.db-journal\x00" ** -** A master journal file may only be deleted once all of its child +** A master journal file may only be deleted once all of its child ** journals have been rolled back. ** -** This function reads the contents of the master-journal file into +** This function reads the contents of the master-journal file into ** memory and loops through each of the child journal names. For ** each child journal, it checks if: ** ** * if the child journal exists, and if so -** * if the child journal contains a reference to master journal +** * if the child journal contains a reference to master journal ** file zMaster ** ** If a child journal can be found that matches both of the criteria @@ -53364,12 +53364,12 @@ static int pager_playback_one_page( ** ** If an IO error within this function, an error code is returned. This ** function allocates memory by calling sqlite3Malloc(). If an allocation -** fails, SQLITE_NOMEM is returned. Otherwise, if no IO or malloc errors +** fails, SQLITE_NOMEM is returned. Otherwise, if no IO or malloc errors ** occur, SQLITE_OK is returned. ** ** TODO: This function allocates a single block of memory to load ** the entire contents of the master journal file. This could be -** a couple of kilobytes or so - potentially larger than the page +** a couple of kilobytes or so - potentially larger than the page ** size. */ static int pager_delmaster(Pager *pPager, const char *zMaster){ @@ -53447,7 +53447,7 @@ static int pager_delmaster(Pager *pPager, const char *zMaster){ } zJournal += (sqlite3Strlen30(zJournal)+1); } - + sqlite3OsClose(pMaster); rc = sqlite3OsDelete(pVfs, zMaster, 0); @@ -53463,20 +53463,20 @@ delmaster_out: /* -** This function is used to change the actual size of the database +** This function is used to change the actual size of the database ** file in the file-system. This only happens when committing a transaction, ** or rolling back a transaction (including rolling back a hot-journal). ** ** If the main database file is not open, or the pager is not in either -** DBMOD or OPEN state, this function is a no-op. Otherwise, the size -** of the file is changed to nPage pages (nPage*pPager->pageSize bytes). +** DBMOD or OPEN state, this function is a no-op. Otherwise, the size +** of the file is changed to nPage pages (nPage*pPager->pageSize bytes). ** If the file on disk is currently larger than nPage pages, then use the VFS ** xTruncate() method to truncate it. ** -** Or, it might be the case that the file on disk is smaller than -** nPage pages. Some operating system implementations can get confused if -** you try to truncate a file to some size that is larger than it -** currently is, so detect this case and write a single zero byte to +** Or, it might be the case that the file on disk is smaller than +** nPage pages. Some operating system implementations can get confused if +** you try to truncate a file to some size that is larger than it +** currently is, so detect this case and write a single zero byte to ** the end of the new file instead. ** ** If successful, return SQLITE_OK. If an IO error occurs while modifying @@ -53486,9 +53486,9 @@ static int pager_truncate(Pager *pPager, Pgno nPage){ int rc = SQLITE_OK; assert( pPager->eState!=PAGER_ERROR ); assert( pPager->eState!=PAGER_READER ); - - if( isOpen(pPager->fd) - && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN) + + if( isOpen(pPager->fd) + && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN) ){ i64 currentSize, newSize; int szPage = pPager->pageSize; @@ -53532,8 +53532,8 @@ SQLITE_PRIVATE int sqlite3SectorSize(sqlite3_file *pFile){ /* ** Set the value of the Pager.sectorSize variable for the given ** pager based on the value returned by the xSectorSize method -** of the open database file. The sector size will be used -** to determine the size and alignment of journal header and +** of the open database file. The sector size will be used +** to determine the size and alignment of journal header and ** master journal pointers within created journal files. ** ** For temporary files the effective sector size is always 512 bytes. @@ -53556,7 +53556,7 @@ static void setSectorSize(Pager *pPager){ assert( isOpen(pPager->fd) || pPager->tempFile ); if( pPager->tempFile - || (sqlite3OsDeviceCharacteristics(pPager->fd) & + || (sqlite3OsDeviceCharacteristics(pPager->fd) & SQLITE_IOCAP_POWERSAFE_OVERWRITE)!=0 ){ /* Sector size doesn't matter for temporary files. Also, the file @@ -53570,15 +53570,15 @@ static void setSectorSize(Pager *pPager){ /* ** Playback the journal and thus restore the database file to -** the state it was in before we started making changes. +** the state it was in before we started making changes. ** -** The journal file format is as follows: +** The journal file format is as follows: ** ** (1) 8 byte prefix. A copy of aJournalMagic[]. ** (2) 4 byte big-endian integer which is the number of valid page records ** in the journal. If this value is 0xffffffff, then compute the ** number of page records from the journal size. -** (3) 4 byte big-endian integer which is the initial value for the +** (3) 4 byte big-endian integer which is the initial value for the ** sanity checksum. ** (4) 4 byte integer which is the number of pages to truncate the ** database to during a rollback. @@ -53607,7 +53607,7 @@ static void setSectorSize(Pager *pPager){ ** from the file size. This value is used when the user selects the ** no-sync option for the journal. A power failure could lead to corruption ** in this case. But for things like temporary table (which will be -** deleted when the power is restored) we don't care. +** deleted when the power is restored) we don't care. ** ** If the file opened as the journal file is not a well-formed ** journal file then all pages up to the first corrupted page are rolled @@ -53619,7 +53619,7 @@ static void setSectorSize(Pager *pPager){ ** and an error code is returned. ** ** The isHot parameter indicates that we are trying to rollback a journal -** that might be a hot journal. Or, it could be that the journal is +** that might be a hot journal. Or, it could be that the journal is ** preserved because of JOURNALMODE_PERSIST or JOURNALMODE_TRUNCATE. ** If the journal really is hot, reset the pager cache prior rolling ** back any content. If the journal is merely persistent, no reset is @@ -53670,9 +53670,9 @@ static int pager_playback(Pager *pPager, int isHot){ pPager->journalOff = 0; needPagerReset = isHot; - /* This loop terminates either when a readJournalHdr() or - ** pager_playback_one_page() call returns SQLITE_DONE or an IO error - ** occurs. + /* This loop terminates either when a readJournalHdr() or + ** pager_playback_one_page() call returns SQLITE_DONE or an IO error + ** occurs. */ while( 1 ){ /* Read the next journal header from the journal file. If there are @@ -53681,7 +53681,7 @@ static int pager_playback(Pager *pPager, int isHot){ ** This indicates nothing more needs to be rolled back. */ rc = readJournalHdr(pPager, isHot, szJ, &nRec, &mxPg); - if( rc!=SQLITE_OK ){ + if( rc!=SQLITE_OK ){ if( rc==SQLITE_DONE ){ rc = SQLITE_OK; } @@ -53709,7 +53709,7 @@ static int pager_playback(Pager *pPager, int isHot){ ** chunk of the journal contains zero pages to be rolled back. But ** when doing a ROLLBACK and the nRec==0 chunk is the last chunk in ** the journal, it means that the journal might contain additional - ** pages that need to be rolled back and that the number of pages + ** pages that need to be rolled back and that the number of pages ** should be computed based on the journal file size. */ if( nRec==0 && !isHot && @@ -53728,7 +53728,7 @@ static int pager_playback(Pager *pPager, int isHot){ pPager->dbSize = mxPg; } - /* Copy original pages out of the journal and back into the + /* Copy original pages out of the journal and back into the ** database file and/or page cache. */ for(u=0; ufd,SQLITE_FCNTL_DB_UNCHANGED,0); #endif - /* If this playback is happening automatically as a result of an IO or - ** malloc error that occurred after the change-counter was updated but - ** before the transaction was committed, then the change-counter - ** modification may just have been reverted. If this happens in exclusive + /* If this playback is happening automatically as a result of an IO or + ** malloc error that occurred after the change-counter was updated but + ** before the transaction was committed, then the change-counter + ** modification may just have been reverted. If this happens in exclusive ** mode, then subsequent transactions performed by the connection will not ** update the change-counter at all. This may lead to cache inconsistency ** problems for other processes at some point in the future. So, just @@ -53826,7 +53826,7 @@ end_playback: /* ** Read the content for page pPg out of the database file (or out of -** the WAL if that is where the most recent copy if found) into +** the WAL if that is where the most recent copy if found) into ** pPg->pData. A shared lock or greater must be held on the database ** file before this function is called. ** @@ -53917,15 +53917,15 @@ static void pager_write_changecounter(PgHdr *pPg){ #ifndef SQLITE_OMIT_WAL /* -** This function is invoked once for each page that has already been +** This function is invoked once for each page that has already been ** written into the log file when a WAL transaction is rolled back. -** Parameter iPg is the page number of said page. The pCtx argument +** Parameter iPg is the page number of said page. The pCtx argument ** is actually a pointer to the Pager structure. ** ** If page iPg is present in the cache, and has no outstanding references, ** it is discarded. Otherwise, if there are one or more outstanding ** references, the page content is reloaded from the database. If the -** attempt to reload content from the database is required and fails, +** attempt to reload content from the database is required and fails, ** return an SQLite error code. Otherwise, SQLITE_OK. */ static int pagerUndoCallback(void *pCtx, Pgno iPg){ @@ -53951,7 +53951,7 @@ static int pagerUndoCallback(void *pCtx, Pgno iPg){ ** updated as data is copied out of the rollback journal and into the ** database. This is not generally possible with a WAL database, as ** rollback involves simply truncating the log file. Therefore, if one - ** or more frames have already been written to the log (and therefore + ** or more frames have already been written to the log (and therefore ** also copied into the backup databases) as part of this transaction, ** the backups must be restarted. */ @@ -53968,7 +53968,7 @@ static int pagerRollbackWal(Pager *pPager){ PgHdr *pList; /* List of dirty pages to revert */ /* For all pages in the cache that are currently dirty or have already - ** been written (but not committed) to the log file, do one of the + ** been written (but not committed) to the log file, do one of the ** following: ** ** + Discard the cached page (if refcount==0), or @@ -53990,11 +53990,11 @@ static int pagerRollbackWal(Pager *pPager){ ** This function is a wrapper around sqlite3WalFrames(). As well as logging ** the contents of the list of pages headed by pList (connected by pDirty), ** this function notifies any active backup processes that the pages have -** changed. +** changed. ** ** The list of pages passed into this routine is always sorted by page number. ** Hence, if page 1 appears anywhere on the list, it will be the first page. -*/ +*/ static int pagerWalFrames( Pager *pPager, /* Pager object */ PgHdr *pList, /* List of frames to log */ @@ -54035,7 +54035,7 @@ static int pagerWalFrames( pPager->aStat[PAGER_STAT_WRITE] += nList; if( pList->pgno==1 ) pager_write_changecounter(pList); - rc = sqlite3WalFrames(pPager->pWal, + rc = sqlite3WalFrames(pPager->pWal, pPager->pageSize, pList, nTruncate, isCommit, pPager->walSyncFlags ); if( rc==SQLITE_OK && pPager->pBackup ){ @@ -54150,9 +54150,9 @@ static int pagerPagecount(Pager *pPager, Pgno *pnPage){ ** Return SQLITE_OK or an error code. ** ** The caller must hold a SHARED lock on the database file to call this -** function. Because an EXCLUSIVE lock on the db file is required to delete -** a WAL on a none-empty database, this ensures there is no race condition -** between the xAccess() below and an xDelete() being executed by some +** function. Because an EXCLUSIVE lock on the db file is required to delete +** a WAL on a none-empty database, this ensures there is no race condition +** between the xAccess() below and an xDelete() being executed by some ** other connection. */ static int pagerOpenWalIfPresent(Pager *pPager){ @@ -54188,21 +54188,21 @@ static int pagerOpenWalIfPresent(Pager *pPager){ /* ** Playback savepoint pSavepoint. Or, if pSavepoint==NULL, then playback -** the entire master journal file. The case pSavepoint==NULL occurs when -** a ROLLBACK TO command is invoked on a SAVEPOINT that is a transaction +** the entire master journal file. The case pSavepoint==NULL occurs when +** a ROLLBACK TO command is invoked on a SAVEPOINT that is a transaction ** savepoint. ** -** When pSavepoint is not NULL (meaning a non-transaction savepoint is +** When pSavepoint is not NULL (meaning a non-transaction savepoint is ** being rolled back), then the rollback consists of up to three stages, ** performed in the order specified: ** ** * Pages are played back from the main journal starting at byte -** offset PagerSavepoint.iOffset and continuing to +** offset PagerSavepoint.iOffset and continuing to ** PagerSavepoint.iHdrOffset, or to the end of the main journal ** file if PagerSavepoint.iHdrOffset is zero. ** ** * If PagerSavepoint.iHdrOffset is not zero, then pages are played -** back starting from the journal header immediately following +** back starting from the journal header immediately following ** PagerSavepoint.iHdrOffset to the end of the main journal file. ** ** * Pages are then played back from the sub-journal file, starting @@ -54218,7 +54218,7 @@ static int pagerOpenWalIfPresent(Pager *pPager){ ** journal file. There is no need for a bitvec in this case. ** ** In either case, before playback commences the Pager.dbSize variable -** is reset to the value that it held at the start of the savepoint +** is reset to the value that it held at the start of the savepoint ** (or transaction). No page with a page-number greater than this value ** is played back. If one is encountered it is simply skipped. */ @@ -54239,7 +54239,7 @@ static int pagerPlaybackSavepoint(Pager *pPager, PagerSavepoint *pSavepoint){ } } - /* Set the database size back to the value it was before the savepoint + /* Set the database size back to the value it was before the savepoint ** being reverted was opened. */ pPager->dbSize = pSavepoint ? pSavepoint->nOrig : pPager->dbOrigSize; @@ -54292,7 +54292,7 @@ static int pagerPlaybackSavepoint(Pager *pPager, PagerSavepoint *pSavepoint){ ** test is related to ticket #2565. See the discussion in the ** pager_playback() function for additional information. */ - if( nJRec==0 + if( nJRec==0 && pPager->journalHdr+JOURNAL_HDR_SZ(pPager)==pPager->journalOff ){ nJRec = (u32)((szJ - pPager->journalOff)/JOURNAL_PG_SZ(pPager)); @@ -54468,7 +54468,7 @@ SQLITE_PRIVATE void sqlite3PagerSetFlags( /* ** The following global variable is incremented whenever the library ** attempts to open a temporary file. This information is used for -** testing and analysis only. +** testing and analysis only. */ #ifdef SQLITE_TEST SQLITE_API int sqlite3_opentemp_count = 0; @@ -54477,8 +54477,8 @@ SQLITE_API int sqlite3_opentemp_count = 0; /* ** Open a temporary file. ** -** Write the file descriptor into *pFile. Return SQLITE_OK on success -** or some other error code if we fail. The OS will automatically +** Write the file descriptor into *pFile. Return SQLITE_OK on success +** or some other error code if we fail. The OS will automatically ** delete the temporary file when it is closed. ** ** The flags passed to the VFS layer xOpen() call are those specified @@ -54510,9 +54510,9 @@ static int pagerOpentemp( /* ** Set the busy handler function. ** -** The pager invokes the busy-handler if sqlite3OsLock() returns +** The pager invokes the busy-handler if sqlite3OsLock() returns ** SQLITE_BUSY when trying to upgrade from no-lock to a SHARED lock, -** or when trying to upgrade from a RESERVED lock to an EXCLUSIVE +** or when trying to upgrade from a RESERVED lock to an EXCLUSIVE ** lock. It does *not* invoke the busy handler when upgrading from ** SHARED to RESERVED, or when upgrading from SHARED to EXCLUSIVE ** (which occurs during hot-journal rollback). Summary: @@ -54524,7 +54524,7 @@ static int pagerOpentemp( ** SHARED_LOCK -> EXCLUSIVE_LOCK | No ** RESERVED_LOCK -> EXCLUSIVE_LOCK | Yes ** -** If the busy-handler callback returns non-zero, the lock is +** If the busy-handler callback returns non-zero, the lock is ** retried. If it returns zero, then the SQLITE_BUSY error is ** returned to the caller of the pager API function. */ @@ -54543,16 +54543,16 @@ SQLITE_PRIVATE void sqlite3PagerSetBusyHandler( } /* -** Change the page size used by the Pager object. The new page size +** Change the page size used by the Pager object. The new page size ** is passed in *pPageSize. ** ** If the pager is in the error state when this function is called, it -** is a no-op. The value returned is the error state error code (i.e. +** is a no-op. The value returned is the error state error code (i.e. ** one of SQLITE_IOERR, an SQLITE_IOERR_xxx sub-code or SQLITE_FULL). ** ** Otherwise, if all of the following are true: ** -** * the new page size (value of *pPageSize) is valid (a power +** * the new page size (value of *pPageSize) is valid (a power ** of two between 512 and SQLITE_MAX_PAGE_SIZE, inclusive), and ** ** * there are no outstanding page references, and @@ -54562,14 +54562,14 @@ SQLITE_PRIVATE void sqlite3PagerSetBusyHandler( ** ** then the pager object page size is set to *pPageSize. ** -** If the page size is changed, then this function uses sqlite3PagerMalloc() -** to obtain a new Pager.pTmpSpace buffer. If this allocation attempt -** fails, SQLITE_NOMEM is returned and the page size remains unchanged. +** If the page size is changed, then this function uses sqlite3PagerMalloc() +** to obtain a new Pager.pTmpSpace buffer. If this allocation attempt +** fails, SQLITE_NOMEM is returned and the page size remains unchanged. ** In all other cases, SQLITE_OK is returned. ** ** If the page size is not changed, either because one of the enumerated ** conditions above is not true, the pager was in error state when this -** function was called, or because the memory allocation attempt failed, +** function was called, or because the memory allocation attempt failed, ** then *pPageSize is set to the old, retained page size before returning. */ SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager *pPager, u32 *pPageSize, int nReserve){ @@ -54579,7 +54579,7 @@ SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager *pPager, u32 *pPageSize, int nR ** function may be called from within PagerOpen(), before the state ** of the Pager object is internally consistent. ** - ** At one point this function returned an error if the pager was in + ** At one point this function returned an error if the pager was in ** PAGER_ERROR state. But since PAGER_ERROR state guarantees that ** there is at least one outstanding page reference, this function ** is a no-op for that case anyhow. @@ -54588,8 +54588,8 @@ SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager *pPager, u32 *pPageSize, int nR u32 pageSize = *pPageSize; assert( pageSize==0 || (pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE) ); if( (pPager->memDb==0 || pPager->dbSize==0) - && sqlite3PcacheRefCount(pPager->pPCache)==0 - && pageSize && pageSize!=(u32)pPager->pageSize + && sqlite3PcacheRefCount(pPager->pPCache)==0 + && pageSize && pageSize!=(u32)pPager->pageSize ){ char *pNew = NULL; /* New temp space */ i64 nByte = 0; @@ -54646,7 +54646,7 @@ SQLITE_PRIVATE void *sqlite3PagerTempSpace(Pager *pPager){ } /* -** Attempt to set the maximum database page count if mxPage is positive. +** Attempt to set the maximum database page count if mxPage is positive. ** Make no changes if mxPage is zero or negative. And never reduce the ** maximum page count below the current size of the database. ** @@ -54690,11 +54690,11 @@ void enable_simulated_io_errors(void){ /* ** Read the first N bytes from the beginning of the file into memory -** that pDest points to. +** that pDest points to. ** ** If the pager was opened on a transient file (zFilename==""), or ** opened on a file less than N bytes in size, the output buffer is -** zeroed and SQLITE_OK returned. The rationale for this is that this +** zeroed and SQLITE_OK returned. The rationale for this is that this ** function is used to read database headers, and a new transient or ** zero sized database has a header than consists entirely of zeroes. ** @@ -54727,7 +54727,7 @@ SQLITE_PRIVATE int sqlite3PagerReadFileheader(Pager *pPager, int N, unsigned cha ** This function may only be called when a read-transaction is open on ** the pager. It returns the total number of pages in the database. ** -** However, if the file is between 1 and bytes in size, then +** However, if the file is between 1 and bytes in size, then ** this is considered a 1 page file. */ SQLITE_PRIVATE void sqlite3PagerPagecount(Pager *pPager, int *pnPage){ @@ -54742,19 +54742,19 @@ SQLITE_PRIVATE void sqlite3PagerPagecount(Pager *pPager, int *pnPage){ ** a similar or greater lock is already held, this function is a no-op ** (returning SQLITE_OK immediately). ** -** Otherwise, attempt to obtain the lock using sqlite3OsLock(). Invoke -** the busy callback if the lock is currently not available. Repeat -** until the busy callback returns false or until the attempt to +** Otherwise, attempt to obtain the lock using sqlite3OsLock(). Invoke +** the busy callback if the lock is currently not available. Repeat +** until the busy callback returns false or until the attempt to ** obtain the lock succeeds. ** ** Return SQLITE_OK on success and an error code if we cannot obtain -** the lock. If the lock is obtained successfully, set the Pager.state +** the lock. If the lock is obtained successfully, set the Pager.state ** variable to locktype before returning. */ static int pager_wait_on_lock(Pager *pPager, int locktype){ int rc; /* Return code */ - /* Check that this is either a no-op (because the requested lock is + /* Check that this is either a no-op (because the requested lock is ** already held), or one of the transitions that the busy-handler ** may be invoked during, according to the comment above ** sqlite3PagerSetBusyhandler(). @@ -54771,10 +54771,10 @@ static int pager_wait_on_lock(Pager *pPager, int locktype){ } /* -** Function assertTruncateConstraint(pPager) checks that one of the +** Function assertTruncateConstraint(pPager) checks that one of the ** following is true for all dirty pages currently in the page-cache: ** -** a) The page number is less than or equal to the size of the +** a) The page number is less than or equal to the size of the ** current database image, in pages, OR ** ** b) if the page content were written at this time, it would not @@ -54787,9 +54787,9 @@ static int pager_wait_on_lock(Pager *pPager, int locktype){ ** the database file. If a savepoint transaction were rolled back after ** this happened, the correct behavior would be to restore the current ** content of the page. However, since this content is not present in either -** the database file or the portion of the rollback journal and +** the database file or the portion of the rollback journal and ** sub-journal rolled back the content could not be restored and the -** database image would become corrupt. It is therefore fortunate that +** database image would become corrupt. It is therefore fortunate that ** this circumstance cannot arise. */ #if defined(SQLITE_DEBUG) @@ -54805,9 +54805,9 @@ static void assertTruncateConstraint(Pager *pPager){ #endif /* -** Truncate the in-memory database file image to nPage pages. This -** function does not actually modify the database file on disk. It -** just sets the internal state of the pager object so that the +** Truncate the in-memory database file image to nPage pages. This +** function does not actually modify the database file on disk. It +** just sets the internal state of the pager object so that the ** truncation will be done when the current transaction is committed. ** ** This function is only called right before committing a transaction. @@ -54822,11 +54822,11 @@ SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager *pPager, Pgno nPage){ /* At one point the code here called assertTruncateConstraint() to ** ensure that all pages being truncated away by this operation are, - ** if one or more savepoints are open, present in the savepoint + ** if one or more savepoints are open, present in the savepoint ** journal so that they can be restored if the savepoint is rolled ** back. This is no longer necessary as this function is now only - ** called right before committing a transaction. So although the - ** Pager object may still have open savepoints (Pager.nSavepoint!=0), + ** called right before committing a transaction. So although the + ** Pager object may still have open savepoints (Pager.nSavepoint!=0), ** they cannot be rolled back. So the assertTruncateConstraint() call ** is no longer correct. */ } @@ -54838,12 +54838,12 @@ SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager *pPager, Pgno nPage){ ** size of the journal file so that the pager_playback() routine knows ** that the entire journal file has been synced. ** -** Syncing a hot-journal to disk before attempting to roll it back ensures +** Syncing a hot-journal to disk before attempting to roll it back ensures ** that if a power-failure occurs during the rollback, the process that ** attempts rollback following system recovery sees the same journal ** content as this process. ** -** If everything goes as planned, SQLITE_OK is returned. Otherwise, +** If everything goes as planned, SQLITE_OK is returned. Otherwise, ** an SQLite error code. */ static int pagerSyncHotJournal(Pager *pPager){ @@ -54859,7 +54859,7 @@ static int pagerSyncHotJournal(Pager *pPager){ #if SQLITE_MAX_MMAP_SIZE>0 /* -** Obtain a reference to a memory mapped page object for page number pgno. +** Obtain a reference to a memory mapped page object for page number pgno. ** The new object will use the pointer pData, obtained from xFetch(). ** If successful, set *ppPage to point to the new page reference ** and return SQLITE_OK. Otherwise, return an SQLite error code and set @@ -54875,7 +54875,7 @@ static int pagerAcquireMapPage( PgHdr **ppPage /* OUT: Acquired page object */ ){ PgHdr *p; /* Memory mapped page to return */ - + if( pPager->pMmapFreelist ){ *ppPage = p = pPager->pMmapFreelist; pPager->pMmapFreelist = p->pDirty; @@ -54909,7 +54909,7 @@ static int pagerAcquireMapPage( #endif /* -** Release a reference to page pPg. pPg must have been returned by an +** Release a reference to page pPg. pPg must have been returned by an ** earlier call to pagerAcquireMapPage(). */ static void pagerReleaseMapPage(PgHdr *pPg){ @@ -54969,7 +54969,7 @@ static int databaseIsUnmoved(Pager *pPager){ ** result in a coredump. ** ** This function always succeeds. If a transaction is active an attempt -** is made to roll it back. If an error occurs during the rollback +** is made to roll it back. If an error occurs during the rollback ** a hot journal may be left in the filesystem but no error is returned ** to the caller. */ @@ -54986,7 +54986,7 @@ SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager, sqlite3 *db){ { u8 *a = 0; assert( db || pPager->pWal==0 ); - if( db && 0==(db->flags & SQLITE_NoCkptOnClose) + if( db && 0==(db->flags & SQLITE_NoCkptOnClose) && SQLITE_OK==databaseIsUnmoved(pPager) ){ a = pTmp; @@ -55000,8 +55000,8 @@ SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager, sqlite3 *db){ pager_unlock(pPager); }else{ /* If it is open, sync the journal file before calling UnlockAndRollback. - ** If this is not done, then an unsynced portion of the open journal - ** file may be played back into the database. If a power failure occurs + ** If this is not done, then an unsynced portion of the open journal + ** file may be played back into the database. If a power failure occurs ** while this is happening, the database could become corrupt. ** ** If an error occurs while trying to sync the journal, shift the pager @@ -55057,7 +55057,7 @@ SQLITE_PRIVATE void sqlite3PagerRef(DbPage *pPg){ ** disk and can be restored in the event of a hot-journal rollback. ** ** If the Pager.noSync flag is set, then this function is a no-op. -** Otherwise, the actions required depend on the journal-mode and the +** Otherwise, the actions required depend on the journal-mode and the ** device characteristics of the file-system, as follows: ** ** * If the journal file is an in-memory journal file, no action need @@ -55069,7 +55069,7 @@ SQLITE_PRIVATE void sqlite3PagerRef(DbPage *pPg){ ** been written following it. If the pager is operating in full-sync ** mode, then the journal file is synced before this field is updated. ** -** * If the device does not support the SEQUENTIAL property, then +** * If the device does not support the SEQUENTIAL property, then ** journal file is synced. ** ** Or, in pseudo-code: @@ -55078,11 +55078,11 @@ SQLITE_PRIVATE void sqlite3PagerRef(DbPage *pPg){ ** if( NOT SAFE_APPEND ){ ** if( ) xSync(); ** -** } +** } ** if( NOT SEQUENTIAL ) xSync(); ** } ** -** If successful, this routine clears the PGHDR_NEED_SYNC flag of every +** If successful, this routine clears the PGHDR_NEED_SYNC flag of every ** page currently held in memory before returning SQLITE_OK. If an IO ** error is encountered, then the IO error code is returned to the caller. */ @@ -55110,10 +55110,10 @@ static int syncJournal(Pager *pPager, int newHdr){ ** mode, then the journal file may at this point actually be larger ** than Pager.journalOff bytes. If the next thing in the journal ** file happens to be a journal-header (written as part of the - ** previous connection's transaction), and a crash or power-failure - ** occurs after nRec is updated but before this connection writes - ** anything else to the journal file (or commits/rolls back its - ** transaction), then SQLite may become confused when doing the + ** previous connection's transaction), and a crash or power-failure + ** occurs after nRec is updated but before this connection writes + ** anything else to the journal file (or commits/rolls back its + ** transaction), then SQLite may become confused when doing the ** hot-journal rollback following recovery. It may roll back all ** of this connections data, then proceed to rolling back the old, ** out-of-date data that follows it. Database corruption. @@ -55123,7 +55123,7 @@ static int syncJournal(Pager *pPager, int newHdr){ ** byte to the start of it to prevent it from being recognized. ** ** Variable iNextHdrOffset is set to the offset at which this - ** problematic header will occur, if it exists. aMagic is used + ** problematic header will occur, if it exists. aMagic is used ** as a temporary buffer to inspect the first couple of bytes of ** the potential journal header. */ @@ -55150,7 +55150,7 @@ static int syncJournal(Pager *pPager, int newHdr){ ** it as a candidate for rollback. ** ** This is not required if the persistent media supports the - ** SAFE_APPEND property. Because in this case it is not possible + ** SAFE_APPEND property. Because in this case it is not possible ** for garbage data to be appended to the file, the nRec field ** is populated with 0xFFFFFFFF when the journal header is written ** and never needs to be updated. @@ -55170,7 +55170,7 @@ static int syncJournal(Pager *pPager, int newHdr){ if( 0==(iDc&SQLITE_IOCAP_SEQUENTIAL) ){ PAGERTRACE(("SYNC journal of %d\n", PAGERID(pPager))); IOTRACE(("JSYNC %p\n", pPager)) - rc = sqlite3OsSync(pPager->jfd, pPager->syncFlags| + rc = sqlite3OsSync(pPager->jfd, pPager->syncFlags| (pPager->syncFlags==SQLITE_SYNC_FULL?SQLITE_SYNC_DATAONLY:0) ); if( rc!=SQLITE_OK ) return rc; @@ -55187,8 +55187,8 @@ static int syncJournal(Pager *pPager, int newHdr){ } } - /* Unless the pager is in noSync mode, the journal file was just - ** successfully synced. Either way, clear the PGHDR_NEED_SYNC flag on + /* Unless the pager is in noSync mode, the journal file was just + ** successfully synced. Either way, clear the PGHDR_NEED_SYNC flag on ** all pages. */ sqlite3PcacheClearSyncFlags(pPager->pPCache); @@ -55208,9 +55208,9 @@ static int syncJournal(Pager *pPager, int newHdr){ ** is called. Before writing anything to the database file, this lock ** is upgraded to an EXCLUSIVE lock. If the lock cannot be obtained, ** SQLITE_BUSY is returned and no data is written to the database file. -** +** ** If the pager is a temp-file pager and the actual file-system file -** is not yet open, it is created and opened before any data is +** is not yet open, it is created and opened before any data is ** written out. ** ** Once the lock has been upgraded and, if necessary, the file opened, @@ -55225,7 +55225,7 @@ static int syncJournal(Pager *pPager, int newHdr){ ** in Pager.dbFileVers[] is updated to match the new value stored in ** the database file. ** -** If everything is successful, SQLITE_OK is returned. If an IO error +** If everything is successful, SQLITE_OK is returned. If an IO error ** occurs, an IO error code is returned. Or, if the EXCLUSIVE lock cannot ** be obtained, SQLITE_BUSY is returned. */ @@ -55251,7 +55251,7 @@ static int pager_write_pagelist(Pager *pPager, PgHdr *pList){ ** file size will be. */ assert( rc!=SQLITE_OK || isOpen(pPager->fd) ); - if( rc==SQLITE_OK + if( rc==SQLITE_OK && pPager->dbHintSizedbSize && (pList->pDirty || pList->pgno>pPager->dbHintSize) ){ @@ -55273,7 +55273,7 @@ static int pager_write_pagelist(Pager *pPager, PgHdr *pList){ */ if( pgno<=pPager->dbSize && 0==(pList->flags&PGHDR_DONT_WRITE) ){ i64 offset = (pgno-1)*(i64)pPager->pageSize; /* Offset to write */ - char *pData; /* Data to write */ + char *pData; /* Data to write */ assert( (pList->flags&PGHDR_NEED_SYNC)==0 ); if( pList->pgno==1 ) pager_write_changecounter(pList); @@ -55285,8 +55285,8 @@ static int pager_write_pagelist(Pager *pPager, PgHdr *pList){ rc = sqlite3OsWrite(pPager->fd, pData, pPager->pageSize, offset); /* If page 1 was just written, update Pager.dbFileVers to match - ** the value now stored in the database file. If writing this - ** page caused the database file to grow, update dbFileSize. + ** the value now stored in the database file. If writing this + ** page caused the database file to grow, update dbFileSize. */ if( pgno==1 ){ memcpy(&pPager->dbFileVers, &pData[24], sizeof(pPager->dbFileVers)); @@ -55314,18 +55314,18 @@ static int pager_write_pagelist(Pager *pPager, PgHdr *pList){ } /* -** Ensure that the sub-journal file is open. If it is already open, this +** Ensure that the sub-journal file is open. If it is already open, this ** function is a no-op. ** -** SQLITE_OK is returned if everything goes according to plan. An -** SQLITE_IOERR_XXX error code is returned if a call to sqlite3OsOpen() +** SQLITE_OK is returned if everything goes according to plan. An +** SQLITE_IOERR_XXX error code is returned if a call to sqlite3OsOpen() ** fails. */ static int openSubJournal(Pager *pPager){ int rc = SQLITE_OK; if( !isOpen(pPager->sjfd) ){ - const int flags = SQLITE_OPEN_SUBJOURNAL | SQLITE_OPEN_READWRITE - | SQLITE_OPEN_CREATE | SQLITE_OPEN_EXCLUSIVE + const int flags = SQLITE_OPEN_SUBJOURNAL | SQLITE_OPEN_READWRITE + | SQLITE_OPEN_CREATE | SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_DELETEONCLOSE; int nStmtSpill = sqlite3Config.nStmtSpill; if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY || pPager->subjInMemory ){ @@ -55337,13 +55337,13 @@ static int openSubJournal(Pager *pPager){ } /* -** Append a record of the current state of page pPg to the sub-journal. +** Append a record of the current state of page pPg to the sub-journal. ** ** If successful, set the bit corresponding to pPg->pgno in the bitvecs ** for all open savepoints before returning. ** ** This function returns SQLITE_OK if everything is successful, an IO -** error code if the attempt to write to the sub-journal fails, or +** error code if the attempt to write to the sub-journal fails, or ** SQLITE_NOMEM if a malloc fails while setting a bit in a savepoint ** bitvec. */ @@ -55356,9 +55356,9 @@ static int subjournalPage(PgHdr *pPg){ assert( pPager->useJournal ); assert( isOpen(pPager->jfd) || pagerUseWal(pPager) ); assert( isOpen(pPager->sjfd) || pPager->nSubRec==0 ); - assert( pagerUseWal(pPager) - || pageInJournal(pPager, pPg) - || pPg->pgno>pPager->dbOrigSize + assert( pagerUseWal(pPager) + || pageInJournal(pPager, pPg) + || pPg->pgno>pPager->dbOrigSize ); rc = openSubJournal(pPager); @@ -55369,7 +55369,7 @@ static int subjournalPage(PgHdr *pPg){ i64 offset = (i64)pPager->nSubRec*(4+pPager->pageSize); char *pData2; -#if SQLITE_HAS_CODEC +#if SQLITE_HAS_CODEC if( !pPager->subjInMemory ){ CODEC2(pPager, pData, pPg->pgno, 7, return SQLITE_NOMEM_BKPT, pData2); }else @@ -55401,14 +55401,14 @@ static int subjournalPageIfRequired(PgHdr *pPg){ ** This function is called by the pcache layer when it has reached some ** soft memory limit. The first argument is a pointer to a Pager object ** (cast as a void*). The pager is always 'purgeable' (not an in-memory -** database). The second argument is a reference to a page that is +** database). The second argument is a reference to a page that is ** currently dirty but has no outstanding references. The page -** is always associated with the Pager object passed as the first +** is always associated with the Pager object passed as the first ** argument. ** ** The job of this function is to make pPg clean by writing its contents ** out to the database file, if possible. This may involve syncing the -** journal file. +** journal file. ** ** If successful, sqlite3PcacheMakeClean() is called on the page and ** SQLITE_OK returned. If an IO error occurs while trying to make the @@ -55433,7 +55433,7 @@ static int pagerStress(void *p, PgHdr *pPg){ ** a rollback or by user request, respectively. ** ** Spilling is also prohibited when in an error state since that could - ** lead to database corruption. In the current implementation it + ** lead to database corruption. In the current implementation it ** is impossible for sqlite3PcacheFetch() to be called with createFlag==3 ** while in the error state, hence it is impossible for this routine to ** be called in the error state. Nevertheless, we include a NEVER() @@ -55454,26 +55454,26 @@ static int pagerStress(void *p, PgHdr *pPg){ pPg->pDirty = 0; if( pagerUseWal(pPager) ){ /* Write a single frame for this page to the log. */ - rc = subjournalPageIfRequired(pPg); + rc = subjournalPageIfRequired(pPg); if( rc==SQLITE_OK ){ rc = pagerWalFrames(pPager, pPg, 0, 0); } }else{ - + #ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE if( pPager->tempFile==0 ){ rc = sqlite3JournalCreate(pPager->jfd); if( rc!=SQLITE_OK ) return pager_error(pPager, rc); } #endif - + /* Sync the journal file if required. */ - if( pPg->flags&PGHDR_NEED_SYNC + if( pPg->flags&PGHDR_NEED_SYNC || pPager->eState==PAGER_WRITER_CACHEMOD ){ rc = syncJournal(pPager, 1); } - + /* Write the contents of the page out to the database file. */ if( rc==SQLITE_OK ){ assert( (pPg->flags&PGHDR_NEED_SYNC)==0 ); @@ -55487,7 +55487,7 @@ static int pagerStress(void *p, PgHdr *pPg){ sqlite3PcacheMakeClean(pPg); } - return pager_error(pPager, rc); + return pager_error(pPager, rc); } /* @@ -55518,8 +55518,8 @@ SQLITE_PRIVATE int sqlite3PagerFlush(Pager *pPager){ ** The zFilename argument is the path to the database file to open. ** If zFilename is NULL then a randomly-named temporary file is created ** and used as the file to be cached. Temporary files are be deleted -** automatically when they are closed. If zFilename is ":memory:" then -** all information is held in cache. It is never written to disk. +** automatically when they are closed. If zFilename is ":memory:" then +** all information is held in cache. It is never written to disk. ** This can be used to implement an in-memory database. ** ** The nExtra parameter specifies the number of bytes of space allocated @@ -55533,13 +55533,13 @@ SQLITE_PRIVATE int sqlite3PagerFlush(Pager *pPager){ ** of the PAGER_* flags. ** ** The vfsFlags parameter is a bitmask to pass to the flags parameter -** of the xOpen() method of the supplied VFS when opening files. +** of the xOpen() method of the supplied VFS when opening files. ** -** If the pager object is allocated and the specified file opened +** If the pager object is allocated and the specified file opened ** successfully, SQLITE_OK is returned and *ppPager set to point to ** the new pager object. If an error occurs, *ppPager is set to NULL ** and error code returned. This function may return SQLITE_NOMEM -** (sqlite3Malloc() is used to allocate memory), SQLITE_CANTOPEN or +** (sqlite3Malloc() is used to allocate memory), SQLITE_CANTOPEN or ** various SQLITE_IO_XXX errors. */ SQLITE_PRIVATE int sqlite3PagerOpen( @@ -55627,7 +55627,7 @@ SQLITE_PRIVATE int sqlite3PagerOpen( } /* Allocate memory for the Pager structure, PCache object, the - ** three file descriptors, the database file name and the journal + ** three file descriptors, the database file name and the journal ** file name. The layout in memory is as follows: ** ** Pager object (sizeof(Pager) bytes) @@ -55642,7 +55642,7 @@ SQLITE_PRIVATE int sqlite3PagerOpen( ROUND8(sizeof(*pPager)) + /* Pager structure */ ROUND8(pcacheSize) + /* PCache object */ ROUND8(pVfs->szOsFile) + /* The main db file */ - journalFileSize * 2 + /* The two journal files */ + journalFileSize * 2 + /* The two journal files */ nPathname + 1 + nUri + /* zFilename */ nPathname + 8 + 2 /* zJournal */ #ifndef SQLITE_OMIT_WAL @@ -55744,7 +55744,7 @@ SQLITE_PRIVATE int sqlite3PagerOpen( ** disk and uses an in-memory rollback journal. ** ** This branch also runs for files marked as immutable. - */ + */ act_like_temp_file: tempFile = 1; pPager->eState = PAGER_READER; /* Pretend we already have a lock */ @@ -55753,7 +55753,7 @@ act_like_temp_file: readOnly = (vfsFlags&SQLITE_OPEN_READONLY); } - /* The following call to PagerSetPagesize() serves to set the value of + /* The following call to PagerSetPagesize() serves to set the value of ** Pager.pageSize and to allocate the Pager.pTmpSpace buffer. */ if( rc==SQLITE_OK ){ @@ -55793,10 +55793,10 @@ act_like_temp_file: /* pPager->state = PAGER_UNLOCK; */ /* pPager->errMask = 0; */ pPager->tempFile = (u8)tempFile; - assert( tempFile==PAGER_LOCKINGMODE_NORMAL + assert( tempFile==PAGER_LOCKINGMODE_NORMAL || tempFile==PAGER_LOCKINGMODE_EXCLUSIVE ); assert( PAGER_LOCKINGMODE_EXCLUSIVE==1 ); - pPager->exclusiveMode = (u8)tempFile; + pPager->exclusiveMode = (u8)tempFile; pPager->changeCountDone = pPager->tempFile; pPager->memDb = (u8)memDb; pPager->readOnly = (u8)readOnly; @@ -55841,7 +55841,7 @@ act_like_temp_file: /* ** This function is called after transitioning from PAGER_UNLOCK to ** PAGER_SHARED state. It tests if there is a hot journal present in -** the file-system for the given pager. A hot journal is one that +** the file-system for the given pager. A hot journal is one that ** needs to be played back. According to this function, a hot-journal ** file exists if the following criteria are met: ** @@ -55860,10 +55860,10 @@ act_like_temp_file: ** at the end of the file. If there is, and that master journal file ** does not exist, then the journal file is not really hot. In this ** case this routine will return a false-positive. The pager_playback() -** routine will discover that the journal file is not really hot and -** will not roll it back. +** routine will discover that the journal file is not really hot and +** will not roll it back. ** -** If a hot-journal file is found to exist, *pExists is set to 1 and +** If a hot-journal file is found to exist, *pExists is set to 1 and ** SQLITE_OK returned. If no hot-journal file is present, *pExists is ** set to 0 and SQLITE_OK returned. If an IO error occurs while trying ** to determine whether or not a hot-journal file exists, the IO error @@ -55891,7 +55891,7 @@ static int hasHotJournal(Pager *pPager, int *pExists){ int locked = 0; /* True if some process holds a RESERVED lock */ /* Race condition here: Another process might have been holding the - ** the RESERVED lock and have a journal open at the sqlite3OsAccess() + ** the RESERVED lock and have a journal open at the sqlite3OsAccess() ** call above, but then delete the journal and drop the lock before ** we get to the following sqlite3OsCheckReservedLock() call. If that ** is the case, this routine might think there is a hot journal when @@ -55924,7 +55924,7 @@ static int hasHotJournal(Pager *pPager, int *pExists){ /* The journal file exists and no other connection has a reserved ** or greater lock on the database file. Now check that there is ** at least one non-zero bytes at the start of the journal file. - ** If there is, then we consider this journal to be hot. If not, + ** If there is, then we consider this journal to be hot. If not, ** it can be ignored. */ if( !jrnlOpen ){ @@ -55974,7 +55974,7 @@ static int hasHotJournal(Pager *pPager, int *pExists){ ** on the database file), then an attempt is made to obtain a ** SHARED lock on the database file. Immediately after obtaining ** the SHARED lock, the file-system is checked for a hot-journal, -** which is played back if present. Following any hot-journal +** which is played back if present. Following any hot-journal ** rollback, the contents of the cache are validated by checking ** the 'change-counter' field of the database file header and ** discarded if they are found to be invalid. @@ -55985,8 +55985,8 @@ static int hasHotJournal(Pager *pPager, int *pExists){ ** the contents of the page cache and rolling back any open journal ** file. ** -** If everything is successful, SQLITE_OK is returned. If an IO error -** occurs while locking the database, checking for a hot-journal file or +** If everything is successful, SQLITE_OK is returned. If an IO error +** occurs while locking the database, checking for a hot-journal file or ** rolling back a journal file, the IO error code is returned. */ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ @@ -55994,7 +55994,7 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ /* This routine is only called from b-tree and only when there are no ** outstanding pages. This implies that the pager state should either - ** be OPEN or READER. READER is only possible if the pager is or was in + ** be OPEN or READER. READER is only possible if the pager is or was in ** exclusive access mode. */ assert( sqlite3PcacheRefCount(pPager->pPCache)==0 ); assert( assert_pager_state(pPager) ); @@ -56032,12 +56032,12 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ ** important that a RESERVED lock is not obtained on the way to the ** EXCLUSIVE lock. If it were, another process might open the ** database file, detect the RESERVED lock, and conclude that the - ** database is safe to read while this process is still rolling the + ** database is safe to read while this process is still rolling the ** hot-journal back. - ** + ** ** Because the intermediate RESERVED lock is not requested, any - ** other process attempting to access the database file will get to - ** this point in the code and fail to obtain its own EXCLUSIVE lock + ** other process attempting to access the database file will get to + ** this point in the code and fail to obtain its own EXCLUSIVE lock ** on the database file. ** ** Unless the pager is in locking_mode=exclusive mode, the lock is @@ -56047,17 +56047,17 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ if( rc!=SQLITE_OK ){ goto failed; } - - /* If it is not already open and the file exists on disk, open the - ** journal for read/write access. Write access is required because - ** in exclusive-access mode the file descriptor will be kept open - ** and possibly used for a transaction later on. Also, write-access - ** is usually required to finalize the journal in journal_mode=persist + + /* If it is not already open and the file exists on disk, open the + ** journal for read/write access. Write access is required because + ** in exclusive-access mode the file descriptor will be kept open + ** and possibly used for a transaction later on. Also, write-access + ** is usually required to finalize the journal in journal_mode=persist ** mode (and also for journal_mode=truncate on some systems). ** - ** If the journal does not exist, it usually means that some - ** other connection managed to get in and roll it back before - ** this connection obtained the exclusive lock above. Or, it + ** If the journal does not exist, it usually means that some + ** other connection managed to get in and roll it back before + ** this connection obtained the exclusive lock above. Or, it ** may mean that the pager was in the error-state when this ** function was called and the journal file does not exist. */ @@ -56078,7 +56078,7 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ } } } - + /* Playback and delete the journal. Drop the database write ** lock and reacquire the read lock. Purge the cache before ** playing back the hot-journal so that we don't end up with @@ -56103,8 +56103,8 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ ** or roll back a hot-journal while holding an EXCLUSIVE lock. The ** pager_unlock() routine will be called before returning to unlock ** the file. If the unlock attempt fails, then Pager.eLock must be - ** set to UNKNOWN_LOCK (see the comment above the #define for - ** UNKNOWN_LOCK above for an explanation). + ** set to UNKNOWN_LOCK (see the comment above the #define for + ** UNKNOWN_LOCK above for an explanation). ** ** In order to get pager_unlock() to do this, set Pager.eState to ** PAGER_ERROR now. This is not actually counted as a transition @@ -56112,7 +56112,7 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ ** since we know that the same call to pager_unlock() will very ** shortly transition the pager object to the OPEN state. Calling ** assert_pager_state() would fail now, as it should not be possible - ** to be in ERROR state when there are zero outstanding page + ** to be in ERROR state when there are zero outstanding page ** references. */ pager_error(pPager, rc); @@ -56137,8 +56137,8 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ ** a 32-bit counter that is incremented with each change. The ** other bytes change randomly with each file change when ** a codec is in use. - ** - ** There is a vanishingly small chance that a change will not be + ** + ** There is a vanishingly small chance that a change will not be ** detected. The chance of an undetected change is so small that ** it can be neglected. */ @@ -56205,7 +56205,7 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ ** Except, in locking_mode=EXCLUSIVE when there is nothing to in ** the rollback journal, the unlock is not performed and there is ** nothing to rollback, so this routine is a no-op. -*/ +*/ static void pagerUnlockIfUnused(Pager *pPager){ if( sqlite3PcacheRefCount(pPager->pPCache)==0 ){ assert( pPager->nMmapOut==0 ); /* because page1 is never memory mapped */ @@ -56215,7 +56215,7 @@ static void pagerUnlockIfUnused(Pager *pPager){ /* ** The page getter methods each try to acquire a reference to a -** page with page number pgno. If the requested reference is +** page with page number pgno. If the requested reference is ** successfully obtained, it is copied to *ppPage and SQLITE_OK returned. ** ** There are different implementations of the getter method depending @@ -56225,22 +56225,22 @@ static void pagerUnlockIfUnused(Pager *pPager){ ** getPageError() -- Used if the pager is in an error state ** getPageMmap() -- Used if memory-mapped I/O is enabled ** -** If the requested page is already in the cache, it is returned. +** If the requested page is already in the cache, it is returned. ** Otherwise, a new page object is allocated and populated with data ** read from the database file. In some cases, the pcache module may ** choose not to allocate a new page object and may reuse an existing ** object with no outstanding references. ** -** The extra data appended to a page is always initialized to zeros the -** first time a page is loaded into memory. If the page requested is +** The extra data appended to a page is always initialized to zeros the +** first time a page is loaded into memory. If the page requested is ** already in the cache when this function is called, then the extra ** data is left as it was when the page object was last used. ** -** If the database image is smaller than the requested page or if -** the flags parameter contains the PAGER_GET_NOCONTENT bit and the -** requested page is not already stored in the cache, then no -** actual disk read occurs. In this case the memory image of the -** page is initialized to all zeros. +** If the database image is smaller than the requested page or if +** the flags parameter contains the PAGER_GET_NOCONTENT bit and the +** requested page is not already stored in the cache, then no +** actual disk read occurs. In this case the memory image of the +** page is initialized to all zeros. ** ** If PAGER_GET_NOCONTENT is true, it means that we do not care about ** the contents of the page. This occurs in two scenarios: @@ -56311,7 +56311,7 @@ static int getPageNormal( return SQLITE_OK; }else{ - /* The pager cache has created a new page. Its content needs to + /* The pager cache has created a new page. Its content needs to ** be initialized. But first some error checks: ** ** (1) The maximum page number is 2^31 @@ -56332,9 +56332,9 @@ static int getPageNormal( } if( noContent ){ /* Failure to set the bits in the InJournal bit-vectors is benign. - ** It merely means that we might do some extra work to journal a - ** page that does not need to be journaled. Nevertheless, be sure - ** to test the case where a malloc error occurs while trying to set + ** It merely means that we might do some extra work to journal a + ** page that does not need to be journaled. Nevertheless, be sure + ** to test the case where a malloc error occurs while trying to set ** a bit in a bit vector. */ sqlite3BeginBenignMalloc(); @@ -56384,7 +56384,7 @@ static int getPageMMap( /* It is acceptable to use a read-only (mmap) page for any page except ** page 1 if there is no write-transaction open or the ACQUIRE_READONLY - ** flag was specified by the caller. And so long as the db is not a + ** flag was specified by the caller. And so long as the db is not a ** temporary or in-memory database. */ const int bMmapOk = (pgno>1 && (pPager->eState==PAGER_READER || (flags & PAGER_GET_READONLY)) @@ -56416,7 +56416,7 @@ static int getPageMMap( } if( bMmapOk && iFrame==0 ){ void *pData = 0; - rc = sqlite3OsFetch(pPager->fd, + rc = sqlite3OsFetch(pPager->fd, (i64)(pgno-1) * pPager->pageSize, pPager->pageSize, &pData ); if( rc==SQLITE_OK && pData ){ @@ -56472,12 +56472,12 @@ SQLITE_PRIVATE int sqlite3PagerGet( /* ** Acquire a page if it is already in the in-memory cache. Do ** not read the page from disk. Return a pointer to the page, -** or 0 if the page is not in cache. +** or 0 if the page is not in cache. ** ** See also sqlite3PagerGet(). The difference between this routine ** and sqlite3PagerGet() is that _get() will go to the disk and read ** in the page if the page is not already in cache. This routine -** returns NULL if the page is not in cache or if a disk I/O error +** returns NULL if the page is not in cache or if a disk I/O error ** has ever happened. */ SQLITE_PRIVATE DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno){ @@ -56531,24 +56531,24 @@ SQLITE_PRIVATE void sqlite3PagerUnrefPageOne(DbPage *pPg){ /* ** This function is called at the start of every write transaction. -** There must already be a RESERVED or EXCLUSIVE lock on the database +** There must already be a RESERVED or EXCLUSIVE lock on the database ** file when this routine is called. ** ** Open the journal file for pager pPager and write a journal header ** to the start of it. If there are active savepoints, open the sub-journal -** as well. This function is only used when the journal file is being -** opened to write a rollback log for a transaction. It is not used +** as well. This function is only used when the journal file is being +** opened to write a rollback log for a transaction. It is not used ** when opening a hot journal file to roll it back. ** ** If the journal file is already open (as it may be in exclusive mode), ** then this function just writes a journal header to the start of the -** already open file. +** already open file. ** ** Whether or not the journal file is opened by this function, the ** Pager.pInJournal bitvec structure is allocated. ** -** Return SQLITE_OK if everything is successful. Otherwise, return -** SQLITE_NOMEM if the attempt to allocate Pager.pInJournal fails, or +** Return SQLITE_OK if everything is successful. Otherwise, return +** SQLITE_NOMEM if the attempt to allocate Pager.pInJournal fails, or ** an IO error code if opening or writing the journal file fails. */ static int pager_open_journal(Pager *pPager){ @@ -56558,7 +56558,7 @@ static int pager_open_journal(Pager *pPager){ assert( pPager->eState==PAGER_WRITER_LOCKED ); assert( assert_pager_state(pPager) ); assert( pPager->pInJournal==0 ); - + /* If already in the error state, this function is a no-op. But on ** the other hand, this routine is never called if we are already in ** an error state. */ @@ -56569,7 +56569,7 @@ static int pager_open_journal(Pager *pPager){ if( pPager->pInJournal==0 ){ return SQLITE_NOMEM_BKPT; } - + /* Open the journal file if it is not already open. */ if( !isOpen(pPager->jfd) ){ if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY ){ @@ -56585,7 +56585,7 @@ static int pager_open_journal(Pager *pPager){ flags |= SQLITE_OPEN_MAIN_JOURNAL; nSpill = jrnlBufferSize(pPager); } - + /* Verify that the database still has the same name as it did when ** it was originally opened. */ rc = databaseIsUnmoved(pPager); @@ -56597,9 +56597,9 @@ static int pager_open_journal(Pager *pPager){ } assert( rc!=SQLITE_OK || isOpen(pPager->jfd) ); } - - - /* Write the first journal header to the journal file and open + + + /* Write the first journal header to the journal file and open ** the sub-journal if necessary. */ if( rc==SQLITE_OK ){ @@ -56624,12 +56624,12 @@ static int pager_open_journal(Pager *pPager){ } /* -** Begin a write-transaction on the specified pager object. If a +** Begin a write-transaction on the specified pager object. If a ** write-transaction has already been opened, this function is a no-op. ** ** If the exFlag argument is false, then acquire at least a RESERVED ** lock on the database file. If exFlag is true, then acquire at least -** an EXCLUSIVE lock. If such a lock is already held, no locking +** an EXCLUSIVE lock. If such a lock is already held, no locking ** functions need be called. ** ** If the subjInMemory argument is non-zero, then any sub-journal opened @@ -56637,7 +56637,7 @@ static int pager_open_journal(Pager *pPager){ ** has no effect if the sub-journal is already opened (as it may be when ** running in exclusive mode) or if the transaction does not require a ** sub-journal. If the subjInMemory argument is zero, then any required -** sub-journal is implemented in-memory if pPager is an in-memory database, +** sub-journal is implemented in-memory if pPager is an in-memory database, ** or using a temporary file otherwise. */ SQLITE_PRIVATE int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){ @@ -56685,9 +56685,9 @@ SQLITE_PRIVATE int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory ** ** WAL mode sets Pager.eState to PAGER_WRITER_LOCKED or CACHEMOD ** when it has an open transaction, but never to DBMOD or FINISHED. - ** This is because in those states the code to roll back savepoint - ** transactions may copy data from the sub-journal into the database - ** file as well as into the page cache. Which would be incorrect in + ** This is because in those states the code to roll back savepoint + ** transactions may copy data from the sub-journal into the database + ** file as well as into the page cache. Which would be incorrect in ** WAL mode. */ pPager->eState = PAGER_WRITER_LOCKED; @@ -56741,11 +56741,11 @@ static SQLITE_NOINLINE int pagerAddPageToRollbackJournal(PgHdr *pPg){ rc = write32bits(pPager->jfd, iOff+pPager->pageSize+4, cksum); if( rc!=SQLITE_OK ) return rc; - IOTRACE(("JOUT %p %d %lld %d\n", pPager, pPg->pgno, + IOTRACE(("JOUT %p %d %lld %d\n", pPager, pPg->pgno, pPager->journalOff, pPager->pageSize)); PAGER_INCR(sqlite3_pager_writej_count); PAGERTRACE(("JOURNAL %d page %d needSync=%d hash(%08x)\n", - PAGERID(pPager), pPg->pgno, + PAGERID(pPager), pPg->pgno, ((pPg->flags&PGHDR_NEED_SYNC)?1:0), pager_pagehash(pPg))); pPager->journalOff += 8 + pPager->pageSize; @@ -56760,9 +56760,9 @@ static SQLITE_NOINLINE int pagerAddPageToRollbackJournal(PgHdr *pPg){ } /* -** Mark a single data page as writeable. The page is written into the +** Mark a single data page as writeable. The page is written into the ** main journal or sub-journal as required. If the page is written into -** one of the journals, the corresponding bit is set in the +** one of the journals, the corresponding bit is set in the ** Pager.pInJournal bitvec and the PagerSavepoint.pInSavepoint bitvecs ** of any open savepoints as appropriate. */ @@ -56770,7 +56770,7 @@ static int pager_write(PgHdr *pPg){ Pager *pPager = pPg->pPager; int rc = SQLITE_OK; - /* This routine is not called unless a write-transaction has already + /* This routine is not called unless a write-transaction has already ** been started. The journal file may or may not be open at this point. ** It is never called in the ERROR state. */ @@ -56787,7 +56787,7 @@ static int pager_write(PgHdr *pPg){ ** obtained the necessary locks to begin the write-transaction, but the ** rollback journal might not yet be open. Open it now if this is the case. ** - ** This is done before calling sqlite3PcacheMakeDirty() on the page. + ** This is done before calling sqlite3PcacheMakeDirty() on the page. ** Otherwise, if it were done after calling sqlite3PcacheMakeDirty(), then ** an error might occur and the pager would end up in WRITER_LOCKED state ** with pages marked as dirty in the cache. @@ -56832,7 +56832,7 @@ static int pager_write(PgHdr *pPg){ ** PGHDR_WRITEABLE bit that indicates that the page can be safely modified. */ pPg->flags |= PGHDR_WRITEABLE; - + /* If the statement journal is open and the page is not in it, ** then write the page into the statement journal. */ @@ -56916,7 +56916,7 @@ static SQLITE_NOINLINE int pagerWriteLargeSector(PgHdr *pPg){ } } - /* If the PGHDR_NEED_SYNC flag is set for any of the nPage pages + /* If the PGHDR_NEED_SYNC flag is set for any of the nPage pages ** starting at pg1, then it needs to be set for all of them. Because ** writing to any of these nPage pages may damage the others, the ** journal file must contain sync()ed copies of all of them @@ -56939,9 +56939,9 @@ static SQLITE_NOINLINE int pagerWriteLargeSector(PgHdr *pPg){ } /* -** Mark a data page as writeable. This routine must be called before -** making changes to a page. The caller must check the return value -** of this function and be careful not to change any page data unless +** Mark a data page as writeable. This routine must be called before +** making changes to a page. The caller must check the return value +** of this function and be careful not to change any page data unless ** this routine returns SQLITE_OK. ** ** The difference between this function and pager_write() is that this @@ -56992,13 +56992,13 @@ SQLITE_PRIVATE int sqlite3PagerIswriteable(DbPage *pPg){ ** on the given page is unused. The pager marks the page as clean so ** that it does not get written to disk. ** -** Tests show that this optimization can quadruple the speed of large +** Tests show that this optimization can quadruple the speed of large ** DELETE operations. ** ** This optimization cannot be used with a temp-file, as the page may ** have been dirty at the start of the transaction. In that case, if -** memory pressure forces page pPg out of the cache, the data does need -** to be written out to disk so that it may be read back in if the +** memory pressure forces page pPg out of the cache, the data does need +** to be written out to disk so that it may be read back in if the ** current transaction is rolled back. */ SQLITE_PRIVATE void sqlite3PagerDontWrite(PgHdr *pPg){ @@ -57014,17 +57014,17 @@ SQLITE_PRIVATE void sqlite3PagerDontWrite(PgHdr *pPg){ } /* -** This routine is called to increment the value of the database file -** change-counter, stored as a 4-byte big-endian integer starting at +** This routine is called to increment the value of the database file +** change-counter, stored as a 4-byte big-endian integer starting at ** byte offset 24 of the pager file. The secondary change counter at ** 92 is also updated, as is the SQLite version number at offset 96. ** ** But this only happens if the pPager->changeCountDone flag is false. ** To avoid excess churning of page 1, the update only happens once. -** See also the pager_write_changecounter() routine that does an +** See also the pager_write_changecounter() routine that does an ** unconditional update of the change counters. ** -** If the isDirectMode flag is zero, then this is done by calling +** If the isDirectMode flag is zero, then this is done by calling ** sqlite3PagerWrite() on page 1, then modifying the contents of the ** page data. In this case the file will be updated when the current ** transaction is committed. @@ -57032,7 +57032,7 @@ SQLITE_PRIVATE void sqlite3PagerDontWrite(PgHdr *pPg){ ** The isDirectMode flag may only be non-zero if the library was compiled ** with the SQLITE_ENABLE_ATOMIC_WRITE macro defined. In this case, ** if isDirect is non-zero, then the database file is updated directly -** by writing an updated version of page 1 using a call to the +** by writing an updated version of page 1 using a call to the ** sqlite3OsWrite() function. */ static int pager_incr_changecounter(Pager *pPager, int isDirectMode){ @@ -57071,7 +57071,7 @@ static int pager_incr_changecounter(Pager *pPager, int isDirectMode){ assert( pPgHdr==0 || rc==SQLITE_OK ); /* If page one was fetched successfully, and this function is not - ** operating in direct-mode, make page 1 writable. When not in + ** operating in direct-mode, make page 1 writable. When not in ** direct mode, page 1 is always held in cache and hence the PagerGet() ** above is always successful - hence the ALWAYS on rc==SQLITE_OK. */ @@ -57132,22 +57132,22 @@ SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager, const char *zMaster){ /* ** This function may only be called while a write-transaction is active in -** rollback. If the connection is in WAL mode, this call is a no-op. -** Otherwise, if the connection does not already have an EXCLUSIVE lock on +** rollback. If the connection is in WAL mode, this call is a no-op. +** Otherwise, if the connection does not already have an EXCLUSIVE lock on ** the database file, an attempt is made to obtain one. ** ** If the EXCLUSIVE lock is already held or the attempt to obtain it is ** successful, or the connection is in WAL mode, SQLITE_OK is returned. -** Otherwise, either SQLITE_BUSY or an SQLITE_IOERR_XXX error code is +** Otherwise, either SQLITE_BUSY or an SQLITE_IOERR_XXX error code is ** returned. */ SQLITE_PRIVATE int sqlite3PagerExclusiveLock(Pager *pPager){ int rc = pPager->errCode; assert( assert_pager_state(pPager) ); if( rc==SQLITE_OK ){ - assert( pPager->eState==PAGER_WRITER_CACHEMOD - || pPager->eState==PAGER_WRITER_DBMOD - || pPager->eState==PAGER_WRITER_LOCKED + assert( pPager->eState==PAGER_WRITER_CACHEMOD + || pPager->eState==PAGER_WRITER_DBMOD + || pPager->eState==PAGER_WRITER_LOCKED ); assert( assert_pager_state(pPager) ); if( 0==pagerUseWal(pPager) ){ @@ -57167,12 +57167,12 @@ SQLITE_PRIVATE int sqlite3PagerExclusiveLock(Pager *pPager){ ** ** * The database file change-counter is updated, ** * the journal is synced (unless the atomic-write optimization is used), -** * all dirty pages are written to the database file, +** * all dirty pages are written to the database file, ** * the database file is truncated (if required), and -** * the database file synced. +** * the database file synced. ** -** The only thing that remains to commit the transaction is to finalize -** (delete, truncate or zero the first part of) the journal file (or +** The only thing that remains to commit the transaction is to finalize +** (delete, truncate or zero the first part of) the journal file (or ** delete the master journal file if specified). ** ** Note that if zMaster==NULL, this does not overwrite a previous value @@ -57203,7 +57203,7 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne( /* Provide the ability to easily simulate an I/O error during testing */ if( sqlite3FaultSim(400) ) return SQLITE_IOERR; - PAGERTRACE(("DATABASE SYNC: File=%s zMaster=%s nSize=%d\n", + PAGERTRACE(("DATABASE SYNC: File=%s zMaster=%s nSize=%d\n", pPager->zFilename, zMaster, pPager->dbSize)); /* If no database changes have been made, return early. */ @@ -57254,11 +57254,11 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne( #ifdef SQLITE_ENABLE_ATOMIC_WRITE /* The following block updates the change-counter. Exactly how it ** does this depends on whether or not the atomic-update optimization - ** was enabled at compile time, and if this transaction meets the - ** runtime criteria to use the operation: + ** was enabled at compile time, and if this transaction meets the + ** runtime criteria to use the operation: ** ** * The file-system supports the atomic-write property for - ** blocks of size page-size, and + ** blocks of size page-size, and ** * This commit is not part of a multi-file transaction, and ** * Exactly one page has been modified and store in the journal file. ** @@ -57268,7 +57268,7 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne( ** is not applicable to this transaction, call sqlite3JournalCreate() ** to make sure the journal file has actually been created, then call ** pager_incr_changecounter() to update the change-counter in indirect - ** mode. + ** mode. ** ** Otherwise, if the optimization is both enabled and applicable, ** then call pager_incr_changecounter() to update the change-counter @@ -57277,19 +57277,19 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne( */ if( bBatch==0 ){ PgHdr *pPg; - assert( isOpen(pPager->jfd) - || pPager->journalMode==PAGER_JOURNALMODE_OFF - || pPager->journalMode==PAGER_JOURNALMODE_WAL + assert( isOpen(pPager->jfd) + || pPager->journalMode==PAGER_JOURNALMODE_OFF + || pPager->journalMode==PAGER_JOURNALMODE_WAL ); - if( !zMaster && isOpen(pPager->jfd) - && pPager->journalOff==jrnlBufferSize(pPager) + if( !zMaster && isOpen(pPager->jfd) + && pPager->journalOff==jrnlBufferSize(pPager) && pPager->dbSize>=pPager->dbOrigSize && (!(pPg = sqlite3PcacheDirtyList(pPager->pPCache)) || 0==pPg->pDirty) ){ - /* Update the db file change counter via the direct-write method. The - ** following call will modify the in-memory representation of page 1 - ** to include the updated change counter and then write page 1 - ** directly to the database file. Because of the atomic-write + /* Update the db file change counter via the direct-write method. The + ** following call will modify the in-memory representation of page 1 + ** to include the updated change counter and then write page 1 + ** directly to the database file. Because of the atomic-write ** property of the host file-system, this is safe. */ rc = pager_incr_changecounter(pPager, 1); @@ -57311,24 +57311,24 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne( rc = pager_incr_changecounter(pPager, 0); #endif /* !SQLITE_ENABLE_ATOMIC_WRITE */ if( rc!=SQLITE_OK ) goto commit_phase_one_exit; - - /* Write the master journal name into the journal file. If a master - ** journal file name has already been written to the journal file, + + /* Write the master journal name into the journal file. If a master + ** journal file name has already been written to the journal file, ** or if zMaster is NULL (no master journal), then this call is a no-op. */ rc = writeMasterJournal(pPager, zMaster); if( rc!=SQLITE_OK ) goto commit_phase_one_exit; - + /* Sync the journal file and write all dirty pages to the database. - ** If the atomic-update optimization is being used, this sync will not + ** If the atomic-update optimization is being used, this sync will not ** create the journal file or perform any real IO. ** ** Because the change-counter page was just modified, unless the ** atomic-update optimization is used it is almost certain that the ** journal requires a sync here. However, in locking_mode=exclusive - ** on a system under memory pressure it is just possible that this is + ** on a system under memory pressure it is just possible that this is ** not the case. In this case it is likely enough that the redundant - ** xSync() call will be changed to a no-op by the OS anyhow. + ** xSync() call will be changed to a no-op by the OS anyhow. */ rc = syncJournal(pPager, 0); if( rc!=SQLITE_OK ) goto commit_phase_one_exit; @@ -57369,7 +57369,7 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne( } sqlite3PcacheCleanAll(pPager->pPCache); - /* If the file on disk is smaller than the database image, use + /* If the file on disk is smaller than the database image, use ** pager_truncate to grow the file here. This can happen if the database ** image was extended as part of the current transaction and then the ** last page in the db image moved to the free-list. In this case the @@ -57381,7 +57381,7 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne( rc = pager_truncate(pPager, nNew); if( rc!=SQLITE_OK ) goto commit_phase_one_exit; } - + /* Finally, sync the database file. */ if( !noSync ){ rc = sqlite3PagerSync(pPager, zMaster); @@ -57401,12 +57401,12 @@ commit_phase_one_exit: /* ** When this function is called, the database file has been completely ** updated to reflect the changes made by the current transaction and -** synced to disk. The journal file still exists in the file-system +** synced to disk. The journal file still exists in the file-system ** though, and if a failure occurs at this point it will eventually ** be used as a hot-journal and the current transaction rolled back. ** -** This function finalizes the journal file, either by deleting, -** truncating or partially zeroing it, so that it cannot be used +** This function finalizes the journal file, either by deleting, +** truncating or partially zeroing it, so that it cannot be used ** for hot-journal rollback. Once this is done the transaction is ** irrevocably committed. ** @@ -57431,15 +57431,15 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager *pPager){ ** this transaction, the pager is running in exclusive-mode and is ** using persistent journals, then this function is a no-op. ** - ** The start of the journal file currently contains a single journal + ** The start of the journal file currently contains a single journal ** header with the nRec field set to 0. If such a journal is used as ** a hot-journal during hot-journal rollback, 0 changes will be made - ** to the database file. So there is no need to zero the journal + ** to the database file. So there is no need to zero the journal ** header. Since the pager is in exclusive mode, there is no need ** to drop any locks either. */ - if( pPager->eState==PAGER_WRITER_LOCKED - && pPager->exclusiveMode + if( pPager->eState==PAGER_WRITER_LOCKED + && pPager->exclusiveMode && pPager->journalMode==PAGER_JOURNALMODE_PERSIST ){ assert( pPager->journalOff==JOURNAL_HDR_SZ(pPager) || !pPager->journalOff ); @@ -57454,7 +57454,7 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager *pPager){ } /* -** If a write transaction is open, then all changes made within the +** If a write transaction is open, then all changes made within the ** transaction are reverted and the current write-transaction is closed. ** The pager falls back to PAGER_READER state if successful, or PAGER_ERROR ** state if an error occurs. @@ -57464,14 +57464,14 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager *pPager){ ** ** Otherwise, in rollback mode, this function performs two functions: ** -** 1) It rolls back the journal file, restoring all database file and +** 1) It rolls back the journal file, restoring all database file and ** in-memory cache pages to the state they were in when the transaction ** was opened, and ** ** 2) It finalizes the journal file, so that it is not used for hot ** rollback at any point in the future. ** -** Finalization of the journal file (task 2) is only performed if the +** Finalization of the journal file (task 2) is only performed if the ** rollback is successful. ** ** In WAL mode, all cache-entries containing data modified within the @@ -57484,7 +57484,7 @@ SQLITE_PRIVATE int sqlite3PagerRollback(Pager *pPager){ PAGERTRACE(("ROLLBACK %d\n", PAGERID(pPager))); /* PagerRollback() is a no-op if called in READER or OPEN state. If - ** the pager is already in the ERROR state, the rollback is not + ** the pager is already in the ERROR state, the rollback is not ** attempted here. Instead, the error code is returned to the caller. */ assert( assert_pager_state(pPager) ); @@ -57500,7 +57500,7 @@ SQLITE_PRIVATE int sqlite3PagerRollback(Pager *pPager){ int eState = pPager->eState; rc = pager_end_transaction(pPager, 0, 0); if( !MEMDB && eState>PAGER_WRITER_LOCKED ){ - /* This can happen using journal_mode=off. Move the pager to the error + /* This can happen using journal_mode=off. Move the pager to the error ** state to indicate that the contents of the cache may not be trusted. ** Any active readers will get SQLITE_ABORT. */ @@ -57515,7 +57515,7 @@ SQLITE_PRIVATE int sqlite3PagerRollback(Pager *pPager){ assert( pPager->eState==PAGER_READER || rc!=SQLITE_OK ); assert( rc==SQLITE_OK || rc==SQLITE_FULL || rc==SQLITE_CORRUPT - || rc==SQLITE_NOMEM || (rc&0xFF)==SQLITE_IOERR + || rc==SQLITE_NOMEM || (rc&0xFF)==SQLITE_IOERR || rc==SQLITE_CANTOPEN ); @@ -57589,8 +57589,8 @@ SQLITE_PRIVATE int *sqlite3PagerStats(Pager *pPager){ ** it was added later. ** ** Before returning, *pnVal is incremented by the -** current cache hit or miss count, according to the value of eStat. If the -** reset parameter is non-zero, the cache hit or miss count is zeroed before +** current cache hit or miss count, according to the value of eStat. If the +** reset parameter is non-zero, the cache hit or miss count is zeroed before ** returning. */ SQLITE_PRIVATE void sqlite3PagerCacheStat(Pager *pPager, int eStat, int reset, int *pnVal){ @@ -57626,7 +57626,7 @@ SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager *pPager){ ** to make up the difference. If the number of savepoints is already ** equal to nSavepoint, then this function is a no-op. ** -** If a memory allocation fails, SQLITE_NOMEM is returned. If an error +** If a memory allocation fails, SQLITE_NOMEM is returned. If an error ** occurs while opening the sub-journal file, then an IO error code is ** returned. Otherwise, SQLITE_OK. */ @@ -57641,7 +57641,7 @@ static SQLITE_NOINLINE int pagerOpenSavepoint(Pager *pPager, int nSavepoint){ assert( nSavepoint>nCurrent && pPager->useJournal ); /* Grow the Pager.aSavepoint array using realloc(). Return SQLITE_NOMEM - ** if the allocation fails. Otherwise, zero the new portion in case a + ** if the allocation fails. Otherwise, zero the new portion in case a ** malloc failure occurs while populating it in the for(...) loop below. */ aNew = (PagerSavepoint *)sqlite3Realloc( @@ -57689,7 +57689,7 @@ SQLITE_PRIVATE int sqlite3PagerOpenSavepoint(Pager *pPager, int nSavepoint){ /* ** This function is called to rollback or release (commit) a savepoint. -** The savepoint to release or rollback need not be the most recently +** The savepoint to release or rollback need not be the most recently ** created savepoint. ** ** Parameter op is always either SAVEPOINT_ROLLBACK or SAVEPOINT_RELEASE. @@ -57697,29 +57697,29 @@ SQLITE_PRIVATE int sqlite3PagerOpenSavepoint(Pager *pPager, int nSavepoint){ ** index iSavepoint. If it is SAVEPOINT_ROLLBACK, then rollback all changes ** that have occurred since the specified savepoint was created. ** -** The savepoint to rollback or release is identified by parameter +** The savepoint to rollback or release is identified by parameter ** iSavepoint. A value of 0 means to operate on the outermost savepoint ** (the first created). A value of (Pager.nSavepoint-1) means operate ** on the most recently created savepoint. If iSavepoint is greater than ** (Pager.nSavepoint-1), then this function is a no-op. ** ** If a negative value is passed to this function, then the current -** transaction is rolled back. This is different to calling +** transaction is rolled back. This is different to calling ** sqlite3PagerRollback() because this function does not terminate -** the transaction or unlock the database, it just restores the -** contents of the database to its original state. +** the transaction or unlock the database, it just restores the +** contents of the database to its original state. ** -** In any case, all savepoints with an index greater than iSavepoint +** In any case, all savepoints with an index greater than iSavepoint ** are destroyed. If this is a release operation (op==SAVEPOINT_RELEASE), ** then savepoint iSavepoint is also destroyed. ** ** This function may return SQLITE_NOMEM if a memory allocation fails, -** or an IO error code if an IO error occurs while rolling back a +** or an IO error code if an IO error occurs while rolling back a ** savepoint. If no errors occur, SQLITE_OK is returned. -*/ +*/ SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){ int rc = pPager->errCode; - + #ifdef SQLITE_ENABLE_ZIPVFS if( op==SAVEPOINT_RELEASE ) rc = SQLITE_OK; #endif @@ -57732,7 +57732,7 @@ SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){ int nNew; /* Number of remaining savepoints after this op. */ /* Figure out how many savepoints will still be active after this - ** operation. Store this value in nNew. Then free resources associated + ** operation. Store this value in nNew. Then free resources associated ** with any savepoints that are destroyed by this operation. */ nNew = iSavepoint + (( op==SAVEPOINT_RELEASE ) ? 0 : 1); @@ -57741,7 +57741,7 @@ SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){ } pPager->nSavepoint = nNew; - /* If this is a release of the outermost savepoint, truncate + /* If this is a release of the outermost savepoint, truncate ** the sub-journal to zero bytes in size. */ if( op==SAVEPOINT_RELEASE ){ if( nNew==0 && isOpen(pPager->sjfd) ){ @@ -57763,14 +57763,14 @@ SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){ rc = pagerPlaybackSavepoint(pPager, pSavepoint); assert(rc!=SQLITE_DONE); } - + #ifdef SQLITE_ENABLE_ZIPVFS - /* If the cache has been modified but the savepoint cannot be rolled + /* If the cache has been modified but the savepoint cannot be rolled ** back journal_mode=off, put the pager in the error state. This way, ** if the VFS used by this pager includes ZipVFS, the entire transaction ** can be rolled back at the ZipVFS level. */ - else if( - pPager->journalMode==PAGER_JOURNALMODE_OFF + else if( + pPager->journalMode==PAGER_JOURNALMODE_OFF && pPager->eState>=PAGER_WRITER_CACHEMOD ){ pPager->errCode = SQLITE_ABORT; @@ -57909,8 +57909,8 @@ SQLITE_PRIVATE int sqlite3PagerState(Pager *pPager){ ** transaction is active). ** ** If the fourth argument, isCommit, is non-zero, then this page is being -** moved as part of a database reorganization just before the transaction -** is being committed. In this case, it is guaranteed that the database page +** moved as part of a database reorganization just before the transaction +** is being committed. In this case, it is guaranteed that the database page ** pPg refers to will not be written to again within this transaction. ** ** This function may return SQLITE_NOMEM or an IO error code if an error @@ -57938,7 +57938,7 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i } /* If the page being moved is dirty and has not been saved by the latest - ** savepoint, then save the current contents of the page into the + ** savepoint, then save the current contents of the page into the ** sub-journal now. This is required to handle the following scenario: ** ** BEGIN; @@ -57961,7 +57961,7 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i return rc; } - PAGERTRACE(("MOVE %d page %d (needSync=%d) moves to %d\n", + PAGERTRACE(("MOVE %d page %d (needSync=%d) moves to %d\n", PAGERID(pPager), pPg->pgno, (pPg->flags&PGHDR_NEED_SYNC)?1:0, pgno)); IOTRACE(("MOVE %p %d %d\n", pPager, pPg->pgno, pgno)) @@ -57969,7 +57969,7 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i ** be written to, store pPg->pgno in local variable needSyncPgno. ** ** If the isCommit flag is set, there is no need to remember that - ** the journal needs to be sync()ed before database page pPg->pgno + ** the journal needs to be sync()ed before database page pPg->pgno ** can be written to. The caller has already promised not to write to it. */ if( (pPg->flags&PGHDR_NEED_SYNC) && !isCommit ){ @@ -57980,8 +57980,8 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i } /* If the cache contains a page with page-number pgno, remove it - ** from its hash chain. Also, if the PGHDR_NEED_SYNC flag was set for - ** page pgno before the 'move' operation, it needs to be retained + ** from its hash chain. Also, if the PGHDR_NEED_SYNC flag was set for + ** page pgno before the 'move' operation, it needs to be retained ** for the page moved there. */ pPg->flags &= ~PGHDR_NEED_SYNC; @@ -58016,9 +58016,9 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i } if( needSyncPgno ){ - /* If needSyncPgno is non-zero, then the journal file needs to be + /* If needSyncPgno is non-zero, then the journal file needs to be ** sync()ed before any data is written to database file page needSyncPgno. - ** Currently, no such page exists in the page-cache and the + ** Currently, no such page exists in the page-cache and the ** "is journaled" bitvec flag has been set. This needs to be remedied by ** loading the page into the pager-cache and setting the PGHDR_NEED_SYNC ** flag. @@ -58049,9 +58049,9 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i #endif /* -** The page handle passed as the first argument refers to a dirty page -** with a page number other than iNew. This function changes the page's -** page number to iNew and sets the value of the PgHdr.flags field to +** The page handle passed as the first argument refers to a dirty page +** with a page number other than iNew. This function changes the page's +** page number to iNew and sets the value of the PgHdr.flags field to ** the value passed as the third parameter. */ SQLITE_PRIVATE void sqlite3PagerRekey(DbPage *pPg, Pgno iNew, u16 flags){ @@ -58069,7 +58069,7 @@ SQLITE_PRIVATE void *sqlite3PagerGetData(DbPage *pPg){ } /* -** Return a pointer to the Pager.nExtra bytes of "extra" space +** Return a pointer to the Pager.nExtra bytes of "extra" space ** allocated along with the specified page. */ SQLITE_PRIVATE void *sqlite3PagerGetExtra(DbPage *pPg){ @@ -58078,7 +58078,7 @@ SQLITE_PRIVATE void *sqlite3PagerGetExtra(DbPage *pPg){ /* ** Get/set the locking-mode for this pager. Parameter eMode must be one -** of PAGER_LOCKINGMODE_QUERY, PAGER_LOCKINGMODE_NORMAL or +** of PAGER_LOCKINGMODE_QUERY, PAGER_LOCKINGMODE_NORMAL or ** PAGER_LOCKINGMODE_EXCLUSIVE. If the parameter is not _QUERY, then ** the locking-mode is set to the value specified. ** @@ -58126,8 +58126,8 @@ SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *pPager, int eMode){ assert( eMode==PAGER_JOURNALMODE_DELETE || eMode==PAGER_JOURNALMODE_TRUNCATE || eMode==PAGER_JOURNALMODE_PERSIST - || eMode==PAGER_JOURNALMODE_OFF - || eMode==PAGER_JOURNALMODE_WAL + || eMode==PAGER_JOURNALMODE_OFF + || eMode==PAGER_JOURNALMODE_WAL || eMode==PAGER_JOURNALMODE_MEMORY ); /* This routine is only called from the OP_JournalMode opcode, and @@ -58313,7 +58313,7 @@ static int pagerExclusiveLock(Pager *pPager){ assert( pPager->eLock==SHARED_LOCK || pPager->eLock==EXCLUSIVE_LOCK ); rc = pagerLockDb(pPager, EXCLUSIVE_LOCK); if( rc!=SQLITE_OK ){ - /* If the attempt to grab the exclusive lock failed, release the + /* If the attempt to grab the exclusive lock failed, release the ** pending lock that may have been obtained instead. */ pagerUnlockDb(pPager, SHARED_LOCK); } @@ -58322,7 +58322,7 @@ static int pagerExclusiveLock(Pager *pPager){ } /* -** Call sqlite3WalOpen() to open the WAL handle. If the pager is in +** Call sqlite3WalOpen() to open the WAL handle. If the pager is in ** exclusive-locking mode when this function is called, take an EXCLUSIVE ** lock on the database file and use heap-memory to store the wal-index ** in. Otherwise, use the normal shared-memory. @@ -58333,8 +58333,8 @@ static int pagerOpenWal(Pager *pPager){ assert( pPager->pWal==0 && pPager->tempFile==0 ); assert( pPager->eLock==SHARED_LOCK || pPager->eLock==EXCLUSIVE_LOCK ); - /* If the pager is already in exclusive-mode, the WAL module will use - ** heap-memory for the wal-index instead of the VFS shared-memory + /* If the pager is already in exclusive-mode, the WAL module will use + ** heap-memory for the wal-index instead of the VFS shared-memory ** implementation. Take the exclusive lock now, before opening the WAL ** file, to make sure this is safe. */ @@ -58342,7 +58342,7 @@ static int pagerOpenWal(Pager *pPager){ rc = pagerExclusiveLock(pPager); } - /* Open the connection to the log file. If this operation fails, + /* Open the connection to the log file. If this operation fails, ** (e.g. due to malloc() failure), return an error code. */ if( rc==SQLITE_OK ){ @@ -58364,7 +58364,7 @@ static int pagerOpenWal(Pager *pPager){ ** If the pager passed as the first argument is open on a real database ** file (not a temp file or an in-memory database), and the WAL file ** is not already open, make an attempt to open it now. If successful, -** return SQLITE_OK. If an error occurs or the VFS used by the pager does +** return SQLITE_OK. If an error occurs or the VFS used by the pager does ** not support the xShmXXX() methods, return an error code. *pbOpen is ** not modified in either case. ** @@ -58406,7 +58406,7 @@ SQLITE_PRIVATE int sqlite3PagerOpenWal( ** This function is called to close the connection to the log file prior ** to switching from WAL to rollback mode. ** -** Before closing the log file, this function attempts to take an +** Before closing the log file, this function attempts to take an ** EXCLUSIVE lock on the database file. If this cannot be obtained, an ** error (SQLITE_BUSY) is returned and the log connection is not closed. ** If successful, the EXCLUSIVE lock is not released before returning. @@ -58432,7 +58432,7 @@ SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager, sqlite3 *db){ rc = pagerOpenWal(pPager); } } - + /* Checkpoint and close the log. Because an EXCLUSIVE lock is held on ** the database file, the log and log-summary files will be deleted. */ @@ -58464,7 +58464,7 @@ SQLITE_PRIVATE int sqlite3PagerSnapshotGet(Pager *pPager, sqlite3_snapshot **ppS /* ** If this is a WAL database, store a pointer to pSnapshot. Next time a -** read transaction is opened, attempt to read from the snapshot it +** read transaction is opened, attempt to read from the snapshot it ** identifies. If this is not a WAL database, return an error. */ SQLITE_PRIVATE int sqlite3PagerSnapshotOpen(Pager *pPager, sqlite3_snapshot *pSnapshot){ @@ -58478,7 +58478,7 @@ SQLITE_PRIVATE int sqlite3PagerSnapshotOpen(Pager *pPager, sqlite3_snapshot *pSn } /* -** If this is a WAL database, call sqlite3WalSnapshotRecover(). If this +** If this is a WAL database, call sqlite3WalSnapshotRecover(). If this ** is not a WAL database, return an error. */ SQLITE_PRIVATE int sqlite3PagerSnapshotRecover(Pager *pPager){ @@ -58495,7 +58495,7 @@ SQLITE_PRIVATE int sqlite3PagerSnapshotRecover(Pager *pPager){ ** The caller currently has a read transaction open on the database. ** If this is not a WAL database, SQLITE_ERROR is returned. Otherwise, ** this function takes a SHARED lock on the CHECKPOINTER slot and then -** checks if the snapshot passed as the second argument is still +** checks if the snapshot passed as the second argument is still ** available. If so, SQLITE_OK is returned. ** ** If the snapshot is not available, SQLITE_ERROR is returned. Or, if @@ -58555,7 +58555,7 @@ SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager){ ** ************************************************************************* ** -** This file contains the implementation of a write-ahead log (WAL) used in +** This file contains the implementation of a write-ahead log (WAL) used in ** "journal_mode=WAL" mode. ** ** WRITE-AHEAD LOG (WAL) FILE FORMAT @@ -58564,7 +58564,7 @@ SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager){ ** Each frame records the revised content of a single page from the ** database file. All changes to the database are recorded by writing ** frames into the WAL. Transactions commit when a frame is written that -** contains a commit marker. A single WAL can and usually does record +** contains a commit marker. A single WAL can and usually does record ** multiple transactions. Periodically, the content of the WAL is ** transferred back into the database file in an operation called a ** "checkpoint". @@ -58590,11 +58590,11 @@ SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager){ ** ** Immediately following the wal-header are zero or more frames. Each ** frame consists of a 24-byte frame-header followed by a bytes -** of page data. The frame-header is six big-endian 32-bit unsigned +** of page data. The frame-header is six big-endian 32-bit unsigned ** integer values, as follows: ** ** 0: Page number. -** 4: For commit records, the size of the database image in pages +** 4: For commit records, the size of the database image in pages ** after the commit. For all other records, zero. ** 8: Salt-1 (copied from the header) ** 12: Salt-2 (copied from the header) @@ -58620,7 +58620,7 @@ SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager){ ** the checksum. The checksum is computed by interpreting the input as ** an even number of unsigned 32-bit integers: x[0] through x[N]. The ** algorithm used for the checksum is as follows: -** +** ** for i from 0 to n-1 step 2: ** s0 += x[i] + s1; ** s1 += x[i+1] + s0; @@ -58628,7 +58628,7 @@ SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager){ ** ** Note that s0 and s1 are both weighted checksums using fibonacci weights ** in reverse order (the largest fibonacci weight occurs on the first element -** of the sequence being summed.) The s1 value spans all 32-bit +** of the sequence being summed.) The s1 value spans all 32-bit ** terms of the sequence whereas s0 omits the final term. ** ** On a checkpoint, the WAL is first VFS.xSync-ed, then valid content of the @@ -58661,19 +58661,19 @@ SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager){ ** multiple concurrent readers to view different versions of the database ** content simultaneously. ** -** The reader algorithm in the previous paragraphs works correctly, but +** The reader algorithm in the previous paragraphs works correctly, but ** because frames for page P can appear anywhere within the WAL, the ** reader has to scan the entire WAL looking for page P frames. If the ** WAL is large (multiple megabytes is typical) that scan can be slow, ** and read performance suffers. To overcome this problem, a separate ** data structure called the wal-index is maintained to expedite the ** search for frames of a particular page. -** +** ** WAL-INDEX FORMAT ** ** Conceptually, the wal-index is shared memory, though VFS implementations ** might choose to implement the wal-index using a mmapped file. Because -** the wal-index is shared memory, SQLite does not support journal_mode=WAL +** the wal-index is shared memory, SQLite does not support journal_mode=WAL ** on a network filesystem. All users of the database must be able to ** share memory. ** @@ -58691,28 +58691,28 @@ SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager){ ** byte order of the host computer. ** ** The purpose of the wal-index is to answer this question quickly: Given -** a page number P and a maximum frame index M, return the index of the +** a page number P and a maximum frame index M, return the index of the ** last frame in the wal before frame M for page P in the WAL, or return ** NULL if there are no frames for page P in the WAL prior to M. ** ** The wal-index consists of a header region, followed by an one or -** more index blocks. +** more index blocks. ** ** The wal-index header contains the total number of frames within the WAL ** in the mxFrame field. ** -** Each index block except for the first contains information on +** Each index block except for the first contains information on ** HASHTABLE_NPAGE frames. The first index block contains information on -** HASHTABLE_NPAGE_ONE frames. The values of HASHTABLE_NPAGE_ONE and +** HASHTABLE_NPAGE_ONE frames. The values of HASHTABLE_NPAGE_ONE and ** HASHTABLE_NPAGE are selected so that together the wal-index header and ** first index block are the same size as all other index blocks in the ** wal-index. ** ** Each index block contains two sections, a page-mapping that contains the -** database page number associated with each wal frame, and a hash-table +** database page number associated with each wal frame, and a hash-table ** that allows readers to query an index block for a specific page number. ** The page-mapping is an array of HASHTABLE_NPAGE (or HASHTABLE_NPAGE_ONE -** for the first index block) 32-bit page numbers. The first entry in the +** for the first index block) 32-bit page numbers. The first entry in the ** first index-block contains the database page number corresponding to the ** first frame in the WAL file. The first entry in the second index block ** in the WAL file corresponds to the (HASHTABLE_NPAGE_ONE+1)th frame in @@ -58733,8 +58733,8 @@ SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager){ ** ** The hash table consists of HASHTABLE_NSLOT 16-bit unsigned integers. ** HASHTABLE_NSLOT = 2*HASHTABLE_NPAGE, and there is one entry in the -** hash table for each page number in the mapping section, so the hash -** table is never more than half full. The expected number of collisions +** hash table for each page number in the mapping section, so the hash +** table is never more than half full. The expected number of collisions ** prior to finding a match is 1. Each entry of the hash table is an ** 1-based index of an entry in the mapping section of the same ** index block. Let K be the 1-based index of the largest entry in @@ -58753,12 +58753,12 @@ SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager){ ** reached) until an unused hash slot is found. Let the first unused slot ** be at index iUnused. (iUnused might be less than iKey if there was ** wrap-around.) Because the hash table is never more than half full, -** the search is guaranteed to eventually hit an unused entry. Let +** the search is guaranteed to eventually hit an unused entry. Let ** iMax be the value between iKey and iUnused, closest to iUnused, ** where aHash[iMax]==P. If there is no iMax entry (if there exists ** no hash slot such that aHash[i]==p) then page P is not in the ** current index block. Otherwise the iMax-th mapping entry of the -** current index block corresponds to the last entry that references +** current index block corresponds to the last entry that references ** page P. ** ** A hash search begins with the last index block and moves toward the @@ -58783,7 +58783,7 @@ SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager){ ** if no values greater than K0 had ever been inserted into the hash table ** in the first place - which is what reader one wants. Meanwhile, the ** second reader using K1 will see additional values that were inserted -** later, which is exactly what reader two wants. +** later, which is exactly what reader two wants. ** ** When a rollback occurs, the value of K is decreased. Hash table entries ** that correspond to frames greater than the new K value are removed @@ -58823,7 +58823,7 @@ SQLITE_PRIVATE int sqlite3WalTrace = 0; ** values in the wal-header are correct and (b) the version field is not ** WAL_MAX_VERSION, recovery fails and SQLite returns SQLITE_CANTOPEN. ** -** Similarly, if a client successfully reads a wal-index header (i.e. the +** Similarly, if a client successfully reads a wal-index header (i.e. the ** checksum test is successful) and finds that the version field is not ** WALINDEX_MAX_VERSION, then no read-transaction is opened and SQLite ** returns SQLITE_CANTOPEN. @@ -58870,7 +58870,7 @@ typedef struct WalCkptInfo WalCkptInfo; ** ** The szPage value can be any power of 2 between 512 and 32768, inclusive. ** Or it can be 1 to represent a 65536-byte page. The latter case was -** added in 3.7.1 when support for 64K pages was added. +** added in 3.7.1 when support for 64K pages was added. */ struct WalIndexHdr { u32 iVersion; /* Wal-index version */ @@ -58912,7 +58912,7 @@ struct WalIndexHdr { ** There is one entry in aReadMark[] for each reader lock. If a reader ** holds read-lock K, then the value in aReadMark[K] is no greater than ** the mxFrame for that reader. The value READMARK_NOT_USED (0xffffffff) -** for any aReadMark[] means that entry is unused. aReadMark[0] is +** for any aReadMark[] means that entry is unused. aReadMark[0] is ** a special case; its value is never used and it exists as a place-holder ** to avoid having to offset aReadMark[] indexs by one. Readers holding ** WAL_READ_LOCK(0) always ignore the entire WAL and read all content @@ -58932,7 +58932,7 @@ struct WalIndexHdr { ** previous sentence is when nBackfill equals mxFrame (meaning that everything ** in the WAL has been backfilled into the database) then new readers ** will choose aReadMark[0] which has value 0 and hence such reader will -** get all their all content directly from the database file and ignore +** get all their all content directly from the database file and ignore ** the WAL. ** ** Writers normally append new frames to the end of the WAL. However, @@ -58974,14 +58974,14 @@ struct WalCkptInfo { ** big-endian format in the first 4 bytes of a WAL file. ** ** If the LSB is set, then the checksums for each frame within the WAL -** file are calculated by treating all data as an array of 32-bit -** big-endian words. Otherwise, they are calculated by interpreting +** file are calculated by treating all data as an array of 32-bit +** big-endian words. Otherwise, they are calculated by interpreting ** all data as 32-bit little-endian words. */ #define WAL_MAGIC 0x377f0682 /* -** Return the offset of frame iFrame in the write-ahead log file, +** Return the offset of frame iFrame in the write-ahead log file, ** assuming a database page size of szPage bytes. The offset returned ** is to the start of the write-ahead log frame-header. */ @@ -59030,7 +59030,7 @@ struct Wal { ** Candidate values for Wal.exclusiveMode. */ #define WAL_NORMAL_MODE 0 -#define WAL_EXCLUSIVE_MODE 1 +#define WAL_EXCLUSIVE_MODE 1 #define WAL_HEAPMEMORY_MODE 2 /* @@ -59049,7 +59049,7 @@ typedef u16 ht_slot; /* ** This structure is used to implement an iterator that loops through ** all frames in the WAL in database page order. Where two or more frames -** correspond to the same database page, the iterator visits only the +** correspond to the same database page, the iterator visits only the ** frame most recently written to the WAL (in other words, the frame with ** the largest index). ** @@ -59085,7 +59085,7 @@ struct WalIterator { #define HASHTABLE_HASH_1 383 /* Should be prime */ #define HASHTABLE_NSLOT (HASHTABLE_NPAGE*2) /* Must be a power of 2 */ -/* +/* ** The block of page numbers associated with the first hash-table in a ** wal-index is smaller than usual. This is so that there is a complete ** hash-table on each aligned 32KB page of the wal-index. @@ -59139,7 +59139,7 @@ static SQLITE_NOINLINE int walIndexPageRealloc( pWal->apWiData[iPage] = (u32 volatile *)sqlite3MallocZero(WALINDEX_PGSZ); if( !pWal->apWiData[iPage] ) rc = SQLITE_NOMEM_BKPT; }else{ - rc = sqlite3OsShmMap(pWal->pDbFd, iPage, WALINDEX_PGSZ, + rc = sqlite3OsShmMap(pWal->pDbFd, iPage, WALINDEX_PGSZ, pWal->writeLock, (void volatile **)&pWal->apWiData[iPage] ); assert( pWal->apWiData[iPage]!=0 || rc!=SQLITE_OK || pWal->writeLock==0 ); @@ -59196,7 +59196,7 @@ static volatile WalIndexHdr *walIndexHdr(Wal *pWal){ ) /* -** Generate or extend an 8 byte checksum based on the data in +** Generate or extend an 8 byte checksum based on the data in ** array aByte[] and the initial values of aIn[0] and aIn[1] (or ** initial values of 0 and 0 if aIn==NULL). ** @@ -59269,11 +59269,11 @@ static void walIndexWriteHdr(Wal *pWal){ /* ** This function encodes a single frame header and writes it to a buffer -** supplied by the caller. A frame-header is made up of a series of +** supplied by the caller. A frame-header is made up of a series of ** 4-byte big-endian integers, as follows: ** ** 0: Page number. -** 4: For commit records, the size of the database image in pages +** 4: For commit records, the size of the database image in pages ** after the commit. For all other records, zero. ** 8: Salt-1 (copied from the wal-header) ** 12: Salt-2 (copied from the wal-header) @@ -59324,7 +59324,7 @@ static int walDecodeFrame( assert( WAL_FRAME_HDRSIZE==24 ); /* A frame is only valid if the salt values in the frame-header - ** match the salt values in the wal-header. + ** match the salt values in the wal-header. */ if( memcmp(&pWal->hdr.aSalt, &aFrame[8], 8)!=0 ){ return 0; @@ -59338,15 +59338,15 @@ static int walDecodeFrame( } /* A frame is only valid if a checksum of the WAL header, - ** all prior frams, the first 16 bytes of this frame-header, - ** and the frame-data matches the checksum in the last 8 + ** all prior frams, the first 16 bytes of this frame-header, + ** and the frame-data matches the checksum in the last 8 ** bytes of this frame-header. */ nativeCksum = (pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN); walChecksumBytes(nativeCksum, aFrame, 8, aCksum, aCksum); walChecksumBytes(nativeCksum, aData, pWal->szPage, aCksum, aCksum); - if( aCksum[0]!=sqlite3Get4byte(&aFrame[16]) - || aCksum[1]!=sqlite3Get4byte(&aFrame[20]) + if( aCksum[0]!=sqlite3Get4byte(&aFrame[16]) + || aCksum[1]!=sqlite3Get4byte(&aFrame[20]) ){ /* Checksum failed. */ return 0; @@ -59381,7 +59381,7 @@ static const char *walLockName(int lockIdx){ } } #endif /*defined(SQLITE_TEST) || defined(SQLITE_DEBUG) */ - + /* ** Set or release locks on the WAL. Locks are either shared or exclusive. @@ -59450,15 +59450,15 @@ struct WalHashLoc { u32 iZero; /* One less than the frame number of first indexed*/ }; -/* +/* ** Return pointers to the hash table and page number array stored on ** page iHash of the wal-index. The wal-index is broken into 32KB pages ** numbered starting from 0. ** ** Set output variable pLoc->aHash to point to the start of the hash table -** in the wal-index file. Set pLoc->iZero to one less than the frame +** in the wal-index file. Set pLoc->iZero to one less than the frame ** number of the first frame indexed by this hash table. If a -** slot in the hash table is set to N, it refers to frame number +** slot in the hash table is set to N, it refers to frame number ** (pLoc->iZero+N) in the log. ** ** Finally, set pLoc->aPgno so that pLoc->aPgno[1] is the page number of the @@ -59490,7 +59490,7 @@ static int walHashGet( /* ** Return the number of the wal-index page that contains the hash-table ** and page-number array that contain entries corresponding to WAL frame -** iFrame. The wal-index is broken up into 32KB pages. Wal-index pages +** iFrame. The wal-index is broken up into 32KB pages. Wal-index pages ** are numbered starting from 0. */ static int walFramePage(u32 iFrame){ @@ -59541,7 +59541,7 @@ static void walCleanupHash(Wal *pWal){ if( pWal->hdr.mxFrame==0 ) return; - /* Obtain pointers to the hash-table and page-number array containing + /* Obtain pointers to the hash-table and page-number array containing ** the entry that corresponds to frame pWal->hdr.mxFrame. It is guaranteed ** that the page said hash-table and array reside on is already mapped.(1) */ @@ -59560,9 +59560,9 @@ static void walCleanupHash(Wal *pWal){ sLoc.aHash[i] = 0; } } - + /* Zero the entries in the aPgno array that correspond to frames with - ** frame numbers greater than pWal->hdr.mxFrame. + ** frame numbers greater than pWal->hdr.mxFrame. */ nByte = (int)((char *)sLoc.aHash - (char *)&sLoc.aPgno[iLimit+1]); memset((void *)&sLoc.aPgno[iLimit+1], 0, nByte); @@ -59605,9 +59605,9 @@ static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){ idx = iFrame - sLoc.iZero; assert( idx <= HASHTABLE_NSLOT/2 + 1 ); - + /* If this is the first entry to be added to this hash-table, zero the - ** entire hash table and aPgno[] array before proceeding. + ** entire hash table and aPgno[] array before proceeding. */ if( idx==1 ){ int nByte = (int)((u8 *)&sLoc.aHash[HASHTABLE_NSLOT] @@ -59617,8 +59617,8 @@ static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){ /* If the entry in aPgno[] is already set, then the previous writer ** must have exited unexpectedly in the middle of a transaction (after - ** writing one or more dirty pages to the WAL to free up memory). - ** Remove the remnants of that writers uncommitted transaction from + ** writing one or more dirty pages to the WAL to free up memory). + ** Remove the remnants of that writers uncommitted transaction from ** the hash-table before writing any new entries. */ if( sLoc.aPgno[idx] ){ @@ -59670,7 +59670,7 @@ static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){ /* -** Recover the wal-index by reading the write-ahead log file. +** Recover the wal-index by reading the write-ahead log file. ** ** This routine first tries to establish an exclusive lock on the ** wal-index to prevent other threads/processes from doing anything @@ -59735,16 +59735,16 @@ static int walIndexRecover(Wal *pWal){ } /* If the database page size is not a power of two, or is greater than - ** SQLITE_MAX_PAGE_SIZE, conclude that the WAL file contains no valid + ** SQLITE_MAX_PAGE_SIZE, conclude that the WAL file contains no valid ** data. Similarly, if the 'magic' value is invalid, ignore the whole ** WAL file. */ magic = sqlite3Get4byte(&aBuf[0]); szPage = sqlite3Get4byte(&aBuf[8]); - if( (magic&0xFFFFFFFE)!=WAL_MAGIC - || szPage&(szPage-1) - || szPage>SQLITE_MAX_PAGE_SIZE - || szPage<512 + if( (magic&0xFFFFFFFE)!=WAL_MAGIC + || szPage&(szPage-1) + || szPage>SQLITE_MAX_PAGE_SIZE + || szPage<512 ){ goto finished; } @@ -59754,7 +59754,7 @@ static int walIndexRecover(Wal *pWal){ memcpy(&pWal->hdr.aSalt, &aBuf[16], 8); /* Verify that the WAL header checksum is correct */ - walChecksumBytes(pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN, + walChecksumBytes(pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN, aBuf, WAL_HDRSIZE-2*4, 0, pWal->hdr.aFrameCksum ); if( pWal->hdr.aFrameCksum[0]!=sqlite3Get4byte(&aBuf[24]) @@ -59818,7 +59818,7 @@ finished: pWal->hdr.aFrameCksum[1] = aFrameCksum[1]; walIndexWriteHdr(pWal); - /* Reset the checkpoint-header. This is safe because this thread is + /* Reset the checkpoint-header. This is safe because this thread is ** currently holding locks that exclude all other readers, writers and ** checkpointers. */ @@ -59865,8 +59865,8 @@ static void walIndexClose(Wal *pWal, int isDelete){ } } -/* -** Open a connection to the WAL file zWalName. The database file must +/* +** Open a connection to the WAL file zWalName. The database file must ** already be opened on connection pDbFd. The buffer that zWalName points ** to must remain valid for the lifetime of the returned Wal* handle. ** @@ -59876,7 +59876,7 @@ static void walIndexClose(Wal *pWal, int isDelete){ ** were to do this just after this client opened one of these files, the ** system would be badly broken. ** -** If the log file is successfully opened, SQLITE_OK is returned and +** If the log file is successfully opened, SQLITE_OK is returned and ** *ppWal is set to point to a new WAL handle. If an error occurs, ** an SQLite error code is returned and *ppWal is left unmodified. */ @@ -60040,7 +60040,7 @@ static void walMerge( ht_slot logpage; Pgno dbpage; - if( (iLeft=nRight || aContent[aLeft[iLeft]]aSegment[p->nSegment])[sLoc.iZero]; sLoc.iZero++; - + for(j=0; jaReadMark[i]; if( mxSafeFrame>y ){ @@ -60463,8 +60463,8 @@ static int walCheckpoint( } /* If this is an SQLITE_CHECKPOINT_RESTART or TRUNCATE operation, and the - ** entire wal file has been copied into the database file, then block - ** until all readers have finished using the wal file. This ensures that + ** entire wal file has been copied into the database file, then block + ** until all readers have finished using the wal file. This ensures that ** the next process to write to the database restarts the wal file. */ if( rc==SQLITE_OK && eMode!=SQLITE_CHECKPOINT_PASSIVE ){ @@ -60488,7 +60488,7 @@ static int walCheckpoint( ** writer clients should see that the entire log file has been ** checkpointed and behave accordingly. This seems unsafe though, ** as it would leave the system in a state where the contents of - ** the wal-index header do not match the contents of the + ** the wal-index header do not match the contents of the ** file-system. To avoid this, update the wal-index header to ** indicate that the log file contains zero valid frames. */ walRestartHdr(pWal, salt1); @@ -60550,7 +60550,7 @@ SQLITE_PRIVATE int sqlite3WalClose( if( pWal->exclusiveMode==WAL_NORMAL_MODE ){ pWal->exclusiveMode = WAL_EXCLUSIVE_MODE; } - rc = sqlite3WalCheckpoint(pWal, db, + rc = sqlite3WalCheckpoint(pWal, db, SQLITE_CHECKPOINT_PASSIVE, 0, 0, sync_flags, nBuf, zBuf, 0, 0 ); if( rc==SQLITE_OK ){ @@ -60631,7 +60631,7 @@ static int walIndexTryHdr(Wal *pWal, int *pChanged){ if( memcmp(&h1, &h2, sizeof(h1))!=0 ){ return 1; /* Dirty read */ - } + } if( h1.isInit==0 ){ return 1; /* Malformed header - probably all zeros */ } @@ -60667,7 +60667,7 @@ static int walIndexTryHdr(Wal *pWal, int *pChanged){ ** changed by this operation. If pWal->hdr is unchanged, set *pChanged ** to 0. ** -** If the wal-index header is successfully read, return SQLITE_OK. +** If the wal-index header is successfully read, return SQLITE_OK. ** Otherwise an SQLite error code. */ static int walIndexReadHdr(Wal *pWal, int *pChanged){ @@ -60675,7 +60675,7 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){ int badHdr; /* True if a header read failed */ volatile u32 *page0; /* Chunk of wal-index containing header */ - /* Ensure that page 0 of the wal-index (the page that contains the + /* Ensure that page 0 of the wal-index (the page that contains the ** wal-index header) is mapped. Return early if an error occurs here. */ assert( pChanged ); @@ -60707,7 +60707,7 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){ /* If the first page of the wal-index has been mapped, try to read the ** wal-index header immediately, without holding any lock. This usually - ** works, but may fail if the wal-index header is corrupt or currently + ** works, but may fail if the wal-index header is corrupt or currently ** being modified by another thread or process. */ badHdr = (page0 ? walIndexTryHdr(pWal, pChanged) : 1); @@ -60778,15 +60778,15 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){ ** ** The *-wal file has been read and an appropriate wal-index has been ** constructed in pWal->apWiData[] using heap memory instead of shared -** memory. +** memory. ** ** If this function returns SQLITE_OK, then the read transaction has -** been successfully opened. In this case output variable (*pChanged) +** been successfully opened. In this case output variable (*pChanged) ** is set to true before returning if the caller should discard the -** contents of the page cache before proceeding. Or, if it returns -** WAL_RETRY, then the heap memory wal-index has been discarded and -** the caller should retry opening the read transaction from the -** beginning (including attempting to map the *-shm file). +** contents of the page cache before proceeding. Or, if it returns +** WAL_RETRY, then the heap memory wal-index has been discarded and +** the caller should retry opening the read transaction from the +** beginning (including attempting to map the *-shm file). ** ** If an error occurs, an SQLite error code is returned. */ @@ -60897,8 +60897,8 @@ static int walBeginShmUnreliable(Wal *pWal, int *pChanged){ ** the caller. */ aSaveCksum[0] = pWal->hdr.aFrameCksum[0]; aSaveCksum[1] = pWal->hdr.aFrameCksum[1]; - for(iOffset=walFrameOffset(pWal->hdr.mxFrame+1, pWal->hdr.szPage); - iOffset+szFrame<=szWal; + for(iOffset=walFrameOffset(pWal->hdr.mxFrame+1, pWal->hdr.szPage); + iOffset+szFrame<=szWal; iOffset+=szFrame ){ u32 pgno; /* Database page number for frame */ @@ -60946,10 +60946,10 @@ static int walBeginShmUnreliable(Wal *pWal, int *pChanged){ ** ** The useWal parameter is true to force the use of the WAL and disable ** the case where the WAL is bypassed because it has been completely -** checkpointed. If useWal==0 then this routine calls walIndexReadHdr() -** to make a copy of the wal-index header into pWal->hdr. If the -** wal-index header has changed, *pChanged is set to 1 (as an indication -** to the caller that the local page cache is obsolete and needs to be +** checkpointed. If useWal==0 then this routine calls walIndexReadHdr() +** to make a copy of the wal-index header into pWal->hdr. If the +** wal-index header has changed, *pChanged is set to 1 (as an indication +** to the caller that the local page cache is obsolete and needs to be ** flushed.) When useWal==1, the wal-index header is assumed to already ** be loaded and the pChanged parameter is unused. ** @@ -60964,7 +60964,7 @@ static int walBeginShmUnreliable(Wal *pWal, int *pChanged){ ** bad luck when there is lots of contention for the wal-index, but that ** possibility is so small that it can be safely neglected, we believe. ** -** On success, this routine obtains a read lock on +** On success, this routine obtains a read lock on ** WAL_READ_LOCK(pWal->readLock). The pWal->readLock integer is ** in the range 0 <= pWal->readLock < WAL_NREADER. If pWal->readLock==(-1) ** that means the Wal does not hold any read lock. The reader must not @@ -61002,16 +61002,16 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ ** ** Circumstances that cause a RETRY should only last for the briefest ** instances of time. No I/O or other system calls are done while the - ** locks are held, so the locks should not be held for very long. But + ** locks are held, so the locks should not be held for very long. But ** if we are unlucky, another process that is holding a lock might get - ** paged out or take a page-fault that is time-consuming to resolve, + ** paged out or take a page-fault that is time-consuming to resolve, ** during the few nanoseconds that it is holding the lock. In that case, ** it might take longer than normal for the lock to free. ** ** After 5 RETRYs, we begin calling sqlite3OsSleep(). The first few ** calls to sqlite3OsSleep() have a delay of 1 microsecond. Really this ** is more of a scheduler yield than an actual delay. But on the 10th - ** an subsequent retries, the delays start becoming longer and longer, + ** an subsequent retries, the delays start becoming longer and longer, ** so that on the 100th (and last) RETRY we delay for 323 milliseconds. ** The total delay time before giving up is less than 10 seconds. */ @@ -61042,9 +61042,9 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ if( pWal->apWiData[0]==0 ){ /* This branch is taken when the xShmMap() method returns SQLITE_BUSY. ** We assume this is a transient condition, so return WAL_RETRY. The - ** xShmMap() implementation used by the default unix and win32 VFS - ** modules may return SQLITE_BUSY due to a race condition in the - ** code that determines whether or not the shared-memory region + ** xShmMap() implementation used by the default unix and win32 VFS + ** modules may return SQLITE_BUSY due to a race condition in the + ** code that determines whether or not the shared-memory region ** must be zeroed before the requested page is returned. */ rc = WAL_RETRY; @@ -61085,7 +61085,7 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ ** snapshot. Since holding READ_LOCK(0) prevents a checkpoint from ** happening, this is usually correct. ** - ** However, if frames have been appended to the log (or if the log + ** However, if frames have been appended to the log (or if the log ** is wrapped and written for that matter) before the READ_LOCK(0) ** is obtained, that is not necessarily true. A checkpointer may ** have started to backfill the appended frames but crashed before @@ -61166,9 +61166,9 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ ** to read any frames earlier than minFrame from the wal file - they ** can be safely read directly from the database file. ** - ** Because a ShmBarrier() call is made between taking the copy of + ** Because a ShmBarrier() call is made between taking the copy of ** nBackfill and checking that the wal-header in shared-memory still - ** matches the one cached in pWal->hdr, it is guaranteed that the + ** matches the one cached in pWal->hdr, it is guaranteed that the ** checkpointer that set nBackfill was not working with a wal-index ** header newer than that cached in pWal->hdr. If it were, that could ** cause a problem. The checkpointer could omit to checkpoint @@ -61196,15 +61196,15 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ #ifdef SQLITE_ENABLE_SNAPSHOT /* -** Attempt to reduce the value of the WalCkptInfo.nBackfillAttempted +** Attempt to reduce the value of the WalCkptInfo.nBackfillAttempted ** variable so that older snapshots can be accessed. To do this, loop -** through all wal frames from nBackfillAttempted to (nBackfill+1), +** through all wal frames from nBackfillAttempted to (nBackfill+1), ** comparing their content to the corresponding page with the database ** file, if any. Set nBackfillAttempted to the frame number of the ** first frame for which the wal file content matches the db file. ** -** This is only really safe if the file-system is such that any page -** writes made by earlier checkpointers were atomic operations, which +** This is only really safe if the file-system is such that any page +** writes made by earlier checkpointers were atomic operations, which ** is not always true. It is also possible that nBackfillAttempted ** may be left set to a value larger than expected, if a wal frame ** contains content that duplicate of an earlier version of the same @@ -61325,14 +61325,14 @@ SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ assert( pWal->readLock>0 || pWal->hdr.mxFrame==0 ); assert( pInfo->aReadMark[pWal->readLock]<=pSnapshot->mxFrame ); - /* It is possible that there is a checkpointer thread running + /* It is possible that there is a checkpointer thread running ** concurrent with this code. If this is the case, it may be that the - ** checkpointer has already determined that it will checkpoint - ** snapshot X, where X is later in the wal file than pSnapshot, but - ** has not yet set the pInfo->nBackfillAttempted variable to indicate + ** checkpointer has already determined that it will checkpoint + ** snapshot X, where X is later in the wal file than pSnapshot, but + ** has not yet set the pInfo->nBackfillAttempted variable to indicate ** its intent. To avoid the race condition this leads to, ensure that - ** there is no checkpointer process by taking a shared CKPT lock - ** before checking pInfo->nBackfillAttempted. + ** there is no checkpointer process by taking a shared CKPT lock + ** before checking pInfo->nBackfillAttempted. ** ** TODO: Does the aReadMark[] lock prevent a checkpointer from doing ** this already? @@ -61406,8 +61406,8 @@ SQLITE_PRIVATE int sqlite3WalFindFrame( /* If the "last page" field of the wal-index header snapshot is 0, then ** no data will be read from the wal under any circumstances. Return early - ** in this case as an optimization. Likewise, if pWal->readLock==0, - ** then the WAL is ignored by the reader so return early, as if the + ** in this case as an optimization. Likewise, if pWal->readLock==0, + ** then the WAL is ignored by the reader so return early, as if the ** WAL were empty. */ if( iLast==0 || (pWal->readLock==0 && pWal->bShmUnreliable==0) ){ @@ -61420,9 +61420,9 @@ SQLITE_PRIVATE int sqlite3WalFindFrame( ** hash table (each hash table indexes up to HASHTABLE_NPAGE frames). ** ** This code might run concurrently to the code in walIndexAppend() - ** that adds entries to the wal-index (and possibly to this hash - ** table). This means the value just read from the hash - ** slot (aHash[iKey]) may have been added before or after the + ** that adds entries to the wal-index (and possibly to this hash + ** table). This means the value just read from the hash + ** slot (aHash[iKey]) may have been added before or after the ** current read transaction was opened. Values added after the ** read transaction was opened may have been written incorrectly - ** i.e. these slots may contain garbage data. However, we assume @@ -61430,13 +61430,13 @@ SQLITE_PRIVATE int sqlite3WalFindFrame( ** opened remain unmodified. ** ** For the reasons above, the if(...) condition featured in the inner - ** loop of the following block is more stringent that would be required + ** loop of the following block is more stringent that would be required ** if we had exclusive access to the hash-table: ** - ** (aPgno[iFrame]==pgno): + ** (aPgno[iFrame]==pgno): ** This condition filters out normal hash-table collisions. ** - ** (iFrame<=iLast): + ** (iFrame<=iLast): ** This condition filters out entries that were added to the hash ** table after the current read-transaction had started. */ @@ -61510,7 +61510,7 @@ SQLITE_PRIVATE int sqlite3WalReadFrame( return sqlite3OsRead(pWal->pWalFd, pOut, (nOut>sz ? sz : nOut), iOffset); } -/* +/* ** Return the size of the database in pages (or zero, if unknown). */ SQLITE_PRIVATE Pgno sqlite3WalDbsize(Wal *pWal){ @@ -61521,7 +61521,7 @@ SQLITE_PRIVATE Pgno sqlite3WalDbsize(Wal *pWal){ } -/* +/* ** This function starts a write transaction on the WAL. ** ** A read transaction must have already been started by a prior call @@ -61599,18 +61599,18 @@ SQLITE_PRIVATE int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *p if( ALWAYS(pWal->writeLock) ){ Pgno iMax = pWal->hdr.mxFrame; Pgno iFrame; - + /* Restore the clients cache of the wal-index header to the state it - ** was in before the client began writing to the database. + ** was in before the client began writing to the database. */ memcpy(&pWal->hdr, (void *)walIndexHdr(pWal), sizeof(WalIndexHdr)); - for(iFrame=pWal->hdr.mxFrame+1; - ALWAYS(rc==SQLITE_OK) && iFrame<=iMax; + for(iFrame=pWal->hdr.mxFrame+1; + ALWAYS(rc==SQLITE_OK) && iFrame<=iMax; iFrame++ ){ /* This call cannot fail. Unless the page for which the page number - ** is passed as the second argument is (a) in the cache and + ** is passed as the second argument is (a) in the cache and ** (b) has an outstanding reference, then xUndo is either a no-op ** (if (a) is false) or simply expels the page from the cache (if (b) ** is false). @@ -61628,10 +61628,10 @@ SQLITE_PRIVATE int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *p return rc; } -/* -** Argument aWalData must point to an array of WAL_SAVEPOINT_NDATA u32 -** values. This function populates the array with values required to -** "rollback" the write position of the WAL handle back to the current +/* +** Argument aWalData must point to an array of WAL_SAVEPOINT_NDATA u32 +** values. This function populates the array with values required to +** "rollback" the write position of the WAL handle back to the current ** point in the event of a savepoint rollback (via WalSavepointUndo()). */ SQLITE_PRIVATE void sqlite3WalSavepoint(Wal *pWal, u32 *aWalData){ @@ -61642,7 +61642,7 @@ SQLITE_PRIVATE void sqlite3WalSavepoint(Wal *pWal, u32 *aWalData){ aWalData[3] = pWal->nCkpt; } -/* +/* ** Move the write position of the WAL back to the point identified by ** the values in the aWalData[] array. aWalData must point to an array ** of WAL_SAVEPOINT_NDATA u32 values that has been previously populated @@ -61848,7 +61848,7 @@ static int walRewriteChecksums(Wal *pWal, u32 iLast){ return rc; } -/* +/* ** Write a set of frames to the log. The caller must hold the write-lock ** on the log file (obtained using sqlite3WalBeginWriteTransaction()). */ @@ -61915,7 +61915,7 @@ SQLITE_PRIVATE int sqlite3WalFrames( walChecksumBytes(1, aWalHdr, WAL_HDRSIZE-2*4, 0, aCksum); sqlite3Put4byte(&aWalHdr[24], aCksum[0]); sqlite3Put4byte(&aWalHdr[28], aCksum[1]); - + pWal->szPage = szPage; pWal->hdr.bigEndCksum = SQLITE_BIGENDIAN; pWal->hdr.aFrameCksum[0] = aCksum[0]; @@ -61957,7 +61957,7 @@ SQLITE_PRIVATE int sqlite3WalFrames( /* Check if this page has already been written into the wal file by ** the current transaction. If so, overwrite the existing frame and - ** set Wal.writeLock to WAL_WRITELOCK_RECKSUM - indicating that + ** set Wal.writeLock to WAL_WRITELOCK_RECKSUM - indicating that ** checksums must be recomputed when the transaction is committed. */ if( iFirst && (p->pDirty || isCommit==0) ){ u32 iWrite = 0; @@ -62045,7 +62045,7 @@ SQLITE_PRIVATE int sqlite3WalFrames( pWal->truncateOnCommit = 0; } - /* Append data to the wal-index. It is not necessary to lock the + /* Append data to the wal-index. It is not necessary to lock the ** wal-index to do this as the SQLITE_SHM_WRITE lock held on the wal-index ** guarantees that there are no other writers, and no data that may ** be in use by existing readers is being overwritten. @@ -62084,7 +62084,7 @@ SQLITE_PRIVATE int sqlite3WalFrames( return rc; } -/* +/* ** This routine is called to implement sqlite3_wal_checkpoint() and ** related interfaces. ** @@ -62121,7 +62121,7 @@ SQLITE_PRIVATE int sqlite3WalCheckpoint( if( pWal->readOnly ) return SQLITE_READONLY; WALTRACE(("WAL%p: checkpoint begins\n", pWal)); - /* IMPLEMENTATION-OF: R-62028-47212 All calls obtain an exclusive + /* IMPLEMENTATION-OF: R-62028-47212 All calls obtain an exclusive ** "checkpoint" lock on the database file. */ rc = walLockExclusive(pWal, WAL_CKPT_LOCK, 1); if( rc ){ @@ -62182,7 +62182,7 @@ SQLITE_PRIVATE int sqlite3WalCheckpoint( } if( isChanged ){ - /* If a new wal-index header was loaded before the checkpoint was + /* If a new wal-index header was loaded before the checkpoint was ** performed, then the pager-cache associated with pWal is now ** out of date. So zero the cached wal-index header to ensure that ** next time the pager opens a snapshot on this database it knows that @@ -62225,7 +62225,7 @@ SQLITE_PRIVATE int sqlite3WalCallback(Wal *pWal){ ** operation must occur while the pager is still holding the exclusive ** lock on the main database file. ** -** If op is one, then change from locking_mode=NORMAL into +** If op is one, then change from locking_mode=NORMAL into ** locking_mode=EXCLUSIVE. This means that the pWal->readLock must ** be released. Return 1 if the transition is made and 0 if the ** WAL is already in exclusive-locking mode - meaning that this @@ -62242,8 +62242,8 @@ SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal *pWal, int op){ assert( pWal->writeLock==0 ); assert( pWal->exclusiveMode!=WAL_HEAPMEMORY_MODE || op==-1 ); - /* pWal->readLock is usually set, but might be -1 if there was a - ** prior error while attempting to acquire are read-lock. This cannot + /* pWal->readLock is usually set, but might be -1 if there was a + ** prior error while attempting to acquire are read-lock. This cannot ** happen if the connection is actually in exclusive mode (as no xShmLock ** locks are taken in this case). Nor should the pager attempt to ** upgrade to exclusive-mode following such an error. @@ -62274,10 +62274,10 @@ SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal *pWal, int op){ return rc; } -/* +/* ** Return true if the argument is non-NULL and the WAL module is using ** heap-memory for the wal-index. Otherwise, if the argument is NULL or the -** WAL module is using shared-memory, return false. +** WAL module is using shared-memory, return false. */ SQLITE_PRIVATE int sqlite3WalHeapMemory(Wal *pWal){ return (pWal && pWal->exclusiveMode==WAL_HEAPMEMORY_MODE ); @@ -62316,7 +62316,7 @@ SQLITE_PRIVATE void sqlite3WalSnapshotOpen(Wal *pWal, sqlite3_snapshot *pSnapsho pWal->pSnapshot = (WalIndexHdr*)pSnapshot; } -/* +/* ** Return a +ve value if snapshot p1 is newer than p2. A -ve value if ** p1 is older than p2 and zero if p1 and p2 are the same snapshot. */ @@ -62336,7 +62336,7 @@ SQLITE_API int sqlite3_snapshot_cmp(sqlite3_snapshot *p1, sqlite3_snapshot *p2){ /* ** The caller currently has a read transaction open on the database. ** This function takes a SHARED lock on the CHECKPOINTER slot and then -** checks if the snapshot passed as the second argument is still +** checks if the snapshot passed as the second argument is still ** available. If so, SQLITE_OK is returned. ** ** If the snapshot is not available, SQLITE_ERROR is returned. Or, if @@ -62443,16 +62443,16 @@ SQLITE_PRIVATE sqlite3_file *sqlite3WalFile(Wal *pWal){ ** on Ptr(N) and its subpages have values greater than Key(N-1). And ** so forth. ** -** Finding a particular key requires reading O(log(M)) pages from the +** Finding a particular key requires reading O(log(M)) pages from the ** disk where M is the number of entries in the tree. ** -** In this implementation, a single file can hold one or more separate +** In this implementation, a single file can hold one or more separate ** BTrees. Each BTree is identified by the index of its root page. The ** key and data for any entry are combined to form the "payload". A ** fixed amount of payload can be carried directly on the database ** page. If the payload is larger than the preset amount then surplus ** bytes are stored on overflow pages. The payload for an entry -** and the preceding pointer are combined to form a "Cell". Each +** and the preceding pointer are combined to form a "Cell". Each ** page has a small header which contains the Ptr(N) pointer and other ** information such as the size of key and data. ** @@ -62582,7 +62582,7 @@ SQLITE_PRIVATE sqlite3_file *sqlite3WalFile(Wal *pWal){ ** contiguous or in order, but cell pointers are contiguous and in order. ** ** Cell content makes use of variable length integers. A variable -** length integer is 1 to 9 bytes where the lower 7 bits of each +** length integer is 1 to 9 bytes where the lower 7 bits of each ** byte are used. The integer consists of all bytes that have bit 8 set and ** the first byte with bit 8 clear. The most significant byte of the integer ** appears first. A variable-length integer may not be more than 9 bytes long. @@ -62655,7 +62655,7 @@ typedef struct CellInfo CellInfo; ** -DSQLITE_FILE_HEADER="..." on the compiler command-line. The ** header must be exactly 16 bytes including the zero-terminator so ** the string itself should be 15 characters long. If you change -** the header, then your custom library will not be able to read +** the header, then your custom library will not be able to read ** databases generated by the standard tools and the standard tools ** will not be able to read databases created by your custom library. */ @@ -62718,7 +62718,7 @@ struct MemPage { /* ** A linked list of the following structures is stored at BtShared.pLock. -** Locks are added (or upgraded from READ_LOCK to WRITE_LOCK) when a cursor +** Locks are added (or upgraded from READ_LOCK to WRITE_LOCK) when a cursor ** is opened on the table with root page BtShared.iTable. Locks are removed ** from this list when a transaction is committed or rolled back, or when ** a btree handle is closed. @@ -62742,7 +62742,7 @@ struct BtLock { ** see the internals of this structure and only deals with pointers to ** this structure. ** -** For some database files, the same underlying database cache might be +** For some database files, the same underlying database cache might be ** shared between multiple connections. In that case, each connection ** has it own instance of this object. But each instance of this object ** points to the same BtShared object. The database cache and the @@ -62750,7 +62750,7 @@ struct BtLock { ** the BtShared object. ** ** All fields in this structure are accessed under sqlite3.mutex. -** The pBt pointer itself may not be changed while there exists cursors +** The pBt pointer itself may not be changed while there exists cursors ** in the referenced BtShared that point back to this Btree since those ** cursors have to go through this Btree to find their BtShared and ** they often do so without holding sqlite3.mutex. @@ -62785,7 +62785,7 @@ struct Btree { /* ** An instance of this object represents a single database file. -** +** ** A single database file can be in use at the same time by two ** or more database connections. When two or more connections are ** sharing the same database file, each connection has it own @@ -62905,7 +62905,7 @@ struct CellInfo { ** particular database connection identified BtCursor.pBtree.db. ** ** Fields in this structure are accessed under the BtShared.mutex -** found at self->pBt->mutex. +** found at self->pBt->mutex. ** ** skipNext meaning: ** The meaning of skipNext depends on the value of eState: @@ -62961,7 +62961,7 @@ struct BtCursor { ** Potential values for BtCursor.eState. ** ** CURSOR_INVALID: -** Cursor does not point to a valid entry. This can happen (for example) +** Cursor does not point to a valid entry. This can happen (for example) ** because the table is empty or because BtreeCursorFirst() has not been ** called. ** @@ -62974,9 +62974,9 @@ struct BtCursor { ** operation should be a no-op. ** ** CURSOR_REQUIRESEEK: -** The table that this cursor was opened on still exists, but has been +** The table that this cursor was opened on still exists, but has been ** modified since the cursor was last used. The cursor position is saved -** in variables BtCursor.pKey and BtCursor.nKey. When a cursor is in +** in variables BtCursor.pKey and BtCursor.nKey. When a cursor is in ** this state, restoreCursorPosition() can be called to attempt to ** seek the cursor to the saved position. ** @@ -62993,13 +62993,13 @@ struct BtCursor { #define CURSOR_REQUIRESEEK 3 #define CURSOR_FAULT 4 -/* +/* ** The database page the PENDING_BYTE occupies. This page is never used. */ # define PENDING_BYTE_PAGE(pBt) PAGER_MJ_PGNO(pBt) /* -** These macros define the location of the pointer-map entry for a +** These macros define the location of the pointer-map entry for a ** database page. The first argument to each is the number of usable ** bytes on each page of the database (often 1024). The second is the ** page number to look up in the pointer map. @@ -63034,10 +63034,10 @@ struct BtCursor { ** PTRMAP_ROOTPAGE: The database page is a root-page. The page-number is not ** used in this case. ** -** PTRMAP_FREEPAGE: The database page is an unused (free) page. The page-number +** PTRMAP_FREEPAGE: The database page is an unused (free) page. The page-number ** is not used in this case. ** -** PTRMAP_OVERFLOW1: The database page is the first page in a list of +** PTRMAP_OVERFLOW1: The database page is the first page in a list of ** overflow pages. The page number identifies the page that ** contains the cell with a pointer to this overflow page. ** @@ -63059,13 +63059,13 @@ struct BtCursor { */ #define btreeIntegrity(p) \ assert( p->pBt->inTransaction!=TRANS_NONE || p->pBt->nTransaction==0 ); \ - assert( p->pBt->inTransaction>=p->inTrans ); + assert( p->pBt->inTransaction>=p->inTrans ); /* ** The ISAUTOVACUUM macro is used within balance_nonroot() to determine ** if the database supports auto-vacuum or not. Because it is used -** within an expression that is an argument to another macro +** within an expression that is an argument to another macro ** (sqliteMallocRaw), it is not possible to use conditional compilation. ** So, this macro is defined instead. */ @@ -63082,8 +63082,8 @@ struct BtCursor { ** ** The aRef[] array is allocated so that there is 1 bit for each page in ** the database. As the integrity-check proceeds, for each page used in -** the database the corresponding bit is set. This allows integrity-check to -** detect pages that are used twice and orphaned pages (both of which +** the database the corresponding bit is set. This allows integrity-check to +** detect pages that are used twice and orphaned pages (both of which ** indicate corruption). */ typedef struct IntegrityCk IntegrityCk; @@ -63399,10 +63399,10 @@ SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3 *db){ #ifndef SQLITE_OMIT_INCRBLOB /* -** Enter a mutex on a Btree given a cursor owned by that Btree. +** Enter a mutex on a Btree given a cursor owned by that Btree. ** -** These entry points are used by incremental I/O only. Enter() is required -** any time OMIT_SHARED_CACHE is not defined, regardless of whether or not +** These entry points are used by incremental I/O only. Enter() is required +** any time OMIT_SHARED_CACHE is not defined, regardless of whether or not ** the build is threadsafe. Leave() is only required by threadsafe builds. */ SQLITE_PRIVATE void sqlite3BtreeEnterCursor(BtCursor *pCur){ @@ -63472,7 +63472,7 @@ int sqlite3BtreeTrace=1; /* True to enable tracing */ #define BTALLOC_LE 2 /* Allocate any page <= the parameter */ /* -** Macro IfNotOmitAV(x) returns (x) if SQLITE_OMIT_AUTOVACUUM is not +** Macro IfNotOmitAV(x) returns (x) if SQLITE_OMIT_AUTOVACUUM is not ** defined, or 0 if it is. For example: ** ** bIncrVacuum = IfNotOmitAV(pBtShared->incrVacuum); @@ -63487,7 +63487,7 @@ int sqlite3BtreeTrace=1; /* True to enable tracing */ /* ** A list of BtShared objects that are eligible for participation ** in shared cache. This variable has file scope during normal builds, -** but the test harness needs to access it so we make it global for +** but the test harness needs to access it so we make it global for ** test builds. ** ** Access to this variable is protected by SQLITE_MUTEX_STATIC_MASTER. @@ -63522,7 +63522,7 @@ SQLITE_API int sqlite3_enable_shared_cache(int enable){ ** manipulate entries in the BtShared.pLock linked list used to store ** shared-cache table level locks. If the library is compiled with the ** shared-cache feature disabled, then there is only ever one user - ** of each BtShared structure and so this locking is not necessary. + ** of each BtShared structure and so this locking is not necessary. ** So define the lock related functions as no-ops. */ #define querySharedCacheTableLock(a,b,c) SQLITE_OK @@ -63567,15 +63567,15 @@ int corruptPageError(int lineno, MemPage *p){ /* **** This function is only used as part of an assert() statement. *** ** -** Check to see if pBtree holds the required locks to read or write to the +** Check to see if pBtree holds the required locks to read or write to the ** table with root page iRoot. Return 1 if it does and 0 if not. ** -** For example, when writing to a table with root-page iRoot via +** For example, when writing to a table with root-page iRoot via ** Btree connection pBtree: ** ** assert( hasSharedCacheTableLock(pBtree, iRoot, 0, WRITE_LOCK) ); ** -** When writing to an index that resides in a sharable database, the +** When writing to an index that resides in a sharable database, the ** caller should have first obtained a lock specifying the root page of ** the corresponding table. This makes things a bit more complicated, ** as this module treats each table as a separate structure. To determine @@ -63597,7 +63597,7 @@ static int hasSharedCacheTableLock( BtLock *pLock; /* If this database is not shareable, or if the client is reading - ** and has the read-uncommitted flag set, then no lock is required. + ** and has the read-uncommitted flag set, then no lock is required. ** Return true immediately. */ if( (pBtree->sharable==0) @@ -63637,13 +63637,13 @@ static int hasSharedCacheTableLock( iTab = iRoot; } - /* Search for the required lock. Either a write-lock on root-page iTab, a + /* Search for the required lock. Either a write-lock on root-page iTab, a ** write-lock on the schema table, or (if the client is reading) a ** read-lock on iTab will suffice. Return 1 if any of these are found. */ for(pLock=pBtree->pBt->pLock; pLock; pLock=pLock->pNext){ - if( pLock->pBtree==pBtree + if( pLock->pBtree==pBtree && (pLock->iTable==iTab || (pLock->eLock==WRITE_LOCK && pLock->iTable==1)) - && pLock->eLock>=eLockType + && pLock->eLock>=eLockType ){ return 1; } @@ -63676,7 +63676,7 @@ static int hasSharedCacheTableLock( static int hasReadConflicts(Btree *pBtree, Pgno iRoot){ BtCursor *p; for(p=pBtree->pBt->pCursor; p; p=p->pNext){ - if( p->pgnoRoot==iRoot + if( p->pgnoRoot==iRoot && p->pBtree!=pBtree && 0==(p->pBtree->db->flags & SQLITE_ReadUncommit) ){ @@ -63688,7 +63688,7 @@ static int hasReadConflicts(Btree *pBtree, Pgno iRoot){ #endif /* #ifdef SQLITE_DEBUG */ /* -** Query to see if Btree handle p may obtain a lock of type eLock +** Query to see if Btree handle p may obtain a lock of type eLock ** (READ_LOCK or WRITE_LOCK) on the table with root-page iTab. Return ** SQLITE_OK if the lock may be obtained (by calling ** setSharedCacheTableLock()), or SQLITE_LOCKED if not. @@ -63701,14 +63701,14 @@ static int querySharedCacheTableLock(Btree *p, Pgno iTab, u8 eLock){ assert( eLock==READ_LOCK || eLock==WRITE_LOCK ); assert( p->db!=0 ); assert( !(p->db->flags&SQLITE_ReadUncommit)||eLock==WRITE_LOCK||iTab==1 ); - + /* If requesting a write-lock, then the Btree must have an open write - ** transaction on this file. And, obviously, for this to be so there + ** transaction on this file. And, obviously, for this to be so there ** must be an open write transaction on the file itself. */ assert( eLock==READ_LOCK || (p==pBt->pWriter && p->inTrans==TRANS_WRITE) ); assert( eLock==READ_LOCK || pBt->inTransaction==TRANS_WRITE ); - + /* This routine is a no-op if the shared-cache is not enabled */ if( !p->sharable ){ return SQLITE_OK; @@ -63723,7 +63723,7 @@ static int querySharedCacheTableLock(Btree *p, Pgno iTab, u8 eLock){ } for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){ - /* The condition (pIter->eLock!=eLock) in the following if(...) + /* The condition (pIter->eLock!=eLock) in the following if(...) ** statement is a simplification of: ** ** (eLock==WRITE_LOCK || pIter->eLock==WRITE_LOCK) @@ -63750,7 +63750,7 @@ static int querySharedCacheTableLock(Btree *p, Pgno iTab, u8 eLock){ #ifndef SQLITE_OMIT_SHARED_CACHE /* ** Add a lock on the table with root-page iTable to the shared-btree used -** by Btree handle p. Parameter eLock must be either READ_LOCK or +** by Btree handle p. Parameter eLock must be either READ_LOCK or ** WRITE_LOCK. ** ** This function assumes the following: @@ -63762,7 +63762,7 @@ static int querySharedCacheTableLock(Btree *p, Pgno iTab, u8 eLock){ ** with the requested lock (i.e. querySharedCacheTableLock() has ** already been called and returned SQLITE_OK). ** -** SQLITE_OK is returned if the lock is added successfully. SQLITE_NOMEM +** SQLITE_OK is returned if the lock is added successfully. SQLITE_NOMEM ** is returned if a malloc attempt fails. */ static int setSharedCacheTableLock(Btree *p, Pgno iTable, u8 eLock){ @@ -63776,11 +63776,11 @@ static int setSharedCacheTableLock(Btree *p, Pgno iTable, u8 eLock){ /* A connection with the read-uncommitted flag set will never try to ** obtain a read-lock using this function. The only read-lock obtained - ** by a connection in read-uncommitted mode is on the sqlite_master + ** by a connection in read-uncommitted mode is on the sqlite_master ** table, and that lock is obtained in BtreeBeginTrans(). */ assert( 0==(p->db->flags&SQLITE_ReadUncommit) || eLock==WRITE_LOCK ); - /* This function should only be called on a sharable b-tree after it + /* This function should only be called on a sharable b-tree after it ** has been determined that no other b-tree holds a conflicting lock. */ assert( p->sharable ); assert( SQLITE_OK==querySharedCacheTableLock(p, iTable, eLock) ); @@ -63825,7 +63825,7 @@ static int setSharedCacheTableLock(Btree *p, Pgno iTable, u8 eLock){ ** Release all the table locks (locks obtained via calls to ** the setSharedCacheTableLock() procedure) held by Btree object p. ** -** This function assumes that Btree p has an open read or write +** This function assumes that Btree p has an open read or write ** transaction. If it does not, then the BTS_PENDING flag ** may be incorrectly cleared. */ @@ -63857,7 +63857,7 @@ static void clearAllSharedCacheTableLocks(Btree *p){ pBt->pWriter = 0; pBt->btsFlags &= ~(BTS_EXCLUSIVE|BTS_PENDING); }else if( pBt->nTransaction==2 ){ - /* This function is called when Btree p is concluding its + /* This function is called when Btree p is concluding its ** transaction. If there currently exists a writer, and p is not ** that writer, then the number of locks held by connections other ** than the writer must be about to drop to zero. In this case @@ -63903,7 +63903,7 @@ static int cursorHoldsMutex(BtCursor *p){ } /* Verify that the cursor and the BtShared agree about what is the current -** database connetion. This is important in shared-cache mode. If the database +** database connetion. This is important in shared-cache mode. If the database ** connection pointers get out-of-sync, it is possible for routines like ** btreeInitPage() to reference an stale connection pointer that references a ** a connection that has already closed. This routine is used inside assert() @@ -63974,8 +63974,8 @@ static void invalidateIncrblobCursors( #endif /* SQLITE_OMIT_INCRBLOB */ /* -** Set bit pgno of the BtShared.pHasContent bitvec. This is called -** when a page that previously contained data becomes a free-list leaf +** Set bit pgno of the BtShared.pHasContent bitvec. This is called +** when a page that previously contained data becomes a free-list leaf ** page. ** ** The BtShared.pHasContent bitvec exists to work around an obscure @@ -64001,7 +64001,7 @@ static void invalidateIncrblobCursors( ** may be lost. In the event of a rollback, it may not be possible ** to restore the database to its original configuration. ** -** The solution is the BtShared.pHasContent bitvec. Whenever a page is +** The solution is the BtShared.pHasContent bitvec. Whenever a page is ** moved to become a free-list leaf page, the corresponding bit is ** set in the bitvec. Whenever a leaf page is extracted from the free-list, ** optimization 2 above is omitted if the corresponding bit is already @@ -64062,13 +64062,13 @@ static void btreeReleaseAllCursorPages(BtCursor *pCur){ ** The cursor passed as the only argument must point to a valid entry ** when this function is called (i.e. have eState==CURSOR_VALID). This ** function saves the current cursor key in variables pCur->nKey and -** pCur->pKey. SQLITE_OK is returned if successful or an SQLite error +** pCur->pKey. SQLITE_OK is returned if successful or an SQLite error ** code otherwise. ** ** If the cursor is open on an intkey table, then the integer key ** (the rowid) is stored in pCur->nKey and pCur->pKey is left set to -** NULL. If the cursor is open on a non-intkey table, then pCur->pKey is -** set to point to a malloced buffer pCur->nKey bytes in size containing +** NULL. If the cursor is open on a non-intkey table, then pCur->pKey is +** set to point to a malloced buffer pCur->nKey bytes in size containing ** the key. */ static int saveCursorKey(BtCursor *pCur){ @@ -64084,8 +64084,8 @@ static int saveCursorKey(BtCursor *pCur){ /* For an index btree, save the complete key content. It is possible ** that the current key is corrupt. In that case, it is possible that ** the sqlite3VdbeRecordUnpack() function may overread the buffer by - ** up to the size of 1 varint plus 1 8-byte value when the cursor - ** position is restored. Hence the 17 bytes of padding allocated + ** up to the size of 1 varint plus 1 8-byte value when the cursor + ** position is restored. Hence the 17 bytes of padding allocated ** below. */ void *pKey; pCur->nKey = sqlite3BtreePayloadSize(pCur); @@ -64107,11 +64107,11 @@ static int saveCursorKey(BtCursor *pCur){ } /* -** Save the current cursor position in the variables BtCursor.nKey +** Save the current cursor position in the variables BtCursor.nKey ** and BtCursor.pKey. The cursor's state is set to CURSOR_REQUIRESEEK. ** ** The caller must ensure that the cursor is valid (has eState==CURSOR_VALID) -** prior to calling this routine. +** prior to calling this routine. */ static int saveCursorPosition(BtCursor *pCur){ int rc; @@ -64147,7 +64147,7 @@ static int SQLITE_NOINLINE saveCursorsOnList(BtCursor*,Pgno,BtCursor*); ** routine is called just before cursor pExcept is used to modify the ** table, for example in BtreeDelete() or BtreeInsert(). ** -** If there are two or more cursors on the same btree, then all such +** If there are two or more cursors on the same btree, then all such ** cursors should have their BTCF_Multiple flag set. The btreeCursor() ** routine enforces that rule. This routine only needs to be called in ** the uncommon case when pExpect has the BTCF_Multiple flag set. @@ -64247,9 +64247,9 @@ moveto_done: /* ** Restore the cursor to the position it was in (or as close to as possible) -** when saveCursorPosition() was called. Note that this call deletes the +** when saveCursorPosition() was called. Note that this call deletes the ** saved position info stored by saveCursorPosition(), so there can be -** at most one effective restoreCursorPosition() call after each +** at most one effective restoreCursorPosition() call after each ** saveCursorPosition(). */ static int btreeRestoreCursorPosition(BtCursor *pCur){ @@ -64317,7 +64317,7 @@ SQLITE_PRIVATE BtCursor *sqlite3BtreeFakeValidCursor(void){ /* ** This routine restores a cursor back to its original position after it ** has been moved by some outside activity (such as a btree rebalance or -** a row having been deleted out from under the cursor). +** a row having been deleted out from under the cursor). ** ** On success, the *pDifferentRow parameter is false if the cursor is left ** pointing at exactly the same row. *pDifferntRow is the row the cursor @@ -64382,7 +64382,7 @@ static Pgno ptrmapPageno(BtShared *pBt, Pgno pgno){ if( pgno<2 ) return 0; nPagesPerMapPage = (pBt->usableSize/5)+1; iPtrMap = (pgno-2)/nPagesPerMapPage; - ret = (iPtrMap*nPagesPerMapPage) + 2; + ret = (iPtrMap*nPagesPerMapPage) + 2; if( ret==PENDING_BYTE_PAGE(pBt) ){ ret++; } @@ -64728,7 +64728,7 @@ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){ } pIter++; if( pPage->intKey ){ - /* pIter now points at the 64-bit integer key value, a variable length + /* pIter now points at the 64-bit integer key value, a variable length ** integer. The following block moves pIter to point at the first byte ** past the end of the key value. */ pEnd = &pIter[9]; @@ -64853,7 +64853,7 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ /* This block handles pages with two or fewer free blocks and nMaxFrag ** or fewer fragmented bytes. In this case it is faster to move the ** two (or one) blocks of cells using memmove() and add the required - ** offsets to each pointer in the cell-pointer array than it is to + ** offsets to each pointer in the cell-pointer array than it is to ** reconstruct the entire page. */ if( (int)data[hdr+7]<=nMaxFrag ){ int iFree = get2byte(&data[hdr+1]); @@ -65031,7 +65031,7 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ int top; /* First byte of cell content area */ int rc = SQLITE_OK; /* Integer return code */ int gap; /* First byte of gap between cell pointers and cell content */ - + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); assert( pPage->pBt ); assert( sqlite3_mutex_held(pPage->pBt->mutex) ); @@ -65137,7 +65137,7 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ assert( iSize>=4 ); /* Minimum cell size is 4 */ assert( iStart<=pPage->pBt->usableSize-4 ); - /* The list of freeblocks must be in ascending order. Find the + /* The list of freeblocks must be in ascending order. Find the ** spot on the list where iStart should be inserted. */ hdr = pPage->hdrOffset; @@ -65156,7 +65156,7 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ return SQLITE_CORRUPT_PAGE(pPage); } assert( iFreeBlk>iPtr || iFreeBlk==0 ); - + /* At this point: ** iFreeBlk: First freeblock after iStart, or zero if none ** iPtr: The address of a pointer to iFreeBlk @@ -65173,7 +65173,7 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ iSize = iEnd - iStart; iFreeBlk = get2byte(&data[iFreeBlk]); } - + /* If iPtr is another freeblock (that is, if iPtr is not the freelist ** pointer in the page header) then check to see if iStart should be ** coalesced onto the end of iPtr. @@ -65319,7 +65319,7 @@ static int btreeComputeFreeSpace(MemPage *pPage){ /* EVIDENCE-OF: R-55530-52930 In a well-formed b-tree page, there will ** always be at least one cell before the first freeblock. */ - return SQLITE_CORRUPT_PAGE(pPage); + return SQLITE_CORRUPT_PAGE(pPage); } while( 1 ){ if( pc>iCellLast ){ @@ -65358,7 +65358,7 @@ static int btreeComputeFreeSpace(MemPage *pPage){ /* ** Do additional sanity check after btreeInitPage() if -** PRAGMA cell_size_check=ON +** PRAGMA cell_size_check=ON */ static SQLITE_NOINLINE int btreeCellSizeCheck(MemPage *pPage){ int iCellFirst; /* First allowable cell or freeblock offset */ @@ -65396,7 +65396,7 @@ static SQLITE_NOINLINE int btreeCellSizeCheck(MemPage *pPage){ ** Initialize the auxiliary information for a disk block. ** ** Return SQLITE_OK on success. If we see that the page does -** not contain a well-formed database page, then return +** not contain a well-formed database page, then return ** SQLITE_CORRUPT. Note that a return of SQLITE_OK does not ** guarantee that the page is well-formed. It only shows that ** we failed to detect any corruption. @@ -65501,7 +65501,7 @@ static MemPage *btreePageFromDbPage(DbPage *pDbPage, Pgno pgno, BtShared *pBt){ pPage->hdrOffset = pgno==1 ? 100 : 0; } assert( pPage->aData==sqlite3PagerGetData(pDbPage) ); - return pPage; + return pPage; } /* @@ -65725,11 +65725,11 @@ static int btreeInvokeBusyHandler(void *pArg){ /* ** Open a database file. -** +** ** zFilename is the name of the database file. If zFilename is NULL ** then an ephemeral database is created. The ephemeral database might ** be exclusively in memory, or it might use a disk-based memory cache. -** Either way, the ephemeral database will be automatically deleted +** Either way, the ephemeral database will be automatically deleted ** when sqlite3BtreeClose() is called. ** ** If zFilename is ":memory:" then an in-memory database is created @@ -65762,7 +65762,7 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( /* True if opening an ephemeral, temporary database */ const int isTempDb = zFilename==0 || zFilename[0]==0; - /* Set the variable isMemdb to true for an in-memory database, or + /* Set the variable isMemdb to true for an in-memory database, or ** false for a file-based database. */ #ifdef SQLITE_OMIT_MEMORYDB @@ -65881,7 +65881,7 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( assert( sizeof(u32)==4 ); assert( sizeof(u16)==2 ); assert( sizeof(Pgno)==4 ); - + pBt = sqlite3MallocZero( sizeof(*pBt) ); if( pBt==0 ){ rc = SQLITE_NOMEM_BKPT; @@ -65900,7 +65900,7 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( pBt->db = db; sqlite3PagerSetBusyHandler(pBt->pPager, btreeInvokeBusyHandler, pBt); p->pBt = pBt; - + pBt->pCursor = 0; pBt->pPage1 = 0; if( sqlite3PagerIsreadonly(pBt->pPager) ) pBt->btsFlags |= BTS_READ_ONLY; @@ -65944,7 +65944,7 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( if( rc ) goto btree_open_out; pBt->usableSize = pBt->pageSize - nReserve; assert( (pBt->pageSize & 7)==0 ); /* 8-byte alignment of pageSize */ - + #if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO) /* Add the new BtShared object to the linked list sharable BtShareds. */ @@ -66073,7 +66073,7 @@ static int removeFromSharingList(BtShared *pBt){ } /* -** Make sure pBt->pTmpSpace points to an allocation of +** Make sure pBt->pTmpSpace points to an allocation of ** MX_CELL_SIZE(pBt) bytes with a 4-byte prefix for a left-child ** pointer. */ @@ -66088,7 +66088,7 @@ static void allocateTempSpace(BtShared *pBt){ ** can mean that fillInCell() only initializes the first 2 or 3 ** bytes of pTmpSpace, but that the first 4 bytes are copied from ** it into a database page. This is not actually a problem, but it - ** does cause a valgrind error when the 1 or 2 bytes of unitialized + ** does cause a valgrind error when the 1 or 2 bytes of unitialized ** data is passed to system call write(). So to avoid this error, ** zero the first 4 bytes of temp space here. ** @@ -66141,7 +66141,7 @@ SQLITE_PRIVATE int sqlite3BtreeClose(Btree *p){ sqlite3BtreeLeave(p); /* If there are still other outstanding references to the shared-btree - ** structure, return now. The remainder of this procedure cleans + ** structure, return now. The remainder of this procedure cleans ** up the shared-btree. */ assert( p->wantToLock==0 && p->locked==0 ); @@ -66247,7 +66247,7 @@ SQLITE_PRIVATE int sqlite3BtreeSetPagerFlags( /* ** Change the default pages size and the number of reserved bytes per page. -** Or, if the page size has already been fixed, return SQLITE_READONLY +** Or, if the page size has already been fixed, return SQLITE_READONLY ** without changing anything. ** ** The page size must be a power of 2 between 512 and 65536. If the page @@ -66308,7 +66308,7 @@ SQLITE_PRIVATE int sqlite3BtreeGetPageSize(Btree *p){ ** held. ** ** This is useful in one special case in the backup API code where it is -** known that the shared b-tree mutex is held, but the mutex on the +** known that the shared b-tree mutex is held, but the mutex on the ** database handle that owns *p is not. In this case if sqlite3BtreeEnter() ** were to be called, it might collide with some other operation on the ** database handle that owns *p, causing undefined behavior. @@ -66390,7 +66390,7 @@ SQLITE_PRIVATE int sqlite3BtreeSecureDelete(Btree *p, int newFlag){ /* ** Change the 'auto-vacuum' property of the database. If the 'autoVacuum' ** parameter is non-zero, then auto-vacuum mode is enabled. If zero, it -** is disabled. The default value for the auto-vacuum property is +** is disabled. The default value for the auto-vacuum property is ** determined by the SQLITE_DEFAULT_AUTOVACUUM macro. */ SQLITE_PRIVATE int sqlite3BtreeSetAutoVacuum(Btree *p, int autoVacuum){ @@ -66414,7 +66414,7 @@ SQLITE_PRIVATE int sqlite3BtreeSetAutoVacuum(Btree *p, int autoVacuum){ } /* -** Return the value of the 'auto-vacuum' property. If auto-vacuum is +** Return the value of the 'auto-vacuum' property. If auto-vacuum is ** enabled 1 is returned. Otherwise 0. */ SQLITE_PRIVATE int sqlite3BtreeGetAutoVacuum(Btree *p){ @@ -66446,9 +66446,9 @@ static void setDefaultSyncFlag(BtShared *pBt, u8 safety_level){ Db *pDb; if( (db=pBt->db)!=0 && (pDb=db->aDb)!=0 ){ while( pDb->pBt==0 || pDb->pBt->pBt!=pBt ){ pDb++; } - if( pDb->bSyncSet==0 - && pDb->safety_level!=safety_level - && pDb!=&db->aDb[1] + if( pDb->bSyncSet==0 + && pDb->safety_level!=safety_level + && pDb!=&db->aDb[1] ){ pDb->safety_level = safety_level; sqlite3PagerSetFlags(pBt->pPager, @@ -66471,7 +66471,7 @@ static int newDatabase(BtShared*); ** SQLITE_OK is returned on success. If the file is not a ** well-formed database file, then SQLITE_CORRUPT is returned. ** SQLITE_BUSY is returned if the database is locked. SQLITE_NOMEM -** is returned if we run out of memory. +** is returned if we run out of memory. */ static int lockBtree(BtShared *pBt){ int rc; /* Result code from subfunctions */ @@ -66488,7 +66488,7 @@ static int lockBtree(BtShared *pBt){ if( rc!=SQLITE_OK ) return rc; /* Do some checking to help insure the file we opened really is - ** a valid database file. + ** a valid database file. */ nPage = nPageHeader = get4byte(28+(u8*)pPage1->aData); sqlite3PagerPagecount(pBt->pPager, (int*)&nPageFile); @@ -66526,7 +66526,7 @@ static int lockBtree(BtShared *pBt){ } /* If the write version is set to 2, this database should be accessed - ** in WAL mode. If the log is not already open, open it now. Then + ** in WAL mode. If the log is not already open, open it now. Then ** return SQLITE_OK and return without populating BtShared.pPage1. ** The caller detects this and calls this function again. This is ** required as the version of page 1 currently in the page1 buffer @@ -66567,8 +66567,8 @@ static int lockBtree(BtShared *pBt){ /* EVIDENCE-OF: R-25008-21688 The size of a page is a power of two ** between 512 and 65536 inclusive. */ if( ((pageSize-1)&pageSize)!=0 - || pageSize>SQLITE_MAX_PAGE_SIZE - || pageSize<=256 + || pageSize>SQLITE_MAX_PAGE_SIZE + || pageSize<=256 ){ goto page1_init_failed; } @@ -66576,7 +66576,7 @@ static int lockBtree(BtShared *pBt){ assert( (pageSize & 7)==0 ); /* EVIDENCE-OF: R-59310-51205 The "reserved space" size in the 1-byte ** integer at offset 20 is the number of bytes of space at the end of - ** each page to reserve for extensions. + ** each page to reserve for extensions. ** ** EVIDENCE-OF: R-37497-42412 The size of the reserved region is ** determined by the one-byte unsigned integer found at an offset of 20 @@ -66666,7 +66666,7 @@ static int countValidCursors(BtShared *pBt, int wrOnly){ int r = 0; for(pCur=pBt->pCursor; pCur; pCur=pCur->pNext){ if( (wrOnly==0 || (pCur->curFlags & BTCF_WriteFlag)!=0) - && pCur->eState!=CURSOR_FAULT ) r++; + && pCur->eState!=CURSOR_FAULT ) r++; } return r; } @@ -66675,7 +66675,7 @@ static int countValidCursors(BtShared *pBt, int wrOnly){ /* ** If there are no outstanding cursors and we are not in the middle ** of a transaction but there is a read lock on the database, then -** this routine unrefs the first page of the database file which +** this routine unrefs the first page of the database file which ** has the effect of releasing the read lock. ** ** If there is a transaction in progress, this routine is a no-op. @@ -66759,8 +66759,8 @@ SQLITE_PRIVATE int sqlite3BtreeNewDb(Btree *p){ ** upgraded to exclusive by calling this routine a second time - the ** exclusivity flag only works for a new transaction. ** -** A write-transaction must be started before attempting any -** changes to the database. None of the following routines +** A write-transaction must be started before attempting any +** changes to the database. None of the following routines ** will work unless a transaction is started first: ** ** sqlite3BtreeCreateTable() @@ -66774,7 +66774,7 @@ SQLITE_PRIVATE int sqlite3BtreeNewDb(Btree *p){ ** If an initial attempt to acquire the lock fails because of lock contention ** and the database was previously unlocked, then invoke the busy handler ** if there is one. But if there was previously a read-lock, do not -** invoke the busy handler - just return SQLITE_BUSY. SQLITE_BUSY is +** invoke the busy handler - just return SQLITE_BUSY. SQLITE_BUSY is ** returned when there is already a read-lock in order to avoid a deadlock. ** ** Suppose there are two processes A and B. A has a read lock and B has @@ -66801,8 +66801,8 @@ SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVers } assert( pBt->inTransaction==TRANS_WRITE || IfNotOmitAV(pBt->bDoTruncate)==0 ); - if( (p->db->flags & SQLITE_ResetDatabase) - && sqlite3PagerIsreadonly(pBt->pPager)==0 + if( (p->db->flags & SQLITE_ResetDatabase) + && sqlite3PagerIsreadonly(pBt->pPager)==0 ){ pBt->btsFlags &= ~BTS_READ_ONLY; } @@ -66816,7 +66816,7 @@ SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVers #ifndef SQLITE_OMIT_SHARED_CACHE { sqlite3 *pBlock = 0; - /* If another database handle has already opened a write transaction + /* If another database handle has already opened a write transaction ** on this shared-btree structure and a second write transaction is ** requested, return SQLITE_LOCKED. */ @@ -66841,8 +66841,8 @@ SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVers } #endif - /* Any read-only or read-write transaction implies a read-lock on - ** page 1. So if some other shared-cache client already has a write-lock + /* Any read-only or read-write transaction implies a read-lock on + ** page 1. So if some other shared-cache client already has a write-lock ** on page 1, the transaction cannot be opened. */ rc = querySharedCacheTableLock(p, MASTER_ROOT, READ_LOCK); if( SQLITE_OK!=rc ) goto trans_begun; @@ -66853,7 +66853,7 @@ SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVers /* Call lockBtree() until either pBt->pPage1 is populated or ** lockBtree() returns something other than SQLITE_OK. lockBtree() ** may return SQLITE_OK but leave pBt->pPage1 set to 0 if after - ** reading page 1 it discovers that the page-size of the database + ** reading page 1 it discovers that the page-size of the database ** file is not pBt->pageSize. In this case lockBtree() will update ** pBt->pageSize to the page-size of the file on disk. */ @@ -66874,7 +66874,7 @@ SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVers } } } - + if( rc!=SQLITE_OK ){ unlockBtreeIfUnused(pBt); } @@ -66909,7 +66909,7 @@ SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVers /* If the db-size header field is incorrect (as it may be if an old ** client has been writing the database file), update it now. Doing - ** this sooner rather than later means the database size can safely + ** this sooner rather than later means the database size can safely ** re-read the database size from page 1 if a savepoint or transaction ** rollback occurs within the transaction. */ @@ -66984,7 +66984,7 @@ static int setChildPtrmaps(MemPage *pPage){ ** that it points to iTo. Parameter eType describes the type of pointer to ** be modified, as follows: ** -** PTRMAP_BTREE: pPage is a btree-page. The pointer points at a child +** PTRMAP_BTREE: pPage is a btree-page. The pointer points at a child ** page of pPage. ** ** PTRMAP_OVERFLOW1: pPage is a btree-page. The pointer points at an overflow @@ -67032,9 +67032,9 @@ static int modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){ } } } - + if( i==nCell ){ - if( eType!=PTRMAP_BTREE || + if( eType!=PTRMAP_BTREE || get4byte(&pPage->aData[pPage->hdrOffset+8])!=iFrom ){ return SQLITE_CORRUPT_PAGE(pPage); } @@ -67046,11 +67046,11 @@ static int modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){ /* -** Move the open database page pDbPage to location iFreePage in the +** Move the open database page pDbPage to location iFreePage in the ** database. The pDbPage reference remains valid. ** ** The isCommit flag indicates that there is no need to remember that -** the journal needs to be sync()ed before database page pDbPage->pgno +** the journal needs to be sync()ed before database page pDbPage->pgno ** can be written to. The caller has already promised not to write to that ** page. */ @@ -67067,14 +67067,14 @@ static int relocatePage( Pager *pPager = pBt->pPager; int rc; - assert( eType==PTRMAP_OVERFLOW2 || eType==PTRMAP_OVERFLOW1 || + assert( eType==PTRMAP_OVERFLOW2 || eType==PTRMAP_OVERFLOW1 || eType==PTRMAP_BTREE || eType==PTRMAP_ROOTPAGE ); assert( sqlite3_mutex_held(pBt->mutex) ); assert( pDbPage->pBt==pBt ); if( iDbPage<3 ) return SQLITE_CORRUPT_BKPT; /* Move page iDbPage from its current location to page number iFreePage */ - TRACE(("AUTOVACUUM: Moving %d to free page %d (ptr page %d type %d)\n", + TRACE(("AUTOVACUUM: Moving %d to free page %d (ptr page %d type %d)\n", iDbPage, iFreePage, iPtrPage, eType)); rc = sqlite3PagerMovepage(pPager, pDbPage->pDbPage, iFreePage, isCommit); if( rc!=SQLITE_OK ){ @@ -67133,19 +67133,19 @@ static int allocateBtreePage(BtShared *, MemPage **, Pgno *, Pgno, u8); /* ** Perform a single step of an incremental-vacuum. If successful, return -** SQLITE_OK. If there is no work to do (and therefore no point in -** calling this function again), return SQLITE_DONE. Or, if an error +** SQLITE_OK. If there is no work to do (and therefore no point in +** calling this function again), return SQLITE_DONE. Or, if an error ** occurs, return some other error code. ** -** More specifically, this function attempts to re-organize the database so +** More specifically, this function attempts to re-organize the database so ** that the last page of the file currently in use is no longer in use. ** ** Parameter nFin is the number of pages that this database would contain ** were this function called until it returns SQLITE_DONE. ** -** If the bCommit parameter is non-zero, this function assumes that the -** caller will keep calling incrVacuumStep() until it returns SQLITE_DONE -** or an error. bCommit is passed true for an auto-vacuum-on-commit +** If the bCommit parameter is non-zero, this function assumes that the +** caller will keep calling incrVacuumStep() until it returns SQLITE_DONE +** or an error. bCommit is passed true for an auto-vacuum-on-commit ** operation, or false for an incremental vacuum. */ static int incrVacuumStep(BtShared *pBt, Pgno nFin, Pgno iLastPg, int bCommit){ @@ -67176,7 +67176,7 @@ static int incrVacuumStep(BtShared *pBt, Pgno nFin, Pgno iLastPg, int bCommit){ if( bCommit==0 ){ /* Remove the page from the files free-list. This is not required ** if bCommit is non-zero. In that case, the free-list will be - ** truncated to zero after this function returns, so it doesn't + ** truncated to zero after this function returns, so it doesn't ** matter if it still contains some garbage entries. */ Pgno iFreePg; @@ -67220,7 +67220,7 @@ static int incrVacuumStep(BtShared *pBt, Pgno nFin, Pgno iLastPg, int bCommit){ releasePage(pFreePg); }while( bCommit && iFreePg>nFin ); assert( iFreePginTrans = TRANS_READ; }else{ - /* If the handle had any kind of transaction open, decrement the - ** transaction count of the shared btree. If the transaction count + /* If the handle had any kind of transaction open, decrement the + ** transaction count of the shared btree. If the transaction count ** reaches 0, set the shared state to TRANS_NONE. The unlockBtreeIfUnused() ** call below will unlock the pager. */ if( p->inTrans!=TRANS_NONE ){ @@ -67445,7 +67445,7 @@ static void btreeEndTransaction(Btree *p){ } } - /* Set the current transaction state to TRANS_NONE and unlock the + /* Set the current transaction state to TRANS_NONE and unlock the ** pager if this call closed the only read or write transaction. */ p->inTrans = TRANS_NONE; unlockBtreeIfUnused(pBt); @@ -67466,12 +67466,12 @@ static void btreeEndTransaction(Btree *p){ ** the rollback journal (which causes the transaction to commit) and ** drop locks. ** -** Normally, if an error occurs while the pager layer is attempting to +** Normally, if an error occurs while the pager layer is attempting to ** finalize the underlying journal file, this function returns an error and ** the upper layer will attempt a rollback. However, if the second argument -** is non-zero then this b-tree transaction is part of a multi-file -** transaction. In this case, the transaction has already been committed -** (by deleting a master journal file) and the caller will ignore this +** is non-zero then this b-tree transaction is part of a multi-file +** transaction. In this case, the transaction has already been committed +** (by deleting a master journal file) and the caller will ignore this ** functions return code. So, even if an error occurs in the pager layer, ** reset the b-tree objects internal state to indicate that the write ** transaction has been closed. This is quite safe, as the pager will have @@ -67486,7 +67486,7 @@ SQLITE_PRIVATE int sqlite3BtreeCommitPhaseTwo(Btree *p, int bCleanup){ sqlite3BtreeEnter(p); btreeIntegrity(p); - /* If the handle has a write-transaction open, commit the shared-btrees + /* If the handle has a write-transaction open, commit the shared-btrees ** transaction and set the shared state to TRANS_READ. */ if( p->inTrans==TRANS_WRITE ){ @@ -67535,15 +67535,15 @@ SQLITE_PRIVATE int sqlite3BtreeCommit(Btree *p){ ** ** This routine gets called when a rollback occurs. If the writeOnly ** flag is true, then only write-cursors need be tripped - read-only -** cursors save their current positions so that they may continue -** following the rollback. Or, if writeOnly is false, all cursors are +** cursors save their current positions so that they may continue +** following the rollback. Or, if writeOnly is false, all cursors are ** tripped. In general, writeOnly is false if the transaction being ** rolled back modified the database schema. In this case b-tree root ** pages may be moved or deleted from the database altogether, making ** it unsafe for read cursors to continue. ** -** If the writeOnly flag is true and an error is encountered while -** saving the current position of a read-only cursor, all cursors, +** If the writeOnly flag is true and an error is encountered while +** saving the current position of a read-only cursor, all cursors, ** including all read-cursors are tripped. ** ** SQLITE_OK is returned if successful, or if an error occurs while @@ -67649,8 +67649,8 @@ SQLITE_PRIVATE int sqlite3BtreeRollback(Btree *p, int tripCode, int writeOnly){ /* ** Start a statement subtransaction. The subtransaction can be rolled -** back independently of the main transaction. You must start a transaction -** before starting a subtransaction. The subtransaction is ended automatically +** back independently of the main transaction. You must start a transaction +** before starting a subtransaction. The subtransaction is ended automatically ** if the main transaction commits or rolls back. ** ** Statement subtransactions are used around individual SQL statements @@ -67687,11 +67687,11 @@ SQLITE_PRIVATE int sqlite3BtreeBeginStmt(Btree *p, int iStatement){ /* ** The second argument to this function, op, is always SAVEPOINT_ROLLBACK ** or SAVEPOINT_RELEASE. This function either releases or rolls back the -** savepoint identified by parameter iSavepoint, depending on the value +** savepoint identified by parameter iSavepoint, depending on the value ** of op. ** ** Normally, iSavepoint is greater than or equal to zero. However, if op is -** SAVEPOINT_ROLLBACK, then iSavepoint may also be -1. In this case the +** SAVEPOINT_ROLLBACK, then iSavepoint may also be -1. In this case the ** contents of the entire transaction are rolled back. This is different ** from a normal transaction rollback, as no locks are released and the ** transaction remains open. @@ -67716,7 +67716,7 @@ SQLITE_PRIVATE int sqlite3BtreeSavepoint(Btree *p, int op, int iSavepoint){ rc = newDatabase(pBt); btreeSetNPage(pBt, pBt->pPage1); - /* pBt->nPage might be zero if the database was corrupt when + /* pBt->nPage might be zero if the database was corrupt when ** the transaction was started. Otherwise, it must be at least 1. */ assert( CORRUPT_DB || pBt->nPage>0 ); } @@ -67754,10 +67754,10 @@ SQLITE_PRIVATE int sqlite3BtreeSavepoint(Btree *p, int op, int iSavepoint){ ** is set. If FORDELETE is set, that is a hint to the implementation that ** this cursor will only be used to seek to and delete entries of an index ** as part of a larger DELETE statement. The FORDELETE hint is not used by -** this implementation. But in a hypothetical alternative storage engine +** this implementation. But in a hypothetical alternative storage engine ** in which index entries are automatically deleted when corresponding table ** rows are deleted, the FORDELETE flag is a hint that all SEEK and DELETE -** operations on this cursor can be no-ops and all READ operations can +** operations on this cursor can be no-ops and all READ operations can ** return a null row (2-bytes: 0x01 0x00). ** ** No checking is done to make sure that page iTable really is the @@ -67778,14 +67778,14 @@ static int btreeCursor( BtCursor *pX; /* Looping over other all cursors */ assert( sqlite3BtreeHoldsMutex(p) ); - assert( wrFlag==0 - || wrFlag==BTREE_WRCSR - || wrFlag==(BTREE_WRCSR|BTREE_FORDELETE) + assert( wrFlag==0 + || wrFlag==BTREE_WRCSR + || wrFlag==(BTREE_WRCSR|BTREE_FORDELETE) ); - /* The following assert statements verify that if this is a sharable - ** b-tree database, the connection is holding the required table locks, - ** and that no other connection has any open cursor that conflicts with + /* The following assert statements verify that if this is a sharable + ** b-tree database, the connection is holding the required table locks, + ** and that no other connection has any open cursor that conflicts with ** this lock. */ assert( hasSharedCacheTableLock(p, iTable, pKeyInfo!=0, (wrFlag?2:1)) ); assert( wrFlag==0 || !hasReadConflicts(p, iTable) ); @@ -68016,15 +68016,15 @@ SQLITE_PRIVATE sqlite3_int64 sqlite3BtreeMaxRecordSize(BtCursor *pCur){ /* ** Given the page number of an overflow page in the database (parameter -** ovfl), this function finds the page number of the next page in the +** ovfl), this function finds the page number of the next page in the ** linked list of overflow pages. If possible, it uses the auto-vacuum -** pointer-map data instead of reading the content of page ovfl to do so. +** pointer-map data instead of reading the content of page ovfl to do so. ** ** If an error occurs an SQLite error code is returned. Otherwise: ** -** The page number of the next overflow page in the linked list is -** written to *pPgnoNext. If page ovfl is the last page in its linked -** list, *pPgnoNext is set to zero. +** The page number of the next overflow page in the linked list is +** written to *pPgnoNext. If page ovfl is the last page in its linked +** list, *pPgnoNext is set to zero. ** ** If ppPage is not NULL, and a reference to the MemPage object corresponding ** to page number pOvfl was obtained, then *ppPage is set to point to that @@ -68048,9 +68048,9 @@ static int getOverflowPage( #ifndef SQLITE_OMIT_AUTOVACUUM /* Try to find the next page in the overflow list using the - ** autovacuum pointer-map pages. Guess that the next page in - ** the overflow list is page number (ovfl+1). If that guess turns - ** out to be wrong, fall back to loading the data of page + ** autovacuum pointer-map pages. Guess that the next page in + ** the overflow list is page number (ovfl+1). If that guess turns + ** out to be wrong, fall back to loading the data of page ** number ovfl to determine the next page number. */ if( pBt->autoVacuum ){ @@ -68138,8 +68138,8 @@ static int copyPayload( ** ** If the current cursor entry uses one or more overflow pages ** this function may allocate space for and lazily populate -** the overflow page-list cache array (BtCursor.aOverflow). -** Subsequent calls use this cache to make seeking to the supplied offset +** the overflow page-list cache array (BtCursor.aOverflow). +** Subsequent calls use this cache to make seeking to the supplied offset ** more efficient. ** ** Once an overflow page-list cache has been allocated, it must be @@ -68155,7 +68155,7 @@ static int accessPayload( BtCursor *pCur, /* Cursor pointing to entry to read from */ u32 offset, /* Begin reading this far into payload */ u32 amt, /* Read this many bytes */ - unsigned char *pBuf, /* Write the bytes into this buffer */ + unsigned char *pBuf, /* Write the bytes into this buffer */ int eOp /* zero to read. non-zero to write. */ ){ unsigned char *aPayload; @@ -68278,12 +68278,12 @@ static int accessPayload( #ifdef SQLITE_DIRECT_OVERFLOW_READ /* If all the following are true: ** - ** 1) this is a read operation, and + ** 1) this is a read operation, and ** 2) data is required from the start of this overflow page, and ** 3) there are no dirty pages in the page-cache ** 4) the database is file-backed, and ** 5) the page is not in the WAL file - ** 6) at least 4 bytes have already been read into the output buffer + ** 6) at least 4 bytes have already been read into the output buffer ** ** then data can be read directly from the database file into the ** output buffer, bypassing the page-cache altogether. This speeds @@ -68391,7 +68391,7 @@ SQLITE_PRIVATE int sqlite3BtreePayloadChecked(BtCursor *pCur, u32 offset, u32 am #endif /* SQLITE_OMIT_INCRBLOB */ /* -** Return a pointer to payload information from the entry that the +** Return a pointer to payload information from the entry that the ** pCur cursor is pointing to. The pointer is to the beginning of ** the key if index btrees (pPage->intKey==0) and is the data for ** table btrees (pPage->intKey==1). The number of bytes of available @@ -68483,7 +68483,7 @@ static int moveToChild(BtCursor *pCur, u32 newPgno){ #ifdef SQLITE_DEBUG /* -** Page pParent is an internal (non-leaf) tree page. This function +** Page pParent is an internal (non-leaf) tree page. This function ** asserts that page number iChild is the left-child if the iIdx'th ** cell in page pParent. Or, if iIdx is equal to the total number of ** cells in pParent, that page number iChild is the right-child of @@ -68500,7 +68500,7 @@ static void assertParentIndex(MemPage *pParent, int iIdx, Pgno iChild){ } } #else -# define assertParentIndex(x,y,z) +# define assertParentIndex(x,y,z) #endif /* @@ -68518,8 +68518,8 @@ static void moveToParent(BtCursor *pCur){ assert( pCur->iPage>0 ); assert( pCur->pPage ); assertParentIndex( - pCur->apPage[pCur->iPage-1], - pCur->aiIdx[pCur->iPage-1], + pCur->apPage[pCur->iPage-1], + pCur->aiIdx[pCur->iPage-1], pCur->pPage->pgno ); testcase( pCur->aiIdx[pCur->iPage-1] > pCur->apPage[pCur->iPage-1]->nCell ); @@ -68536,19 +68536,19 @@ static void moveToParent(BtCursor *pCur){ ** ** If the table has a virtual root page, then the cursor is moved to point ** to the virtual root page instead of the actual root page. A table has a -** virtual root page when the actual root page contains no cells and a +** virtual root page when the actual root page contains no cells and a ** single child page. This can only happen with the table rooted at page 1. ** -** If the b-tree structure is empty, the cursor state is set to +** If the b-tree structure is empty, the cursor state is set to ** CURSOR_INVALID and this routine returns SQLITE_EMPTY. Otherwise, ** the cursor is set to point to the first cell located on the root ** (or virtual root) page and the cursor state is set to CURSOR_VALID. ** ** If this function returns successfully, it may be assumed that the -** page-header flags indicate that the [virtual] root-page is the expected +** page-header flags indicate that the [virtual] root-page is the expected ** kind of b-tree page (i.e. if when opening the cursor the caller did not ** specify a KeyInfo structure the flags byte is set to 0x05 or 0x0D, -** indicating a table b-tree, or if the caller did specify a KeyInfo +** indicating a table b-tree, or if the caller did specify a KeyInfo ** structure the flags byte is set to 0x02 or 0x0A, indicating an index ** b-tree). */ @@ -68599,19 +68599,19 @@ static int moveToRoot(BtCursor *pCur){ /* If pCur->pKeyInfo is not NULL, then the caller that opened this cursor ** expected to open it on an index b-tree. Otherwise, if pKeyInfo is ** NULL, the caller expects a table b-tree. If this is not the case, - ** return an SQLITE_CORRUPT error. + ** return an SQLITE_CORRUPT error. ** ** Earlier versions of SQLite assumed that this test could not fail ** if the root page was already loaded when this function was called (i.e. - ** if pCur->iPage>=0). But this is not so if the database is corrupted - ** in such a way that page pRoot is linked into a second b-tree table + ** if pCur->iPage>=0). But this is not so if the database is corrupted + ** in such a way that page pRoot is linked into a second b-tree table ** (or the freelist). */ assert( pRoot->intKey==1 || pRoot->intKey==0 ); if( pRoot->isInit==0 || (pCur->pKeyInfo==0)!=pRoot->intKey ){ return SQLITE_CORRUPT_PAGE(pCur->pPage); } -skip_init: +skip_init: pCur->ix = 0; pCur->info.nSize = 0; pCur->curFlags &= ~(BTCF_AtLast|BTCF_ValidNKey|BTCF_ValidOvfl); @@ -68711,14 +68711,14 @@ SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor *pCur, int *pRes){ */ SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor *pCur, int *pRes){ int rc; - + assert( cursorOwnsBtShared(pCur) ); assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); /* If the cursor already points to the last entry, this is a no-op. */ if( CURSOR_VALID==pCur->eState && (pCur->curFlags & BTCF_AtLast)!=0 ){ #ifdef SQLITE_DEBUG - /* This block serves to assert() that the cursor really does point + /* This block serves to assert() that the cursor really does point ** to the last entry in the b-tree. */ int ii; for(ii=0; iiiPage; ii++){ @@ -68749,10 +68749,10 @@ SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor *pCur, int *pRes){ return rc; } -/* Move the cursor so that it points to an entry near the key +/* Move the cursor so that it points to an entry near the key ** specified by pIdxKey or intKey. Return a success code. ** -** For INTKEY tables, the intKey parameter is used. pIdxKey +** For INTKEY tables, the intKey parameter is used. pIdxKey ** must be NULL. For index tables, pIdxKey is used and intKey ** is ignored. ** @@ -68762,7 +68762,7 @@ SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor *pCur, int *pRes){ ** before or after the key. ** ** An integer is written into *pRes which is the result of -** comparing the key with the entry to which the cursor is +** comparing the key with the entry to which the cursor is ** pointing. The meaning of the integer written into ** *pRes is as follows: ** @@ -68777,7 +68777,7 @@ SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor *pCur, int *pRes){ ** is larger than intKey/pIdxKey. ** ** For index tables, the pIdxKey->eqSeen field is set to 1 if there -** exists an entry in the table that exactly matches pIdxKey. +** exists an entry in the table that exactly matches pIdxKey. */ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( BtCursor *pCur, /* The cursor to be moved */ @@ -68833,8 +68833,8 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( if( pIdxKey ){ xRecordCompare = sqlite3VdbeFindCompare(pIdxKey); pIdxKey->errCode = 0; - assert( pIdxKey->default_rc==1 - || pIdxKey->default_rc==0 + assert( pIdxKey->default_rc==1 + || pIdxKey->default_rc==0 || pIdxKey->default_rc==-1 ); }else{ @@ -68918,9 +68918,9 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( /* The maximum supported page-size is 65536 bytes. This means that ** the maximum number of record bytes stored on an index B-Tree ** page is less than 16384 bytes and may be stored as a 2-byte - ** varint. This information is used to attempt to avoid parsing - ** the entire cell by checking for the cases where the record is - ** stored entirely within the b-tree page by inspecting the first + ** varint. This information is used to attempt to avoid parsing + ** the entire cell by checking for the cases where the record is + ** stored entirely within the b-tree page by inspecting the first ** 2 bytes of the cell. */ nCell = pCell[0]; @@ -68930,10 +68930,10 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( ** b-tree page. */ testcase( pCell+nCell+1==pPage->aDataEnd ); c = xRecordCompare(nCell, (void*)&pCell[1], pIdxKey); - }else if( !(pCell[1] & 0x80) + }else if( !(pCell[1] & 0x80) && (nCell = ((nCell&0x7f)<<7) + pCell[1])<=pPage->maxLocal ){ - /* The record-size field is a 2 byte varint and the record + /* The record-size field is a 2 byte varint and the record ** fits entirely on the main b-tree page. */ testcase( pCell+nCell+2==pPage->aDataEnd ); c = xRecordCompare(nCell, (void*)&pCell[2], pIdxKey); @@ -68941,10 +68941,10 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( /* The record flows over onto one or more overflow pages. In ** this case the whole cell needs to be parsed, a buffer allocated ** and accessPayload() used to retrieve the record into the - ** buffer before VdbeRecordCompare() can be called. + ** buffer before VdbeRecordCompare() can be called. ** ** If the record is corrupt, the xRecordCompare routine may read - ** up to two varints past the end of the buffer. An extra 18 + ** up to two varints past the end of the buffer. An extra 18 ** bytes of padding is allocated at the end of the buffer in ** case this happens. */ void *pCellKey; @@ -68976,7 +68976,7 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( c = sqlite3VdbeRecordCompare(nCell, pCellKey, pIdxKey); sqlite3_free(pCellKey); } - assert( + assert( (pIdxKey->errCode!=SQLITE_CORRUPT || c==0) && (pIdxKey->errCode!=SQLITE_NOMEM || pCur->pBtree->db->mallocFailed) ); @@ -69040,7 +69040,7 @@ SQLITE_PRIVATE int sqlite3BtreeEof(BtCursor *pCur){ /* ** Return an estimate for the number of rows in the table that pCur is -** pointing to. Return a negative number if no estimate is currently +** pointing to. Return a negative number if no estimate is currently ** available. */ SQLITE_PRIVATE i64 sqlite3BtreeRowCountEst(BtCursor *pCur){ @@ -69064,7 +69064,7 @@ SQLITE_PRIVATE i64 sqlite3BtreeRowCountEst(BtCursor *pCur){ } /* -** Advance the cursor to the next entry in the database. +** Advance the cursor to the next entry in the database. ** Return value: ** ** SQLITE_OK success @@ -69117,7 +69117,7 @@ static SQLITE_NOINLINE int btreeNext(BtCursor *pCur){ return SQLITE_CORRUPT_BKPT; } - /* If the database file is corrupt, it is possible for the value of idx + /* If the database file is corrupt, it is possible for the value of idx ** to be invalid here. This can only occur if a second cursor modifies ** the page while cursor pCur is holding a reference to it. Which can ** only happen if the database is corrupt in such a way as to link the @@ -69266,7 +69266,7 @@ SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor *pCur, int flags){ ** SQLITE_OK is returned on success. Any other return value indicates ** an error. *ppPage is set to NULL in the event of an error. ** -** If the "nearby" parameter is not 0, then an effort is made to +** If the "nearby" parameter is not 0, then an effort is made to ** locate a page close to the page number "nearby". This can be used in an ** attempt to keep related pages close to each other in the database file, ** which in turn can make database access faster. @@ -69308,7 +69308,7 @@ static int allocateBtreePage( Pgno iTrunk; u8 searchList = 0; /* If the free-list must be searched for 'nearby' */ u32 nSearch = 0; /* Count of the number of search attempts */ - + /* If eMode==BTALLOC_EXACT and a query of the pointer-map ** shows that the page 'nearby' is somewhere on the free-list, then ** the entire-list will be searched for that page. @@ -69371,8 +69371,8 @@ static int allocateBtreePage( ** is the number of leaf page pointers to follow. */ k = get4byte(&pTrunk->aData[4]); if( k==0 && !searchList ){ - /* The trunk has no leaves and the list is not being searched. - ** So extract the trunk page itself and use it as the newly + /* The trunk has no leaves and the list is not being searched. + ** So extract the trunk page itself and use it as the newly ** allocated page */ assert( pPrevTrunk==0 ); rc = sqlite3PagerWrite(pTrunk->pDbPage); @@ -69389,8 +69389,8 @@ static int allocateBtreePage( rc = SQLITE_CORRUPT_PGNO(iTrunk); goto end_allocate_page; #ifndef SQLITE_OMIT_AUTOVACUUM - }else if( searchList - && (nearby==iTrunk || (iTrunkaData[0], &pTrunk->aData[0], 4); } }else{ - /* The trunk page is required by the caller but it contains + /* The trunk page is required by the caller but it contains ** pointers to free-list leaves. The first leaf becomes a trunk ** page in this case. */ MemPage *pNewTrunk; Pgno iNewTrunk = get4byte(&pTrunk->aData[8]); - if( iNewTrunk>mxPage ){ + if( iNewTrunk>mxPage ){ rc = SQLITE_CORRUPT_PGNO(iTrunk); goto end_allocate_page; } @@ -69489,8 +69489,8 @@ static int allocateBtreePage( goto end_allocate_page; } testcase( iPage==mxPage ); - if( !searchList - || (iPage==nearby || (iPagepPage1; /* Local reference to page 1 */ MemPage *pPage; /* Page being freed. May be NULL. */ int rc; /* Return Code */ @@ -69705,7 +69705,7 @@ static int freePage2(BtShared *pBt, MemPage *pMemPage, Pgno iPage){ /* If control flows to this point, then it was not possible to add the ** the page being freed as a leaf page of the first trunk in the free-list. - ** Possibly because the free-list is empty, or possibly because the + ** Possibly because the free-list is empty, or possibly because the ** first trunk in the free-list is full. Either way, the page being freed ** will become the new first trunk page in the free-list. */ @@ -69766,15 +69766,15 @@ static int clearCell( assert( pBt->usableSize > 4 ); ovflPageSize = pBt->usableSize - 4; nOvfl = (pInfo->nPayload - pInfo->nLocal + ovflPageSize - 1)/ovflPageSize; - assert( nOvfl>0 || + assert( nOvfl>0 || (CORRUPT_DB && (pInfo->nPayload + ovflPageSize)btreePagecount(pBt) ){ - /* 0 is not a legal page number and page 1 cannot be an - ** overflow page. Therefore if ovflPgno<2 or past the end of the + /* 0 is not a legal page number and page 1 cannot be an + ** overflow page. Therefore if ovflPgno<2 or past the end of the ** file the database must be corrupt. */ return SQLITE_CORRUPT_BKPT; } @@ -69786,11 +69786,11 @@ static int clearCell( if( ( pOvfl || ((pOvfl = btreePageLookup(pBt, ovflPgno))!=0) ) && sqlite3PagerPageRefcount(pOvfl->pDbPage)!=1 ){ - /* There is no reason any cursor should have an outstanding reference + /* There is no reason any cursor should have an outstanding reference ** to an overflow page belonging to a cell that is being deleted/updated. - ** So if there exists more than one reference to this page, then it - ** must not really be an overflow page and the database must be corrupt. - ** It is helpful to detect this before calling freePage2(), as + ** So if there exists more than one reference to this page, then it + ** must not really be an overflow page and the database must be corrupt. + ** It is helpful to detect this before calling freePage2(), as ** freePage2() may zero the page contents if secure-delete mode is ** enabled. If this 'overflow' page happens to be a page that the ** caller is iterating through or using in some other way, this @@ -69861,7 +69861,7 @@ static int fillInCell( pSrc = pX->pKey; nHeader += putVarint32(&pCell[nHeader], nPayload); } - + /* Fill in the payload */ pPayload = &pCell[nHeader]; if( nPayload<=pPage->maxLocal ){ @@ -69952,8 +69952,8 @@ static int fillInCell( if( pBt->autoVacuum ){ do{ pgnoOvfl++; - } while( - PTRMAP_ISPAGE(pBt, pgnoOvfl) || pgnoOvfl==PENDING_BYTE_PAGE(pBt) + } while( + PTRMAP_ISPAGE(pBt, pgnoOvfl) || pgnoOvfl==PENDING_BYTE_PAGE(pBt) ); } #endif @@ -69961,9 +69961,9 @@ static int fillInCell( #ifndef SQLITE_OMIT_AUTOVACUUM /* If the database supports auto-vacuum, and the second or subsequent ** overflow page is being allocated, add an entry to the pointer-map - ** for that page now. + ** for that page now. ** - ** If this is the first overflow page, then write a partial entry + ** If this is the first overflow page, then write a partial entry ** to the pointer-map. If we write nothing to this pointer-map slot, ** then the optimistic overflow chain processing in clearCell() ** may misinterpret the uninitialized values and delete the @@ -70062,8 +70062,8 @@ static void dropCell(MemPage *pPage, int idx, int sz, int *pRC){ ** will not fit, then make a copy of the cell content into pTemp if ** pTemp is not null. Regardless of pTemp, allocate a new entry ** in pPage->apOvfl[] and make it point to the cell content (either -** in pTemp or the original pCell) and also record its index. -** Allocating a new entry in pPage->aCell[] implies that +** in pTemp or the original pCell) and also record its index. +** Allocating a new entry in pPage->aCell[] implies that ** pPage->nOverflow is incremented. ** ** *pRC must be SQLITE_OK when this routine is called. @@ -70288,16 +70288,16 @@ static u16 cachedCellSize(CellArray *p, int N){ } /* -** Array apCell[] contains pointers to nCell b-tree page cells. The +** Array apCell[] contains pointers to nCell b-tree page cells. The ** szCell[] array contains the size in bytes of each cell. This function ** replaces the current contents of page pPg with the contents of the cell ** array. ** ** Some of the cells in apCell[] may currently be stored in pPg. This -** function works around problems caused by this by making a copy of any +** function works around problems caused by this by making a copy of any ** such cells before overwriting the page data. ** -** The MemPage.nFree field is invalidated by this function. It is the +** The MemPage.nFree field is invalidated by this function. It is the ** responsibility of the caller to set it correctly. */ static int rebuildPage( @@ -70380,7 +70380,7 @@ static int rebuildPage( ** cell in the array. It is the responsibility of the caller to ensure ** that it is safe to overwrite this part of the cell-pointer array. ** -** When this function is called, *ppData points to the start of the +** When this function is called, *ppData points to the start of the ** content area on page pPg. If the size of the content area is extended, ** *ppData is updated to point to the new start of the content area ** before returning. @@ -70650,12 +70650,12 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ assert( sqlite3_mutex_held(pPage->pBt->mutex) ); assert( sqlite3PagerIswriteable(pParent->pDbPage) ); assert( pPage->nOverflow==1 ); - + if( pPage->nCell==0 ) return SQLITE_CORRUPT_BKPT; /* dbfuzz001.test */ assert( pPage->nFree>=0 ); assert( pParent->nFree>=0 ); - /* Allocate a new page. This page will become the right-sibling of + /* Allocate a new page. This page will become the right-sibling of ** pPage. Make the parent page writable, so that the new divider cell ** may be inserted. If both these operations are successful, proceed. */ @@ -70686,7 +70686,7 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ pNew->nFree = pBt->usableSize - pNew->cellOffset - 2 - szCell; /* If this is an auto-vacuum database, update the pointer map - ** with entries for the new page, and any pointer from the + ** with entries for the new page, and any pointer from the ** cell on the page to an overflow page. If either of these ** operations fails, the return code is set, but the contents ** of the parent page are still manipulated by thh code below. @@ -70700,14 +70700,14 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ ptrmapPutOvflPtr(pNew, pNew, pCell, &rc); } } - + /* Create a divider cell to insert into pParent. The divider cell ** consists of a 4-byte page number (the page number of pPage) and ** a variable length key value (which must be the same value as the ** largest key on pPage). ** - ** To find the largest key value on pPage, first find the right-most - ** cell on pPage. The first two fields of this cell are the + ** To find the largest key value on pPage, first find the right-most + ** cell on pPage. The first two fields of this cell are the ** record-length (a variable length integer at most 32-bits in size) ** and the key value (a variable length integer, may have any value). ** The first of the while(...) loops below skips over the record-length @@ -70728,7 +70728,7 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ /* Set the right-child pointer of pParent to point to the new page. */ put4byte(&pParent->aData[pParent->hdrOffset+8], pgnoNew); - + /* Release the reference to the new page. */ releasePage(pNew); } @@ -70740,7 +70740,7 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ #if 0 /* ** This function does not contribute anything to the operation of SQLite. -** it is sometimes activated temporarily while debugging code responsible +** it is sometimes activated temporarily while debugging code responsible ** for setting pointer-map entries. */ static int ptrmapCheckPages(MemPage **apPage, int nPage){ @@ -70755,7 +70755,7 @@ static int ptrmapCheckPages(MemPage **apPage, int nPage){ for(j=0; jnCell; j++){ CellInfo info; u8 *z; - + z = findCell(pPage, j); pPage->xParseCell(pPage, z, &info); if( info.nLocalpgno==1) ? 100 : 0); int rc; int iData; - - + + assert( pFrom->isInit ); assert( pFrom->nFree>=iToHdr ); assert( get2byte(&aFrom[iFromHdr+5]) <= (int)pBt->usableSize ); - + /* Copy the b-tree node content from page pFrom to page pTo. */ iData = get2byte(&aFrom[iFromHdr+5]); memcpy(&aTo[iData], &aFrom[iData], pBt->usableSize-iData); memcpy(&aTo[iToHdr], &aFrom[iFromHdr], pFrom->cellOffset + 2*pFrom->nCell); - + /* Reinitialize page pTo so that the contents of the MemPage structure ** match the new data. The initialization of pTo can actually fail under - ** fairly obscure circumstances, even though it is a copy of initialized + ** fairly obscure circumstances, even though it is a copy of initialized ** page pFrom. */ pTo->isInit = 0; @@ -70828,7 +70828,7 @@ static void copyNodeContent(MemPage *pFrom, MemPage *pTo, int *pRC){ *pRC = rc; return; } - + /* If this is an auto-vacuum database, update the pointer-map entries ** for any b-tree or overflow pages that pTo now contains the pointers to. */ @@ -70843,13 +70843,13 @@ static void copyNodeContent(MemPage *pFrom, MemPage *pTo, int *pRC){ ** (hereafter "the page") and up to 2 siblings so that all pages have about the ** same amount of free space. Usually a single sibling on either side of the ** page are used in the balancing, though both siblings might come from one -** side if the page is the first or last child of its parent. If the page +** side if the page is the first or last child of its parent. If the page ** has fewer than 2 siblings (something which can only happen if the page ** is a root page or a child of a root page) then all available siblings ** participate in the balancing. ** -** The number of siblings of the page might be increased or decreased by -** one or two in an effort to keep pages nearly full but not over full. +** The number of siblings of the page might be increased or decreased by +** one or two in an effort to keep pages nearly full but not over full. ** ** Note that when this routine is called, some of the cells on the page ** might not actually be stored in MemPage.aData[]. This can happen @@ -70860,7 +70860,7 @@ static void copyNodeContent(MemPage *pFrom, MemPage *pTo, int *pRC){ ** inserted into or removed from the parent page (pParent). Doing so ** may cause the parent page to become overfull or underfull. If this ** happens, it is the responsibility of the caller to invoke the correct -** balancing routine to fix this problem (see the balance() routine). +** balancing routine to fix this problem (see the balance() routine). ** ** If this routine fails for any reason, it might leave the database ** in a corrupted state. So if this routine fails, the database should @@ -70875,7 +70875,7 @@ static void copyNodeContent(MemPage *pFrom, MemPage *pTo, int *pRC){ ** of the page-size, the aOvflSpace[] buffer is guaranteed to be large ** enough for all overflow cells. ** -** If aOvflSpace is set to a null pointer, this function returns +** If aOvflSpace is set to a null pointer, this function returns ** SQLITE_NOMEM. */ static int balance_nonroot( @@ -70922,7 +70922,7 @@ static int balance_nonroot( assert( sqlite3PagerIswriteable(pParent->pDbPage) ); /* At this point pParent may have at most one overflow cell. And if - ** this overflow cell is present, it must be the cell with + ** this overflow cell is present, it must be the cell with ** index iParentIdx. This scenario comes about when this function ** is called (indirectly) from sqlite3BtreeDelete(). */ @@ -70934,11 +70934,11 @@ static int balance_nonroot( } assert( pParent->nFree>=0 ); - /* Find the sibling pages to balance. Also locate the cells in pParent - ** that divide the siblings. An attempt is made to find NN siblings on - ** either side of pPage. More siblings are taken from one side, however, + /* Find the sibling pages to balance. Also locate the cells in pParent + ** that divide the siblings. An attempt is made to find NN siblings on + ** either side of pPage. More siblings are taken from one side, however, ** if there are fewer than NN siblings on the other side. If pParent - ** has NB or fewer children then all children of pParent are taken. + ** has NB or fewer children then all children of pParent are taken. ** ** This loop also drops the divider cells from the parent page. This ** way, the remainder of the function does not have to deal with any @@ -70950,7 +70950,7 @@ static int balance_nonroot( nxDiv = 0; }else{ assert( bBulk==0 || bBulk==1 ); - if( iParentIdx==0 ){ + if( iParentIdx==0 ){ nxDiv = 0; }else if( iParentIdx==i ){ nxDiv = i-2+bBulk; @@ -70996,7 +70996,7 @@ static int balance_nonroot( ** This is safe because dropping a cell only overwrites the first ** four bytes of it, and this function does not need the first ** four bytes of the divider cell. So the pointer is safe to use - ** later on. + ** later on. ** ** But not if we are in secure-delete mode. In secure-delete mode, ** the dropCell() routine will overwrite the entire cell with zeroes. @@ -71162,7 +71162,7 @@ static int balance_nonroot( ** Figure out the number of pages needed to hold all b.nCell cells. ** Store this number in "k". Also compute szNew[] which is the total ** size of all cells on the i-th page and cntNew[] which is the index - ** in b.apCell[] of the cell that divides page i from page i+1. + ** in b.apCell[] of the cell that divides page i from page i+1. ** cntNew[k] should equal b.nCell. ** ** Values computed by this block: @@ -71172,7 +71172,7 @@ static int balance_nonroot( ** cntNew[i]: Index in b.apCell[] and b.szCell[] for the first cell to ** the right of the i-th sibling page. ** usableSpace: Number of bytes of space available on each sibling. - ** + ** */ usableSpace = pBt->usableSize - 12 + leafCorrection; for(i=k=0; ipgno); /* If the sibling pages are not leaves, ensure that the right-child pointer - ** of the right-most new sibling page is set to the value that was + ** of the right-most new sibling page is set to the value that was ** originally in the same field of the right-most old sibling page. */ if( (pageFlags & PTF_LEAF)==0 && nOld!=nNew ){ MemPage *pOld = (nNew>nOld ? apNew : apOld)[nOld-1]; memcpy(&apNew[nNew-1]->aData[8], &pOld->aData[8], 4); } - /* Make any required updates to pointer map entries associated with + /* Make any required updates to pointer map entries associated with ** cells stored on sibling pages following the balance operation. Pointer ** map entries associated with divider cells are set by the insertCell() ** routine. The associated pointer map entries are: @@ -71407,9 +71407,9 @@ static int balance_nonroot( ** b) if the sibling pages are not leaves, the child page associated ** with the cell. ** - ** If the sibling pages are not leaves, then the pointer map entry - ** associated with the right-child of each sibling may also need to be - ** updated. This happens below, after the sibling pages have been + ** If the sibling pages are not leaves, then the pointer map entry + ** associated with the right-child of each sibling may also need to be + ** updated. This happens below, after the sibling pages have been ** populated, not here. */ if( ISAUTOVACUUM ){ @@ -71434,7 +71434,7 @@ static int balance_nonroot( } /* Cell pCell is destined for new sibling page pNew. Originally, it - ** was either part of sibling page iOld (possibly an overflow cell), + ** was either part of sibling page iOld (possibly an overflow cell), ** or else the divider cell to the left of sibling page iOld. So, ** if sibling page iOld had the same page number as pNew, and if ** pCell really was a part of sibling page iOld (not a divider or @@ -71470,9 +71470,9 @@ static int balance_nonroot( if( !pNew->leaf ){ memcpy(&pNew->aData[8], pCell, 4); }else if( leafData ){ - /* If the tree is a leaf-data tree, and the siblings are leaves, - ** then there is no divider cell in b.apCell[]. Instead, the divider - ** cell consists of the integer key for the right-most cell of + /* If the tree is a leaf-data tree, and the siblings are leaves, + ** then there is no divider cell in b.apCell[]. Instead, the divider + ** cell consists of the integer key for the right-most cell of ** the sibling-page assembled above only. */ CellInfo info; @@ -71485,9 +71485,9 @@ static int balance_nonroot( pCell -= 4; /* Obscure case for non-leaf-data trees: If the cell at pCell was ** previously stored on a leaf node, and its reported size was 4 - ** bytes, then it may actually be smaller than this + ** bytes, then it may actually be smaller than this ** (see btreeParseCellPtr(), 4 bytes is the minimum size of - ** any cell). But it is important to pass the correct size to + ** any cell). But it is important to pass the correct size to ** insertCell(), so reparse the cell now. ** ** This can only happen for b-trees used to evaluate "IN (SELECT ...)" @@ -71579,8 +71579,8 @@ static int balance_nonroot( ** b-tree structure by one. This is described as the "balance-shallower" ** sub-algorithm in some documentation. ** - ** If this is an auto-vacuum database, the call to copyNodeContent() - ** sets all pointer-map entries corresponding to database image pages + ** If this is an auto-vacuum database, the call to copyNodeContent() + ** sets all pointer-map entries corresponding to database image pages ** for which the pointer is stored within the content being copied. ** ** It is critical that the child page be defragmented before being @@ -71591,7 +71591,7 @@ static int balance_nonroot( assert( nNew==1 || CORRUPT_DB ); rc = defragmentPage(apNew[0], -1); testcase( rc!=SQLITE_OK ); - assert( apNew[0]->nFree == + assert( apNew[0]->nFree == (get2byteNotZero(&apNew[0]->aData[5]) - apNew[0]->cellOffset - apNew[0]->nCell*2) || rc!=SQLITE_OK @@ -71621,7 +71621,7 @@ static int balance_nonroot( #if 0 if( ISAUTOVACUUM && rc==SQLITE_OK && apNew[0]->isInit ){ /* The ptrmapCheckPages() contains assert() statements that verify that - ** all pointer map pages are set correctly. This is helpful while + ** all pointer map pages are set correctly. This is helpful while ** debugging. This is usually disabled because a corrupt database may ** cause an assert() statement to fail. */ ptrmapCheckPages(apNew, nNew); @@ -71651,15 +71651,15 @@ balance_cleanup: ** ** A new child page is allocated and the contents of the current root ** page, including overflow cells, are copied into the child. The root -** page is then overwritten to make it an empty page with the right-child +** page is then overwritten to make it an empty page with the right-child ** pointer pointing to the new page. ** -** Before returning, all pointer-map entries corresponding to pages +** Before returning, all pointer-map entries corresponding to pages ** that the new child-page now contains pointers to are updated. The ** entry corresponding to the new right-child pointer of the root ** page is also updated. ** -** If successful, *ppChild is set to contain a reference to the child +** If successful, *ppChild is set to contain a reference to the child ** page and SQLITE_OK is returned. In this case the caller is required ** to call releasePage() on *ppChild exactly once. If an error occurs, ** an error code is returned and *ppChild is set to 0. @@ -71673,7 +71673,7 @@ static int balance_deeper(MemPage *pRoot, MemPage **ppChild){ assert( pRoot->nOverflow>0 ); assert( sqlite3_mutex_held(pBt->mutex) ); - /* Make pRoot, the root page of the b-tree, writable. Allocate a new + /* Make pRoot, the root page of the b-tree, writable. Allocate a new ** page that will become the new right-child of pPage. Copy the contents ** of the node stored on pRoot into the new child page. */ @@ -71714,7 +71714,7 @@ static int balance_deeper(MemPage *pRoot, MemPage **ppChild){ /* ** The page that pCur currently points to has just been modified in ** some way. This function figures out if this modification means the -** tree needs to be balanced, and if so calls the appropriate balancing +** tree needs to be balanced, and if so calls the appropriate balancing ** routine. Balancing routines are: ** ** balance_quick() @@ -71743,7 +71743,7 @@ static int balance(BtCursor *pCur){ ** balance_deeper() function to create a new child for the root-page ** and copy the current contents of the root-page to it. The ** next iteration of the do-loop will balance the child page. - */ + */ assert( balance_deeper_called==0 ); VVA_ONLY( balance_deeper_called++ ); rc = balance_deeper(pPage, &pCur->apPage[1]); @@ -71777,17 +71777,17 @@ static int balance(BtCursor *pCur){ /* Call balance_quick() to create a new sibling of pPage on which ** to store the overflow cell. balance_quick() inserts a new cell ** into pParent, which may cause pParent overflow. If this - ** happens, the next iteration of the do-loop will balance pParent + ** happens, the next iteration of the do-loop will balance pParent ** use either balance_nonroot() or balance_deeper(). Until this ** happens, the overflow cell is stored in the aBalanceQuickSpace[] - ** buffer. + ** buffer. ** ** The purpose of the following assert() is to check that only a ** single call to balance_quick() is made for each call to this ** function. If this were not verified, a subtle bug involving reuse ** of the aBalanceQuickSpace[] might sneak in. */ - assert( balance_quick_called==0 ); + assert( balance_quick_called==0 ); VVA_ONLY( balance_quick_called++ ); rc = balance_quick(pParent, pPage, aBalanceQuickSpace); }else @@ -71798,15 +71798,15 @@ static int balance(BtCursor *pCur){ ** modifying the contents of pParent, which may cause pParent to ** become overfull or underfull. The next iteration of the do-loop ** will balance the parent page to correct this. - ** + ** ** If the parent page becomes overfull, the overflow cell or cells - ** are stored in the pSpace buffer allocated immediately below. + ** are stored in the pSpace buffer allocated immediately below. ** A subsequent iteration of the do-loop will deal with this by ** calling balance_nonroot() (balance_deeper() may be called first, ** but it doesn't deal with overflow cells - just moves them to a - ** different page). Once this subsequent call to balance_nonroot() + ** different page). Once this subsequent call to balance_nonroot() ** has completed, it is safe to release the pSpace buffer used by - ** the previous call, as the overflow cell data will have been + ** the previous call, as the overflow cell data will have been ** copied either into the body of a database page or into the new ** pSpace buffer passed to the latter call to balance_nonroot(). */ @@ -71814,9 +71814,9 @@ static int balance(BtCursor *pCur){ rc = balance_nonroot(pParent, iIdx, pSpace, iPage==1, pCur->hints&BTREE_BULKLOAD); if( pFree ){ - /* If pFree is not NULL, it points to the pSpace buffer used + /* If pFree is not NULL, it points to the pSpace buffer used ** by a previous call to balance_nonroot(). Its contents are - ** now stored either on real database pages or within the + ** now stored either on real database pages or within the ** new pSpace buffer, so it may be safely freed here. */ sqlite3PageFree(pFree); } @@ -71935,7 +71935,7 @@ static int btreeOverwriteCell(BtCursor *pCur, const BtreePayload *pX){ if( rc ) return rc; iOffset += ovflPageSize; }while( iOffsetpKeyInfo==0 ){ assert( pX->pKey==0 ); - /* If this is an insert into a table b-tree, invalidate any incrblob + /* If this is an insert into a table b-tree, invalidate any incrblob ** cursors open on the row being replaced */ invalidateIncrblobCursors(p, pCur->pgnoRoot, pX->nKey, 0); - /* If BTREE_SAVEPOSITION is set, the cursor must already be pointing + /* If BTREE_SAVEPOSITION is set, the cursor must already be pointing ** to a row with the same key as the new entry being inserted. */ #ifdef SQLITE_DEBUG @@ -72065,7 +72065,7 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( }else{ /* This is an index or a WITHOUT ROWID table */ - /* If BTREE_SAVEPOSITION is set, the cursor must already be pointing + /* If BTREE_SAVEPOSITION is set, the cursor must already be pointing ** to a row with the same key as the new entry being inserted. */ assert( (flags & BTREE_SAVEPOSITION)==0 || loc==0 ); @@ -72144,14 +72144,14 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( rc = clearCell(pPage, oldCell, &info); testcase( pCur->curFlags & BTCF_ValidOvfl ); invalidateOverflowCache(pCur); - if( info.nSize==szNew && info.nLocal==info.nPayload + if( info.nSize==szNew && info.nLocal==info.nPayload && (!ISAUTOVACUUM || szNewminLocal) ){ /* Overwrite the old cell with the new if they are the same size. ** We could also try to do this if the old cell is smaller, then add ** the leftover space to the free list. But experiments show that ** doing that is no faster then skipping this optimization and just - ** calling dropCell() and insertCell(). + ** calling dropCell() and insertCell(). ** ** This optimization cannot be used on an autovacuum database if the ** new entry uses overflow pages, as the insertCell() call below is @@ -72179,7 +72179,7 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( assert( pPage->nOverflow==0 || rc==SQLITE_OK ); assert( rc!=SQLITE_OK || pPage->nCell>0 || pPage->nOverflow>0 ); - /* If no error has occurred and pPage has an overflow cell, call balance() + /* If no error has occurred and pPage has an overflow cell, call balance() ** to redistribute the cells within the tree. Since balance() may move ** the cursor, zero the BtCursor.info.nSize and BTCF_ValidNKey ** variables. @@ -72206,7 +72206,7 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( rc = balance(pCur); /* Must make sure nOverflow is reset to zero even if the balance() - ** fails. Internal data structure corruption will result otherwise. + ** fails. Internal data structure corruption will result otherwise. ** Also, set the cursor state to invalid. This stops saveCursorPosition() ** from trying to save the current position of the cursor. */ pCur->pPage->nOverflow = 0; @@ -72233,7 +72233,7 @@ end_insert: } /* -** Delete the entry that the cursor is pointing to. +** Delete the entry that the cursor is pointing to. ** ** If the BTREE_SAVEPOSITION bit of the flags parameter is zero, then ** the cursor is left pointing at an arbitrary location after the delete. @@ -72251,12 +72251,12 @@ end_insert: */ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ Btree *p = pCur->pBtree; - BtShared *pBt = p->pBt; + BtShared *pBt = p->pBt; int rc; /* Return code */ MemPage *pPage; /* Page to delete cell from */ unsigned char *pCell; /* Pointer to cell to delete */ int iCellIdx; /* Index of cell to delete */ - int iCellDepth; /* Depth of node containing pCell */ + int iCellDepth; /* Depth of node containing pCell */ CellInfo info; /* Size of the cell being deleted */ int bSkipnext = 0; /* Leaf cursor in SKIPNEXT state */ u8 bPreserve = flags & BTREE_SAVEPOSITION; /* Keep cursor valid */ @@ -72283,14 +72283,14 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ /* If the bPreserve flag is set to true, then the cursor position must ** be preserved following this delete operation. If the current delete ** will cause a b-tree rebalance, then this is done by saving the cursor - ** key and leaving the cursor in CURSOR_REQUIRESEEK state before - ** returning. + ** key and leaving the cursor in CURSOR_REQUIRESEEK state before + ** returning. ** ** Or, if the current delete will not cause a rebalance, then the cursor ** will be left in CURSOR_SKIPNEXT state pointing to the entry immediately ** before or after the deleted entry. In this case set bSkipnext to true. */ if( bPreserve ){ - if( !pPage->leaf + if( !pPage->leaf || (pPage->nFree+cellSizePtr(pPage,pCell)+2)>(int)(pBt->usableSize*2/3) || pPage->nCell==1 /* See dbfuzz001.test for a test case */ ){ @@ -72385,7 +72385,7 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ ** on the leaf node first. If the balance proceeds far enough up the ** tree that we can be sure that any problem in the internal node has ** been corrected, so be it. Otherwise, after balancing the leaf node, - ** walk the cursor up the tree to the internal node and balance it as + ** walk the cursor up the tree to the internal node and balance it as ** well. */ rc = balance(pCur); if( rc==SQLITE_OK && pCur->iPage>iCellDepth ){ @@ -72539,7 +72539,7 @@ static int btreeCreateTable(Btree *p, int *piTable, int createTabFlags){ } }else{ pRoot = pPageMove; - } + } /* Update the pointer-map and meta-data with the new root-page number. */ ptrmapPut(pBt, pgnoRoot, PTRMAP_ROOTPAGE, 0, &rc); @@ -72692,12 +72692,12 @@ SQLITE_PRIVATE int sqlite3BtreeClearTableOfCursor(BtCursor *pCur){ ** cursors on the table. ** ** If AUTOVACUUM is enabled and the page at iTable is not the last -** root page in the database file, then the last root page +** root page in the database file, then the last root page ** in the database file is moved into the slot formerly occupied by ** iTable and that last slot formerly occupied by the last root page ** is added to the freelist instead of iTable. In this say, all ** root pages are kept at the beginning of the database file, which -** is necessary for AUTOVACUUM to work right. *piMoved is set to the +** is necessary for AUTOVACUUM to work right. *piMoved is set to the ** page number that used to be the last root page in the file before ** the move. If no page gets moved, *piMoved is set to 0. ** The last root page is recorded in meta[3] and the value of @@ -72735,7 +72735,7 @@ static int btreeDropTable(Btree *p, Pgno iTable, int *piMoved){ if( iTable==maxRootPgno ){ /* If the table being dropped is the table with the largest root-page - ** number in the database, put the root page on the free list. + ** number in the database, put the root page on the free list. */ freePage(pPage, &rc); releasePage(pPage); @@ -72744,7 +72744,7 @@ static int btreeDropTable(Btree *p, Pgno iTable, int *piMoved){ } }else{ /* The table being dropped does not have the largest root-page - ** number in the database. So move the page that does into the + ** number in the database. So move the page that does into the ** gap left by the deleted root-page. */ MemPage *pMove; @@ -72786,7 +72786,7 @@ static int btreeDropTable(Btree *p, Pgno iTable, int *piMoved){ releasePage(pPage); } #endif - return rc; + return rc; } SQLITE_PRIVATE int sqlite3BtreeDropTable(Btree *p, int iTable, int *piMoved){ int rc; @@ -72805,7 +72805,7 @@ SQLITE_PRIVATE int sqlite3BtreeDropTable(Btree *p, int iTable, int *piMoved){ ** is the number of free pages currently in the database. Meta[1] ** through meta[15] are available for use by higher layers. Meta[0] ** is read-only, the others are read/write. -** +** ** The schema layer numbers meta values differently. At the schema ** layer (and the SetCookie and ReadCookie opcodes) the number of ** free pages is not visible. So Cookie[0] is the same as Meta[1]. @@ -72876,7 +72876,7 @@ SQLITE_PRIVATE int sqlite3BtreeUpdateMeta(Btree *p, int idx, u32 iMeta){ ** The first argument, pCur, is a cursor opened on some b-tree. Count the ** number of entries in the b-tree and write the result to *pnEntry. ** -** SQLITE_OK is returned if the operation is successfully executed. +** SQLITE_OK is returned if the operation is successfully executed. ** Otherwise, if an error is encountered (i.e. an IO error or database ** corruption) an SQLite error code is returned. */ @@ -72891,13 +72891,13 @@ SQLITE_PRIVATE int sqlite3BtreeCount(BtCursor *pCur, i64 *pnEntry){ } /* Unless an error occurs, the following loop runs one iteration for each - ** page in the B-Tree structure (not including overflow pages). + ** page in the B-Tree structure (not including overflow pages). */ while( rc==SQLITE_OK ){ int iIdx; /* Index of child node in parent */ MemPage *pPage; /* Current page of the b-tree */ - /* If this is a leaf page or the tree is not an int-key tree, then + /* If this is a leaf page or the tree is not an int-key tree, then ** this page contains countable entries. Increment the entry counter ** accordingly. */ @@ -72906,7 +72906,7 @@ SQLITE_PRIVATE int sqlite3BtreeCount(BtCursor *pCur, i64 *pnEntry){ nEntry += pPage->nCell; } - /* pPage is a leaf node. This loop navigates the cursor so that it + /* pPage is a leaf node. This loop navigates the cursor so that it ** points to the first interior cell that it points to the parent of ** the next page in the tree that has not yet been visited. The ** pCur->aiIdx[pCur->iPage] value is set to the index of the parent cell @@ -72930,7 +72930,7 @@ SQLITE_PRIVATE int sqlite3BtreeCount(BtCursor *pCur, i64 *pnEntry){ pPage = pCur->pPage; } - /* Descend to the child node of the cell that the cursor currently + /* Descend to the child node of the cell that the cursor currently ** points at. This is the right-child if (iIdx==pPage->nCell). */ iIdx = pCur->ix; @@ -73025,7 +73025,7 @@ static int checkRef(IntegrityCk *pCheck, Pgno iPage){ #ifndef SQLITE_OMIT_AUTOVACUUM /* -** Check that the entry in the pointer-map for page iChild maps to +** Check that the entry in the pointer-map for page iChild maps to ** page iParent, pointer type ptrType. If not, append an error message ** to pCheck. */ @@ -73048,7 +73048,7 @@ static void checkPtrmap( if( ePtrmapType!=eType || iPtrmapParent!=iParent ){ checkAppendMsg(pCheck, - "Bad ptr map entry key=%d expected=(%d,%d) got=(%d,%d)", + "Bad ptr map entry key=%d expected=(%d,%d) got=(%d,%d)", iChild, eType, iParent, ePtrmapType, iPtrmapParent); } } @@ -73143,7 +73143,7 @@ static void checkList( ** property. ** ** This heap is used for cell overlap and coverage testing. Each u32 -** entry represents the span of a cell or freeblock on a btree page. +** entry represents the span of a cell or freeblock on a btree page. ** The upper 16 bits are the index of the first byte of a range and the ** lower 16 bits are the index of the last byte of that range. */ @@ -73173,7 +73173,7 @@ static int btreeHeapPull(u32 *aHeap, u32 *pOut){ aHeap[j] = x; i = j; } - return 1; + return 1; } #ifndef SQLITE_OMIT_INTEGRITY_CHECK @@ -73181,7 +73181,7 @@ static int btreeHeapPull(u32 *aHeap, u32 *pOut){ ** Do various sanity checks on a single page of a tree. Return ** the tree depth. Root pages return 0. Parents of root pages ** return 1, and so forth. -** +** ** These checks are done: ** ** 1. Make sure that cells and freeblocks do not overlap @@ -73379,7 +73379,7 @@ static int checkTreePage( ** ** EVIDENCE-OF: R-20690-50594 The second field of the b-tree page header ** is the offset of the first freeblock, or zero if there are no - ** freeblocks on the page. + ** freeblocks on the page. */ i = get2byte(&data[hdr+1]); while( i>0 ){ @@ -73399,13 +73399,13 @@ static int checkTreePage( assert( (u32)j<=usableSize-4 ); /* Enforced by btreeComputeFreeSpace() */ i = j; } - /* Analyze the min-heap looking for overlap between cells and/or + /* Analyze the min-heap looking for overlap between cells and/or ** freeblocks, and counting the number of untracked bytes in nFrag. - ** + ** ** Each min-heap entry is of the form: (start_address<<16)|end_address. ** There is an implied first entry the covers the page header, the cell ** pointer index, and the gap between the cell pointer index and the start - ** of cell content. + ** of cell content. ** ** The loop below pulls entries from the min-heap in order and compares ** the start_address against the previous end_address. If there is an @@ -73562,11 +73562,11 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck( /* If the database supports auto-vacuum, make sure no tables contain ** references to pointer-map pages. */ - if( getPageReferenced(&sCheck, i)==0 && + if( getPageReferenced(&sCheck, i)==0 && (PTRMAP_PAGENO(pBt, i)!=i || !pBt->autoVacuum) ){ checkAppendMsg(&sCheck, "Page %d is never used", i); } - if( getPageReferenced(&sCheck, i)!=0 && + if( getPageReferenced(&sCheck, i)!=0 && (PTRMAP_PAGENO(pBt, i)==i && pBt->autoVacuum) ){ checkAppendMsg(&sCheck, "Pointer map page %d is referenced", i); } @@ -73628,7 +73628,7 @@ SQLITE_PRIVATE int sqlite3BtreeIsInTrans(Btree *p){ /* ** Run a checkpoint on the Btree passed as the first argument. ** -** Return SQLITE_LOCKED if this or any other connection has an open +** Return SQLITE_LOCKED if this or any other connection has an open ** transaction on the shared-cache the argument Btree is connected to. ** ** Parameter eMode is one of SQLITE_CHECKPOINT_PASSIVE, FULL or RESTART. @@ -73667,20 +73667,20 @@ SQLITE_PRIVATE int sqlite3BtreeIsInBackup(Btree *p){ /* ** This function returns a pointer to a blob of memory associated with ** a single shared-btree. The memory is used by client code for its own -** purposes (for example, to store a high-level schema associated with +** purposes (for example, to store a high-level schema associated with ** the shared-btree). The btree layer manages reference counting issues. ** ** The first time this is called on a shared-btree, nBytes bytes of memory -** are allocated, zeroed, and returned to the caller. For each subsequent +** are allocated, zeroed, and returned to the caller. For each subsequent ** call the nBytes parameter is ignored and a pointer to the same blob -** of memory returned. +** of memory returned. ** ** If the nBytes parameter is 0 and the blob of memory has not yet been ** allocated, a null pointer is returned. If the blob has already been ** allocated, it is returned as normal. ** -** Just before the shared-btree is closed, the function passed as the -** xFree argument when the memory allocation was made is invoked on the +** Just before the shared-btree is closed, the function passed as the +** xFree argument when the memory allocation was made is invoked on the ** blob of allocated memory. The xFree function should not call sqlite3_free() ** on the memory, the btree layer does that. */ @@ -73696,8 +73696,8 @@ SQLITE_PRIVATE void *sqlite3BtreeSchema(Btree *p, int nBytes, void(*xFree)(void } /* -** Return SQLITE_LOCKED_SHAREDCACHE if another user of the same shared -** btree as the argument handle holds an exclusive lock on the +** Return SQLITE_LOCKED_SHAREDCACHE if another user of the same shared +** btree as the argument handle holds an exclusive lock on the ** sqlite_master table. Otherwise SQLITE_OK. */ SQLITE_PRIVATE int sqlite3BtreeSchemaLocked(Btree *p){ @@ -73738,11 +73738,11 @@ SQLITE_PRIVATE int sqlite3BtreeLockTable(Btree *p, int iTab, u8 isWriteLock){ #ifndef SQLITE_OMIT_INCRBLOB /* -** Argument pCsr must be a cursor opened for writing on an -** INTKEY table currently pointing at a valid table entry. +** Argument pCsr must be a cursor opened for writing on an +** INTKEY table currently pointing at a valid table entry. ** This function modifies the data stored as part of that entry. ** -** Only the data content may only be modified, it is not possible to +** Only the data content may only be modified, it is not possible to ** change the length of the data stored. If this function is called with ** parameters that attempt to write past the end of the existing data, ** no modifications are made and SQLITE_CORRUPT is returned. @@ -73773,7 +73773,7 @@ SQLITE_PRIVATE int sqlite3BtreePutData(BtCursor *pCsr, u32 offset, u32 amt, void VVA_ONLY(rc =) saveAllCursors(pCsr->pBt, pCsr->pgnoRoot, pCsr); assert( rc==SQLITE_OK ); - /* Check some assumptions: + /* Check some assumptions: ** (a) the cursor is open for writing, ** (b) there is a read/write transaction open, ** (c) the connection holds a write-lock on the table (if required), @@ -73792,7 +73792,7 @@ SQLITE_PRIVATE int sqlite3BtreePutData(BtCursor *pCsr, u32 offset, u32 amt, void return accessPayload(pCsr, offset, amt, (unsigned char *)z, 1); } -/* +/* ** Mark this cursor as an incremental blob cursor. */ SQLITE_PRIVATE void sqlite3BtreeIncrblobCursor(BtCursor *pCur){ @@ -73802,14 +73802,14 @@ SQLITE_PRIVATE void sqlite3BtreeIncrblobCursor(BtCursor *pCur){ #endif /* -** Set both the "read version" (single byte at byte offset 18) and +** Set both the "read version" (single byte at byte offset 18) and ** "write version" (single byte at byte offset 19) fields in the database ** header to iVersion. */ SQLITE_PRIVATE int sqlite3BtreeSetVersion(Btree *pBtree, int iVersion){ BtShared *pBt = pBtree->pBt; int rc; /* Return code */ - + assert( iVersion==1 || iVersion==2 ); /* If setting the version fields to 1, do not automatically open the @@ -73867,7 +73867,7 @@ SQLITE_PRIVATE int sqlite3BtreeSharable(Btree *p){ /* ** Return the number of connections to the BtShared object accessed by -** the Btree handle passed as the only argument. For private caches +** the Btree handle passed as the only argument. For private caches ** this is always 1. For shared caches it may be 1 or greater. */ SQLITE_PRIVATE int sqlite3BtreeConnectionCount(Btree *p){ @@ -73889,7 +73889,7 @@ SQLITE_PRIVATE int sqlite3BtreeConnectionCount(Btree *p){ ** May you share freely, never taking more than you give. ** ************************************************************************* -** This file contains the implementation of the sqlite3_backup_XXX() +** This file contains the implementation of the sqlite3_backup_XXX() ** API functions and the related features. */ /* #include "sqliteInt.h" */ @@ -73926,15 +73926,15 @@ struct sqlite3_backup { ** Once it has been created using backup_init(), a single sqlite3_backup ** structure may be accessed via two groups of thread-safe entry points: ** -** * Via the sqlite3_backup_XXX() API function backup_step() and +** * Via the sqlite3_backup_XXX() API function backup_step() and ** backup_finish(). Both these functions obtain the source database -** handle mutex and the mutex associated with the source BtShared +** handle mutex and the mutex associated with the source BtShared ** structure, in that order. ** ** * Via the BackupUpdate() and BackupRestart() functions, which are ** invoked by the pager layer to report various state changes in ** the page cache associated with the source database. The mutex -** associated with the source database BtShared structure will always +** associated with the source database BtShared structure will always ** be held when either of these functions are invoked. ** ** The other sqlite3_backup_XXX() API functions, backup_remaining() and @@ -73955,8 +73955,8 @@ struct sqlite3_backup { ** in connection handle pDb. If such a database cannot be found, return ** a NULL pointer and write an error message to pErrorDb. ** -** If the "temp" database is requested, it may need to be opened by this -** function. If an error occurs while doing so, return 0 and write an +** If the "temp" database is requested, it may need to be opened by this +** function. If an error occurs while doing so, return 0 and write an ** error message to pErrorDb. */ static Btree *findBtree(sqlite3 *pErrorDb, sqlite3 *pDb, const char *zDb){ @@ -73999,7 +73999,7 @@ static int setDestPgsz(sqlite3_backup *p){ /* ** Check that there is no open read-transaction on the b-tree passed as the ** second argument. If there is not, return SQLITE_OK. Otherwise, if there -** is an open read-transaction, return SQLITE_ERROR and leave an error +** is an open read-transaction, return SQLITE_ERROR and leave an error ** message in database handle db. */ static int checkReadTransaction(sqlite3 *db, Btree *p){ @@ -74069,13 +74069,13 @@ SQLITE_API sqlite3_backup *sqlite3_backup_init( p->iNext = 1; p->isAttached = 0; - if( 0==p->pSrc || 0==p->pDest - || checkReadTransaction(pDestDb, p->pDest)!=SQLITE_OK + if( 0==p->pSrc || 0==p->pDest + || checkReadTransaction(pDestDb, p->pDest)!=SQLITE_OK ){ /* One (or both) of the named databases did not exist or an OOM ** error was hit. Or there is a transaction open on the destination - ** database. The error has already been written into the pDestDb - ** handle. All that is left to do here is free the sqlite3_backup + ** database. The error has already been written into the pDestDb + ** handle. All that is left to do here is free the sqlite3_backup ** structure. */ sqlite3_free(p); p = 0; @@ -74091,7 +74091,7 @@ SQLITE_API sqlite3_backup *sqlite3_backup_init( } /* -** Argument rc is an SQLite error code. Return true if this error is +** Argument rc is an SQLite error code. Return true if this error is ** considered fatal if encountered during a backup operation. All errors ** are considered fatal except for SQLITE_BUSY and SQLITE_LOCKED. */ @@ -74100,8 +74100,8 @@ static int isFatalError(int rc){ } /* -** Parameter zSrcData points to a buffer containing the data for -** page iSrcPg from the source database. Copy this data into the +** Parameter zSrcData points to a buffer containing the data for +** page iSrcPg from the source database. Copy this data into the ** destination database. */ static int backupOnePage( @@ -74132,7 +74132,7 @@ static int backupOnePage( assert( zSrcData ); /* Catch the case where the destination is an in-memory database and the - ** page sizes of the source and destination differ. + ** page sizes of the source and destination differ. */ if( nSrcPgsz!=nDestPgsz && sqlite3PagerIsMemdb(pDestPager) ){ rc = SQLITE_READONLY; @@ -74158,7 +74158,7 @@ static int backupOnePage( } #endif - /* This loop runs once for each destination page spanned by the source + /* This loop runs once for each destination page spanned by the source ** page. For each iteration, variable iOff is set to the byte offset ** of the destination page. */ @@ -74177,7 +74177,7 @@ static int backupOnePage( ** Then clear the Btree layer MemPage.isInit flag. Both this module ** and the pager code use this trick (clearing the first byte ** of the page 'extra' space to invalidate the Btree layers - ** cached parse of the page). MemPage.isInit is marked + ** cached parse of the page). MemPage.isInit is marked ** "MUST BE FIRST" for this purpose. */ memcpy(zOut, zIn, nCopy); @@ -74197,7 +74197,7 @@ static int backupOnePage( ** exactly iSize bytes. If pFile is not larger than iSize bytes, then ** this function is a no-op. ** -** Return SQLITE_OK if everything is successful, or an SQLite error +** Return SQLITE_OK if everything is successful, or an SQLite error ** code if an error occurs. */ static int backupTruncateFile(sqlite3_file *pFile, i64 iSize){ @@ -74279,7 +74279,7 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ /* Lock the destination database, if it is not locked already. */ if( SQLITE_OK==rc && p->bDestLocked==0 && SQLITE_OK==(rc = sqlite3BtreeBeginTrans(p->pDest, 2, - (int*)&p->iDestSchema)) + (int*)&p->iDestSchema)) ){ p->bDestLocked = 1; } @@ -74292,7 +74292,7 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ if( SQLITE_OK==rc && destMode==PAGER_JOURNALMODE_WAL && pgszSrc!=pgszDest ){ rc = SQLITE_READONLY; } - + /* Now that there is a read-lock on the source database, query the ** source pager for the number of pages in the database. */ @@ -74319,7 +74319,7 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ attachBackupObject(p); } } - + /* Update the schema version field in the destination database. This ** is to make sure that the schema-version really does change in ** the case where the source and destination databases have the @@ -74345,12 +74345,12 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ int nDestTruncate; /* Set nDestTruncate to the final number of pages in the destination ** database. The complication here is that the destination page - ** size may be different to the source page size. + ** size may be different to the source page size. ** - ** If the source page size is smaller than the destination page size, + ** If the source page size is smaller than the destination page size, ** round up. In this case the call to sqlite3OsTruncate() below will ** fix the size of the file. However it is important to call - ** sqlite3PagerTruncateImage() here so that any pages in the + ** sqlite3PagerTruncateImage() here so that any pages in the ** destination file that lie beyond the nDestTruncate page mark are ** journalled by PagerCommitPhaseOne() before they are destroyed ** by the file truncation. @@ -74374,7 +74374,7 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ ** ** * The destination may need to be truncated, and ** - ** * Data stored on the pages immediately following the + ** * Data stored on the pages immediately following the ** pending-byte page in the source database may need to be ** copied into the destination database. */ @@ -74386,7 +74386,7 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ i64 iEnd; assert( pFile ); - assert( nDestTruncate==0 + assert( nDestTruncate==0 || (i64)nDestTruncate*(i64)pgszDest >= iSize || ( nDestTruncate==(int)(PENDING_BYTE_PAGE(p->pDest->pBt)-1) && iSize>=PENDING_BYTE && iSize<=PENDING_BYTE+pgszDest @@ -74396,7 +74396,7 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ ** database has been stored in the journal for pDestPager and the ** journal synced to disk. So at this point we may safely modify ** the database file in any way, knowing that if a power failure - ** occurs, the original database will be reconstructed from the + ** occurs, the original database will be reconstructed from the ** journal file. */ sqlite3PagerPagecount(pDestPager, &nDstPage); for(iPg=nDestTruncate; rc==SQLITE_OK && iPg<=(Pgno)nDstPage; iPg++){ @@ -74416,8 +74416,8 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ /* Write the extra pages and truncate the database file as required */ iEnd = MIN(PENDING_BYTE + pgszDest, iSize); for( - iOff=PENDING_BYTE+pgszSrc; - rc==SQLITE_OK && iOffpDest, 0)) @@ -74450,7 +74450,7 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ } } } - + /* If bCloseTrans is true, then this function opened a read transaction ** on the source database. Close the read transaction here. There is ** no need to check the return values of the btree methods here, as @@ -74462,7 +74462,7 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ TESTONLY( rc2 |= ) sqlite3BtreeCommitPhaseTwo(p->pSrc, 0); assert( rc2==SQLITE_OK ); } - + if( rc==SQLITE_IOERR_NOMEM ){ rc = SQLITE_NOMEM_BKPT; } @@ -74544,7 +74544,7 @@ SQLITE_API int sqlite3_backup_remaining(sqlite3_backup *p){ } /* -** Return the total number of pages in the source database as of the most +** Return the total number of pages in the source database as of the most ** recent call to sqlite3_backup_step(). */ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p){ @@ -74559,7 +74559,7 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p){ /* ** This function is called after the contents of page iPage of the -** source database have been modified. If page iPage has already been +** source database have been modified. If page iPage has already been ** copied into the destination database, then the data written to the ** destination is now invalidated. The destination copy of iPage needs ** to be updated with the new data before the backup operation is @@ -74602,7 +74602,7 @@ SQLITE_PRIVATE void sqlite3BackupUpdate(sqlite3_backup *pBackup, Pgno iPage, con ** Restart the backup process. This is called when the pager layer ** detects that the database has been modified by an external database ** connection. In this case there is no way of knowing which of the -** pages that have been copied into the destination database are still +** pages that have been copied into the destination database are still ** valid and which are not, so the entire process needs to be restarted. ** ** It is assumed that the mutex associated with the BtShared object @@ -74622,8 +74622,8 @@ SQLITE_PRIVATE void sqlite3BackupRestart(sqlite3_backup *pBackup){ ** Copy the complete content of pBtFrom into pBtTo. A transaction ** must be active for both files. ** -** The size of file pTo may be reduced by this operation. If anything -** goes wrong, the transaction on pTo is rolled back. If successful, the +** The size of file pTo may be reduced by this operation. If anything +** goes wrong, the transaction on pTo is rolled back. If successful, the ** transaction is committed before returning. */ SQLITE_PRIVATE int sqlite3BtreeCopyFile(Btree *pTo, Btree *pFrom){ @@ -74659,9 +74659,9 @@ SQLITE_PRIVATE int sqlite3BtreeCopyFile(Btree *pTo, Btree *pFrom){ /* 0x7FFFFFFF is the hard limit for the number of pages in a database ** file. By passing this as the number of pages to copy to - ** sqlite3_backup_step(), we can guarantee that the copy finishes + ** sqlite3_backup_step(), we can guarantee that the copy finishes ** within a single call (unless an error occurs). The assert() statement - ** checks this assumption - (p->rc) should be set to either SQLITE_DONE + ** checks this assumption - (p->rc) should be set to either SQLITE_DONE ** or an error code. */ sqlite3_backup_step(&b, 0x7FFFFFFF); assert( b.rc!=SQLITE_OK ); @@ -74716,7 +74716,7 @@ copy_finished: ** this: assert( sqlite3VdbeCheckMemInvariants(pMem) ); */ SQLITE_PRIVATE int sqlite3VdbeCheckMemInvariants(Mem *p){ - /* If MEM_Dyn is set then Mem.xDel!=0. + /* If MEM_Dyn is set then Mem.xDel!=0. ** Mem.xDel might not be initialized if MEM_Dyn is clear. */ assert( (p->flags & MEM_Dyn)==0 || p->xDel!=0 ); @@ -74771,7 +74771,7 @@ SQLITE_PRIVATE int sqlite3VdbeCheckMemInvariants(Mem *p){ ** (4) A static string or blob */ if( (p->flags & (MEM_Str|MEM_Blob)) && p->n>0 ){ - assert( + assert( ((p->szMalloc>0 && p->z==p->zMalloc)? 1 : 0) + ((p->flags&MEM_Dyn)!=0 ? 1 : 0) + ((p->flags&MEM_Ephem)!=0 ? 1 : 0) + @@ -75139,7 +75139,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem *pMem, FuncDef *pFunc){ ** This routine calls the xValue method for that function and stores ** the results in memory cell pMem. ** -** SQLITE_ERROR is returned if xValue() reports an error. SQLITE_OK +** SQLITE_ERROR is returned if xValue() reports an error. SQLITE_OK ** otherwise. */ #ifndef SQLITE_OMIT_WINDOWFUNC @@ -75317,7 +75317,7 @@ SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem *pMem){ /* ** Return 1 if pMem represents true, and return 0 if pMem represents false. -** Return the value ifNull if pMem is NULL. +** Return the value ifNull if pMem is NULL. */ SQLITE_PRIVATE int sqlite3VdbeBooleanValue(Mem *pMem, int ifNull){ testcase( pMem->flags & MEM_IntReal ); @@ -75507,7 +75507,7 @@ SQLITE_PRIVATE void sqlite3VdbeMemSetNull(Mem *pMem){ } } SQLITE_PRIVATE void sqlite3ValueSetNull(sqlite3_value *p){ - sqlite3VdbeMemSetNull((Mem*)p); + sqlite3VdbeMemSetNull((Mem*)p); } /* @@ -75628,7 +75628,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemTooBig(Mem *p){ } return n>p->db->aLimit[SQLITE_LIMIT_LENGTH]; } - return 0; + return 0; } #ifdef SQLITE_DEBUG @@ -75656,7 +75656,7 @@ SQLITE_PRIVATE void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){ assert( (mFlags&MEM_Real)==0 || pMem->u.r==pX->u.r ); assert( (mFlags&MEM_Str)==0 || (pMem->n==pX->n && pMem->z==pX->z) ); assert( (mFlags&MEM_Blob)==0 || sqlite3BlobCompare(pMem,pX)==0 ); - + /* pMem is the register that is changing. But also mark pX as ** undefined so that we can quickly detect the shallow-copy error */ pX->flags = MEM_Undefined; @@ -75733,8 +75733,8 @@ SQLITE_PRIVATE void sqlite3VdbeMemMove(Mem *pTo, Mem *pFrom){ ** Change the value of a Mem to be a string or a BLOB. ** ** The memory management strategy depends on the value of the xDel -** parameter. If the value passed is SQLITE_TRANSIENT, then the -** string is copied into a (possibly existing) buffer managed by the +** parameter. If the value passed is SQLITE_TRANSIENT, then the +** string is copied into a (possibly existing) buffer managed by the ** Mem structure. Otherwise, any existing buffer is freed and the ** pointer copied. ** @@ -75879,7 +75879,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemFromBtree( assert( sqlite3BtreeCursorIsValid(pCur) ); assert( !VdbeMemDynamic(pMem) ); - /* Note: the calls to BtreeKeyFetch() and DataFetch() below assert() + /* Note: the calls to BtreeKeyFetch() and DataFetch() below assert() ** that both the BtShared and database handle mutexes are held. */ assert( !sqlite3VdbeMemIsRowSet(pMem) ); zData = (char *)sqlite3BtreePayloadFetch(pCur, &available); @@ -75972,7 +75972,7 @@ SQLITE_PRIVATE sqlite3_value *sqlite3ValueNew(sqlite3 *db){ } /* -** Context object passed by sqlite3Stat4ProbeSetValue() through to +** Context object passed by sqlite3Stat4ProbeSetValue() through to ** valueNew(). See comments above valueNew() for details. */ struct ValueNewStat4Ctx { @@ -75987,9 +75987,9 @@ struct ValueNewStat4Ctx { ** the second argument to this function is NULL, the object is allocated ** by calling sqlite3ValueNew(). ** -** Otherwise, if the second argument is non-zero, then this function is +** Otherwise, if the second argument is non-zero, then this function is ** being called indirectly by sqlite3Stat4ProbeSetValue(). If it has not -** already been allocated, allocate the UnpackedRecord structure that +** already been allocated, allocate the UnpackedRecord structure that ** that function will return to its caller here. Then return a pointer to ** an sqlite3_value within the UnpackedRecord.a[] array. */ @@ -76003,7 +76003,7 @@ static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){ int nByte; /* Bytes of space to allocate */ int i; /* Counter variable */ int nCol = pIdx->nColumn; /* Number of index columns including rowid */ - + nByte = sizeof(Mem) * nCol + ROUND8(sizeof(UnpackedRecord)); pRec = (UnpackedRecord*)sqlite3DbMallocZero(db, nByte); if( pRec ){ @@ -76024,7 +76024,7 @@ static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){ if( pRec==0 ) return 0; p->ppRec[0] = pRec; } - + pRec->nField = p->iVal+1; return &pRec->aMem[p->iVal]; } @@ -76043,11 +76043,11 @@ static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){ ** * the SQLITE_FUNC_NEEDCOLL function flag is not set, ** ** then this routine attempts to invoke the SQL function. Assuming no -** error occurs, output parameter (*ppVal) is set to point to a value +** error occurs, output parameter (*ppVal) is set to point to a value ** object containing the result before returning SQLITE_OK. ** ** Affinity aff is applied to the result of the function before returning. -** If the result is a text value, the sqlite3_value object uses encoding +** If the result is a text value, the sqlite3_value object uses encoding ** enc. ** ** If the conditions above are not met, this function returns SQLITE_OK @@ -76078,7 +76078,7 @@ static int valueFromFunction( if( pList ) nVal = pList->nExpr; pFunc = sqlite3FindFunction(db, p->u.zToken, nVal, enc, 0); assert( pFunc ); - if( (pFunc->funcFlags & (SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG))==0 + if( (pFunc->funcFlags & (SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG))==0 || (pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL) ){ return SQLITE_OK; @@ -76226,7 +76226,7 @@ static int valueFromExpr( } }else if( op==TK_UMINUS ) { /* This branch happens for multiple negative signs. Ex: -(-5) */ - if( SQLITE_OK==valueFromExpr(db,pExpr->pLeft,enc,affinity,&pVal,pCtx) + if( SQLITE_OK==valueFromExpr(db,pExpr->pLeft,enc,affinity,&pVal,pCtx) && pVal!=0 ){ sqlite3VdbeMemNumerify(pVal); @@ -76371,8 +76371,8 @@ static int stat4ValueFromExpr( } /* -** This function is used to allocate and populate UnpackedRecord -** structures intended to be compared against sample index keys stored +** This function is used to allocate and populate UnpackedRecord +** structures intended to be compared against sample index keys stored ** in the sqlite_stat4 table. ** ** A single call to this function populates zero or more fields of the @@ -76383,14 +76383,14 @@ static int stat4ValueFromExpr( ** ** * The expression is a bound variable, and this is a reprepare, or ** -** * The sqlite3ValueFromExpr() function is able to extract a value +** * The sqlite3ValueFromExpr() function is able to extract a value ** from the expression (i.e. the expression is a literal value). ** ** Or, if pExpr is a TK_VECTOR, one field is populated for each of the ** vector components that match either of the two latter criteria listed ** above. ** -** Before any value is appended to the record, the affinity of the +** Before any value is appended to the record, the affinity of the ** corresponding column within index pIdx is applied to it. Before ** this function returns, output parameter *pnExtract is set to the ** number of values appended to the record. @@ -76441,9 +76441,9 @@ SQLITE_PRIVATE int sqlite3Stat4ProbeSetValue( /* ** Attempt to extract a value from expression pExpr using the methods -** as described for sqlite3Stat4ProbeSetValue() above. +** as described for sqlite3Stat4ProbeSetValue() above. ** -** If successful, set *ppVal to point to a new value object and return +** If successful, set *ppVal to point to a new value object and return ** SQLITE_OK. If no value can be extracted, but no other error occurs ** (e.g. OOM), return SQLITE_OK and set *ppVal to NULL. Or, if an error ** does occur, return an SQLite error code. The final value of *ppVal @@ -76463,7 +76463,7 @@ SQLITE_PRIVATE int sqlite3Stat4ValueFromExpr( ** the column value into *ppVal. If *ppVal is initially NULL then a new ** sqlite3_value object is allocated. ** -** If *ppVal is initially NULL then the caller is responsible for +** If *ppVal is initially NULL then the caller is responsible for ** ensuring that the value written into *ppVal is eventually freed. */ SQLITE_PRIVATE int sqlite3Stat4Column( @@ -76587,7 +76587,7 @@ SQLITE_PRIVATE int sqlite3ValueBytes(sqlite3_value *pVal, u8 enc){ ** ************************************************************************* ** This file contains code used for creating, destroying, and populating -** a VDBE (or an "sqlite3_stmt" as it is known to the outside world.) +** a VDBE (or an "sqlite3_stmt" as it is known to the outside world.) */ /* #include "sqliteInt.h" */ /* #include "vdbeInt.h" */ @@ -76711,13 +76711,13 @@ SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe *pA, Vdbe *pB){ } /* -** Resize the Vdbe.aOp array so that it is at least nOp elements larger +** Resize the Vdbe.aOp array so that it is at least nOp elements larger ** than its current size. nOp is guaranteed to be less than or equal ** to 1024/sizeof(Op). ** ** If an out-of-memory error occurs while resizing the array, return -** SQLITE_NOMEM. In this case Vdbe.aOp and Vdbe.nOpAlloc remain -** unchanged (this is so that any opcodes already allocated can be +** SQLITE_NOMEM. In this case Vdbe.aOp and Vdbe.nOpAlloc remain +** unchanged (this is so that any opcodes already allocated can be ** correctly deallocated along with the rest of the Vdbe). */ static int growOpArray(Vdbe *v, int nOp){ @@ -76725,7 +76725,7 @@ static int growOpArray(Vdbe *v, int nOp){ Parse *p = v->pParse; /* The SQLITE_TEST_REALLOC_STRESS compile-time option is designed to force - ** more frequent reallocs and hence provide more opportunities for + ** more frequent reallocs and hence provide more opportunities for ** simulated OOM faults. SQLITE_TEST_REALLOC_STRESS is generally used ** during testing only. With SQLITE_TEST_REALLOC_STRESS grow the op array ** by the minimum* amount required until the size reaches 512. Normal @@ -77114,19 +77114,19 @@ SQLITE_PRIVATE void sqlite3VdbeReusable(Vdbe *p){ /* ** The following type and function are used to iterate through all opcodes -** in a Vdbe main program and each of the sub-programs (triggers) it may +** in a Vdbe main program and each of the sub-programs (triggers) it may ** invoke directly or indirectly. It should be used as follows: ** ** Op *pOp; ** VdbeOpIter sIter; ** ** memset(&sIter, 0, sizeof(sIter)); -** sIter.v = v; // v is of type Vdbe* +** sIter.v = v; // v is of type Vdbe* ** while( (pOp = opIterNext(&sIter)) ){ ** // Do something with pOp ** } ** sqlite3DbFree(v->db, sIter.apSub); -** +** */ typedef struct VdbeOpIter VdbeOpIter; struct VdbeOpIter { @@ -77159,7 +77159,7 @@ static Op *opIterNext(VdbeOpIter *p){ p->iSub++; p->iAddr = 0; } - + if( pRet->p4type==P4_SUBPROGRAM ){ int nByte = (p->nSub+1)*sizeof(SubProgram*); int j; @@ -77192,7 +77192,7 @@ static Op *opIterNext(VdbeOpIter *p){ ** * OP_VUpdate ** * OP_VRename ** * OP_FkCounter with P2==0 (immediate foreign key constraint) -** * OP_CreateBtree/BTREE_INTKEY and OP_InitCoroutine +** * OP_CreateBtree/BTREE_INTKEY and OP_InitCoroutine ** (for CREATE TABLE AS SELECT ...) ** ** Then check that the value of Parse.mayAbort is true if an @@ -77215,10 +77215,10 @@ SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ while( (pOp = opIterNext(&sIter))!=0 ){ int opcode = pOp->opcode; - if( opcode==OP_Destroy || opcode==OP_VUpdate || opcode==OP_VRename + if( opcode==OP_Destroy || opcode==OP_VUpdate || opcode==OP_VRename || opcode==OP_VDestroy || (opcode==OP_ParseSchema && pOp->p4.z==0) - || ((opcode==OP_Halt || opcode==OP_HaltIfNull) + || ((opcode==OP_Halt || opcode==OP_HaltIfNull) && ((pOp->p1)!=SQLITE_OK && pOp->p2==OE_Abort)) ){ hasAbort = 1; @@ -77227,7 +77227,7 @@ SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ if( opcode==OP_CreateBtree && pOp->p3==BTREE_INTKEY ) hasCreateTable = 1; if( mayAbort ){ /* hasCreateIndex may also be set for some DELETE statements that use - ** OP_Clear. So this routine may end up returning true in the case + ** OP_Clear. So this routine may end up returning true in the case ** where a "DELETE FROM tbl" has a statement-journal but does not ** require one. This is not so bad - it is an inefficiency, not a bug. */ if( opcode==OP_CreateBtree && pOp->p3==BTREE_BLOBKEY ) hasCreateIndex = 1; @@ -77343,7 +77343,7 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ pOp->p4.xAdvance = sqlite3BtreeNext; pOp->p4type = P4_ADVANCE; /* The code generator never codes any of these opcodes as a jump - ** to a label. They are always coded as a jump backwards to a + ** to a label. They are always coded as a jump backwards to a ** known address */ assert( pOp->p2>=0 ); break; @@ -77352,7 +77352,7 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ pOp->p4.xAdvance = sqlite3BtreePrevious; pOp->p4type = P4_ADVANCE; /* The code generator never codes any of these opcodes as a jump - ** to a label. They are always coded as a jump backwards to a + ** to a label. They are always coded as a jump backwards to a ** known address */ assert( pOp->p2>=0 ); break; @@ -77450,12 +77450,12 @@ SQLITE_PRIVATE void sqlite3VdbeVerifyAbortable(Vdbe *p, int onError){ /* ** This function returns a pointer to the array of opcodes associated with ** the Vdbe passed as the first argument. It is the callers responsibility -** to arrange for the returned array to be eventually freed using the +** to arrange for the returned array to be eventually freed using the ** vdbeFreeOpArray() function. ** ** Before returning, *pnOp is set to the number of entries in the returned -** array. Also, *pnMaxArg is set to the larger of its current value and -** the number of entries in the Vdbe.apArg[] array required to execute the +** array. Also, *pnMaxArg is set to the larger of its current value and +** the number of entries in the Vdbe.apArg[] array required to execute the ** returned program. */ SQLITE_PRIVATE VdbeOp *sqlite3VdbeTakeOpArray(Vdbe *p, int *pnOp, int *pnMaxArg){ @@ -77529,7 +77529,7 @@ SQLITE_PRIVATE VdbeOp *sqlite3VdbeAddOpList( SQLITE_PRIVATE void sqlite3VdbeScanStatus( Vdbe *p, /* VM to add scanstatus() to */ int addrExplain, /* Address of OP_Explain (or 0) */ - int addrLoop, /* Address of loop counter */ + int addrLoop, /* Address of loop counter */ int addrVisit, /* Address of rows visited counter */ LogEst nEst, /* Estimated number of output rows */ const char *zName /* Name of table or index being scanned */ @@ -77649,8 +77649,8 @@ static void freeP4(sqlite3 *db, int p4type, void *p4){ /* ** Free the space allocated for aOp and any p4 values allocated for the -** opcodes contained within. If aOp is not NULL it is assumed to contain -** nOp entries. +** opcodes contained within. If aOp is not NULL it is assumed to contain +** nOp entries. */ static void vdbeFreeOpArray(sqlite3 *db, Op *aOp, int nOp){ if( aOp ){ @@ -77659,7 +77659,7 @@ static void vdbeFreeOpArray(sqlite3 *db, Op *aOp, int nOp){ if( pOp->p4type <= P4_FREE_IF_LE ) freeP4(db, pOp->p4type, pOp->p4.p); #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS sqlite3DbFree(db, pOp->zComment); -#endif +#endif } sqlite3DbFreeNN(db, aOp); } @@ -77712,7 +77712,7 @@ SQLITE_PRIVATE int sqlite3VdbeDeletePriorOpcode(Vdbe *p, u8 op){ ** the string is made into memory obtained from sqlite3_malloc(). ** A value of n==0 means copy bytes of zP4 up to and including the ** first null byte. If n>0 then copy n+1 bytes of zP4. -** +** ** Other values of n (P4_STATIC, P4_COLLSEQ etc.) indicate that zP4 points ** to a string or structure that is guaranteed to exist for the lifetime of ** the Vdbe. In these cases we can just copy the pointer. @@ -77773,7 +77773,7 @@ SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe *p, int addr, const char *zP4, int } /* -** Change the P4 operand of the most recently coded instruction +** Change the P4 operand of the most recently coded instruction ** to the value defined by the arguments. This is a high-speed ** version of sqlite3VdbeChangeP4(). ** @@ -77862,7 +77862,7 @@ SQLITE_PRIVATE void sqlite3VdbeSetLineNumber(Vdbe *v, int iLine){ ** routine, then a pointer to a dummy VdbeOp will be returned. That opcode ** is readable but not writable, though it is cast to a writable value. ** The return of a dummy opcode allows the call to continue functioning -** after an OOM fault without having to check to see if the return from +** after an OOM fault without having to check to see if the return from ** this routine is a valid pointer. But because the dummy.opcode is 0, ** dummy will never be written to. This is verified by code inspection and ** by running with Valgrind. @@ -78076,9 +78076,9 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){ CollSeq *pColl = pKeyInfo->aColl[j]; const char *zColl = pColl ? pColl->zName : ""; if( strcmp(zColl, "BINARY")==0 ) zColl = "B"; - sqlite3_str_appendf(&x, ",%s%s%s", - (pKeyInfo->aSortFlags[j] & KEYINFO_ORDER_DESC) ? "-" : "", - (pKeyInfo->aSortFlags[j] & KEYINFO_ORDER_BIGNULL)? "N." : "", + sqlite3_str_appendf(&x, ",%s%s%s", + (pKeyInfo->aSortFlags[j] & KEYINFO_ORDER_DESC) ? "-" : "", + (pKeyInfo->aSortFlags[j] & KEYINFO_ORDER_BIGNULL)? "N." : "", zColl); } sqlite3_str_append(&x, ")", 1); @@ -78208,13 +78208,13 @@ SQLITE_PRIVATE void sqlite3VdbeUsesBtree(Vdbe *p, int i){ ** ** If SQLite is not threadsafe but does support shared-cache mode, then ** sqlite3BtreeEnter() is invoked to set the BtShared.db variables -** of all of BtShared structures accessible via the database handle +** of all of BtShared structures accessible via the database handle ** associated with the VM. ** ** If SQLite is not threadsafe and does not support shared-cache mode, this ** function is a no-op. ** -** The p->btreeMask field is a bitmask of all btrees that the prepared +** The p->btreeMask field is a bitmask of all btrees that the prepared ** statement p will ever use. Let N be the number of bits in p->btreeMask ** corresponding to btrees that use shared cache. Then the runtime of ** this routine is N*N. But as N is rarely more than 1, this should not @@ -78280,7 +78280,7 @@ SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE *pOut, int pc, VdbeOp *pOp){ /* NB: The sqlite3OpcodeName() function is implemented by code created ** by the mkopcodeh.awk and mkopcodec.awk scripts which extract the ** information from the vdbe.c source text */ - fprintf(pOut, zFormat1, pc, + fprintf(pOut, zFormat1, pc, sqlite3OpcodeName(pOp->opcode), pOp->p1, pOp->p2, pOp->p3, zP4, pOp->p5, zCom ); @@ -78321,15 +78321,15 @@ static void releaseMemArray(Mem *p, int N){ assert( sqlite3VdbeCheckMemInvariants(p) ); /* This block is really an inlined version of sqlite3VdbeMemRelease() - ** that takes advantage of the fact that the memory cell value is + ** that takes advantage of the fact that the memory cell value is ** being set to NULL after releasing any dynamic resources. ** - ** The justification for duplicating code is that according to - ** callgrind, this causes a certain test case to hit the CPU 4.7 - ** percent less (x86 linux, gcc version 4.1.2, -O6) than if + ** The justification for duplicating code is that according to + ** callgrind, this causes a certain test case to hit the CPU 4.7 + ** percent less (x86 linux, gcc version 4.1.2, -O6) than if ** sqlite3MemRelease() were called from here. With -O2, this jumps - ** to 6.6 percent. The test case is inserting 1000 rows into a table - ** with no indexes using a single prepared INSERT statement, bind() + ** to 6.6 percent. The test case is inserting 1000 rows into a table + ** with no indexes using a single prepared INSERT statement, bind() ** and reset(). Inserts are grouped into a transaction. */ testcase( p->flags & MEM_Agg ); @@ -78535,7 +78535,7 @@ SQLITE_PRIVATE int sqlite3VdbeList( pMem->flags = MEM_Int; pMem->u.i = i; /* Program counter */ pMem++; - + pMem->flags = MEM_Static|MEM_Str|MEM_Term; pMem->z = (char*)sqlite3OpcodeName(pOp->opcode); /* Opcode */ assert( pMem->z!=0 ); @@ -78582,7 +78582,7 @@ SQLITE_PRIVATE int sqlite3VdbeList( sqlite3_snprintf(3, pMem->z, "%.2x", pOp->p5); /* P5 */ pMem->enc = SQLITE_UTF8; pMem++; - + #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS if( sqlite3VdbeMemClearAndResize(pMem, 500) ){ assert( p->db->mallocFailed ); @@ -78742,11 +78742,11 @@ SQLITE_PRIVATE void sqlite3VdbeRewind(Vdbe *p){ ** creating the virtual machine. This involves things such ** as allocating registers and initializing the program counter. ** After the VDBE has be prepped, it can be executed by one or more -** calls to sqlite3VdbeExec(). +** calls to sqlite3VdbeExec(). ** ** This function may be called exactly once on each virtual machine. ** After this routine is called the VM has been "packaged" and is ready -** to run. After this routine is called, further calls to +** to run. After this routine is called, further calls to ** sqlite3VdbeAddOp() functions are prohibited. This routine disconnects ** the Vdbe from the Parse object that helped generate it so that the ** the Vdbe becomes an independent entity and the Parse object can be @@ -78778,7 +78778,7 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady( nMem = pParse->nMem; nCursor = pParse->nTab; nArg = pParse->nMaxArg; - + /* Each cursor uses a memory cell. The first cursor (cursor 0) can ** use aMem[0] which is not otherwise used by the VDBE program. Allocate ** space at the end of aMem[] for cursors 1 and greater. @@ -78806,10 +78806,10 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady( p->expired = 0; /* Memory for registers, parameters, cursor, etc, is allocated in one or two - ** passes. On the first pass, we try to reuse unused memory at the + ** passes. On the first pass, we try to reuse unused memory at the ** end of the opcode array. If we are unable to satisfy all memory ** requirements by reusing the opcode array tail, then the second - ** pass will fill in the remainder using a fresh memory allocation. + ** pass will fill in the remainder using a fresh memory allocation. ** ** This two-pass approach that reuses as much memory as possible from ** the leftover memory at the end of the opcode array. This can significantly @@ -78859,7 +78859,7 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady( } /* -** Close a VDBE cursor and release all the resources that cursor +** Close a VDBE cursor and release all the resources that cursor ** happens to hold. */ SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *p, VdbeCursor *pCx){ @@ -78941,7 +78941,7 @@ SQLITE_PRIVATE int sqlite3VdbeFrameRestore(VdbeFrame *pFrame){ /* ** Close all cursors. ** -** Also release any dynamic memory held by the VM in the Vdbe.aMem memory +** Also release any dynamic memory held by the VM in the Vdbe.aMem memory ** cell array. This is necessary as the memory cell array may contain ** pointers to VdbeFrame objects, which may in turn contain pointers to ** open cursors. @@ -79038,27 +79038,27 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ int needXcommit = 0; #ifdef SQLITE_OMIT_VIRTUALTABLE - /* With this option, sqlite3VtabSync() is defined to be simply - ** SQLITE_OK so p is not used. + /* With this option, sqlite3VtabSync() is defined to be simply + ** SQLITE_OK so p is not used. */ UNUSED_PARAMETER(p); #endif /* Before doing anything else, call the xSync() callback for any ** virtual module tables written in this transaction. This has to - ** be done before determining whether a master journal file is + ** be done before determining whether a master journal file is ** required, as an xSync() callback may add an attached database ** to the transaction. */ rc = sqlite3VtabSync(db, p); /* This loop determines (a) if the commit hook should be invoked and - ** (b) how many database files have open write transactions, not - ** including the temp database. (b) is important because if more than + ** (b) how many database files have open write transactions, not + ** including the temp database. (b) is important because if more than ** one database file has an open write transaction, a master journal ** file is required for an atomic commit. - */ - for(i=0; rc==SQLITE_OK && inDb; i++){ + */ + for(i=0; rc==SQLITE_OK && inDb; i++){ Btree *pBt = db->aDb[i].pBt; if( sqlite3BtreeIsInTrans(pBt) ){ /* Whether or not a database might need a master journal depends upon @@ -79079,7 +79079,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ if( db->aDb[i].safety_level!=PAGER_SYNCHRONOUS_OFF && aMJNeeded[sqlite3PagerGetJournalMode(pPager)] && sqlite3PagerIsMemdb(pPager)==0 - ){ + ){ assert( i!=1 ); nTrans++; } @@ -79104,8 +79104,8 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ ** master-journal. ** ** If the return value of sqlite3BtreeGetFilename() is a zero length - ** string, it means the main database is :memory: or a temp file. In - ** that case we do not support atomic multi-file commits, so use the + ** string, it means the main database is :memory: or a temp file. In + ** that case we do not support atomic multi-file commits, so use the ** simple case then too. */ if( 0==sqlite3Strlen30(sqlite3BtreeGetFilename(db->aDb[0].pBt)) @@ -79118,7 +79118,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ } } - /* Do the commit only if all databases successfully complete phase 1. + /* Do the commit only if all databases successfully complete phase 1. ** If one of the BtreeCommitPhaseOne() calls fails, this indicates an ** IO error while deleting or truncating a journal file. It is unlikely, ** but could happen. In this case abandon processing and return the error. @@ -79176,7 +79176,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ }while( rc==SQLITE_OK && res ); if( rc==SQLITE_OK ){ /* Open the master journal. */ - rc = sqlite3OsOpenMalloc(pVfs, zMaster, &pMaster, + rc = sqlite3OsOpenMalloc(pVfs, zMaster, &pMaster, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE| SQLITE_OPEN_EXCLUSIVE|SQLITE_OPEN_MASTER_JOURNAL, 0 ); @@ -79185,7 +79185,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ sqlite3DbFree(db, zMaster); return rc; } - + /* Write the name of each database file in the transaction into the new ** master journal file. If an error occurs at this point close ** and delete the master journal file. All the individual journal files @@ -79233,7 +79233,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ ** in case the master journal file name was written into the journal ** file before the failure occurred. */ - for(i=0; rc==SQLITE_OK && inDb; i++){ + for(i=0; rc==SQLITE_OK && inDb; i++){ Btree *pBt = db->aDb[i].pBt; if( pBt ){ rc = sqlite3BtreeCommitPhaseOne(pBt, zMaster); @@ -79266,7 +79266,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ */ disable_simulated_io_errors(); sqlite3BeginBenignMalloc(); - for(i=0; inDb; i++){ + for(i=0; inDb; i++){ Btree *pBt = db->aDb[i].pBt; if( pBt ){ sqlite3BtreeCommitPhaseTwo(pBt, 1); @@ -79282,7 +79282,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ return rc; } -/* +/* ** This routine checks that the sqlite3.nVdbeActive count variable ** matches the number of vdbe's in the list sqlite3.pVdbe that are ** currently active. An assertion fails if the two counts do not match. @@ -79318,10 +79318,10 @@ static void checkActiveVdbeCnt(sqlite3 *db){ ** If the Vdbe passed as the first argument opened a statement-transaction, ** close it now. Argument eOp must be either SAVEPOINT_ROLLBACK or ** SAVEPOINT_RELEASE. If it is SAVEPOINT_ROLLBACK, then the statement -** transaction is rolled back. If eOp is SAVEPOINT_RELEASE, then the +** transaction is rolled back. If eOp is SAVEPOINT_RELEASE, then the ** statement transaction is committed. ** -** If an IO error occurs, an SQLITE_IOERR_XXX error code is returned. +** If an IO error occurs, an SQLITE_IOERR_XXX error code is returned. ** Otherwise SQLITE_OK. */ static SQLITE_NOINLINE int vdbeCloseStatement(Vdbe *p, int eOp){ @@ -79334,7 +79334,7 @@ static SQLITE_NOINLINE int vdbeCloseStatement(Vdbe *p, int eOp){ assert( db->nStatement>0 ); assert( p->iStatement==(db->nStatement+db->nSavepoint) ); - for(i=0; inDb; i++){ + for(i=0; inDb; i++){ int rc2 = SQLITE_OK; Btree *pBt = db->aDb[i].pBt; if( pBt ){ @@ -79361,8 +79361,8 @@ static SQLITE_NOINLINE int vdbeCloseStatement(Vdbe *p, int eOp){ } } - /* If the statement transaction is being rolled back, also restore the - ** database handles deferred constraint counter to the value it had when + /* If the statement transaction is being rolled back, also restore the + ** database handles deferred constraint counter to the value it had when ** the statement transaction was opened. */ if( eOp==SAVEPOINT_ROLLBACK ){ db->nDeferredCons = p->nStmtDefCons; @@ -79379,20 +79379,20 @@ SQLITE_PRIVATE int sqlite3VdbeCloseStatement(Vdbe *p, int eOp){ /* -** This function is called when a transaction opened by the database -** handle associated with the VM passed as an argument is about to be +** This function is called when a transaction opened by the database +** handle associated with the VM passed as an argument is about to be ** committed. If there are outstanding deferred foreign key constraint ** violations, return SQLITE_ERROR. Otherwise, SQLITE_OK. ** -** If there are outstanding FK violations and this function returns +** If there are outstanding FK violations and this function returns ** SQLITE_ERROR, set the result of the VM to SQLITE_CONSTRAINT_FOREIGNKEY ** and write an error message to it. Then return SQLITE_ERROR. */ #ifndef SQLITE_OMIT_FOREIGN_KEY SQLITE_PRIVATE int sqlite3VdbeCheckFk(Vdbe *p, int deferred){ sqlite3 *db = p->db; - if( (deferred && (db->nDeferredCons+db->nDeferredImmCons)>0) - || (!deferred && p->nFkConstraint>0) + if( (deferred && (db->nDeferredCons+db->nDeferredImmCons)>0) + || (!deferred && p->nFkConstraint>0) ){ p->rc = SQLITE_CONSTRAINT_FOREIGNKEY; p->errorAction = OE_Abort; @@ -79422,7 +79422,7 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ /* This function contains the logic that determines if a statement or ** transaction will be committed or rolled back as a result of the - ** execution of this virtual machine. + ** execution of this virtual machine. ** ** If any of the following errors occur: ** @@ -79460,16 +79460,16 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ isSpecialError = mrc==SQLITE_NOMEM || mrc==SQLITE_IOERR || mrc==SQLITE_INTERRUPT || mrc==SQLITE_FULL; if( isSpecialError ){ - /* If the query was read-only and the error code is SQLITE_INTERRUPT, - ** no rollback is necessary. Otherwise, at least a savepoint - ** transaction must be rolled back to restore the database to a + /* If the query was read-only and the error code is SQLITE_INTERRUPT, + ** no rollback is necessary. Otherwise, at least a savepoint + ** transaction must be rolled back to restore the database to a ** consistent state. ** ** Even if the statement is read-only, it is important to perform - ** a statement or transaction rollback operation. If the error + ** a statement or transaction rollback operation. If the error ** occurred while writing to the journal, sub-journal or database ** file as part of an effort to free up cache space (see function - ** pagerStress() in pager.c), the rollback is required to restore + ** pagerStress() in pager.c), the rollback is required to restore ** the pager to a consistent state. */ if( !p->readOnly || mrc!=SQLITE_INTERRUPT ){ @@ -79491,16 +79491,16 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ if( p->rc==SQLITE_OK || (p->errorAction==OE_Fail && !isSpecialError) ){ sqlite3VdbeCheckFk(p, 0); } - - /* If the auto-commit flag is set and this is the only active writer - ** VM, then we do either a commit or rollback of the current transaction. + + /* If the auto-commit flag is set and this is the only active writer + ** VM, then we do either a commit or rollback of the current transaction. ** - ** Note: This block also runs if one of the special errors handled - ** above has occurred. + ** Note: This block also runs if one of the special errors handled + ** above has occurred. */ - if( !sqlite3VtabInSync(db) - && db->autoCommit - && db->nVdbeWrite==(p->readOnly==0) + if( !sqlite3VtabInSync(db) + && db->autoCommit + && db->nVdbeWrite==(p->readOnly==0) ){ if( p->rc==SQLITE_OK || (p->errorAction==OE_Fail && !isSpecialError) ){ rc = sqlite3VdbeCheckFk(p, 1); @@ -79510,10 +79510,10 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ return SQLITE_ERROR; } rc = SQLITE_CONSTRAINT_FOREIGNKEY; - }else{ - /* The auto-commit flag is true, the vdbe program was successful + }else{ + /* The auto-commit flag is true, the vdbe program was successful ** or hit an 'OR FAIL' constraint and there are no deferred foreign - ** key constraints to hold up the transaction. This means a commit + ** key constraints to hold up the transaction. This means a commit ** is required. */ rc = vdbeCommit(db, p); } @@ -79547,7 +79547,7 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ p->nChange = 0; } } - + /* If eStatementOp is non-zero, then a statement transaction needs to ** be committed or rolled back. Call sqlite3VdbeCloseStatement() to ** do so. If this operation returns an error, and the current statement @@ -79568,9 +79568,9 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ p->nChange = 0; } } - + /* If this was an INSERT, UPDATE or DELETE and no statement transaction - ** has been rolled back, update the database connection change-counter. + ** has been rolled back, update the database connection change-counter. */ if( p->changeCntOn ){ if( eStatementOp!=SAVEPOINT_ROLLBACK ){ @@ -79601,7 +79601,7 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ } /* If the auto-commit flag is set to true, then any locks that were held - ** by connection db have now been released. Call sqlite3ConnectionUnlocked() + ** by connection db have now been released. Call sqlite3ConnectionUnlocked() ** to invoke any required unlock-notify callbacks. */ if( db->autoCommit ){ @@ -79623,7 +79623,7 @@ SQLITE_PRIVATE void sqlite3VdbeResetStepResult(Vdbe *p){ /* ** Copy the error code and error message belonging to the VDBE passed -** as the first argument to its database handle (so that they will be +** as the first argument to its database handle (so that they will be ** returned by calls to sqlite3_errcode() and sqlite3_errmsg()). ** ** This function does not clear the VDBE error code or message, just @@ -79648,7 +79648,7 @@ SQLITE_PRIVATE int sqlite3VdbeTransferError(Vdbe *p){ #ifdef SQLITE_ENABLE_SQLLOG /* -** If an SQLITE_CONFIG_SQLLOG hook is registered and the VM has been run, +** If an SQLITE_CONFIG_SQLLOG hook is registered and the VM has been run, ** invoke it. */ static void vdbeInvokeSqllog(Vdbe *v){ @@ -79712,7 +79712,7 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){ /* Reset register contents and reclaim error message memory. */ #ifdef SQLITE_DEBUG - /* Execute assert() statements to ensure that the Vdbe.apCsr[] and + /* Execute assert() statements to ensure that the Vdbe.apCsr[] and ** Vdbe.aMem[] arrays have already been cleaned up. */ if( p->apCsr ) for(i=0; inCursor; i++) assert( p->apCsr[i]==0 ); if( p->aMem ){ @@ -79764,7 +79764,7 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){ p->magic = VDBE_MAGIC_RESET; return p->rc & db->errMask; } - + /* ** Clean up and delete a VDBE after execution. Return an integer which is ** the result code. Write any error message text into *pzErrMsg. @@ -79785,8 +79785,8 @@ SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe *p){ ** the first argument. ** ** Or, if iOp is greater than or equal to zero, then the destructor is -** only invoked for those auxiliary data pointers created by the user -** function invoked by the OP_Function opcode at instruction iOp of +** only invoked for those auxiliary data pointers created by the user +** function invoked by the OP_Function opcode at instruction iOp of ** VM pVdbe, and only then if: ** ** * the associated function parameter is the 32nd or later (counting @@ -80089,7 +80089,7 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem *pMem, int file_format, u32 *pLen){ ** The sizes for serial types less than 128 */ static const u8 sqlite3SmallTypeSizes[] = { - /* 0 1 2 3 4 5 6 7 8 9 */ + /* 0 1 2 3 4 5 6 7 8 9 */ /* 0 */ 0, 1, 2, 3, 4, 6, 8, 8, 0, 0, /* 10 */ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, /* 20 */ 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, @@ -80112,19 +80112,19 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialTypeLen(u32 serial_type){ if( serial_type>=128 ){ return (serial_type-12)/2; }else{ - assert( serial_type<12 + assert( serial_type<12 || sqlite3SmallTypeSizes[serial_type]==(serial_type - 12)/2 ); return sqlite3SmallTypeSizes[serial_type]; } } SQLITE_PRIVATE u8 sqlite3VdbeOneByteSerialTypeLen(u8 serial_type){ assert( serial_type<128 ); - return sqlite3SmallTypeSizes[serial_type]; + return sqlite3SmallTypeSizes[serial_type]; } /* -** If we are on an architecture with mixed-endian floating -** points (ex: ARM7) then swap the lower 4 bytes with the +** If we are on an architecture with mixed-endian floating +** points (ex: ARM7) then swap the lower 4 bytes with the ** upper 4 bytes. Return the result. ** ** For most architectures, this is a no-op. @@ -80146,7 +80146,7 @@ SQLITE_PRIVATE u8 sqlite3VdbeOneByteSerialTypeLen(u8 serial_type){ ** (2007-08-30) Frank van Vugt has studied this problem closely ** and has send his findings to the SQLite developers. Frank ** writes that some Linux kernels offer floating point hardware -** emulation that uses only 32-bit mantissas instead of a full +** emulation that uses only 32-bit mantissas instead of a full ** 48-bits as required by the IEEE standard. (This is the ** CONFIG_FPE_FASTFPE option.) On such systems, floating point ** byte swapping becomes very complicated. To avoid problems, @@ -80176,7 +80176,7 @@ static u64 floatSwap(u64 in){ #endif /* -** Write the serialized data blob for the value stored in pMem into +** Write the serialized data blob for the value stored in pMem into ** buf. It is assumed that the caller has allocated sufficient space. ** Return the number of bytes written. ** @@ -80187,7 +80187,7 @@ static u64 floatSwap(u64 in){ ** Return the number of bytes actually written into buf[]. The number ** of bytes in the zero-filled tail is included in the return value only ** if those bytes were zeroed in buf[]. -*/ +*/ SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(u8 *buf, Mem *pMem, u32 serial_type){ u32 len; @@ -80241,7 +80241,7 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(u8 *buf, Mem *pMem, u32 serial_type){ ** The few cases that require local variables are broken out into a separate ** routine so that in most cases the overhead of moving the stack pointer ** is avoided. -*/ +*/ static u32 serialGet( const unsigned char *buf, /* Buffer to deserialize from */ u32 serial_type, /* Serial type to deserialize */ @@ -80325,7 +80325,7 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet( /* EVIDENCE-OF: R-01849-26079 Value is a big-endian 32-bit ** twos-complement integer. */ pMem->u.i = FOUR_BYTE_INT(buf); -#ifdef __HP_cc +#ifdef __HP_cc /* Work around a sign-extension bug in the HP compiler for HP/UX */ if( buf[0]&0x80 ) pMem->u.i |= 0xffffffff80000000LL; #endif @@ -80377,7 +80377,7 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet( ** The space is either allocated using sqlite3DbMallocRaw() or from within ** the unaligned buffer passed via the second and third arguments (presumably ** stack space). If the former, then *ppFree is set to a pointer that should -** be eventually freed by the caller using sqlite3DbFree(). Or, if the +** be eventually freed by the caller using sqlite3DbFree(). Or, if the ** allocation comes from the pSpace/szSpace buffer, *ppFree is set to NULL ** before returning. ** @@ -80399,10 +80399,10 @@ SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeAllocUnpackedRecord( } /* -** Given the nKey-byte encoding of a record in pKey[], populate the +** Given the nKey-byte encoding of a record in pKey[], populate the ** UnpackedRecord structure indicated by the fourth argument with the ** contents of the decoded record. -*/ +*/ SQLITE_PRIVATE void sqlite3VdbeRecordUnpack( KeyInfo *pKeyInfo, /* Information about the record format */ int nKey, /* Size of the binary record */ @@ -80410,7 +80410,7 @@ SQLITE_PRIVATE void sqlite3VdbeRecordUnpack( UnpackedRecord *p /* Populate this structure before returning. */ ){ const unsigned char *aKey = (const unsigned char *)pKey; - u32 d; + u32 d; u32 idx; /* Offset in aKey[] to read from */ u16 u; /* Unsigned loop counter */ u32 szHdr; @@ -80436,7 +80436,7 @@ SQLITE_PRIVATE void sqlite3VdbeRecordUnpack( } if( d>(u32)nKey && u ){ assert( CORRUPT_DB ); - /* In a corrupt record entry, the last pMem might have been set up using + /* In a corrupt record entry, the last pMem might have been set up using ** uninitialized memory. Overwrite its value with NULL, to prevent ** warnings from MSAN. */ sqlite3VdbeMemSetNull(pMem-1); @@ -80480,13 +80480,13 @@ static int vdbeRecordCompareDebug( /* Compilers may complain that mem1.u.i is potentially uninitialized. ** We could initialize it, as shown here, to silence those complaints. - ** But in fact, mem1.u.i will never actually be used uninitialized, and doing + ** But in fact, mem1.u.i will never actually be used uninitialized, and doing ** the unnecessary initialization has a measurable negative performance ** impact, since this routine is a very high runner. And so, we choose ** to ignore the compiler warnings and leave this variable uninitialized. */ /* mem1.u.i = 0; // not needed, here to silence compiler warning */ - + idx1 = getVarint32(aKey1, szHdr1); if( szHdr1>98307 ) return SQLITE_CORRUPT; d1 = szHdr1; @@ -80507,7 +80507,7 @@ static int vdbeRecordCompareDebug( ** sqlite3VdbeSerialTypeLen() in the common case. */ if( d1+(u64)serial_type1+2>(u64)nKey1 - && d1+(u64)sqlite3VdbeSerialTypeLen(serial_type1)>(u64)nKey1 + && d1+(u64)sqlite3VdbeSerialTypeLen(serial_type1)>(u64)nKey1 ){ break; } @@ -80523,7 +80523,7 @@ static int vdbeRecordCompareDebug( if( rc!=0 ){ assert( mem1.szMalloc==0 ); /* See comment below */ if( (pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_BIGNULL) - && ((mem1.flags & MEM_Null) || (pPKey2->aMem[i].flags & MEM_Null)) + && ((mem1.flags & MEM_Null) || (pPKey2->aMem[i].flags & MEM_Null)) ){ rc = -rc; } @@ -80569,7 +80569,7 @@ debugCompareEnd: ** incorrectly. */ static void vdbeAssertFieldCountWithinLimits( - int nKey, const void *pKey, /* The record to verify */ + int nKey, const void *pKey, /* The record to verify */ const KeyInfo *pKeyInfo /* Compare size with this KeyInfo */ ){ int nField = 0; @@ -80595,7 +80595,7 @@ static void vdbeAssertFieldCountWithinLimits( /* ** Both *pMem1 and *pMem2 contain string values. Compare the two values ** using the collation sequence pColl. As usual, return a negative , zero -** or positive value if *pMem1 is less than, equal to or greater than +** or positive value if *pMem1 is less than, equal to or greater than ** *pMem2, respectively. Similar in spirit to "rc = (*pMem1) - (*pMem2);". */ static int vdbeCompareMemString( @@ -80719,7 +80719,7 @@ SQLITE_PRIVATE int sqlite3MemCompare(const Mem *pMem1, const Mem *pMem2, const C f2 = pMem2->flags; combined_flags = f1|f2; assert( !sqlite3VdbeMemIsRowSet(pMem1) && !sqlite3VdbeMemIsRowSet(pMem2) ); - + /* If one value is NULL, it is less than the other. If both values ** are NULL, return 0. */ @@ -80782,7 +80782,7 @@ SQLITE_PRIVATE int sqlite3MemCompare(const Mem *pMem1, const Mem *pMem2, const C } assert( pMem1->enc==pMem2->enc || pMem1->db->mallocFailed ); - assert( pMem1->enc==SQLITE_UTF8 || + assert( pMem1->enc==SQLITE_UTF8 || pMem1->enc==SQLITE_UTF16LE || pMem1->enc==SQLITE_UTF16BE ); /* The collation sequence must be defined at this point, even if @@ -80797,7 +80797,7 @@ SQLITE_PRIVATE int sqlite3MemCompare(const Mem *pMem1, const Mem *pMem2, const C /* If a NULL pointer was passed as the collate function, fall through ** to the blob case and use memcmp(). */ } - + /* Both values must be blobs. Compare using memcmp(). */ return sqlite3BlobCompare(pMem1, pMem2); } @@ -80805,7 +80805,7 @@ SQLITE_PRIVATE int sqlite3MemCompare(const Mem *pMem1, const Mem *pMem2, const C /* ** The first argument passed to this function is a serial-type that -** corresponds to an integer - all values between 1 and 9 inclusive +** corresponds to an integer - all values between 1 and 9 inclusive ** except 7. The second points to a buffer containing an integer value ** serialized according to serial_type. This function deserializes ** and returns the value. @@ -80847,7 +80847,7 @@ static i64 vdbeRecordDecodeInt(u32 serial_type, const u8 *aKey){ /* ** This function compares the two table rows or index records ** specified by {nKey1, pKey1} and pPKey2. It returns a negative, zero -** or positive integer if key1 is less than, equal to or +** or positive integer if key1 is less than, equal to or ** greater than key2. The {nKey1, pKey1} key must be a blob ** created by the OP_MakeRecord opcode of the VDBE. The pPKey2 ** key must be a parsed key such as obtained from @@ -80856,12 +80856,12 @@ static i64 vdbeRecordDecodeInt(u32 serial_type, const u8 *aKey){ ** If argument bSkip is non-zero, it is assumed that the caller has already ** determined that the first fields of the keys are equal. ** -** Key1 and Key2 do not have to contain the same number of fields. If all -** fields that appear in both keys are equal, then pPKey2->default_rc is +** Key1 and Key2 do not have to contain the same number of fields. If all +** fields that appear in both keys are equal, then pPKey2->default_rc is ** returned. ** -** If database corruption is discovered, set pPKey2->errCode to -** SQLITE_CORRUPT and return 0. If an OOM error is encountered, +** If database corruption is discovered, set pPKey2->errCode to +** SQLITE_CORRUPT and return 0. If an OOM error is encountered, ** pPKey2->errCode is set to SQLITE_NOMEM and, if it is not NULL, the ** malloc-failed flag set on database handle (pPKey2->pKeyInfo->db). */ @@ -80895,13 +80895,13 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip( d1 = szHdr1; i = 0; } - if( d1>(unsigned)nKey1 ){ + if( d1>(unsigned)nKey1 ){ pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; return 0; /* Corruption */ } VVA_ONLY( mem1.szMalloc = 0; ) /* Only needed by assert() statements */ - assert( pPKey2->pKeyInfo->nAllField>=pPKey2->nField + assert( pPKey2->pKeyInfo->nAllField>=pPKey2->nField || CORRUPT_DB ); assert( pPKey2->pKeyInfo->aSortFlags!=0 ); assert( pPKey2->pKeyInfo->nKeyField>0 ); @@ -80938,7 +80938,7 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip( serial_type = aKey1[idx1]; if( serial_type>=10 ){ /* Serial types 12 or greater are strings and blobs (greater than - ** numbers). Types 10 and 11 are currently "reserved for future + ** numbers). Types 10 and 11 are currently "reserved for future ** use", so it doesn't really matter what the results of comparing ** them to numberic values are. */ rc = +1; @@ -80986,7 +80986,7 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip( }else{ int nCmp = MIN(mem1.n, pRhs->n); rc = memcmp(&aKey1[d1], pRhs->z, nCmp); - if( rc==0 ) rc = mem1.n - pRhs->n; + if( rc==0 ) rc = mem1.n - pRhs->n; } } } @@ -81055,8 +81055,8 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip( /* rc==0 here means that one or both of the keys ran out of fields and ** all the fields up to that point were equal. Return the default_rc ** value. */ - assert( CORRUPT_DB - || vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, pPKey2->default_rc) + assert( CORRUPT_DB + || vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, pPKey2->default_rc) || pPKey2->pKeyInfo->db->mallocFailed ); pPKey2->eqSeen = 1; @@ -81071,8 +81071,8 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompare( /* -** This function is an optimized version of sqlite3VdbeRecordCompare() -** that (a) the first field of pPKey2 is an integer, and (b) the +** This function is an optimized version of sqlite3VdbeRecordCompare() +** that (a) the first field of pPKey2 is an integer, and (b) the ** size-of-header varint at the start of (pKey1/nKey1) fits in a single ** byte (i.e. is less than 128). ** @@ -81127,7 +81127,7 @@ static int vdbeRecordCompareInt( testcase( lhs<0 ); break; } - case 8: + case 8: lhs = 0; break; case 9: @@ -81135,11 +81135,11 @@ static int vdbeRecordCompareInt( break; /* This case could be removed without changing the results of running - ** this code. Including it causes gcc to generate a faster switch + ** this code. Including it causes gcc to generate a faster switch ** statement (since the range of switch targets now starts at zero and ** is contiguous) but does not cause any duplicate code to be generated - ** (as gcc is clever enough to combine the two like cases). Other - ** compilers might be similar. */ + ** (as gcc is clever enough to combine the two like cases). Other + ** compilers might be similar. */ case 0: case 7: return sqlite3VdbeRecordCompare(nKey1, pKey1, pPKey2); @@ -81153,7 +81153,7 @@ static int vdbeRecordCompareInt( }else if( vr2; }else if( pPKey2->nField>1 ){ - /* The first fields of the two keys are equal. Compare the trailing + /* The first fields of the two keys are equal. Compare the trailing ** fields. */ res = sqlite3VdbeRecordCompareWithSkip(nKey1, pKey1, pPKey2, 1); }else{ @@ -81168,9 +81168,9 @@ static int vdbeRecordCompareInt( } /* -** This function is an optimized version of sqlite3VdbeRecordCompare() +** This function is an optimized version of sqlite3VdbeRecordCompare() ** that (a) the first field of pPKey2 is a string, that (b) the first field -** uses the collation sequence BINARY and (c) that the size-of-header varint +** uses the collation sequence BINARY and (c) that the size-of-header varint ** at the start of (pKey1/nKey1) fits in a single byte. */ static int vdbeRecordCompareString( @@ -81186,7 +81186,7 @@ static int vdbeRecordCompareString( getVarint32(&aKey1[1], serial_type); if( serial_type<12 ){ res = pPKey2->r1; /* (pKey1/nKey1) is a number or a null */ - }else if( !(serial_type & 0x01) ){ + }else if( !(serial_type & 0x01) ){ res = pPKey2->r2; /* (pKey1/nKey1) is a blob */ }else{ int nCmp; @@ -81238,7 +81238,7 @@ SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord *p){ /* varintRecordCompareInt() and varintRecordCompareString() both assume ** that the size-of-header varint that occurs at the start of each record ** fits in a single byte (i.e. is 127 or less). varintRecordCompareInt() - ** also assumes that it is safe to overread a buffer by at least the + ** also assumes that it is safe to overread a buffer by at least the ** maximum possible legal header size plus 8 bytes. Because there is ** guaranteed to be at least 74 (but not 136) bytes of padding following each ** buffer passed to varintRecordCompareInt() this makes it convenient to @@ -81296,7 +81296,7 @@ SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3 *db, BtCursor *pCur, i64 *rowid){ /* Get the size of the index entry. Only indices entries of less ** than 2GiB are support - anything large must be database corruption. ** Any corruption is detected in sqlite3BtreeParseCellPtr(), though, so - ** this code can safely assume that nCellKey is 32-bits + ** this code can safely assume that nCellKey is 32-bits */ assert( sqlite3BtreeCursorIsValid(pCur) ); nCellKey = sqlite3BtreePayloadSize(pCur); @@ -81361,7 +81361,7 @@ idx_rowid_corruption: ** ** pUnpacked is either created without a rowid or is truncated so that it ** omits the rowid at the end. The rowid at the end of the index entry -** is ignored as well. Hence, this routine only compares the prefixes +** is ignored as well. Hence, this routine only compares the prefixes ** of the keys prior to the final rowid, not the entire key. */ SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare( @@ -81397,7 +81397,7 @@ SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare( /* ** This routine sets the value to be returned by subsequent calls to -** sqlite3_changes() on the database handle 'db'. +** sqlite3_changes() on the database handle 'db'. */ SQLITE_PRIVATE void sqlite3VdbeSetChanges(sqlite3 *db, int nChange){ assert( sqlite3_mutex_held(db->mutex) ); @@ -81454,7 +81454,7 @@ SQLITE_PRIVATE u8 sqlite3VdbePrepareFlags(Vdbe *v){ /* ** Return a pointer to an sqlite3_value structure containing the value bound -** parameter iVar of VM v. Except, if the value is an SQL NULL, return +** parameter iVar of VM v. Except, if the value is an SQL NULL, return ** 0 instead. Unless it is NULL, apply affinity aff (one of the SQLITE_AFF_* ** constants) to the value before returning it. ** @@ -81506,7 +81506,7 @@ SQLITE_PRIVATE int sqlite3NotPureFunc(sqlite3_context *pCtx){ if( pCtx->pVdbe==0 ) return 1; #endif if( pCtx->pVdbe->aOp[pCtx->iOp].opcode==OP_PureFunc ){ - sqlite3_result_error(pCtx, + sqlite3_result_error(pCtx, "non-deterministic function in index expression or CHECK constraint", -1); return 0; @@ -81534,7 +81534,7 @@ SQLITE_PRIVATE void sqlite3VtabImportErrmsg(Vdbe *p, sqlite3_vtab *pVtab){ #ifdef SQLITE_ENABLE_PREUPDATE_HOOK /* -** If the second argument is not NULL, release any allocations associated +** If the second argument is not NULL, release any allocations associated ** with the memory cells in the p->aMem[] array. Also free the UnpackedRecord ** structure itself, using sqlite3DbFree(). ** @@ -81588,7 +81588,7 @@ SQLITE_PRIVATE void sqlite3VdbePreUpdateHook( } } - assert( pCsr->nField==pTab->nCol + assert( pCsr->nField==pTab->nCol || (pCsr->nField==pTab->nCol+1 && op==SQLITE_DELETE && iReg==-1) ); @@ -81979,7 +81979,7 @@ SQLITE_API sqlite3_value *sqlite3_value_dup(const sqlite3_value *pOrig){ SQLITE_API void sqlite3_value_free(sqlite3_value *pOld){ sqlite3ValueFree(pOld); } - + /**************************** sqlite3_result_ ******************************* ** The following routines are used by user-defined functions to specify @@ -82020,9 +82020,9 @@ static int invokeValueDestructor( return SQLITE_TOOBIG; } SQLITE_API void sqlite3_result_blob( - sqlite3_context *pCtx, - const void *z, - int n, + sqlite3_context *pCtx, + const void *z, + int n, void (*xDel)(void *) ){ assert( n>=0 ); @@ -82030,8 +82030,8 @@ SQLITE_API void sqlite3_result_blob( setResultStrOrError(pCtx, z, n, 0, xDel); } SQLITE_API void sqlite3_result_blob64( - sqlite3_context *pCtx, - const void *z, + sqlite3_context *pCtx, + const void *z, sqlite3_uint64 n, void (*xDel)(void *) ){ @@ -82090,8 +82090,8 @@ SQLITE_API void sqlite3_result_subtype(sqlite3_context *pCtx, unsigned int eSubt pOut->flags |= MEM_Subtype; } SQLITE_API void sqlite3_result_text( - sqlite3_context *pCtx, - const char *z, + sqlite3_context *pCtx, + const char *z, int n, void (*xDel)(void *) ){ @@ -82099,8 +82099,8 @@ SQLITE_API void sqlite3_result_text( setResultStrOrError(pCtx, z, n, SQLITE_UTF8, xDel); } SQLITE_API void sqlite3_result_text64( - sqlite3_context *pCtx, - const char *z, + sqlite3_context *pCtx, + const char *z, sqlite3_uint64 n, void (*xDel)(void *), unsigned char enc @@ -82116,27 +82116,27 @@ SQLITE_API void sqlite3_result_text64( } #ifndef SQLITE_OMIT_UTF16 SQLITE_API void sqlite3_result_text16( - sqlite3_context *pCtx, - const void *z, - int n, + sqlite3_context *pCtx, + const void *z, + int n, void (*xDel)(void *) ){ assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); setResultStrOrError(pCtx, z, n, SQLITE_UTF16NATIVE, xDel); } SQLITE_API void sqlite3_result_text16be( - sqlite3_context *pCtx, - const void *z, - int n, + sqlite3_context *pCtx, + const void *z, + int n, void (*xDel)(void *) ){ assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); setResultStrOrError(pCtx, z, n, SQLITE_UTF16BE, xDel); } SQLITE_API void sqlite3_result_text16le( - sqlite3_context *pCtx, - const void *z, - int n, + sqlite3_context *pCtx, + const void *z, + int n, void (*xDel)(void *) ){ assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); @@ -82166,7 +82166,7 @@ SQLITE_API void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){ if( pCtx->pVdbe ) pCtx->pVdbe->rcApp = errCode; #endif if( pCtx->pOut->flags & MEM_Null ){ - sqlite3VdbeMemSetStr(pCtx->pOut, sqlite3ErrStr(errCode), -1, + sqlite3VdbeMemSetStr(pCtx->pOut, sqlite3ErrStr(errCode), -1, SQLITE_UTF8, SQLITE_STATIC); } } @@ -82175,7 +82175,7 @@ SQLITE_API void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){ SQLITE_API void sqlite3_result_error_toobig(sqlite3_context *pCtx){ assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); pCtx->isError = SQLITE_TOOBIG; - sqlite3VdbeMemSetStr(pCtx->pOut, "string or blob too big", -1, + sqlite3VdbeMemSetStr(pCtx->pOut, "string or blob too big", -1, SQLITE_UTF8, SQLITE_STATIC); } @@ -82192,7 +82192,7 @@ SQLITE_API void sqlite3_result_error_nomem(sqlite3_context *pCtx){ ** a MEM_IntReal value. See the SQLITE_TESTCTRL_RESULT_INTREAL ** test-control. */ -SQLITE_PRIVATE void sqlite3ResultIntReal(sqlite3_context *pCtx){ +SQLITE_PRIVATE void sqlite3ResultIntReal(sqlite3_context *pCtx){ assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); if( pCtx->pOut->flags & MEM_Int ){ pCtx->pOut->flags &= ~MEM_Int; @@ -82203,7 +82203,7 @@ SQLITE_PRIVATE void sqlite3ResultIntReal(sqlite3_context *pCtx){ /* -** This function is called after a transaction has been committed. It +** This function is called after a transaction has been committed. It ** invokes callbacks registered with sqlite3_wal_hook() as required. */ static int doWalCallbacks(sqlite3 *db){ @@ -82232,7 +82232,7 @@ static int doWalCallbacks(sqlite3 *db){ ** statement is completely executed or an error occurs. ** ** This routine implements the bulk of the logic behind the sqlite_step() -** API. The only thing omitted is the automatic recompile if a +** API. The only thing omitted is the automatic recompile if a ** schema change has occurred. That detail is handled by the ** outer sqlite3_step() wrapper procedure. */ @@ -82246,15 +82246,15 @@ static int sqlite3Step(Vdbe *p){ ** sqlite3_step() after any error or after SQLITE_DONE. But beginning ** with version 3.7.0, we changed this so that sqlite3_reset() would ** be called automatically instead of throwing the SQLITE_MISUSE error. - ** This "automatic-reset" change is not technically an incompatibility, + ** This "automatic-reset" change is not technically an incompatibility, ** since any application that receives an SQLITE_MISUSE is broken by ** definition. ** ** Nevertheless, some published applications that were originally written - ** for version 3.6.23 or earlier do in fact depend on SQLITE_MISUSE + ** for version 3.6.23 or earlier do in fact depend on SQLITE_MISUSE ** returns, and those were broken by the automatic-reset change. As a ** a work-around, the SQLITE_OMIT_AUTORESET compile-time restores the - ** legacy behavior of returning SQLITE_MISUSE for cases where the + ** legacy behavior of returning SQLITE_MISUSE for cases where the ** previous sqlite3_step() returned something other than a SQLITE_LOCKED ** or SQLITE_BUSY error. */ @@ -82290,7 +82290,7 @@ static int sqlite3Step(Vdbe *p){ db->u1.isInterrupted = 0; } - assert( db->nVdbeWrite>0 || db->autoCommit==0 + assert( db->nVdbeWrite>0 || db->autoCommit==0 || (db->nDeferredCons==0 && db->nDeferredImmCons==0) ); @@ -82342,25 +82342,25 @@ static int sqlite3Step(Vdbe *p){ p->rc = SQLITE_NOMEM_BKPT; } end_of_step: - /* At this point local variable rc holds the value that should be - ** returned if this statement was compiled using the legacy + /* At this point local variable rc holds the value that should be + ** returned if this statement was compiled using the legacy ** sqlite3_prepare() interface. According to the docs, this can only - ** be one of the values in the first assert() below. Variable p->rc - ** contains the value that would be returned if sqlite3_finalize() + ** be one of the values in the first assert() below. Variable p->rc + ** contains the value that would be returned if sqlite3_finalize() ** were called on statement p. */ - assert( rc==SQLITE_ROW || rc==SQLITE_DONE || rc==SQLITE_ERROR + assert( rc==SQLITE_ROW || rc==SQLITE_DONE || rc==SQLITE_ERROR || (rc&0xff)==SQLITE_BUSY || rc==SQLITE_MISUSE ); assert( (p->rc!=SQLITE_ROW && p->rc!=SQLITE_DONE) || p->rc==p->rcApp ); - if( rc!=SQLITE_ROW + if( rc!=SQLITE_ROW && rc!=SQLITE_DONE && (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 ){ - /* If this statement was prepared using saved SQL and an + /* If this statement was prepared using saved SQL and an ** error has occurred, then return the error code in p->rc to the ** caller. Set the error code in the database handle to the same value. - */ + */ rc = sqlite3VdbeTransferError(p); } return (rc&db->errMask); @@ -82388,15 +82388,15 @@ SQLITE_API int sqlite3_step(sqlite3_stmt *pStmt){ int savedPc = v->pc; rc = sqlite3Reprepare(v); if( rc!=SQLITE_OK ){ - /* This case occurs after failing to recompile an sql statement. - ** The error message from the SQL compiler has already been loaded - ** into the database handle. This block copies the error message + /* This case occurs after failing to recompile an sql statement. + ** The error message from the SQL compiler has already been loaded + ** into the database handle. This block copies the error message ** from the database handle into the statement and sets the statement - ** program counter to 0 to ensure that when the statement is + ** program counter to 0 to ensure that when the statement is ** finalized or reset the parser error message is available via ** sqlite3_errmsg() and sqlite3_errcode(). */ - const char *zErr = (const char *)sqlite3_value_text(db->pErr); + const char *zErr = (const char *)sqlite3_value_text(db->pErr); sqlite3DbFree(db, v->zErrMsg); if( !db->mallocFailed ){ v->zErrMsg = sqlite3DbStrDup(db, zErr); @@ -82558,9 +82558,9 @@ SQLITE_API void *sqlite3_get_auxdata(sqlite3_context *pCtx, int iArg){ ** access code. */ SQLITE_API void sqlite3_set_auxdata( - sqlite3_context *pCtx, - int iArg, - void *pAux, + sqlite3_context *pCtx, + int iArg, + void *pAux, void (*xDelete)(void*) ){ AuxData *pAuxData; @@ -82602,7 +82602,7 @@ failed: #ifndef SQLITE_OMIT_DEPRECATED /* -** Return the number of times the Step function of an aggregate has been +** Return the number of times the Step function of an aggregate has been ** called. ** ** This function is deprecated. Do not use it for new code. It is @@ -82647,9 +82647,9 @@ static const Mem *columnNullValue(void){ ** these assert()s from failing, when building with SQLITE_DEBUG defined ** using gcc, we force nullMem to be 8-byte aligned using the magical ** __attribute__((aligned(8))) macro. */ - static const Mem nullMem + static const Mem nullMem #if defined(SQLITE_DEBUG) && defined(__GNUC__) - __attribute__((aligned(8))) + __attribute__((aligned(8))) #endif = { /* .u = */ {0}, @@ -82695,9 +82695,9 @@ static Mem *columnMem(sqlite3_stmt *pStmt, int i){ } /* -** This function is called after invoking an sqlite3_value_XXX function on a +** This function is called after invoking an sqlite3_value_XXX function on a ** column value (i.e. a value returned by evaluating an SQL expression in the -** select list of a SELECT statement) that may cause a malloc() failure. If +** select list of a SELECT statement) that may cause a malloc() failure. If ** malloc() has failed, the threads mallocFailed flag is cleared and the result ** code of statement pStmt set to SQLITE_NOMEM. ** @@ -82736,8 +82736,8 @@ SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt *pStmt, int i){ const void *val; val = sqlite3_value_blob( columnMem(pStmt,i) ); /* Even though there is no encoding conversion, value_blob() might - ** need to call malloc() to expand the result of a zeroblob() - ** expression. + ** need to call malloc() to expand the result of a zeroblob() + ** expression. */ columnMallocFailure(pStmt); return val; @@ -82938,11 +82938,11 @@ SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt *pStmt, int N){ /******************************* sqlite3_bind_ *************************** -** +** ** Routines used to attach values to wildcards in a compiled SQL statement. */ /* -** Unbind the value bound to variable i in virtual machine p. This is the +** Unbind the value bound to variable i in virtual machine p. This is the ** the same as binding a NULL value to the column. If the "i" parameter is ** out of range, then SQLITE_RANGE is returned. Othewise SQLITE_OK. ** @@ -82961,7 +82961,7 @@ static int vdbeUnbind(Vdbe *p, int i){ if( p->magic!=VDBE_MAGIC_RUN || p->pc>=0 ){ sqlite3Error(p->db, SQLITE_MISUSE); sqlite3_mutex_leave(p->db->mutex); - sqlite3_log(SQLITE_MISUSE, + sqlite3_log(SQLITE_MISUSE, "bind on a busy prepared statement: [%s]", p->zSql); return SQLITE_MISUSE_BKPT; } @@ -82976,7 +82976,7 @@ static int vdbeUnbind(Vdbe *p, int i){ pVar->flags = MEM_Null; p->db->errCode = SQLITE_OK; - /* If the bit corresponding to this variable in Vdbe.expmask is set, then + /* If the bit corresponding to this variable in Vdbe.expmask is set, then ** binding a new value to this variable invalidates the current query plan. ** ** IMPLEMENTATION-OF: R-48440-37595 If the specific value bound to host @@ -83032,10 +83032,10 @@ static int bindText( ** Bind a blob value to an SQL statement variable. */ SQLITE_API int sqlite3_bind_blob( - sqlite3_stmt *pStmt, - int i, - const void *zData, - int nData, + sqlite3_stmt *pStmt, + int i, + const void *zData, + int nData, void (*xDel)(void*) ){ #ifdef SQLITE_ENABLE_API_ARMOR @@ -83044,10 +83044,10 @@ SQLITE_API int sqlite3_bind_blob( return bindText(pStmt, i, zData, nData, xDel, 0); } SQLITE_API int sqlite3_bind_blob64( - sqlite3_stmt *pStmt, - int i, - const void *zData, - sqlite3_uint64 nData, + sqlite3_stmt *pStmt, + int i, + const void *zData, + sqlite3_uint64 nData, void (*xDel)(void*) ){ assert( xDel!=SQLITE_DYNAMIC ); @@ -83107,20 +83107,20 @@ SQLITE_API int sqlite3_bind_pointer( } return rc; } -SQLITE_API int sqlite3_bind_text( - sqlite3_stmt *pStmt, - int i, - const char *zData, - int nData, +SQLITE_API int sqlite3_bind_text( + sqlite3_stmt *pStmt, + int i, + const char *zData, + int nData, void (*xDel)(void*) ){ return bindText(pStmt, i, zData, nData, xDel, SQLITE_UTF8); } -SQLITE_API int sqlite3_bind_text64( - sqlite3_stmt *pStmt, - int i, - const char *zData, - sqlite3_uint64 nData, +SQLITE_API int sqlite3_bind_text64( + sqlite3_stmt *pStmt, + int i, + const char *zData, + sqlite3_uint64 nData, void (*xDel)(void*), unsigned char enc ){ @@ -83134,10 +83134,10 @@ SQLITE_API int sqlite3_bind_text64( } #ifndef SQLITE_OMIT_UTF16 SQLITE_API int sqlite3_bind_text16( - sqlite3_stmt *pStmt, - int i, - const void *zData, - int nData, + sqlite3_stmt *pStmt, + int i, + const void *zData, + int nData, void (*xDel)(void*) ){ return bindText(pStmt, i, zData, nData, xDel, SQLITE_UTF16NATIVE); @@ -83201,7 +83201,7 @@ SQLITE_API int sqlite3_bind_zeroblob64(sqlite3_stmt *pStmt, int i, sqlite3_uint6 /* ** Return the number of wildcards that can be potentially bound to. -** This routine is added to support DBD::SQLite. +** This routine is added to support DBD::SQLite. */ SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt *pStmt){ Vdbe *p = (Vdbe*)pStmt; @@ -83346,7 +83346,7 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt *pStmt, int op, int resetFlag){ Vdbe *pVdbe = (Vdbe*)pStmt; u32 v; #ifdef SQLITE_ENABLE_API_ARMOR - if( !pStmt + if( !pStmt || (op!=SQLITE_STMTSTATUS_MEMUSED && (op<0||op>=ArraySize(pVdbe->aCounter))) ){ (void)SQLITE_MISUSE_BKPT; @@ -83425,8 +83425,8 @@ SQLITE_API const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt){ ** if successful, or a NULL pointer if an OOM error is encountered. */ static UnpackedRecord *vdbeUnpackRecord( - KeyInfo *pKeyInfo, - int nKey, + KeyInfo *pKeyInfo, + int nKey, const void *pKey ){ UnpackedRecord *pRet; /* Return value */ @@ -83518,7 +83518,7 @@ SQLITE_API int sqlite3_preupdate_count(sqlite3 *db){ ** only. It returns zero if the change that caused the callback was made ** immediately by a user SQL statement. Or, if the change was made by a ** trigger program, it returns the number of trigger programs currently -** on the stack (1 for a top-level trigger, 2 for a trigger fired by a +** on the stack (1 for a top-level trigger, 2 for a trigger fired by a ** top-level trigger etc.). ** ** For the purposes of the previous paragraph, a foreign key CASCADE, SET NULL @@ -83727,8 +83727,8 @@ static int findNextHostParameter(const char *zSql, int *pnToken){ /* ** This function returns a pointer to a nul-terminated string in memory ** obtained from sqlite3DbMalloc(). If sqlite3.nVdbeExec is 1, then the -** string contains a copy of zRawSql but with host parameters expanded to -** their current bindings. Or, if sqlite3.nVdbeExec is greater than 1, +** string contains a copy of zRawSql but with host parameters expanded to +** their current bindings. Or, if sqlite3.nVdbeExec is greater than 1, ** then the returned string holds a copy of zRawSql with "-- " prepended ** to each line of text. ** @@ -83766,7 +83766,7 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSql( char zBase[100]; /* Initial working space */ db = p->db; - sqlite3StrAccumInit(&out, 0, zBase, sizeof(zBase), + sqlite3StrAccumInit(&out, 0, zBase, sizeof(zBase), db->aLimit[SQLITE_LIMIT_LENGTH]); if( db->nVdbeExec>1 ){ while( *zRawSql ){ @@ -83834,7 +83834,7 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSql( nOut = SQLITE_TRACE_SIZE_LIMIT; while( nOutn && (pVar->z[nOut]&0xc0)==0x80 ){ nOut++; } } -#endif +#endif sqlite3_str_appendf(&out, "'%.*q'", nOut, pVar->z); #ifdef SQLITE_TRACE_SIZE_LIMIT if( nOutn ){ @@ -84007,7 +84007,7 @@ SQLITE_API int sqlite3_found_count = 0; ** ** In other words, if M is 2, then I is either 0 (for fall-through) or ** 1 (for when the branch is taken). If M is 3, the I is 0 for an -** ordinary fall-through, I is 1 if the branch was taken, and I is 2 +** ordinary fall-through, I is 1 if the branch was taken, and I is 2 ** if the result of comparison is NULL. For M=3, I=2 the jump may or ** may not be taken, depending on the SQLITE_JUMPIFNULL flags in p5. ** When M is 4, that means that an OP_Jump is being run. I is 0, 1, or 2 @@ -84101,7 +84101,7 @@ static VdbeCursor *allocateCursor( u8 eCurType /* Type of the new cursor */ ){ /* Find the memory cell that will be used to store the blob of memory - ** required for this VdbeCursor structure. It is convenient to use a + ** required for this VdbeCursor structure. It is convenient to use a ** vdbe memory cell to manage the memory allocation required for a ** VdbeCursor structure for the following reasons: ** @@ -84122,14 +84122,14 @@ static VdbeCursor *allocateCursor( int nByte; VdbeCursor *pCx = 0; - nByte = - ROUND8(sizeof(VdbeCursor)) + 2*sizeof(u32)*nField + + nByte = + ROUND8(sizeof(VdbeCursor)) + 2*sizeof(u32)*nField + (eCurType==CURTYPE_BTREE?sqlite3BtreeCursorSize():0); assert( iCur>=0 && iCurnCursor ); if( p->apCsr[iCur] ){ /*OPTIMIZATION-IF-FALSE*/ /* Before calling sqlite3VdbeFreeCursor(), ensure the isEphemeral flag - ** is clear. Otherwise, if this is an ephemeral cursor created by + ** is clear. Otherwise, if this is an ephemeral cursor created by ** OP_OpenDup, the cursor will not be closed and will still be part ** of a BtShared.pCursor list. */ if( p->apCsr[iCur]->pBtx==0 ) p->apCsr[iCur]->isEphemeral = 0; @@ -84209,7 +84209,7 @@ static void applyNumericAffinity(Mem *pRec, int bTryForInt){ ** SQLITE_AFF_INTEGER: ** SQLITE_AFF_REAL: ** SQLITE_AFF_NUMERIC: -** Try to convert pRec to an integer representation or a +** Try to convert pRec to an integer representation or a ** floating-point representation if an integer representation ** is not possible. Note that the integer representation is ** always preferred, even if the affinity is REAL, because @@ -84240,7 +84240,7 @@ static void applyAffinity( }else if( affinity==SQLITE_AFF_TEXT ){ /* Only attempt the conversion to TEXT if there is an integer or real ** representation (blob and NULL do not get converted) but no string - ** representation. It would be harmless to repeat the conversion if + ** representation. It would be harmless to repeat the conversion if ** there is already a string rep, but it is pointless to waste those ** CPU cycles. */ if( 0==(pRec->flags&MEM_Str) ){ /*OPTIMIZATION-IF-FALSE*/ @@ -84272,12 +84272,12 @@ SQLITE_API int sqlite3_value_numeric_type(sqlite3_value *pVal){ } /* -** Exported version of applyAffinity(). This one works on sqlite3_value*, +** Exported version of applyAffinity(). This one works on sqlite3_value*, ** not the internal Mem* type. */ SQLITE_PRIVATE void sqlite3ValueApplyAffinity( - sqlite3_value *pVal, - u8 affinity, + sqlite3_value *pVal, + u8 affinity, u8 enc ){ applyAffinity((Mem *)pVal, affinity, enc); @@ -84312,7 +84312,7 @@ static u16 SQLITE_NOINLINE computeNumericType(Mem *pMem){ /* ** Return the numeric type for pMem, either MEM_Int or MEM_Real or both or -** none. +** none. ** ** Unlike applyNumericAffinity(), this routine does not modify pMem->flags. ** But it does set pMem->u.r and pMem->u.i appropriately. @@ -84458,8 +84458,8 @@ static void registerTrace(int iReg, Mem *p){ #ifdef VDBE_PROFILE -/* -** hwtime.h contains inline assembler code for implementing +/* +** hwtime.h contains inline assembler code for implementing ** high-performance timing routines. */ /************** Include hwtime.h in the middle of vdbe.c *********************/ @@ -84517,7 +84517,7 @@ static void registerTrace(int iReg, Mem *p){ __asm__ __volatile__ ("rdtsc" : "=A" (val)); return val; } - + #elif (defined(__GNUC__) && defined(__ppc__)) __inline__ sqlite_uint64 sqlite3Hwtime(void){ @@ -84559,9 +84559,9 @@ SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); } /* ** This function is only called from within an assert() expression. It ** checks that the sqlite3.nTransaction variable is correctly set to -** the number of non-transaction savepoints currently in the +** the number of non-transaction savepoints currently in the ** linked list starting at sqlite3.pSavepoint. -** +** ** Usage: ** ** assert( checkSavepointCount(db) ); @@ -84601,7 +84601,7 @@ static Mem *out2Prerelease(Vdbe *p, VdbeOp *pOp){ /* ** Execute as much of a VDBE program as we can. -** This is the core of sqlite3_step(). +** This is the core of sqlite3_step(). */ SQLITE_PRIVATE int sqlite3VdbeExec( Vdbe *p /* The VDBE */ @@ -84705,7 +84705,7 @@ SQLITE_PRIVATE int sqlite3VdbeExec( sqlite3VdbePrintOp(stdout, (int)(pOp - aOp), pOp); } #endif - + /* Check to see if we need to simulate an interrupt. This only happens ** if we have a special test build. @@ -84759,7 +84759,7 @@ SQLITE_PRIVATE int sqlite3VdbeExec( #if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) pOrigOp = pOp; #endif - + switch( pOp->opcode ){ /***************************************************************************** @@ -84800,7 +84800,7 @@ SQLITE_PRIVATE int sqlite3VdbeExec( /* Opcode: Goto * P2 * * * ** ** An unconditional jump to address P2. -** The next instruction executed will be +** The next instruction executed will be ** the one at index P2 from the beginning of ** the program. ** @@ -84816,7 +84816,7 @@ jump_to_p2_and_check_for_interrupt: /* Opcodes that are used as the bottom of a loop (OP_Next, OP_Prev, ** OP_VNext, or OP_SorterNext) all jump here upon ** completion. Check to see if sqlite3_interrupt() has been called - ** or if the progress callback needs to be invoked. + ** or if the progress callback needs to be invoked. ** ** This code uses unstructured "goto" statements and does not look clean. ** But that is not due to sloppy coding habits. The code is written this @@ -84842,7 +84842,7 @@ check_for_interrupt: } } #endif - + break; } @@ -84977,7 +84977,7 @@ case OP_HaltIfNull: { /* in3 */ ** whether or not to rollback the current transaction. Do not rollback ** if P2==OE_Fail. Do the rollback if P2==OE_Rollback. If P2==OE_Abort, ** then back out all changes that have occurred during this execution of the -** VDBE, but do not rollback the transaction. +** VDBE, but do not rollback the transaction. ** ** If P4 is not null then it is an error message string. ** @@ -85012,7 +85012,7 @@ case OP_Halt: { sqlite3VdbeSetChanges(db, p->nChange); pcx = sqlite3VdbeFrameRestore(pFrame); if( pOp->p2==OE_Ignore ){ - /* Instruction pcx is the OP_Program that invoked the sub-program + /* Instruction pcx is the OP_Program that invoked the sub-program ** currently being halted. If the p2 instruction of this OP_Halt ** instruction is set to OE_Ignore, then the sub-program is throwing ** an IGNORE exception. In this case jump to the address specified @@ -85100,7 +85100,7 @@ case OP_Real: { /* same as TK_FLOAT, out2 */ /* Opcode: String8 * P2 * P4 * ** Synopsis: r[P2]='P4' ** -** P4 points to a nul terminated UTF-8 string. This opcode is transformed +** P4 points to a nul terminated UTF-8 string. This opcode is transformed ** into a String opcode before it is executed for the first time. During ** this transformation, the length of string P4 is computed and stored ** as the P1 parameter. @@ -85135,7 +85135,7 @@ case OP_String8: { /* same as TK_STRING, out2 */ assert( rc==SQLITE_OK ); /* Fall through to the next case, OP_String */ } - + /* Opcode: String P1 P2 P3 P4 P5 ** Synopsis: r[P2]='P4' (len=P1) ** @@ -85394,8 +85394,8 @@ case OP_ResultRow: { goto abort_due_to_error; } - /* If the SQLITE_CountRows flag is set in sqlite3.flags mask, then - ** DML statements invoke this opcode to return the number of rows + /* If the SQLITE_CountRows flag is set in sqlite3.flags mask, then + ** DML statements invoke this opcode to return the number of rows ** modified to the user. This is the only way that a VM that ** opens a statement transaction may invoke this opcode. ** @@ -85540,15 +85540,15 @@ case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */ ** Synopsis: r[P3]=r[P2]/r[P1] ** ** Divide the value in register P1 by the value in register P2 -** and store the result in register P3 (P3=P2/P1). If the value in -** register P1 is zero, then the result is NULL. If either input is +** and store the result in register P3 (P3=P2/P1). If the value in +** register P1 is zero, then the result is NULL. If either input is ** NULL, the result is NULL. */ /* Opcode: Remainder P1 P2 P3 * * ** Synopsis: r[P3]=r[P2]%r[P1] ** -** Compute the remainder after integer register P2 is divided by -** register P1 and store the result in register P3. +** Compute the remainder after integer register P2 is divided by +** register P1 and store the result in register P3. ** If the value in register P1 is zero the result is NULL. ** If either operand is NULL, the result is NULL. */ @@ -85743,7 +85743,7 @@ case OP_ShiftRight: { /* same as TK_RSHIFT, in1, in2, out3 */ /* Opcode: AddImm P1 P2 * * * ** Synopsis: r[P1]=r[P1]+P2 -** +** ** Add the constant P2 to the value in register P1. ** The result is always an integer. ** @@ -85758,7 +85758,7 @@ case OP_AddImm: { /* in1 */ } /* Opcode: MustBeInt P1 P2 * * * -** +** ** Force the value in register P1 to be an integer. If the value ** in P1 is not an integer and cannot be converted into an integer ** without data loss, then jump immediately to P2, or if P2==0 @@ -85810,7 +85810,7 @@ case OP_RealAffinity: { /* in1 */ ** Synopsis: affinity(r[P1]) ** ** Force the value in register P1 to be the type defined by P2. -** +** **
        **
      • P2=='A' → BLOB **
      • P2=='B' → TEXT @@ -85846,14 +85846,14 @@ case OP_Cast: { /* in1 */ ** store the result of comparison in register P2. ** ** The SQLITE_AFF_MASK portion of P5 must be an affinity character - -** SQLITE_AFF_TEXT, SQLITE_AFF_INTEGER, and so forth. An attempt is made +** SQLITE_AFF_TEXT, SQLITE_AFF_INTEGER, and so forth. An attempt is made ** to coerce both inputs according to this affinity before the ** comparison is made. If the SQLITE_AFF_MASK is 0x00, then numeric ** affinity is used. Note that the affinity conversions are stored ** back into the input registers P1 and P3. So this opcode can cause ** persistent changes to registers P1 and P3. ** -** Once any conversions have taken place, and neither value is NULL, +** Once any conversions have taken place, and neither value is NULL, ** the values are compared. If both values are blobs then memcmp() is ** used to determine the results of the comparison. If both values ** are text, then the appropriate collating function specified in @@ -85892,18 +85892,18 @@ case OP_Cast: { /* in1 */ ** the result of comparison (0 or 1 or NULL) into register P2. ** ** If the SQLITE_JUMPIFNULL bit of P5 is set and either reg(P1) or -** reg(P3) is NULL then the take the jump. If the SQLITE_JUMPIFNULL +** reg(P3) is NULL then the take the jump. If the SQLITE_JUMPIFNULL ** bit is clear then fall through if either operand is NULL. ** ** The SQLITE_AFF_MASK portion of P5 must be an affinity character - -** SQLITE_AFF_TEXT, SQLITE_AFF_INTEGER, and so forth. An attempt is made +** SQLITE_AFF_TEXT, SQLITE_AFF_INTEGER, and so forth. An attempt is made ** to coerce both inputs according to this affinity before the ** comparison is made. If the SQLITE_AFF_MASK is 0x00, then numeric ** affinity is used. Note that the affinity conversions are stored ** back into the input registers P1 and P3. So this opcode can cause ** persistent changes to registers P1 and P3. ** -** Once any conversions have taken place, and neither value is NULL, +** Once any conversions have taken place, and neither value is NULL, ** the values are compared. If both values are blobs then memcmp() is ** used to determine the results of the comparison. If both values ** are text, then the appropriate collating function specified in @@ -86096,7 +86096,7 @@ compare_op: ** ** This opcode must immediately follow an OP_Lt or OP_Gt comparison operator. ** If result of an OP_Eq comparison on the same two operands -** would have be NULL or false (0), then then jump to P2. +** would have be NULL or false (0), then then jump to P2. ** If the result of an OP_Eq comparison on the two previous operands ** would have been true (1), then fall through. */ @@ -86116,7 +86116,7 @@ case OP_ElseNotEq: { /* same as TK_ESCAPE, jump */ ** instruction. The permutation is stored in the P4 operand. ** ** The permutation is only valid until the next OP_Compare that has -** the OPFLAG_PERMUTE bit set in P5. Typically the OP_Permutation should +** the OPFLAG_PERMUTE bit set in P5. Typically the OP_Permutation should ** occur immediately prior to the OP_Compare. ** ** The first integer in the P4 integer array is the length of the array @@ -86198,7 +86198,7 @@ case OP_Compare: { bRev = (pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_DESC); iCompare = sqlite3MemCompare(&aMem[p1+idx], &aMem[p2+idx], pColl); if( iCompare ){ - if( (pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_BIGNULL) + if( (pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_BIGNULL) && ((aMem[p1+idx].flags & MEM_Null) || (aMem[p2+idx].flags & MEM_Null)) ){ iCompare = -iCompare; @@ -86278,13 +86278,13 @@ case OP_Or: { /* same as TK_OR, in1, in2, out3 */ ** IS NOT FALSE operators. ** ** Interpret the value in register P1 as a boolean value. Store that -** boolean (a 0 or 1) in register P2. Or if the value in register P1 is +** boolean (a 0 or 1) in register P2. Or if the value in register P1 is ** NULL, then the P3 is stored in register P2. Invert the answer if P4 ** is 1. ** ** The logic is summarized like this: ** -**
          +**
            **
          • If P3==0 and P4==0 then r[P2] := r[P1] IS TRUE **
          • If P3==1 and P4==1 then r[P2] := r[P1] IS FALSE **
          • If P3==0 and P4==1 then r[P2] := r[P1] IS NOT TRUE @@ -86304,7 +86304,7 @@ case OP_IsTrue: { /* in1, out2 */ ** Synopsis: r[P2]= !r[P1] ** ** Interpret the value in register P1 as a boolean value. Store the -** boolean complement in register P2. If the value in register P1 is +** boolean complement in register P2. If the value in register P1 is ** NULL, then a NULL is stored in P2. */ case OP_Not: { /* same as TK_NOT, in1, out2 */ @@ -86419,7 +86419,7 @@ case OP_IsNull: { /* same as TK_ISNULL, jump, in1 */ /* Opcode: NotNull P1 P2 * * * ** Synopsis: if r[P1]!=NULL goto P2 ** -** Jump to P2 if the value in register P1 is not NULL. +** Jump to P2 if the value in register P1 is not NULL. */ case OP_NotNull: { /* same as TK_NOTNULL, jump, in1 */ pIn1 = &aMem[pOp->p1]; @@ -86484,7 +86484,7 @@ case OP_Offset: { /* out3 */ ** Interpret the data that cursor P1 points to as a structure built using ** the MakeRecord instruction. (See the MakeRecord opcode for additional ** information about the format of the data.) Extract the P2-th column -** from this record. If there are less that (P2+1) +** from this record. If there are less that (P2+1) ** values in the record, extract a NULL. ** ** The value extracted is stored in register P3. @@ -86518,7 +86518,7 @@ case OP_Column: { p2 = pOp->p2; /* If the cursor cache is stale (meaning it is not currently point at - ** the correct row) then bring it up-to-date by doing the necessary + ** the correct row) then bring it up-to-date by doing the necessary ** B-Tree seek. */ rc = sqlite3VdbeCursorMoveto(&pC, &p2); if( rc ) goto abort_due_to_error; @@ -86613,7 +86613,7 @@ case OP_Column: { */ if( pC->nHdrParsed<=p2 ){ /* If there is more header available for parsing in the record, try - ** to extract additional fields up through the p2+1-th field + ** to extract additional fields up through the p2+1-th field */ if( pC->iHdrOffsetaRow; } - + /* Fill in pC->aType[i] and aOffset[i] values through the p2-th field. */ op_column_read_header: i = pC->nHdrParsed; @@ -86733,7 +86733,7 @@ case OP_Column: { ** 2. the length(X) function if X is a blob, and ** 3. if the content length is zero. ** So we might as well use bogus content rather than reading - ** content from disk. + ** content from disk. ** ** Although sqlite3VdbeSerialGet() may read at most 8 bytes from the ** buffer passed to it, debugging function VdbeMemPrettyPrint() may @@ -86848,13 +86848,13 @@ case OP_MakeRecord: { ** like this: ** ** ------------------------------------------------------------------------ - ** | hdr-size | type 0 | type 1 | ... | type N-1 | data0 | ... | data N-1 | + ** | hdr-size | type 0 | type 1 | ... | type N-1 | data0 | ... | data N-1 | ** ------------------------------------------------------------------------ ** ** Data(0) is taken from register P1. Data(1) comes from register P1+1 ** and so forth. ** - ** Each type field is a varint representing the serial type of the + ** Each type field is a varint representing the serial type of the ** corresponding data element (see sqlite3VdbeSerialType()). The ** hdr-size field is also a varint which is the offset from the beginning ** of the record to data0. @@ -87043,7 +87043,7 @@ case OP_MakeRecord: { } nByte = nHdr+nData; - /* Make sure the output register has a buffer large enough to store + /* Make sure the output register has a buffer large enough to store ** the new record. The output register (pOp->p3) is not allowed to ** be one of the input registers (because the following call to ** sqlite3VdbeMemClearAndResize() could clobber the value before it is used). @@ -87096,7 +87096,7 @@ case OP_MakeRecord: { /* Opcode: Count P1 P2 * * * ** Synopsis: r[P2]=count() ** -** Store the number of entries (an integer value) in the table or index +** Store the number of entries (an integer value) in the table or index ** opened by cursor P1 in register P2 */ #ifndef SQLITE_OMIT_BTREECOUNT @@ -87137,7 +87137,7 @@ case OP_Savepoint: { zName = pOp->p4.z; /* Assert that the p1 parameter is valid. Also that if there is no open - ** transaction, then there cannot be any savepoints. + ** transaction, then there cannot be any savepoints. */ assert( db->pSavepoint==0 || db->autoCommit==0 ); assert( p1==SAVEPOINT_BEGIN||p1==SAVEPOINT_RELEASE||p1==SAVEPOINT_ROLLBACK ); @@ -87147,7 +87147,7 @@ case OP_Savepoint: { if( p1==SAVEPOINT_BEGIN ){ if( db->nVdbeWrite>0 ){ - /* A new savepoint cannot be created if there are active write + /* A new savepoint cannot be created if there are active write ** statements (i.e. open read/write incremental blob handles). */ sqlite3VdbeError(p, "cannot open savepoint - SQL statements in progress"); @@ -87171,7 +87171,7 @@ case OP_Savepoint: { if( pNew ){ pNew->zName = (char *)&pNew[1]; memcpy(pNew->zName, zName, nName+1); - + /* If there is no open transaction, then mark this as a special ** "transaction savepoint". */ if( db->autoCommit ){ @@ -87195,7 +87195,7 @@ case OP_Savepoint: { /* Find the named savepoint. If there is no such savepoint, then an ** an error is returned to the user. */ for( - pSavepoint = db->pSavepoint; + pSavepoint = db->pSavepoint; pSavepoint && sqlite3StrICmp(pSavepoint->zName, zName); pSavepoint = pSavepoint->pNext ){ @@ -87205,7 +87205,7 @@ case OP_Savepoint: { sqlite3VdbeError(p, "no such savepoint: %s", zName); rc = SQLITE_ERROR; }else if( db->nVdbeWrite>0 && p1==SAVEPOINT_RELEASE ){ - /* It is not possible to release (commit) a savepoint if there are + /* It is not possible to release (commit) a savepoint if there are ** active write statements. */ sqlite3VdbeError(p, "cannot release savepoint - " @@ -87214,8 +87214,8 @@ case OP_Savepoint: { }else{ /* Determine whether or not this is a transaction savepoint. If so, - ** and this is a RELEASE command, then the current transaction - ** is committed. + ** and this is a RELEASE command, then the current transaction + ** is committed. */ int isTransaction = pSavepoint->pNext==0 && db->isTransactionSavepoint; if( isTransaction && p1==SAVEPOINT_RELEASE ){ @@ -87258,8 +87258,8 @@ case OP_Savepoint: { db->mDbFlags |= DBFLAG_SchemaChange; } } - - /* Regardless of whether this is a RELEASE or ROLLBACK, destroy all + + /* Regardless of whether this is a RELEASE or ROLLBACK, destroy all ** savepoints nested inside of the savepoint being operated on. */ while( db->pSavepoint!=pSavepoint ){ pTmp = db->pSavepoint; @@ -87268,8 +87268,8 @@ case OP_Savepoint: { db->nSavepoint--; } - /* If it is a RELEASE, then destroy the savepoint being operated on - ** too. If it is a ROLLBACK TO, then set the number of deferred + /* If it is a RELEASE, then destroy the savepoint being operated on + ** too. If it is a ROLLBACK TO, then set the number of deferred ** constraint violations present in the database to the value stored ** when the savepoint was created. */ if( p1==SAVEPOINT_RELEASE ){ @@ -87323,7 +87323,7 @@ case OP_AutoCommit: { db->autoCommit = 1; }else if( desiredAutoCommit && db->nVdbeWrite>0 ){ /* If this instruction implements a COMMIT and other VMs are writing - ** return an error indicating that the other VMs must complete first. + ** return an error indicating that the other VMs must complete first. */ sqlite3VdbeError(p, "cannot commit transaction - " "SQL statements in progress"); @@ -87353,7 +87353,7 @@ case OP_AutoCommit: { (!desiredAutoCommit)?"cannot start a transaction within a transaction":( (iRollback)?"cannot rollback - no transaction is active": "cannot commit - no transaction is active")); - + rc = SQLITE_ERROR; goto abort_due_to_error; } @@ -87364,7 +87364,7 @@ case OP_AutoCommit: { ** ** Begin a transaction on database P1 if a transaction is not already ** active. -** If P2 is non-zero, then a write-transaction is started, or if a +** If P2 is non-zero, then a write-transaction is started, or if a ** read-transaction is already active, it is upgraded to a write-transaction. ** If P2 is zero, then a read-transaction is started. ** @@ -87421,13 +87421,13 @@ case OP_Transaction: { goto abort_due_to_error; } - if( pOp->p2 && p->usesStmtJournal - && (db->autoCommit==0 || db->nVdbeRead>1) + if( pOp->p2 && p->usesStmtJournal + && (db->autoCommit==0 || db->nVdbeRead>1) ){ assert( sqlite3BtreeIsInTrans(pBt) ); if( p->iStatement==0 ){ assert( db->nStatement>=0 && db->nSavepoint>=0 ); - db->nStatement++; + db->nStatement++; p->iStatement = db->nSavepoint + db->nStatement; } @@ -87455,7 +87455,7 @@ case OP_Transaction: { */ sqlite3DbFree(db, p->zErrMsg); p->zErrMsg = sqlite3DbStrDup(db, "database schema has changed"); - /* If the schema-cookie from the database file matches the cookie + /* If the schema-cookie from the database file matches the cookie ** stored with the in-memory representation of the schema, do ** not reload the schema from the database file. ** @@ -87465,7 +87465,7 @@ case OP_Transaction: { ** prepared queries. If such a query is out-of-date, we do not want to ** discard the database schema, as the user code implementing the ** v-table would have to be ready for the sqlite3_vtab structure itself - ** to be invalidated whenever sqlite3_step() is called from within + ** to be invalidated whenever sqlite3_step() is called from within ** a v-table method. */ if( db->aDb[pOp->p1].pSchema->schema_cookie!=iMeta ){ @@ -87513,8 +87513,8 @@ case OP_ReadCookie: { /* out2 */ ** ** Write the integer value P3 into cookie number P2 of database P1. ** P2==1 is the schema version. P2==2 is the database format. -** P2==3 is the recommended pager cache -** size, and so forth. P1==0 is the main database file and P1==1 is the +** P2==3 is the recommended pager cache +** size, and so forth. P1==0 is the main database file and P1==1 is the ** database file used to store temporary tables. ** ** A transaction must be started before executing this opcode. @@ -87554,8 +87554,8 @@ case OP_SetCookie: { ** Synopsis: root=P2 iDb=P3 ** ** Open a read-only cursor for the database table whose root page is -** P2 in a database file. The database file is determined by P3. -** P3==0 means the main database, P3==1 means the database used for +** P2 in a database file. The database file is determined by P3. +** P3==0 means the main database, P3==1 means the database used for ** temporary tables, and P3>1 means used the corresponding attached ** database. Give the new cursor an identifier of P1. The P1 ** values need not be contiguous but all P1 values should be small integers. @@ -87569,10 +87569,10 @@ case OP_SetCookie: { **
          ** ** The P4 value may be either an integer (P4_INT32) or a pointer to -** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo +** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo ** object, then table being opened must be an [index b-tree] where the -** KeyInfo object defines the content and collating -** sequence of that index b-tree. Otherwise, if P4 is an integer +** KeyInfo object defines the content and collating +** sequence of that index b-tree. Otherwise, if P4 is an integer ** value, then the table being opened must be a [table b-tree] with a ** number of columns no less than the value of P4. ** @@ -87608,10 +87608,10 @@ case OP_SetCookie: { ** OPFLAG_P2ISREG bit is set in P5 - see below). ** ** The P4 value may be either an integer (P4_INT32) or a pointer to -** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo +** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo ** object, then table being opened must be an [index b-tree] where the -** KeyInfo object defines the content and collating -** sequence of that index b-tree. Otherwise, if P4 is an integer +** KeyInfo object defines the content and collating +** sequence of that index b-tree. Otherwise, if P4 is an integer ** value, then the table being opened must be a [table b-tree] with a ** number of columns no less than the value of P4. ** @@ -87724,7 +87724,7 @@ case OP_OpenWrite: /* Set the VdbeCursor.isTable variable. Previous versions of ** SQLite used to check if the root-page flags were sane at this point ** and report database corruption if they were not, but this check has - ** since moved into the btree layer. */ + ** since moved into the btree layer. */ pCur->isTable = pOp->p4type!=P4_KEYINFO; open_cursor_set_hints: @@ -87777,7 +87777,7 @@ case OP_OpenDup: { ** Synopsis: nColumn=P2 ** ** Open a new cursor P1 to a transient table. -** The cursor is always opened read/write even if +** The cursor is always opened read/write even if ** the main database is read-only. The ephemeral ** table is deleted automatically when the cursor is closed. ** @@ -87802,12 +87802,12 @@ case OP_OpenDup: { ** by this opcode will be used for automatically created transient ** indices in joins. */ -case OP_OpenAutoindex: +case OP_OpenAutoindex: case OP_OpenEphemeral: { VdbeCursor *pCx; KeyInfo *pKeyInfo; - static const int vfsFlags = + static const int vfsFlags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_EXCLUSIVE | @@ -87829,7 +87829,7 @@ case OP_OpenEphemeral: { pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, CURTYPE_BTREE); if( pCx==0 ) goto no_mem; pCx->isEphemeral = 1; - rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBtx, + rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBtx, BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5, vfsFlags); if( rc==SQLITE_OK ){ @@ -87844,7 +87844,7 @@ case OP_OpenEphemeral: { if( (pCx->pKeyInfo = pKeyInfo = pOp->p4.pKeyInfo)!=0 ){ assert( pOp->p4type==P4_KEYINFO ); rc = sqlite3BtreeCreateTable(pCx->pBtx, (int*)&pCx->pgnoRoot, - BTREE_BLOBKEY | pOp->p5); + BTREE_BLOBKEY | pOp->p5); if( rc==SQLITE_OK ){ assert( pCx->pgnoRoot==MASTER_ROOT+1 ); assert( pKeyInfo->db==db ); @@ -87915,7 +87915,7 @@ case OP_SequenceTest: { ** ** Open a new cursor that points to a fake table that contains a single ** row of data. The content of that one row is the content of memory -** register P2. In other words, cursor P1 becomes an alias for the +** register P2. In other words, cursor P1 becomes an alias for the ** MEM_Blob content contained in register P2. ** ** A pseudo-table created by this opcode is used to hold a single @@ -87980,13 +87980,13 @@ case OP_ColumnsUsed: { /* Opcode: SeekGE P1 P2 P3 P4 * ** Synopsis: key=r[P3@P4] ** -** If cursor P1 refers to an SQL table (B-Tree that uses integer keys), -** use the value in register P3 as the key. If cursor P1 refers -** to an SQL index, then P3 is the first in an array of P4 registers -** that are used as an unpacked index key. +** If cursor P1 refers to an SQL table (B-Tree that uses integer keys), +** use the value in register P3 as the key. If cursor P1 refers +** to an SQL index, then P3 is the first in an array of P4 registers +** that are used as an unpacked index key. ** -** Reposition cursor P1 so that it points to the smallest entry that -** is greater than or equal to the key value. If there are no records +** Reposition cursor P1 so that it points to the smallest entry that +** is greater than or equal to the key value. If there are no records ** greater than or equal to the key and P2 is not zero, then jump to P2. ** ** If the cursor P1 was opened using the OPFLAG_SEEKEQ flag, then this @@ -88005,13 +88005,13 @@ case OP_ColumnsUsed: { /* Opcode: SeekGT P1 P2 P3 P4 * ** Synopsis: key=r[P3@P4] ** -** If cursor P1 refers to an SQL table (B-Tree that uses integer keys), -** use the value in register P3 as a key. If cursor P1 refers -** to an SQL index, then P3 is the first in an array of P4 registers -** that are used as an unpacked index key. +** If cursor P1 refers to an SQL table (B-Tree that uses integer keys), +** use the value in register P3 as a key. If cursor P1 refers +** to an SQL index, then P3 is the first in an array of P4 registers +** that are used as an unpacked index key. ** -** Reposition cursor P1 so that it points to the smallest entry that -** is greater than the key value. If there are no records greater than +** Reposition cursor P1 so that it points to the smallest entry that +** is greater than the key value. If there are no records greater than ** the key and P2 is not zero, then jump to P2. ** ** This opcode leaves the cursor configured to move in forward order, @@ -88020,16 +88020,16 @@ case OP_ColumnsUsed: { ** ** See also: Found, NotFound, SeekLt, SeekGe, SeekLe */ -/* Opcode: SeekLT P1 P2 P3 P4 * +/* Opcode: SeekLT P1 P2 P3 P4 * ** Synopsis: key=r[P3@P4] ** -** If cursor P1 refers to an SQL table (B-Tree that uses integer keys), -** use the value in register P3 as a key. If cursor P1 refers -** to an SQL index, then P3 is the first in an array of P4 registers -** that are used as an unpacked index key. +** If cursor P1 refers to an SQL table (B-Tree that uses integer keys), +** use the value in register P3 as a key. If cursor P1 refers +** to an SQL index, then P3 is the first in an array of P4 registers +** that are used as an unpacked index key. ** -** Reposition cursor P1 so that it points to the largest entry that -** is less than the key value. If there are no records less than +** Reposition cursor P1 so that it points to the largest entry that +** is less than the key value. If there are no records less than ** the key and P2 is not zero, then jump to P2. ** ** This opcode leaves the cursor configured to move in reverse order, @@ -88041,13 +88041,13 @@ case OP_ColumnsUsed: { /* Opcode: SeekLE P1 P2 P3 P4 * ** Synopsis: key=r[P3@P4] ** -** If cursor P1 refers to an SQL table (B-Tree that uses integer keys), -** use the value in register P3 as a key. If cursor P1 refers -** to an SQL index, then P3 is the first in an array of P4 registers -** that are used as an unpacked index key. +** If cursor P1 refers to an SQL table (B-Tree that uses integer keys), +** use the value in register P3 as a key. If cursor P1 refers +** to an SQL index, then P3 is the first in an array of P4 registers +** that are used as an unpacked index key. ** -** Reposition cursor P1 so that it points to the largest entry that -** is less than or equal to the key value. If there are no records +** Reposition cursor P1 so that it points to the largest entry that +** is less than or equal to the key value. If there are no records ** less than or equal to the key and P2 is not zero, then jump to P2. ** ** This opcode leaves the cursor configured to move in reverse order, @@ -88294,9 +88294,9 @@ case OP_SeekHit: { ** If P4==0 then register P3 holds a blob constructed by MakeRecord. If ** P4>0 then register P3 is the first of P4 registers that form an unpacked ** record. -** +** ** Cursor P1 is on an index btree. If the record identified by P3 and P4 -** is not the prefix of any entry in P1 then a jump is made to P2. If P1 +** is not the prefix of any entry in P1 then a jump is made to P2. If P1 ** does contain an entry whose prefix matches the P3/P4 record then control ** falls through to the next instruction and P1 is left pointing at the ** matching entry. @@ -88340,7 +88340,7 @@ case OP_SeekHit: { ** If P4==0 then register P3 holds a blob constructed by MakeRecord. If ** P4>0 then register P3 is the first of P4 registers that form an unpacked ** record. -** +** ** Cursor P1 is on an index btree. If the record identified by P3 and P4 ** contains any NULL value, jump immediately to P2. If all terms of the ** record are not-NULL then a check is done to determine if any row in the @@ -88452,9 +88452,9 @@ case OP_Found: { /* jump, in3 */ ** ** P1 is the index of a cursor open on an SQL table btree (with integer ** keys). If register P3 does not contain an integer or if P1 does not -** contain a record with rowid P3 then jump immediately to P2. +** contain a record with rowid P3 then jump immediately to P2. ** Or, if P2 is 0, raise an SQLITE_CORRUPT error. If P1 does contain -** a record with rowid P3 then +** a record with rowid P3 then ** leave the cursor pointing at that record and fall through to the next ** instruction. ** @@ -88477,7 +88477,7 @@ case OP_Found: { /* jump, in3 */ ** P1 is the index of a cursor open on an SQL table btree (with integer ** keys). P3 is an integer rowid. If P1 does not contain a record with ** rowid P3 then jump immediately to P2. Or, if P2 is 0, raise an -** SQLITE_CORRUPT error. If P1 does contain a record with rowid P3 then +** SQLITE_CORRUPT error. If P1 does contain a record with rowid P3 then ** leave the cursor pointing at that record and fall through to the next ** instruction. ** @@ -88560,7 +88560,7 @@ notExistsWithKey: ** Find the next available sequence number for cursor P1. ** Write the sequence number into register P2. ** The sequence number on the cursor is incremented after this -** instruction. +** instruction. */ case OP_Sequence: { /* out2 */ assert( pOp->p1>=0 && pOp->p1nCursor ); @@ -88580,9 +88580,9 @@ case OP_Sequence: { /* out2 */ ** table that cursor P1 points to. The new record number is written ** written to register P2. ** -** If P3>0 then P3 is a register in the root frame of this VDBE that holds +** If P3>0 then P3 is a register in the root frame of this VDBE that holds ** the largest previously generated record number. No new record numbers are -** allowed to be less than this value. When this value reaches its maximum, +** allowed to be less than this value. When this value reaches its maximum, ** an SQLITE_FULL error is generated. The P3 register is updated with the ' ** generated record number. This P3 mechanism is used to help implement the ** AUTOINCREMENT feature. @@ -88731,8 +88731,8 @@ case OP_NewRowid: { /* out2 */ ** is part of an INSERT operation. The difference is only important to ** the update hook. ** -** Parameter P4 may point to a Table structure, or may be NULL. If it is -** not NULL, then the update-hook (sqlite3.xUpdateCallback) is invoked +** Parameter P4 may point to a Table structure, or may be NULL. If it is +** not NULL, then the update-hook (sqlite3.xUpdateCallback) is invoked ** following a successful insert. ** ** (WARNING/TODO: If P1 is a pseudo-cursor and P2 is dynamically @@ -88833,7 +88833,7 @@ case OP_Insert: { ** the cursor will be left pointing at either the next or the previous ** record in the table. If it is left pointing at the next record, then ** the next Next instruction will be a no-op. As a result, in this case -** it is ok to delete a record from within a Next loop. If +** it is ok to delete a record from within a Next loop. If ** OPFLAG_SAVEPOSITION bit of P5 is clear, then the cursor will be ** left in an undefined state. ** @@ -88849,11 +88849,11 @@ case OP_Insert: { ** P1 must not be pseudo-table. It has to be a real table with ** multiple rows. ** -** If P4 is not NULL then it points to a Table object. In this case either +** If P4 is not NULL then it points to a Table object. In this case either ** the update or pre-update hook, or both, may be invoked. The P1 cursor must -** have been positioned using OP_NotFound prior to invoking this opcode in -** this case. Specifically, if one is configured, the pre-update hook is -** invoked if P4 is not NULL. The update-hook is invoked if one is configured, +** have been positioned using OP_NotFound prior to invoking this opcode in +** this case. Specifically, if one is configured, the pre-update hook is +** invoked if P4 is not NULL. The update-hook is invoked if one is configured, ** P4 is not NULL, and the OPFLAG_NCHANGE flag is set in P2. ** ** If the OPFLAG_ISUPDATE flag is set in P2, then P3 contains the address @@ -88888,7 +88888,7 @@ case OP_Delete: { /* If the update-hook or pre-update-hook will be invoked, set zDb to ** the name of the db to pass as to it. Also set local pTab to a copy ** of p4.pTab. Finally, if p5 is true, indicating that this cursor was - ** last moved with OP_Next or OP_Prev, not Seek or NotFound, set + ** last moved with OP_Next or OP_Prev, not Seek or NotFound, set ** VdbeCursor.movetoTarget to the current rowid. */ if( pOp->p4type==P4_TABLE && HAS_UPDATE_HOOK(db) ){ assert( pC->iDb>=0 ); @@ -88906,20 +88906,20 @@ case OP_Delete: { #ifdef SQLITE_ENABLE_PREUPDATE_HOOK /* Invoke the pre-update-hook if required. */ if( db->xPreUpdateCallback && pOp->p4.pTab ){ - assert( !(opflags & OPFLAG_ISUPDATE) - || HasRowid(pTab)==0 - || (aMem[pOp->p3].flags & MEM_Int) + assert( !(opflags & OPFLAG_ISUPDATE) + || HasRowid(pTab)==0 + || (aMem[pOp->p3].flags & MEM_Int) ); sqlite3VdbePreUpdateHook(p, pC, - (opflags & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_DELETE, + (opflags & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_DELETE, zDb, pTab, pC->movetoTarget, pOp->p3 ); } if( opflags & OPFLAG_ISNOOP ) break; #endif - - /* Only flags that can be set are SAVEPOISTION and AUXDELETE */ + + /* Only flags that can be set are SAVEPOISTION and AUXDELETE */ assert( (pOp->p5 & ~(OPFLAG_SAVEPOSITION|OPFLAG_AUXDELETE))==0 ); assert( OPFLAG_SAVEPOSITION==BTREE_SAVEPOSITION ); assert( OPFLAG_AUXDELETE==BTREE_AUXDELETE ); @@ -88972,7 +88972,7 @@ case OP_ResetCount: { ** Synopsis: if key(P1)!=trim(r[P3],P4) goto P2 ** ** P1 is a sorter cursor. This instruction compares a prefix of the -** record blob in register P3 against a prefix of the entry that +** record blob in register P3 against a prefix of the entry that ** the sorter cursor currently points to. Only the first P4 fields ** of r[P3] and the sorter record are compared. ** @@ -89030,10 +89030,10 @@ case OP_SorterData: { /* Opcode: RowData P1 P2 P3 * * ** Synopsis: r[P2]=data ** -** Write into register P2 the complete row content for the row at +** Write into register P2 the complete row content for the row at ** which cursor P1 is currently pointing. -** There is no interpretation of the data. -** It is just copied onto the P2 register exactly as +** There is no interpretation of the data. +** It is just copied onto the P2 register exactly as ** it is found in the database file. ** ** If cursor P1 is an index, then the content is the key of the row. @@ -89186,7 +89186,7 @@ case OP_NullRow: { */ /* Opcode: Last P1 P2 * * * ** -** The next use of the Rowid or Column or Prev instruction for P1 +** The next use of the Rowid or Column or Prev instruction for P1 ** will refer to the last entry in the database table or index. ** If the table or index is empty and P2>0, then jump immediately to P2. ** If P2 is 0 or if the table or index is not empty, fall through @@ -89291,10 +89291,10 @@ case OP_Sort: { /* jump */ } /* Opcode: Rewind P1 P2 * * * ** -** The next use of the Rowid or Column or Next instruction for P1 +** The next use of the Rowid or Column or Next instruction for P1 ** will refer to the first entry in the database table or index. ** If the table or index is empty, jump immediately to P2. -** If the table or index is not empty, fall through to the following +** If the table or index is not empty, fall through to the following ** instruction. ** ** This opcode leaves the cursor configured to move in forward order, @@ -89464,7 +89464,7 @@ next_tail: ** run faster by avoiding an unnecessary seek on cursor P1. However, ** the OPFLAG_USESEEKRESULT flag must only be set if there have been no prior ** seeks on the cursor or if the most recent seek used a key equivalent -** to P2. +** to P2. ** ** This instruction only works for indices. The equivalent instruction ** for tables is OP_Insert. @@ -89501,7 +89501,7 @@ case OP_IdxInsert: { /* in2 */ x.aMem = aMem + pOp->p3; x.nMem = (u16)pOp->p4.i; rc = sqlite3BtreeInsert(pC->uc.pCursor, &x, - (pOp->p5 & (OPFLAG_APPEND|OPFLAG_SAVEPOSITION)), + (pOp->p5 & (OPFLAG_APPEND|OPFLAG_SAVEPOSITION)), ((pOp->p5 & OPFLAG_USESEEKRESULT) ? pC->seekResult : 0) ); assert( pC->deferredMoveto==0 ); @@ -89515,7 +89515,7 @@ case OP_IdxInsert: { /* in2 */ ** Synopsis: key=r[P2@P3] ** ** The content of P3 registers starting at register P2 form -** an unpacked index key. This opcode removes that entry from the +** an unpacked index key. This opcode removes that entry from the ** index opened by cursor P1. */ case OP_IdxDelete: { @@ -89563,8 +89563,8 @@ case OP_IdxDelete: { ** ** P4 may be an array of integers (type P4_INTARRAY) containing ** one entry for each column in the P3 table. If array entry a(i) -** is non-zero, then reading column a(i)-1 from cursor P3 is -** equivalent to performing the deferred seek and then reading column i +** is non-zero, then reading column a(i)-1 from cursor P3 is +** equivalent to performing the deferred seek and then reading column i ** from P1. This information is stored in P3 and used to redirect ** reads against P3 over to P1, thus possibly avoiding the need to ** seek and read cursor P3. @@ -89635,9 +89635,9 @@ case OP_IdxRowid: { /* out2 */ /* Opcode: IdxGE P1 P2 P3 P4 P5 ** Synopsis: key=r[P3@P4] ** -** The P4 register values beginning with P3 form an unpacked index -** key that omits the PRIMARY KEY. Compare this key value against the index -** that P1 is currently pointing to, ignoring the PRIMARY KEY or ROWID +** The P4 register values beginning with P3 form an unpacked index +** key that omits the PRIMARY KEY. Compare this key value against the index +** that P1 is currently pointing to, ignoring the PRIMARY KEY or ROWID ** fields at the end. ** ** If the P1 index entry is greater than or equal to the key value @@ -89646,9 +89646,9 @@ case OP_IdxRowid: { /* out2 */ /* Opcode: IdxGT P1 P2 P3 P4 P5 ** Synopsis: key=r[P3@P4] ** -** The P4 register values beginning with P3 form an unpacked index -** key that omits the PRIMARY KEY. Compare this key value against the index -** that P1 is currently pointing to, ignoring the PRIMARY KEY or ROWID +** The P4 register values beginning with P3 form an unpacked index +** key that omits the PRIMARY KEY. Compare this key value against the index +** that P1 is currently pointing to, ignoring the PRIMARY KEY or ROWID ** fields at the end. ** ** If the P1 index entry is greater than the key value @@ -89657,7 +89657,7 @@ case OP_IdxRowid: { /* out2 */ /* Opcode: IdxLT P1 P2 P3 P4 P5 ** Synopsis: key=r[P3@P4] ** -** The P4 register values beginning with P3 form an unpacked index +** The P4 register values beginning with P3 form an unpacked index ** key that omits the PRIMARY KEY or ROWID. Compare this key value against ** the index that P1 is currently pointing to, ignoring the PRIMARY KEY or ** ROWID on the P1 index. @@ -89668,7 +89668,7 @@ case OP_IdxRowid: { /* out2 */ /* Opcode: IdxLE P1 P2 P3 P4 P5 ** Synopsis: key=r[P3@P4] ** -** The P4 register values beginning with P3 form an unpacked index +** The P4 register values beginning with P3 form an unpacked index ** key that omits the PRIMARY KEY or ROWID. Compare this key value against ** the index that P1 is currently pointing to, ignoring the PRIMARY KEY or ** ROWID on the P1 index. @@ -89742,15 +89742,15 @@ case OP_IdxGE: { /* jump */ ** root pages contiguous at the beginning of the database. The former ** value of the root page that moved - its value before the move occurred - ** is stored in register P2. If no page movement was required (because the -** table being dropped was already the last one in the database) then a -** zero is stored in register P2. If AUTOVACUUM is disabled then a zero +** table being dropped was already the last one in the database) then a +** zero is stored in register P2. If AUTOVACUUM is disabled then a zero ** is stored in register P2. ** ** This opcode throws an error if there are any active reader VMs when -** it is invoked. This is done to avoid the difficulty associated with -** updating existing cursors when a root page is moved in an AUTOVACUUM -** database. This error is thrown even if the database is not an AUTOVACUUM -** db in order to avoid introducing an incompatibility between autovacuum +** it is invoked. This is done to avoid the difficulty associated with +** updating existing cursors when a root page is moved in an AUTOVACUUM +** database. This error is thrown even if the database is not an AUTOVACUUM +** db in order to avoid introducing an incompatibility between autovacuum ** and non-autovacuum modes. ** ** See also: Clear @@ -89799,8 +89799,8 @@ case OP_Destroy: { /* out2 */ ** that is used to store tables create using CREATE TEMPORARY TABLE. ** ** If the P3 value is non-zero, then the table referred to must be an -** intkey table (an SQL table, not an index). In this case the row change -** count is incremented by the number of rows in the table being cleared. +** intkey table (an SQL table, not an index). In this case the row change +** count is incremented by the number of rows in the table being cleared. ** If P3 is greater than zero, then the value stored in register P3 is ** also incremented by the number of rows in the table being cleared. ** @@ -89808,7 +89808,7 @@ case OP_Destroy: { /* out2 */ */ case OP_Clear: { int nChange; - + sqlite3VdbeIncrWriteCounter(p, 0); nChange = 0; assert( p->readOnly==0 ); @@ -89838,7 +89838,7 @@ case OP_Clear: { */ case OP_ResetSorter: { VdbeCursor *pC; - + assert( pOp->p1>=0 && pOp->p1nCursor ); pC = p->apCsr[pOp->p1]; assert( pC!=0 ); @@ -89910,7 +89910,7 @@ case OP_ParseSchema: { InitData initData; /* Any prepared statement that invokes this opcode will hold mutexes - ** on every btree. This is a prerequisite for invoking + ** on every btree. This is a prerequisite for invoking ** sqlite3InitCallback(). */ #ifdef SQLITE_DEBUG @@ -89968,7 +89968,7 @@ case OP_ParseSchema: { } goto abort_due_to_error; } - break; + break; } #if !defined(SQLITE_OMIT_ANALYZE) @@ -89982,7 +89982,7 @@ case OP_LoadAnalysis: { assert( pOp->p1>=0 && pOp->p1nDb ); rc = sqlite3AnalysisLoad(db, pOp->p1); if( rc ) goto abort_due_to_error; - break; + break; } #endif /* !defined(SQLITE_OMIT_ANALYZE) */ @@ -89990,7 +89990,7 @@ case OP_LoadAnalysis: { ** ** Remove the internal (in-memory) data structures that describe ** the table named P4 in database P1. This is called after a table -** is dropped from disk (using the Destroy opcode) in order to keep +** is dropped from disk (using the Destroy opcode) in order to keep ** the internal representation of the ** schema consistent with what is on disk. */ @@ -90018,7 +90018,7 @@ case OP_DropIndex: { ** ** Remove the internal (in-memory) data structures that describe ** the trigger named P4 in database P1. This is called after a trigger -** is dropped from disk (using the Destroy opcode) in order to keep +** is dropped from disk (using the Destroy opcode) in order to keep ** the internal representation of the ** schema consistent with what is on disk. */ @@ -90038,7 +90038,7 @@ case OP_DropTrigger: { ** ** The register P3 contains one less than the maximum number of allowed errors. ** At most reg(P3) errors will be reported. -** In other words, the analysis stops as soon as reg(P1) errors are +** In other words, the analysis stops as soon as reg(P1) errors are ** seen. Reg(P1) is updated with the number of errors remaining. ** ** The root page numbers of all tables in the database are integers @@ -90118,7 +90118,7 @@ case OP_RowSetRead: { /* jump, in1, out3 */ pIn1 = &aMem[pOp->p1]; assert( (pIn1->flags & MEM_Blob)==0 || sqlite3VdbeMemIsRowSet(pIn1) ); - if( (pIn1->flags & MEM_Blob)==0 + if( (pIn1->flags & MEM_Blob)==0 || sqlite3RowSetNext((RowSet*)pIn1->z, &val)==0 ){ /* The boolean index is empty */ @@ -90190,13 +90190,13 @@ case OP_RowSetTest: { /* jump, in1, in3 */ /* Opcode: Program P1 P2 P3 P4 P5 ** -** Execute the trigger program passed as P4 (type P4_SUBPROGRAM). +** Execute the trigger program passed as P4 (type P4_SUBPROGRAM). ** -** P1 contains the address of the memory cell that contains the first memory -** cell in an array of values used as arguments to the sub-program. P2 -** contains the address to jump to if the sub-program throws an IGNORE -** exception using the RAISE() function. Register P3 contains the address -** of a memory cell in this (the parent) VM that is used to allocate the +** P1 contains the address of the memory cell that contains the first memory +** cell in an array of values used as arguments to the sub-program. P2 +** contains the address to jump to if the sub-program throws an IGNORE +** exception using the RAISE() function. Register P3 contains the address +** of a memory cell in this (the parent) VM that is used to allocate the ** memory required by the sub-vdbe at runtime. ** ** P4 is a pointer to the VM containing the trigger program. @@ -90216,17 +90216,17 @@ case OP_Program: { /* jump */ pProgram = pOp->p4.pProgram; pRt = &aMem[pOp->p3]; assert( pProgram->nOp>0 ); - - /* If the p5 flag is clear, then recursive invocation of triggers is + + /* If the p5 flag is clear, then recursive invocation of triggers is ** disabled for backwards compatibility (p5 is set if this sub-program ** is really a trigger, not a foreign key action, and the flag set ** and cleared by the "PRAGMA recursive_triggers" command is clear). - ** - ** It is recursive invocation of triggers, at the SQL level, that is - ** disabled. In some cases a single trigger may generate more than one - ** SubProgram (if the trigger may be executed with more than one different + ** + ** It is recursive invocation of triggers, at the SQL level, that is + ** disabled. In some cases a single trigger may generate more than one + ** SubProgram (if the trigger may be executed with more than one different ** ON CONFLICT algorithm). SubProgram structures associated with a - ** single trigger all have the same value for the SubProgram.token + ** single trigger all have the same value for the SubProgram.token ** variable. */ if( pOp->p5 ){ t = pProgram->token; @@ -90242,10 +90242,10 @@ case OP_Program: { /* jump */ /* Register pRt is used to store the memory required to save the state ** of the current program, and the memory required at runtime to execute - ** the trigger program. If this trigger has been fired before, then pRt + ** the trigger program. If this trigger has been fired before, then pRt ** is already allocated. Otherwise, it must be initialized. */ if( (pRt->flags&MEM_Blob)==0 ){ - /* SubProgram.nMem is set to the number of memory cells used by the + /* SubProgram.nMem is set to the number of memory cells used by the ** program stored in SubProgram.aOp. As well as these, one memory ** cell is required for each cursor used by the program. Set local ** variable nMem (and later, VdbeFrame.nChildMem) to this value. @@ -90293,7 +90293,7 @@ case OP_Program: { /* jump */ }else{ pFrame = (VdbeFrame*)pRt->z; assert( pRt->xDel==sqlite3VdbeFrameMemDel ); - assert( pProgram->nMem+pProgram->nCsr==pFrame->nChildMem + assert( pProgram->nMem+pProgram->nCsr==pFrame->nChildMem || (pProgram->nCsr==0 && pProgram->nMem+1==pFrame->nChildMem) ); assert( pProgram->nCsr==pFrame->nChildCsr ); assert( (int)(pOp - aOp)==pFrame->pc ); @@ -90337,10 +90337,10 @@ case OP_Program: { /* jump */ /* Opcode: Param P1 P2 * * * ** -** This opcode is only ever present in sub-programs called via the -** OP_Program instruction. Copy a value currently stored in a memory -** cell of the calling (parent) frame to cell P2 in the current frames -** address space. This is used by trigger programs to access the new.* +** This opcode is only ever present in sub-programs called via the +** OP_Program instruction. Copy a value currently stored in a memory +** cell of the calling (parent) frame to cell P2 in the current frames +** address space. This is used by trigger programs to access the new.* ** and old.* values. ** ** The address of the cell in the parent frame is determined by adding @@ -90352,7 +90352,7 @@ case OP_Param: { /* out2 */ Mem *pIn; pOut = out2Prerelease(p, pOp); pFrame = p->pFrame; - pIn = &pFrame->aMem[pOp->p1 + pFrame->aOp[pFrame->pc].p1]; + pIn = &pFrame->aMem[pOp->p1 + pFrame->aOp[pFrame->pc].p1]; sqlite3VdbeMemShallowCopy(pOut, pIn, MEM_Ephem); break; } @@ -90364,8 +90364,8 @@ case OP_Param: { /* out2 */ ** Synopsis: fkctr[P1]+=P2 ** ** Increment a "constraint counter" by P2 (P2 may be negative or positive). -** If P1 is non-zero, the database constraint counter is incremented -** (deferred foreign key constraints). Otherwise, if P1 is zero, the +** If P1 is non-zero, the database constraint counter is incremented +** (deferred foreign key constraints). Otherwise, if P1 is zero, the ** statement counter is incremented (immediate foreign key constraints). */ case OP_FkCounter: { @@ -90383,7 +90383,7 @@ case OP_FkCounter: { ** Synopsis: if fkctr[P1]==0 goto P2 ** ** This opcode tests if a foreign key constraint-counter is currently zero. -** If so, jump to instruction P2. Otherwise, fall through to the next +** If so, jump to instruction P2. Otherwise, fall through to the next ** instruction. ** ** If P1 is non-zero, then the jump is taken if the database constraint-counter @@ -90409,7 +90409,7 @@ case OP_FkIfZero: { /* jump */ ** ** P1 is a register in the root frame of this VM (the root frame is ** different from the current frame if this instruction is being executed -** within a sub-program). Set the value of register P1 to the maximum of +** within a sub-program). Set the value of register P1 to the maximum of ** its current value and the value in register P2. ** ** This instruction throws an error if the memory cell is not initially @@ -90469,7 +90469,7 @@ case OP_IfPos: { /* jump, in1 */ ** and r[P2] is set to be the value of the LIMIT, r[P1]. ** ** if r[P1] is zero or negative, that means there is no LIMIT -** and r[P2] is set to -1. +** and r[P2] is set to -1. ** ** Otherwise, r[P2] is set to the sum of r[P1] and r[P3]. */ @@ -90501,7 +90501,7 @@ case OP_OffsetLimit: { /* in1, out2, in3 */ ** ** Register P1 must contain an integer. If the content of register P1 is ** initially greater than zero, then decrement the value in register P1. -** If it is non-zero (negative or positive) and then also jump to P2. +** If it is non-zero (negative or positive) and then also jump to P2. ** If register P1 is initially zero, leave it unchanged and fall through. */ case OP_IfNotZero: { /* jump, in1 */ @@ -90535,7 +90535,7 @@ case OP_DecrJumpZero: { /* jump, in1 */ ** Synopsis: accum=r[P3] step(r[P2@P5]) ** ** Execute the xStep function for an aggregate. -** The function has P5 arguments. P4 is a pointer to the +** The function has P5 arguments. P4 is a pointer to the ** FuncDef structure that specifies the function. Register P3 is the ** accumulator. ** @@ -90546,7 +90546,7 @@ case OP_DecrJumpZero: { /* jump, in1 */ ** Synopsis: accum=r[P3] inverse(r[P2@P5]) ** ** Execute the xInverse function for an aggregate. -** The function has P5 arguments. P4 is a pointer to the +** The function has P5 arguments. P4 is a pointer to the ** FuncDef structure that specifies the function. Register P3 is the ** accumulator. ** @@ -90557,7 +90557,7 @@ case OP_DecrJumpZero: { /* jump, in1 */ ** Synopsis: accum=r[P3] step(r[P2@P5]) ** ** Execute the xStep (if P1==0) or xInverse (if P1!=0) function for an -** aggregate. The function has P5 arguments. P4 is a pointer to the +** aggregate. The function has P5 arguments. P4 is a pointer to the ** FuncDef structure that specifies the function. Register P3 is the ** accumulator. ** @@ -90673,7 +90673,7 @@ case OP_AggStep1: { ** Synopsis: accum=r[P1] N=P2 ** ** P1 is the memory location that is the accumulator for an aggregate -** or window function. Execute the finalizer function +** or window function. Execute the finalizer function ** for an aggregate and store the result in P1. ** ** P2 is the number of arguments that the step function takes and @@ -90712,7 +90712,7 @@ case OP_AggFinal: { { rc = sqlite3VdbeMemFinalize(pMem, pOp->p4.pFunc); } - + if( rc ){ sqlite3VdbeError(p, "%s", sqlite3_value_text(pMem)); goto abort_due_to_error; @@ -90758,9 +90758,9 @@ case OP_Checkpoint: { } for(i=0, pMem = &aMem[pOp->p3]; i<3; i++, pMem++){ sqlite3VdbeMemSetInt64(pMem, (i64)aRes[i]); - } + } break; -}; +}; #endif #ifndef SQLITE_OMIT_PRAGMA @@ -90786,9 +90786,9 @@ case OP_JournalMode: { /* out2 */ pOut = out2Prerelease(p, pOp); eNew = pOp->p3; - assert( eNew==PAGER_JOURNALMODE_DELETE - || eNew==PAGER_JOURNALMODE_TRUNCATE - || eNew==PAGER_JOURNALMODE_PERSIST + assert( eNew==PAGER_JOURNALMODE_DELETE + || eNew==PAGER_JOURNALMODE_TRUNCATE + || eNew==PAGER_JOURNALMODE_PERSIST || eNew==PAGER_JOURNALMODE_OFF || eNew==PAGER_JOURNALMODE_MEMORY || eNew==PAGER_JOURNALMODE_WAL @@ -90807,7 +90807,7 @@ case OP_JournalMode: { /* out2 */ zFilename = sqlite3PagerFilename(pPager, 1); /* Do not allow a transition to journal_mode=WAL for a database - ** in temporary storage or if the VFS does not support shared memory + ** in temporary storage or if the VFS does not support shared memory */ if( eNew==PAGER_JOURNALMODE_WAL && (sqlite3Strlen30(zFilename)==0 /* Temp file */ @@ -90827,12 +90827,12 @@ case OP_JournalMode: { /* out2 */ ); goto abort_due_to_error; }else{ - + if( eOld==PAGER_JOURNALMODE_WAL ){ /* If leaving WAL mode, close the log file. If successful, the call - ** to PagerCloseWal() checkpoints and deletes the write-ahead-log - ** file. An EXCLUSIVE lock may still be held on the database file - ** after a successful return. + ** to PagerCloseWal() checkpoints and deletes the write-ahead-log + ** file. An EXCLUSIVE lock may still be held on the database file + ** after a successful return. */ rc = sqlite3PagerCloseWal(pPager, db); if( rc==SQLITE_OK ){ @@ -90843,7 +90843,7 @@ case OP_JournalMode: { /* out2 */ ** as an intermediate */ sqlite3PagerSetJournalMode(pPager, PAGER_JOURNALMODE_OFF); } - + /* Open a transaction on the database file. Regardless of the journal ** mode, this transaction always uses a rollback journal. */ @@ -90918,7 +90918,7 @@ case OP_IncrVacuum: { /* jump */ ** is executed using sqlite3_step() it will either automatically ** reprepare itself (if it was originally created using sqlite3_prepare_v2()) ** or it will fail with SQLITE_SCHEMA. -** +** ** If P1 is 0, then all SQL statements become expired. If P1 is non-zero, ** then only the currently executing statement is expired. ** @@ -90943,7 +90943,7 @@ case OP_Expire: { ** Synopsis: iDb=P1 root=P2 write=P3 ** ** Obtain a lock on a particular table. This instruction is only used when -** the shared-cache feature is enabled. +** the shared-cache feature is enabled. ** ** P1 is the index of the database in sqlite3.aDb[] of the database ** on which the lock is acquired. A readlock is obtained if P3==0 or @@ -90957,7 +90957,7 @@ case OP_Expire: { case OP_TableLock: { u8 isWriteLock = (u8)pOp->p3; if( isWriteLock || 0==(db->flags&SQLITE_ReadUncommit) ){ - int p1 = pOp->p1; + int p1 = pOp->p1; assert( p1>=0 && p1nDb ); assert( DbMaskTest(p->btreeMask, p1) ); assert( isWriteLock==0 || isWriteLock==1 ); @@ -90977,7 +90977,7 @@ case OP_TableLock: { #ifndef SQLITE_OMIT_VIRTUALTABLE /* Opcode: VBegin * * * P4 * ** -** P4 may be a pointer to an sqlite3_vtab structure. If so, call the +** P4 may be a pointer to an sqlite3_vtab structure. If so, call the ** xBegin method for that table. ** ** Also, whether or not P4 is set, check that this is not being called from @@ -90997,7 +90997,7 @@ case OP_VBegin: { #ifndef SQLITE_OMIT_VIRTUALTABLE /* Opcode: VCreate P1 P2 * * * ** -** P2 is a register that holds the name of a virtual table in database +** P2 is a register that holds the name of a virtual table in database ** P1. Call the xCreate method for that table. */ case OP_VCreate: { @@ -91233,7 +91233,7 @@ case OP_VNext: { /* jump */ /* Invoke the xNext() method of the module. There is no way for the ** underlying implementation to return an error if one occurs during - ** xNext(). Instead, if an error occurs, true is returned (indicating that + ** xNext(). Instead, if an error occurs, true is returned (indicating that ** data is available) and the error code returned when xColumn or ** some other method is next invoked on the save virtual table cursor. */ @@ -91261,7 +91261,7 @@ case OP_VRename: { sqlite3_vtab *pVtab; Mem *pName; int isLegacy; - + isLegacy = (db->flags & SQLITE_LegacyAlter); db->flags |= SQLITE_LegacyAlter; pVtab = pOp->p4.pVtab->pVtab; @@ -91291,23 +91291,23 @@ case OP_VRename: { ** ** P4 is a pointer to a virtual table object, an sqlite3_vtab structure. ** This opcode invokes the corresponding xUpdate method. P2 values -** are contiguous memory cells starting at P3 to pass to the xUpdate -** invocation. The value in register (P3+P2-1) corresponds to the +** are contiguous memory cells starting at P3 to pass to the xUpdate +** invocation. The value in register (P3+P2-1) corresponds to the ** p2th element of the argv array passed to xUpdate. ** ** The xUpdate method will do a DELETE or an INSERT or both. ** The argv[0] element (which corresponds to memory cell P3) -** is the rowid of a row to delete. If argv[0] is NULL then no -** deletion occurs. The argv[1] element is the rowid of the new -** row. This can be NULL to have the virtual table select the new -** rowid for itself. The subsequent elements in the array are +** is the rowid of a row to delete. If argv[0] is NULL then no +** deletion occurs. The argv[1] element is the rowid of the new +** row. This can be NULL to have the virtual table select the new +** rowid for itself. The subsequent elements in the array are ** the values of columns in the new row. ** ** If P2==1 then no insert is performed. argv[0] is the rowid of ** a row to delete. ** ** P1 is a boolean flag. If it is set to true and the xUpdate call -** is successful, then the value returned by sqlite3_last_insert_rowid() +** is successful, then the value returned by sqlite3_last_insert_rowid() ** is set to the value of the rowid for the row just inserted. ** ** P5 is the error actions (OE_Replace, OE_Fail, OE_Ignore, etc) to @@ -91322,7 +91322,7 @@ case OP_VUpdate: { Mem **apArg; Mem *pX; - assert( pOp->p2==1 || pOp->p5==OE_Fail || pOp->p5==OE_Rollback + assert( pOp->p2==1 || pOp->p5==OE_Fail || pOp->p5==OE_Rollback || pOp->p5==OE_Abort || pOp->p5==OE_Ignore || pOp->p5==OE_Replace ); assert( p->readOnly==0 ); @@ -91415,7 +91415,7 @@ case OP_MaxPgcnt: { /* out2 */ ** successors. The result of the function is stored in register P3. ** Register P3 must not be one of the function inputs. ** -** P1 is a 32-bit bitmask indicating whether or not each argument to the +** P1 is a 32-bit bitmask indicating whether or not each argument to the ** function was determined to be constant at compile time. If the first ** argument was constant then bit 0 of P1 is set. This is used to determine ** whether meta data associated with a user function argument using the @@ -91432,7 +91432,7 @@ case OP_MaxPgcnt: { /* out2 */ ** from register P2 and successors. The result of the function is stored ** in register P3. Register P3 must not be one of the function inputs. ** -** P1 is a 32-bit bitmask indicating whether or not each argument to the +** P1 is a 32-bit bitmask indicating whether or not each argument to the ** function was determined to be constant at compile time. If the first ** argument was constant then bit 0 of P1 is set. This is used to determine ** whether meta data associated with a user function argument using the @@ -91729,7 +91729,7 @@ abort_due_to_error: p->rc = rc; sqlite3SystemError(db, rc); testcase( sqlite3GlobalConfig.xLog!=0 ); - sqlite3_log(rc, "statement aborts at %d: [%s] %s", + sqlite3_log(rc, "statement aborts at %d: [%s] %s", (int)(pOp - aOp), p->zSql, p->zErrMsg); sqlite3VdbeHalt(p); if( rc==SQLITE_IOERR_NOMEM ) sqlite3OomFault(db); @@ -91754,8 +91754,8 @@ vdbe_return: #endif p->aCounter[SQLITE_STMTSTATUS_VM_STEP] += (int)nVmStep; sqlite3VdbeLeave(p); - assert( rc!=SQLITE_OK || nExtraDelete==0 - || sqlite3_strlike("DELETE%",p->zSql,0)!=0 + assert( rc!=SQLITE_OK || nExtraDelete==0 + || sqlite3_strlike("DELETE%",p->zSql,0)!=0 ); return rc; @@ -91839,7 +91839,7 @@ struct Incrblob { ** sqlite3DbFree(). ** ** If an error does occur, then the b-tree cursor is closed. All subsequent -** calls to sqlite3_blob_read(), blob_write() or blob_reopen() will +** calls to sqlite3_blob_read(), blob_write() or blob_reopen() will ** immediately return SQLITE_ABORT. */ static int blobSeekToRow(Incrblob *p, sqlite3_int64 iRow, char **pzErr){ @@ -91847,7 +91847,7 @@ static int blobSeekToRow(Incrblob *p, sqlite3_int64 iRow, char **pzErr){ char *zErr = 0; /* Error message */ Vdbe *v = (Vdbe *)p->pStmt; - /* Set the value of register r[1] in the SQL statement to integer iRow. + /* Set the value of register r[1] in the SQL statement to integer iRow. ** This is done directly as a performance optimization */ v->aMem[1].flags = MEM_Int; @@ -91991,7 +91991,7 @@ SQLITE_API int sqlite3_blob_open( } /* If the value is being opened for writing, check that the - ** column is not indexed, and that it is not part of a foreign key. + ** column is not indexed, and that it is not part of a foreign key. */ if( wrFlag ){ const char *zFault = 0; @@ -92000,7 +92000,7 @@ SQLITE_API int sqlite3_blob_open( if( db->flags&SQLITE_ForeignKeys ){ /* Check that the column is not part of an FK child key definition. It ** is not necessary to check if it is part of a parent key, as parent - ** key columns must be indexed. The check below will pick up this + ** key columns must be indexed. The check below will pick up this ** case. */ FKey *pFKey; for(pFKey=pTab->pFKey; pFKey; pFKey=pFKey->pNextFrom){ @@ -92034,8 +92034,8 @@ SQLITE_API int sqlite3_blob_open( pBlob->pStmt = (sqlite3_stmt *)sqlite3VdbeCreate(&sParse); assert( pBlob->pStmt || db->mallocFailed ); if( pBlob->pStmt ){ - - /* This VDBE program seeks a btree cursor to the identified + + /* This VDBE program seeks a btree cursor to the identified ** db/table/row entry. The reason for using a vdbe program instead ** of writing code to use the b-tree layer directly is that the ** vdbe program will take advantage of the various transaction, @@ -92043,11 +92043,11 @@ SQLITE_API int sqlite3_blob_open( ** ** After seeking the cursor, the vdbe executes an OP_ResultRow. ** Code external to the Vdbe then "borrows" the b-tree cursor and - ** uses it to implement the blob_read(), blob_write() and + ** uses it to implement the blob_read(), blob_write() and ** blob_bytes() functions. ** ** The sqlite3_blob_close() function finalizes the vdbe program, - ** which closes the b-tree cursor and (possibly) commits the + ** which closes the b-tree cursor and (possibly) commits the ** transaction. */ static const int iLn = VDBE_OFFSET_LINENO(2); @@ -92064,7 +92064,7 @@ SQLITE_API int sqlite3_blob_open( int iDb = sqlite3SchemaToIndex(db, pTab->pSchema); VdbeOp *aOp; - sqlite3VdbeAddOp4Int(v, OP_Transaction, iDb, wrFlag, + sqlite3VdbeAddOp4Int(v, OP_Transaction, iDb, wrFlag, pTab->pSchema->schema_cookie, pTab->pSchema->iGeneration); sqlite3VdbeChangeP5(v, 1); @@ -92072,7 +92072,7 @@ SQLITE_API int sqlite3_blob_open( aOp = sqlite3VdbeAddOpList(v, ArraySize(openBlob), openBlob, iLn); /* Make sure a mutex is held on the table to be accessed */ - sqlite3VdbeUsesBtree(v, iDb); + sqlite3VdbeUsesBtree(v, iDb); if( db->mallocFailed==0 ){ assert( aOp!=0 ); @@ -92088,17 +92088,17 @@ SQLITE_API int sqlite3_blob_open( if( db->mallocFailed==0 ){ #endif - /* Remove either the OP_OpenWrite or OpenRead. Set the P2 + /* Remove either the OP_OpenWrite or OpenRead. Set the P2 ** parameter of the other to pTab->tnum. */ if( wrFlag ) aOp[1].opcode = OP_OpenWrite; aOp[1].p2 = pTab->tnum; - aOp[1].p3 = iDb; + aOp[1].p3 = iDb; /* Configure the number of columns. Configure the cursor to ** think that the table has one more column than it really ** does. An OP_Column to retrieve this imaginary column will ** always return an SQL NULL. This is useful because it means - ** we can invoke OP_Column to fill in the vdbe cursors type + ** we can invoke OP_Column to fill in the vdbe cursors type ** and offset cache without causing any IO. */ aOp[1].p4type = P4_INT32; @@ -92111,7 +92111,7 @@ SQLITE_API int sqlite3_blob_open( sqlite3VdbeMakeReady(v, &sParse); } } - + pBlob->iCol = iCol; pBlob->db = db; sqlite3BtreeLeaveAll(db); @@ -92162,10 +92162,10 @@ SQLITE_API int sqlite3_blob_close(sqlite3_blob *pBlob){ ** Perform a read or write operation on a blob */ static int blobReadWrite( - sqlite3_blob *pBlob, - void *z, - int n, - int iOffset, + sqlite3_blob *pBlob, + void *z, + int n, + int iOffset, int (*xCall)(BtCursor*, u32, u32, void*) ){ int rc; @@ -92195,14 +92195,14 @@ static int blobReadWrite( #ifdef SQLITE_ENABLE_PREUPDATE_HOOK if( xCall==sqlite3BtreePutData && db->xPreUpdateCallback ){ - /* If a pre-update hook is registered and this is a write cursor, - ** invoke it here. - ** + /* If a pre-update hook is registered and this is a write cursor, + ** invoke it here. + ** ** TODO: The preupdate-hook is passed SQLITE_DELETE, even though this ** operation should really be an SQLITE_UPDATE. This is probably - ** incorrect, but is convenient because at this point the new.* values - ** are not easily obtainable. And for the sessions module, an - ** SQLITE_UPDATE where the PK columns do not change is handled in the + ** incorrect, but is convenient because at this point the new.* values + ** are not easily obtainable. And for the sessions module, an + ** SQLITE_UPDATE where the PK columns do not change is handled in the ** same way as an SQLITE_DELETE (the SQLITE_DELETE code is actually ** slightly more efficient). Since you cannot write to a PK column ** using the incremental-blob API, this works. For the sessions module @@ -92262,8 +92262,8 @@ SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *pBlob){ ** ** If an error occurs, or if the specified row does not exist or does not ** contain a blob or text value, then an error code is returned and the -** database handle error code and message set. If this happens, then all -** subsequent calls to sqlite3_blob_xxx() functions (except blob_close()) +** database handle error code and message set. If this happens, then all +** subsequent calls to sqlite3_blob_xxx() functions (except blob_close()) ** immediately return SQLITE_ABORT. */ SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *pBlob, sqlite3_int64 iRow){ @@ -92357,7 +92357,7 @@ SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *pBlob, sqlite3_int64 iRow){ ** is like Close() followed by Init() only ** much faster. ** -** The interfaces above must be called in a particular order. Write() can +** The interfaces above must be called in a particular order. Write() can ** only occur in between Init()/Reset() and Rewind(). Next(), Rowkey(), and ** Compare() can only occur in between Rewind() and Close()/Reset(). i.e. ** @@ -92365,16 +92365,16 @@ SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *pBlob, sqlite3_int64 iRow){ ** for each record: Write() ** Rewind() ** Rowkey()/Compare() -** Next() +** Next() ** Close() ** ** Algorithm: ** -** Records passed to the sorter via calls to Write() are initially held +** Records passed to the sorter via calls to Write() are initially held ** unsorted in main memory. Assuming the amount of memory used never exceeds ** a threshold, when Rewind() is called the set of records is sorted using ** an in-memory merge sort. In this case, no temporary files are required -** and subsequent calls to Rowkey(), Next() and Compare() read records +** and subsequent calls to Rowkey(), Next() and Compare() read records ** directly from main memory. ** ** If the amount of space used to store records in main memory exceeds the @@ -92384,10 +92384,10 @@ SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *pBlob, sqlite3_int64 iRow){ ** of PMAs may be created by merging existing PMAs together - for example ** merging two or more level-0 PMAs together creates a level-1 PMA. ** -** The threshold for the amount of main memory to use before flushing +** The threshold for the amount of main memory to use before flushing ** records to a PMA is roughly the same as the limit configured for the -** page-cache of the main database. Specifically, the threshold is set to -** the value returned by "PRAGMA main.page_size" multipled by +** page-cache of the main database. Specifically, the threshold is set to +** the value returned by "PRAGMA main.page_size" multipled by ** that returned by "PRAGMA main.cache_size", in bytes. ** ** If the sorter is running in single-threaded mode, then all PMAs generated @@ -92404,7 +92404,7 @@ SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *pBlob, sqlite3_int64 iRow){ ** than zero, and (b) worker threads have been enabled at runtime by calling ** "PRAGMA threads=N" with some value of N greater than 0. ** -** When Rewind() is called, any data remaining in memory is flushed to a +** When Rewind() is called, any data remaining in memory is flushed to a ** final PMA. So at this point the data is stored in some number of sorted ** PMAs within temporary files on disk. ** @@ -92416,16 +92416,16 @@ SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *pBlob, sqlite3_int64 iRow){ ** ** Or, if running in multi-threaded mode, then a background thread is ** launched to merge the existing PMAs. Once the background thread has -** merged T bytes of data into a single sorted PMA, the main thread +** merged T bytes of data into a single sorted PMA, the main thread ** begins reading keys from that PMA while the background thread proceeds ** with merging the next T bytes of data. And so on. ** -** Parameter T is set to half the value of the memory threshold used +** Parameter T is set to half the value of the memory threshold used ** by Write() above to determine when to create a new PMA. ** -** If there are more than SORTER_MAX_MERGE_COUNT PMAs in total when -** Rewind() is called, then a hierarchy of incremental-merges is used. -** First, T bytes of data from the first SORTER_MAX_MERGE_COUNT PMAs on +** If there are more than SORTER_MAX_MERGE_COUNT PMAs in total when +** Rewind() is called, then a hierarchy of incremental-merges is used. +** First, T bytes of data from the first SORTER_MAX_MERGE_COUNT PMAs on ** disk are merged together. Then T bytes of data from the second set, and ** so on, such that no operation ever merges more than SORTER_MAX_MERGE_COUNT ** PMAs at a time. This done is to improve locality. @@ -92440,7 +92440,7 @@ SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *pBlob, sqlite3_int64 iRow){ /* #include "sqliteInt.h" */ /* #include "vdbeInt.h" */ -/* +/* ** If SQLITE_DEBUG_SORTER_THREADS is defined, this module outputs various ** messages to stderr that may be helpful in understanding the performance ** characteristics of the sorter in multi-threaded mode. @@ -92469,7 +92469,7 @@ typedef struct SorterList SorterList; /* In-memory list of records */ typedef struct IncrMerger IncrMerger; /* Read & merge multiple PMAs */ /* -** A container for a temp file handle and the current amount of data +** A container for a temp file handle and the current amount of data ** stored in the file. */ struct SorterFile { @@ -92509,17 +92509,17 @@ struct SorterList { ** the MergeEngine.nTree variable. ** ** The final (N/2) elements of aTree[] contain the results of comparing -** pairs of PMA keys together. Element i contains the result of +** pairs of PMA keys together. Element i contains the result of ** comparing aReadr[2*i-N] and aReadr[2*i-N+1]. Whichever key is smaller, the -** aTree element is set to the index of it. +** aTree element is set to the index of it. ** ** For the purposes of this comparison, EOF is considered greater than any ** other key value. If the keys are equal (only possible with two EOF ** values), it doesn't matter which index is stored. ** -** The (N/4) elements of aTree[] that precede the final (N/2) described +** The (N/4) elements of aTree[] that precede the final (N/2) described ** above contains the index of the smallest of each block of 4 PmaReaders -** And so on. So that aTree[1] contains the index of the PmaReader that +** And so on. So that aTree[1] contains the index of the PmaReader that ** currently points to the smallest key value. aTree[0] is unused. ** ** Example: @@ -92535,7 +92535,7 @@ struct SorterList { ** ** aTree[] = { X, 5 0, 5 0, 3, 5, 6 } ** -** The current element is "Apple" (the value of the key indicated by +** The current element is "Apple" (the value of the key indicated by ** PmaReader 5). When the Next() operation is invoked, PmaReader 5 will ** be advanced to the next key in its segment. Say the next key is ** "Eggplant": @@ -92576,8 +92576,8 @@ struct MergeEngine { ** each thread requries its own UnpackedRecord object to unpack records in ** as part of comparison operations. ** -** Before a background thread is launched, variable bDone is set to 0. Then, -** right before it exits, the thread itself sets bDone to 1. This is used for +** Before a background thread is launched, variable bDone is set to 0. Then, +** right before it exits, the thread itself sets bDone to 1. This is used for ** two purposes: ** ** 1. When flushing the contents of memory to a level-0 PMA on disk, to @@ -92608,7 +92608,7 @@ struct SortSubtask { /* -** Main sorter structure. A single instance of this is allocated for each +** Main sorter structure. A single instance of this is allocated for each ** sorter cursor created by the VDBE. ** ** mxKeysize: @@ -92664,21 +92664,21 @@ struct PmaReader { }; /* -** Normally, a PmaReader object iterates through an existing PMA stored +** Normally, a PmaReader object iterates through an existing PMA stored ** within a temp file. However, if the PmaReader.pIncr variable points to ** an object of the following type, it may be used to iterate/merge through ** multiple PMAs simultaneously. ** -** There are two types of IncrMerger object - single (bUseThread==0) and -** multi-threaded (bUseThread==1). +** There are two types of IncrMerger object - single (bUseThread==0) and +** multi-threaded (bUseThread==1). ** -** A multi-threaded IncrMerger object uses two temporary files - aFile[0] -** and aFile[1]. Neither file is allowed to grow to more than mxSz bytes in -** size. When the IncrMerger is initialized, it reads enough data from -** pMerger to populate aFile[0]. It then sets variables within the -** corresponding PmaReader object to read from that file and kicks off -** a background thread to populate aFile[1] with the next mxSz bytes of -** sorted record data from pMerger. +** A multi-threaded IncrMerger object uses two temporary files - aFile[0] +** and aFile[1]. Neither file is allowed to grow to more than mxSz bytes in +** size. When the IncrMerger is initialized, it reads enough data from +** pMerger to populate aFile[0]. It then sets variables within the +** corresponding PmaReader object to read from that file and kicks off +** a background thread to populate aFile[1] with the next mxSz bytes of +** sorted record data from pMerger. ** ** When the PmaReader reaches the end of aFile[0], it blocks until the ** background thread has finished populating aFile[1]. It then exchanges @@ -92689,7 +92689,7 @@ struct PmaReader { ** ** A single-threaded IncrMerger does not open any temporary files of its ** own. Instead, it has exclusive access to mxSz bytes of space beginning -** at offset iStartOff of file pTask->file2. And instead of using a +** at offset iStartOff of file pTask->file2. And instead of using a ** background thread to prepare data for the PmaReader, with a single ** threaded IncrMerger the allocate part of pTask->file2 is "refilled" with ** keys from pMerger by the calling thread whenever the PmaReader runs out @@ -92801,7 +92801,7 @@ static int vdbePmaReadBlob( assert( p->aBuffer ); - /* If there is no more data to be read from the buffer, read the next + /* If there is no more data to be read from the buffer, read the next ** p->nBuffer bytes of data from the file into it. Or, if there are less ** than p->nBuffer bytes remaining in the PMA, read all remaining data. */ iBuf = p->iReadOff % p->nBuffer; @@ -92822,11 +92822,11 @@ static int vdbePmaReadBlob( assert( rc!=SQLITE_IOERR_SHORT_READ ); if( rc!=SQLITE_OK ) return rc; } - nAvail = p->nBuffer - iBuf; + nAvail = p->nBuffer - iBuf; if( nByte<=nAvail ){ /* The requested data is available in the in-memory buffer. In this - ** case there is no need to make a copy of the data, just return a + ** case there is no need to make a copy of the data, just return a ** pointer into the buffer to the caller. */ *ppOut = &p->aBuffer[iBuf]; p->iReadOff += nByte; @@ -92905,7 +92905,7 @@ static int vdbePmaReadVarint(PmaReader *p, u64 *pnOut){ /* ** Attempt to memory map file pFile. If successful, set *pp to point to the -** new mapping and return SQLITE_OK. If the mapping is not attempted +** new mapping and return SQLITE_OK. If the mapping is not attempted ** (because the file is too large or the VFS layer is configured not to use ** mmap), return SQLITE_OK and set *pp to NULL. ** @@ -92926,7 +92926,7 @@ static int vdbeSorterMapFile(SortSubtask *pTask, SorterFile *pFile, u8 **pp){ /* ** Attach PmaReader pReadr to file pFile (if it is not already attached to -** that file) and seek it to offset iOff within the file. Return SQLITE_OK +** that file) and seek it to offset iOff within the file. Return SQLITE_OK ** if successful, or an SQLite error code if an error occurs. */ static int vdbePmaReaderSeek( @@ -93016,11 +93016,11 @@ static int vdbePmaReaderNext(PmaReader *pReadr){ /* ** Initialize PmaReader pReadr to scan through the PMA stored in file pFile -** starting at offset iStart and ending at offset iEof-1. This function -** leaves the PmaReader pointing to the first key in the PMA (or EOF if the +** starting at offset iStart and ending at offset iEof-1. This function +** leaves the PmaReader pointing to the first key in the PMA (or EOF if the ** PMA is empty). ** -** If the pnByte parameter is NULL, then it is assumed that the file +** If the pnByte parameter is NULL, then it is assumed that the file ** contains a single PMA, and that that PMA omits the initial length varint. */ static int vdbePmaReaderInit( @@ -93053,7 +93053,7 @@ static int vdbePmaReaderInit( /* ** A version of vdbeSorterCompare() that assumes that it has already been -** determined that the first field of key1 is equal to the first field of +** determined that the first field of key1 is equal to the first field of ** key2. */ static int vdbeSorterCompareTail( @@ -93071,7 +93071,7 @@ static int vdbeSorterCompareTail( } /* -** Compare key1 (buffer pKey1, size nKey1 bytes) with key2 (buffer pKey2, +** Compare key1 (buffer pKey1, size nKey1 bytes) with key2 (buffer pKey2, ** size nKey2 bytes). Use (pTask->pKeyInfo) for the collation sequences ** used by the comparison. Return the result of the comparison. ** @@ -93217,7 +93217,7 @@ static int vdbeSorterCompareInt( ** is non-zero and the sorter is able to guarantee a stable sort, nField ** is used instead. This is used when sorting records for a CREATE INDEX ** statement. In this case, keys are always delivered to the sorter in -** order of the primary key, which happens to be make up the final part +** order of the primary key, which happens to be make up the final part ** of the records being sorted. So if the sort is stable, there is never ** any reason to compare PK fields and they can be ignored for a small ** performance boost. @@ -93314,7 +93314,7 @@ SQLITE_PRIVATE int sqlite3VdbeSorterInit( } } - if( pKeyInfo->nAllField<13 + if( pKeyInfo->nAllField<13 && (pKeyInfo->aColl[0]==0 || pKeyInfo->aColl[0]==db->pDfltColl) && (pKeyInfo->aSortFlags[0] & KEYINFO_ORDER_BIGNULL)==0 ){ @@ -93339,7 +93339,7 @@ static void vdbeSorterRecordFree(sqlite3 *db, SorterRecord *pRecord){ } /* -** Free all resources owned by the object indicated by argument pTask. All +** Free all resources owned by the object indicated by argument pTask. All ** fields of *pTask are zeroed before returning. */ static void vdbeSortSubtaskCleanup(sqlite3 *db, SortSubtask *pTask){ @@ -93438,7 +93438,7 @@ static int vdbeSorterCreateThread( } /* -** Join all outstanding threads launched by SorterWrite() to create +** Join all outstanding threads launched by SorterWrite() to create ** level-0 PMAs. */ static int vdbeSorterJoinAll(VdbeSorter *pSorter, int rcin){ @@ -93447,10 +93447,10 @@ static int vdbeSorterJoinAll(VdbeSorter *pSorter, int rcin){ /* This function is always called by the main user thread. ** - ** If this function is being called after SorterRewind() has been called, + ** If this function is being called after SorterRewind() has been called, ** it is possible that thread pSorter->aTask[pSorter->nTask-1].pThread ** is currently attempt to join one of the other threads. To avoid a race - ** condition where this thread also attempts to join the same object, join + ** condition where this thread also attempts to join the same object, join ** thread pSorter->aTask[pSorter->nTask-1].pThread first. */ for(i=pSorter->nTask-1; i>=0; i--){ SortSubtask *pTask = &pSorter->aTask[i]; @@ -93622,8 +93622,8 @@ static int vdbeSorterOpenTempFile( } /* -** If it has not already been allocated, allocate the UnpackedRecord -** structure at pTask->pUnpacked. Return SQLITE_OK if successful (or +** If it has not already been allocated, allocate the UnpackedRecord +** structure at pTask->pUnpacked. Return SQLITE_OK if successful (or ** if no allocation was required), or SQLITE_NOMEM otherwise. */ static int vdbeSortAllocUnpacked(SortSubtask *pTask){ @@ -93686,14 +93686,14 @@ static SorterCompare vdbeSorterGetCompare(VdbeSorter *p){ if( p->typeMask==SORTER_TYPE_INTEGER ){ return vdbeSorterCompareInt; }else if( p->typeMask==SORTER_TYPE_TEXT ){ - return vdbeSorterCompareText; + return vdbeSorterCompareText; } return vdbeSorterCompare; } /* -** Sort the linked list of records headed at pTask->pList. Return -** SQLITE_OK if successful, or an SQLite error code (i.e. SQLITE_NOMEM) if +** Sort the linked list of records headed at pTask->pList. Return +** SQLITE_OK if successful, or an SQLite error code (i.e. SQLITE_NOMEM) if ** an error occurs. */ static int vdbeSorterSort(SortSubtask *pTask, SorterList *pList){ @@ -93743,8 +93743,8 @@ static int vdbeSorterSort(SortSubtask *pTask, SorterList *pList){ pList->pList = p; sqlite3_free(aSlot); - assert( pTask->pUnpacked->errCode==SQLITE_OK - || pTask->pUnpacked->errCode==SQLITE_NOMEM + assert( pTask->pUnpacked->errCode==SQLITE_OK + || pTask->pUnpacked->errCode==SQLITE_NOMEM ); return pTask->pUnpacked->errCode; } @@ -93785,8 +93785,8 @@ static void vdbePmaWriteBlob(PmaWriter *p, u8 *pData, int nData){ memcpy(&p->aBuffer[p->iBufEnd], &pData[nData-nRem], nCopy); p->iBufEnd += nCopy; if( p->iBufEnd==p->nBuffer ){ - p->eFWErr = sqlite3OsWrite(p->pFd, - &p->aBuffer[p->iBufStart], p->iBufEnd - p->iBufStart, + p->eFWErr = sqlite3OsWrite(p->pFd, + &p->aBuffer[p->iBufStart], p->iBufEnd - p->iBufStart, p->iWriteOff + p->iBufStart ); p->iBufStart = p->iBufEnd = 0; @@ -93801,7 +93801,7 @@ static void vdbePmaWriteBlob(PmaWriter *p, u8 *pData, int nData){ /* ** Flush any buffered data to disk and clean up the PMA-writer object. ** The results of using the PMA-writer after this call are undefined. -** Return SQLITE_OK if flushing the buffered data succeeds or is not +** Return SQLITE_OK if flushing the buffered data succeeds or is not ** required. Otherwise, return an SQLite error code. ** ** Before returning, set *piEof to the offset immediately following the @@ -93810,8 +93810,8 @@ static void vdbePmaWriteBlob(PmaWriter *p, u8 *pData, int nData){ static int vdbePmaWriterFinish(PmaWriter *p, i64 *piEof){ int rc; if( p->eFWErr==0 && ALWAYS(p->aBuffer) && p->iBufEnd>p->iBufStart ){ - p->eFWErr = sqlite3OsWrite(p->pFd, - &p->aBuffer[p->iBufStart], p->iBufEnd - p->iBufStart, + p->eFWErr = sqlite3OsWrite(p->pFd, + &p->aBuffer[p->iBufStart], p->iBufEnd - p->iBufStart, p->iWriteOff + p->iBufStart ); } @@ -93823,11 +93823,11 @@ static int vdbePmaWriterFinish(PmaWriter *p, i64 *piEof){ } /* -** Write value iVal encoded as a varint to the PMA. Return +** Write value iVal encoded as a varint to the PMA. Return ** SQLITE_OK if successful, or an SQLite error code if an error occurs. */ static void vdbePmaWriteVarint(PmaWriter *p, u64 iVal){ - int nByte; + int nByte; u8 aByte[10]; nByte = sqlite3PutVarint(aByte, iVal); vdbePmaWriteBlob(p, aByte, nByte); @@ -93835,7 +93835,7 @@ static void vdbePmaWriteVarint(PmaWriter *p, u64 iVal){ /* ** Write the current contents of in-memory linked-list pList to a level-0 -** PMA in the temp file belonging to sub-task pTask. Return SQLITE_OK if +** PMA in the temp file belonging to sub-task pTask. Return SQLITE_OK if ** successful, or an SQLite error code otherwise. ** ** The format of a PMA is: @@ -93843,8 +93843,8 @@ static void vdbePmaWriteVarint(PmaWriter *p, u64 iVal){ ** * A varint. This varint contains the total number of bytes of content ** in the PMA (not including the varint itself). ** -** * One or more records packed end-to-end in order of ascending keys. -** Each record consists of a varint followed by a blob of data (the +** * One or more records packed end-to-end in order of ascending keys. +** Each record consists of a varint followed by a blob of data (the ** key). The varint is the number of bytes in the blob of data. */ static int vdbeSorterListToPMA(SortSubtask *pTask, SorterList *pList){ @@ -93853,7 +93853,7 @@ static int vdbeSorterListToPMA(SortSubtask *pTask, SorterList *pList){ PmaWriter writer; /* Object used to write to the file */ #ifdef SQLITE_DEBUG - /* Set iSz to the expected size of file pTask->file after writing the PMA. + /* Set iSz to the expected size of file pTask->file after writing the PMA. ** This is used by an assert() statement at the end of this function. */ i64 iSz = pList->szPMA + sqlite3VarintLen(pList->szPMA) + pTask->file.iEof; #endif @@ -94006,7 +94006,7 @@ static int vdbeSorterFlushPMA(VdbeSorter *pSorter){ SortSubtask *pTask = 0; /* Thread context used to create new PMA */ int nWorker = (pSorter->nTask-1); - /* Set the flag to indicate that at least one PMA has been written. + /* Set the flag to indicate that at least one PMA has been written. ** Or will be, anyhow. */ pSorter->bUsePMA = 1; @@ -94016,7 +94016,7 @@ static int vdbeSorterFlushPMA(VdbeSorter *pSorter){ ** the background thread from a sub-tasks previous turn is still running, ** skip it. If the first (pSorter->nTask-1) sub-tasks are all still busy, ** fall back to using the final sub-task. The first (pSorter->nTask-1) - ** sub-tasks are prefered as they use background threads - the final + ** sub-tasks are prefered as they use background threads - the final ** sub-task uses the main thread. */ for(i=0; iiPrev + i + 1) % nWorker; @@ -94097,14 +94097,14 @@ SQLITE_PRIVATE int sqlite3VdbeSorterWrite( ** If using the single large allocation mode (pSorter->aMemory!=0), then ** flush the contents of memory to a new PMA if (a) at least one value is ** already in memory and (b) the new value will not fit in memory. - ** + ** ** Or, if using separate allocations for each record, flush the contents ** of memory to a PMA if either of the following are true: ** - ** * The total memory allocated for the in-memory list is greater + ** * The total memory allocated for the in-memory list is greater ** than (page-size * cache-size), or ** - ** * The total memory allocated for the in-memory list is greater + ** * The total memory allocated for the in-memory list is greater ** than (page-size * 10) and sqlite3HeapNearlyFull() returns true. */ nReq = pVal->n + sizeof(SorterRecord); @@ -94243,11 +94243,11 @@ static int vdbeIncrBgPopulate(IncrMerger *pIncr){ ** aFile[0] such that the PmaReader should start rereading it from the ** beginning. ** -** For single-threaded objects, this is accomplished by literally reading -** keys from pIncr->pMerger and repopulating aFile[0]. +** For single-threaded objects, this is accomplished by literally reading +** keys from pIncr->pMerger and repopulating aFile[0]. ** -** For multi-threaded objects, all that is required is to wait until the -** background thread is finished (if it is not already) and then swap +** For multi-threaded objects, all that is required is to wait until the +** background thread is finished (if it is not already) and then swap ** aFile[0] and aFile[1] in place. If the contents of pMerger have not ** been exhausted, this function also launches a new background thread ** to populate the new aFile[1]. @@ -94387,7 +94387,7 @@ static void vdbeMergeEngineCompare( #define INCRINIT_TASK 1 #define INCRINIT_ROOT 2 -/* +/* ** Forward reference required as the vdbeIncrMergeInit() and ** vdbePmaReaderIncrInit() routines are called mutually recursively when ** building a merge tree. @@ -94396,7 +94396,7 @@ static int vdbePmaReaderIncrInit(PmaReader *pReadr, int eMode); /* ** Initialize the MergeEngine object passed as the second argument. Once this -** function returns, the first key of merged data may be read from the +** function returns, the first key of merged data may be read from the ** MergeEngine object in the usual fashion. ** ** If argument eMode is INCRINIT_ROOT, then it is assumed that any IncrMerge @@ -94406,8 +94406,8 @@ static int vdbePmaReaderIncrInit(PmaReader *pReadr, int eMode); ** required is to call vdbePmaReaderNext() on each PmaReader to point it at ** its first key. ** -** Otherwise, if eMode is any value other than INCRINIT_ROOT, then use -** vdbePmaReaderIncrMergeInit() to initialize each PmaReader that feeds data +** Otherwise, if eMode is any value other than INCRINIT_ROOT, then use +** vdbePmaReaderIncrMergeInit() to initialize each PmaReader that feeds data ** to pMerger. ** ** SQLITE_OK is returned if successful, or an SQLite error code otherwise. @@ -94462,19 +94462,19 @@ static int vdbeMergeEngineInit( ** object at (pReadr->pIncr). ** ** If argument eMode is set to INCRINIT_NORMAL, then all PmaReaders -** in the sub-tree headed by pReadr are also initialized. Data is then -** loaded into the buffers belonging to pReadr and it is set to point to +** in the sub-tree headed by pReadr are also initialized. Data is then +** loaded into the buffers belonging to pReadr and it is set to point to ** the first key in its range. ** ** If argument eMode is set to INCRINIT_TASK, then pReadr is guaranteed ** to be a multi-threaded PmaReader and this function is being called in a -** background thread. In this case all PmaReaders in the sub-tree are +** background thread. In this case all PmaReaders in the sub-tree are ** initialized as for INCRINIT_NORMAL and the aFile[1] buffer belonging to ** pReadr is populated. However, pReadr itself is not set up to point ** to its first key. A call to vdbePmaReaderNext() is still required to do -** that. +** that. ** -** The reason this function does not call vdbePmaReaderNext() immediately +** The reason this function does not call vdbePmaReaderNext() immediately ** in the INCRINIT_TASK case is that vdbePmaReaderNext() assumes that it has ** to block on thread (pTask->thread) before accessing aFile[1]. But, since ** this entire function is being run by thread (pTask->thread), that will @@ -94530,12 +94530,12 @@ static int vdbePmaReaderIncrMergeInit(PmaReader *pReadr, int eMode){ if( rc==SQLITE_OK && pIncr->bUseThread ){ /* Use the current thread to populate aFile[1], even though this ** PmaReader is multi-threaded. If this is an INCRINIT_TASK object, - ** then this function is already running in background thread - ** pIncr->pTask->thread. + ** then this function is already running in background thread + ** pIncr->pTask->thread. ** - ** If this is the INCRINIT_ROOT object, then it is running in the + ** If this is the INCRINIT_ROOT object, then it is running in the ** main VDBE thread. But that is Ok, as that thread cannot return - ** control to the VDBE or proceed with anything useful until the + ** control to the VDBE or proceed with anything useful until the ** first results are ready from this merger object anyway. */ assert( eMode==INCRINIT_ROOT || eMode==INCRINIT_TASK ); @@ -94552,7 +94552,7 @@ static int vdbePmaReaderIncrMergeInit(PmaReader *pReadr, int eMode){ #if SQLITE_MAX_WORKER_THREADS>0 /* -** The main routine for vdbePmaReaderIncrMergeInit() operations run in +** The main routine for vdbePmaReaderIncrMergeInit() operations run in ** background threads. */ static void *vdbePmaReaderBgIncrInit(void *pCtx){ @@ -94570,8 +94570,8 @@ static void *vdbePmaReaderBgIncrInit(void *pCtx){ ** (if pReadr->pIncr==0), then this function is a no-op. Otherwise, it invokes ** the vdbePmaReaderIncrMergeInit() function with the parameters passed to ** this routine to initialize the incremental merge. -** -** If the IncrMerger object is multi-threaded (IncrMerger.bUseThread==1), +** +** If the IncrMerger object is multi-threaded (IncrMerger.bUseThread==1), ** then a background thread is launched to call vdbePmaReaderIncrMergeInit(). ** Or, if the IncrMerger is single threaded, the same function is called ** using the current thread. @@ -94601,7 +94601,7 @@ static int vdbePmaReaderIncrInit(PmaReader *pReadr, int eMode){ ** to NULL and return an SQLite error code. ** ** When this function is called, *piOffset is set to the offset of the -** first PMA to read from pTask->file. Assuming no error occurs, it is +** first PMA to read from pTask->file. Assuming no error occurs, it is ** set to the offset immediately following the last byte of the last ** PMA before returning. If an error does occur, then the final value of ** *piOffset is undefined. @@ -94711,12 +94711,12 @@ static int vdbeSorterAddToTree( /* ** This function is called as part of a SorterRewind() operation on a sorter ** that has already written two or more level-0 PMAs to one or more temp -** files. It builds a tree of MergeEngine/IncrMerger/PmaReader objects that +** files. It builds a tree of MergeEngine/IncrMerger/PmaReader objects that ** can be used to incrementally merge all PMAs on disk. ** ** If successful, SQLITE_OK is returned and *ppOut set to point to the ** MergeEngine object at the root of the tree before returning. Or, if an -** error occurs, an SQLite error code is returned and the final value +** error occurs, an SQLite error code is returned and the final value ** of *ppOut is undefined. */ static int vdbeSorterMergeTreeBuild( @@ -94728,8 +94728,8 @@ static int vdbeSorterMergeTreeBuild( int iTask; #if SQLITE_MAX_WORKER_THREADS>0 - /* If the sorter uses more than one task, then create the top-level - ** MergeEngine here. This MergeEngine will read data from exactly + /* If the sorter uses more than one task, then create the top-level + ** MergeEngine here. This MergeEngine will read data from exactly ** one PmaReader per sub-task. */ assert( pSorter->bUseThreads || pSorter->nTask==1 ); if( pSorter->nTask>1 ){ @@ -94838,7 +94838,7 @@ static int vdbeSorterSetupMerge(VdbeSorter *pSorter){ } for(iTask=0; rc==SQLITE_OK && iTasknTask; iTask++){ /* Check that: - ** + ** ** a) The incremental merge object is configured to use the ** right task, and ** b) If it is using task (nTask-1), it is configured to run @@ -94901,7 +94901,7 @@ SQLITE_PRIVATE int sqlite3VdbeSorterRewind(const VdbeCursor *pCsr, int *pbEof){ return rc; } - /* Write the current in-memory list to a PMA. When the VdbeSorterWrite() + /* Write the current in-memory list to a PMA. When the VdbeSorterWrite() ** function flushes the contents of memory to disk, it immediately always ** creates a new list consisting of a single key immediately afterwards. ** So the list is never empty at this point. */ @@ -94913,7 +94913,7 @@ SQLITE_PRIVATE int sqlite3VdbeSorterRewind(const VdbeCursor *pCsr, int *pbEof){ vdbeSorterRewindDebug("rewind"); - /* Assuming no errors have occurred, set up a merger structure to + /* Assuming no errors have occurred, set up a merger structure to ** incrementally read and merge all remaining PMAs. */ assert( pSorter->pReader==0 ); if( rc==SQLITE_OK ){ @@ -94967,7 +94967,7 @@ SQLITE_PRIVATE int sqlite3VdbeSorterNext(sqlite3 *db, const VdbeCursor *pCsr){ } /* -** Return a pointer to a buffer owned by the sorter that contains the +** Return a pointer to a buffer owned by the sorter that contains the ** current key. */ static void *vdbeSorterRowkey( @@ -95172,7 +95172,7 @@ static int memjrnlRead( assert( p->readpoint.iOffset==0 || p->readpoint.pChunk!=0 ); if( p->readpoint.iOffset!=iOfst || iOfst==0 ){ sqlite3_int64 iOff = 0; - for(pChunk=p->pFirst; + for(pChunk=p->pFirst; ALWAYS(pChunk) && (iOff+p->nChunkSize)<=iOfst; pChunk=pChunk->pNext ){ @@ -95207,7 +95207,7 @@ static void memjrnlFreeChunks(MemJournal *p){ for(pIter=p->pFirst; pIter; pIter=pNext){ pNext = pIter->pNext; sqlite3_free(pIter); - } + } p->pFirst = 0; } @@ -95279,7 +95279,7 @@ static int memjrnlWrite( ** access writes are not required. The only exception to this is when ** the in-memory journal is being used by a connection using the ** atomic-write optimization. In this case the first 28 bytes of the - ** journal file may be written as part of committing the transaction. */ + ** journal file may be written as part of committing the transaction. */ assert( iOfst==p->endpoint.iOffset || iOfst==0 ); #if defined(SQLITE_ENABLE_ATOMIC_WRITE) \ || defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) @@ -95330,7 +95330,7 @@ static int memjrnlWrite( ** ** If the journal file is already on disk, truncate it there. Or, if it ** is still in main memory but is being truncated to zero bytes in size, -** ignore +** ignore */ static int memjrnlTruncate(sqlite3_file *pJfd, sqlite_int64 size){ MemJournal *p = (MemJournal *)pJfd; @@ -95357,8 +95357,8 @@ static int memjrnlClose(sqlite3_file *pJfd){ /* ** Sync the file. ** -** If the real file has been created, call its xSync method. Otherwise, -** syncing an in-memory journal is a no-op. +** If the real file has been created, call its xSync method. Otherwise, +** syncing an in-memory journal is a no-op. */ static int memjrnlSync(sqlite3_file *pJfd, int flags){ UNUSED_PARAMETER2(pJfd, flags); @@ -95399,11 +95399,11 @@ static const struct sqlite3_io_methods MemJournalMethods = { 0 /* xUnfetch */ }; -/* -** Open a journal file. +/* +** Open a journal file. ** -** The behaviour of the journal file depends on the value of parameter -** nSpill. If nSpill is 0, then the journal file is always create and +** The behaviour of the journal file depends on the value of parameter +** nSpill. If nSpill is 0, then the journal file is always create and ** accessed using the underlying VFS. If nSpill is less than zero, then ** all content is always stored in main-memory. Finally, if nSpill is a ** positive value, then the journal file is initially created in-memory @@ -95454,9 +95454,9 @@ SQLITE_PRIVATE void sqlite3MemJournalOpen(sqlite3_file *pJfd){ #if defined(SQLITE_ENABLE_ATOMIC_WRITE) \ || defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) /* -** If the argument p points to a MemJournal structure that is not an +** If the argument p points to a MemJournal structure that is not an ** in-memory-only journal file (i.e. is one that was opened with a +ve -** nSpill parameter or as SQLITE_OPEN_MAIN_JOURNAL), and the underlying +** nSpill parameter or as SQLITE_OPEN_MAIN_JOURNAL), and the underlying ** file has not yet been created, create it now. */ SQLITE_PRIVATE int sqlite3JournalCreate(sqlite3_file *pJfd){ @@ -95490,7 +95490,7 @@ SQLITE_PRIVATE int sqlite3JournalIsInMemory(sqlite3_file *p){ return p->pMethods==&MemJournalMethods; } -/* +/* ** Return the number of bytes required to store a JournalFile that uses vfs ** pVfs to create the underlying on-disk files. */ @@ -95649,7 +95649,7 @@ SQLITE_PRIVATE int sqlite3WalkSelectExpr(Walker *pWalker, Select *p){ ** Walk the parse trees associated with all subqueries in the ** FROM clause of SELECT statement p. Do not invoke the select ** callback on p, but do invoke it on each FROM clause subquery -** and on any subqueries further down in the tree. Return +** and on any subqueries further down in the tree. Return ** WRC_Abort or WRC_Continue; */ SQLITE_PRIVATE int sqlite3WalkSelectFrom(Walker *pWalker, Select *p){ @@ -95670,12 +95670,12 @@ SQLITE_PRIVATE int sqlite3WalkSelectFrom(Walker *pWalker, Select *p){ } } return WRC_Continue; -} +} /* ** Call sqlite3WalkExpr() for every expression in Select statement p. ** Invoke sqlite3WalkSelect() for subqueries in the FROM clause and -** on the compound select chain, p->pPrior. +** on the compound select chain, p->pPrior. ** ** If it is not NULL, the xSelectCallback() callback is invoked before ** the walk of the expressions and FROM clause. The xSelectCallback2() @@ -95794,7 +95794,7 @@ static void resolveAlias( pDup = sqlite3ExprAddCollateString(pParse, pDup, pExpr->u.zToken); } - /* Before calling sqlite3ExprDelete(), set the EP_Static flag. This + /* Before calling sqlite3ExprDelete(), set the EP_Static flag. This ** prevents ExprDelete() from deleting the Expr structure itself, ** allowing it to be repopulated by the memcpy() on the following line. ** The pExpr->u.zToken might point into memory that will be freed by the @@ -95887,7 +95887,7 @@ static int areDoubleQuotedStringsEnabled(sqlite3 *db, NameContext *pTopNC){ /* ** Given the name of a column of the form X.Y.Z or Y.Z or just Z, look up -** that name in the set of source tables in pSrcList and make the pExpr +** that name in the set of source tables in pSrcList and make the pExpr ** expression node refer back to that source column. The following changes ** are made to pExpr: ** @@ -96009,7 +96009,7 @@ static int lookupName( for(j=0, pCol=pTab->aCol; jnCol; j++, pCol++){ if( sqlite3StrICmp(pCol->zName, zCol)==0 ){ /* If there has been exactly one prior match and this match - ** is for the right-hand table of a NATURAL JOIN or is in a + ** is for the right-hand table of a NATURAL JOIN or is in a ** USING clause, then skip this match. */ if( cnt==1 ){ @@ -96037,7 +96037,7 @@ static int lookupName( } /* if( pSrcList ) */ #if !defined(SQLITE_OMIT_TRIGGER) || !defined(SQLITE_OMIT_UPSERT) - /* If we have not already resolved the name, then maybe + /* If we have not already resolved the name, then maybe ** it is a new.* or old.* trigger argument reference. Or ** maybe it is an excluded.* from an upsert. */ @@ -96066,7 +96066,7 @@ static int lookupName( } #endif /* SQLITE_OMIT_UPSERT */ - if( pTab ){ + if( pTab ){ int iCol; pSchema = pTab->pSchema; cntTab++; @@ -96189,7 +96189,7 @@ static int lookupName( } goto lookupname_end; } - } + } } /* Advance to the next name context. The loop will exit when either @@ -96420,7 +96420,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ ** Or a database, table and column: ID.ID.ID ** ** The TK_ID and TK_OUT cases are combined so that there will only - ** be one call to lookupName(). Then the compiler will in-line + ** be one call to lookupName(). Then the compiler will in-line ** lookupName() for a size reduction and performance increase. */ case TK_ID: @@ -96506,7 +96506,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ ** to likelihood(X,0.9375). */ /* TUNING: unlikely() probability is 0.0625. likely() is 0.9375 */ pExpr->iTable = pDef->zName[0]=='u' ? 8388608 : 125829120; - } + } } #ifndef SQLITE_OMIT_AUTHORIZATION { @@ -96562,11 +96562,11 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ || (pDef->xValue && pDef->xInverse && pDef->xSFunc && pDef->xFinalize) ); if( pDef && pDef->xValue==0 && pWin ){ - sqlite3ErrorMsg(pParse, + sqlite3ErrorMsg(pParse, "%.*s() may not be used as a window function", nId, zId ); pNC->nErr++; - }else if( + }else if( (is_agg && (pNC->ncFlags & NC_AllowAgg)==0) || (is_agg && (pDef->funcFlags&SQLITE_FUNC_WINDOW) && !pWin) || (is_agg && pWin && (pNC->ncFlags & NC_AllowWin)==0) @@ -96602,8 +96602,8 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ } #ifndef SQLITE_OMIT_WINDOWFUNC else if( is_agg==0 && ExprHasProperty(pExpr, EP_WinFunc) ){ - sqlite3ErrorMsg(pParse, - "FILTER may not be used with non-aggregate %.*s()", + sqlite3ErrorMsg(pParse, + "FILTER may not be used with non-aggregate %.*s()", nId, zId ); pNC->nErr++; @@ -96665,7 +96665,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ pNC->ncFlags |= savedAllowFlags; } /* FIX ME: Compute pExpr->affinity based on the expected return - ** type of the function + ** type of the function */ return WRC_Prune; } @@ -96740,7 +96740,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ testcase( pExpr->op==TK_BETWEEN ); sqlite3ErrorMsg(pParse, "row value misused"); } - break; + break; } } return (pParse->nErr || pParse->db->mallocFailed) ? WRC_Abort : WRC_Continue; @@ -96850,7 +96850,7 @@ static void resolveOutOfRangeError( int i, /* The index (1-based) of the term out of range */ int mx /* Largest permissible value of i */ ){ - sqlite3ErrorMsg(pParse, + sqlite3ErrorMsg(pParse, "%r %s BY term out of range - should be " "between 1 and %d", i, zType, mx); } @@ -96914,7 +96914,7 @@ static int resolveCompoundOrderBy( iCol = resolveAsName(pParse, pEList, pE); if( iCol==0 ){ /* Now test if expression pE matches one of the values returned - ** by pSelect. In the usual case this is done by duplicating the + ** by pSelect. In the usual case this is done by duplicating the ** expression, resolving any symbols in it, and then comparing ** it against each expression returned by the SELECT statement. ** Once the comparisons are finished, the duplicate expression @@ -97138,7 +97138,7 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ ExprList *pGroupBy; /* The GROUP BY clause */ Select *pLeftmost; /* Left-most of SELECT of a compound */ sqlite3 *db; /* Database connection */ - + assert( p!=0 ); if( p->selFlags & SF_Resolved ){ @@ -97192,7 +97192,7 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ pSub->pOrderBy = p->pOrderBy; p->pOrderBy = 0; } - + /* Recursively resolve names in all subqueries */ for(i=0; ipSrc->nSrc; i++){ @@ -97219,19 +97219,19 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ pItem->fg.isCorrelated = (nRef!=0); } } - + /* Set up the local name-context to pass to sqlite3ResolveExprNames() to ** resolve the result-set expression list. */ sNC.ncFlags = NC_AllowAgg|NC_AllowWin; sNC.pSrcList = p->pSrc; sNC.pNext = pOuterNC; - + /* Resolve names in the result set. */ if( sqlite3ResolveExprListNames(&sNC, p->pEList) ) return WRC_Abort; sNC.ncFlags &= ~NC_AllowWin; - - /* If there are no aggregate functions in the result-set, and no GROUP BY + + /* If there are no aggregate functions in the result-set, and no GROUP BY ** expression, do not allow aggregates in any of the other expressions. */ assert( (p->selFlags & SF_Aggregate)==0 ); @@ -97242,14 +97242,14 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ }else{ sNC.ncFlags &= ~NC_AllowAgg; } - + /* If a HAVING clause is present, then there must be a GROUP BY clause. */ if( p->pHaving && !pGroupBy ){ sqlite3ErrorMsg(pParse, "a GROUP BY clause is required before HAVING"); return WRC_Abort; } - + /* Add the output column list to the name-context before parsing the ** other expressions in the SELECT statement. This is so that ** expressions in the WHERE clause (etc.) can refer to expressions by @@ -97268,19 +97268,19 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ for(i=0; ipSrc->nSrc; i++){ struct SrcList_item *pItem = &p->pSrc->a[i]; if( pItem->fg.isTabFunc - && sqlite3ResolveExprListNames(&sNC, pItem->u1.pFuncArg) + && sqlite3ResolveExprListNames(&sNC, pItem->u1.pFuncArg) ){ return WRC_Abort; } } /* The ORDER BY and GROUP BY clauses may not refer to terms in - ** outer queries + ** outer queries */ sNC.pNext = 0; sNC.ncFlags |= NC_AllowAgg|NC_AllowWin; - /* If this is a converted compound query, move the ORDER BY clause from + /* If this is a converted compound query, move the ORDER BY clause from ** the sub-query back to the parent query. At this point each term ** within the ORDER BY clause has been transformed to an integer value. ** These integers will be replaced by copies of the corresponding result @@ -97310,13 +97310,13 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ return WRC_Abort; } sNC.ncFlags &= ~NC_AllowWin; - - /* Resolve the GROUP BY clause. At the same time, make sure + + /* Resolve the GROUP BY clause. At the same time, make sure ** the GROUP BY clause does not contain aggregate functions. */ if( pGroupBy ){ struct ExprList_item *pItem; - + if( resolveOrderGroupBy(&sNC, p, pGroupBy, "GROUP") || db->mallocFailed ){ return WRC_Abort; } @@ -97371,7 +97371,7 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ ** checking on function usage and set a flag if any aggregate functions ** are seen. ** -** To resolve table columns references we look for nodes (or subtrees) of the +** To resolve table columns references we look for nodes (or subtrees) of the ** form X.Y.Z or Y.Z or just Z where ** ** X: The name of a database. Ex: "main" or "temp" or @@ -97403,7 +97403,7 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ ** ** SELECT a+b AS x, c+d AS y FROM t1 ORDER BY a+b; ** -** Function calls are checked to make sure that the function is +** Function calls are checked to make sure that the function is ** defined and that the correct number of arguments are specified. ** If the function is an aggregate function, then the NC_HasAgg flag is ** set and the opcode is changed from TK_FUNCTION to TK_AGG_FUNCTION. @@ -97413,7 +97413,7 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ ** An error message is left in pParse if anything is amiss. The number ** if errors is returned. */ -SQLITE_PRIVATE int sqlite3ResolveExprNames( +SQLITE_PRIVATE int sqlite3ResolveExprNames( NameContext *pNC, /* Namespace to resolve expressions in. */ Expr *pExpr /* The expression to be analyzed. */ ){ @@ -97452,7 +97452,7 @@ SQLITE_PRIVATE int sqlite3ResolveExprNames( ** just like sqlite3ResolveExprNames() except that it works for an expression ** list rather than a single expression. */ -SQLITE_PRIVATE int sqlite3ResolveExprListNames( +SQLITE_PRIVATE int sqlite3ResolveExprListNames( NameContext *pNC, /* Namespace to resolve expressions in. */ ExprList *pList /* The expression list to be analyzed. */ ){ @@ -97571,7 +97571,7 @@ SQLITE_PRIVATE char sqlite3TableColumnAffinity(Table *pTab, int iCol){ ** Return the 'affinity' of the expression pExpr if any. ** ** If pExpr is a column, a reference to a column via an 'AS' alias, -** or a sub-select with a column as the return value, then the +** or a sub-select with a column as the return value, then the ** affinity of that column is returned. Otherwise, 0x00 is returned, ** indicating no affinity for the expression. ** @@ -97652,7 +97652,7 @@ SQLITE_PRIVATE Expr *sqlite3ExprSkipCollate(Expr *pExpr){ while( pExpr && ExprHasProperty(pExpr, EP_Skip) ){ assert( pExpr->op==TK_COLLATE ); pExpr = pExpr->pLeft; - } + } return pExpr; } @@ -97672,7 +97672,7 @@ SQLITE_PRIVATE Expr *sqlite3ExprSkipCollateAndLikely(Expr *pExpr){ assert( pExpr->op==TK_COLLATE ); pExpr = pExpr->pLeft; } - } + } return pExpr; } @@ -97742,7 +97742,7 @@ SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ break; } } - if( sqlite3CheckCollSeq(pParse, pColl) ){ + if( sqlite3CheckCollSeq(pParse, pColl) ){ pColl = 0; } return pColl; @@ -97858,8 +97858,8 @@ static u8 binaryCompareP5(Expr *pExpr1, Expr *pExpr2, int jumpIfNull){ ** it is not considered. */ SQLITE_PRIVATE CollSeq *sqlite3BinaryCompareCollSeq( - Parse *pParse, - Expr *pLeft, + Parse *pParse, + Expr *pLeft, Expr *pRight ){ CollSeq *pColl; @@ -97915,7 +97915,7 @@ SQLITE_PRIVATE int sqlite3ExprIsVector(Expr *pExpr){ } /* -** If the expression passed as the only argument is of type TK_VECTOR +** If the expression passed as the only argument is of type TK_VECTOR ** return the number of expressions in the vector. Or, if the expression ** is a sub-select, return the number of columns in the sub-select. For ** any other type of expression, return 1. @@ -97965,7 +97965,7 @@ SQLITE_PRIVATE Expr *sqlite3VectorFieldSubexpr(Expr *pVector, int i){ ** sqlite3ExprCode() will generate all necessary code to compute ** the iField-th column of the vector expression pVector. ** -** It is ok for pVector to be a scalar (as long as iField==0). +** It is ok for pVector to be a scalar (as long as iField==0). ** In that case, this routine works like sqlite3ExprDup(). ** ** The caller owns the returned Expr object and is responsible for @@ -98021,7 +98021,7 @@ SQLITE_PRIVATE Expr *sqlite3ExprForVectorField( /* ** If expression pExpr is of type TK_SELECT, generate code to evaluate -** it. Return the register in which the result is stored (or, if the +** it. Return the register in which the result is stored (or, if the ** sub-select returns more than one column, the first in an array ** of registers in which the result is stored). ** @@ -98043,10 +98043,10 @@ static int exprCodeSubselect(Parse *pParse, Expr *pExpr){ ** the register number of a register that contains the value of ** element iField of the vector. ** -** If pVector is a TK_SELECT expression, then code for it must have +** If pVector is a TK_SELECT expression, then code for it must have ** already been generated using the exprCodeSubselect() routine. In this ** case parameter regSelect should be the first in an array of registers -** containing the results of the sub-select. +** containing the results of the sub-select. ** ** If pVector is of type TK_VECTOR, then code for the requested field ** is generated. In this case (*pRegFree) may be set to the number of @@ -98109,10 +98109,10 @@ static void codeVectorCompare( sqlite3ErrorMsg(pParse, "row value misused"); return; } - assert( pExpr->op==TK_EQ || pExpr->op==TK_NE - || pExpr->op==TK_IS || pExpr->op==TK_ISNOT - || pExpr->op==TK_LT || pExpr->op==TK_GT - || pExpr->op==TK_LE || pExpr->op==TK_GE + assert( pExpr->op==TK_EQ || pExpr->op==TK_NE + || pExpr->op==TK_IS || pExpr->op==TK_ISNOT + || pExpr->op==TK_LT || pExpr->op==TK_GT + || pExpr->op==TK_LE || pExpr->op==TK_GE ); assert( pExpr->op==op || (pExpr->op==TK_IS && op==TK_EQ) || (pExpr->op==TK_ISNOT && op==TK_NE) ); @@ -98128,7 +98128,7 @@ static void codeVectorCompare( for(i=0; 1 /*Loop exits by "break"*/; i++){ int regFree1 = 0, regFree2 = 0; - Expr *pL, *pR; + Expr *pL, *pR; int r1, r2; assert( i>=0 && idb->aLimit[SQLITE_LIMIT_EXPR_DEPTH]; if( nHeight>mxHeight ){ - sqlite3ErrorMsg(pParse, + sqlite3ErrorMsg(pParse, "Expression tree is too large (maximum depth %d)", mxHeight ); rc = SQLITE_ERROR; @@ -98219,10 +98219,10 @@ static void heightOfSelect(Select *pSelect, int *pnHeight){ } /* -** Set the Expr.nHeight variable in the structure passed as an -** argument. An expression with no children, Expr.pList or +** Set the Expr.nHeight variable in the structure passed as an +** argument. An expression with no children, Expr.pList or ** Expr.pSelect member has a height of 1. Any other expression -** has a height equal to the maximum height of any other +** has a height equal to the maximum height of any other ** referenced Expr plus one. ** ** Also propagate EP_Propagate flags up from Expr.x.pList to Expr.flags, @@ -98247,7 +98247,7 @@ static void exprSetHeight(Expr *p){ ** leave an error in pParse. ** ** Also propagate all EP_Propagate flags from the Expr.x.pList into -** Expr.flags. +** Expr.flags. */ SQLITE_PRIVATE void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p){ if( pParse->nErr ) return; @@ -98267,7 +98267,7 @@ SQLITE_PRIVATE int sqlite3SelectExprHeight(Select *p){ #else /* ABOVE: Height enforcement enabled. BELOW: Height enforcement off */ /* ** Propagate all EP_Propagate flags from the Expr.x.pList into -** Expr.flags. +** Expr.flags. */ SQLITE_PRIVATE void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p){ if( p && p->x.pList && !ExprHasProperty(p, EP_xIsSelect) ){ @@ -98336,7 +98336,7 @@ SQLITE_PRIVATE Expr *sqlite3ExprAlloc( } #if SQLITE_MAX_EXPR_DEPTH>0 pNew->nHeight = 1; -#endif +#endif } return pNew; } @@ -98483,7 +98483,7 @@ SQLITE_PRIVATE Expr *sqlite3ExprFunction( /* ** Assign a variable number to an expression that encodes a wildcard -** in the original SQL statement. +** in the original SQL statement. ** ** Wildcards consisting of a single "?" are assigned the next sequential ** variable number. @@ -98621,7 +98621,7 @@ SQLITE_PRIVATE void sqlite3ExprUnmapAndDelete(Parse *pParse, Expr *p){ } /* -** Return the number of bytes allocated for the expression structure +** Return the number of bytes allocated for the expression structure ** passed as the first argument. This is always one of EXPR_FULLSIZE, ** EXPR_REDUCEDSIZE or EXPR_TOKENONLYSIZE. */ @@ -98636,14 +98636,14 @@ static int exprStructSize(Expr *p){ ** to store a copy of an expression or expression tree. They differ in ** how much of the tree is measured. ** -** dupedExprStructSize() Size of only the Expr structure +** dupedExprStructSize() Size of only the Expr structure ** dupedExprNodeSize() Size of Expr + space for token ** dupedExprSize() Expr + token + subtree components ** *************************************************************************** ** -** The dupedExprStructSize() function returns two values OR-ed together: -** (1) the space required for a copy of the Expr structure only and +** The dupedExprStructSize() function returns two values OR-ed together: +** (1) the space required for a copy of the Expr structure only and ** (2) the EP_xxx flags that indicate what the structure size should be. ** The return values is always one of: ** @@ -98670,7 +98670,7 @@ static int dupedExprStructSize(Expr *p, int flags){ assert( flags==EXPRDUP_REDUCE || flags==0 ); /* Only one flag value allowed */ assert( EXPR_FULLSIZE<=0xfff ); assert( (0xfff & (EP_Reduced|EP_TokenOnly))==0 ); - if( 0==flags || p->op==TK_SELECT_COLUMN + if( 0==flags || p->op==TK_SELECT_COLUMN #ifndef SQLITE_OMIT_WINDOWFUNC || ExprHasProperty(p, EP_WinFunc) #endif @@ -98678,7 +98678,7 @@ static int dupedExprStructSize(Expr *p, int flags){ nSize = EXPR_FULLSIZE; }else{ assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) ); - assert( !ExprHasProperty(p, EP_FromJoin) ); + assert( !ExprHasProperty(p, EP_FromJoin) ); assert( !ExprHasProperty(p, EP_MemToken) ); assert( !ExprHasProperty(p, EP_NoReduce) ); if( p->pLeft || p->x.pList ){ @@ -98692,7 +98692,7 @@ static int dupedExprStructSize(Expr *p, int flags){ } /* -** This function returns the space in bytes required to store the copy +** This function returns the space in bytes required to store the copy ** of the Expr structure and a copy of the Expr.u.zToken string (if that ** string is defined.) */ @@ -98705,16 +98705,16 @@ static int dupedExprNodeSize(Expr *p, int flags){ } /* -** Return the number of bytes required to create a duplicate of the +** Return the number of bytes required to create a duplicate of the ** expression passed as the first argument. The second argument is a ** mask containing EXPRDUP_XXX flags. ** ** The value returned includes space to create a copy of the Expr struct ** itself and the buffer referred to by Expr.u.zToken, if any. ** -** If the EXPRDUP_REDUCE flag is set, then the return value includes -** space to duplicate all Expr nodes in the tree formed by Expr.pLeft -** and Expr.pRight variables (but not for any structures pointed to or +** If the EXPRDUP_REDUCE flag is set, then the return value includes +** space to duplicate all Expr nodes in the tree formed by Expr.pLeft +** and Expr.pRight variables (but not for any structures pointed to or ** descended from the Expr.x.pList or Expr.x.pSelect variables). */ static int dupedExprSize(Expr *p, int flags){ @@ -98729,8 +98729,8 @@ static int dupedExprSize(Expr *p, int flags){ } /* -** This function is similar to sqlite3ExprDup(), except that if pzBuffer -** is not NULL then *pzBuffer is assumed to point to a buffer large enough +** This function is similar to sqlite3ExprDup(), except that if pzBuffer +** is not NULL then *pzBuffer is assumed to point to a buffer large enough ** to store the copy of expression p, the copies of p->u.zToken ** (if applicable), and the copies of the p->pLeft and p->pRight expressions, ** if any. Before returning, *pzBuffer is set to the first byte past the @@ -98776,7 +98776,7 @@ static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){ }else{ u32 nSize = (u32)exprStructSize(p); memcpy(zAlloc, p, nSize); - if( nSizemallocFailed flag set. */ @@ -98902,7 +98902,7 @@ static void gatherSelectWindows(Select *p){ ** without effecting the originals. ** ** The expression list, ID, and source lists return by sqlite3ExprListDup(), -** sqlite3IdListDup(), and sqlite3SrcListDup() can not be further expanded +** sqlite3IdListDup(), and sqlite3SrcListDup() can not be further expanded ** by subsequent calls to sqlite*ListAppend() routines. ** ** Any tables that the SrcList might point to are not duplicated. @@ -98932,9 +98932,9 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags) Expr *pOldExpr = pOldItem->pExpr; Expr *pNewExpr; pItem->pExpr = sqlite3ExprDup(db, pOldExpr, flags); - if( pOldExpr + if( pOldExpr && pOldExpr->op==TK_SELECT_COLUMN - && (pNewExpr = pItem->pExpr)!=0 + && (pNewExpr = pItem->pExpr)!=0 ){ assert( pNewExpr->iColumn==0 || i>0 ); if( pNewExpr->iColumn==0 ){ @@ -98962,7 +98962,7 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags) /* ** If cursors, triggers, views and subqueries are all omitted from -** the build, then none of the following routines, except for +** the build, then none of the following routines, except for ** sqlite3SelectDup(), can be called. sqlite3SelectDup() is sometimes ** called with a NULL argument. */ @@ -98995,7 +98995,7 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3 *db, SrcList *p, int flags){ } pNewItem->pIBIndex = pOldItem->pIBIndex; if( pNewItem->fg.isTabFunc ){ - pNewItem->u1.pFuncArg = + pNewItem->u1.pFuncArg = sqlite3ExprListDup(db, pOldItem->u1.pFuncArg, flags); } pTab = pNewItem->pTab = pOldItem->pTab; @@ -99112,7 +99112,7 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListAppend( pList->nExpr = 0; }else if( (pList->nExpr & (pList->nExpr-1))==0 ){ ExprList *pNew; - pNew = sqlite3DbRealloc(db, pList, + pNew = sqlite3DbRealloc(db, pList, sizeof(*pList)+(2*(sqlite3_int64)pList->nExpr-1)*sizeof(pList->a[0])); if( pNew==0 ){ goto no_mem; @@ -99126,7 +99126,7 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListAppend( pItem->pExpr = pExpr; return pList; -no_mem: +no_mem: /* Avoid leaking memory if malloc has failed. */ sqlite3ExprDelete(db, pExpr); sqlite3ExprListDelete(db, pList); @@ -99159,8 +99159,8 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListAppendVector( if( NEVER(pColumns==0) ) goto vector_append_error; if( pExpr==0 ) goto vector_append_error; - /* If the RHS is a vector, then we can immediately check to see that - ** the size of the RHS and LHS match. But if the RHS is a SELECT, + /* If the RHS is a vector, then we can immediately check to see that + ** the size of the RHS and LHS match. But if the RHS is a SELECT, ** wildcards ("*") in the result set of the SELECT must be expanded before ** we can do the size check, so defer the size check until code generation. */ @@ -99188,7 +99188,7 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListAppendVector( Expr *pFirst = pList->a[iFirst].pExpr; assert( pFirst!=0 ); assert( pFirst->op==TK_SELECT_COLUMN ); - + /* Store the SELECT statement in pRight so it will be deleted when ** sqlite3ExprListDelete() is called */ pFirst->pRight = pExpr; @@ -99214,13 +99214,13 @@ SQLITE_PRIVATE void sqlite3ExprListSetSortOrder(ExprList *p, int iSortOrder, int assert( p->nExpr>0 ); assert( SQLITE_SO_UNDEFINED<0 && SQLITE_SO_ASC==0 && SQLITE_SO_DESC>0 ); - assert( iSortOrder==SQLITE_SO_UNDEFINED - || iSortOrder==SQLITE_SO_ASC - || iSortOrder==SQLITE_SO_DESC + assert( iSortOrder==SQLITE_SO_UNDEFINED + || iSortOrder==SQLITE_SO_ASC + || iSortOrder==SQLITE_SO_DESC ); - assert( eNulls==SQLITE_SO_UNDEFINED - || eNulls==SQLITE_SO_ASC - || eNulls==SQLITE_SO_DESC + assert( eNulls==SQLITE_SO_UNDEFINED + || eNulls==SQLITE_SO_ASC + || eNulls==SQLITE_SO_DESC ); pItem = &p->a[p->nExpr-1]; @@ -99433,7 +99433,7 @@ SQLITE_PRIVATE Expr *sqlite3ExprSimplifiedAndOr(Expr *pExpr){ ** in a CREATE TABLE statement. The Walker.eCode value is 5 when parsing ** an existing schema and 4 when processing a new statement. A bound ** parameter raises an error for new statements, but is silently converted -** to NULL for existing schemas. This allows sqlite_master tables that +** to NULL for existing schemas. This allows sqlite_master tables that ** contain a bound parameter because they were generated by older versions ** of SQLite to be parsed by newer versions of SQLite without raising a ** malformed schema error. @@ -99588,7 +99588,7 @@ static int exprNodeIsConstantOrGroupBy(Walker *pWalker, Expr *pExpr){ /* ** Walk the expression tree passed as the first argument. Return non-zero -** if the expression consists entirely of constants or copies of terms +** if the expression consists entirely of constants or copies of terms ** in pGroupBy that sort with the BINARY collation sequence. ** ** This routine is used to determine if a term of the HAVING clause can @@ -99690,7 +99690,7 @@ SQLITE_PRIVATE int sqlite3ExprIsInteger(Expr *p, int *pValue){ ** Return FALSE if there is no chance that the expression can be NULL. ** ** If the expression might be NULL or if the expression is too complex -** to tell return TRUE. +** to tell return TRUE. ** ** This routine is used as an optimization, to skip OP_IsNull opcodes ** when we know that a value cannot be NULL. Hence, a false positive @@ -99776,7 +99776,7 @@ SQLITE_PRIVATE int sqlite3IsRowid(const char *z){ } /* -** pX is the RHS of an IN operator. If pX is a SELECT statement +** pX is the RHS of an IN operator. If pX is a SELECT statement ** that can be simplified to a direct table access, then return ** a pointer to the SELECT statement. If pX is not a SELECT statement, ** or if the SELECT statement needs to be manifested into a transient @@ -99842,7 +99842,7 @@ static void sqlite3SetHasNullFlag(Vdbe *v, int iCur, int regHasNull){ #ifndef SQLITE_OMIT_SUBQUERY /* -** The argument is an IN operator with a list (not a subquery) on the +** The argument is an IN operator with a list (not a subquery) on the ** right-hand side. Return TRUE if that list is constant. */ static int sqlite3InRhsIsConstant(Expr *pIn){ @@ -99901,9 +99901,9 @@ static int sqlite3InRhsIsConstant(Expr *pIn){ ** to be unique - either because it is an INTEGER PRIMARY KEY or due to ** a UNIQUE constraint or index. ** -** When IN_INDEX_MEMBERSHIP is used (and the b-tree will be used -** for fast set membership tests) then an epheremal table must -** be used unless is a single INTEGER PRIMARY KEY column or an +** When IN_INDEX_MEMBERSHIP is used (and the b-tree will be used +** for fast set membership tests) then an epheremal table must +** be used unless is a single INTEGER PRIMARY KEY column or an ** index can be found with the specified as its left-most. ** ** If the IN_INDEX_NOOP_OK and IN_INDEX_MEMBERSHIP are both set and @@ -99915,7 +99915,7 @@ static int sqlite3InRhsIsConstant(Expr *pIn){ ** ** When the b-tree is being used for membership tests, the calling function ** might need to know whether or not the RHS side of the IN operator -** contains a NULL. If prRhsHasNull is not a NULL pointer and +** contains a NULL. If prRhsHasNull is not a NULL pointer and ** if there is any chance that the (...) might contain a NULL value at ** runtime, then a register is allocated and the register number written ** to *prRhsHasNull. If there is no chance that the (...) contains a @@ -99955,9 +99955,9 @@ SQLITE_PRIVATE int sqlite3FindInIndex( assert( pX->op==TK_IN ); mustBeUnique = (inFlags & IN_INDEX_LOOP)!=0; - /* If the RHS of this IN(...) operator is a SELECT, and if it matters + /* If the RHS of this IN(...) operator is a SELECT, and if it matters ** whether or not the SELECT result contains NULL values, check whether - ** or not NULL is actually possible (it may not be, for example, due + ** or not NULL is actually possible (it may not be, for example, due ** to NOT NULL constraints in the schema). If no NULL values are possible, ** set prRhsHasNull to 0 before continuing. */ if( prRhsHasNull && (pX->flags & EP_xIsSelect) ){ @@ -99972,7 +99972,7 @@ SQLITE_PRIVATE int sqlite3FindInIndex( } /* Check to see if an existing table or index can be used to - ** satisfy the query. This is preferable to generating a new + ** satisfy the query. This is preferable to generating a new ** ephemeral table. */ if( pParse->nErr==0 && (p = isCandidateForInOpt(pX))!=0 ){ sqlite3 *db = pParse->db; /* Database connection */ @@ -100007,7 +100007,7 @@ SQLITE_PRIVATE int sqlite3FindInIndex( int affinity_ok = 1; int i; - /* Check that the affinity that will be used to perform each + /* Check that the affinity that will be used to perform each ** comparison is the same as the affinity of each column in table ** on the RHS of the IN operator. If it not, it is not possible to ** use any index of the RHS table. */ @@ -100052,14 +100052,14 @@ SQLITE_PRIVATE int sqlite3FindInIndex( continue; /* This index is not unique over the IN RHS columns */ } } - + colUsed = 0; /* Columns of index used so far */ for(i=0; ipLeft, i); Expr *pRhs = pEList->a[i].pExpr; CollSeq *pReq = sqlite3BinaryCompareCollSeq(pParse, pLhs, pRhs); int j; - + assert( pReq!=0 || pRhs->iColumn==XN_ROWID || pParse->nErr ); for(j=0; jaiColumn[j]!=pRhs->iColumn ) continue; @@ -100075,7 +100075,7 @@ SQLITE_PRIVATE int sqlite3FindInIndex( colUsed |= mCol; if( aiMap ) aiMap[i] = j; } - + assert( i==nExpr || colUsed!=(MASKBIT(nExpr)-1) ); if( colUsed==(MASKBIT(nExpr)-1) ){ /* If we reach this point, that means the index pIdx is usable */ @@ -100087,11 +100087,11 @@ SQLITE_PRIVATE int sqlite3FindInIndex( VdbeComment((v, "%s", pIdx->zName)); assert( IN_INDEX_INDEX_DESC == IN_INDEX_INDEX_ASC+1 ); eType = IN_INDEX_INDEX_ASC + pIdx->aSortOrder[0]; - + if( prRhsHasNull ){ #ifdef SQLITE_ENABLE_COLUMN_USED_MASK i64 mask = (1<nMem; @@ -100153,8 +100153,8 @@ SQLITE_PRIVATE int sqlite3FindInIndex( #ifndef SQLITE_OMIT_SUBQUERY /* -** Argument pExpr is an (?, ?...) IN(...) expression. This -** function allocates and returns a nul-terminated string containing +** Argument pExpr is an (?, ?...) IN(...) expression. This +** function allocates and returns a nul-terminated string containing ** the affinities to be used for each column of the comparison. ** ** It is the responsibility of the caller to ensure that the returned @@ -100187,11 +100187,11 @@ static char *exprINAffinity(Parse *pParse, Expr *pExpr){ #ifndef SQLITE_OMIT_SUBQUERY /* -** Load the Parse object passed as the first argument with an error +** Load the Parse object passed as the first argument with an error ** message of the form: ** ** "sub-select returns N columns - expected M" -*/ +*/ SQLITE_PRIVATE void sqlite3SubselectError(Parse *pParse, int nActual, int nExpect){ const char *zFmt = "sub-select returns %d columns - expected %d"; sqlite3ErrorMsg(pParse, zFmt, nActual, nExpect); @@ -100200,7 +100200,7 @@ SQLITE_PRIVATE void sqlite3SubselectError(Parse *pParse, int nActual, int nExpec /* ** Expression pExpr is a vector that has been used in a context where -** it is not permitted. If pExpr is a sub-select vector, this routine +** it is not permitted. If pExpr is a sub-select vector, this routine ** loads the Parse object with a message of the form: ** ** "sub-select returns N columns - expected 1" @@ -100208,7 +100208,7 @@ SQLITE_PRIVATE void sqlite3SubselectError(Parse *pParse, int nActual, int nExpec ** Or, if it is a regular scalar vector: ** ** "row value misused" -*/ +*/ SQLITE_PRIVATE void sqlite3VectorErrorMsg(Parse *pParse, Expr *pExpr){ #ifndef SQLITE_OMIT_SUBQUERY if( pExpr->flags & EP_xIsSelect ){ @@ -100271,7 +100271,7 @@ SQLITE_PRIVATE void sqlite3CodeRhsOfIN( if( !ExprHasProperty(pExpr, EP_VarSelect) && pParse->iSelfTab==0 ){ /* Reuse of the RHS is allowed */ /* If this routine has already been coded, but the previous code - ** might not have been invoked yet, so invoke it now as a subroutine. + ** might not have been invoked yet, so invoke it now as a subroutine. */ if( ExprHasProperty(pExpr, EP_Subrtn) ){ addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); @@ -100422,7 +100422,7 @@ SQLITE_PRIVATE void sqlite3CodeRhsOfIN( ** ** The pExpr parameter is the SELECT or EXISTS operator to be coded. ** -** Return the register that holds the result. For a multi-column SELECT, +** Return the register that holds the result. For a multi-column SELECT, ** the result is stored in a contiguous array of registers and the ** return value is the register of the left-most result column. ** Return 0 if an error occurs. @@ -100473,7 +100473,7 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); } - + /* For a SELECT, generate code to put the values for all columns of ** the first row into an array of registers and return the index of ** the first register. @@ -100481,7 +100481,7 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ ** If this is an EXISTS, write an integer 0 (not exists) or 1 (exists) ** into a register and return that register number. ** - ** In both cases, the query is augmented with "LIMIT 1". Any + ** In both cases, the query is augmented with "LIMIT 1". Any ** preexisting limit is discarded in place of the new LIMIT 1. */ ExplainQueryPlan((pParse, 1, "%sSCALAR SUBQUERY %d", @@ -100538,9 +100538,9 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ #ifndef SQLITE_OMIT_SUBQUERY /* -** Expr pIn is an IN(...) expression. This function checks that the -** sub-select on the RHS of the IN() operator has the same number of -** columns as the vector on the LHS. Or, if the RHS of the IN() is not +** Expr pIn is an IN(...) expression. This function checks that the +** sub-select on the RHS of the IN() operator has the same number of +** columns as the vector on the LHS. Or, if the RHS of the IN() is not ** a sub-query, that the LHS is a vector of size 1. */ SQLITE_PRIVATE int sqlite3ExprCheckIN(Parse *pParse, Expr *pIn){ @@ -100565,18 +100565,18 @@ SQLITE_PRIVATE int sqlite3ExprCheckIN(Parse *pParse, Expr *pIn){ ** x IN (SELECT ...) ** x IN (value, value, ...) ** -** The left-hand side (LHS) is a scalar or vector expression. The +** The left-hand side (LHS) is a scalar or vector expression. The ** right-hand side (RHS) is an array of zero or more scalar values, or a ** subquery. If the RHS is a subquery, the number of result columns must ** match the number of columns in the vector on the LHS. If the RHS is -** a list of values, the LHS must be a scalar. +** a list of values, the LHS must be a scalar. ** ** The IN operator is true if the LHS value is contained within the RHS. -** The result is false if the LHS is definitely not in the RHS. The -** result is NULL if the presence of the LHS in the RHS cannot be +** The result is false if the LHS is definitely not in the RHS. The +** result is NULL if the presence of the LHS in the RHS cannot be ** determined due to NULLs. ** -** This routine generates code that jumps to destIfFalse if the LHS is not +** This routine generates code that jumps to destIfFalse if the LHS is not ** contained within the RHS. If due to NULLs we cannot determine if the LHS ** is contained in the RHS then jump to destIfNull. If the LHS is contained ** within the RHS then fall through. @@ -100605,7 +100605,7 @@ static void sqlite3ExprCodeIN( int destStep6 = 0; /* Start of code for Step 6 */ int addrTruthOp; /* Address of opcode that determines the IN is true */ int destNotNull; /* Jump here if a comparison is not true in step 6 */ - int addrTop; /* Top of the step-6 loop */ + int addrTop; /* Top of the step-6 loop */ int iTab = 0; /* Index to use */ pLeft = pExpr->pLeft; @@ -100630,7 +100630,7 @@ static void sqlite3ExprCodeIN( aiMap, &iTab); assert( pParse->nErr || nVector==1 || eType==IN_INDEX_EPH - || eType==IN_INDEX_INDEX_ASC || eType==IN_INDEX_INDEX_DESC + || eType==IN_INDEX_INDEX_ASC || eType==IN_INDEX_INDEX_DESC ); #ifdef SQLITE_DEBUG /* Confirm that aiMap[] contains nVector integer values between 0 and @@ -100642,8 +100642,8 @@ static void sqlite3ExprCodeIN( } #endif - /* Code the LHS, the from " IN (...)". If the LHS is a - ** vector, then it is stored in an array of nVector registers starting + /* Code the LHS, the from " IN (...)". If the LHS is a + ** vector, then it is stored in an array of nVector registers starting ** at r1. ** ** sqlite3FindInIndex() might have reordered the fields of the LHS vector @@ -100768,7 +100768,7 @@ static void sqlite3ExprCodeIN( } /* Step 5. If we do not care about the difference between NULL and - ** FALSE, then just return false. + ** FALSE, then just return false. */ if( destIfFalse==destIfNull ) sqlite3VdbeGoto(v, destIfFalse); @@ -100829,7 +100829,7 @@ sqlite3ExprCodeIN_oom_error: ** Generate an instruction that will put the floating point ** value described by z[0..n-1] into register iMem. ** -** The z[] string will probably not be zero-terminated. But the +** The z[] string will probably not be zero-terminated. But the ** z[n] character is guaranteed to be something that does not look ** like the continuation of the number. */ @@ -100939,7 +100939,7 @@ SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable( /* ** Generate code that will extract the iColumn-th column from -** table pTab and store the column value in register iReg. +** table pTab and store the column value in register iReg. ** ** There must be an open cursor to pTab in iTable when this routine ** is called. If iColumn<0 then code is generated that extracts the rowid. @@ -101225,7 +101225,7 @@ expr_code_doover: case TK_BITOR: case TK_SLASH: case TK_LSHIFT: - case TK_RSHIFT: + case TK_RSHIFT: case TK_CONCAT: { assert( TK_AND==OP_And ); testcase( op==TK_AND ); assert( TK_OR==OP_Or ); testcase( op==TK_OR ); @@ -101391,7 +101391,7 @@ expr_code_doover: char aff; assert( nFarg==1 ); aff = sqlite3ExprAffinity(pFarg->a[0].pExpr); - sqlite3VdbeLoadString(v, target, + sqlite3VdbeLoadString(v, target, (aff<=SQLITE_AFF_NONE) ? "none" : azAff[aff-SQLITE_AFF_BLOB]); return target; } @@ -101428,7 +101428,7 @@ expr_code_doover: assert( SQLITE_FUNC_LENGTH==OPFLAG_LENGTHARG ); assert( SQLITE_FUNC_TYPEOF==OPFLAG_TYPEOFARG ); testcase( pDef->funcFlags & OPFLAG_LENGTHARG ); - pFarg->a[0].pExpr->op2 = + pFarg->a[0].pExpr->op2 = pDef->funcFlags & (OPFLAG_LENGTHARG|OPFLAG_TYPEOFARG); } } @@ -101447,7 +101447,7 @@ expr_code_doover: ** see if it is a column in a virtual table. This is done because ** the left operand of infix functions (the operand we want to ** control overloading) ends up as the second argument to the - ** function. The expression "A glob B" is equivalent to + ** function. The expression "A glob B" is equivalent to ** "glob(B,A). We want to use the A in "A glob B" to test ** for function overloading. But we use the B term in "glob(B,A)". */ @@ -101458,7 +101458,7 @@ expr_code_doover: } #endif if( pDef->funcFlags & SQLITE_FUNC_NEEDCOLL ){ - if( !pColl ) pColl = db->pDfltColl; + if( !pColl ) pColl = db->pDfltColl; sqlite3VdbeAddOp4(v, OP_CollSeq, 0, 0, 0, (char *)pColl, P4_COLLSEQ); } #ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC @@ -101538,7 +101538,7 @@ expr_code_doover: return target; } case TK_SPAN: - case TK_COLLATE: + case TK_COLLATE: case TK_UPLUS: { pExpr = pExpr->pLeft; goto expr_code_doover; /* 2018-04-28: Prevent deep recursion. OSSFuzz. */ @@ -101554,7 +101554,7 @@ expr_code_doover: ** ** The expression is implemented using an OP_Param opcode. The p1 ** parameter is set to 0 for an old.rowid reference, or to (i+1) - ** to reference another column of the old.* pseudo-table, where + ** to reference another column of the old.* pseudo-table, where ** i is the index of the column. For a new.rowid reference, p1 is ** set to (n+1), where n is the number of columns in each pseudo-table. ** For a reference to any other column in the new.* pseudo-table, p1 @@ -101568,7 +101568,7 @@ expr_code_doover: ** ** p1==0 -> old.rowid p1==3 -> new.rowid ** p1==1 -> old.a p1==4 -> new.a - ** p1==2 -> old.b p1==5 -> new.b + ** p1==2 -> old.b p1==5 -> new.b */ Table *pTab = pExpr->y.pTab; int p1 = pExpr->iTable * (pTab->nCol+1) + 1 + pExpr->iColumn; @@ -101590,7 +101590,7 @@ expr_code_doover: ** ** EVIDENCE-OF: R-60985-57662 SQLite will convert the value back to ** floating point when extracting it from the record. */ - if( pExpr->iColumn>=0 + if( pExpr->iColumn>=0 && pTab->aCol[pExpr->iColumn].affinity==SQLITE_AFF_REAL ){ sqlite3VdbeAddOp1(v, OP_RealAffinity, target); @@ -101711,7 +101711,7 @@ expr_code_doover: } #ifndef SQLITE_OMIT_TRIGGER case TK_RAISE: { - assert( pExpr->affExpr==OE_Rollback + assert( pExpr->affExpr==OE_Rollback || pExpr->affExpr==OE_Abort || pExpr->affExpr==OE_Fail || pExpr->affExpr==OE_Ignore @@ -101747,8 +101747,8 @@ expr_code_doover: ** Factor out the code of the given expression to initialization time. ** ** If regDest>=0 then the result is always stored in that register and the -** result is not reusable. If regDest<0 then this routine is free to -** store the value whereever it wants. The register where the expression +** result is not reusable. If regDest<0 then this routine is free to +** store the value whereever it wants. The register where the expression ** is stored is returned. When regDest<0, two identical expressions will ** code to the same register. */ @@ -101870,7 +101870,7 @@ SQLITE_PRIVATE void sqlite3ExprCodeFactorable(Parse *pParse, Expr *pExpr, int ta ** and modify the expression so that the next time it is evaluated, ** the result is a copy of the cache register. ** -** This routine is used for expressions that are used multiple +** This routine is used for expressions that are used multiple ** times. They are evaluated once and the results of the expression ** are reused. */ @@ -101965,7 +101965,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeExprList( ** ** x BETWEEN y AND z ** -** The above is equivalent to +** The above is equivalent to ** ** x>=y AND x<=z ** @@ -102181,7 +102181,7 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int } } sqlite3ReleaseTempReg(pParse, regFree1); - sqlite3ReleaseTempReg(pParse, regFree2); + sqlite3ReleaseTempReg(pParse, regFree2); } /* @@ -102340,7 +102340,7 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int } #endif default: { - default_expr: + default_expr: if( ExprAlwaysFalse(pExpr) ){ sqlite3VdbeGoto(v, dest); }else if( ExprAlwaysTrue(pExpr) ){ @@ -102390,7 +102390,7 @@ static int exprCompareVariable(Parse *pParse, Expr *pVar, Expr *pExpr){ int res = 0; int iVar; sqlite3_value *pL, *pR = 0; - + sqlite3ValueFromExpr(pParse->db, pExpr, SQLITE_UTF8, SQLITE_AFF_BLOB, &pR); if( pR ){ iVar = pVar->iColumn; @@ -102432,9 +102432,9 @@ static int exprCompareVariable(Parse *pParse, Expr *pVar, Expr *pExpr){ ** an incorrect 0 or 1 could lead to a malfunction. ** ** If pParse is not NULL then TK_VARIABLE terms in pA with bindings in -** pParse->pReprepare can be matched against literals in pB. The +** pParse->pReprepare can be matched against literals in pB. The ** pParse->pVdbe->expmask bitmask is updated for each variable referenced. -** If pParse is NULL (the normal case) then any TK_VARIABLE term in +** If pParse is NULL (the normal case) then any TK_VARIABLE term in ** Argument pParse should normally be NULL. If it is not NULL and pA or ** pB causes a return value of 2. */ @@ -102498,7 +102498,7 @@ SQLITE_PRIVATE int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTa if( pA->iColumn!=pB->iColumn ) return 2; if( pA->op2!=pB->op2 ) return 2; if( pA->op!=TK_IN - && pA->iTable!=pB->iTable + && pA->iTable!=pB->iTable && (pA->iTable!=iTab || NEVER(pB->iTable>=0)) ) return 2; } } @@ -102506,7 +102506,7 @@ SQLITE_PRIVATE int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTa } /* -** Compare two ExprList objects. Return 0 if they are identical and +** Compare two ExprList objects. Return 0 if they are identical and ** non-zero if they differ in any way. ** ** If any subelement of pB has Expr.iTable==(-1) then it is allowed @@ -102592,8 +102592,8 @@ static int exprImpliesNotNull( case TK_MINUS: case TK_BITOR: case TK_LSHIFT: - case TK_RSHIFT: - case TK_CONCAT: + case TK_RSHIFT: + case TK_CONCAT: seenNot = 1; /* Fall thru */ case TK_STAR: @@ -102638,9 +102638,9 @@ static int exprImpliesNotNull( ** When comparing TK_COLUMN nodes between pE1 and pE2, if pE2 has ** Expr.iTable<0 then assume a table number given by iTab. ** -** If pParse is not NULL, then the values of bound variables in pE1 are +** If pParse is not NULL, then the values of bound variables in pE1 are ** compared against literal values in pE2 and pParse->pVdbe->expmask is -** modified to record which bound variables are referenced. If pParse +** modified to record which bound variables are referenced. If pParse ** is NULL, then false will be returned if pE1 contains any bound variables. ** ** When in doubt, return false. Returning true might give a performance @@ -102800,7 +102800,7 @@ struct IdxCover { }; /* -** Check to see if there are references to columns in table +** Check to see if there are references to columns in table ** pWalker->u.pIdxCover->iCur can be satisfied using the index ** pWalker->u.pIdxCover->pIdx. */ @@ -102844,7 +102844,7 @@ SQLITE_PRIVATE int sqlite3ExprCoveredByIndex( /* ** An instance of the following structure is used by the tree walker -** to count references to table columns in the arguments of an +** to count references to table columns in the arguments of an ** aggregate function, in order to implement the ** sqlite3FunctionThisSrc() routine. */ @@ -102918,7 +102918,7 @@ static int addAggInfoColumn(sqlite3 *db, AggInfo *pInfo){ &i ); return i; -} +} /* ** Add a new element to the pAggInfo->aFunc[] array. Return the index of @@ -102927,14 +102927,14 @@ static int addAggInfoColumn(sqlite3 *db, AggInfo *pInfo){ static int addAggInfoFunc(sqlite3 *db, AggInfo *pInfo){ int i; pInfo->aFunc = sqlite3ArrayAllocate( - db, + db, pInfo->aFunc, sizeof(pInfo->aFunc[0]), &pInfo->nFunc, &i ); return i; -} +} /* ** This is the xExprCallback for a tree walker. It is used to @@ -102963,7 +102963,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ assert( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) ); if( pExpr->iTable==pItem->iCursor ){ /* If we reach this point, it means that pExpr refers to a table - ** that is in the FROM clause of the aggregate query. + ** that is in the FROM clause of the aggregate query. ** ** Make an entry for the column in pAggInfo->aCol[] if there ** is not an entry there already. @@ -102977,7 +102977,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ } } if( (k>=pAggInfo->nColumn) - && (k = addAggInfoColumn(pParse->db, pAggInfo))>=0 + && (k = addAggInfoColumn(pParse->db, pAggInfo))>=0 ){ pCol = &pAggInfo->aCol[k]; pCol->pTab = pExpr->y.pTab; @@ -103023,7 +103023,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ if( (pNC->ncFlags & NC_InAggFunc)==0 && pWalker->walkerDepth==pExpr->op2 ){ - /* Check to see if pExpr is a duplicate of another aggregate + /* Check to see if pExpr is a duplicate of another aggregate ** function that is already in the pAggInfo structure */ struct AggInfo_func *pItem = pAggInfo->aFunc; @@ -103044,7 +103044,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ pItem->iMem = ++pParse->nMem; assert( !ExprHasProperty(pExpr, EP_IntValue) ); pItem->pFunc = sqlite3FindFunction(pParse->db, - pExpr->u.zToken, + pExpr->u.zToken, pExpr->x.pList ? pExpr->x.pList->nExpr : 0, enc, 0); if( pExpr->flags & EP_Distinct ){ pItem->iDistinct = pParse->nTab++; @@ -103231,9 +103231,9 @@ SQLITE_PRIVATE int sqlite3NoTempsInRange(Parse *pParse, int iFirst, int iLast){ ** Or, if zName is not a system table, zero is returned. */ static int isAlterableTable(Parse *pParse, Table *pTab){ - if( 0==sqlite3StrNICmp(pTab->zName, "sqlite_", 7) + if( 0==sqlite3StrNICmp(pTab->zName, "sqlite_", 7) #ifndef SQLITE_OMIT_VIRTUALTABLE - || ( (pTab->tabFlags & TF_Shadow) + || ( (pTab->tabFlags & TF_Shadow) && (pParse->db->flags & SQLITE_Defensive) && pParse->db->nVdbeExec==0 ) @@ -103253,24 +103253,24 @@ static int isAlterableTable(Parse *pParse, Table *pTab){ ** objects unusable. */ static void renameTestSchema(Parse *pParse, const char *zDb, int bTemp){ - sqlite3NestedParse(pParse, + sqlite3NestedParse(pParse, "SELECT 1 " "FROM \"%w\".%s " "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" " AND sql NOT LIKE 'create virtual%%'" " AND sqlite_rename_test(%Q, sql, type, name, %d)=NULL ", - zDb, MASTER_NAME, + zDb, MASTER_NAME, zDb, bTemp ); if( bTemp==0 ){ - sqlite3NestedParse(pParse, + sqlite3NestedParse(pParse, "SELECT 1 " "FROM temp.%s " "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" " AND sql NOT LIKE 'create virtual%%'" " AND sqlite_rename_test(%Q, sql, type, name, 1)=NULL ", - MASTER_NAME, zDb + MASTER_NAME, zDb ); } } @@ -103289,8 +103289,8 @@ static void renameReloadSchema(Parse *pParse, int iDb){ } /* -** Generate code to implement the "ALTER TABLE xxx RENAME TO yyy" -** command. +** Generate code to implement the "ALTER TABLE xxx RENAME TO yyy" +** command. */ SQLITE_PRIVATE void sqlite3AlterRenameTable( Parse *pParse, /* Parser context. */ @@ -103300,7 +103300,7 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( int iDb; /* Database that contains the table */ char *zDb; /* Name of database iDb */ Table *pTab; /* Table being renamed */ - char *zName = 0; /* NULL-terminated version of pName */ + char *zName = 0; /* NULL-terminated version of pName */ sqlite3 *db = pParse->db; /* Database connection */ int nTabName; /* Number of UTF-8 characters in zTabName */ const char *zTabName; /* Original name of the table */ @@ -103308,7 +103308,7 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( VTable *pVTab = 0; /* Non-zero if this is a v-tab with an xRename() */ u32 savedDbFlags; /* Saved value of db->mDbFlags */ - savedDbFlags = db->mDbFlags; + savedDbFlags = db->mDbFlags; if( NEVER(db->mallocFailed) ) goto exit_rename_table; assert( pSrc->nSrc==1 ); assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); @@ -103327,7 +103327,7 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( ** in database iDb. If so, this is an error. */ if( sqlite3FindTable(db, zName, zDb) || sqlite3FindIndex(db, zName, zDb) ){ - sqlite3ErrorMsg(pParse, + sqlite3ErrorMsg(pParse, "there is already another table or index with this name: %s", zName); goto exit_rename_table; } @@ -103370,7 +103370,7 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( /* Begin a transaction for database iDb. Then modify the schema cookie ** (since the ALTER TABLE modifies the schema). Call sqlite3MayAbort(), - ** as the scalar functions (e.g. sqlite_rename_table()) invoked by the + ** as the scalar functions (e.g. sqlite_rename_table()) invoked by the ** nested SQL may raise an exception. */ v = sqlite3GetVdbe(pParse); if( v==0 ){ @@ -103384,7 +103384,7 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( /* Rewrite all CREATE TABLE, INDEX, TRIGGER or VIEW statements in ** the schema to use the new table name. */ - sqlite3NestedParse(pParse, + sqlite3NestedParse(pParse, "UPDATE \"%w\".%s SET " "sql = sqlite_rename_table(%Q, type, name, sql, %Q, %Q, %d) " "WHERE (type!='index' OR tbl_name=%Q COLLATE nocase)" @@ -103404,14 +103404,14 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( "'sqlite_autoindex_' || %Q || substr(name,%d+18) " "ELSE name END " "WHERE tbl_name=%Q COLLATE nocase AND " - "(type='table' OR type='index' OR type='trigger');", - zDb, MASTER_NAME, - zName, zName, zName, + "(type='table' OR type='index' OR type='trigger');", + zDb, MASTER_NAME, + zName, zName, zName, nTabName, zTabName ); #ifndef SQLITE_OMIT_AUTOINCREMENT - /* If the sqlite_sequence table exists in this database, then update + /* If the sqlite_sequence table exists in this database, then update ** it with the new table name. */ if( sqlite3FindTable(db, "sqlite_sequence", zDb) ){ @@ -103422,10 +103422,10 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( #endif /* If the table being renamed is not itself part of the temp database, - ** edit view and trigger definitions within the temp database + ** edit view and trigger definitions within the temp database ** as required. */ if( iDb!=1 ){ - sqlite3NestedParse(pParse, + sqlite3NestedParse(pParse, "UPDATE sqlite_temp_master SET " "sql = sqlite_rename_table(%Q, type, name, sql, %Q, %Q, 1), " "tbl_name = " @@ -103500,7 +103500,7 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ } #endif - /* If the default value for the new column was specified with a + /* If the default value for the new column was specified with a ** literal NULL, then set pDflt to 0. This simplifies checking ** for an SQL NULL default below. */ @@ -103522,12 +103522,12 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ return; } if( (db->flags&SQLITE_ForeignKeys) && pNew->pFKey && pDflt ){ - sqlite3ErrorMsg(pParse, + sqlite3ErrorMsg(pParse, "Cannot add a REFERENCES column with non-NULL default value"); return; } if( pCol->notNull && !pDflt ){ - sqlite3ErrorMsg(pParse, + sqlite3ErrorMsg(pParse, "Cannot add a NOT NULL column with default value NULL"); return; } @@ -103560,10 +103560,10 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ *zEnd-- = '\0'; } db->mDbFlags |= DBFLAG_PreferBuiltin; - sqlite3NestedParse(pParse, + sqlite3NestedParse(pParse, "UPDATE \"%w\".%s SET " "sql = substr(sql,1,%d) || ', ' || %Q || substr(sql,%d) " - "WHERE type = 'table' AND name = %Q", + "WHERE type = 'table' AND name = %Q", zDb, MASTER_NAME, pNew->addColOffset, zCol, pNew->addColOffset+1, zTab ); @@ -103593,14 +103593,14 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ /* ** This function is called by the parser after the table-name in -** an "ALTER TABLE ADD" statement is parsed. Argument +** an "ALTER TABLE ADD" statement is parsed. Argument ** pSrc is the full-name of the table being altered. ** ** This routine makes a (partial) copy of the Table structure ** for the table being altered and sets Parse.pNewTable to point ** to it. Routines called by the parser as the column definition -** is parsed (i.e. sqlite3AddColumn()) add the new Column data to -** the copy. The copy of the Table structure is deleted by tokenize.c +** is parsed (i.e. sqlite3AddColumn()) add the new Column data to +** the copy. The copy of the Table structure is deleted by tokenize.c ** after parsing is finished. ** ** Routine sqlite3AlterFinishAddColumn() will be called to complete @@ -103739,7 +103739,7 @@ SQLITE_PRIVATE void sqlite3AlterRenameColumn( if( SQLITE_OK!=isAlterableTable(pParse, pTab) ) goto exit_rename_column; if( SQLITE_OK!=isRealTable(pParse, pTab) ) goto exit_rename_column; - /* Which schema holds the table to be altered */ + /* Which schema holds the table to be altered */ iSchema = sqlite3SchemaToIndex(db, pTab->pSchema); assert( iSchema>=0 ); zDb = db->aDb[iSchema].zDbSName; @@ -103772,22 +103772,22 @@ SQLITE_PRIVATE void sqlite3AlterRenameColumn( if( !zNew ) goto exit_rename_column; assert( pNew->n>0 ); bQuote = sqlite3Isquote(pNew->z[0]); - sqlite3NestedParse(pParse, + sqlite3NestedParse(pParse, "UPDATE \"%w\".%s SET " "sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, %d) " "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X' " " AND (type != 'index' OR tbl_name = %Q)" " AND sql NOT LIKE 'create virtual%%'", - zDb, MASTER_NAME, + zDb, MASTER_NAME, zDb, pTab->zName, iCol, zNew, bQuote, iSchema==1, pTab->zName ); - sqlite3NestedParse(pParse, + sqlite3NestedParse(pParse, "UPDATE temp.%s SET " "sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, 1) " "WHERE type IN ('trigger', 'view')", - MASTER_NAME, + MASTER_NAME, zDb, pTab->zName, iCol, zNew, bQuote ); @@ -103834,7 +103834,7 @@ struct RenameCtx { RenameToken *pList; /* List of tokens to overwrite */ int nList; /* Number of tokens in pList */ int iCol; /* Index of column being renamed */ - Table *pTab; /* Table being ALTERed */ + Table *pTab; /* Table being ALTERed */ const char *zOld; /* Old column name */ }; @@ -103842,14 +103842,14 @@ struct RenameCtx { /* ** This function is only for debugging. It performs two tasks: ** -** 1. Checks that pointer pPtr does not already appear in the +** 1. Checks that pointer pPtr does not already appear in the ** rename-token list. ** ** 2. Dereferences each pointer in the rename-token list. ** ** The second is most effective when debugging under valgrind or -** address-sanitizer or similar. If any of these pointers no longer -** point to valid objects, an exception is raised by the memory-checking +** address-sanitizer or similar. If any of these pointers no longer +** point to valid objects, an exception is raised by the memory-checking ** tool. ** ** The point of this is to prevent comparisons of invalid pointer values. @@ -103966,7 +103966,7 @@ SQLITE_PRIVATE void sqlite3RenameExprUnmap(Parse *pParse, Expr *pExpr){ } /* -** Remove all nodes that are part of expression-list pEList from the +** Remove all nodes that are part of expression-list pEList from the ** rename list. */ SQLITE_PRIVATE void sqlite3RenameExprlistUnmap(Parse *pParse, ExprList *pEList){ @@ -104055,13 +104055,13 @@ static int renameColumnSelectCb(Walker *pWalker, Select *p){ */ static int renameColumnExprCb(Walker *pWalker, Expr *pExpr){ RenameCtx *p = pWalker->u.pRename; - if( pExpr->op==TK_TRIGGER - && pExpr->iColumn==p->iCol + if( pExpr->op==TK_TRIGGER + && pExpr->iColumn==p->iCol && pWalker->pParse->pTriggerTab==p->pTab ){ renameTokenFind(pWalker->pParse, p, (void*)pExpr); - }else if( pExpr->op==TK_COLUMN - && pExpr->iColumn==p->iCol + }else if( pExpr->op==TK_COLUMN + && pExpr->iColumn==p->iCol && p->pTab==pExpr->y.pTab ){ renameTokenFind(pWalker->pParse, p, (void*)pExpr); @@ -104100,7 +104100,7 @@ static RenameToken *renameColumnTokenNext(RenameCtx *pCtx){ ** adds context to the error message and then stores it in pCtx. */ static void renameColumnParseError( - sqlite3_context *pCtx, + sqlite3_context *pCtx, int bPost, sqlite3_value *pType, sqlite3_value *pObject, @@ -104110,7 +104110,7 @@ static void renameColumnParseError( const char *zN = (const char*)sqlite3_value_text(pObject); char *zErr; - zErr = sqlite3_mprintf("error in %s %s%s: %s", + zErr = sqlite3_mprintf("error in %s %s%s: %s", zT, zN, (bPost ? " after rename" : ""), pParse->zErrMsg ); @@ -104120,14 +104120,14 @@ static void renameColumnParseError( /* ** For each name in the the expression-list pEList (i.e. each -** pEList->a[i].zName) that matches the string in zOld, extract the +** pEList->a[i].zName) that matches the string in zOld, extract the ** corresponding rename-token from Parse object pParse and add it ** to the RenameCtx pCtx. */ static void renameColumnElistNames( - Parse *pParse, - RenameCtx *pCtx, - ExprList *pEList, + Parse *pParse, + RenameCtx *pCtx, + ExprList *pEList, const char *zOld ){ if( pEList ){ @@ -104142,14 +104142,14 @@ static void renameColumnElistNames( } /* -** For each name in the the id-list pIdList (i.e. each pIdList->a[i].zName) -** that matches the string in zOld, extract the corresponding rename-token +** For each name in the the id-list pIdList (i.e. each pIdList->a[i].zName) +** that matches the string in zOld, extract the corresponding rename-token ** from Parse object pParse and add it to the RenameCtx pCtx. */ static void renameColumnIdlistNames( - Parse *pParse, - RenameCtx *pCtx, - IdList *pIdList, + Parse *pParse, + RenameCtx *pCtx, + IdList *pIdList, const char *zOld ){ if( pIdList ){ @@ -104192,8 +104192,8 @@ static int renameParseSql( assert( rc!=SQLITE_OK || zErr==0 ); p->zErrMsg = zErr; if( db->mallocFailed ) rc = SQLITE_NOMEM; - if( rc==SQLITE_OK - && p->pNewTable==0 && p->pNewIndex==0 && p->pNewTrigger==0 + if( rc==SQLITE_OK + && p->pNewTable==0 && p->pNewIndex==0 && p->pNewTrigger==0 ){ rc = SQLITE_CORRUPT_BKPT; } @@ -104238,8 +104238,8 @@ static int renameEditSql( char *zOut; int nQuot; - /* Set zQuot to point to a buffer containing a quoted copy of the - ** identifier zNew. If the corresponding identifier in the original + /* Set zQuot to point to a buffer containing a quoted copy of the + ** identifier zNew. If the corresponding identifier in the original ** ALTER TABLE statement was quoted (bQuote==1), then set zNew to ** point to zQuot so that all substitutions are made using the ** quoted version of the new column name. */ @@ -104279,7 +104279,7 @@ static int renameEditSql( iOff = pBest->t.z - zSql; if( pBest->t.n!=nReplace ){ - memmove(&zOut[iOff + nReplace], &zOut[iOff + pBest->t.n], + memmove(&zOut[iOff + nReplace], &zOut[iOff + pBest->t.n], nOut - (iOff + pBest->t.n) ); nOut += nReplace - pBest->t.n; @@ -104301,7 +104301,7 @@ static int renameEditSql( /* ** Resolve all symbols in the trigger at pParse->pNewTrigger, assuming -** it was read from the schema of database zDb. Return SQLITE_OK if +** it was read from the schema of database zDb. Return SQLITE_OK if ** successful. Otherwise, return an SQLite error code and leave an error ** message in the Parse object. */ @@ -104315,7 +104315,7 @@ static int renameResolveTrigger(Parse *pParse, const char *zDb){ memset(&sNC, 0, sizeof(sNC)); sNC.pParse = pParse; assert( pNew->pTabSchema ); - pParse->pTriggerTab = sqlite3FindTable(db, pNew->table, + pParse->pTriggerTab = sqlite3FindTable(db, pNew->table, db->aDb[sqlite3SchemaToIndex(db, pNew->pTabSchema)].zDbSName ); pParse->eTriggerOp = pNew->op; @@ -104557,7 +104557,7 @@ static void renameColumnFunc( if( rc!=SQLITE_OK ) goto renameColumnFunc_done; for(pStep=sParse.pNewTrigger->step_list; pStep; pStep=pStep->pNext){ - if( pStep->zTarget ){ + if( pStep->zTarget ){ Table *pTarget = sqlite3LocateTable(&sParse, 0, pStep->zTarget, zDb); if( pTarget==pTab ){ if( pStep->pUpsert ){ @@ -104601,7 +104601,7 @@ renameColumnFunc_done: } /* -** Walker expression callback used by "RENAME TABLE". +** Walker expression callback used by "RENAME TABLE". */ static int renameTableExprCb(Walker *pWalker, Expr *pExpr){ RenameCtx *p = pWalker->u.pRename; @@ -104612,7 +104612,7 @@ static int renameTableExprCb(Walker *pWalker, Expr *pExpr){ } /* -** Walker select callback used by "RENAME TABLE". +** Walker select callback used by "RENAME TABLE". */ static int renameTableSelectCb(Walker *pWalker, Select *pSelect){ int i; @@ -104637,7 +104637,7 @@ static int renameTableSelectCb(Walker *pWalker, Select *pSelect){ /* ** This C function implements an SQL user function that is used by SQL code ** generated by the ALTER TABLE ... RENAME command to modify the definition -** of any foreign key constraints that use the table being renamed as the +** of any foreign key constraints that use the table being renamed as the ** parent table. It is passed three arguments: ** ** 0: The database containing the table being renamed. @@ -104742,7 +104742,7 @@ static void renameTableFunc( else{ Trigger *pTrigger = sParse.pNewTrigger; TriggerStep *pStep; - if( 0==sqlite3_stricmp(sParse.pNewTrigger->table, zOld) + if( 0==sqlite3_stricmp(sParse.pNewTrigger->table, zOld) && sCtx.pTab->pSchema==pTrigger->pTabSchema ){ renameTokenFind(&sParse, &sCtx, sParse.pNewTrigger->table); @@ -104904,7 +104904,7 @@ SQLITE_PRIVATE void sqlite3AlterFunctions(void){ ** created and used by SQLite versions 3.7.9 through 3.29.0 when ** SQLITE_ENABLE_STAT3 defined. The functionality of sqlite_stat3 ** is a superset of sqlite_stat2 and is also now deprecated. The -** sqlite_stat4 is an enhanced version of sqlite_stat3 and is only +** sqlite_stat4 is an enhanced version of sqlite_stat3 and is only ** available when compiled with SQLITE_ENABLE_STAT4 and in SQLite ** versions 3.8.1 and later. STAT4 is the only variant that is still ** supported. @@ -104923,7 +104923,7 @@ SQLITE_PRIVATE void sqlite3AlterFunctions(void){ ** integer is the average number of rows in the index that have the same ** value in the first column of the index. The third integer is the average ** number of rows in the index that have the same value for the first two -** columns. The N-th integer (for N>1) is the average number of rows in +** columns. The N-th integer (for N>1) is the average number of rows in ** the index which have the same value for the first N-1 columns. For ** a K-column index, there will be K+1 integers in the stat column. If ** the index is unique, then the last integer will be 1. @@ -104933,7 +104933,7 @@ SQLITE_PRIVATE void sqlite3AlterFunctions(void){ ** must be separated from the last integer by a single space. If the ** "unordered" keyword is present, then the query planner assumes that ** the index is unordered and will not use the index for a range query. -** +** ** If the sqlite_stat1.idx column is NULL, then the sqlite_stat1.stat ** column contains a single integer which is the (estimated) number of ** rows in the table identified by sqlite_stat1.tbl. @@ -104991,9 +104991,9 @@ SQLITE_PRIVATE void sqlite3AlterFunctions(void){ ** number of entries that are strictly less than the sample. The first ** integer in nLt contains the number of entries in the index where the ** left-most column is less than the left-most column of the sample. -** The K-th integer in the nLt entry is the number of index entries +** The K-th integer in the nLt entry is the number of index entries ** where the first K columns are less than the first K columns of the -** sample. The nDLt column is like nLt except that it contains the +** sample. The nDLt column is like nLt except that it contains the ** number of distinct entries in the index that are less than the ** sample. ** @@ -105076,9 +105076,9 @@ static void openStatTable( Table *pStat; if( (pStat = sqlite3FindTable(db, zTab, pDb->zDbSName))==0 ){ if( aTable[i].zCols ){ - /* The sqlite_statN table does not exist. Create it. Note that a - ** side-effect of the CREATE TABLE statement is to leave the rootpage - ** of the new table in register pParse->regRoot. This is important + /* The sqlite_statN table does not exist. Create it. Note that a + ** side-effect of the CREATE TABLE statement is to leave the rootpage + ** of the new table in register pParse->regRoot. This is important ** because the OpenWrite opcode below will be needing it. */ sqlite3NestedParse(pParse, "CREATE TABLE %Q.%s(%s)", pDb->zDbSName, zTab, aTable[i].zCols @@ -105087,7 +105087,7 @@ static void openStatTable( aCreateTbl[i] = OPFLAG_P2ISREG; } }else{ - /* The table already exists. If zWhere is not NULL, delete all entries + /* The table already exists. If zWhere is not NULL, delete all entries ** associated with the table zWhere. If zWhere is NULL, delete the ** entire contents of the table. */ aRoot[i] = pStat->tnum; @@ -105146,7 +105146,7 @@ struct Stat4Sample { int iCol; /* If !isPSample, the reason for inclusion */ u32 iHash; /* Tiebreaker hash */ #endif -}; +}; struct Stat4Accum { tRowcnt nRow; /* Number of rows in the entire table */ tRowcnt nPSample; /* How often to do a periodic sample */ @@ -105255,7 +105255,7 @@ static void stat4Destructor(void *pOld){ ** PRIMARY KEY of the table. The covering index that implements the ** original WITHOUT ROWID table as N==K as a special case. ** -** This routine allocates the Stat4Accum object in heap memory. The return +** This routine allocates the Stat4Accum object in heap memory. The return ** value is a pointer to the Stat4Accum object. The datatype of the ** return value is BLOB, but it is really just a pointer to the Stat4Accum ** object. @@ -105285,7 +105285,7 @@ static void statInit( assert( nKeyCol>0 ); /* Allocate the space required for the Stat4Accum object */ - n = sizeof(*p) + n = sizeof(*p) + sizeof(tRowcnt)*nColUp /* Stat4Accum.anEq */ + sizeof(tRowcnt)*nColUp /* Stat4Accum.anDLt */ #ifdef SQLITE_ENABLE_STAT4 @@ -105318,7 +105318,7 @@ static void statInit( p->nPSample = (tRowcnt)(sqlite3_value_int64(argv[2])/(mxSample/3+1) + 1); p->current.anLt = &p->current.anEq[nColUp]; p->iPrn = 0x689e962d*(u32)nCol ^ 0xd0944565*(u32)sqlite3_value_int(argv[2]); - + /* Set up the Stat4Accum.a[] and aBest[] arrays */ p->a = (struct Stat4Sample*)&p->current.anLt[nColUp]; p->aBest = &p->a[mxSample]; @@ -105329,7 +105329,7 @@ static void statInit( p->a[i].anDLt = (tRowcnt *)pSpace; pSpace += (sizeof(tRowcnt) * nColUp); } assert( (pSpace - (u8*)p)==n ); - + for(i=0; iaBest[i].iCol = i; } @@ -105356,19 +105356,19 @@ static const FuncDef statInitFuncdef = { #ifdef SQLITE_ENABLE_STAT4 /* -** pNew and pOld are both candidate non-periodic samples selected for -** the same column (pNew->iCol==pOld->iCol). Ignoring this column and +** pNew and pOld are both candidate non-periodic samples selected for +** the same column (pNew->iCol==pOld->iCol). Ignoring this column and ** considering only any trailing columns and the sample hash value, this ** function returns true if sample pNew is to be preferred over pOld. ** In other words, if we assume that the cardinalities of the selected ** column for pNew and pOld are equal, is pNew to be preferred over pOld. ** ** This function assumes that for each argument sample, the contents of -** the anEq[] array from pSample->anEq[pSample->iCol+1] onwards are valid. +** the anEq[] array from pSample->anEq[pSample->iCol+1] onwards are valid. */ static int sampleIsBetterPost( - Stat4Accum *pAccum, - Stat4Sample *pNew, + Stat4Accum *pAccum, + Stat4Sample *pNew, Stat4Sample *pOld ){ int nCol = pAccum->nCol; @@ -105388,11 +105388,11 @@ static int sampleIsBetterPost( ** Return true if pNew is to be preferred over pOld. ** ** This function assumes that for each argument sample, the contents of -** the anEq[] array from pSample->anEq[pSample->iCol] onwards are valid. +** the anEq[] array from pSample->anEq[pSample->iCol] onwards are valid. */ static int sampleIsBetter( - Stat4Accum *pAccum, - Stat4Sample *pNew, + Stat4Accum *pAccum, + Stat4Sample *pNew, Stat4Sample *pOld ){ tRowcnt nEqNew = pNew->anEq[pNew->iCol]; @@ -105430,7 +105430,7 @@ static void sampleInsert(Stat4Accum *p, Stat4Sample *pNew, int nEqZero){ Stat4Sample *pUpgrade = 0; assert( pNew->anEq[pNew->iCol]>0 ); - /* This sample is being added because the prefix that ends in column + /* This sample is being added because the prefix that ends in column ** iCol occurs many times in the table. However, if we have already ** added a sample that shares this prefix, there is no need to add ** this one. Instead, upgrade the priority of the highest priority @@ -105472,7 +105472,7 @@ static void sampleInsert(Stat4Accum *p, Stat4Sample *pNew, int nEqZero){ /* The "rows less-than" for the rowid column must be greater than that ** for the last sample in the p->a[] array. Otherwise, the samples would ** be out of order. */ - assert( p->nSample==0 + assert( p->nSample==0 || pNew->anLt[p->nCol-1] > p->a[p->nSample-1].anLt[p->nCol-1] ); /* Insert the new sample */ @@ -105675,9 +105675,9 @@ static void statGet( /* STAT4 has a parameter on this routine. */ int eCall = sqlite3_value_int(argv[1]); assert( argc==2 ); - assert( eCall==STAT_GET_STAT1 || eCall==STAT_GET_NEQ + assert( eCall==STAT_GET_STAT1 || eCall==STAT_GET_NEQ || eCall==STAT_GET_ROWID || eCall==STAT_GET_NLT - || eCall==STAT_GET_NDLT + || eCall==STAT_GET_NDLT ); if( eCall==STAT_GET_STAT1 ) #else @@ -105687,20 +105687,20 @@ static void statGet( /* Return the value to store in the "stat" column of the sqlite_stat1 ** table for this index. ** - ** The value is a string composed of a list of integers describing - ** the index. The first integer in the list is the total number of - ** entries in the index. There is one additional integer in the list + ** The value is a string composed of a list of integers describing + ** the index. The first integer in the list is the total number of + ** entries in the index. There is one additional integer in the list ** for each indexed column. This additional integer is an estimate of ** the number of rows matched by a stabbing query on the index using ** a key with the corresponding number of fields. In other words, - ** if the index is on columns (a,b) and the sqlite_stat1 value is + ** if the index is on columns (a,b) and the sqlite_stat1 value is ** "100 10 2", then SQLite estimates that: ** ** * the index contains 100 rows, ** * "WHERE a=?" matches 10 rows, and ** * "WHERE a=? AND b=?" matches 2 rows. ** - ** If D is the count of distinct values and K is the total number of + ** If D is the count of distinct values and K is the total number of ** rows, then each estimate is computed as: ** ** I = (K+D-1)/D @@ -105750,7 +105750,7 @@ static void statGet( case STAT_GET_NEQ: aCnt = p->a[p->iGet].anEq; break; case STAT_GET_NLT: aCnt = p->a[p->iGet].anLt; break; default: { - aCnt = p->a[p->iGet].anDLt; + aCnt = p->a[p->iGet].anDLt; p->iGet++; break; } @@ -105837,7 +105837,7 @@ static void analyzeOneTable( int regStat1 = iMem++; /* Value for the stat column of sqlite_stat1 */ int regPrev = iMem; /* MUST BE LAST (see below) */ #ifdef SQLITE_ENABLE_PREUPDATE_HOOK - Table *pStat1 = 0; + Table *pStat1 = 0; #endif pParse->nMem = MAX(pParse->nMem, iMem); @@ -105876,7 +105876,7 @@ static void analyzeOneTable( } #endif - /* Establish a read-lock on the table at the shared-cache level. + /* Establish a read-lock on the table at the shared-cache level. ** Open a read-only cursor on the table. Also allocate a cursor number ** to use for scanning indexes (iIdxCur). No index cursor is opened at ** this time though. */ @@ -105942,9 +105942,9 @@ static void analyzeOneTable( ** end_of_scan: */ - /* Make sure there are enough memory cells allocated to accommodate + /* Make sure there are enough memory cells allocated to accommodate ** the regPrev array and a trailing rowid (the rowid slot is required - ** when building a record to insert into the sample column of + ** when building a record to insert into the sample column of ** the sqlite_stat4 table. */ pParse->nMem = MAX(pParse->nMem, regPrev+nColTest); @@ -105955,7 +105955,7 @@ static void analyzeOneTable( VdbeComment((v, "%s", pIdx->zName)); /* Invoke the stat_init() function. The arguments are: - ** + ** ** (1) the number of columns in the index including the rowid ** (or for a WITHOUT ROWID table, the number of PK columns), ** (2) the number of columns in the key without the rowid/pk @@ -106006,7 +106006,7 @@ static void analyzeOneTable( addrNextRow = sqlite3VdbeCurrentAddr(v); if( nColTest==1 && pIdx->nKeyCol==1 && IsUniqueIndex(pIdx) ){ /* For a single-column UNIQUE index, once we have found a non-NULL - ** row, we know that all the rest will be distinct, so skip + ** row, we know that all the rest will be distinct, so skip ** subsequent distinctness tests. */ sqlite3VdbeAddOp2(v, OP_NotNull, regPrev, endDistinctTest); VdbeCoverage(v); @@ -106015,15 +106015,15 @@ static void analyzeOneTable( char *pColl = (char*)sqlite3LocateCollSeq(pParse, pIdx->azColl[i]); sqlite3VdbeAddOp2(v, OP_Integer, i, regChng); sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, i, regTemp); - aGotoChng[i] = + aGotoChng[i] = sqlite3VdbeAddOp4(v, OP_Ne, regTemp, 0, regPrev+i, pColl, P4_COLLSEQ); sqlite3VdbeChangeP5(v, SQLITE_NULLEQ); VdbeCoverage(v); } sqlite3VdbeAddOp2(v, OP_Integer, nColTest, regChng); sqlite3VdbeGoto(v, endDistinctTest); - - + + /* ** chng_addr_0: ** regPrev(0) = idx(0) @@ -106039,7 +106039,7 @@ static void analyzeOneTable( sqlite3VdbeResolveLabel(v, endDistinctTest); sqlite3DbFree(db, aGotoChng); } - + /* ** chng_addr_N: ** regRowid = idx(rowid) // STAT4 only @@ -106343,7 +106343,7 @@ static void decodeIntArray( /* ** This callback is invoked once for each index when reading the -** sqlite_stat1 table. +** sqlite_stat1 table. ** ** argv[0] = name of the table ** argv[1] = name of the index (might be NULL) @@ -106381,7 +106381,7 @@ static int analysisLoader(void *pData, int argc, char **argv, char **NotUsed){ tRowcnt *aiRowEst = 0; int nCol = pIndex->nKeyCol+1; #ifdef SQLITE_ENABLE_STAT4 - /* Index.aiRowEst may already be set here if there are duplicate + /* Index.aiRowEst may already be set here if there are duplicate ** sqlite_stat1 entries for this index. In that case just clobber ** the old data with the new instead of allocating a new array. */ if( pIndex->aiRowEst==0 ){ @@ -106438,7 +106438,7 @@ SQLITE_PRIVATE void sqlite3DeleteIndexSamples(sqlite3 *db, Index *pIdx){ #ifdef SQLITE_ENABLE_STAT4 /* ** Populate the pIdx->aAvgEq[] array based on the samples currently -** stored in pIdx->aSample[]. +** stored in pIdx->aSample[]. */ static void initAvgEq(Index *pIdx){ if( pIdx ){ @@ -106474,12 +106474,12 @@ static void initAvgEq(Index *pIdx){ pIdx->nRowEst0 = nRow; /* Set nSum to the number of distinct (iCol+1) field prefixes that - ** occur in the stat4 table for this index. Set sumEq to the sum of - ** the nEq values for column iCol for the same set (adding the value + ** occur in the stat4 table for this index. Set sumEq to the sum of + ** the nEq values for column iCol for the same set (adding the value ** only once where there exist duplicate prefixes). */ for(i=0; inSample-1) - || aSample[i].anDLt[iCol]!=aSample[i+1].anDLt[iCol] + || aSample[i].anDLt[iCol]!=aSample[i+1].anDLt[iCol] ){ sumEq += aSample[i].anEq[iCol]; nSum100 += 100; @@ -106606,7 +106606,7 @@ static int loadStatTbl( if( zIndex==0 ) continue; pIdx = findIndexOrPrimaryKey(db, zIndex, zDb); if( pIdx==0 ) continue; - /* This next condition is true if data has already been loaded from + /* This next condition is true if data has already been loaded from ** the sqlite_stat4 table. */ nCol = pIdx->nSampleCol; if( pIdx!=pPrevIdx ){ @@ -106641,7 +106641,7 @@ static int loadStatTbl( } /* -** Load content from the sqlite_stat4 table into +** Load content from the sqlite_stat4 table into ** the Index.aSample[] arrays of all indices. */ static int loadStat4(sqlite3 *db, const char *zDb){ @@ -106650,7 +106650,7 @@ static int loadStat4(sqlite3 *db, const char *zDb){ assert( db->lookaside.bDisable ); if( sqlite3FindTable(db, "sqlite_stat4", zDb) ){ rc = loadStatTbl(db, - "SELECT idx,count(*) FROM %Q.sqlite_stat4 GROUP BY idx", + "SELECT idx,count(*) FROM %Q.sqlite_stat4 GROUP BY idx", "SELECT idx,neq,nlt,ndlt,sample FROM %Q.sqlite_stat4", zDb ); @@ -106666,11 +106666,11 @@ static int loadStat4(sqlite3 *db, const char *zDb){ ** Index.aSample[] arrays. ** ** If the sqlite_stat1 table is not present in the database, SQLITE_ERROR -** is returned. In this case, even if SQLITE_ENABLE_STAT4 was defined -** during compilation and the sqlite_stat4 table is present, no data is +** is returned. In this case, even if SQLITE_ENABLE_STAT4 was defined +** during compilation and the sqlite_stat4 table is present, no data is ** read from it. ** -** If SQLITE_ENABLE_STAT4 was defined during compilation and the +** If SQLITE_ENABLE_STAT4 was defined during compilation and the ** sqlite_stat4 table is not present in the database, SQLITE_ERROR is ** returned. However, in this case, data is read from the sqlite_stat1 ** table (if it is present) before returning. @@ -106708,7 +106708,7 @@ SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3 *db, int iDb){ sInfo.db = db; sInfo.zDatabase = db->aDb[iDb].zDbSName; if( sqlite3FindTable(db, "sqlite_stat1", sInfo.zDatabase)!=0 ){ - zSql = sqlite3MPrintf(db, + zSql = sqlite3MPrintf(db, "SELECT tbl,idx,stat FROM %Q.sqlite_stat1", sInfo.zDatabase); if( zSql==0 ){ rc = SQLITE_NOMEM_BKPT; @@ -106863,7 +106863,7 @@ static void attachFunc( ** * Specified database name already being used. */ if( db->nDb>=db->aLimit[SQLITE_LIMIT_ATTACHED]+2 ){ - zErrDyn = sqlite3MPrintf(db, "too many attached databases - max %d", + zErrDyn = sqlite3MPrintf(db, "too many attached databases - max %d", db->aLimit[SQLITE_LIMIT_ATTACHED] ); goto attach_error; @@ -106876,7 +106876,7 @@ static void attachFunc( goto attach_error; } } - + /* Allocate the new entry in the db->aDb[] array and initialize the schema ** hash tables. */ @@ -106891,7 +106891,7 @@ static void attachFunc( db->aDb = aNew; pNew = &db->aDb[db->nDb]; memset(pNew, 0, sizeof(*pNew)); - + /* Open the database file. If the btree is successfully opened, use ** it to obtain the database schema. At this point the schema may ** or may not be initialized. @@ -106920,7 +106920,7 @@ static void attachFunc( if( !pNew->pSchema ){ rc = SQLITE_NOMEM_BKPT; }else if( pNew->pSchema->file_format && pNew->pSchema->enc!=ENC(db) ){ - zErrDyn = sqlite3MPrintf(db, + zErrDyn = sqlite3MPrintf(db, "attached databases must use the same text encoding as main database"); rc = SQLITE_ERROR; } @@ -106954,7 +106954,7 @@ static void attachFunc( zErrDyn = sqlite3DbStrDup(db, "Invalid key value"); rc = SQLITE_ERROR; break; - + case SQLITE_TEXT: case SQLITE_BLOB: nKey = sqlite3_value_bytes(argv[2]); @@ -106978,7 +106978,7 @@ static void attachFunc( sqlite3_free( zPath ); /* If the file was opened successfully, read the schema for the new database. - ** If this fails, or if opening the file failed, then close the file and + ** If this fails, or if opening the file failed, then close the file and ** remove the entry from the db->aDb[] array. i.e. put everything back the ** way we found it. */ @@ -107022,7 +107022,7 @@ static void attachFunc( } goto attach_error; } - + return; attach_error: @@ -107121,7 +107121,7 @@ static void codeAttach( memset(&sName, 0, sizeof(NameContext)); sName.pParse = pParse; - if( + if( SQLITE_OK!=(rc = resolveAttachExpr(&sName, pFilename)) || SQLITE_OK!=(rc = resolveAttachExpr(&sName, pDbname)) || SQLITE_OK!=(rc = resolveAttachExpr(&sName, pKey)) @@ -107157,14 +107157,14 @@ static void codeAttach( (char *)pFunc, P4_FUNCDEF); assert( pFunc->nArg==-1 || (pFunc->nArg&0xff)==pFunc->nArg ); sqlite3VdbeChangeP5(v, (u8)(pFunc->nArg)); - + /* Code an OP_Expire. For an ATTACH statement, set P1 to true (expire this ** statement only). For DETACH, set it to false (expire all existing ** statements). */ sqlite3VdbeAddOp1(v, OP_Expire, (type==SQLITE_ATTACH)); } - + attach_end: sqlite3ExprDelete(db, pFilename); sqlite3ExprDelete(db, pDbname); @@ -107530,10 +107530,10 @@ SQLITE_PRIVATE int sqlite3AuthReadCol( /* ** The pExpr should be a TK_COLUMN expression. The table referred to -** is in pTabList or else it is the NEW or OLD table of a trigger. +** is in pTabList or else it is the NEW or OLD table of a trigger. ** Check to see if it is OK to read this particular column. ** -** If the auth function returns SQLITE_IGNORE, change the TK_COLUMN +** If the auth function returns SQLITE_IGNORE, change the TK_COLUMN ** instruction into a TK_NULL. If the auth function returns SQLITE_DENY, ** then generate an error. */ @@ -107650,7 +107650,7 @@ SQLITE_PRIVATE int sqlite3AuthCheck( */ SQLITE_PRIVATE void sqlite3AuthContextPush( Parse *pParse, - AuthContext *pContext, + AuthContext *pContext, const char *zContext ){ assert( pParse ); @@ -107713,7 +107713,7 @@ struct TableLock { }; /* -** Record the fact that we want to lock a table at run-time. +** Record the fact that we want to lock a table at run-time. ** ** The table to be locked has root page iTab and is found in database iDb. ** A read or a write lock can be taken depending on isWritelock. @@ -107766,7 +107766,7 @@ SQLITE_PRIVATE void sqlite3TableLock( */ static void codeTableLocks(Parse *pParse){ int i; - Vdbe *pVdbe; + Vdbe *pVdbe; pVdbe = sqlite3GetVdbe(pParse); assert( pVdbe!=0 ); /* sqlite3GetVdbe cannot fail: VDBE already allocated */ @@ -107821,7 +107821,7 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ ** vdbe program */ v = sqlite3GetVdbe(pParse); - assert( !pParse->isMultiWrite + assert( !pParse->isMultiWrite || sqlite3VdbeAssertMayAbort(v, pParse->mayAbort)); if( v ){ sqlite3VdbeAddOp0(v, OP_Halt); @@ -107843,7 +107843,7 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ ** transaction on each used database and to verify the schema cookie ** on each used database. */ - if( db->mallocFailed==0 + if( db->mallocFailed==0 && (DbMaskNonZero(pParse->cookieMask) || pParse->pConstExpr) ){ int iDb, i; @@ -107873,8 +107873,8 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ pParse->nVtabLock = 0; #endif - /* Once all the cookies have been verified and transactions opened, - ** obtain the required table-locks. This is a no-op unless the + /* Once all the cookies have been verified and transactions opened, + ** obtain the required table-locks. This is a no-op unless the ** shared-cache feature is enabled. */ codeTableLocks(pParse); @@ -108027,7 +108027,7 @@ SQLITE_PRIVATE Table *sqlite3LocateTable( /* Read the database schema. If an error occurs, leave an error message ** and code in pParse and return NULL. */ - if( (db->mDbFlags & DBFLAG_SchemaKnownOk)==0 + if( (db->mDbFlags & DBFLAG_SchemaKnownOk)==0 && SQLITE_OK!=sqlite3ReadSchema(pParse) ){ return 0; @@ -108077,7 +108077,7 @@ SQLITE_PRIVATE Table *sqlite3LocateTable( ** sqlite3FixSrcList() for details. */ SQLITE_PRIVATE Table *sqlite3LocateTableItem( - Parse *pParse, + Parse *pParse, u32 flags, struct SrcList_item *p ){ @@ -108093,7 +108093,7 @@ SQLITE_PRIVATE Table *sqlite3LocateTableItem( } /* -** Locate the in-memory structure that describes +** Locate the in-memory structure that describes ** a particular index given the name of that index ** and the name of the database that contains the index. ** Return NULL if not found. @@ -108280,10 +108280,10 @@ SQLITE_PRIVATE void sqlite3DeleteColumnNames(sqlite3 *db, Table *pTable){ ** ** This routine just deletes the data structure. It does not unlink ** the table data structure from the hash table. But it does destroy -** memory structures of the indices and foreign keys associated with +** memory structures of the indices and foreign keys associated with ** the table. ** -** The db parameter is optional. It is needed if the Table object +** The db parameter is optional. It is needed if the Table object ** contains lookaside memory. (Table objects in the schema do not use ** lookaside memory, but some ephemeral Table objects do.) Or the ** db parameter can be used with db->pnBytesFreed to measure the memory @@ -108295,7 +108295,7 @@ static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){ #ifdef SQLITE_DEBUG /* Record the number of outstanding lookaside allocations in schema Tables ** prior to doing any free() operations. Since schema Tables do not use - ** lookaside, this number should not change. + ** lookaside, this number should not change. ** ** If malloc has already failed, it may be that it failed while allocating ** a Table object that was going to be marked ephemeral. So do not check @@ -108312,7 +108312,7 @@ static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){ assert( pIndex->pSchema==pTable->pSchema || (IsVirtual(pTable) && pIndex->idxType!=SQLITE_IDXTYPE_APPDEF) ); if( (db==0 || db->pnBytesFreed==0) && !IsVirtual(pTable) ){ - char *zName = pIndex->zName; + char *zName = pIndex->zName; TESTONLY ( Index *pOld = ) sqlite3HashInsert( &pIndex->pSchema->idxHash, zName, 0 ); @@ -108427,7 +108427,7 @@ SQLITE_PRIVATE int sqlite3FindDbName(sqlite3 *db, const char *zName){ /* ** The token *pName contains the name of a database (either "main" or ** "temp" or the name of an attached db). This routine returns the -** index of the named database in db->aDb[], or -1 if the named db +** index of the named database in db->aDb[], or -1 if the named db ** does not exist. */ SQLITE_PRIVATE int sqlite3FindDb(sqlite3 *db, Token *pName){ @@ -108443,7 +108443,7 @@ SQLITE_PRIVATE int sqlite3FindDb(sqlite3 *db, Token *pName){ ** pName1 and pName2. If the table name was fully qualified, for example: ** ** CREATE TABLE xxx.yyy (...); -** +** ** Then pName1 is set to "xxx" and pName2 "yyy". On the other hand if ** the table name is not fully qualified, i.e.: ** @@ -108532,7 +108532,7 @@ SQLITE_PRIVATE int sqlite3CheckObjectName( } } }else{ - if( pParse->nested==0 + if( pParse->nested==0 && 0==sqlite3StrNICmp(zName, "sqlite_", 7) ){ sqlite3ErrorMsg(pParse, "object name reserved for internal use: %s", @@ -108606,7 +108606,7 @@ SQLITE_PRIVATE void sqlite3StartTable( iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName); if( iDb<0 ) return; if( !OMIT_TEMPDB && isTemp && pName2->n>0 && iDb!=1 ){ - /* If creating a temp table, the name may not be qualified. Unless + /* If creating a temp table, the name may not be qualified. Unless ** the database name is "temp" anyway. */ sqlite3ErrorMsg(pParse, "temporary table name must be unqualified"); return; @@ -108706,7 +108706,7 @@ SQLITE_PRIVATE void sqlite3StartTable( ** the SQLITE_MASTER table. Note in particular that we must go ahead ** and allocate the record number for the table entry now. Before any ** PRIMARY KEY or UNIQUE keywords are parsed. Those keywords will cause - ** indices to be created and the table record must come before the + ** indices to be created and the table record must come before the ** indices. Hence, the record number for the table must be allocated ** now. */ @@ -108724,7 +108724,7 @@ SQLITE_PRIVATE void sqlite3StartTable( } #endif - /* If the file format and encoding in the database have not been set, + /* If the file format and encoding in the database have not been set, ** set them now. */ reg1 = pParse->regRowid = ++pParse->nMem; @@ -108834,7 +108834,7 @@ SQLITE_PRIVATE void sqlite3AddColumn(Parse *pParse, Token *pName, Token *pType){ memset(pCol, 0, sizeof(p->aCol[0])); pCol->zName = z; sqlite3ColumnPropertiesFromName(p, pCol); - + if( pType->n==0 ){ /* If there is no type specified, columns have the default affinity ** 'BLOB' with a default size of 4 bytes. */ @@ -108889,11 +108889,11 @@ SQLITE_PRIVATE void sqlite3AddNotNull(Parse *pParse, int onError){ ** Scan the column type name zType (length nType) and return the ** associated affinity type. ** -** This routine does a case-independent search of zType for the +** This routine does a case-independent search of zType for the ** substrings in the following table. If one of the substrings is ** found, the corresponding affinity is returned. If zType contains -** more than one of the substrings, entries toward the top of -** the table take priority. For example, if zType is 'BLOBINT', +** more than one of the substrings, entries toward the top of +** the table take priority. For example, if zType is 'BLOBINT', ** SQLITE_AFF_INTEGER is returned. ** ** Substring | Affinity @@ -109025,7 +109025,7 @@ SQLITE_PRIVATE void sqlite3AddDefaultValue( /* ** Backwards Compatibility Hack: -** +** ** Historical versions of SQLite accepted strings as column names in ** indexes and PRIMARY KEY constraints and in UNIQUE constraints. Example: ** @@ -109048,7 +109048,7 @@ static void sqlite3StringToId(Expr *p){ } /* -** Designate the PRIMARY KEY for the table. pList is a list of names +** Designate the PRIMARY KEY for the table. pList is a list of names ** of columns that form the primary key. If pList is NULL, then the ** most recently added column of the table is the primary key. ** @@ -109078,7 +109078,7 @@ SQLITE_PRIVATE void sqlite3AddPrimaryKey( int nTerm; if( pTab==0 ) goto primary_key_exit; if( pTab->tabFlags & TF_HasPrimaryKey ){ - sqlite3ErrorMsg(pParse, + sqlite3ErrorMsg(pParse, "table \"%s\" has more than one primary key", pTab->zName); goto primary_key_exit; } @@ -109180,7 +109180,7 @@ SQLITE_PRIVATE void sqlite3AddCollateType(Parse *pParse, Token *pToken){ Index *pIdx; sqlite3DbFree(db, p->aCol[i].zColl); p->aCol[i].zColl = zColl; - + /* If the column is declared as " PRIMARY KEY COLLATE ", ** then an index may have been created on this column before the ** collation type was added. Correct this if it is the case. @@ -109254,7 +109254,7 @@ SQLITE_PRIVATE void sqlite3ChangeCookie(Parse *pParse, int iDb){ sqlite3 *db = pParse->db; Vdbe *v = pParse->pVdbe; assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); - sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_SCHEMA_VERSION, + sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_SCHEMA_VERSION, (int)(1+(unsigned)db->aDb[iDb].pSchema->schema_cookie)); } @@ -109275,13 +109275,13 @@ static int identLength(const char *z){ } /* -** The first parameter is a pointer to an output buffer. The second +** The first parameter is a pointer to an output buffer. The second ** parameter is a pointer to an integer that contains the offset at ** which to write into the output buffer. This function copies the ** nul-terminated string pointed to by the third parameter, zSignedIdent, ** to the specified offset in the buffer and updates *pIdx to refer ** to the first byte after the last byte written before returning. -** +** ** If the string zSignedIdent consists entirely of alpha-numeric ** characters, does not begin with a digit and is not an SQL keyword, ** then it is copied to the output buffer exactly as it is. Otherwise, @@ -109325,7 +109325,7 @@ static char *createTableStmt(sqlite3 *db, Table *p){ n += identLength(pCol->zName) + 5; } n += identLength(p->zName); - if( n<50 ){ + if( n<50 ){ zSep = ""; zSep2 = ","; zEnd = ")"; @@ -109366,10 +109366,10 @@ static char *createTableStmt(sqlite3 *db, Table *p){ testcase( pCol->affinity==SQLITE_AFF_NUMERIC ); testcase( pCol->affinity==SQLITE_AFF_INTEGER ); testcase( pCol->affinity==SQLITE_AFF_REAL ); - + zType = azType[pCol->affinity - SQLITE_AFF_BLOB]; len = sqlite3Strlen30(zType); - assert( pCol->affinity==SQLITE_AFF_BLOB + assert( pCol->affinity==SQLITE_AFF_BLOB || pCol->affinity==sqlite3AffinityType(zType, 0) ); memcpy(&zStmt[k], zType, len); k += len; @@ -109472,7 +109472,7 @@ static int isDupColumn(Index *pIdx, int nKey, Index *pPk, int iCol){ assert( j!=XN_ROWID && j!=XN_EXPR ); for(i=0; iaiColumn[i]>=0 || j>=0 ); - if( pIdx->aiColumn[i]==j + if( pIdx->aiColumn[i]==j && sqlite3StrICmp(pIdx->azColl[i], pPk->azColl[iCol])==0 ){ return 1; @@ -109514,7 +109514,7 @@ static void recomputeColumnsNotIndexed(Index *pIdx){ ** Changes include: ** ** (1) Set all columns of the PRIMARY KEY schema object to be NOT NULL. -** (2) Convert P3 parameter of the OP_CreateBtree from BTREE_INTKEY +** (2) Convert P3 parameter of the OP_CreateBtree from BTREE_INTKEY ** into BTREE_BLOBKEY. ** (3) Bypass the creation of the sqlite_master table entry ** for the PRIMARY KEY as the primary key index is now @@ -109558,13 +109558,13 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ } /* Locate the PRIMARY KEY index. Or, if this table was originally - ** an INTEGER PRIMARY KEY table, create a new PRIMARY KEY index. + ** an INTEGER PRIMARY KEY table, create a new PRIMARY KEY index. */ if( pTab->iPKey>=0 ){ ExprList *pList; Token ipkToken; sqlite3TokenInit(&ipkToken, pTab->aCol[pTab->iPKey].zName); - pList = sqlite3ExprListAppend(pParse, 0, + pList = sqlite3ExprListAppend(pParse, 0, sqlite3ExprAlloc(db, TK_ID, &ipkToken, 0)); if( pList==0 ) return; if( IN_RENAME_OBJECT ){ @@ -109716,7 +109716,7 @@ static int isShadowTableName(sqlite3 *db, char *zName){ ** the sqlite_master table. We do not want to create it again. ** ** If the pSelect argument is not NULL, it means that this routine -** was called to create a table generated from a +** was called to create a table generated from a ** "CREATE TABLE ... AS SELECT ..." statement. The column names of ** the new table will match the result set of the SELECT. */ @@ -109815,7 +109815,7 @@ SQLITE_PRIVATE void sqlite3EndTable( sqlite3VdbeAddOp1(v, OP_Close, 0); - /* + /* ** Initialize zType for the new view or table. */ if( p->pSelect==0 ){ @@ -109894,12 +109894,12 @@ SQLITE_PRIVATE void sqlite3EndTable( Token *pEnd2 = tabOpts ? &pParse->sLastToken : pEnd; n = (int)(pEnd2->z - pParse->sNameToken.z); if( pEnd2->z[0]!=';' ) n += pEnd2->n; - zStmt = sqlite3MPrintf(db, + zStmt = sqlite3MPrintf(db, "CREATE %s %.*s", zType2, n, pParse->sNameToken.z ); } - /* A slot for the record has already been allocated in the + /* A slot for the record has already been allocated in the ** SQLITE_MASTER table. We just need to update that slot with all ** the information we've collected. */ @@ -110095,7 +110095,7 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ ** Actually, the error above is now caught prior to reaching this point. ** But the following test is still important as it does come up ** in the following: - ** + ** ** CREATE TABLE main.ex1(a); ** CREATE TEMP VIEW ex1 AS SELECT a FROM ex1; ** SELECT * FROM temp.ex1; @@ -110140,9 +110140,9 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ ** normally holds CHECK constraints on an ordinary table, but for ** a VIEW it holds the list of column names. */ - sqlite3ColumnsFromExprList(pParse, pTable->pCheck, + sqlite3ColumnsFromExprList(pParse, pTable->pCheck, &pTable->nCol, &pTable->aCol); - if( db->mallocFailed==0 + if( db->mallocFailed==0 && pParse->nErr==0 && pTable->nCol==pSel->pEList->nExpr ){ @@ -110179,7 +110179,7 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ pTable->nCol = 0; } #endif /* SQLITE_OMIT_VIEW */ - return nErr; + return nErr; } #endif /* !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) */ @@ -110215,7 +110215,7 @@ static void sqliteViewResetAll(sqlite3 *db, int idx){ ** on tables and/or indices that are the process of being deleted. ** If you are unlucky, one of those deleted indices or tables might ** have the same rootpage number as the real table or index that is -** being moved. So we cannot stop searching after the first match +** being moved. So we cannot stop searching after the first match ** because the first match might be for one of the deleted indices ** or tables and not the table/index that is actually being moved. ** We must continue looping until all tables and indices with @@ -110252,7 +110252,7 @@ SQLITE_PRIVATE void sqlite3RootPageMoved(sqlite3 *db, int iDb, int iFrom, int iT ** Also write code to modify the sqlite_master table and internal schema ** if a root-page of another table is moved by the btree-layer whilst ** erasing iTable (this can happen with an auto-vacuum database). -*/ +*/ static void destroyRootPage(Parse *pParse, int iTable, int iDb){ Vdbe *v = sqlite3GetVdbe(pParse); int r1 = sqlite3GetTempReg(pParse); @@ -110269,7 +110269,7 @@ static void destroyRootPage(Parse *pParse, int iTable, int iDb){ ** is in register NNN. See grammar rules associated with the TK_REGISTER ** token for additional information. */ - sqlite3NestedParse(pParse, + sqlite3NestedParse(pParse, "UPDATE %Q.%s SET rootpage=%d WHERE #%d AND rootpage=#%d", pParse->db->aDb[iDb].zDbSName, MASTER_NAME, iTable, r1, r1); #endif @@ -110285,7 +110285,7 @@ static void destroyRootPage(Parse *pParse, int iTable, int iDb){ static void destroyTable(Parse *pParse, Table *pTab){ /* If the database may be auto-vacuum capable (if SQLITE_OMIT_AUTOVACUUM ** is not defined), then it is important to call OP_Destroy on the - ** table and index root-pages in order, starting with the numerically + ** table and index root-pages in order, starting with the numerically ** largest root-page number. This guarantees that none of the root-pages ** to be destroyed is relocated by an earlier OP_Destroy. i.e. if the ** following were coded: @@ -110295,7 +110295,7 @@ static void destroyTable(Parse *pParse, Table *pTab){ ** OP_Destroy 5 0 ** ** and root page 5 happened to be the largest root-page number in the - ** database, then root page 5 would be moved to page 4 by the + ** database, then root page 5 would be moved to page 4 by the ** "OP_Destroy 4 0" opcode. The subsequent "OP_Destroy 5 0" would hit ** a free-list page. */ @@ -110376,7 +110376,7 @@ SQLITE_PRIVATE void sqlite3CodeDropTable(Parse *pParse, Table *pTab, int iDb, in */ pTrigger = sqlite3TriggerList(pParse, pTab); while( pTrigger ){ - assert( pTrigger->pSchema==pTab->pSchema || + assert( pTrigger->pSchema==pTab->pSchema || pTrigger->pSchema==db->aDb[1].pSchema ); sqlite3DropTriggerPtr(pParse, pTrigger); pTrigger = pTrigger->pNext; @@ -110403,7 +110403,7 @@ SQLITE_PRIVATE void sqlite3CodeDropTable(Parse *pParse, Table *pTab, int iDb, in ** created in the temp database that refers to a table in another ** database. */ - sqlite3NestedParse(pParse, + sqlite3NestedParse(pParse, "DELETE FROM %Q.%s WHERE tbl_name=%Q and type!='trigger'", pDb->zDbSName, MASTER_NAME, pTab->zName); if( !isView && !IsVirtual(pTab) ){ @@ -110491,7 +110491,7 @@ SQLITE_PRIVATE void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView, } } #endif - if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 + if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 && sqlite3StrNICmp(pTab->zName+7, "stat", 4)!=0 && sqlite3StrNICmp(pTab->zName+7, "parameters", 10)!=0 ){ sqlite3ErrorMsg(pParse, "table %s may not be dropped", pTab->zName); @@ -110616,8 +110616,8 @@ SQLITE_PRIVATE void sqlite3CreateForeignKey( } } if( j>=p->nCol ){ - sqlite3ErrorMsg(pParse, - "unknown column \"%s\" in foreign key definition", + sqlite3ErrorMsg(pParse, + "unknown column \"%s\" in foreign key definition", pFromCol->a[i].zName); goto fk_end; } @@ -110643,7 +110643,7 @@ SQLITE_PRIVATE void sqlite3CreateForeignKey( pFKey->aAction[1] = (u8)((flags >> 8 ) & 0xff); /* ON UPDATE action */ assert( sqlite3SchemaMutexHeld(db, 0, p->pSchema) ); - pNextTo = (FKey *)sqlite3HashInsert(&p->pSchema->fkeyHash, + pNextTo = (FKey *)sqlite3HashInsert(&p->pSchema->fkeyHash, pFKey->zTo, (void *)pFKey ); if( pNextTo==pFKey ){ @@ -110749,7 +110749,7 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){ sqlite3VdbeAddOp2(v, OP_Next, iTab, addr1+1); VdbeCoverage(v); sqlite3VdbeJumpHere(v, addr1); if( memRootPage<0 ) sqlite3VdbeAddOp2(v, OP_Clear, tnum, iDb); - sqlite3VdbeAddOp4(v, OP_OpenWrite, iIdx, tnum, iDb, + sqlite3VdbeAddOp4(v, OP_OpenWrite, iIdx, tnum, iDb, (char *)pKey, P4_KEYINFO); sqlite3VdbeChangeP5(v, OPFLAG_BULKCSR|((memRootPage>=0)?OPFLAG_P2ISREG:0)); @@ -110768,7 +110768,7 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){ ** user function that throws an exception when it is evaluated. But the ** overhead of adding a statement journal to a CREATE INDEX statement is ** very small (since most of the pages written do not contain content that - ** needs to be restored if the statement aborts), so we call + ** needs to be restored if the statement aborts), so we call ** sqlite3MayAbort() for all CREATE INDEX statements. */ sqlite3MayAbort(pParse); addr2 = sqlite3VdbeCurrentAddr(v); @@ -110841,7 +110841,7 @@ SQLITE_PRIVATE int sqlite3HasExplicitNulls(Parse *pParse, ExprList *pList){ for(i=0; inExpr; i++){ if( pList->a[i].bNulls ){ u8 sf = pList->a[i].sortFlags; - sqlite3ErrorMsg(pParse, "unsupported use of NULLS %s", + sqlite3ErrorMsg(pParse, "unsupported use of NULLS %s", (sf==0 || sf==3) ? "FIRST" : "LAST" ); return 1; @@ -110852,8 +110852,8 @@ SQLITE_PRIVATE int sqlite3HasExplicitNulls(Parse *pParse, ExprList *pList){ } /* -** Create a new index for an SQL table. pName1.pName2 is the name of the index -** and pTblList is the name of the table that is to be indexed. Both will +** Create a new index for an SQL table. pName1.pName2 is the name of the index +** and pTblList is the name of the table that is to be indexed. Both will ** be NULL for a primary key or an index that is created to satisfy a ** UNIQUE constraint. If pTable and pIndex are NULL, use pParse->pNewTable ** as the table to be indexed. pParse->pNewTable is a table that is @@ -110861,7 +110861,7 @@ SQLITE_PRIVATE int sqlite3HasExplicitNulls(Parse *pParse, ExprList *pList){ ** ** pList is a list of columns to be indexed. pList will be NULL if this ** is a primary key or unique-constraint on the most recent column added -** to the table currently under construction. +** to the table currently under construction. */ SQLITE_PRIVATE void sqlite3CreateIndex( Parse *pParse, /* All information about this parse */ @@ -110911,7 +110911,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex( */ if( pTblName!=0 ){ - /* Use the two-part index name to determine the database + /* Use the two-part index name to determine the database ** to search for the table. 'Fix' the table name to this db ** before looking up the table. */ @@ -110943,7 +110943,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex( assert( db->mallocFailed==0 || pTab==0 ); if( pTab==0 ) goto exit_create_index; if( iDb==1 && db->aDb[iDb].pSchema!=pTab->pSchema ){ - sqlite3ErrorMsg(pParse, + sqlite3ErrorMsg(pParse, "cannot create a TEMP index on non-TEMP table \"%s\"", pTab->zName); goto exit_create_index; @@ -110960,7 +110960,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex( assert( pTab!=0 ); assert( pParse->nErr==0 ); - if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 + if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 && db->init.busy==0 && pTblName!=0 #if SQLITE_USER_AUTHENTICATION @@ -110988,7 +110988,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex( /* ** Find the name of the index. Make sure there is not already another - ** index or table with the same name. + ** index or table with the same name. ** ** Exception: If we are reading the names of permanent indices from the ** sqlite_master table (because some other process changed the schema) and @@ -111086,8 +111086,8 @@ SQLITE_PRIVATE void sqlite3CreateIndex( } } - /* - ** Allocate the index structure. + /* + ** Allocate the index structure. */ nName = sqlite3Strlen30(zName); nExtraCol = pPk ? pPk->nKeyCol : 1; @@ -111200,7 +111200,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex( int x = pPk->aiColumn[j]; assert( x>=0 ); if( isDupColumn(pIndex, pIndex->nKeyCol, pPk, j) ){ - pIndex->nColumn--; + pIndex->nColumn--; }else{ testcase( hasColumn(pIndex->aiColumn,pIndex->nKeyCol,x) ); pIndex->aiColumn[i] = x; @@ -111219,7 +111219,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex( /* If this index contains every column of its table, then mark ** it as a covering index */ - assert( HasRowid(pTab) + assert( HasRowid(pTab) || pTab->iPKey<0 || sqlite3ColumnOfIndex(pIndex, pTab->iPKey)>=0 ); recomputeColumnsNotIndexed(pIndex); if( pTblName!=0 && pIndex->nColumn>=pTab->nCol ){ @@ -111275,13 +111275,13 @@ SQLITE_PRIVATE void sqlite3CreateIndex( if( pIdx->onError!=pIndex->onError ){ /* This constraint creates the same index as a previous ** constraint specified somewhere in the CREATE TABLE statement. - ** However the ON CONFLICT clauses are different. If both this + ** However the ON CONFLICT clauses are different. If both this ** constraint and the previous equivalent constraint have explicit ** ON CONFLICT clauses this is an error. Otherwise, use the ** explicitly specified behavior for the index. */ if( !(pIdx->onError==OE_Default || pIndex->onError==OE_Default) ){ - sqlite3ErrorMsg(pParse, + sqlite3ErrorMsg(pParse, "conflicting ON CONFLICT clauses specified", 0); } if( pIdx->onError==OE_Default ){ @@ -111302,7 +111302,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex( if( !IN_RENAME_OBJECT ){ /* Link the new Index structure to its table and to the other - ** in-memory database structures. + ** in-memory database structures. */ assert( pParse->nErr==0 ); if( db->init.busy ){ @@ -111317,7 +111317,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex( goto exit_create_index; } } - p = sqlite3HashInsert(&pIndex->pSchema->idxHash, + p = sqlite3HashInsert(&pIndex->pSchema->idxHash, pIndex->zName, pIndex); if( p ){ assert( p==pIndex ); /* Malloc must have failed */ @@ -111351,9 +111351,9 @@ SQLITE_PRIVATE void sqlite3CreateIndex( sqlite3BeginWriteOperation(pParse, 1, iDb); /* Create the rootpage for the index using CreateIndex. But before - ** doing so, code a Noop instruction and store its address in - ** Index.tnum. This is required in case this index is actually a - ** PRIMARY KEY and the table is actually a WITHOUT ROWID table. In + ** doing so, code a Noop instruction and store its address in + ** Index.tnum. This is required in case this index is actually a + ** PRIMARY KEY and the table is actually a WITHOUT ROWID table. In ** that case the convertToWithoutRowidTable() routine will replace ** the Noop with a Goto to jump over the VDBE code generated below. */ pIndex->tnum = sqlite3VdbeAddOp0(v, OP_Noop); @@ -111377,7 +111377,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex( /* Add an entry in sqlite_master for this index */ - sqlite3NestedParse(pParse, + sqlite3NestedParse(pParse, "INSERT INTO %Q.%s VALUES('index',%Q,%Q,#%d,%Q);", db->aDb[iDb].zDbSName, MASTER_NAME, pIndex->zName, @@ -111406,7 +111406,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex( ** sure all indices labeled OE_Replace come after all those labeled ** OE_Ignore. This is necessary for the correct constraint check ** processing (in sqlite3GenerateConstraintChecks()) as part of - ** UPDATE and INSERT statements. + ** UPDATE and INSERT statements. */ if( db->init.busy || pTblName==0 ){ if( onError!=OE_Replace || pTab->pIndex==0 @@ -111466,7 +111466,7 @@ SQLITE_PRIVATE void sqlite3DefaultRowEst(Index *pIdx){ /* Indexes with default row estimates should not have stat1 data */ assert( !pIdx->hasStat1 ); - /* Set the first entry (number of rows in the index) to the estimated + /* Set the first entry (number of rows in the index) to the estimated ** number of rows in the table, or half the number of rows in the table ** for a partial index. But do not let the estimate drop below 10. */ a[0] = pIdx->pTable->nRowLogEst; @@ -111750,7 +111750,7 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge( ** database name prefix. Like this: "database.table". The pDatabase ** points to the table name and the pTable points to the database name. ** The SrcList.a[].zName field is filled with the table name which might -** come from pTable (if pDatabase is NULL) or from pDatabase. +** come from pTable (if pDatabase is NULL) or from pDatabase. ** SrcList.a[].zDatabase is filled with the database name from pTable, ** or with NULL if no database is specified. ** @@ -111881,7 +111881,7 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm( struct SrcList_item *pItem; sqlite3 *db = pParse->db; if( !p && (pOn || pUsing) ){ - sqlite3ErrorMsg(pParse, "a JOIN clause is required before %s", + sqlite3ErrorMsg(pParse, "a JOIN clause is required before %s", (pOn ? "ON" : "USING") ); goto append_from_error; @@ -111916,7 +111916,7 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm( } /* -** Add an INDEXED BY or NOT INDEXED clause to the most recently added +** Add an INDEXED BY or NOT INDEXED clause to the most recently added ** element of the source-list passed as the second argument. */ SQLITE_PRIVATE void sqlite3SrcListIndexedBy(Parse *pParse, SrcList *p, Token *pIndexedBy){ @@ -111929,7 +111929,7 @@ SQLITE_PRIVATE void sqlite3SrcListIndexedBy(Parse *pParse, SrcList *p, Token *pI assert( pItem->fg.isIndexedBy==0 ); assert( pItem->fg.isTabFunc==0 ); if( pIndexedBy->n==1 && !pIndexedBy->z ){ - /* A "NOT INDEXED" clause was supplied. See parse.y + /* A "NOT INDEXED" clause was supplied. See parse.y ** construct "indexed_opt" for details. */ pItem->fg.notIndexed = 1; }else{ @@ -112019,7 +112019,7 @@ SQLITE_PRIVATE void sqlite3EndTransaction(Parse *pParse, int eType){ assert( pParse->db!=0 ); assert( eType==TK_COMMIT || eType==TK_END || eType==TK_ROLLBACK ); isRollback = eType==TK_ROLLBACK; - if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, + if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, isRollback ? "ROLLBACK" : "COMMIT", 0, 0) ){ return; } @@ -112031,7 +112031,7 @@ SQLITE_PRIVATE void sqlite3EndTransaction(Parse *pParse, int eType){ /* ** This function is called by the parser when it parses a command to create, -** release or rollback an SQL savepoint. +** release or rollback an SQL savepoint. */ SQLITE_PRIVATE void sqlite3Savepoint(Parse *pParse, int op, Token *pName){ char *zName = sqlite3NameFromToken(pParse->db, pName); @@ -112058,7 +112058,7 @@ SQLITE_PRIVATE int sqlite3OpenTempDatabase(Parse *pParse){ if( db->aDb[1].pBt==0 && !pParse->explain ){ int rc; Btree *pBt; - static const int flags = + static const int flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_EXCLUSIVE | @@ -112104,7 +112104,7 @@ SQLITE_PRIVATE void sqlite3CodeVerifySchema(Parse *pParse, int iDb){ } /* -** If argument zDb is NULL, then call sqlite3CodeVerifySchema() for each +** If argument zDb is NULL, then call sqlite3CodeVerifySchema() for each ** attached database. Otherwise, invoke it for the database named zDb only. */ SQLITE_PRIVATE void sqlite3CodeVerifyNamedSchema(Parse *pParse, const char *zDb){ @@ -112150,9 +112150,9 @@ SQLITE_PRIVATE void sqlite3MultiWrite(Parse *pParse){ pToplevel->isMultiWrite = 1; } -/* +/* ** The code generator calls this routine if is discovers that it is -** possible to abort a statement prior to completion. In order to +** possible to abort a statement prior to completion. In order to ** perform this abort without corrupting the database, we need to make ** sure that the statement is protected by a statement transaction. ** @@ -112161,7 +112161,7 @@ SQLITE_PRIVATE void sqlite3MultiWrite(Parse *pParse){ ** such that the abort must occur after the multiwrite. This makes ** some statements involving the REPLACE conflict resolution algorithm ** go a little faster. But taking advantage of this time dependency -** makes it more difficult to prove that the code is correct (in +** makes it more difficult to prove that the code is correct (in ** particular, it prevents us from writing an effective ** implementation of sqlite3AssertMayAbort()) and so we have chosen ** to take the safe route and skip the optimization. @@ -112206,7 +112206,7 @@ SQLITE_PRIVATE void sqlite3UniqueConstraint( StrAccum errMsg; Table *pTab = pIdx->pTable; - sqlite3StrAccumInit(&errMsg, pParse->db, 0, 0, + sqlite3StrAccumInit(&errMsg, pParse->db, 0, 0, pParse->db->aLimit[SQLITE_LIMIT_LENGTH]); if( pIdx->aColExpr ){ sqlite3_str_appendf(&errMsg, "index '%q'", pIdx->zName); @@ -112222,8 +112222,8 @@ SQLITE_PRIVATE void sqlite3UniqueConstraint( } } zErr = sqlite3StrAccumFinish(&errMsg); - sqlite3HaltConstraint(pParse, - IsPrimaryKeyIndex(pIdx) ? SQLITE_CONSTRAINT_PRIMARYKEY + sqlite3HaltConstraint(pParse, + IsPrimaryKeyIndex(pIdx) ? SQLITE_CONSTRAINT_PRIMARYKEY : SQLITE_CONSTRAINT_UNIQUE, onError, zErr, P4_DYNAMIC, P5_ConstraintUnique); } @@ -112235,7 +112235,7 @@ SQLITE_PRIVATE void sqlite3UniqueConstraint( SQLITE_PRIVATE void sqlite3RowidConstraint( Parse *pParse, /* Parsing context */ int onError, /* Conflict resolution algorithm */ - Table *pTab /* The table with the non-unique rowid */ + Table *pTab /* The table with the non-unique rowid */ ){ char *zMsg; int rc; @@ -112429,9 +112429,9 @@ SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoOfIndex(Parse *pParse, Index *pIdx){ } #ifndef SQLITE_OMIT_CTE -/* -** This routine is invoked once per CTE by the parser while parsing a -** WITH clause. +/* +** This routine is invoked once per CTE by the parser while parsing a +** WITH clause. */ SQLITE_PRIVATE With *sqlite3WithAdd( Parse *pParse, /* Parsing context */ @@ -112500,7 +112500,7 @@ SQLITE_PRIVATE void sqlite3WithDelete(sqlite3 *db, With *pWith){ /************** End of build.c ***********************************************/ /************** Begin file callback.c ****************************************/ /* -** 2005 May 23 +** 2005 May 23 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: @@ -112570,8 +112570,8 @@ static int synthCollSeq(sqlite3 *db, CollSeq *pColl){ ** This function is responsible for invoking the collation factory callback ** or substituting a collation sequence of a different encoding when the ** requested collation sequence is not available in the desired encoding. -** -** If it is not NULL, then pColl must point to the database native encoding +** +** If it is not NULL, then pColl must point to the database native encoding ** collation sequence with name zName, length nName. ** ** The return value is either the collation sequence to be used in database @@ -112618,7 +112618,7 @@ SQLITE_PRIVATE CollSeq *sqlite3GetCollSeq( ** that have not been defined by sqlite3_create_collation() etc. ** ** If required, this routine calls the 'collation needed' callback to -** request a definition of the collating sequence. If this doesn't work, +** request a definition of the collating sequence. If this doesn't work, ** an equivalent collating sequence that uses a text encoding different ** from the main database is substituted, if one is available. */ @@ -112672,7 +112672,7 @@ static CollSeq *findCollSeqEntry( memcpy(pColl[0].zName, zName, nName); pDel = sqlite3HashInsert(&db->aCollSeq, pColl[0].zName, pColl); - /* If a malloc() failure occurred in sqlite3HashInsert(), it will + /* If a malloc() failure occurred in sqlite3HashInsert(), it will ** return the pColl pointer to be deleted (because it wasn't added ** to the hash table). */ @@ -112730,7 +112730,7 @@ SQLITE_PRIVATE CollSeq *sqlite3FindCollSeq( ** is also -1. In other words, we are searching for a function that ** takes a variable number of arguments. ** -** If nArg is -2 that means that we are searching for any function +** If nArg is -2 that means that we are searching for any function ** regardless of the number of arguments it uses, so return a positive ** match score for any ** @@ -112823,8 +112823,8 @@ SQLITE_PRIVATE void sqlite3InsertBuiltinFuncs( } } } - - + + /* ** Locate a user function given a name, a number of arguments and a flag @@ -112885,7 +112885,7 @@ SQLITE_PRIVATE FuncDef *sqlite3FindFunction( ** have fields overwritten with new information appropriate for the ** new function. But the FuncDefs for built-in functions are read-only. ** So we must not search for built-ins when creating a new function. - */ + */ if( !createFlag && (pBest==0 || (db->mDbFlags & DBFLAG_PreferBuiltin)!=0) ){ bestScore = 0; h = SQLITE_FUNC_HASH(sqlite3UpperToLower[(u8)zName[0]], nName); @@ -112904,7 +112904,7 @@ SQLITE_PRIVATE FuncDef *sqlite3FindFunction( ** exact match for the name, number of arguments and encoding, then add a ** new entry to the hash table and return it. */ - if( createFlag && bestScorenested==0; } assert( pTab->tabFlags & TF_Shadow ); - return (db->flags & SQLITE_Defensive)!=0 + return (db->flags & SQLITE_Defensive)!=0 #ifndef SQLITE_OMIT_VIRTUALTABLE && db->pVtabCtx==0 #endif @@ -113117,7 +113117,7 @@ SQLITE_PRIVATE void sqlite3MaterializeView( assert( pFrom->a[0].pOn==0 ); assert( pFrom->a[0].pUsing==0 ); } - pSel = sqlite3SelectNew(pParse, 0, pFrom, pWhere, 0, 0, pOrderBy, + pSel = sqlite3SelectNew(pParse, 0, pFrom, pWhere, 0, 0, pOrderBy, SF_IncludeHidden, pLimit); sqlite3SelectDestInit(&dest, SRT_EphemTab, iCur); sqlite3Select(pParse, pSel, &dest); @@ -113166,11 +113166,11 @@ SQLITE_PRIVATE Expr *sqlite3LimitWhere( return pWhere; } - /* Generate a select expression tree to enforce the limit/offset + /* Generate a select expression tree to enforce the limit/offset ** term for the DELETE or UPDATE statement. For example: ** DELETE FROM table_a WHERE col1=1 ORDER BY col2 LIMIT 1 OFFSET 1 ** becomes: - ** DELETE FROM table_a WHERE rowid IN ( + ** DELETE FROM table_a WHERE rowid IN ( ** SELECT rowid FROM table_a WHERE col1=1 ORDER BY col2 LIMIT 1 OFFSET 1 ** ); */ @@ -113208,7 +113208,7 @@ SQLITE_PRIVATE Expr *sqlite3LimitWhere( pSrc->a[0].pIBIndex = 0; /* generate the SELECT expression tree. */ - pSelect = sqlite3SelectNew(pParse, pEList, pSelectSrc, pWhere, 0 ,0, + pSelect = sqlite3SelectNew(pParse, pEList, pSelectSrc, pWhere, 0 ,0, pOrderBy,0,pLimit ); @@ -113264,7 +113264,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( int addrEphOpen = 0; /* Instruction to open the Ephemeral table */ int bComplex; /* True if there are triggers or FKs or ** subqueries in the WHERE clause */ - + #ifndef SQLITE_OMIT_TRIGGER int isView; /* True if attempting to delete from a view */ Trigger *pTrigger; /* List of table triggers, if required */ @@ -113323,7 +113323,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( } iDb = sqlite3SchemaToIndex(db, pTab->pSchema); assert( iDbnDb ); - rcauth = sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, + rcauth = sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, db->aDb[iDb].zDbSName); assert( rcauth==SQLITE_OK || rcauth==SQLITE_DENY || rcauth==SQLITE_IGNORE ); if( rcauth==SQLITE_DENY ){ @@ -113359,7 +113359,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( */ #if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) if( isView ){ - sqlite3MaterializeView(pParse, pTab, + sqlite3MaterializeView(pParse, pTab, pWhere, pOrderBy, pLimit, iTabCur ); iDataCur = iIdxCur = iTabCur; @@ -113391,7 +113391,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( #ifndef SQLITE_OMIT_TRUNCATE_OPTIMIZATION /* Special case: A DELETE without a WHERE clause deletes everything. ** It is easier just to erase the whole table. Prior to version 3.6.5, - ** this optimization caused the row change count (the value returned by + ** this optimization caused the row change count (the value returned by ** API function sqlite3_count_changes) to be set incorrectly. ** ** The "rcauth==SQLITE_OK" terms is the @@ -113442,7 +113442,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( addrEphOpen = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iEphCur, nPk); sqlite3VdbeSetP4KeyInfo(pParse, pPk); } - + /* Construct a query to find the rowid or primary key for every row ** to be deleted, based on the WHERE clause. Set variable eOnePass ** to indicate the strategy used to implement this delete: @@ -113457,12 +113457,12 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( assert( IsVirtual(pTab)==0 || eOnePass!=ONEPASS_MULTI ); assert( IsVirtual(pTab) || bComplex || eOnePass!=ONEPASS_OFF ); if( eOnePass!=ONEPASS_SINGLE ) sqlite3MultiWrite(pParse); - + /* Keep track of the number of rows to be deleted */ if( memCnt ){ sqlite3VdbeAddOp2(v, OP_AddImm, memCnt, 1); } - + /* Extract the rowid or primary key for the current row */ if( pPk ){ for(i=0; inMem; sqlite3ExprCodeGetColumnOfTable(v, pTab, iTabCur, -1, iKey); } - + if( eOnePass!=ONEPASS_OFF ){ /* For ONEPASS, no need to store the rowid/primary-key. There is only ** one, so just keep it in its register(s) and fall through to the @@ -113505,18 +113505,18 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( sqlite3VdbeAddOp2(v, OP_RowSetAdd, iRowSet, iKey); } } - - /* If this DELETE cannot use the ONEPASS strategy, this is the + + /* If this DELETE cannot use the ONEPASS strategy, this is the ** end of the WHERE loop */ if( eOnePass!=ONEPASS_OFF ){ addrBypass = sqlite3VdbeMakeLabel(pParse); }else{ sqlite3WhereEnd(pWInfo); } - - /* Unless this is a view, open cursors for the table we are + + /* Unless this is a view, open cursors for the table we are ** deleting from and all its indices. If this is a view, then the - ** only effect this statement has is to fire the INSTEAD OF + ** only effect this statement has is to fire the INSTEAD OF ** triggers. */ if( !isView ){ @@ -113531,7 +113531,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( assert( pPk || IsVirtual(pTab) || iIdxCur==iDataCur+1 ); if( eOnePass==ONEPASS_MULTI ) sqlite3VdbeJumpHere(v, iAddrOnce); } - + /* Set up a loop over the rowids/primary-keys that were found in the ** where-clause loop above. */ @@ -113554,8 +113554,8 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( addrLoop = sqlite3VdbeAddOp3(v, OP_RowSetRead, iRowSet, 0, iKey); VdbeCoverage(v); assert( nKey==1 ); - } - + } + /* Delete the row */ #ifndef SQLITE_OMIT_VIRTUALTABLE if( IsVirtual(pTab) ){ @@ -113578,7 +113578,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur, iKey, nKey, count, OE_Default, eOnePass, aiCurOnePass[1]); } - + /* End of the loop over all rowids/primary-keys. */ if( eOnePass!=ONEPASS_OFF ){ sqlite3VdbeResolveLabel(v, addrBypass); @@ -113589,7 +113589,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( }else{ sqlite3VdbeGoto(v, addrLoop); sqlite3VdbeJumpHere(v, addrLoop); - } + } } /* End non-truncate path */ /* Update the sqlite_sequence table by storing the content of the @@ -113600,7 +113600,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( sqlite3AutoincrementEnd(pParse); } - /* Return the number of rows that were deleted. If this routine is + /* Return the number of rows that were deleted. If this routine is ** generating code because of a call to sqlite3NestedParse(), do not ** invoke the callback function. */ @@ -113614,7 +113614,7 @@ delete_from_cleanup: sqlite3AuthContextPop(&sContext); sqlite3SrcListDelete(db, pTabList); sqlite3ExprDelete(db, pWhere); -#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) +#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) sqlite3ExprListDelete(db, pOrderBy); sqlite3ExprDelete(db, pLimit); #endif @@ -113659,7 +113659,7 @@ delete_from_cleanup: ** and nPk before reading from it. ** ** If eMode is ONEPASS_MULTI, then this call is being made as part -** of a ONEPASS delete that affects multiple rows. In this case, if +** of a ONEPASS delete that affects multiple rows. In this case, if ** iIdxNoSeek is a valid cursor number (>=0) and is not the same as ** iDataCur, then its position should be preserved following the delete ** operation. Or, if iIdxNoSeek is not a valid cursor number, the @@ -113695,7 +113695,7 @@ SQLITE_PRIVATE void sqlite3GenerateRowDelete( VdbeModuleComment((v, "BEGIN: GenRowDel(%d,%d,%d,%d)", iDataCur, iIdxCur, iPk, (int)nPk)); - /* Seek cursor iCur to the row to delete. If this row no longer exists + /* Seek cursor iCur to the row to delete. If this row no longer exists ** (this can happen if a trigger program has already deleted it), do ** not attempt to delete it or fire any DELETE triggers. */ iLabel = sqlite3VdbeMakeLabel(pParse); @@ -113705,7 +113705,7 @@ SQLITE_PRIVATE void sqlite3GenerateRowDelete( VdbeCoverageIf(v, opSeek==OP_NotExists); VdbeCoverageIf(v, opSeek==OP_NotFound); } - + /* If there are any triggers to fire, allocate a range of registers to ** use for the old.* references in the triggers. */ if( sqlite3FkRequired(pParse, pTab, 0, 0) || pTrigger ){ @@ -113722,7 +113722,7 @@ SQLITE_PRIVATE void sqlite3GenerateRowDelete( iOld = pParse->nMem+1; pParse->nMem += (1 + pTab->nCol); - /* Populate the OLD.* pseudo-table register array. These values will be + /* Populate the OLD.* pseudo-table register array. These values will be ** used by any BEFORE and AFTER triggers that exist. */ sqlite3VdbeAddOp2(v, OP_Copy, iPk, iOld); for(iCol=0; iColnCol; iCol++){ @@ -113735,11 +113735,11 @@ SQLITE_PRIVATE void sqlite3GenerateRowDelete( /* Invoke BEFORE DELETE trigger programs. */ addrStart = sqlite3VdbeCurrentAddr(v); - sqlite3CodeRowTrigger(pParse, pTrigger, + sqlite3CodeRowTrigger(pParse, pTrigger, TK_DELETE, 0, TRIGGER_BEFORE, pTab, iOld, onconf, iLabel ); - /* If any BEFORE triggers were coded, then seek the cursor to the + /* If any BEFORE triggers were coded, then seek the cursor to the ** row to be deleted again. It may be that the BEFORE triggers moved ** the cursor or already deleted the row that the cursor was ** pointing to. @@ -113756,21 +113756,21 @@ SQLITE_PRIVATE void sqlite3GenerateRowDelete( } /* Do FK processing. This call checks that any FK constraints that - ** refer to this table (i.e. constraints attached to other tables) + ** refer to this table (i.e. constraints attached to other tables) ** are not violated by deleting this row. */ sqlite3FkCheck(pParse, pTab, iOld, 0, 0, 0); } /* Delete the index and table entries. Skip this step if pTab is really ** a view (in which case the only effect of the DELETE statement is to - ** fire the INSTEAD OF triggers). + ** fire the INSTEAD OF triggers). ** ** If variable 'count' is non-zero, then this OP_Delete instruction should ** invoke the update-hook. The pre-update-hook, on the other hand should ** be invoked unless table pTab is a system table. The difference is that - ** the update-hook is not invoked for rows removed by REPLACE, but the + ** the update-hook is not invoked for rows removed by REPLACE, but the ** pre-update-hook is. - */ + */ if( pTab->pSelect==0 ){ u8 p5 = 0; sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur,0,iIdxNoSeek); @@ -113790,16 +113790,16 @@ SQLITE_PRIVATE void sqlite3GenerateRowDelete( /* Do any ON CASCADE, SET NULL or SET DEFAULT operations required to ** handle rows (possibly in other tables) that refer via a foreign key - ** to the row just deleted. */ + ** to the row just deleted. */ sqlite3FkActions(pParse, pTab, 0, iOld, 0, 0); /* Invoke AFTER DELETE trigger programs. */ - sqlite3CodeRowTrigger(pParse, pTrigger, + sqlite3CodeRowTrigger(pParse, pTrigger, TK_DELETE, 0, TRIGGER_AFTER, pTab, iOld, onconf, iLabel ); /* Jump here if the row had already been deleted before any BEFORE - ** trigger programs were invoked. Or if a trigger program throws a + ** trigger programs were invoked. Or if a trigger program throws a ** RAISE(IGNORE) exception. */ sqlite3VdbeResolveLabel(v, iLabel); VdbeModuleComment((v, "END: GenRowDel()")); @@ -113883,7 +113883,7 @@ SQLITE_PRIVATE void sqlite3GenerateRowIndexDelete( ** its key into the same sequence of registers and if pPrior and pIdx share ** a column in common, then the register corresponding to that column already ** holds the correct value and the loading of that register is skipped. -** This optimization is helpful when doing a DELETE or an INTEGRITY_CHECK +** This optimization is helpful when doing a DELETE or an INTEGRITY_CHECK ** on a table with multiple indices, and especially with the ROWID or ** PRIMARY KEY columns of the index. */ @@ -113906,7 +113906,7 @@ SQLITE_PRIVATE int sqlite3GenerateIndexKey( if( pIdx->pPartIdxWhere ){ *piPartIdxLabel = sqlite3VdbeMakeLabel(pParse); pParse->iSelfTab = iDataCur + 1; - sqlite3ExprIfFalseDup(pParse, pIdx->pPartIdxWhere, *piPartIdxLabel, + sqlite3ExprIfFalseDup(pParse, pIdx->pPartIdxWhere, *piPartIdxLabel, SQLITE_JUMPIFNULL); pParse->iSelfTab = 0; }else{ @@ -114098,7 +114098,7 @@ static void lengthFunc( ** Implementation of the abs() function. ** ** IMP: R-23979-26855 The abs(X) function returns the absolute value of -** the numeric argument X. +** the numeric argument X. */ static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ assert( argc==1 ); @@ -114115,7 +114115,7 @@ static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ return; } iVal = -iVal; - } + } sqlite3_result_int64(context, iVal); break; } @@ -114367,7 +114367,7 @@ static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ */ if( r<-4503599627370496.0 || r>+4503599627370496.0 ){ /* The value has no fractional part so there is nothing to round */ - }else if( n==0 ){ + }else if( n==0 ){ r = (double)((sqlite_int64)(r+(r<0?-0.5:+0.5))); }else{ zBuf = sqlite3_mprintf("%.*f",n,r); @@ -114460,7 +114460,7 @@ static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ #define noopFunc versionFunc /* Substitute function - never called */ /* -** Implementation of random(). Return a random integer. +** Implementation of random(). Return a random integer. */ static void randomFunc( sqlite3_context *context, @@ -114471,11 +114471,11 @@ static void randomFunc( UNUSED_PARAMETER2(NotUsed, NotUsed2); sqlite3_randomness(sizeof(r), &r); if( r<0 ){ - /* We need to prevent a random number of 0x8000000000000000 + /* We need to prevent a random number of 0x8000000000000000 ** (or -9223372036854775808) since when you do abs() of that ** number of you get the same value back again. To do this ** in a way that is testable, mask the sign bit off of negative - ** values, resulting in a positive value. Then take the + ** values, resulting in a positive value. Then take the ** 2s complement of that positive value. The end result can ** therefore be no less than -9223372036854775807. */ @@ -114513,8 +114513,8 @@ static void randomBlob( ** value is the same as the sqlite3_last_insert_rowid() API function. */ static void last_insert_rowid( - sqlite3_context *context, - int NotUsed, + sqlite3_context *context, + int NotUsed, sqlite3_value **NotUsed2 ){ sqlite3 *db = sqlite3_context_db_handle(context); @@ -114622,7 +114622,7 @@ static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 }; ** it the last character in the list. ** ** Like matching rules: -** +** ** '%' Matches any sequence of zero or more characters ** *** '_' Matches any one character @@ -114645,7 +114645,7 @@ static int patternCompare( u32 matchAll = pInfo->matchAll; /* "*" or "%" */ u8 noCase = pInfo->noCase; /* True if uppercase==lowercase */ const u8 *zEscaped = 0; /* One past the last escaped input char */ - + while( (c = Utf8Read(zPattern))!=0 ){ if( c==matchAll ){ /* Match "*" */ /* Skip over multiple "*" characters in the pattern. If there @@ -114801,8 +114801,8 @@ SQLITE_API int sqlite3_like_count = 0; ** the GLOB operator. */ static void likeFunc( - sqlite3_context *context, - int argc, + sqlite3_context *context, + int argc, sqlite3_value **argv ){ const unsigned char *zA, *zB; @@ -114840,7 +114840,7 @@ static void likeFunc( const unsigned char *zEsc = sqlite3_value_text(argv[2]); if( zEsc==0 ) return; if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){ - sqlite3_result_error(context, + sqlite3_result_error(context, "ESCAPE expression must be a single character", -1); return; } @@ -114947,8 +114947,8 @@ static void compileoptionusedFunc( #endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ /* -** Implementation of the sqlite_compileoption_get() function. -** The result is a string that identifies the compiler options +** Implementation of the sqlite_compileoption_get() function. +** The result is a string that identifies the compiler options ** used to build SQLite. */ #ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS @@ -114972,7 +114972,7 @@ static void compileoptiongetFunc( ** digits. */ static const char hexdigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', - '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; /* @@ -115007,7 +115007,7 @@ static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ char const *zBlob = sqlite3_value_blob(argv[0]); int nBlob = sqlite3_value_bytes(argv[0]); assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */ - zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4); + zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4); if( zText ){ int i; for(i=0; in>0x7fffffff || p->bInverse || p->n==sqlite3_aggregate_count(context) ); #endif -} +} static void countFinalize(sqlite3_context *context){ CountCtx *p; p = sqlite3_aggregate_context(context, 0); @@ -115594,7 +115594,7 @@ static void countInverse(sqlite3_context *ctx, int argc, sqlite3_value **argv){ p->bInverse = 1; #endif } -} +} #else # define countInverse 0 #endif /* SQLITE_OMIT_WINDOWFUNC */ @@ -115603,8 +115603,8 @@ static void countInverse(sqlite3_context *ctx, int argc, sqlite3_value **argv){ ** Routines to implement min() and max() aggregate functions. */ static void minmaxStep( - sqlite3_context *context, - int NotUsed, + sqlite3_context *context, + int NotUsed, sqlite3_value **argv ){ Mem *pArg = (Mem *)argv[0]; @@ -115736,8 +115736,8 @@ static void groupConcatFinalize(sqlite3_context *context){ sqlite3_result_error_toobig(context); }else if( pAccum->accError==SQLITE_NOMEM ){ sqlite3_result_error_nomem(context); - }else{ - sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1, + }else{ + sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1, sqlite3_free); } } @@ -115751,7 +115751,7 @@ static void groupConcatValue(sqlite3_context *context){ sqlite3_result_error_toobig(context); }else if( pAccum->accError==SQLITE_NOMEM ){ sqlite3_result_error_nomem(context); - }else{ + }else{ const char *zText = sqlite3_str_value(pAccum); sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT); } @@ -115799,7 +115799,7 @@ SQLITE_PRIVATE void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive) ** pExpr points to an expression which implements a function. If ** it is appropriate to apply the LIKE optimization to that function ** then set aWc[0] through aWc[2] to the wildcard characters and the -** escape character and then return TRUE. If the function is not a +** escape character and then return TRUE. If the function is not a ** LIKE-style function then return FALSE. ** ** The expression "a LIKE b ESCAPE c" is only considered a valid LIKE @@ -115936,15 +115936,15 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ WAGGREGATE(sum, 1,0,0, sumStep, sumFinalize, sumFinalize, sumInverse, 0), WAGGREGATE(total, 1,0,0, sumStep,totalFinalize,totalFinalize,sumInverse, 0), WAGGREGATE(avg, 1,0,0, sumStep, avgFinalize, avgFinalize, sumInverse, 0), - WAGGREGATE(count, 0,0,0, countStep, + WAGGREGATE(count, 0,0,0, countStep, countFinalize, countFinalize, countInverse, SQLITE_FUNC_COUNT ), - WAGGREGATE(count, 1,0,0, countStep, + WAGGREGATE(count, 1,0,0, countStep, countFinalize, countFinalize, countInverse, 0 ), - WAGGREGATE(group_concat, 1, 0, 0, groupConcatStep, + WAGGREGATE(group_concat, 1, 0, 0, groupConcatStep, groupConcatFinalize, groupConcatValue, groupConcatInverse, 0), - WAGGREGATE(group_concat, 2, 0, 0, groupConcatStep, + WAGGREGATE(group_concat, 2, 0, 0, groupConcatStep, groupConcatFinalize, groupConcatValue, groupConcatInverse, 0), - + LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE), #ifdef SQLITE_CASE_SENSITIVE_LIKE LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE), @@ -116011,25 +116011,25 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ ** Foreign keys in SQLite come in two flavours: deferred and immediate. ** If an immediate foreign key constraint is violated, ** SQLITE_CONSTRAINT_FOREIGNKEY is returned and the current -** statement transaction rolled back. If a -** deferred foreign key constraint is violated, no action is taken -** immediately. However if the application attempts to commit the +** statement transaction rolled back. If a +** deferred foreign key constraint is violated, no action is taken +** immediately. However if the application attempts to commit the ** transaction before fixing the constraint violation, the attempt fails. ** ** Deferred constraints are implemented using a simple counter associated -** with the database handle. The counter is set to zero each time a -** database transaction is opened. Each time a statement is executed +** with the database handle. The counter is set to zero each time a +** database transaction is opened. Each time a statement is executed ** that causes a foreign key violation, the counter is incremented. Each ** time a statement is executed that removes an existing violation from ** the database, the counter is decremented. When the transaction is ** committed, the commit fails if the current value of the counter is ** greater than zero. This scheme has two big drawbacks: ** -** * When a commit fails due to a deferred foreign key constraint, +** * When a commit fails due to a deferred foreign key constraint, ** there is no way to tell which foreign constraint is not satisfied, ** or which row it is not satisfied for. ** -** * If the database contains foreign key violations when the +** * If the database contains foreign key violations when the ** transaction is opened, this may cause the mechanism to malfunction. ** ** Despite these problems, this approach is adopted as it seems simpler @@ -116041,26 +116041,26 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ ** the parent table for a match. If none is found increment the ** constraint counter. ** -** I.2) For each FK for which the table is the parent table, +** I.2) For each FK for which the table is the parent table, ** search the child table for rows that correspond to the new ** row in the parent table. Decrement the counter for each row ** found (as the constraint is now satisfied). ** ** DELETE operations: ** -** D.1) For each FK for which the table is the child table, -** search the parent table for a row that corresponds to the -** deleted row in the child table. If such a row is not found, +** D.1) For each FK for which the table is the child table, +** search the parent table for a row that corresponds to the +** deleted row in the child table. If such a row is not found, ** decrement the counter. ** -** D.2) For each FK for which the table is the parent table, search -** the child table for rows that correspond to the deleted row +** D.2) For each FK for which the table is the parent table, search +** the child table for rows that correspond to the deleted row ** in the parent table. For each found increment the counter. ** ** UPDATE operations: ** ** An UPDATE command requires that all 4 steps above are taken, but only -** for FK constraints for which the affected columns are actually +** for FK constraints for which the affected columns are actually ** modified (values must be compared at runtime). ** ** Note that I.1 and D.1 are very similar operations, as are I.2 and D.2. @@ -116069,10 +116069,10 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ ** For the purposes of immediate FK constraints, the OR REPLACE conflict ** resolution is considered to delete rows before the new row is inserted. ** If a delete caused by OR REPLACE violates an FK constraint, an exception -** is thrown, even if the FK constraint would be satisfied after the new +** is thrown, even if the FK constraint would be satisfied after the new ** row is inserted. ** -** Immediate constraints are usually handled similarly. The only difference +** Immediate constraints are usually handled similarly. The only difference ** is that the counter used is stored as part of each individual statement ** object (struct Vdbe). If, after the statement has run, its immediate ** constraint counter is greater than zero, @@ -116083,7 +116083,7 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ ** INSERT violates a foreign key constraint. This is necessary as such ** an INSERT does not open a statement transaction. ** -** TODO: How should dropping a table be handled? How should renaming a +** TODO: How should dropping a table be handled? How should renaming a ** table be handled? ** ** @@ -116094,7 +116094,7 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ ** for those two operations needs to know whether or not the operation ** requires any FK processing and, if so, which columns of the original ** row are required by the FK processing VDBE code (i.e. if FKs were -** implemented using triggers, which of the old.* columns would be +** implemented using triggers, which of the old.* columns would be ** accessed). No information is required by the code-generator before ** coding an INSERT operation. The functions used by the UPDATE/DELETE ** generation code to query for this information are: @@ -116131,13 +116131,13 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ /* ** A foreign key constraint requires that the key columns in the parent ** table are collectively subject to a UNIQUE or PRIMARY KEY constraint. -** Given that pParent is the parent table for foreign key constraint pFKey, -** search the schema for a unique index on the parent key columns. +** Given that pParent is the parent table for foreign key constraint pFKey, +** search the schema for a unique index on the parent key columns. +** +** If successful, zero is returned. If the parent key is an INTEGER PRIMARY +** KEY column, then output variable *ppIdx is set to NULL. Otherwise, *ppIdx +** is set to point to the unique index. ** -** If successful, zero is returned. If the parent key is an INTEGER PRIMARY -** KEY column, then output variable *ppIdx is set to NULL. Otherwise, *ppIdx -** is set to point to the unique index. -** ** If the parent key consists of a single column (the foreign key constraint ** is not a composite foreign key), output variable *paiCol is set to NULL. ** Otherwise, it is set to point to an allocated array of size N, where @@ -116160,8 +116160,8 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ ** PRIMARY KEY, or ** ** 4) No parent key columns were provided explicitly as part of the -** foreign key definition, and the PRIMARY KEY of the parent table -** consists of a different number of columns to the child key in +** foreign key definition, and the PRIMARY KEY of the parent table +** consists of a different number of columns to the child key in ** the child table. ** ** then non-zero is returned, and a "foreign key mismatch" error loaded @@ -116185,9 +116185,9 @@ SQLITE_PRIVATE int sqlite3FkLocateIndex( assert( !paiCol || *paiCol==0 ); assert( pParse ); - /* If this is a non-composite (single column) foreign key, check if it - ** maps to the INTEGER PRIMARY KEY of table pParent. If so, leave *ppIdx - ** and *paiCol set to zero and return early. + /* If this is a non-composite (single column) foreign key, check if it + ** maps to the INTEGER PRIMARY KEY of table pParent. If so, leave *ppIdx + ** and *paiCol set to zero and return early. ** ** Otherwise, for a composite foreign key (more than one column), allocate ** space for the aiCol array (returned via output parameter *paiCol). @@ -116196,7 +116196,7 @@ SQLITE_PRIVATE int sqlite3FkLocateIndex( if( nCol==1 ){ /* The FK maps to the IPK if any of the following are true: ** - ** 1) There is an INTEGER PRIMARY KEY column and the FK is implicitly + ** 1) There is an INTEGER PRIMARY KEY column and the FK is implicitly ** mapped to the primary key of table pParent, or ** 2) The FK is explicitly mapped to a column declared as INTEGER ** PRIMARY KEY. @@ -116213,14 +116213,14 @@ SQLITE_PRIVATE int sqlite3FkLocateIndex( } for(pIdx=pParent->pIndex; pIdx; pIdx=pIdx->pNext){ - if( pIdx->nKeyCol==nCol && IsUniqueIndex(pIdx) && pIdx->pPartIdxWhere==0 ){ + if( pIdx->nKeyCol==nCol && IsUniqueIndex(pIdx) && pIdx->pPartIdxWhere==0 ){ /* pIdx is a UNIQUE index (or a PRIMARY KEY) and has the right number ** of columns. If each indexed column corresponds to a foreign key ** column of pFKey, then this index is a winner. */ if( zKey==0 ){ - /* If zKey is NULL, then this foreign key is implicitly mapped to - ** the PRIMARY KEY of table pParent. The PRIMARY KEY index may be + /* If zKey is NULL, then this foreign key is implicitly mapped to + ** the PRIMARY KEY of table pParent. The PRIMARY KEY index may be ** identified by the test. */ if( IsPrimaryKeyIndex(pIdx) ){ if( aiCol ){ @@ -116278,15 +116278,15 @@ SQLITE_PRIVATE int sqlite3FkLocateIndex( } /* -** This function is called when a row is inserted into or deleted from the -** child table of foreign key constraint pFKey. If an SQL UPDATE is executed +** This function is called when a row is inserted into or deleted from the +** child table of foreign key constraint pFKey. If an SQL UPDATE is executed ** on the child table of pFKey, this function is invoked twice for each row ** affected - once to "delete" the old row, and then again to "insert" the ** new row. ** ** Each time it is called, this function generates VDBE code to locate the -** row in the parent table that corresponds to the row being inserted into -** or deleted from the child table. If the parent row can be found, no +** row in the parent table that corresponds to the row being inserted into +** or deleted from the child table. If the parent row can be found, no ** special action is taken. Otherwise, if the parent row can *not* be ** found in the parent table: ** @@ -116300,7 +116300,7 @@ SQLITE_PRIVATE int sqlite3FkLocateIndex( ** ** DELETE deferred Decrement the "deferred constraint counter". ** -** These operations are identified in the comment at the top of this file +** These operations are identified in the comment at the top of this file ** (fkey.c) as "I.1" and "D.1". */ static void fkLookupParent( @@ -116322,15 +116322,15 @@ static void fkLookupParent( sqlite3VdbeVerifyAbortable(v, (!pFKey->isDeferred && !(pParse->db->flags & SQLITE_DeferFKs) - && !pParse->pToplevel + && !pParse->pToplevel && !pParse->isMultiWrite) ? OE_Abort : OE_Ignore); /* If nIncr is less than zero, then check at runtime if there are any ** outstanding constraints to resolve. If there are not, there is no need ** to check if deleting this row resolves any outstanding violations. ** - ** Check if any of the key columns in the child table row are NULL. If - ** any are, then the constraint is considered satisfied. No need to + ** Check if any of the key columns in the child table row are NULL. If + ** any are, then the constraint is considered satisfied. No need to ** search for a matching row in the parent table. */ if( nIncr<0 ){ sqlite3VdbeAddOp2(v, OP_FkIfZero, pFKey->isDeferred, iOk); @@ -116347,8 +116347,8 @@ static void fkLookupParent( ** column of the parent table (table pTab). */ int iMustBeInt; /* Address of MustBeInt instruction */ int regTemp = sqlite3GetTempReg(pParse); - - /* Invoke MustBeInt to coerce the child key value to an integer (i.e. + + /* Invoke MustBeInt to coerce the child key value to an integer (i.e. ** apply the affinity of the parent key). If this fails, then there ** is no matching parent key. Before using MustBeInt, make a copy of ** the value. Otherwise, the value inserted into the child key column @@ -116356,7 +116356,7 @@ static void fkLookupParent( sqlite3VdbeAddOp2(v, OP_SCopy, aiCol[0]+1+regData, regTemp); iMustBeInt = sqlite3VdbeAddOp2(v, OP_MustBeInt, regTemp, 0); VdbeCoverage(v); - + /* If the parent table is the same as the child table, and we are about ** to increment the constraint-counter (i.e. this is an INSERT operation), ** then check if the row being inserted matches itself. If so, do not @@ -116365,7 +116365,7 @@ static void fkLookupParent( sqlite3VdbeAddOp3(v, OP_Eq, regData, iOk, regTemp); VdbeCoverage(v); sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); } - + sqlite3OpenTable(pParse, iCur, iDb, pTab, OP_OpenRead); sqlite3VdbeAddOp3(v, OP_NotExists, iCur, 0, regTemp); VdbeCoverage(v); sqlite3VdbeGoto(v, iOk); @@ -116376,19 +116376,19 @@ static void fkLookupParent( int nCol = pFKey->nCol; int regTemp = sqlite3GetTempRange(pParse, nCol); int regRec = sqlite3GetTempReg(pParse); - + sqlite3VdbeAddOp3(v, OP_OpenRead, iCur, pIdx->tnum, iDb); sqlite3VdbeSetP4KeyInfo(pParse, pIdx); for(i=0; idb,pIdx), nCol); sqlite3VdbeAddOp4Int(v, OP_Found, iCur, iOk, regRec, 0); VdbeCoverage(v); - + sqlite3ReleaseTempReg(pParse, regRec); sqlite3ReleaseTempRange(pParse, regTemp, nCol); } } if( !pFKey->isDeferred && !(pParse->db->flags & SQLITE_DeferFKs) - && !pParse->pToplevel - && !pParse->isMultiWrite + && !pParse->pToplevel + && !pParse->isMultiWrite ){ /* Special case: If this is an INSERT statement that will insert exactly ** one row into the table, raise a constraint immediately instead of @@ -116499,7 +116499,7 @@ static Expr *exprTableColumn( /* ** This function is called to generate code executed when a row is deleted -** from the parent table of foreign key constraint pFKey and, if pFKey is +** from the parent table of foreign key constraint pFKey and, if pFKey is ** deferred, when a row is inserted into the same table. When generating ** code for an SQL UPDATE operation, this function may be called twice - ** once to "delete" the old row and once to "insert" the new row. @@ -116526,7 +116526,7 @@ static Expr *exprTableColumn( ** ** INSERT deferred Decrement the "deferred constraint counter". ** -** These operations are identified in the comment at the top of this file +** These operations are identified in the comment at the top of this file ** (fkey.c) as "I.2" and "D.2". */ static void fkScanChildren( @@ -116569,7 +116569,7 @@ static void fkScanChildren( Expr *pLeft; /* Value from parent table row */ Expr *pRight; /* Column ref to child table */ Expr *pEq; /* Expression (pLeft = pRight) */ - i16 iCol; /* Index of column in child table */ + i16 iCol; /* Index of column in child table */ const char *zCol; /* Name of column in child table */ iCol = pIdx ? pIdx->aiColumn[i] : -1; @@ -116591,7 +116591,7 @@ static void fkScanChildren( ** ** The first form is used for rowid tables. The second form is used ** for WITHOUT ROWID tables. In the second form, the *parent* key is - ** (a,b,...). Either the parent or primary key could be used to + ** (a,b,...). Either the parent or primary key could be used to ** uniquely identify the current row, but the parent key is more convenient ** as the required values have already been loaded into registers ** by the caller. @@ -116663,7 +116663,7 @@ SQLITE_PRIVATE FKey *sqlite3FkReferences(Table *pTab){ } /* -** The second argument is a Trigger structure allocated by the +** The second argument is a Trigger structure allocated by the ** fkActionTrigger() routine. This function deletes the Trigger structure ** and all of its sub-components. ** @@ -116691,7 +116691,7 @@ static void fkTriggerDelete(sqlite3 *dbMem, Trigger *p){ ** ** (a) The table is the parent table of a FK constraint, or ** (b) The table is the child table of a deferred FK constraint and it is -** determined at runtime that there are outstanding deferred FK +** determined at runtime that there are outstanding deferred FK ** constraint violations in the database, ** ** then the equivalent of "DELETE FROM " is executed before dropping @@ -116708,7 +116708,7 @@ SQLITE_PRIVATE void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTa assert( pTab->pSelect==0 ); /* Not a view */ if( sqlite3FkReferences(pTab)==0 ){ /* Search for a deferred foreign key constraint for which this table - ** is the child table. If one cannot be found, return without + ** is the child table. If one cannot be found, return without ** generating any VDBE code. If one can be found, then jump over ** the entire DELETE if there are no outstanding deferred constraints ** when this statement is run. */ @@ -116725,10 +116725,10 @@ SQLITE_PRIVATE void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTa sqlite3DeleteFrom(pParse, sqlite3SrcListDup(db, pName, 0), 0, 0, 0); pParse->disableTriggers = 0; - /* If the DELETE has generated immediate foreign key constraint + /* If the DELETE has generated immediate foreign key constraint ** violations, halt the VDBE and return an error at this point, before ** any modifications to the schema are made. This is because statement - ** transactions are not able to rollback schema changes. + ** transactions are not able to rollback schema changes. ** ** If the SQLITE_DeferFKs flag is set, then this is not required, as ** the statement transaction will not be rolled back even if FK @@ -116752,7 +116752,7 @@ SQLITE_PRIVATE void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTa /* ** The second argument points to an FKey object representing a foreign key ** for which pTab is the child table. An UPDATE statement against pTab -** is currently being processed. For each column of the table that is +** is currently being processed. For each column of the table that is ** actually updated, the corresponding element in the aChange[] array ** is zero or greater (if a column is unmodified the corresponding element ** is set to -1). If the rowid column is modified by the UPDATE statement @@ -116779,7 +116779,7 @@ static int fkChildIsModified( /* ** The second argument points to an FKey object representing a foreign key ** for which pTab is the parent table. An UPDATE statement against pTab -** is currently being processed. For each column of the table that is +** is currently being processed. For each column of the table that is ** actually updated, the corresponding element in the aChange[] array ** is zero or greater (if a column is unmodified the corresponding element ** is set to -1). If the rowid column is modified by the UPDATE statement @@ -116789,9 +116789,9 @@ static int fkChildIsModified( ** parent key for FK constraint *p are modified. */ static int fkParentIsModified( - Table *pTab, - FKey *p, - int *aChange, + Table *pTab, + FKey *p, + int *aChange, int bChngRowid ){ int i; @@ -116832,7 +116832,7 @@ static int isSetNullAction(Parse *pParse, FKey *pFKey){ /* ** This function is called when inserting, deleting or updating a row of -** table pTab to generate VDBE code to perform foreign key constraint +** table pTab to generate VDBE code to perform foreign key constraint ** processing for the operation. ** ** For a DELETE operation, parameter regOld is passed the index of the @@ -116848,11 +116848,11 @@ static int isSetNullAction(Parse *pParse, FKey *pFKey){ ** For an UPDATE operation, this function is called twice. Once before ** the original record is deleted from the table using the calling convention ** described for DELETE. Then again after the original record is deleted -** but before the new record is inserted using the INSERT convention. +** but before the new record is inserted using the INSERT convention. */ SQLITE_PRIVATE void sqlite3FkCheck( Parse *pParse, /* Parse context */ - Table *pTab, /* Row is being deleted from this table */ + Table *pTab, /* Row is being deleted from this table */ int regOld, /* Previous row data is stored here */ int regNew, /* New row data is stored here */ int *aChange, /* Array indicating UPDATEd columns (or 0) */ @@ -116884,16 +116884,16 @@ SQLITE_PRIVATE void sqlite3FkCheck( int i; int bIgnore = 0; - if( aChange + if( aChange && sqlite3_stricmp(pTab->zName, pFKey->zTo)!=0 - && fkChildIsModified(pTab, pFKey, aChange, bChngRowid)==0 + && fkChildIsModified(pTab, pFKey, aChange, bChngRowid)==0 ){ continue; } - /* Find the parent table of this foreign key. Also find a unique index - ** on the parent key columns in the parent table. If either of these - ** schema items cannot be located, set an error in pParse and return + /* Find the parent table of this foreign key. Also find a unique index + ** on the parent key columns in the parent table. If either of these + ** schema items cannot be located, set an error in pParse and return ** early. */ if( pParse->disableTriggers ){ pTo = sqlite3FindTable(db, pFKey->zTo, zDb); @@ -116935,7 +116935,7 @@ SQLITE_PRIVATE void sqlite3FkCheck( } assert( pIdx==0 || pIdx->aiColumn[i]>=0 ); #ifndef SQLITE_OMIT_AUTHORIZATION - /* Request permission to read the parent key columns. If the + /* Request permission to read the parent key columns. If the ** authorization callback returns SQLITE_IGNORE, behave as if any ** values read from the parent table are NULL. */ if( db->xAuth ){ @@ -116947,24 +116947,24 @@ SQLITE_PRIVATE void sqlite3FkCheck( #endif } - /* Take a shared-cache advisory read-lock on the parent table. Allocate - ** a cursor to use to search the unique index on the parent key columns + /* Take a shared-cache advisory read-lock on the parent table. Allocate + ** a cursor to use to search the unique index on the parent key columns ** in the parent table. */ sqlite3TableLock(pParse, iDb, pTo->tnum, 0, pTo->zName); pParse->nTab++; if( regOld!=0 ){ /* A row is being removed from the child table. Search for the parent. - ** If the parent does not exist, removing the child row resolves an + ** If the parent does not exist, removing the child row resolves an ** outstanding foreign key constraint violation. */ fkLookupParent(pParse, iDb, pTo, pIdx, pFKey, aiCol, regOld, -1, bIgnore); } if( regNew!=0 && !isSetNullAction(pParse, pFKey) ){ /* A row is being added to the child table. If a parent row cannot - ** be found, adding the child row has violated the FK constraint. + ** be found, adding the child row has violated the FK constraint. ** ** If this operation is being performed as part of a trigger program - ** that is actually a "SET NULL" action belonging to this very + ** that is actually a "SET NULL" action belonging to this very ** foreign key, then omit this scan altogether. As all child key ** values are guaranteed to be NULL, it is not possible for adding ** this row to cause an FK violation. */ @@ -116985,8 +116985,8 @@ SQLITE_PRIVATE void sqlite3FkCheck( continue; } - if( !pFKey->isDeferred && !(db->flags & SQLITE_DeferFKs) - && !pParse->pToplevel && !pParse->isMultiWrite + if( !pFKey->isDeferred && !(db->flags & SQLITE_DeferFKs) + && !pParse->pToplevel && !pParse->isMultiWrite ){ assert( regOld==0 && regNew!=0 ); /* Inserting a single row into a parent table cannot cause (or fix) @@ -117009,7 +117009,7 @@ SQLITE_PRIVATE void sqlite3FkCheck( pItem->zName = pFKey->pFrom->zName; pItem->pTab->nTabRef++; pItem->iCursor = pParse->nTab++; - + if( regNew!=0 ){ fkScanChildren(pParse, pSrc, pTab, pIdx, pFKey, aiCol, regNew, -1); } @@ -117028,10 +117028,10 @@ SQLITE_PRIVATE void sqlite3FkCheck( ** ** Note 2: At first glance it may seem like SQLite could simply omit ** all OP_FkCounter related scans when either CASCADE or SET NULL - ** applies. The trouble starts if the CASCADE or SET NULL action - ** trigger causes other triggers or action rules attached to the + ** applies. The trouble starts if the CASCADE or SET NULL action + ** trigger causes other triggers or action rules attached to the ** child table to fire. In these cases the fk constraint counters - ** might be set incorrectly if any OP_FkCounter related scans are + ** might be set incorrectly if any OP_FkCounter related scans are ** omitted. */ if( !pFKey->isDeferred && eAction!=OE_Cascade && eAction!=OE_SetNull ){ sqlite3MayAbort(pParse); @@ -117047,7 +117047,7 @@ SQLITE_PRIVATE void sqlite3FkCheck( #define COLUMN_MASK(x) (((x)>31) ? 0xffffffff : ((u32)1<<(x))) /* -** This function is called before generating code to update or delete a +** This function is called before generating code to update or delete a ** row contained in table pTab. */ SQLITE_PRIVATE u32 sqlite3FkOldmask( @@ -117077,17 +117077,17 @@ SQLITE_PRIVATE u32 sqlite3FkOldmask( /* -** This function is called before generating code to update or delete a +** This function is called before generating code to update or delete a ** row contained in table pTab. If the operation is a DELETE, then ** parameter aChange is passed a NULL value. For an UPDATE, aChange points ** to an array of size N, where N is the number of columns in table pTab. -** If the i'th column is not modified by the UPDATE, then the corresponding +** If the i'th column is not modified by the UPDATE, then the corresponding ** entry in the aChange[] array is set to -1. If the column is modified, ** the value is 0 or greater. Parameter chngRowid is set to true if the ** UPDATE statement modifies the rowid fields of the table. ** ** If any foreign key processing will be required, this function returns -** non-zero. If there is no foreign key related processing, this function +** non-zero. If there is no foreign key related processing, this function ** returns zero. ** ** For an UPDATE, this function returns 2 if: @@ -117107,8 +117107,8 @@ SQLITE_PRIVATE int sqlite3FkRequired( int eRet = 0; if( pParse->db->flags&SQLITE_ForeignKeys ){ if( !aChange ){ - /* A DELETE operation. Foreign key processing is required if the - ** table in question is either the child or parent table for any + /* A DELETE operation. Foreign key processing is required if the + ** table in question is either the child or parent table for any ** foreign key constraint. */ eRet = (sqlite3FkReferences(pTab) || pTab->pFKey); }else{ @@ -117137,7 +117137,7 @@ SQLITE_PRIVATE int sqlite3FkRequired( } /* -** This function is called when an UPDATE or DELETE operation is being +** This function is called when an UPDATE or DELETE operation is being ** compiled on table pTab, which is the parent table of foreign-key pFKey. ** If the current operation is an UPDATE, then the pChanges parameter is ** passed a pointer to the list of columns being modified. If it is a @@ -117149,7 +117149,7 @@ SQLITE_PRIVATE int sqlite3FkRequired( ** returned (these actions require no special handling by the triggers ** sub-system, code for them is created by fkScanChildren()). ** -** For example, if pFKey is the foreign key and pTab is table "p" in +** For example, if pFKey is the foreign key and pTab is table "p" in ** the following schema: ** ** CREATE TABLE p(pk PRIMARY KEY); @@ -117162,7 +117162,7 @@ SQLITE_PRIVATE int sqlite3FkRequired( ** END; ** ** The returned pointer is cached as part of the foreign key object. It -** is eventually freed along with the rest of the foreign key object by +** is eventually freed along with the rest of the foreign key object by ** sqlite3FkDelete(). */ static Trigger *fkActionTrigger( @@ -117218,7 +117218,7 @@ static Trigger *fkActionTrigger( ** that the affinity and collation sequence associated with the ** parent table are used for the comparison. */ pEq = sqlite3PExpr(pParse, TK_EQ, - sqlite3PExpr(pParse, TK_DOT, + sqlite3PExpr(pParse, TK_DOT, sqlite3ExprAlloc(db, TK_ID, &tOld, 0), sqlite3ExprAlloc(db, TK_ID, &tToCol, 0)), sqlite3ExprAlloc(db, TK_ID, &tFromCol, 0) @@ -117232,20 +117232,20 @@ static Trigger *fkActionTrigger( */ if( pChanges ){ pEq = sqlite3PExpr(pParse, TK_IS, - sqlite3PExpr(pParse, TK_DOT, + sqlite3PExpr(pParse, TK_DOT, sqlite3ExprAlloc(db, TK_ID, &tOld, 0), sqlite3ExprAlloc(db, TK_ID, &tToCol, 0)), - sqlite3PExpr(pParse, TK_DOT, + sqlite3PExpr(pParse, TK_DOT, sqlite3ExprAlloc(db, TK_ID, &tNew, 0), sqlite3ExprAlloc(db, TK_ID, &tToCol, 0)) ); pWhen = sqlite3ExprAnd(pParse, pWhen, pEq); } - + if( action!=OE_Restrict && (action!=OE_Cascade || pChanges) ){ Expr *pNew; if( action==OE_Cascade ){ - pNew = sqlite3PExpr(pParse, TK_DOT, + pNew = sqlite3PExpr(pParse, TK_DOT, sqlite3ExprAlloc(db, TK_ID, &tNew, 0), sqlite3ExprAlloc(db, TK_ID, &tToCol, 0)); }else if( action==OE_SetDflt ){ @@ -117269,7 +117269,7 @@ static Trigger *fkActionTrigger( if( action==OE_Restrict ){ Token tFrom; - Expr *pRaise; + Expr *pRaise; tFrom.z = zFrom; tFrom.n = nFrom; @@ -117277,7 +117277,7 @@ static Trigger *fkActionTrigger( if( pRaise ){ pRaise->affExpr = OE_Abort; } - pSelect = sqlite3SelectNew(pParse, + pSelect = sqlite3SelectNew(pParse, sqlite3ExprListAppend(pParse, 0, pRaise), sqlite3SrcListAppend(pParse, 0, &tFrom, 0), pWhere, @@ -117289,7 +117289,7 @@ static Trigger *fkActionTrigger( /* Disable lookaside memory allocation */ db->lookaside.bDisable++; - pTrigger = (Trigger *)sqlite3DbMallocZero(db, + pTrigger = (Trigger *)sqlite3DbMallocZero(db, sizeof(Trigger) + /* struct Trigger */ sizeof(TriggerStep) + /* Single step in trigger program */ nFrom + 1 /* Space for pStep->zTarget */ @@ -117298,7 +117298,7 @@ static Trigger *fkActionTrigger( pStep = pTrigger->step_list = (TriggerStep *)&pTrigger[1]; pStep->zTarget = (char *)&pStep[1]; memcpy((char *)pStep->zTarget, zFrom, nFrom); - + pStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE); pStep->pExprList = sqlite3ExprListDup(db, pList, EXPRDUP_REDUCE); pStep->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE); @@ -117324,12 +117324,12 @@ static Trigger *fkActionTrigger( switch( action ){ case OE_Restrict: - pStep->op = TK_SELECT; + pStep->op = TK_SELECT; break; - case OE_Cascade: - if( !pChanges ){ - pStep->op = TK_DELETE; - break; + case OE_Cascade: + if( !pChanges ){ + pStep->op = TK_DELETE; + break; } default: pStep->op = TK_UPDATE; @@ -117356,9 +117356,9 @@ SQLITE_PRIVATE void sqlite3FkActions( int *aChange, /* Array indicating UPDATEd columns (or 0) */ int bChngRowid /* True if rowid is UPDATEd */ ){ - /* If foreign-key support is enabled, iterate through all FKs that - ** refer to table pTab. If there is an action associated with the FK - ** for this operation (either update or delete), invoke the associated + /* If foreign-key support is enabled, iterate through all FKs that + ** refer to table pTab. If there is an action associated with the FK + ** for this operation (either update or delete), invoke the associated ** trigger sub-program. */ if( pParse->db->flags&SQLITE_ForeignKeys ){ FKey *pFKey; /* Iterator variable */ @@ -117438,7 +117438,7 @@ SQLITE_PRIVATE void sqlite3FkDelete(sqlite3 *db, Table *pTab){ /* #include "sqliteInt.h" */ /* -** Generate code that will +** Generate code that will ** ** (1) acquire a lock for table pTab then ** (2) open pTab as cursor iCur. @@ -117457,7 +117457,7 @@ SQLITE_PRIVATE void sqlite3OpenTable( assert( !IsVirtual(pTab) ); v = sqlite3GetVdbe(pParse); assert( opcode==OP_OpenWrite || opcode==OP_OpenRead ); - sqlite3TableLock(pParse, iDb, pTab->tnum, + sqlite3TableLock(pParse, iDb, pTab->tnum, (opcode==OP_OpenWrite)?1:0, pTab->zName); if( HasRowid(pTab) ){ sqlite3VdbeAddOp4Int(v, opcode, iCur, pTab->tnum, iDb, pTab->nCol); @@ -117474,7 +117474,7 @@ SQLITE_PRIVATE void sqlite3OpenTable( /* ** Return a pointer to the column affinity string associated with index -** pIdx. A column affinity string has one character for each column in +** pIdx. A column affinity string has one character for each column in ** the table, according to the affinity of the column: ** ** Character Column affinity @@ -117527,7 +117527,7 @@ SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(sqlite3 *db, Index *pIdx){ } pIdx->zColAff[n] = 0; } - + return pIdx->zColAff; } @@ -117584,9 +117584,9 @@ SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){ /* ** Return non-zero if the table pTab in database iDb or any of its indices -** have been opened at any point in the VDBE program. This is used to see if -** a statement of the form "INSERT INTO SELECT ..." can -** run without using a temporary table for the results of the SELECT. +** have been opened at any point in the VDBE program. This is used to see if +** a statement of the form "INSERT INTO SELECT ..." can +** run without using a temporary table for the results of the SELECT. */ static int readsTable(Parse *p, int iDb, Table *pTab){ Vdbe *v = sqlite3GetVdbe(p); @@ -117693,7 +117693,7 @@ static int autoIncBegin( /* ** This routine generates code that will initialize all of the -** register used by the autoincrement tracker. +** register used by the autoincrement tracker. */ SQLITE_PRIVATE void sqlite3AutoincrementBegin(Parse *pParse){ AutoincInfo *p; /* Information about an AUTOINCREMENT */ @@ -117722,7 +117722,7 @@ SQLITE_PRIVATE void sqlite3AutoincrementBegin(Parse *pParse){ /* 8 */ {OP_Goto, 0, 11, 0}, /* 9 */ {OP_Next, 0, 2, 0}, /* 10 */ {OP_Integer, 0, 0, 0}, - /* 11 */ {OP_Close, 0, 0, 0} + /* 11 */ {OP_Close, 0, 0, 0} }; VdbeOp *aOp; pDb = &db->aDb[p->iDb]; @@ -118073,7 +118073,7 @@ SQLITE_PRIVATE void sqlite3Insert( regData = regRowid+1; /* If the INSERT statement included an IDLIST term, then make sure - ** all elements of the IDLIST really are columns of the table and + ** all elements of the IDLIST really are columns of the table and ** remember the column indices. ** ** If the table has an INTEGER PRIMARY KEY column and that column @@ -118145,7 +118145,7 @@ SQLITE_PRIVATE void sqlite3Insert( ** the destination table (template 3). ** ** A temp table must be used if the table being updated is also one - ** of the tables being read by the SELECT statement. Also use a + ** of the tables being read by the SELECT statement. Also use a ** temp table in the case of row triggers. */ if( pTrigger || readsTable(pParse, iDb, pTab) ){ @@ -118181,7 +118181,7 @@ SQLITE_PRIVATE void sqlite3Insert( sqlite3ReleaseTempReg(pParse, regTempRowid); } }else{ - /* This is the case if the data for the INSERT is coming from a + /* This is the case if the data for the INSERT is coming from a ** single-row VALUES clause */ NameContext sNC; @@ -118200,7 +118200,7 @@ SQLITE_PRIVATE void sqlite3Insert( } /* If there is no IDLIST term but the table has an integer primary - ** key, the set the ipkColumn variable to the integer primary key + ** key, the set the ipkColumn variable to the integer primary key ** column index in the original table definition. */ if( pColumn==0 && nColumn>0 ){ @@ -118214,7 +118214,7 @@ SQLITE_PRIVATE void sqlite3Insert( nHidden += (IsHiddenColumn(&pTab->aCol[i]) ? 1 : 0); } if( pColumn==0 && nColumn && nColumn!=(pTab->nCol-nHidden) ){ - sqlite3ErrorMsg(pParse, + sqlite3ErrorMsg(pParse, "table %S has %d columns but %d values were supplied", pTabList, 0, pTab->nCol-nHidden, nColumn); goto insert_cleanup; @@ -118223,7 +118223,7 @@ SQLITE_PRIVATE void sqlite3Insert( sqlite3ErrorMsg(pParse, "%d values for %d columns", nColumn, pColumn->nId); goto insert_cleanup; } - + /* Initialize the count of rows to be inserted */ if( (db->flags & SQLITE_CountRows)!=0 @@ -118344,7 +118344,7 @@ SQLITE_PRIVATE void sqlite3Insert( || (pColumn==0 && IsOrdinaryHiddenColumn(&pTab->aCol[i])) ){ sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regCols+i+1); }else if( useTempTable ){ - sqlite3VdbeAddOp3(v, OP_Column, srcTab, j, regCols+i+1); + sqlite3VdbeAddOp3(v, OP_Column, srcTab, j, regCols+i+1); }else{ assert( pSelect==0 ); /* Otherwise useTempTable is true */ sqlite3ExprCodeAndCache(pParse, pList->a[j].pExpr, regCols+i+1); @@ -118362,7 +118362,7 @@ SQLITE_PRIVATE void sqlite3Insert( } /* Fire BEFORE or INSTEAD OF triggers */ - sqlite3CodeRowTrigger(pParse, pTrigger, TK_INSERT, 0, TRIGGER_BEFORE, + sqlite3CodeRowTrigger(pParse, pTrigger, TK_INSERT, 0, TRIGGER_BEFORE, pTab, regCols-pTab->nCol-1, onError, endOfLoop); sqlite3ReleaseTempRange(pParse, regCols, pTab->nCol+1); @@ -118443,7 +118443,7 @@ SQLITE_PRIVATE void sqlite3Insert( if( j<0 || nColumn==0 || (pColumn && j>=pColumn->nId) ){ sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore); }else if( useTempTable ){ - sqlite3VdbeAddOp3(v, OP_Column, srcTab, j, iRegStore); + sqlite3VdbeAddOp3(v, OP_Column, srcTab, j, iRegStore); }else if( pSelect ){ if( regFromSelect!=regData ){ sqlite3VdbeAddOp2(v, OP_SCopy, regFromSelect+j, iRegStore); @@ -118477,7 +118477,7 @@ SQLITE_PRIVATE void sqlite3Insert( ** constraints or (b) there are no triggers and this table is not a ** parent table in a foreign key constraint. It is safe to set the ** flag in the second case as if any REPLACE constraint is hit, an - ** OP_Delete or OP_IdxDelete instruction will be executed on each + ** OP_Delete or OP_IdxDelete instruction will be executed on each ** cursor that is disturbed. And these instructions both clear the ** VdbeCursor.seekResult variable, disabling the OPFLAG_USESEEKRESULT ** functionality. */ @@ -118498,7 +118498,7 @@ SQLITE_PRIVATE void sqlite3Insert( if( pTrigger ){ /* Code AFTER triggers */ - sqlite3CodeRowTrigger(pParse, pTrigger, TK_INSERT, 0, TRIGGER_AFTER, + sqlite3CodeRowTrigger(pParse, pTrigger, TK_INSERT, 0, TRIGGER_AFTER, pTab, regData-2-pTab->nCol, onError, endOfLoop); } @@ -118525,7 +118525,7 @@ insert_end: } /* - ** Return the number of rows inserted. If this routine is + ** Return the number of rows inserted. If this routine is ** generating code because of a call to sqlite3NestedParse(), do not ** invoke the callback function. */ @@ -118558,7 +118558,7 @@ insert_cleanup: #endif /* -** Meanings of bits in of pWalker->eCode for +** Meanings of bits in of pWalker->eCode for ** sqlite3ExprReferencesUpdatedColumn() */ #define CKCNSTRNT_COLUMN 0x01 /* CHECK constraint uses a changing column */ @@ -118751,9 +118751,9 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( assert( v!=0 ); assert( pTab->pSelect==0 ); /* This table is not a VIEW */ nCol = pTab->nCol; - + /* pPk is the PRIMARY KEY index for WITHOUT ROWID tables and NULL for - ** normal rowid tables. nPkField is the number of key fields in the + ** normal rowid tables. nPkField is the number of key fields in the ** pPk index or 1 for a rowid table. In other words, nPkField is the ** number of fields in the true primary key of the table. */ if( HasRowid(pTab) ){ @@ -118981,10 +118981,10 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( ** the triggers and remove both the table and index b-tree entries. ** ** Otherwise, if there are no triggers or the recursive-triggers - ** flag is not set, but the table has one or more indexes, call - ** GenerateRowIndexDelete(). This removes the index b-tree entries - ** only. The table b-tree entry will be replaced by the new entry - ** when it is inserted. + ** flag is not set, but the table has one or more indexes, call + ** GenerateRowIndexDelete(). This removes the index b-tree entries + ** only. The table b-tree entry will be replaced by the new entry + ** when it is inserted. ** ** If either GenerateRowDelete() or GenerateRowIndexDelete() is called, ** also invoke MultiWrite() to indicate that this VDBE may require @@ -119111,7 +119111,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( } #endif - /* In an UPDATE operation, if this index is the PRIMARY KEY index + /* In an UPDATE operation, if this index is the PRIMARY KEY index ** of a WITHOUT ROWID table and there has been no change the ** primary key, then no collision is possible. The collision detection ** logic below can all be skipped. */ @@ -119122,7 +119122,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( /* Find out what action to take in case there is a uniqueness conflict */ onError = pIdx->onError; - if( onError==OE_None ){ + if( onError==OE_None ){ sqlite3VdbeResolveLabel(v, addrUniqueOk); continue; /* pIdx is not a UNIQUE index */ } @@ -119150,7 +119150,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( ** ** This is not possible for ENABLE_PREUPDATE_HOOK builds, as the row ** must be explicitly deleted in order to ensure any pre-update hook - ** is invoked. */ + ** is invoked. */ #ifndef SQLITE_ENABLE_PREUPDATE_HOOK if( (ix==0 && pIdx->pNext==0) /* Condition 3 */ && pPk==pIdx /* Condition 2 */ @@ -119196,7 +119196,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( } } if( isUpdate ){ - /* If currently processing the PRIMARY KEY of a WITHOUT ROWID + /* If currently processing the PRIMARY KEY of a WITHOUT ROWID ** table, only conflict if the new PRIMARY KEY values are actually ** different from the old. ** @@ -119206,7 +119206,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( int addrJump = sqlite3VdbeCurrentAddr(v)+pPk->nKeyCol; int op = OP_Ne; int regCmp = (IsPrimaryKeyIndex(pIdx) ? regIdx : regR); - + for(i=0; inKeyCol; i++){ char *p4 = (char*)sqlite3LocateCollSeq(pParse, pPk->azColl[i]); x = pPk->aiColumn[i]; @@ -119215,7 +119215,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( addrJump = addrUniqueOk; op = OP_Eq; } - sqlite3VdbeAddOp4(v, op, + sqlite3VdbeAddOp4(v, op, regOldData+1+x, addrJump, regCmp+i, p4, P4_COLLSEQ ); sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); @@ -119366,7 +119366,7 @@ SQLITE_PRIVATE void sqlite3CompleteInsertion( if( update_flags==0 ){ int r = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp2(v, OP_Integer, 0, r); - sqlite3VdbeAddOp4(v, OP_Insert, + sqlite3VdbeAddOp4(v, OP_Insert, iIdxCur+i, aRegIdx[i], r, (char*)pTab, P4_TABLE ); sqlite3VdbeChangeP5(v, OPFLAG_ISNOOP); @@ -119539,7 +119539,7 @@ static int xferCompatibleIndex(Index *pDest, Index *pSrc){ ** ** INSERT INTO tab1 SELECT * FROM tab2; ** -** The xfer optimization transfers raw records from tab2 over to tab1. +** The xfer optimization transfers raw records from tab2 over to tab1. ** Columns are not decoded and reassembled, which greatly improves ** performance. Raw index records are transferred in the same way. ** @@ -119674,8 +119674,8 @@ static int xferOptimization( Column *pDestCol = &pDest->aCol[i]; Column *pSrcCol = &pSrc->aCol[i]; #ifdef SQLITE_ENABLE_HIDDEN_COLUMNS - if( (db->mDbFlags & DBFLAG_Vacuum)==0 - && (pDestCol->colFlags | pSrcCol->colFlags) & COLFLAG_HIDDEN + if( (db->mDbFlags & DBFLAG_Vacuum)==0 + && (pDestCol->colFlags | pSrcCol->colFlags) & COLFLAG_HIDDEN ){ return 0; /* Neither table may have __hidden__ columns */ } @@ -119693,7 +119693,7 @@ static int xferOptimization( if( i>0 ){ assert( pDestCol->pDflt==0 || pDestCol->pDflt->op==TK_SPAN ); assert( pSrcCol->pDflt==0 || pSrcCol->pDflt->op==TK_SPAN ); - if( (pDestCol->pDflt==0)!=(pSrcCol->pDflt==0) + if( (pDestCol->pDflt==0)!=(pSrcCol->pDflt==0) || (pDestCol->pDflt && strcmp(pDestCol->pDflt->u.zToken, pSrcCol->pDflt->u.zToken)!=0) ){ @@ -119727,7 +119727,7 @@ static int xferOptimization( #ifndef SQLITE_OMIT_FOREIGN_KEY /* Disallow the transfer optimization if the destination table constains ** any foreign key constraints. This is more restrictive than necessary. - ** But the main beneficiary of the transfer optimization is the VACUUM + ** But the main beneficiary of the transfer optimization is the VACUUM ** command, and the VACUUM command disables foreign key constraints. So ** the extra complication to make this rule less restrictive is probably ** not worth the effort. Ticket [6284df89debdfa61db8073e062908af0c9b6118e] @@ -119774,7 +119774,7 @@ static int xferOptimization( ** (If the destination is not initially empty, the rowid fields ** of index entries might need to change.) ** - ** (2) The destination has a unique index. (The xfer optimization + ** (2) The destination has a unique index. (The xfer optimization ** is unable to test uniqueness.) ** ** (3) onError is something other than OE_Abort and OE_Rollback. @@ -119838,14 +119838,14 @@ static int xferOptimization( /* This INSERT command is part of a VACUUM operation, which guarantees ** that the destination table is empty. If all indexed columns use ** collation sequence BINARY, then it can also be assumed that the - ** index will be populated by inserting keys in strictly sorted + ** index will be populated by inserting keys in strictly sorted ** order. In this case, instead of seeking within the b-tree as part ** of every OP_IdxInsert opcode, an OP_SeekEnd is added before the - ** OP_IdxInsert to seek to the point within the b-tree where each key + ** OP_IdxInsert to seek to the point within the b-tree where each key ** should be inserted. This is faster. ** ** If any of the indexed columns use a collation sequence other than - ** BINARY, this optimization is disabled. This is because the user + ** BINARY, this optimization is disabled. This is because the user ** might change the definition of a collation sequence and then run ** a VACUUM command. In that case keys may not be written in strictly ** sorted order. */ @@ -119954,7 +119954,7 @@ SQLITE_API int sqlite3_exec( rc = sqlite3_step(pStmt); /* Invoke the callback function if required */ - if( xCallback && (SQLITE_ROW==rc || + if( xCallback && (SQLITE_ROW==rc || (SQLITE_DONE==rc && !callbackIsInit && db->flags&SQLITE_NullCallback)) ){ if( !callbackIsInit ){ @@ -120063,7 +120063,7 @@ exec_out: ** This header file defines the SQLite interface for use by ** shared libraries that want to be imported as extensions into ** an SQLite instance. Shared libraries that intend to be loaded -** as extensions by SQLite should #include this file instead of +** as extensions by SQLite should #include this file instead of ** sqlite3.h. */ #ifndef SQLITE3EXT_H @@ -120672,14 +120672,14 @@ typedef int (*sqlite3_loadext_entry)( #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) - /* This case when the file really is being compiled as a loadable + /* This case when the file really is being compiled as a loadable ** extension */ # define SQLITE_EXTENSION_INIT1 const sqlite3_api_routines *sqlite3_api=0; # define SQLITE_EXTENSION_INIT2(v) sqlite3_api=v; # define SQLITE_EXTENSION_INIT3 \ extern const sqlite3_api_routines *sqlite3_api; #else - /* This case when the file is being statically linked into the + /* This case when the file is being statically linked into the ** application */ # define SQLITE_EXTENSION_INIT1 /*no-op*/ # define SQLITE_EXTENSION_INIT2(v) (void)v; /* unused parameter */ @@ -120971,8 +120971,8 @@ static const sqlite3_api_routines sqlite3Apis = { sqlite3_memory_highwater, sqlite3_memory_used, #ifdef SQLITE_MUTEX_OMIT - 0, - 0, + 0, + 0, 0, 0, 0, @@ -121151,7 +121151,7 @@ static const sqlite3_api_routines sqlite3Apis = { ** ** Return SQLITE_OK on success and SQLITE_ERROR if something goes wrong. ** -** If an error occurs and pzErrMsg is not 0, then fill *pzErrMsg with +** If an error occurs and pzErrMsg is not 0, then fill *pzErrMsg with ** error message text. The calling function should free this memory ** by calling sqlite3DbFree(db, ). */ @@ -121175,7 +121175,7 @@ static int sqlite3LoadExtension( /* Shared library endings to try if zFile cannot be loaded as written */ static const char *azEndings[] = { #if SQLITE_OS_WIN - "dll" + "dll" #elif defined(__APPLE__) "dylib" #else @@ -121215,7 +121215,7 @@ static int sqlite3LoadExtension( if( pzErrMsg ){ *pzErrMsg = zErrmsg = sqlite3_malloc64(nMsg); if( zErrmsg ){ - sqlite3_snprintf(nMsg, zErrmsg, + sqlite3_snprintf(nMsg, zErrmsg, "unable to open shared library [%s]", zFile); sqlite3OsDlError(pVfs, nMsg-1, zErrmsg); } @@ -121227,9 +121227,9 @@ static int sqlite3LoadExtension( /* If no entry point was specified and the default legacy ** entry point name "sqlite3_extension_init" was not found, then ** construct an entry point name "sqlite3_X_init" where the X is - ** replaced by the lowercase value of every ASCII alphabetic + ** replaced by the lowercase value of every ASCII alphabetic ** character in the filename after the last "/" upto the first ".", - ** and eliding the first three characters if they are "lib". + ** and eliding the first three characters if they are "lib". ** Examples: ** ** /usr/local/lib/libExample5.4.3.so ==> sqlite3_example_init @@ -121349,7 +121349,7 @@ SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff){ */ typedef struct sqlite3AutoExtList sqlite3AutoExtList; static SQLITE_WSD struct sqlite3AutoExtList { - u32 nExt; /* Number of entries in aExt[] */ + u32 nExt; /* Number of entries in aExt[] */ void (**aExt)(void); /* Pointers to the extension init functions */ } sqlite3Autoext = { 0, 0 }; @@ -121536,7 +121536,7 @@ SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3 *db){ ** that includes the PragType_XXXX macro definitions and the aPragmaName[] ** object. This ensures that the aPragmaName[] table is arranged in ** lexicographical order to facility a binary search of the pragma name. -** Do not edit pragma.h directly. Edit and rerun the script in at +** Do not edit pragma.h directly. Edit and rerun the script in at ** ../tool/mkpragmatab.tcl. */ /************** Include pragma.h in the middle of pragma.c *******************/ /************** Begin file pragma.h ******************************************/ @@ -121608,53 +121608,53 @@ SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3 *db){ */ static const char *const pragCName[] = { /* 0 */ "id", /* Used by: foreign_key_list */ - /* 1 */ "seq", - /* 2 */ "table", - /* 3 */ "from", - /* 4 */ "to", - /* 5 */ "on_update", - /* 6 */ "on_delete", - /* 7 */ "match", + /* 1 */ "seq", + /* 2 */ "table", + /* 3 */ "from", + /* 4 */ "to", + /* 5 */ "on_update", + /* 6 */ "on_delete", + /* 7 */ "match", /* 8 */ "cid", /* Used by: table_xinfo */ - /* 9 */ "name", - /* 10 */ "type", - /* 11 */ "notnull", - /* 12 */ "dflt_value", - /* 13 */ "pk", - /* 14 */ "hidden", + /* 9 */ "name", + /* 10 */ "type", + /* 11 */ "notnull", + /* 12 */ "dflt_value", + /* 13 */ "pk", + /* 14 */ "hidden", /* table_info reuses 8 */ /* 15 */ "seqno", /* Used by: index_xinfo */ - /* 16 */ "cid", - /* 17 */ "name", - /* 18 */ "desc", - /* 19 */ "coll", - /* 20 */ "key", + /* 16 */ "cid", + /* 17 */ "name", + /* 18 */ "desc", + /* 19 */ "coll", + /* 20 */ "key", /* 21 */ "tbl", /* Used by: stats */ - /* 22 */ "idx", - /* 23 */ "wdth", - /* 24 */ "hght", - /* 25 */ "flgs", + /* 22 */ "idx", + /* 23 */ "wdth", + /* 24 */ "hght", + /* 25 */ "flgs", /* 26 */ "seq", /* Used by: index_list */ - /* 27 */ "name", - /* 28 */ "unique", - /* 29 */ "origin", - /* 30 */ "partial", + /* 27 */ "name", + /* 28 */ "unique", + /* 29 */ "origin", + /* 30 */ "partial", /* 31 */ "table", /* Used by: foreign_key_check */ - /* 32 */ "rowid", - /* 33 */ "parent", - /* 34 */ "fkid", + /* 32 */ "rowid", + /* 33 */ "parent", + /* 34 */ "fkid", /* index_info reuses 15 */ /* 35 */ "seq", /* Used by: database_list */ - /* 36 */ "name", - /* 37 */ "file", + /* 36 */ "name", + /* 37 */ "file", /* 38 */ "busy", /* Used by: wal_checkpoint */ - /* 39 */ "log", + /* 39 */ "log", /* 40 */ "checkpointed", /* 41 */ "name", /* Used by: function_list */ - /* 42 */ "builtin", + /* 42 */ "builtin", /* collation_list reuses 26 */ /* 43 */ "database", /* Used by: lock_status */ - /* 44 */ "status", + /* 44 */ "status", /* 45 */ "cache_size", /* Used by: default_cache_size */ /* module_list pragma_list reuses 9 */ /* 46 */ "timeout", /* Used by: busy_timeout */ @@ -122217,7 +122217,7 @@ static const PragmaName aPragmaName[] = { /* ** Interpret the given string as a safety level. Return 0 for OFF, -** 1 for ON or NORMAL, 2 for FULL, and 3 for EXTRA. Return 1 for an empty or +** 1 for ON or NORMAL, 2 for FULL, and 3 for EXTRA. Return 1 for an empty or ** unrecognized string argument. The FULL and EXTRA option is disallowed ** if the omitFull parameter it 1. ** @@ -122276,7 +122276,7 @@ static int getLockingMode(const char *z){ /* ** Interpret the given string as an auto-vacuum mode value. ** -** The following strings, "none", "full" and "incremental" are +** The following strings, "none", "full" and "incremental" are ** acceptable, as are their numeric equivalents: 0, 1 and 2 respectively. */ static int getAutoVacuum(const char *z){ @@ -122428,7 +122428,7 @@ static const char *actionName(u8 action){ case OE_SetDflt: zName = "SET DEFAULT"; break; case OE_Cascade: zName = "CASCADE"; break; case OE_Restrict: zName = "RESTRICT"; break; - default: zName = "NO ACTION"; + default: zName = "NO ACTION"; assert( action==OE_None ); break; } return zName; @@ -122497,7 +122497,7 @@ static int integrityCheckResultRow(Vdbe *v){ } /* -** Process a pragma statement. +** Process a pragma statement. ** ** Pragmas are of this form: ** @@ -122512,7 +122512,7 @@ static int integrityCheckResultRow(Vdbe *v){ ** id and pId2 is any empty string. */ SQLITE_PRIVATE void sqlite3Pragma( - Parse *pParse, + Parse *pParse, Token *pId1, /* First part of [schema.]id field */ Token *pId2, /* Second part of [schema.]id field, or NULL */ Token *pValue, /* Token for , or NULL */ @@ -122540,8 +122540,8 @@ SQLITE_PRIVATE void sqlite3Pragma( if( iDb<0 ) return; pDb = &db->aDb[iDb]; - /* If the temp database has been explicitly named as part of the - ** pragma, make sure it is open. + /* If the temp database has been explicitly named as part of the + ** pragma, make sure it is open. */ if( iDb==1 && sqlite3OpenTempDatabase(pParse) ){ return; @@ -122609,7 +122609,7 @@ SQLITE_PRIVATE void sqlite3Pragma( } /* Register the result column names for pragmas that return results */ - if( (pPragma->mPragFlg & PragFlg_NoColumns)==0 + if( (pPragma->mPragFlg & PragFlg_NoColumns)==0 && ((pPragma->mPragFlg & PragFlg_NoColumns1)==0 || zRight==0) ){ setPragmaResultColumnNames(v, pPragma); @@ -122617,7 +122617,7 @@ SQLITE_PRIVATE void sqlite3Pragma( /* Jump to the appropriate pragma handler */ switch( pPragma->ePragTyp ){ - + #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED) /* ** PRAGMA [schema.]default_cache_size @@ -122733,7 +122733,7 @@ SQLITE_PRIVATE void sqlite3Pragma( ** PRAGMA [schema.]max_page_count=N ** ** The first form reports the current setting for the - ** maximum number of pages in the database file. The + ** maximum number of pages in the database file. The ** second form attempts to change this setting. Both ** forms return the current setting. ** @@ -122752,7 +122752,7 @@ SQLITE_PRIVATE void sqlite3Pragma( if( sqlite3Tolower(zLeft[0])=='p' ){ sqlite3VdbeAddOp2(v, OP_Pagecount, iDb, iReg); }else{ - sqlite3VdbeAddOp3(v, OP_MaxPgcnt, iDb, iReg, + sqlite3VdbeAddOp3(v, OP_MaxPgcnt, iDb, iReg, sqlite3AbsInt32(sqlite3Atoi(zRight))); } sqlite3VdbeAddOp2(v, OP_ResultRow, iReg, 1); @@ -122894,7 +122894,7 @@ SQLITE_PRIVATE void sqlite3Pragma( */ rc = sqlite3BtreeSetAutoVacuum(pBt, eAuto); if( rc==SQLITE_OK && (eAuto==1 || eAuto==2) ){ - /* When setting the auto_vacuum mode to either "full" or + /* When setting the auto_vacuum mode to either "full" or ** "incremental", write the value of meta[6] in the database ** file. Before writing to meta[6], check that meta[3] indicates ** that this really is an auto-vacuum capable database. @@ -122996,7 +122996,7 @@ SQLITE_PRIVATE void sqlite3Pragma( assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); if( !zRight ){ returnSingleInt(v, - (db->flags & SQLITE_CacheSpill)==0 ? 0 : + (db->flags & SQLITE_CacheSpill)==0 ? 0 : sqlite3BtreeSetSpillSize(pDb->pBt,0)); }else{ int size = 1; @@ -123170,7 +123170,7 @@ SQLITE_PRIVATE void sqlite3Pragma( Pager *pPager = sqlite3BtreePager(pDb->pBt); char *proxy_file_path = NULL; sqlite3_file *pFile = sqlite3PagerFile(pPager); - sqlite3OsFileControlHint(pFile, SQLITE_GET_LOCKPROXYFILE, + sqlite3OsFileControlHint(pFile, SQLITE_GET_LOCKPROXYFILE, &proxy_file_path); returnSingleText(v, proxy_file_path); }else{ @@ -123178,10 +123178,10 @@ SQLITE_PRIVATE void sqlite3Pragma( sqlite3_file *pFile = sqlite3PagerFile(pPager); int res; if( zRight[0] ){ - res=sqlite3OsFileControl(pFile, SQLITE_SET_LOCKPROXYFILE, + res=sqlite3OsFileControl(pFile, SQLITE_SET_LOCKPROXYFILE, zRight); } else { - res=sqlite3OsFileControl(pFile, SQLITE_SET_LOCKPROXYFILE, + res=sqlite3OsFileControl(pFile, SQLITE_SET_LOCKPROXYFILE, NULL); } if( res!=SQLITE_OK ){ @@ -123191,8 +123191,8 @@ SQLITE_PRIVATE void sqlite3Pragma( } break; } -#endif /* SQLITE_ENABLE_LOCKING_STYLE */ - +#endif /* SQLITE_ENABLE_LOCKING_STYLE */ + /* ** PRAGMA [schema.]synchronous ** PRAGMA [schema.]synchronous=OFF|ON|NORMAL|FULL|EXTRA @@ -123207,7 +123207,7 @@ SQLITE_PRIVATE void sqlite3Pragma( returnSingleInt(v, pDb->safety_level-1); }else{ if( !db->autoCommit ){ - sqlite3ErrorMsg(pParse, + sqlite3ErrorMsg(pParse, "Safety level may not be changed inside a transaction"); }else if( iDb!=1 ){ int iLevel = (getSafetyLevel(zRight,0,1)+1) & PAGER_SYNCHRONOUS_MASK; @@ -123247,7 +123247,7 @@ SQLITE_PRIVATE void sqlite3Pragma( if( mask==SQLITE_DeferFKs ) db->nDeferredImmCons = 0; } - /* Many of the flag-pragmas modify the code generated by the SQL + /* Many of the flag-pragmas modify the code generated by the SQL ** compiler (eg. count_changes). So add an opcode to expire all ** compiled SQL statements after modifying a pragma value. */ @@ -123481,7 +123481,7 @@ SQLITE_PRIVATE void sqlite3Pragma( pFK = pTab->pFKey; if( pFK ){ int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema); - int i = 0; + int i = 0; pParse->nMem = 8; sqlite3CodeVerifySchema(pParse, iTabDb); while(pFK){ @@ -123578,8 +123578,8 @@ SQLITE_PRIVATE void sqlite3Pragma( addrOk = sqlite3VdbeMakeLabel(pParse); /* Generate code to read the child key values into registers - ** regRow..regRow+n. If any of the child key values are NULL, this - ** row cannot cause an FK violation. Jump directly to addrOk in + ** regRow..regRow+n. If any of the child key values are NULL, this + ** row cannot cause an FK violation. Jump directly to addrOk in ** this case. */ for(j=0; jnCol; j++){ int iCol = aiCols ? aiCols[j] : pFK->aCol[j].iFrom; @@ -123644,7 +123644,7 @@ SQLITE_PRIVATE void sqlite3Pragma( ** ** Verify the integrity of the database. ** - ** The "quick_check" is reduced version of + ** The "quick_check" is reduced version of ** integrity_check designed to detect most database corruption ** without the overhead of cross-checking indexes. Quick_check ** is linear time wherease integrity_check is O(NlogN). @@ -123750,7 +123750,7 @@ SQLITE_PRIVATE void sqlite3Pragma( sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenRead, 0, 1, 0, &iDataCur, &iIdxCur); /* reg[7] counts the number of entries in the table. - ** reg[8+i] counts the number of entries in the i-th index + ** reg[8+i] counts the number of entries in the i-th index */ sqlite3VdbeAddOp2(v, OP_Integer, 0, 7); for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ @@ -123792,7 +123792,7 @@ SQLITE_PRIVATE void sqlite3Pragma( for(k=pCheck->nExpr-1; k>0; k--){ sqlite3ExprIfFalse(pParse, pCheck->a[k].pExpr, addrCkFault, 0); } - sqlite3ExprIfTrue(pParse, pCheck->a[0].pExpr, addrCkOk, + sqlite3ExprIfTrue(pParse, pCheck->a[0].pExpr, addrCkOk, SQLITE_JUMPIFNULL); sqlite3VdbeResolveLabel(v, addrCkFault); pParse->iSelfTab = 0; @@ -123869,7 +123869,7 @@ SQLITE_PRIVATE void sqlite3Pragma( } } #endif /* SQLITE_OMIT_BTREECOUNT */ - } + } } { static const int iLn = VDBE_OFFSET_LINENO(2); @@ -123911,7 +123911,7 @@ SQLITE_PRIVATE void sqlite3Pragma( ** encoding that will be used for the main database file if a new file ** is created. If an existing main database file is opened, then the ** default text encoding for the existing database is used. - ** + ** ** In all cases new databases created using the ATTACH command are ** created to use the same default text encoding as the main database. If ** the main database has not been initialized and/or created when ATTACH @@ -123949,9 +123949,9 @@ SQLITE_PRIVATE void sqlite3Pragma( ** will be overwritten when the schema is next loaded. If it does not ** already exists, it will be created to use the new encoding value. */ - if( - !(DbHasProperty(db, 0, DB_SchemaLoaded)) || - DbHasProperty(db, 0, DB_Empty) + if( + !(DbHasProperty(db, 0, DB_SchemaLoaded)) || + DbHasProperty(db, 0, DB_Empty) ){ for(pEnc=&encnames[0]; pEnc->zName; pEnc++){ if( 0==sqlite3StrICmp(zRight, pEnc->zName) ){ @@ -124095,8 +124095,8 @@ SQLITE_PRIVATE void sqlite3Pragma( if( zRight ){ sqlite3_wal_autocheckpoint(db, sqlite3Atoi(zRight)); } - returnSingleInt(v, - db->xWalCallback==sqlite3WalDefaultHook ? + returnSingleInt(v, + db->xWalCallback==sqlite3WalDefaultHook ? SQLITE_PTR_TO_INT(db->pWalArg) : 0); } break; @@ -124136,7 +124136,7 @@ SQLITE_PRIVATE void sqlite3Pragma( ** 0x0002 Run ANALYZE on tables that might benefit. On by default. ** See below for additional information. ** - ** 0x0004 (Not yet implemented) Record usage and performance + ** 0x0004 (Not yet implemented) Record usage and performance ** information from the current session in the ** database file so that it will be available to "optimize" ** pragmas run by future database connections. @@ -124147,7 +124147,7 @@ SQLITE_PRIVATE void sqlite3Pragma( ** The default MASK is and always shall be 0xfffe. 0xfffe means perform all ** of the optimizations listed above except Debug Mode, including new ** optimizations that have not yet been invented. If new optimizations are - ** ever added that should be off by default, those off-by-default + ** ever added that should be off by default, those off-by-default ** optimizations will have bitmasks of 0x10000 or larger. ** ** DETERMINATION OF WHEN TO RUN ANALYZE @@ -124208,7 +124208,7 @@ SQLITE_PRIVATE void sqlite3Pragma( } if( szThreshold ){ sqlite3OpenTable(pParse, iTabCur, iDb, pTab, OP_OpenRead); - sqlite3VdbeAddOp3(v, OP_IfSmaller, iTabCur, + sqlite3VdbeAddOp3(v, OP_IfSmaller, iTabCur, sqlite3VdbeCurrentAddr(v)+2+(opMask&1), szThreshold); VdbeCoverage(v); } @@ -124302,7 +124302,7 @@ SQLITE_PRIVATE void sqlite3Pragma( pBt = db->aDb[i].pBt; if( pBt==0 || sqlite3BtreePager(pBt)==0 ){ zState = "closed"; - }else if( sqlite3_file_control(db, i ? db->aDb[i].zDbSName : 0, + }else if( sqlite3_file_control(db, i ? db->aDb[i].zDbSName : 0, SQLITE_FCNTL_LOCKSTATE, &j)==SQLITE_OK ){ zState = azLockName[j]; } @@ -124374,7 +124374,7 @@ SQLITE_PRIVATE void sqlite3Pragma( /* The following block is a no-op unless SQLITE_DEBUG is defined. Its only ** purpose is to execute assert() statements to verify that if the ** PragFlg_NoColumns1 flag is set and the caller specified an argument - ** to the PRAGMA, the implementation has not added any OP_ResultRow + ** to the PRAGMA, the implementation has not added any OP_ResultRow ** instructions to the VM. */ if( (pPragma->mPragFlg & PragFlg_NoColumns1) && zRight ){ sqlite3VdbeVerifyNoResultRow(v); @@ -124405,7 +124405,7 @@ struct PragmaVtabCursor { char *azArg[2]; /* Value of the argument and schema */ }; -/* +/* ** Pragma virtual table module xConnect method. */ static int pragmaVtabConnect( @@ -124467,7 +124467,7 @@ static int pragmaVtabConnect( return rc; } -/* +/* ** Pragma virtual table module xDisconnect method. */ static int pragmaVtabDisconnect(sqlite3_vtab *pVtab){ @@ -124565,11 +124565,11 @@ static int pragmaVtabNext(sqlite3_vtab_cursor *pVtabCursor){ return rc; } -/* +/* ** Pragma virtual table module xFilter method. */ static int pragmaVtabFilter( - sqlite3_vtab_cursor *pVtabCursor, + sqlite3_vtab_cursor *pVtabCursor, int idxNum, const char *idxStr, int argc, sqlite3_value **argv ){ @@ -124624,11 +124624,11 @@ static int pragmaVtabEof(sqlite3_vtab_cursor *pVtabCursor){ } /* The xColumn method simply returns the corresponding column from -** the PRAGMA. +** the PRAGMA. */ static int pragmaVtabColumn( - sqlite3_vtab_cursor *pVtabCursor, - sqlite3_context *ctx, + sqlite3_vtab_cursor *pVtabCursor, + sqlite3_context *ctx, int i ){ PragmaVtabCursor *pCsr = (PragmaVtabCursor*)pVtabCursor; @@ -124641,7 +124641,7 @@ static int pragmaVtabColumn( return SQLITE_OK; } -/* +/* ** Pragma virtual table module xRowid method. */ static int pragmaVtabRowid(sqlite3_vtab_cursor *pVtabCursor, sqlite_int64 *p){ @@ -124911,7 +124911,7 @@ SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFl } /* If there is not already a read-only (or read-write) transaction opened - ** on the b-tree database, open one now. If a transaction is opened, it + ** on the b-tree database, open one now. If a transaction is opened, it ** will be closed before this function returns. */ sqlite3BtreeEnter(pDb->pBt); if( !sqlite3BtreeIsInReadTrans(pDb->pBt) ){ @@ -125019,7 +125019,7 @@ SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFl assert( db->init.busy ); { char *zSql; - zSql = sqlite3MPrintf(db, + zSql = sqlite3MPrintf(db, "SELECT*FROM\"%w\".%s ORDER BY rowid", db->aDb[iDb].zDbSName, zMasterName); #ifndef SQLITE_OMIT_AUTHORIZATION @@ -125047,7 +125047,7 @@ SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFl } if( rc==SQLITE_OK || (db->flags&SQLITE_NoSchemaError)){ /* Black magic: If the SQLITE_NoSchemaError flag is set, then consider - ** the schema loaded, even if errors occurred. In this situation the + ** the schema loaded, even if errors occurred. In this situation the ** current sqlite3_prepare() operation will fail, but the following one ** will attempt to compile the supplied statement against whatever subset ** of the schema was loaded before the error occurred. The primary @@ -125092,7 +125092,7 @@ error_out: SQLITE_PRIVATE int sqlite3Init(sqlite3 *db, char **pzErrMsg){ int i, rc; int commit_internal = !(db->mDbFlags&DBFLAG_SchemaChange); - + assert( sqlite3_mutex_held(db->mutex) ); assert( sqlite3BtreeHoldsMutex(db->aDb[0].pBt) ); assert( db->init.busy==0 ); @@ -125157,7 +125157,7 @@ static void schemaIsValid(Parse *pParse){ if( pBt==0 ) continue; /* If there is not already a read-only (or read-write) transaction opened - ** on the b-tree database, open one now. If a transaction is opened, it + ** on the b-tree database, open one now. If a transaction is opened, it ** will be closed immediately after reading the meta-value. */ if( !sqlite3BtreeIsInReadTrans(pBt) ){ rc = sqlite3BtreeBeginTrans(pBt, 0, 0); @@ -125168,7 +125168,7 @@ static void schemaIsValid(Parse *pParse){ openedTransaction = 1; } - /* Read the schema cookie from the database. If it does not match the + /* Read the schema cookie from the database. If it does not match the ** value stored as part of the in-memory schema representation, ** set Parse.rc to SQLITE_SCHEMA. */ sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&cookie); @@ -125195,13 +125195,13 @@ static void schemaIsValid(Parse *pParse){ SQLITE_PRIVATE int sqlite3SchemaToIndex(sqlite3 *db, Schema *pSchema){ int i = -1000000; - /* If pSchema is NULL, then return -1000000. This happens when code in + /* If pSchema is NULL, then return -1000000. This happens when code in ** expr.c is trying to resolve a reference to a transient table (i.e. one - ** created by a sub-select). In this case the return value of this + ** created by a sub-select). In this case the return value of this ** function should never be used. ** ** We return -1000000 instead of the more usual -1 simply because using - ** -1000000 as the incorrect index into db->aDb[] is much + ** -1000000 as the incorrect index into db->aDb[] is much ** more likely to cause a segfault than -1 (of course there are assert() ** statements too, but it never hurts to play the odds). */ @@ -125280,8 +125280,8 @@ static int sqlite3Prepare( ** This thread is currently holding mutexes on all Btrees (because ** of the sqlite3BtreeEnterAll() in sqlite3LockAndPrepare()) so it ** is not possible for another thread to start a new schema change - ** while this routine is running. Hence, we do not need to hold - ** locks on the schema, we just need to make sure nobody else is + ** while this routine is running. Hence, we do not need to hold + ** locks on the schema, we just need to make sure nobody else is ** holding them. ** ** Note that setting READ_UNCOMMITTED overrides most lock detection, @@ -125538,7 +125538,7 @@ SQLITE_API int sqlite3_prepare_v3( ** Compile the UTF-16 encoded SQL statement zSql into a statement handle. */ static int sqlite3Prepare16( - sqlite3 *db, /* Database handle. */ + sqlite3 *db, /* Database handle. */ const void *zSql, /* UTF-16 encoded SQL statement. */ int nBytes, /* Length of zSql in bytes. */ u32 prepFlags, /* Zero or more SQLITE_PREPARE_* flags */ @@ -125581,7 +125581,7 @@ static int sqlite3Prepare16( int chars_parsed = sqlite3Utf8CharLen(zSql8, (int)(zTail8-zSql8)); *pzTail = (u8 *)zSql + sqlite3Utf16ByteLen(zSql, chars_parsed); } - sqlite3DbFree(db, zSql8); + sqlite3DbFree(db, zSql8); rc = sqlite3ApiExit(db, rc); sqlite3_mutex_leave(db->mutex); return rc; @@ -125596,7 +125596,7 @@ static int sqlite3Prepare16( ** occurs. */ SQLITE_API int sqlite3_prepare16( - sqlite3 *db, /* Database handle. */ + sqlite3 *db, /* Database handle. */ const void *zSql, /* UTF-16 encoded SQL statement. */ int nBytes, /* Length of zSql in bytes. */ sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ @@ -125608,7 +125608,7 @@ SQLITE_API int sqlite3_prepare16( return rc; } SQLITE_API int sqlite3_prepare16_v2( - sqlite3 *db, /* Database handle. */ + sqlite3 *db, /* Database handle. */ const void *zSql, /* UTF-16 encoded SQL statement. */ int nBytes, /* Length of zSql in bytes. */ sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ @@ -125620,7 +125620,7 @@ SQLITE_API int sqlite3_prepare16_v2( return rc; } SQLITE_API int sqlite3_prepare16_v3( - sqlite3 *db, /* Database handle. */ + sqlite3 *db, /* Database handle. */ const void *zSql, /* UTF-16 encoded SQL statement. */ int nBytes, /* Length of zSql in bytes. */ unsigned int prepFlags, /* Zero or more SQLITE_PREPARE_* flags */ @@ -125880,7 +125880,7 @@ SQLITE_PRIVATE int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *p for(i=0; i<3 && apAll[i]; i++){ p = apAll[i]; for(j=0; jn==aKeyword[j].nChar + if( p->n==aKeyword[j].nChar && sqlite3StrNICmp((char*)p->z, &zKeyText[aKeyword[j].i], p->n)==0 ){ jointype |= aKeyword[j].code; break; @@ -125902,9 +125902,9 @@ SQLITE_PRIVATE int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *p sqlite3ErrorMsg(pParse, "unknown or unsupported join type: " "%T %T%s%T", pA, pB, zSp, pC); jointype = JT_INNER; - }else if( (jointype & JT_OUTER)!=0 + }else if( (jointype & JT_OUTER)!=0 && (jointype & (JT_LEFT|JT_RIGHT))!=JT_LEFT ){ - sqlite3ErrorMsg(pParse, + sqlite3ErrorMsg(pParse, "RIGHT and FULL OUTER JOINs are not currently supported"); jointype = JT_INNER; } @@ -125925,7 +125925,7 @@ static int columnIndex(Table *pTab, const char *zCol){ /* ** Search the first N tables in pSrc, from left to right, looking for a -** table that has a column named zCol. +** table that has a column named zCol. ** ** When found, set *piTab and *piCol to the table index and column index ** of the matching column and return TRUE. @@ -125963,7 +125963,7 @@ static int tableAndColumnIndex( ** ** (tab1.col1 = tab2.col2) ** -** where tab1 is the iSrc'th table in SrcList pSrc and tab2 is the +** where tab1 is the iSrc'th table in SrcList pSrc and tab2 is the ** (iSrc+1)'th. Column col1 is column iColLeft of tab1, and col2 is ** column iColRight of tab2. */ @@ -126040,7 +126040,7 @@ static void setJoinExpr(Expr *p, int iTable){ } setJoinExpr(p->pLeft, iTable); p = p->pRight; - } + } } /* Undo the work of setJoinExpr(). In the expression tree p, convert every @@ -126063,7 +126063,7 @@ static void unsetJoinExpr(Expr *p, int iTable){ } unsetJoinExpr(p->pLeft, iTable); p = p->pRight; - } + } } /* @@ -126136,7 +126136,7 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){ } /* Create extra terms on the WHERE clause for each column named - ** in the USING clause. Example: If the two tables to be joined are + ** in the USING clause. Example: If the two tables to be joined are ** A and B and the USING clause names X, Y, and Z, then add this ** to the WHERE clause: A.X=B.X AND A.Y=B.Y AND A.Z=B.Z ** Report an error if any column mentioned in the USING clause is @@ -126257,7 +126257,7 @@ static void pushOntoSorter( ** case regData==regOrigData. ** (3) Some output columns are omitted from the sort record due to ** the SQLITE_ENABLE_SORTER_REFERENCE optimization, or due to the - ** SQLITE_ECEL_OMITREF optimization, or due to the + ** SQLITE_ECEL_OMITREF optimization, or due to the ** SortCtx.pDeferredRowLoad optimiation. In any of these cases ** regOrigData is 0 to prevent this routine from trying to copy ** values that might not yet exist. @@ -126295,7 +126295,7 @@ static void pushOntoSorter( pParse->nMem += pSort->nOBSat; nKey = nExpr - pSort->nOBSat + bSeq; if( bSeq ){ - addrFirst = sqlite3VdbeAddOp1(v, OP_IfNot, regBase+nExpr); + addrFirst = sqlite3VdbeAddOp1(v, OP_IfNot, regBase+nExpr); }else{ addrFirst = sqlite3VdbeAddOp1(v, OP_SequenceTest, pSort->iECursor); } @@ -126328,10 +126328,10 @@ static void pushOntoSorter( /* At this point the values for the new sorter entry are stored ** in an array of registers. They need to be composed into a record ** and inserted into the sorter if either (a) there are currently - ** less than LIMIT+OFFSET items or (b) the new record is smaller than + ** less than LIMIT+OFFSET items or (b) the new record is smaller than ** the largest record currently in the sorter. If (b) is true and there ** are already LIMIT+OFFSET items in the sorter, delete the largest - ** entry before inserting the new one. This way there are never more + ** entry before inserting the new one. This way there are never more ** than LIMIT+OFFSET items in the sorter. ** ** If the new record does not need to be inserted into the sorter, @@ -126410,8 +126410,8 @@ static void codeDistinct( #ifdef SQLITE_ENABLE_SORTER_REFERENCES /* ** This function is called as part of inner-loop generation for a SELECT -** statement with an ORDER BY that is not optimized by an index. It -** determines the expressions, if any, that the sorter-reference +** statement with an ORDER BY that is not optimized by an index. It +** determines the expressions, if any, that the sorter-reference ** optimization should be used for. The sorter-reference optimization ** is used for SELECT queries like: ** @@ -126421,11 +126421,11 @@ static void codeDistinct( ** storing values read from that column in the sorter records, the PK of ** the row from table t1 is stored instead. Then, as records are extracted from ** the sorter to return to the user, the required value of bigblob is -** retrieved directly from table t1. If the values are very large, this +** retrieved directly from table t1. If the values are very large, this ** can be more efficient than storing them directly in the sorter records. ** -** The ExprList_item.bSorterRef flag is set for each expression in pEList -** for which the sorter-reference optimization should be enabled. +** The ExprList_item.bSorterRef flag is set for each expression in pEList +** for which the sorter-reference optimization should be enabled. ** Additionally, the pSort->aDefer[] array is populated with entries ** for all cursors required to evaluate all selected expressions. Finally. ** output variable (*ppExtra) is set to an expression list containing @@ -126494,7 +126494,7 @@ static void selectExprDefer( ** ** If srcTab is negative, then the p->pEList expressions ** are evaluated in order to get the data for this row. If srcTab is -** zero or more, then data is pulled from srcTab and p->pEList is used only +** zero or more, then data is pulled from srcTab and p->pEList is used only ** to get the number of columns and the collation sequence for each column. */ static void selectInnerLoop( @@ -126576,8 +126576,8 @@ static void selectInnerLoop( } if( pSort && hasDistinct==0 && eDest!=SRT_EphemTab && eDest!=SRT_Table ){ /* For each expression in p->pEList that is a copy of an expression in - ** the ORDER BY clause (pSort->pOrderBy), set the associated - ** iOrderByCol value to one more than the index of the ORDER BY + ** the ORDER BY clause (pSort->pOrderBy), set the associated + ** iOrderByCol value to one more than the index of the ORDER BY ** expression within the sort-key that pushOntoSorter() will generate. ** This allows the p->pEList field to be omitted from the sorted record, ** saving space and CPU cycles. */ @@ -126593,7 +126593,7 @@ static void selectInnerLoop( selectExprDefer(pParse, pSort, p->pEList, &pExtra); if( pExtra && pParse->db->mallocFailed==0 ){ /* If there are any extra PK columns to add to the sorter records, - ** allocate extra memory cells and adjust the OpenEphemeral + ** allocate extra memory cells and adjust the OpenEphemeral ** instruction to account for the larger records. This is only ** required if there are one or more WITHOUT ROWID tables with ** composite primary keys in the SortCtx.aDefer[] array. */ @@ -126623,7 +126623,7 @@ static void selectInnerLoop( testcase( eDest==SRT_Mem ); testcase( eDest==SRT_Coroutine ); testcase( eDest==SRT_Output ); - assert( eDest==SRT_Set || eDest==SRT_Mem + assert( eDest==SRT_Set || eDest==SRT_Mem || eDest==SRT_Coroutine || eDest==SRT_Output ); } sRowLoadInfo.regResult = regResult; @@ -126634,7 +126634,7 @@ static void selectInnerLoop( if( pExtra ) nResultCol += pExtra->nExpr; #endif if( p->iLimit - && (ecelFlags & SQLITE_ECEL_OMITREF)!=0 + && (ecelFlags & SQLITE_ECEL_OMITREF)!=0 && nPrefixReg>0 ){ assert( pSort!=0 ); @@ -126788,7 +126788,7 @@ static void selectInnerLoop( }else{ int r1 = sqlite3GetTempReg(pParse); assert( sqlite3Strlen30(pDest->zAffSdst)==nResultCol ); - sqlite3VdbeAddOp4(v, OP_MakeRecord, regResult, nResultCol, + sqlite3VdbeAddOp4(v, OP_MakeRecord, regResult, nResultCol, r1, pDest->zAffSdst, nResultCol); sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, regResult, nResultCol); sqlite3ReleaseTempReg(pParse, r1); @@ -126805,7 +126805,7 @@ static void selectInnerLoop( } /* If this is a scalar select that is part of an expression, then - ** store the results in the appropriate memory cell or array of + ** store the results in the appropriate memory cell or array of ** memory cells and break out of the scan loop. */ case SRT_Mem: { @@ -126860,7 +126860,7 @@ static void selectInnerLoop( /* If the destination is DistQueue, then cursor (iParm+1) is open ** on a second ephemeral index that holds all values every previously ** added to the queue. */ - addrTest = sqlite3VdbeAddOp4Int(v, OP_Found, iParm+1, 0, + addrTest = sqlite3VdbeAddOp4Int(v, OP_Found, iParm+1, 0, regResult, nResultCol); VdbeCoverage(v); } @@ -127113,7 +127113,7 @@ static void generateSortTail( if( pSort->labelBkOut ){ addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); } - sqlite3VdbeAddOp3(v, OP_OpenPseudo, iSortTab, regSortOut, + sqlite3VdbeAddOp3(v, OP_OpenPseudo, iSortTab, regSortOut, nKey+1+nColumn+nRefKey); if( addrOnce ) sqlite3VdbeJumpHere(v, addrOnce); addr = 1 + sqlite3VdbeAddOp2(v, OP_SorterSort, iTab, addrBreak); @@ -127146,7 +127146,7 @@ static void generateSortTail( sqlite3VdbeAddOp1(v, OP_NullRow, iCsr); if( HasRowid(pTab) ){ sqlite3VdbeAddOp3(v, OP_Column, iSortTab, iKey++, regKey); - sqlite3VdbeAddOp3(v, OP_SeekRowid, iCsr, + sqlite3VdbeAddOp3(v, OP_SeekRowid, iCsr, sqlite3VdbeCurrentAddr(v)+1, regKey); }else{ int k; @@ -127204,7 +127204,7 @@ static void generateSortTail( } #endif default: { - assert( eDest==SRT_Output || eDest==SRT_Coroutine ); + assert( eDest==SRT_Output || eDest==SRT_Coroutine ); testcase( eDest==SRT_Output ); testcase( eDest==SRT_Coroutine ); if( eDest==SRT_Output ){ @@ -127246,14 +127246,14 @@ static void generateSortTail( ** original CREATE TABLE statement if the expression is a column. The ** declaration type for a ROWID field is INTEGER. Exactly when an expression ** is considered a column can be complex in the presence of subqueries. The -** result-set expression in all of the following SELECT statements is +** result-set expression in all of the following SELECT statements is ** considered a column by this function. ** ** SELECT col FROM tbl; ** SELECT (SELECT col FROM tbl; ** SELECT (SELECT col FROM tbl); ** SELECT abc FROM (SELECT col AS abc FROM tbl); -** +** ** The declaration type for any expression other than a column is NULL. ** ** This routine has either 3 or 6 parameters depending on whether or not @@ -127265,7 +127265,7 @@ static void generateSortTail( # define columnType(A,B,C,D,E) columnTypeImpl(A,B) #endif static const char *columnTypeImpl( - NameContext *pNC, + NameContext *pNC, #ifndef SQLITE_ENABLE_COLUMN_METADATA Expr *pExpr #else @@ -127308,19 +127308,19 @@ static const char *columnTypeImpl( if( pTab==0 ){ /* At one time, code such as "SELECT new.x" within a trigger would ** cause this condition to run. Since then, we have restructured how - ** trigger code is generated and so this condition is no longer + ** trigger code is generated and so this condition is no longer ** possible. However, it can still be true for statements like ** the following: ** ** CREATE TABLE t1(col INTEGER); ** SELECT (SELECT t1.col) FROM FROM t1; ** - ** when columnType() is called on the expression "t1.col" in the + ** when columnType() is called on the expression "t1.col" in the ** sub-select. In this case, set the column type to NULL, even ** though it should really be "INTEGER". ** ** This is not a problem, as the column type of "t1.col" is never - ** used. When columnType() is called on the expression + ** used. When columnType() is called on the expression ** "(SELECT t1.col)", the correct type is returned (see the TK_SELECT ** branch below. */ break; @@ -127334,7 +127334,7 @@ static const char *columnTypeImpl( */ if( iCol>=0 && iColpEList->nExpr ){ /* If iCol is less than zero, then the expression requests the - ** rowid of the sub-select or view. This expression is legal (see + ** rowid of the sub-select or view. This expression is legal (see ** test case misc2.2.2) - it always evaluates to NULL. */ NameContext sNC; @@ -127342,7 +127342,7 @@ static const char *columnTypeImpl( sNC.pSrcList = pS->pSrc; sNC.pNext = pNC; sNC.pParse = pNC->pParse; - zType = columnType(&sNC, p,&zOrigDb,&zOrigTab,&zOrigCol); + zType = columnType(&sNC, p,&zOrigDb,&zOrigTab,&zOrigCol); } }else{ /* A real table or a CTE table */ @@ -127386,13 +127386,13 @@ static const char *columnTypeImpl( sNC.pSrcList = pS->pSrc; sNC.pNext = pNC; sNC.pParse = pNC->pParse; - zType = columnType(&sNC, p, &zOrigDb, &zOrigTab, &zOrigCol); + zType = columnType(&sNC, p, &zOrigDb, &zOrigTab, &zOrigCol); break; } #endif } -#ifdef SQLITE_ENABLE_COLUMN_METADATA +#ifdef SQLITE_ENABLE_COLUMN_METADATA if( pzOrigDb ){ assert( pzOrigTab && pzOrigCol ); *pzOrigDb = zOrigDb; @@ -127428,7 +127428,7 @@ static void generateColumnTypes( const char *zOrigCol = 0; zType = columnType(&sNC, p, &zOrigDb, &zOrigTab, &zOrigCol); - /* The vdbe must make its own copy of the column-type and other + /* The vdbe must make its own copy of the column-type and other ** column specific strings, in case the schema is reset before this ** virtual machine is deleted. */ @@ -127662,7 +127662,7 @@ SQLITE_PRIVATE int sqlite3ColumnsFromExprList( /* ** Add type and collation information to a column list based on ** a SELECT statement. -** +** ** The column list presumably came from selectColumnNamesFromExprList(). ** The column list has only names, not types or collations. This ** routine goes through and adds the types and collations. @@ -127770,9 +127770,9 @@ SQLITE_PRIVATE Vdbe *sqlite3GetVdbe(Parse *pParse){ ** Compute the iLimit and iOffset fields of the SELECT based on the ** pLimit expressions. pLimit->pLeft and pLimit->pRight hold the expressions ** that appear in the original SQL statement after the LIMIT and OFFSET -** keywords. Or NULL if those keywords are omitted. iLimit and iOffset -** are the integer memory register numbers for counters used to compute -** the limit and offset. If there is no limit and/or offset, then +** keywords. Or NULL if those keywords are omitted. iLimit and iOffset +** are the integer memory register numbers for counters used to compute +** the limit and offset. If there is no limit and/or offset, then ** iLimit and iOffset are negative. ** ** This routine changes the values of iLimit and iOffset only if @@ -127798,7 +127798,7 @@ static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){ if( p->iLimit ) return; - /* + /* ** "LIMIT -1" always shows all rows. There is some ** controversy about what the correct behavior should be. ** The current implementation interprets "LIMIT 0" to mean @@ -127926,7 +127926,7 @@ static KeyInfo *multiSelectOrderByKeyInfo(Parse *pParse, Select *p, int nExtra){ ** inserted into the Queue table. The iDistinct table keeps a copy of all rows ** that have ever been inserted into Queue and causes duplicates to be ** discarded. If the operator is UNION ALL, then duplicates are allowed. -** +** ** If the query has an ORDER BY, then entries in the Queue table are kept in ** ORDER BY order and the first entry is extracted for each cycle. Without ** an ORDER BY, the Queue table is just a FIFO. @@ -128136,7 +128136,7 @@ static int multiSelectValues( ** ** "p" points to the right-most of the two queries. the query on the ** left is p->pPrior. The left query could also be a compound query -** in which case this routine will be called recursively. +** in which case this routine will be called recursively. ** ** The results of the total query are to be written into a destination ** of type eDest with parameter iParm. @@ -128265,7 +128265,7 @@ static int multiSelect( p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow); if( pPrior->pLimit && sqlite3ExprIsInteger(pPrior->pLimit->pLeft, &nLimit) - && nLimit>0 && p->nSelectRow > sqlite3LogEst((u64)nLimit) + && nLimit>0 && p->nSelectRow > sqlite3LogEst((u64)nLimit) ){ p->nSelectRow = sqlite3LogEst((u64)nLimit); } @@ -128282,7 +128282,7 @@ static int multiSelect( Expr *pLimit; /* Saved values of p->nLimit */ int addr; SelectDest uniondest; - + testcase( p->op==TK_EXCEPT ); testcase( p->op==TK_UNION ); priorOp = SRT_Union; @@ -128304,7 +128304,7 @@ static int multiSelect( findRightmost(p)->selFlags |= SF_UsesEphemeral; assert( p->pEList ); } - + /* Code the SELECT statements to our left */ assert( !pPrior->pOrderBy ); @@ -128313,7 +128313,7 @@ static int multiSelect( if( rc ){ goto multi_select_end; } - + /* Code the current SELECT statement */ if( p->op==TK_EXCEPT ){ @@ -128343,7 +128343,7 @@ static int multiSelect( p->pLimit = pLimit; p->iLimit = 0; p->iOffset = 0; - + /* Convert the data in the temporary table into whatever form ** it is that we currently need. */ @@ -128372,7 +128372,7 @@ static int multiSelect( int addr; SelectDest intersectdest; int r1; - + /* INTERSECT is different from the others since it requires ** two temporary tables. Hence it has its own case. Begin ** by allocating the tables we will need. @@ -128380,13 +128380,13 @@ static int multiSelect( tab1 = pParse->nTab++; tab2 = pParse->nTab++; assert( p->pOrderBy==0 ); - + addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab1, 0); assert( p->addrOpenEphm[0] == -1 ); p->addrOpenEphm[0] = addr; findRightmost(p)->selFlags |= SF_UsesEphemeral; assert( p->pEList ); - + /* Code the SELECTs to our left into temporary table "tab1". */ sqlite3SelectDestInit(&intersectdest, SRT_Union, tab1); @@ -128394,7 +128394,7 @@ static int multiSelect( if( rc ){ goto multi_select_end; } - + /* Code the current SELECT into temporary table "tab2" */ addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab2, 0); @@ -128415,7 +128415,7 @@ static int multiSelect( } sqlite3ExprDelete(db, p->pLimit); p->pLimit = pLimit; - + /* Generate code to take the intersection of the two temporary ** tables. */ @@ -128439,15 +128439,15 @@ static int multiSelect( break; } } - + #ifndef SQLITE_OMIT_EXPLAIN if( p->pNext==0 ){ ExplainQueryPlanPop(pParse); } #endif } - - /* Compute collating sequences used by + + /* Compute collating sequences used by ** temporary tables needed to implement the compound select. ** Attach the KeyInfo structure to all temporary tables. ** @@ -128553,7 +128553,7 @@ static int generateOutputSubroutine( addr = sqlite3VdbeCurrentAddr(v); iContinue = sqlite3VdbeMakeLabel(pParse); - /* Suppress duplicates for UNION, EXCEPT, and INTERSECT + /* Suppress duplicates for UNION, EXCEPT, and INTERSECT */ if( regPrev ){ int addr1, addr2; @@ -128595,7 +128595,7 @@ static int generateOutputSubroutine( int r1; testcase( pIn->nSdst>1 ); r1 = sqlite3GetTempReg(pParse); - sqlite3VdbeAddOp4(v, OP_MakeRecord, pIn->iSdst, pIn->nSdst, + sqlite3VdbeAddOp4(v, OP_MakeRecord, pIn->iSdst, pIn->nSdst, r1, pDest->zAffSdst, pIn->nSdst); sqlite3VdbeAddOp4Int(v, OP_IdxInsert, pDest->iSDParm, r1, pIn->iSdst, pIn->nSdst); @@ -128635,7 +128635,7 @@ static int generateOutputSubroutine( ** SRT_Output. This routine is never called with any other ** destination other than the ones handled above or SRT_Output. ** - ** For SRT_Output, results are stored in a sequence of registers. + ** For SRT_Output, results are stored in a sequence of registers. ** Then the OP_ResultRow opcode is used to cause sqlite3_step() to ** return the next row of result. */ @@ -128692,7 +128692,7 @@ static int generateOutputSubroutine( ** ** EofB: Called when data is exhausted from selectB. ** -** The implementation of the latter five subroutines depend on which +** The implementation of the latter five subroutines depend on which ** is used: ** ** @@ -128797,7 +128797,7 @@ static int multiSelectOrderBy( /* Patch up the ORDER BY clause */ - op = p->op; + op = p->op; pPrior = p->pPrior; assert( pPrior->pOrderBy==0 ); pOrderBy = p->pOrderBy; @@ -128873,7 +128873,7 @@ static int multiSelectOrderBy( } } } - + /* Separate the left and the right query from one another */ p->pPrior = 0; @@ -128918,7 +128918,7 @@ static int multiSelectOrderBy( sqlite3VdbeEndCoroutine(v, regAddrA); sqlite3VdbeJumpHere(v, addr1); - /* Generate a coroutine to evaluate the SELECT statement on + /* Generate a coroutine to evaluate the SELECT statement on ** the right - the "B" select */ addrSelectB = sqlite3VdbeCurrentAddr(v) + 1; @@ -128927,7 +128927,7 @@ static int multiSelectOrderBy( savedLimit = p->iLimit; savedOffset = p->iOffset; p->iLimit = regLimitB; - p->iOffset = 0; + p->iOffset = 0; ExplainQueryPlan((pParse, 1, "RIGHT")); sqlite3Select(pParse, p, &destB); p->iLimit = savedLimit; @@ -128941,7 +128941,7 @@ static int multiSelectOrderBy( addrOutA = generateOutputSubroutine(pParse, p, &destA, pDest, regOutA, regPrev, pKeyDup, labelEnd); - + /* Generate a subroutine that outputs the current row of the B ** select as the next output row of the compound select. */ @@ -128958,7 +128958,7 @@ static int multiSelectOrderBy( */ if( op==TK_EXCEPT || op==TK_INTERSECT ){ addrEofA_noB = addrEofA = labelEnd; - }else{ + }else{ VdbeNoopComment((v, "eof-A subroutine")); addrEofA = sqlite3VdbeAddOp2(v, OP_Gosub, regOutB, addrOutB); addrEofA_noB = sqlite3VdbeAddOp2(v, OP_Yield, regAddrB, labelEnd); @@ -128973,7 +128973,7 @@ static int multiSelectOrderBy( if( op==TK_INTERSECT ){ addrEofB = addrEofA; if( p->nSelectRow > pPrior->nSelectRow ) p->nSelectRow = pPrior->nSelectRow; - }else{ + }else{ VdbeNoopComment((v, "eof-B subroutine")); addrEofB = sqlite3VdbeAddOp2(v, OP_Gosub, regOutA, addrOutA); sqlite3VdbeAddOp2(v, OP_Yield, regAddrA, labelEnd); VdbeCoverage(v); @@ -129068,13 +129068,13 @@ static void substSelect(SubstContext*, Select*, int); /* ** Scan through the expression pExpr. Replace every reference to ** a column in table number iTable with a copy of the iColumn-th -** entry in pEList. (But leave references to the ROWID column +** entry in pEList. (But leave references to the ROWID column ** unchanged.) ** ** This routine is part of the flattening procedure. A subquery ** whose result set is defined by pEList appears as entry in the ** FROM clause of a SELECT such that the VDBE cursor assigned to that -** FORM clause entry is iTable. This routine makes the necessary +** FORM clause entry is iTable. This routine makes the necessary ** changes to pExpr so that it refers directly to the source table ** of the subquery rather the result set of the subquery. */ @@ -129125,7 +129125,7 @@ static Expr *substExpr( if( pExpr ){ if( pExpr->op!=TK_COLUMN && pExpr->op!=TK_COLLATE ){ CollSeq *pColl = sqlite3ExprCollSeq(pSubst->pParse, pExpr); - pExpr = sqlite3ExprAddCollateString(pSubst->pParse, pExpr, + pExpr = sqlite3ExprAddCollateString(pSubst->pParse, pExpr, (pColl ? pColl->zName : "BINARY") ); } @@ -129215,7 +129215,7 @@ static void substSelect( ** SELECT x+y AS a FROM t1 WHERE z<100 AND a>5 ** ** The code generated for this simplification gives the same result -** but only has to scan the data once. And because indices might +** but only has to scan the data once. And because indices might ** exist on the table t1, a complete scan of the data might be ** avoided. ** @@ -129241,7 +129241,7 @@ static void substSelect( ** (4) The subquery can not be DISTINCT. ** ** (**) At one point restrictions (4) and (5) defined a subset of DISTINCT -** sub-queries that were excluded from this optimization. Restriction +** sub-queries that were excluded from this optimization. Restriction ** (4) has since been expanded to exclude all DISTINCT subqueries. ** ** (**) We no longer attempt to flatten aggregate subqueries. Was: @@ -129258,7 +129258,7 @@ static void substSelect( ** ** (**) Restriction (10) was removed from the code on 2005-02-05 but we ** accidently carried the comment forward until 2014-09-15. Original -** constraint: "If the subquery is aggregate then the outer query +** constraint: "If the subquery is aggregate then the outer query ** may not use LIMIT." ** ** (11) The subquery and the outer query may not both have ORDER BY clauses. @@ -129276,7 +129276,7 @@ static void substSelect( ** ** (16) If the outer query is aggregate, then the subquery may not ** use ORDER BY. (Ticket #2942) This used to not matter -** until we introduced the group_concat() function. +** until we introduced the group_concat() function. ** ** (17) If the subquery is a compound select, then ** (17a) all compound operators must be a UNION ALL, and @@ -129302,7 +129302,7 @@ static void substSelect( ** syntax error and return a detailed message. ** ** (18) If the sub-query is a compound select, then all terms of the -** ORDER BY clause of the parent must be simple references to +** ORDER BY clause of the parent must be simple references to ** columns of the sub-query. ** ** (19) If the subquery uses LIMIT then the outer query may not @@ -129326,7 +129326,7 @@ static void substSelect( ** recursive queries in multiSelect(). ** ** (**) We no longer attempt to flatten aggregate subqueries. Was: -** The subquery may not be an aggregate that uses the built-in min() or +** The subquery may not be an aggregate that uses the built-in min() or ** or max() functions. (Without this restriction, a query like: ** "SELECT x FROM (SELECT max(y), x FROM t1)" would not necessarily ** return the value X for which Y was maximal.) @@ -129360,7 +129360,7 @@ static int flattenSubquery( SrcList *pSubSrc; /* The FROM clause of the subquery */ int iParent; /* VDBE cursor number of the pSub result set temp table */ int iNewParent = -1;/* Replacement table for iParent */ - int isLeftJoin = 0; /* True if pSub is the right side of a LEFT JOIN */ + int isLeftJoin = 0; /* True if pSub is the right side of a LEFT JOIN */ int i; /* Loop counter */ Expr *pWhere; /* The WHERE clause */ struct SrcList_item *pSubitem; /* The subquery */ @@ -129442,7 +129442,7 @@ static int flattenSubquery( else if( iFrom>0 && !isAgg ){ /* Setting isLeftJoin to -1 causes OP_IfNullRow opcodes to be generated for ** every reference to any result column from subquery in a join, even - ** though they are not necessary. This will stress-test the OP_IfNullRow + ** though they are not necessary. This will stress-test the OP_IfNullRow ** opcode. */ isLeftJoin = -1; } @@ -129502,13 +129502,13 @@ static int flattenSubquery( pParse->zAuthContext = zSavedAuthContext; /* If the sub-query is a compound SELECT statement, then (by restrictions - ** 17 and 18 above) it must be a UNION ALL and the parent query must + ** 17 and 18 above) it must be a UNION ALL and the parent query must ** be of the form: ** - ** SELECT FROM () + ** SELECT FROM () ** ** followed by any ORDER BY, LIMIT and/or OFFSET clauses. This block - ** creates N-1 copies of the parent query without any ORDER BY, LIMIT or + ** creates N-1 copies of the parent query without any ORDER BY, LIMIT or ** OFFSET clauses and joins them to the left-hand-side of the original ** using UNION ALL operators. In this case N is the number of simple ** select statements in the compound sub-query. @@ -129561,7 +129561,7 @@ static int flattenSubquery( if( db->mallocFailed ) return 1; } - /* Begin flattening the iFrom-th entry of the FROM clause + /* Begin flattening the iFrom-th entry of the FROM clause ** in the outer query. */ pSub = pSub1 = pSubitem->pSelect; @@ -129659,10 +129659,10 @@ static int flattenSubquery( memset(&pSubSrc->a[i], 0, sizeof(pSubSrc->a[i])); } pSrc->a[iFrom].fg.jointype = jointype; - - /* Now begin substituting subquery result set expressions for + + /* Now begin substituting subquery result set expressions for ** references to the iParent in the outer query. - ** + ** ** Example: ** ** SELECT a+5, b*10 FROM (SELECT x*3 AS a, y+10 AS b FROM t1) WHERE a>b; @@ -129706,12 +129706,12 @@ static int flattenSubquery( x.pEList = pSub->pEList; substSelect(&x, pParent, 0); } - + /* The flattened query is a compound if either the inner or the ** outer query is a compound. */ pParent->selFlags |= pSub->selFlags & SF_Compound; assert( (pSub->selFlags & SF_Distinct)==0 ); /* restriction (17b) */ - + /* ** SELECT ... FROM (SELECT ... LIMIT a OFFSET b) LIMIT x OFFSET y; ** @@ -129914,7 +129914,7 @@ static int propagateConstants( sqlite3DbFree(x.pParse->db, x.apExpr); nChng += x.nChng; } - }while( x.nChng ); + }while( x.nChng ); return nChng; } @@ -129965,8 +129965,8 @@ static int propagateConstants( ** But if the (b2=2) term were to be pushed down into the bb subquery, ** then the (1,1,NULL) row would be suppressed. ** -** (6) The inner query features one or more window-functions (since -** changes to the WHERE clause of the inner query could change the +** (6) The inner query features one or more window-functions (since +** changes to the WHERE clause of the inner query could change the ** window over which window functions are calculated). ** ** Return 0 if no changes are made and non-zero if one or more WHERE clause @@ -129994,7 +129994,7 @@ static int pushDownWhereTerms( ** in the future. */ { - Select *pX; + Select *pX; for(pX=pSubq; pX; pX=pX->pPrior){ assert( (pX->selFlags & (SF_Recursive))==0 ); } @@ -130044,7 +130044,7 @@ static int pushDownWhereTerms( /* ** The pFunc is the only aggregate function in the query. Check to see -** if the query is a candidate for the min/max optimization. +** if the query is a candidate for the min/max optimization. ** ** If the query is a candidate for the min/max optimization, then set ** *ppMinMax to be an ORDER BY clause to be used for the optimization @@ -130089,7 +130089,7 @@ static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){ /* ** The select statement passed as the first argument is an aggregate query. -** The second argument is the associated aggregate-info object. This +** The second argument is the associated aggregate-info object. This ** function tests if the SELECT is of the form: ** ** SELECT count(*) FROM @@ -130104,7 +130104,7 @@ static Table *isSimpleCount(Select *p, AggInfo *pAggInfo){ assert( !p->pGroupBy ); - if( p->pWhere || p->pEList->nExpr!=1 + if( p->pWhere || p->pEList->nExpr!=1 || p->pSrc->nSrc!=1 || p->pSrc->a[0].pSelect ){ return 0; @@ -130125,8 +130125,8 @@ static Table *isSimpleCount(Select *p, AggInfo *pAggInfo){ /* ** If the source-list item passed as an argument was augmented with an ** INDEXED BY clause, then try to locate the specified index. If there -** was such a clause and the named index cannot be found, return -** SQLITE_ERROR and leave an error in pParse. Otherwise, populate +** was such a clause and the named index cannot be found, return +** SQLITE_ERROR and leave an error in pParse. Otherwise, populate ** pFrom->pIndex and return SQLITE_OK. */ SQLITE_PRIVATE int sqlite3IndexedByLookup(Parse *pParse, struct SrcList_item *pFrom){ @@ -130134,8 +130134,8 @@ SQLITE_PRIVATE int sqlite3IndexedByLookup(Parse *pParse, struct SrcList_item *pF Table *pTab = pFrom->pTab; char *zIndexedBy = pFrom->u1.zIndexedBy; Index *pIdx; - for(pIdx=pTab->pIndex; - pIdx && sqlite3StrICmp(pIdx->zName, zIndexedBy); + for(pIdx=pTab->pIndex; + pIdx && sqlite3StrICmp(pIdx->zName, zIndexedBy); pIdx=pIdx->pNext ); if( !pIdx ){ @@ -130148,7 +130148,7 @@ SQLITE_PRIVATE int sqlite3IndexedByLookup(Parse *pParse, struct SrcList_item *pF return SQLITE_OK; } /* -** Detect compound SELECT statements that use an ORDER BY clause with +** Detect compound SELECT statements that use an ORDER BY clause with ** an alternative collating sequence. ** ** SELECT ... FROM t1 EXCEPT SELECT ... FROM t2 ORDER BY .. COLLATE ... @@ -130232,9 +130232,9 @@ static int cannotBeFunction(Parse *pParse, struct SrcList_item *pFrom){ #ifndef SQLITE_OMIT_CTE /* -** Argument pWith (which may be NULL) points to a linked list of nested -** WITH contexts, from inner to outermost. If the table identified by -** FROM clause element pItem is really a common-table-expression (CTE) +** Argument pWith (which may be NULL) points to a linked list of nested +** WITH contexts, from inner to outermost. If the table identified by +** FROM clause element pItem is really a common-table-expression (CTE) ** then return a pointer to the CTE definition for that table. Otherwise ** return NULL. ** @@ -130269,7 +130269,7 @@ static struct Cte *searchWith( ** onto the top of the stack. If argument bFree is true, then this ** WITH clause will never be popped from the stack. In this case it ** should be freed along with the Parse object. In other cases, when -** bFree==0, the With object will be freed along with the SELECT +** bFree==0, the With object will be freed along with the SELECT ** statement with which it is associated. */ SQLITE_PRIVATE void sqlite3WithPush(Parse *pParse, With *pWith, u8 bFree){ @@ -130283,7 +130283,7 @@ SQLITE_PRIVATE void sqlite3WithPush(Parse *pParse, With *pWith, u8 bFree){ } /* -** This function checks if argument pFrom refers to a CTE declared by +** This function checks if argument pFrom refers to a CTE declared by ** a WITH clause on the stack currently maintained by the parser. And, ** if currently processing a CTE expression, if it is a recursive ** reference to the current CTE. @@ -130298,7 +130298,7 @@ SQLITE_PRIVATE void sqlite3WithPush(Parse *pParse, With *pWith, u8 bFree){ ** parser and some error code other than SQLITE_OK returned. */ static int withExpand( - Walker *pWalker, + Walker *pWalker, struct SrcList_item *pFrom ){ Parse *pParse = pWalker->pParse; @@ -130347,8 +130347,8 @@ static int withExpand( SrcList *pSrc = pFrom->pSelect->pSrc; for(i=0; inSrc; i++){ struct SrcList_item *pItem = &pSrc->a[i]; - if( pItem->zDatabase==0 - && pItem->zName!=0 + if( pItem->zDatabase==0 + && pItem->zName!=0 && 0==sqlite3StrICmp(pItem->zName, pCte->zName) ){ pItem->pTab = pTab; @@ -130359,14 +130359,14 @@ static int withExpand( } } - /* Only one recursive reference is permitted. */ + /* Only one recursive reference is permitted. */ if( pTab->nTabRef>2 ){ sqlite3ErrorMsg( pParse, "multiple references to recursive table: %s", pCte->zName ); return SQLITE_ERROR; } - assert( pTab->nTabRef==1 || + assert( pTab->nTabRef==1 || ((pSel->selFlags&SF_Recursive) && pTab->nTabRef==2 )); pCte->zCteErr = "circular reference: %s"; @@ -130415,12 +130415,12 @@ static int withExpand( #ifndef SQLITE_OMIT_CTE /* -** If the SELECT passed as the second argument has an associated WITH +** If the SELECT passed as the second argument has an associated WITH ** clause, pop it from the stack stored as part of the Parse object. ** ** This function is used as the xSelectCallback2() callback by ** sqlite3SelectExpand() when walking a SELECT tree to resolve table -** names and other FROM clause elements. +** names and other FROM clause elements. */ static void selectPopWith(Walker *pWalker, Select *p){ Parse *pParse = pWalker->pParse; @@ -130472,7 +130472,7 @@ SQLITE_PRIVATE int sqlite3ExpandSubquery(Parse *pParse, struct SrcList_item *pFr ** (1) Make sure VDBE cursor numbers have been assigned to every ** element of the FROM clause. ** -** (2) Fill in the pTabList->a[].pTab fields in the SrcList that +** (2) Fill in the pTabList->a[].pTab fields in the SrcList that ** defines FROM clause. When views appear in the FROM clause, ** fill pTabList->a[].pSelect with a copy of the SELECT statement ** that implements the view. A copy is made of the view's SELECT @@ -130686,7 +130686,7 @@ static int selectExpander(Walker *pWalker, Select *p){ ** bit set. */ if( (p->selFlags & SF_IncludeHidden)==0 - && IsHiddenColumn(&pTab->aCol[j]) + && IsHiddenColumn(&pTab->aCol[j]) ){ continue; } @@ -130696,7 +130696,7 @@ static int selectExpander(Walker *pWalker, Select *p){ if( (pFrom->fg.jointype & JT_NATURAL)!=0 && tableAndColumnIndex(pTabList, i, zName, 0, 0) ){ - /* In a NATURAL join, omit the join columns from the + /* In a NATURAL join, omit the join columns from the ** table to the right of the join */ continue; } @@ -130771,8 +130771,8 @@ static int selectExpander(Walker *pWalker, Select *p){ ** ** When this routine is the Walker.xExprCallback then expression trees ** are walked without any actions being taken at each node. Presumably, -** when this routine is used for Walker.xExprCallback then -** Walker.xSelectCallback is set to do something useful for every +** when this routine is used for Walker.xExprCallback then +** Walker.xSelectCallback is set to do something useful for every ** subquery in the parser tree. */ SQLITE_PRIVATE int sqlite3ExprWalkNoop(Walker *NotUsed, Expr *NotUsed2){ @@ -131005,13 +131005,13 @@ static void updateAccumulator(Parse *pParse, int regAcc, AggInfo *pAggInfo){ assert( !IsWindowFunc(pF->pExpr) ); if( ExprHasProperty(pF->pExpr, EP_WinFunc) ){ Expr *pFilter = pF->pExpr->y.pWin->pFilter; - if( pAggInfo->nAccumulator - && (pF->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL) + if( pAggInfo->nAccumulator + && (pF->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL) ){ if( regHit==0 ) regHit = ++pParse->nMem; /* If this is the first row of the group (regAcc==0), clear the ** "magnet" register regHit so that the accumulator registers - ** are populated if the FILTER clause jumps over the the + ** are populated if the FILTER clause jumps over the the ** invocation of min() or max() altogether. Or, if this is not ** the first row (regAcc==1), set the magnet register so that the ** accumulators are not populated unless the min()/max() is invoked and @@ -131030,7 +131030,7 @@ static void updateAccumulator(Parse *pParse, int regAcc, AggInfo *pAggInfo){ regAgg = 0; } if( pF->iDistinct>=0 ){ - if( addrNext==0 ){ + if( addrNext==0 ){ addrNext = sqlite3VdbeMakeLabel(pParse); } testcase( nArg==0 ); /* Error condition */ @@ -131101,10 +131101,10 @@ static void explainSimpleCount( /* ** sqlite3WalkExpr() callback used by havingToWhere(). ** -** If the node passed to the callback is a TK_AND node, return +** If the node passed to the callback is a TK_AND node, return ** WRC_Continue to tell sqlite3WalkExpr() to iterate through child nodes. ** -** Otherwise, return WRC_Prune. In this case, also check if the +** Otherwise, return WRC_Prune. In this case, also check if the ** sub-expression matches the criteria for being moved to the WHERE ** clause. If so, add it to the WHERE clause and replace the sub-expression ** within the HAVING expression with a constant "1". @@ -131184,7 +131184,7 @@ static struct SrcList_item *isSelfJoinView( continue; } if( sqlite3ExprCompare(0, pThis->pSelect->pWhere, pS1->pWhere, -1) - || sqlite3ExprCompare(0, pThis->pSelect->pHaving, pS1->pHaving, -1) + || sqlite3ExprCompare(0, pThis->pSelect->pHaving, pS1->pHaving, -1) ){ /* The view was modified by some other optimization such as ** pushDownWhereTerms() */ @@ -131283,7 +131283,7 @@ static int countOfViewOptimization(Parse *pParse, Select *p){ #endif /* SQLITE_COUNTOFVIEW_OPTIMIZATION */ /* -** Generate code for the SELECT statement given in the p argument. +** Generate code for the SELECT statement given in the p argument. ** ** The results are returned according to the SelectDest structure. ** See comments in sqliteInt.h for further information. @@ -131337,7 +131337,7 @@ SQLITE_PRIVATE int sqlite3Select( assert( p->pOrderBy==0 || pDest->eDest!=SRT_DistQueue ); assert( p->pOrderBy==0 || pDest->eDest!=SRT_Queue ); if( IgnorableOrderby(pDest) ){ - assert(pDest->eDest==SRT_Exists || pDest->eDest==SRT_Union || + assert(pDest->eDest==SRT_Exists || pDest->eDest==SRT_Union || pDest->eDest==SRT_Except || pDest->eDest==SRT_Discard || pDest->eDest==SRT_Queue || pDest->eDest==SRT_DistFifo || pDest->eDest==SRT_DistQueue || pDest->eDest==SRT_Fifo); @@ -131607,7 +131607,7 @@ SQLITE_PRIVATE int sqlite3Select( ** set on each invocation. */ int addrTop = sqlite3VdbeCurrentAddr(v)+1; - + pItem->regReturn = ++pParse->nMem; sqlite3VdbeAddOp3(v, OP_InitCoroutine, pItem->regReturn, 0, addrTop); VdbeComment((v, "%s", pItem->pTab->zName)); @@ -131683,7 +131683,7 @@ SQLITE_PRIVATE int sqlite3Select( } #endif - /* If the query is DISTINCT with an ORDER BY but is not an aggregate, and + /* If the query is DISTINCT with an ORDER BY but is not an aggregate, and ** if the select-list is the same as the ORDER BY list, then this query ** can be rewritten as a GROUP BY. In other words, this: ** @@ -131693,12 +131693,12 @@ SQLITE_PRIVATE int sqlite3Select( ** ** SELECT xyz FROM ... GROUP BY xyz ORDER BY xyz ** - ** The second form is preferred as a single index (or temp-table) may be - ** used for both the ORDER BY and DISTINCT processing. As originally - ** written the query must use a temp-table for at least one of the ORDER + ** The second form is preferred as a single index (or temp-table) may be + ** used for both the ORDER BY and DISTINCT processing. As originally + ** written the query must use a temp-table for at least one of the ORDER ** BY and DISTINCT, and an index or separate temp-table for the other. */ - if( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct + if( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct && sqlite3ExprListCompare(sSort.pOrderBy, pEList, -1)==0 ){ p->selFlags &= ~SF_Distinct; @@ -131802,7 +131802,7 @@ SQLITE_PRIVATE int sqlite3Select( } } - /* If sorting index that was created by a prior OP_OpenEphemeral + /* If sorting index that was created by a prior OP_OpenEphemeral ** instruction ended up not being needed, then change the OP_OpenEphemeral ** into an OP_Noop. */ @@ -131874,8 +131874,8 @@ SQLITE_PRIVATE int sqlite3Select( if( p->nSelectRow>66 ) p->nSelectRow = 66; /* If there is both a GROUP BY and an ORDER BY clause and they are - ** identical, then it may be possible to disable the ORDER BY clause - ** on the grounds that the GROUP BY will cause elements to come out + ** identical, then it may be possible to disable the ORDER BY clause + ** on the grounds that the GROUP BY will cause elements to come out ** in the correct order. It also may not - the GROUP BY might use a ** database index that causes rows to be grouped together as required ** but not actually sorted. Either way, record the fact that the @@ -131885,8 +131885,8 @@ SQLITE_PRIVATE int sqlite3Select( int ii; /* The GROUP BY processing doesn't care whether rows are delivered in ** ASC or DESC order - only that each group is returned contiguously. - ** So set the ASC/DESC flags in the GROUP BY to match those in the - ** ORDER BY to maximize the chances of rows being delivered in an + ** So set the ASC/DESC flags in the GROUP BY to match those in the + ** ORDER BY to maximize the chances of rows being delivered in an ** order that makes the ORDER BY redundant. */ for(ii=0; iinExpr; ii++){ u8 sortFlags = sSort.pOrderBy->a[ii].sortFlags & KEYINFO_ORDER_DESC; @@ -131985,12 +131985,12 @@ SQLITE_PRIVATE int sqlite3Select( /* If there is a GROUP BY clause we might need a sorting index to ** implement it. Allocate that sorting index now. If it turns out ** that we do not need it after all, the OP_SorterOpen instruction - ** will be converted into a Noop. + ** will be converted into a Noop. */ sAggInfo.sortingIdx = pParse->nTab++; pKeyInfo = sqlite3KeyInfoFromExprList(pParse,pGroupBy,0,sAggInfo.nColumn); - addrSortingIdx = sqlite3VdbeAddOp4(v, OP_SorterOpen, - sAggInfo.sortingIdx, sAggInfo.nSortingColumn, + addrSortingIdx = sqlite3VdbeAddOp4(v, OP_SorterOpen, + sAggInfo.sortingIdx, sAggInfo.nSortingColumn, 0, (char*)pKeyInfo, P4_KEYINFO); /* Initialize memory locations used by GROUP BY aggregate processing @@ -132037,7 +132037,7 @@ SQLITE_PRIVATE int sqlite3Select( int nCol; int nGroupBy; - explainTempTable(pParse, + explainTempTable(pParse, (sDistinct.isTnct && (p->selFlags&SF_Distinct)==0) ? "DISTINCT" : "GROUP BY"); @@ -132082,9 +132082,9 @@ SQLITE_PRIVATE int sqlite3Select( ** clause, cancel the ephemeral table open coded earlier. ** ** This is an optimization - the correct answer should result regardless. - ** Use the SQLITE_GroupByOrder flag with SQLITE_TESTCTRL_OPTIMIZER to + ** Use the SQLITE_GroupByOrder flag with SQLITE_TESTCTRL_OPTIMIZER to ** disable this optimization for testing purposes. */ - if( orderByGrp && OptimizationEnabled(db, SQLITE_GroupByOrder) + if( orderByGrp && OptimizationEnabled(db, SQLITE_GroupByOrder) && (groupBySort || sqlite3WhereIsSorted(pWInfo)) ){ sSort.pOrderBy = 0; @@ -132190,7 +132190,7 @@ SQLITE_PRIVATE int sqlite3Select( sqlite3VdbeAddOp2(v, OP_Integer, 0, iUseFlag); VdbeComment((v, "indicate accumulator empty")); sqlite3VdbeAddOp1(v, OP_Return, regReset); - + } /* endif pGroupBy. Begin aggregate queries without GROUP BY: */ else { #ifndef SQLITE_OMIT_BTREECOUNT @@ -132225,7 +132225,7 @@ SQLITE_PRIVATE int sqlite3Select( ** ** (2013-10-03) Do not count the entries in a partial index. ** - ** In practice the KeyInfo structure will not be used. It is only + ** In practice the KeyInfo structure will not be used. It is only ** passed to keep OP_OpenRead happy. */ if( !HasRowid(pTab) ) pBest = sqlite3PrimaryKeyIndex(pTab); @@ -132263,7 +132263,7 @@ SQLITE_PRIVATE int sqlite3Select( ** that the accumulator registers are (a) updated only once if ** there are no min() or max functions or (b) always updated for the ** first row visited by the aggregate, so that they are updated at - ** least once even if the FILTER clause means the min() or max() + ** least once even if the FILTER clause means the min() or max() ** function visits zero rows. */ if( sAggInfo.nAccumulator ){ for(i=0; itrigHash); p; p=sqliteHashNext(p)){ Trigger *pTrig = (Trigger *)sqliteHashData(p); if( pTrig->pTabSchema==pTab->pSchema - && 0==sqlite3StrICmp(pTrig->table, pTab->zName) + && 0==sqlite3StrICmp(pTrig->table, pTab->zName) ){ pTrig->pNext = (pList ? pList : pTab->pTrigger); pList = pTrig; @@ -132768,7 +132768,7 @@ SQLITE_PRIVATE void sqlite3BeginTrigger( ** of triggers. */ if( pTab->pSelect && tr_tm!=TK_INSTEAD ){ - sqlite3ErrorMsg(pParse, "cannot create %s trigger on view: %S", + sqlite3ErrorMsg(pParse, "cannot create %s trigger on view: %S", (tr_tm == TK_BEFORE)?"BEFORE":"AFTER", pTableName, 0); goto trigger_cleanup; } @@ -132864,8 +132864,8 @@ SQLITE_PRIVATE void sqlite3FinishTrigger( } sqlite3TokenInit(&nameToken, pTrig->zName); sqlite3FixInit(&sFix, pParse, iDb, "trigger", &nameToken); - if( sqlite3FixTriggerStep(&sFix, pTrig->step_list) - || sqlite3FixExpr(&sFix, pTrig->pWhen) + if( sqlite3FixTriggerStep(&sFix, pTrig->step_list) + || sqlite3FixExpr(&sFix, pTrig->pWhen) ){ goto triggerfinish_cleanup; } @@ -132933,14 +132933,14 @@ static char *triggerSpanDup(sqlite3 *db, const char *zStart, const char *zEnd){ int i; if( z ) for(i=0; z[i]; i++) if( sqlite3Isspace(z[i]) ) z[i] = ' '; return z; -} +} /* ** Turn a SELECT statement (that the pSelect parameter points to) into ** a trigger step. Return a pointer to a TriggerStep structure. ** ** The parser calls this routine when it finds a SELECT statement in -** body of a TRIGGER. +** body of a TRIGGER. */ SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep( sqlite3 *db, /* Database connection */ @@ -133102,7 +133102,7 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerDeleteStep( return pTriggerStep; } -/* +/* ** Recursively delete a Trigger structure */ SQLITE_PRIVATE void sqlite3DeleteTrigger(sqlite3 *db, Trigger *pTrigger){ @@ -133116,7 +133116,7 @@ SQLITE_PRIVATE void sqlite3DeleteTrigger(sqlite3 *db, Trigger *pTrigger){ } /* -** This function is called to drop a trigger from the database schema. +** This function is called to drop a trigger from the database schema. ** ** This may be called directly from the parser and therefore identifies ** the trigger by name. The sqlite3DropTriggerPtr() routine does the @@ -133171,7 +133171,7 @@ static Table *tableOfTrigger(Trigger *pTrigger){ /* -** Drop a trigger given a pointer to that trigger. +** Drop a trigger given a pointer to that trigger. */ SQLITE_PRIVATE void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){ Table *pTable; @@ -133247,12 +133247,12 @@ static int checkColumnOverlap(IdList *pIdList, ExprList *pEList){ for(e=0; enExpr; e++){ if( sqlite3IdListIndex(pIdList, pEList->a[e].zName)>=0 ) return 1; } - return 0; + return 0; } /* ** Return a list of all triggers on table pTab if there exists at least -** one trigger that must be fired when an operation of type 'op' is +** one trigger that must be fired when an operation of type 'op' is ** performed on the table, and, if that operation is an UPDATE, if at ** least one of the columns in pChanges is being modified. */ @@ -133316,13 +133316,13 @@ static SrcList *targetSrcList( } /* -** Generate VDBE code for the statements inside the body of a single +** Generate VDBE code for the statements inside the body of a single ** trigger. */ static int codeTriggerProgram( Parse *pParse, /* The parser context */ TriggerStep *pStepList, /* List of statements inside the trigger body */ - int orconf /* Conflict algorithm. (OE_Abort, etc) */ + int orconf /* Conflict algorithm. (OE_Abort, etc) */ ){ TriggerStep *pStep; Vdbe *v = pParse->pVdbe; @@ -133358,26 +133358,26 @@ static int codeTriggerProgram( switch( pStep->op ){ case TK_UPDATE: { - sqlite3Update(pParse, + sqlite3Update(pParse, targetSrcList(pParse, pStep), - sqlite3ExprListDup(db, pStep->pExprList, 0), - sqlite3ExprDup(db, pStep->pWhere, 0), + sqlite3ExprListDup(db, pStep->pExprList, 0), + sqlite3ExprDup(db, pStep->pWhere, 0), pParse->eOrconf, 0, 0, 0 ); break; } case TK_INSERT: { - sqlite3Insert(pParse, + sqlite3Insert(pParse, targetSrcList(pParse, pStep), - sqlite3SelectDup(db, pStep->pSelect, 0), - sqlite3IdListDup(db, pStep->pIdList), + sqlite3SelectDup(db, pStep->pSelect, 0), + sqlite3IdListDup(db, pStep->pIdList), pParse->eOrconf, sqlite3UpsertDup(db, pStep->pUpsert) ); break; } case TK_DELETE: { - sqlite3DeleteFrom(pParse, + sqlite3DeleteFrom(pParse, targetSrcList(pParse, pStep), sqlite3ExprDup(db, pStep->pWhere, 0), 0, 0 ); @@ -133391,7 +133391,7 @@ static int codeTriggerProgram( sqlite3SelectDelete(db, pSelect); break; } - } + } if( pStep->op!=TK_SELECT ){ sqlite3VdbeAddOp0(v, OP_ResetCount); } @@ -133436,7 +133436,7 @@ static void transferParseError(Parse *pTo, Parse *pFrom){ } /* -** Create and populate a new TriggerPrg object with a sub-program +** Create and populate a new TriggerPrg object with a sub-program ** implementing trigger pTrigger with ON CONFLICT policy orconf. */ static TriggerPrg *codeRowTrigger( @@ -133459,7 +133459,7 @@ static TriggerPrg *codeRowTrigger( assert( pTop->pVdbe ); /* Allocate the TriggerPrg and SubProgram objects. To ensure that they - ** are freed if an error occurs, link them into the Parse.pTriggerPrg + ** are freed if an error occurs, link them into the Parse.pTriggerPrg ** list of the top-level Parse object sooner rather than later. */ pPrg = sqlite3DbMallocZero(db, sizeof(TriggerPrg)); if( !pPrg ) return 0; @@ -133473,7 +133473,7 @@ static TriggerPrg *codeRowTrigger( pPrg->aColmask[0] = 0xffffffff; pPrg->aColmask[1] = 0xffffffff; - /* Allocate and populate a new Parse context to use for coding the + /* Allocate and populate a new Parse context to use for coding the ** trigger sub-program. */ pSubParse = sqlite3StackAllocZero(db, sizeof(Parse)); if( !pSubParse ) return 0; @@ -133489,7 +133489,7 @@ static TriggerPrg *codeRowTrigger( v = sqlite3GetVdbe(pSubParse); if( v ){ - VdbeComment((v, "Start: %s.%s (%s %s%s%s ON %s)", + VdbeComment((v, "Start: %s.%s (%s %s%s%s ON %s)", pTrigger->zName, onErrorText(orconf), (pTrigger->tr_tm==TRIGGER_BEFORE ? "BEFORE" : "AFTER"), (pTrigger->op==TK_UPDATE ? "UPDATE" : ""), @@ -133499,19 +133499,19 @@ static TriggerPrg *codeRowTrigger( )); #ifndef SQLITE_OMIT_TRACE if( pTrigger->zName ){ - sqlite3VdbeChangeP4(v, -1, + sqlite3VdbeChangeP4(v, -1, sqlite3MPrintf(db, "-- TRIGGER %s", pTrigger->zName), P4_DYNAMIC ); } #endif /* If one was specified, code the WHEN clause. If it evaluates to false - ** (or NULL) the sub-vdbe is immediately halted by jumping to the + ** (or NULL) the sub-vdbe is immediately halted by jumping to the ** OP_Halt inserted at the end of the program. */ if( pTrigger->pWhen ){ pWhen = sqlite3ExprDup(db, pTrigger->pWhen, 0); - if( SQLITE_OK==sqlite3ResolveExprNames(&sNC, pWhen) - && db->mallocFailed==0 + if( SQLITE_OK==sqlite3ResolveExprNames(&sNC, pWhen) + && db->mallocFailed==0 ){ iEndTrigger = sqlite3VdbeMakeLabel(pSubParse); sqlite3ExprIfFalse(pSubParse, pWhen, iEndTrigger, SQLITE_JUMPIFNULL); @@ -133548,7 +133548,7 @@ static TriggerPrg *codeRowTrigger( return pPrg; } - + /* ** Return a pointer to a TriggerPrg object containing the sub-program for ** trigger pTrigger with default ON CONFLICT algorithm orconf. If no such @@ -133570,8 +133570,8 @@ static TriggerPrg *getRowTrigger( ** process of being coded). If this is the case, then an entry with ** a matching TriggerPrg.pTrigger field will be present somewhere ** in the Parse.pTriggerPrg list. Search for such an entry. */ - for(pPrg=pRoot->pTriggerPrg; - pPrg && (pPrg->pTrigger!=pTrigger || pPrg->orconf!=orconf); + for(pPrg=pRoot->pTriggerPrg; + pPrg && (pPrg->pTrigger!=pTrigger || pPrg->orconf!=orconf); pPrg=pPrg->pNext ); @@ -133584,7 +133584,7 @@ static TriggerPrg *getRowTrigger( } /* -** Generate code for the trigger program associated with trigger p on +** Generate code for the trigger program associated with trigger p on ** table pTab. The reg, orconf and ignoreJump parameters passed to this ** function are the same as those described in the header function for ** sqlite3CodeRowTrigger() @@ -133602,7 +133602,7 @@ SQLITE_PRIVATE void sqlite3CodeRowTriggerDirect( pPrg = getRowTrigger(pParse, p, pTab, orconf); assert( pPrg || pParse->nErr || pParse->db->mallocFailed ); - /* Code the OP_Program opcode in the parent VDBE. P4 of the OP_Program + /* Code the OP_Program opcode in the parent VDBE. P4 of the OP_Program ** is a pointer to the sub-vdbe containing the trigger program. */ if( pPrg ){ int bRecursive = (p->zName && 0==(pParse->db->flags&SQLITE_RecTriggers)); @@ -133631,7 +133631,7 @@ SQLITE_PRIVATE void sqlite3CodeRowTriggerDirect( ** If there are no triggers that fire at the specified time for the specified ** operation on pTab, this function is a no-op. ** -** The reg argument is the address of the first in an array of registers +** The reg argument is the address of the first in an array of registers ** that contain the values substituted for the new.* and old.* references ** in the trigger program. If N is the number of columns in table pTab ** (a copy of pTab->nCol), then registers are populated as follows: @@ -133648,12 +133648,12 @@ SQLITE_PRIVATE void sqlite3CodeRowTriggerDirect( ** reg+N+N+1 NEW.* value of right-most column of pTab ** ** For ON DELETE triggers, the registers containing the NEW.* values will -** never be accessed by the trigger program, so they are not allocated or -** populated by the caller (there is no data to populate them with anyway). +** never be accessed by the trigger program, so they are not allocated or +** populated by the caller (there is no data to populate them with anyway). ** Similarly, for ON INSERT triggers the values stored in the OLD.* registers ** are never accessed, and so are not allocated by the caller. So, for an ** ON INSERT trigger, the value passed to this function as parameter reg -** is not a readable register, although registers (reg+N) through +** is not a readable register, although registers (reg+N) through ** (reg+N+N+1) are. ** ** Parameter orconf is the default conflict resolution algorithm for the @@ -133685,12 +133685,12 @@ SQLITE_PRIVATE void sqlite3CodeRowTrigger( ** or else it must be a TEMP trigger. */ assert( p->pSchema!=0 ); assert( p->pTabSchema!=0 ); - assert( p->pSchema==p->pTabSchema + assert( p->pSchema==p->pTabSchema || p->pSchema==pParse->db->aDb[1].pSchema ); /* Determine whether we should code this trigger */ - if( p->op==op - && p->tr_tm==tr_tm + if( p->op==op + && p->tr_tm==tr_tm && checkColumnOverlap(p->pColumns, pChanges) ){ sqlite3CodeRowTriggerDirect(pParse, p, pTab, reg, orconf, ignoreJump); @@ -133699,9 +133699,9 @@ SQLITE_PRIVATE void sqlite3CodeRowTrigger( } /* -** Triggers may access values stored in the old.* or new.* pseudo-table. -** This function returns a 32-bit bitmask indicating which columns of the -** old.* or new.* tables actually are used by triggers. This information +** Triggers may access values stored in the old.* or new.* pseudo-table. +** This function returns a 32-bit bitmask indicating which columns of the +** old.* or new.* tables actually are used by triggers. This information ** may be used by the caller, for example, to avoid having to load the entire ** old.* record into memory when executing an UPDATE or DELETE command. ** @@ -133711,7 +133711,7 @@ SQLITE_PRIVATE void sqlite3CodeRowTrigger( ** are more than 32 columns in the table, and at least one of the columns ** with an index greater than 32 may be accessed, 0xffffffff is returned. ** -** It is not possible to determine if the old.rowid or new.rowid column is +** It is not possible to determine if the old.rowid or new.rowid column is ** accessed by triggers. The caller must always assume that it is. ** ** Parameter isNew must be either 1 or 0. If it is 0, then the mask returned @@ -133788,10 +133788,10 @@ static void updateVirtualTable( /* ** The most recently coded instruction was an OP_Column to retrieve the -** i-th column of table pTab. This routine sets the P4 parameter of the +** i-th column of table pTab. This routine sets the P4 parameter of the ** OP_Column to the default value, if any. ** -** The default value of a column is specified by a DEFAULT clause in the +** The default value of a column is specified by a DEFAULT clause in the ** column definition. This was either supplied by the user when the table ** was created, or added later to the table definition by an ALTER TABLE ** command. If the latter, then the row-records in the table btree on disk @@ -133800,9 +133800,9 @@ static void updateVirtualTable( ** If the former, then all row-records are guaranteed to include a value ** for the column and the P4 value is not required. ** -** Column definitions created by an ALTER TABLE command may only have +** Column definitions created by an ALTER TABLE command may only have ** literal default values specified: a number, null or a string. (If a more -** complicated default expression value was provided, it is evaluated +** complicated default expression value was provided, it is evaluated ** when the ALTER TABLE is executed and one of the literal values written ** into the sqlite_master table.) ** @@ -133812,8 +133812,8 @@ static void updateVirtualTable( ** sqlite3_value objects. ** ** If parameter iReg is not negative, code an OP_RealAffinity instruction -** on register iReg. This is used when an equivalent integer value is -** stored in place of an 8-byte floating point value in order to save +** on register iReg. This is used when an equivalent integer value is +** stored in place of an 8-byte floating point value in order to save ** space. */ SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){ @@ -133824,7 +133824,7 @@ SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){ Column *pCol = &pTab->aCol[i]; VdbeComment((v, "%s.%s", pTab->zName, pCol->zName)); assert( inCol ); - sqlite3ValueFromExpr(sqlite3VdbeDb(v), pCol->pDflt, enc, + sqlite3ValueFromExpr(sqlite3VdbeDb(v), pCol->pDflt, enc, pCol->affinity, &pValue); if( pValue ){ sqlite3VdbeAppendP4(v, pValue, P4_MEM); @@ -133966,7 +133966,7 @@ SQLITE_PRIVATE void sqlite3Update( } assert( pTabList->nSrc==1 ); - /* Locate the table which we want to update. + /* Locate the table which we want to update. */ pTab = sqlite3SrcListLookup(pParse, pTabList); if( pTab==0 ) goto update_cleanup; @@ -134029,7 +134029,7 @@ SQLITE_PRIVATE void sqlite3Update( } pTabList->a[0].iCursor = iDataCur; - /* Allocate space for aXRef[], aRegIdx[], and aToOpen[]. + /* Allocate space for aXRef[], aRegIdx[], and aToOpen[]. ** Initialize aXRef[] and aToOpen[] to their default values. */ aXRef = sqlite3DbMallocRawNN(db, sizeof(int) * (pTab->nCol+nIdx+1) + nIdx+2 ); @@ -134100,7 +134100,7 @@ SQLITE_PRIVATE void sqlite3Update( assert( chngPk==0 || chngPk==1 ); chngKey = chngRowid + chngPk; - /* The SET expressions are not actually used inside the WHERE loop. + /* The SET expressions are not actually used inside the WHERE loop. ** So reset the colUsed mask. Unless this is a virtual table. In that ** case, set all bits of the colUsed mask (to ensure that the virtual ** table implementation makes all columns available). @@ -134139,7 +134139,7 @@ SQLITE_PRIVATE void sqlite3Update( } aRegIdx[nAllIdx] = ++pParse->nMem; /* Register storing the table record */ if( bReplace ){ - /* If REPLACE conflict resolution might be invoked, open cursors on all + /* If REPLACE conflict resolution might be invoked, open cursors on all ** indexes in case they are needed to delete records. */ memset(aToOpen, 1, nIdx+1); } @@ -134181,7 +134181,7 @@ SQLITE_PRIVATE void sqlite3Update( */ #if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) if( isView ){ - sqlite3MaterializeView(pParse, pTab, + sqlite3MaterializeView(pParse, pTab, pWhere, pOrderBy, pLimit, iDataCur ); pOrderBy = 0; @@ -134234,7 +134234,7 @@ SQLITE_PRIVATE void sqlite3Update( sqlite3VdbeSetP4KeyInfo(pParse, pPk); } } - + if( pUpsert ){ /* If this is an UPSERT, then all cursors have already been opened by ** the outer INSERT and the data cursor should be pointing at the row @@ -134245,7 +134245,7 @@ SQLITE_PRIVATE void sqlite3Update( eOnePass = ONEPASS_SINGLE; sqlite3ExprIfFalse(pParse, pWhere, labelBreak, SQLITE_JUMPIFNULL); }else{ - /* Begin the database scan. + /* Begin the database scan. ** ** Do not consider a single-pass strategy for a multi-row update if ** there are any triggers or foreign keys to process, or rows may @@ -134258,7 +134258,7 @@ SQLITE_PRIVATE void sqlite3Update( } pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0, flags, iIdxCur); if( pWInfo==0 ) goto update_cleanup; - + /* A one-pass strategy that might update more than one row may not ** be used if any column of the index used for the scan is being ** updated. Otherwise, if there is an index on "b", statements like @@ -134296,7 +134296,7 @@ SQLITE_PRIVATE void sqlite3Update( /* Read the PK of the current row into an array of registers. In ** ONEPASS_OFF mode, serialize the array into a record and store it in ** the ephemeral table. Or, in ONEPASS_SINGLE or MULTI mode, change - ** the OP_OpenEphemeral instruction to a Noop (the ephemeral table + ** the OP_OpenEphemeral instruction to a Noop (the ephemeral table ** is not required) and leave the PK fields in the array of registers. */ for(i=0; iaiColumn[i]>=0 ); @@ -134317,16 +134317,16 @@ SQLITE_PRIVATE void sqlite3Update( if( eOnePass!=ONEPASS_MULTI ){ sqlite3WhereEnd(pWInfo); } - + if( !isView ){ int addrOnce = 0; - + /* Open every index that needs updating. */ if( eOnePass!=ONEPASS_OFF ){ if( aiCurOnePass[0]>=0 ) aToOpen[aiCurOnePass[0]-iBaseCur] = 0; if( aiCurOnePass[1]>=0 ) aToOpen[aiCurOnePass[1]-iBaseCur] = 0; } - + if( eOnePass==ONEPASS_MULTI && (nIdx-(aiCurOnePass[1]>=0))>0 ){ addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); } @@ -134334,7 +134334,7 @@ SQLITE_PRIVATE void sqlite3Update( aToOpen, 0, 0); if( addrOnce ) sqlite3VdbeJumpHere(v, addrOnce); } - + /* Top of the update loop */ if( eOnePass!=ONEPASS_OFF ){ if( !isView && aiCurOnePass[0]!=iDataCur && aiCurOnePass[1]!=iDataCur ){ @@ -134377,7 +134377,7 @@ SQLITE_PRIVATE void sqlite3Update( ** information is needed */ if( chngPk || hasFK || pTrigger ){ u32 oldmask = (hasFK ? sqlite3FkOldmask(pParse, pTab) : 0); - oldmask |= sqlite3TriggerColmask(pParse, + oldmask |= sqlite3TriggerColmask(pParse, pTrigger, pChanges, 0, TRIGGER_BEFORE|TRIGGER_AFTER, pTab, onError ); for(i=0; inCol; i++){ @@ -134404,8 +134404,8 @@ SQLITE_PRIVATE void sqlite3Update( ** If there are one or more BEFORE triggers, then do not populate the ** registers associated with columns that are (a) not modified by ** this UPDATE statement and (b) not accessed by new.* references. The - ** values for registers not modified by the UPDATE must be reloaded from - ** the database after the BEFORE triggers are fired anyway (as the trigger + ** values for registers not modified by the UPDATE must be reloaded from + ** the database after the BEFORE triggers are fired anyway (as the trigger ** may have modified them). So not loading those that are not going to ** be used eliminates some redundant opcodes. */ @@ -134420,7 +134420,7 @@ SQLITE_PRIVATE void sqlite3Update( if( j>=0 ){ sqlite3ExprCode(pParse, pChanges->a[j].pExpr, regNew+i); }else if( 0==(tmask&TRIGGER_BEFORE) || i>31 || (newmask & MASKBIT32(i)) ){ - /* This branch loads the value of a column that will not be changed + /* This branch loads the value of a column that will not be changed ** into a register. This is done if there are no BEFORE triggers, or ** if there are one or more BEFORE triggers that use this value via ** a new.* reference in a trigger program. @@ -134439,11 +134439,11 @@ SQLITE_PRIVATE void sqlite3Update( */ if( tmask&TRIGGER_BEFORE ){ sqlite3TableAffinity(v, pTab, regNew); - sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges, + sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges, TRIGGER_BEFORE, pTab, regOldRowid, onError, labelContinue); /* The row-trigger may have deleted the row being updated. In this - ** case, jump to the next row. No updates or AFTER triggers are + ** case, jump to the next row. No updates or AFTER triggers are ** required. This behavior - what happens when the row being updated ** is deleted or renamed by a BEFORE trigger - is left undefined in the ** documentation. @@ -134457,8 +134457,8 @@ SQLITE_PRIVATE void sqlite3Update( } /* After-BEFORE-trigger-reload-loop: - ** If it did not delete it, the BEFORE trigger may still have modified - ** some of the columns of the row being updated. Load the values for + ** If it did not delete it, the BEFORE trigger may still have modified + ** some of the columns of the row being updated. Load the values for ** all columns not modified by the update statement into their registers ** in case this has happened. Only unmodified columns are reloaded. ** The values computed for modified columns use the values before the @@ -134503,7 +134503,7 @@ SQLITE_PRIVATE void sqlite3Update( ** to process, delete the old record. Otherwise, add a noop OP_Delete ** to invoke the pre-update hook. ** - ** That (regNew==regnewRowid+1) is true is also important for the + ** That (regNew==regnewRowid+1) is true is also important for the ** pre-update hook. If the caller invokes preupdate_new(), the returned ** value is copied from memory cell (regNewRowid+1+iCol), where iCol ** is the column index supplied by the user. @@ -134530,29 +134530,29 @@ SQLITE_PRIVATE void sqlite3Update( if( hasFK ){ sqlite3FkCheck(pParse, pTab, 0, regNewRowid, aXRef, chngKey); } - + /* Insert the new index entries and the new record. */ sqlite3CompleteInsertion( - pParse, pTab, iDataCur, iIdxCur, regNewRowid, aRegIdx, - OPFLAG_ISUPDATE | (eOnePass==ONEPASS_MULTI ? OPFLAG_SAVEPOSITION : 0), + pParse, pTab, iDataCur, iIdxCur, regNewRowid, aRegIdx, + OPFLAG_ISUPDATE | (eOnePass==ONEPASS_MULTI ? OPFLAG_SAVEPOSITION : 0), 0, 0 ); /* Do any ON CASCADE, SET NULL or SET DEFAULT operations required to ** handle rows (possibly in other tables) that refer via a foreign key - ** to the row just updated. */ + ** to the row just updated. */ if( hasFK ){ sqlite3FkActions(pParse, pTab, pChanges, regOldRowid, aXRef, chngKey); } } - /* Increment the row counter + /* Increment the row counter */ if( regRowCount ){ sqlite3VdbeAddOp2(v, OP_AddImm, regRowCount, 1); } - sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges, + sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges, TRIGGER_AFTER, pTab, regOldRowid, onError, labelContinue); /* Repeat the above with the next record to be updated, until @@ -134595,7 +134595,7 @@ update_cleanup: sqlite3SrcListDelete(db, pTabList); sqlite3ExprListDelete(db, pChanges); sqlite3ExprDelete(db, pWhere); -#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) +#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) sqlite3ExprListDelete(db, pOrderBy); sqlite3ExprDelete(db, pLimit); #endif @@ -134615,8 +134615,8 @@ update_cleanup: /* ** Generate code for an UPDATE of a virtual table. ** -** There are two possible strategies - the default and the special -** "onepass" strategy. Onepass is only used if the virtual table +** There are two possible strategies - the default and the special +** "onepass" strategy. Onepass is only used if the virtual table ** implementation indicates that pWhere may match at most one row. ** ** The default strategy is to create an ephemeral table that contains @@ -134732,7 +134732,7 @@ static void updateVirtualTable( /* Begin scannning through the ephemeral table. */ addr = sqlite3VdbeAddOp1(v, OP_Rewind, ephemTab); VdbeCoverage(v); - /* Extract arguments from the current row of the ephemeral table and + /* Extract arguments from the current row of the ephemeral table and ** invoke the VUpdate method. */ for(i=0; ipUpsertTargetWhere); if( rc ) return rc; - /* Check to see if the conflict target matches the rowid. */ + /* Check to see if the conflict target matches the rowid. */ pTab = pTabList->a[0].pTab; pTarget = pUpsert->pUpsertTarget; iCursor = pTabList->a[0].iCursor; - if( HasRowid(pTab) + if( HasRowid(pTab) && pTarget->nExpr==1 && (pTerm = pTarget->a[0].pExpr)->op==TK_COLUMN && pTerm->iColumn==XN_ROWID @@ -134993,7 +134993,7 @@ SQLITE_PRIVATE void sqlite3UpsertDoUpdate( sqlite3VdbeVerifyAbortable(v, OE_Abort); i = sqlite3VdbeAddOp4Int(v, OP_Found, iDataCur, 0, iPk, nPk); VdbeCoverage(v); - sqlite3VdbeAddOp4(v, OP_Halt, SQLITE_CORRUPT, OE_Abort, 0, + sqlite3VdbeAddOp4(v, OP_Halt, SQLITE_CORRUPT, OE_Abort, 0, "corrupt database", P4_STATIC); sqlite3VdbeJumpHere(v, i); } @@ -135203,7 +135203,7 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum( zOut = ""; } - /* Save the current value of the database flags so that it can be + /* Save the current value of the database flags so that it can be ** restored before returning. Then set the writable-schema flag, and ** disable CHECK and foreign key constraints. */ saved_flags = db->flags; @@ -135346,7 +135346,7 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum( ); if( rc ) goto end_of_vacuum; - /* At this point, there is a write transaction open on both the + /* At this point, there is a write transaction open on both the ** vacuum database and the main database. Assuming no error occurs, ** both transactions are closed by this block - the main database ** transaction by sqlite3BtreeCopyFile() and the other by an explicit @@ -135426,7 +135426,7 @@ end_of_vacuum: } /* This both clears the schemas and reduces the size of the db->aDb[] - ** array. */ + ** array. */ sqlite3ResetAllSchemasOfConnection(db); return rc; @@ -135455,7 +135455,7 @@ end_of_vacuum: /* ** Before a virtual table xCreate() or xConnect() method is invoked, the ** sqlite3.pVtabCtx member variable is set to point to an instance of -** this struct allocated on the stack. It is used by the implementation of +** this struct allocated on the stack. It is used by the implementation of ** the sqlite3_declare_vtab() and sqlite3_vtab_config() APIs, both of which ** are invoked only from within xCreate and xConnect methods. */ @@ -135612,7 +135612,7 @@ SQLITE_PRIVATE void sqlite3VtabModuleUnref(sqlite3 *db, Module *pMod){ /* ** Lock the virtual table so that it cannot be disconnected. ** Locks nest. Every lock should have a corresponding unlock. -** If an unlock is omitted, resources leaks will occur. +** If an unlock is omitted, resources leaks will occur. ** ** If a disconnect is attempted while a virtual table is locked, ** the disconnect is deferred until all locks have been removed. @@ -135624,7 +135624,7 @@ SQLITE_PRIVATE void sqlite3VtabLock(VTable *pVTab){ /* ** pTab is a pointer to a Table structure representing a virtual-table. -** Return a pointer to the VTable object used by connection db to access +** Return a pointer to the VTable object used by connection db to access ** this virtual-table, if one has been created, or NULL otherwise. */ SQLITE_PRIVATE VTable *sqlite3GetVTable(sqlite3 *db, Table *pTab){ @@ -135659,7 +135659,7 @@ SQLITE_PRIVATE void sqlite3VtabUnlock(VTable *pVTab){ /* ** Table p is a virtual table. This function moves all elements in the ** p->pVTable list to the sqlite3.pDisconnect lists of their associated -** database connections to be disconnected at the next opportunity. +** database connections to be disconnected at the next opportunity. ** Except, if argument db is not NULL, then the entry associated with ** connection db is left in the p->pVTable list. */ @@ -135668,8 +135668,8 @@ static VTable *vtabDisconnectAll(sqlite3 *db, Table *p){ VTable *pVTable = p->pVTable; p->pVTable = 0; - /* Assert that the mutex (if any) associated with the BtShared database - ** that contains table p is held by the caller. See header comments + /* Assert that the mutex (if any) associated with the BtShared database + ** that contains table p is held by the caller. See header comments ** above function sqlite3VtabUnlockList() for an explanation of why ** this makes it safe to access the sqlite3.pDisconnect list of any ** database connection that may have an entry in the p->pVTable list. @@ -135725,7 +135725,7 @@ SQLITE_PRIVATE void sqlite3VtabDisconnect(sqlite3 *db, Table *p){ ** Disconnect all the virtual table objects in the sqlite3.pDisconnect list. ** ** This function may only be called when the mutexes associated with all -** shared b-tree databases opened using connection db are held by the +** shared b-tree databases opened using connection db are held by the ** caller. This is done to protect the sqlite3.pDisconnect list. The ** sqlite3.pDisconnect list is accessed only as follows: ** @@ -135738,7 +135738,7 @@ SQLITE_PRIVATE void sqlite3VtabDisconnect(sqlite3 *db, Table *p){ ** or, if the virtual table is stored in a non-sharable database, then ** the database handle mutex is held. ** -** As a result, a sqlite3.pDisconnect cannot be accessed simultaneously +** As a result, a sqlite3.pDisconnect cannot be accessed simultaneously ** by multiple threads. It is thread-safe. */ SQLITE_PRIVATE void sqlite3VtabUnlockList(sqlite3 *db){ @@ -135764,12 +135764,12 @@ SQLITE_PRIVATE void sqlite3VtabUnlockList(sqlite3 *db){ ** record. ** ** Since it is a virtual-table, the Table structure contains a pointer -** to the head of a linked list of VTable structures. Each VTable +** to the head of a linked list of VTable structures. Each VTable ** structure is associated with a single sqlite3* user of the schema. -** The reference count of the VTable structure associated with database -** connection db is decremented immediately (which may lead to the +** The reference count of the VTable structure associated with database +** connection db is decremented immediately (which may lead to the ** structure being xDisconnected and free). Any other VTable structures -** in the list are moved to the sqlite3.pDisconnect list of the associated +** in the list are moved to the sqlite3.pDisconnect list of the associated ** database connection. */ SQLITE_PRIVATE void sqlite3VtabClear(sqlite3 *db, Table *p){ @@ -135849,7 +135849,7 @@ SQLITE_PRIVATE void sqlite3VtabBeginParse( if( pTable->azModuleArg ){ int iDb = sqlite3SchemaToIndex(db, pTable->pSchema); assert( iDb>=0 ); /* The database the table is being created in */ - sqlite3AuthCheck(pParse, SQLITE_CREATE_VTABLE, pTable->zName, + sqlite3AuthCheck(pParse, SQLITE_CREATE_VTABLE, pTable->zName, pTable->azModuleArg[0], pParse->db->aDb[iDb].zDbSName); } #endif @@ -135881,7 +135881,7 @@ SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ addArgumentToVtab(pParse); pParse->sArg.z = 0; if( pTab->nModuleArg<1 ) return; - + /* If the CREATE VIRTUAL TABLE statement is being entered for the ** first time (in other words if the virtual table is actually being ** created now instead of just being read out of sqlite_master) then @@ -135901,9 +135901,9 @@ SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ } zStmt = sqlite3MPrintf(db, "CREATE VIRTUAL TABLE %T", &pParse->sNameToken); - /* A slot for the record has already been allocated in the + /* A slot for the record has already been allocated in the ** SQLITE_MASTER table. We just need to update that slot with all - ** the information we've collected. + ** the information we've collected. ** ** The VM register number pParse->regRowid holds the rowid of an ** entry in the sqlite_master table tht was created for this vtab @@ -135984,7 +135984,7 @@ SQLITE_PRIVATE void sqlite3VtabArgExtend(Parse *pParse, Token *p){ ** to this procedure. */ static int vtabCallConstructor( - sqlite3 *db, + sqlite3 *db, Table *pTab, Module *pMod, int (*xConstruct)(sqlite3*,void*,int,const char*const*,sqlite3_vtab**,char**), @@ -136003,7 +136003,7 @@ static int vtabCallConstructor( /* Check that the virtual-table is not already being initialized */ for(pCtx=db->pVtabCtx; pCtx; pCtx=pCtx->pPrior){ if( pCtx->pTab==pTab ){ - *pzErr = sqlite3MPrintf(db, + *pzErr = sqlite3MPrintf(db, "vtable constructor called recursively: %s", pTab->zName ); return SQLITE_LOCKED; @@ -136064,7 +136064,7 @@ static int vtabCallConstructor( int iCol; u8 oooHidden = 0; /* If everything went according to plan, link the new VTable structure - ** into the linked list headed by pTab->pVTable. Then loop through the + ** into the linked list headed by pTab->pVTable. Then loop through the ** columns of the table to see if any of them contain the token "hidden". ** If so, set the Column COLFLAG_HIDDEN flag and remove the token from ** the type string. */ @@ -136109,7 +136109,7 @@ static int vtabCallConstructor( /* ** This function is invoked by the parser to call the xConnect() method -** of the virtual table pTab. If an error occurs, an error code is returned +** of the virtual table pTab. If an error occurs, an error code is returned ** and an error left in pParse. ** ** This call is a no-op if table pTab is not a virtual table. @@ -136180,7 +136180,7 @@ static void addToVTrans(sqlite3 *db, VTable *pVTab){ /* ** This function is invoked by the vdbe to call the xCreate method -** of the virtual table named zTab in database iDb. +** of the virtual table named zTab in database iDb. ** ** If an error occurs, *pzErr is set to point to an English language ** description of the error and an SQLITE_XXX error code is returned. @@ -136199,8 +136199,8 @@ SQLITE_PRIVATE int sqlite3VtabCallCreate(sqlite3 *db, int iDb, const char *zTab, zMod = pTab->azModuleArg[0]; pMod = (Module*)sqlite3HashFind(&db->aModule, zMod); - /* If the module has been registered and includes a Create method, - ** invoke it now. If the module has not been registered, return an + /* If the module has been registered and includes a Create method, + ** invoke it now. If the module has not been registered, return an ** error. Otherwise, do nothing. */ if( pMod==0 || pMod->pModule->xCreate==0 || pMod->pModule->xDestroy==0 ){ @@ -136253,7 +136253,7 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){ sParse.eParseMode = PARSE_MODE_DECLARE_VTAB; sParse.db = db; sParse.nQueryLoop = 1; - if( SQLITE_OK==sqlite3RunParser(&sParse, zCreateTable, &zErr) + if( SQLITE_OK==sqlite3RunParser(&sParse, zCreateTable, &zErr) && sParse.pNewTable && !db->mallocFailed && !sParse.pNewTable->pSelect @@ -136350,7 +136350,7 @@ SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3 *db, int iDb, const char *zTab ** called is identified by the second argument, "offset", which is ** the offset of the method to call in the sqlite3_module structure. ** -** The array is cleared after invoking the callbacks. +** The array is cleared after invoking the callbacks. */ static void callFinaliser(sqlite3 *db, int offset){ int i; @@ -136399,7 +136399,7 @@ SQLITE_PRIVATE int sqlite3VtabSync(sqlite3 *db, Vdbe *p){ } /* -** Invoke the xRollback method of all virtual tables in the +** Invoke the xRollback method of all virtual tables in the ** sqlite3.aVTrans array. Then clear the array itself. */ SQLITE_PRIVATE int sqlite3VtabRollback(sqlite3 *db){ @@ -136408,7 +136408,7 @@ SQLITE_PRIVATE int sqlite3VtabRollback(sqlite3 *db){ } /* -** Invoke the xCommit method of all virtual tables in the +** Invoke the xCommit method of all virtual tables in the ** sqlite3.aVTrans array. Then clear the array itself. */ SQLITE_PRIVATE int sqlite3VtabCommit(sqlite3 *db){ @@ -136430,7 +136430,7 @@ SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *db, VTable *pVTab){ /* Special case: If db->aVTrans is NULL and db->nVTrans is greater ** than zero, then this function is being called from within a - ** virtual module xSync() callback. It is illegal to write to + ** virtual module xSync() callback. It is illegal to write to ** virtual module tables in this case, so return SQLITE_LOCKED. */ if( sqlite3VtabInSync(db) ){ @@ -136438,7 +136438,7 @@ SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *db, VTable *pVTab){ } if( !pVTab ){ return SQLITE_OK; - } + } pModule = pVTab->pVtab->pModule; if( pModule->xBegin ){ @@ -136451,7 +136451,7 @@ SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *db, VTable *pVTab){ } } - /* Invoke the xBegin method. If successful, add the vtab to the + /* Invoke the xBegin method. If successful, add the vtab to the ** sqlite3.aVTrans[] array. */ rc = growVTrans(db); if( rc==SQLITE_OK ){ @@ -136475,11 +136475,11 @@ SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *db, VTable *pVTab){ ** as the second argument to the virtual table method invoked. ** ** If op is SAVEPOINT_BEGIN, the xSavepoint method is invoked. If it is -** SAVEPOINT_ROLLBACK, the xRollbackTo method. Otherwise, if op is +** SAVEPOINT_ROLLBACK, the xRollbackTo method. Otherwise, if op is ** SAVEPOINT_RELEASE, then the xRelease method of each virtual table with ** an open transaction is invoked. ** -** If any virtual table method returns an error code other than SQLITE_OK, +** If any virtual table method returns an error code other than SQLITE_OK, ** processing is abandoned and the error returned to the caller of this ** function immediately. If all calls to virtual table methods are successful, ** SQLITE_OK is returned. @@ -136528,7 +136528,7 @@ SQLITE_PRIVATE int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){ ** This routine is used to allow virtual table implementations to ** overload MATCH, LIKE, GLOB, and REGEXP operators. ** -** Return either the pDef argument (indicating no change) or a +** Return either the pDef argument (indicating no change) or a ** new FuncDef structure that is marked as ephemeral using the ** SQLITE_FUNC_EPHEM flag. */ @@ -136557,7 +136557,7 @@ SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction( assert( pVtab->pModule!=0 ); pMod = (sqlite3_module *)pVtab->pModule; if( pMod->xFindFunction==0 ) return pDef; - + /* Call the xFindFunction method on the virtual table implementation ** to see if the implementation wants to overload this function. ** @@ -136675,7 +136675,7 @@ SQLITE_PRIVATE void sqlite3VtabEponymousTableClear(sqlite3 *db, Module *pMod){ Table *pTab = pMod->pEpoTab; if( pTab!=0 ){ /* Mark the table as Ephemeral prior to deleting it, so that the - ** sqlite3DeleteTable() routine will know that it is not stored in + ** sqlite3DeleteTable() routine will know that it is not stored in ** the schema. */ pTab->tabFlags |= TF_Ephemeral; sqlite3DeleteTable(db, pTab); @@ -136691,8 +136691,8 @@ SQLITE_PRIVATE void sqlite3VtabEponymousTableClear(sqlite3 *db, Module *pMod){ ** within an xUpdate method. */ SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *db){ - static const unsigned char aMap[] = { - SQLITE_ROLLBACK, SQLITE_ABORT, SQLITE_FAIL, SQLITE_IGNORE, SQLITE_REPLACE + static const unsigned char aMap[] = { + SQLITE_ROLLBACK, SQLITE_ABORT, SQLITE_FAIL, SQLITE_IGNORE, SQLITE_REPLACE }; #ifdef SQLITE_ENABLE_API_ARMOR if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; @@ -136704,7 +136704,7 @@ SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *db){ } /* -** Call from within the xCreate() or xConnect() methods to provide +** Call from within the xCreate() or xConnect() methods to provide ** the SQLite core with additional information about the behavior ** of the virtual table being implemented. */ @@ -136921,7 +136921,7 @@ struct WhereLoop { /* This object holds the prerequisites and the cost of running a ** subquery on one operand of an OR operator in the WHERE clause. -** See WhereOrSet for additional information +** See WhereOrSet for additional information */ struct WhereOrCost { Bitmask prereq; /* Prerequisites */ @@ -136973,7 +136973,7 @@ struct WherePath { ** clause subexpression is separated from the others by AND operators, ** usually, or sometimes subexpressions separated by OR. ** -** All WhereTerms are collected into a single WhereClause structure. +** All WhereTerms are collected into a single WhereClause structure. ** The following identity holds: ** ** WhereTerm.pWC->a[WhereTerm.idx] == WhereTerm @@ -137126,8 +137126,8 @@ struct WhereAndInfo { ** An instance of the following structure keeps track of a mapping ** between VDBE cursor numbers and bits of the bitmasks in WhereTerm. ** -** The VDBE cursor numbers are small integers contained in -** SrcList_item.iCursor and Expr.iTable fields. For any given WHERE +** The VDBE cursor numbers are small integers contained in +** SrcList_item.iCursor and Expr.iTable fields. For any given WHERE ** clause, the cursor numbers might not begin with 0 and they might ** contain gaps in the numbering sequence. But we want to make maximum ** use of the bits in our bitmasks. This structure provides a mapping @@ -137414,7 +137414,7 @@ static void explainAppendTerm( } /* -** Argument pLevel describes a strategy for scanning table pTab. This +** Argument pLevel describes a strategy for scanning table pTab. This ** function appends text to pStr that describes the subset of table ** rows scanned by the strategy in the form of an SQL expression. ** @@ -137455,7 +137455,7 @@ static void explainIndexRange(StrAccum *pStr, WhereLoop *pLoop){ /* ** This function is a no-op unless currently processing an EXPLAIN QUERY PLAN ** command, or if either SQLITE_DEBUG or SQLITE_ENABLE_STMT_SCANSTATUS was -** defined at compile-time. If it is not a no-op, a single OP_Explain opcode +** defined at compile-time. If it is not a no-op, a single OP_Explain opcode ** is added to the output to describe the table scan strategy in pLevel. ** ** If an OP_Explain opcode is added to the VM, its address is returned. @@ -137538,7 +137538,7 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan( assert( flags&WHERE_TOP_LIMIT); zRangeOp = "<"; } - sqlite3_str_appendf(&str, + sqlite3_str_appendf(&str, " USING INTEGER PRIMARY KEY (rowid%s?)",zRangeOp); } #ifndef SQLITE_OMIT_VIRTUALTABLE @@ -137567,11 +137567,11 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan( #ifdef SQLITE_ENABLE_STMT_SCANSTATUS /* ** Configure the VM passed as the first argument with an -** sqlite3_stmt_scanstatus() entry corresponding to the scan used to -** implement level pLvl. Argument pSrclist is a pointer to the FROM +** sqlite3_stmt_scanstatus() entry corresponding to the scan used to +** implement level pLvl. Argument pSrclist is a pointer to the FROM ** clause that the scan reads data from. ** -** If argument addrExplain is not 0, it must be the address of an +** If argument addrExplain is not 0, it must be the address of an ** OP_Explain instruction that describes the same loop. */ SQLITE_PRIVATE void sqlite3WhereAddScanStatus( @@ -137627,7 +137627,7 @@ SQLITE_PRIVATE void sqlite3WhereAddScanStatus( ** ** Only the parent term was in the original WHERE clause. The child1 ** and child2 terms were added by the LIKE optimization. If both of -** the virtual child terms are valid, then testing of the parent can be +** the virtual child terms are valid, then testing of the parent can be ** skipped. ** ** Usually the parent term is marked as TERM_CODED. But if the parent @@ -137659,7 +137659,7 @@ static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){ /* ** Code an OP_Affinity opcode to apply the column affinity string zAff -** to the n registers starting at base. +** to the n registers starting at base. ** ** As an optimization, SQLITE_AFF_BLOB and SQLITE_AFF_NONE entries (which ** are no-ops) at the beginning and end of zAff are ignored. If all entries @@ -137696,7 +137696,7 @@ static void codeApplyAffinity(Parse *pParse, int base, int n, char *zAff){ } /* -** Expression pRight, which is the RHS of a comparison operation, is +** Expression pRight, which is the RHS of a comparison operation, is ** either a vector of n elements or, if n==1, a scalar expression. ** Before the comparison operation, affinity zAff is to be applied ** to the pRight values. This function modifies characters within the @@ -137793,12 +137793,12 @@ static Expr *removeUnindexableInClauseTerms( } pSelect = pNew->x.pSelect; if( pSelect->pOrderBy ){ - /* If the SELECT statement has an ORDER BY clause, zero the - ** iOrderByCol variables. These are set to non-zero when an - ** ORDER BY term exactly matches one of the terms of the + /* If the SELECT statement has an ORDER BY clause, zero the + ** iOrderByCol variables. These are set to non-zero when an + ** ORDER BY term exactly matches one of the terms of the ** result-set. Since the result-set of the SELECT statement may - ** have been modified or reordered, these variables are no longer - ** set correctly. Since setting them is just an optimization, + ** have been modified or reordered, these variables are no longer + ** set correctly. Since setting them is just an optimization, ** it's easiest just to zero them here. */ ExprList *pOrderBy = pSelect->pOrderBy; for(i=0; inExpr; i++){ @@ -137819,7 +137819,7 @@ static Expr *removeUnindexableInClauseTerms( /* ** Generate code for a single equality term of the WHERE clause. An equality -** term can be either X=expr or X IN (...). pTerm is the term to be +** term can be either X=expr or X IN (...). pTerm is the term to be ** coded. ** ** The current value for the constraint is left in a register, the index @@ -137965,7 +137965,7 @@ static int codeEqualityTerm( ** For example, consider table t1(a,b,c,d,e,f) with index i1(a,b,c). ** Suppose the WHERE clause is this: a==5 AND b IN (1,2,3) AND c>5 AND c<10 ** The index has as many as three equality constraints, but in this -** example, the third "c" value is an inequality. So only two +** example, the third "c" value is an inequality. So only two ** constraints are coded. This routine will generate code to evaluate ** a==5 and b IN (1,2,3). The current values for a and b will be stored ** in consecutive registers and the index of the first register is returned. @@ -138055,7 +138055,7 @@ static int codeAllEqualityTerms( testcase( pIdx->aiColumn[j]==XN_EXPR ); VdbeComment((v, "%s", explainIndexColumnName(pIdx, j))); } - } + } /* Evaluate the equality constraints */ @@ -138064,7 +138064,7 @@ static int codeAllEqualityTerms( int r1; pTerm = pLoop->aLTerm[j]; assert( pTerm!=0 ); - /* The following testcase is true for indices with redundant columns. + /* The following testcase is true for indices with redundant columns. ** Ex: CREATE INDEX i1 ON t1(a,b,a); SELECT * FROM t1 WHERE a=0 AND b=0; */ testcase( (pTerm->wtFlags & TERM_CODED)!=0 ); testcase( pTerm->wtFlags & TERM_VIRTUAL ); @@ -138080,8 +138080,8 @@ static int codeAllEqualityTerms( if( pTerm->eOperator & WO_IN ){ if( pTerm->pExpr->flags & EP_xIsSelect ){ /* No affinity ever needs to be (or should be) applied to a value - ** from the RHS of an "? IN (SELECT ...)" expression. The - ** sqlite3FindInIndex() routine has already ensured that the + ** from the RHS of an "? IN (SELECT ...)" expression. The + ** sqlite3FindInIndex() routine has already ensured that the ** affinity of the comparison has been applied to the value. */ if( zAff ) zAff[j] = SQLITE_AFF_BLOB; } @@ -138108,7 +138108,7 @@ static int codeAllEqualityTerms( #ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS /* ** If the most recently coded instruction is a constant range constraint -** (a string literal) that originated from the LIKE optimization, then +** (a string literal) that originated from the LIKE optimization, then ** set P3 and P5 on the OP_String opcode so that the string will be cast ** to a BLOB at appropriate times. ** @@ -138133,7 +138133,7 @@ static void whereLikeOptimizationStringFixup( assert( pLevel->iLikeRepCntr>0 ); pOp = sqlite3VdbeGetOp(v, -1); assert( pOp!=0 ); - assert( pOp->opcode==OP_String8 + assert( pOp->opcode==OP_String8 || pTerm->pWC->pWInfo->pParse->db->mallocFailed ); pOp->p3 = (int)(pLevel->iLikeRepCntr>>1); /* Register holding counter */ pOp->p5 = (u8)(pLevel->iLikeRepCntr&1); /* ASC or DESC */ @@ -138176,7 +138176,7 @@ static int codeCursorHintCheckExpr(Walker *pWalker, Expr *pExpr){ /* ** Test whether or not expression pExpr, which was part of a WHERE clause, ** should be included in the cursor-hint for a table that is on the rhs -** of a LEFT JOIN. Set Walker.eCode to non-zero before returning if the +** of a LEFT JOIN. Set Walker.eCode to non-zero before returning if the ** expression is not suitable. ** ** An expression is unsuitable if it might evaluate to non NULL even if @@ -138189,9 +138189,9 @@ static int codeCursorHintCheckExpr(Walker *pWalker, Expr *pExpr){ ** CASE WHEN col THEN 0 ELSE 1 END */ static int codeCursorHintIsOrFunction(Walker *pWalker, Expr *pExpr){ - if( pExpr->op==TK_IS - || pExpr->op==TK_ISNULL || pExpr->op==TK_ISNOT - || pExpr->op==TK_NOTNULL || pExpr->op==TK_CASE + if( pExpr->op==TK_IS + || pExpr->op==TK_ISNULL || pExpr->op==TK_ISNOT + || pExpr->op==TK_NOTNULL || pExpr->op==TK_CASE ){ pWalker->eCode = 1; }else if( pExpr->op==TK_FUNCTION ){ @@ -138212,10 +138212,10 @@ static int codeCursorHintIsOrFunction(Walker *pWalker, Expr *pExpr){ ** that accesses any table other than the one identified by ** CCurHint.iTabCur, then do the following: ** -** 1) allocate a register and code an OP_Column instruction to read +** 1) allocate a register and code an OP_Column instruction to read ** the specified column into the new register, and ** -** 2) transform the expression node to a TK_REGISTER node that reads +** 2) transform the expression node to a TK_REGISTER node that reads ** from the newly populated register. ** ** Also, if the node is a TK_COLUMN that does access the table idenified @@ -138243,7 +138243,7 @@ static int codeCursorHintFixExpr(Walker *pWalker, Expr *pExpr){ ** the parent context. Do not walk the function arguments in this case. ** ** todo: It should be possible to replace this node with a TK_REGISTER - ** expression, as the result of the expression must be stored in a + ** expression, as the result of the expression must be stored in a ** register at this point. The same holds for TK_AGG_COLUMN nodes. */ rc = WRC_Prune; } @@ -138286,18 +138286,18 @@ static void codeCursorHint( if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; if( pTerm->prereqAll & pLevel->notReady ) continue; - /* Any terms specified as part of the ON(...) clause for any LEFT + /* Any terms specified as part of the ON(...) clause for any LEFT ** JOIN for which the current table is not the rhs are omitted - ** from the cursor-hint. + ** from the cursor-hint. ** - ** If this table is the rhs of a LEFT JOIN, "IS" or "IS NULL" terms + ** If this table is the rhs of a LEFT JOIN, "IS" or "IS NULL" terms ** that were specified as part of the WHERE clause must be excluded. ** This is to address the following: ** ** SELECT ... t1 LEFT JOIN t2 ON (t1.a=t2.b) WHERE t2.c IS NULL; ** ** Say there is a single row in t2 that matches (t1.a=t2.b), but its - ** t2.c values is not NULL. If the (t2.c IS NULL) constraint is + ** t2.c values is not NULL. If the (t2.c IS NULL) constraint is ** pushed down to the cursor, this row is filtered out, causing ** SQLite to synthesize a row of NULL values. Which does match the ** WHERE clause, and so the query returns a row. Which is incorrect. @@ -138310,7 +138310,7 @@ static void codeCursorHint( */ if( pTabItem->fg.jointype & JT_LEFT ){ Expr *pExpr = pTerm->pExpr; - if( !ExprHasProperty(pExpr, EP_FromJoin) + if( !ExprHasProperty(pExpr, EP_FromJoin) || pExpr->iRightJoinTable!=pTabItem->iCursor ){ sWalker.eCode = 0; @@ -138348,7 +138348,7 @@ static void codeCursorHint( if( pExpr!=0 ){ sWalker.xExprCallback = codeCursorHintFixExpr; sqlite3WalkExpr(&sWalker, pExpr); - sqlite3VdbeAddOp4(v, OP_CursorHint, + sqlite3VdbeAddOp4(v, OP_CursorHint, (sHint.pIdx ? sHint.iIdxCur : sHint.iTabCur), 0, 0, (const char*)pExpr, P4_EXPR); } @@ -138360,7 +138360,7 @@ static void codeCursorHint( /* ** Cursor iCur is open on an intkey b-tree (a table). Register iRowid contains ** a rowid value just read from cursor iIdxCur, open on index pIdx. This -** function generates code to do a deferred seek of cursor iCur to the +** function generates code to do a deferred seek of cursor iCur to the ** rowid stored in register iRowid. ** ** Normally, this is just: @@ -138370,8 +138370,8 @@ static void codeCursorHint( ** However, if the scan currently being coded is a branch of an OR-loop and ** the statement currently being coded is a SELECT, then P3 of OP_DeferredSeek ** is set to iIdxCur and P4 is set to point to an array of integers -** containing one entry for each column of the table cursor iCur is open -** on. For each table column, if the column is the i'th column of the +** containing one entry for each column of the table cursor iCur is open +** on. For each table column, if the column is the i'th column of the ** index, then the corresponding array entry is set to (i+1). If the column ** does not appear in the index at all, the array entry is set to 0. */ @@ -138386,7 +138386,7 @@ static void codeDeferredSeek( assert( iIdxCur>0 ); assert( pIdx->aiColumn[pIdx->nColumn-1]==-1 ); - + sqlite3VdbeAddOp3(v, OP_DeferredSeek, iIdxCur, 0, iCur); if( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE) && DbMaskAllZero(sqlite3ParseToplevel(pParse)->writeMask) @@ -138670,7 +138670,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( sqlite3VdbeAddOp3(v, pOp->opcode, pOp->p1, pOp->p2, pOp->p3); } - /* Generate code that will continue to the next row if + /* Generate code that will continue to the next row if ** the IN constraint is not satisfied */ pCompare = sqlite3PExpr(pParse, TK_EQ, 0, 0); assert( pCompare!=0 || db->mallocFailed ); @@ -138745,7 +138745,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( int r1, rTemp; /* Registers for holding the start boundary */ int op; /* Cursor seek operation */ - /* The following constant maps TK_xx codes into corresponding + /* The following constant maps TK_xx codes into corresponding ** seek opcodes. It depends on a particular ordering of TK_xx */ const u8 aMoveOp[] = { @@ -138801,8 +138801,8 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( testcase( pEnd->wtFlags & TERM_VIRTUAL ); memEndValue = ++pParse->nMem; codeExprOrVector(pParse, pX->pRight, memEndValue, 1); - if( 0==sqlite3ExprIsVector(pX->pRight) - && (pX->op==TK_LT || pX->op==TK_GT) + if( 0==sqlite3ExprIsVector(pX->pRight) + && (pX->op==TK_LT || pX->op==TK_GT) ){ testOp = bRev ? OP_Le : OP_Ge; }else{ @@ -138830,14 +138830,14 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( }else if( pLoop->wsFlags & WHERE_INDEXED ){ /* Case 4: A scan using an index. ** - ** The WHERE clause may contain zero or more equality + ** The WHERE clause may contain zero or more equality ** terms ("==" or "IN" operators) that refer to the N ** left-most columns of the index. It may also contain ** inequality constraints (>, <, >= or <=) on the indexed - ** column that immediately follows the N equalities. Only + ** column that immediately follows the N equalities. Only ** the right-most column can be an inequality - the rest must - ** use the "==" and "IN" operators. For example, if the - ** index is on (x,y,z), then the following clauses are all + ** use the "==" and "IN" operators. For example, if the + ** index is on (x,y,z), then the following clauses are all ** optimized: ** ** x=5 @@ -138858,7 +138858,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** This case is also used when there are no WHERE clause ** constraints but an index is selected anyway, in order ** to force the output order to conform to an ORDER BY. - */ + */ static const u8 aStartOp[] = { 0, 0, @@ -138899,15 +138899,15 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( iIdxCur = pLevel->iIdxCur; assert( nEq>=pLoop->nSkip ); - /* Find any inequality constraint terms for the start and end - ** of the range. + /* Find any inequality constraint terms for the start and end + ** of the range. */ j = nEq; if( pLoop->wsFlags & WHERE_BTM_LIMIT ){ pRangeStart = pLoop->aLTerm[j++]; nExtraReg = MAX(nExtraReg, pLoop->u.btree.nBtm); /* Like optimization range constraints always occur in pairs */ - assert( (pRangeStart->wtFlags & TERM_LIKEOPT)==0 || + assert( (pRangeStart->wtFlags & TERM_LIKEOPT)==0 || (pLoop->wsFlags & WHERE_TOP_LIMIT)!=0 ); } if( pLoop->wsFlags & WHERE_TOP_LIMIT ){ @@ -138940,7 +138940,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( assert( pRangeEnd==0 || (pRangeEnd->wtFlags & TERM_VNULL)==0 ); /* If the WHERE_BIGNULL_SORT flag is set, then index column nEq uses - ** a non-default "big-null" sort (either ASC NULLS LAST or DESC NULLS + ** a non-default "big-null" sort (either ASC NULLS LAST or DESC NULLS ** FIRST). In both cases separate ordered scans are made of those ** index entries for which the column is null and for those for which ** it is not. For an ASC sort, the non-NULL entries are scanned first. @@ -138959,7 +138959,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( } /* If we are doing a reverse order scan on an ascending index, or - ** a forward order scan on a descending index, interchange the + ** a forward order scan on a descending index, interchange the ** start and end terms (pRangeStart and pRangeEnd). */ if( (nEqnKeyCol && bRev==(pIdx->aSortOrder[nEq]==SQLITE_SO_ASC)) @@ -139004,7 +139004,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( } if( zStartAff ){ updateRangeAffinityStr(pRight, nBtm, &zStartAff[nEq]); - } + } nConstraint += nBtm; testcase( pRangeStart->wtFlags & TERM_VIRTUAL ); if( sqlite3ExprIsVector(pRight)==0 ){ @@ -139055,7 +139055,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( assert( bStopAtNull==startEq ); sqlite3VdbeAddOp2(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+2); op = aStartOp[(nConstraint>1)*4 + 2 + bRev]; - sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint-startEq); VdbeCoverage(v); VdbeCoverageIf(v, op==OP_Rewind); testcase( op==OP_Rewind ); @@ -139145,13 +139145,13 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( } /* Seek the table cursor, if required */ - omitTable = (pLoop->wsFlags & WHERE_IDX_ONLY)!=0 + omitTable = (pLoop->wsFlags & WHERE_IDX_ONLY)!=0 && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0; if( omitTable ){ /* pIdx is a covering index. No need to access the main table. */ }else if( HasRowid(pIdx->pTable) ){ if( (pWInfo->wctrlFlags & WHERE_SEEK_TABLE) || ( - (pWInfo->wctrlFlags & WHERE_SEEK_UNIQ_TABLE) + (pWInfo->wctrlFlags & WHERE_SEEK_UNIQ_TABLE) && (pWInfo->eOnePass==ONEPASS_SINGLE) )){ iRowidReg = ++pParse->nMem; @@ -139176,7 +139176,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** all the expressions in pWInfo and try to transform matching expressions ** into reference to index columns. ** - ** Do not do this for the RHS of a LEFT JOIN. This is because the + ** Do not do this for the RHS of a LEFT JOIN. This is because the ** expression may be evaluated after OP_NullRow has been executed on ** the cursor. In this case it is important to do the full evaluation, ** as the result of the expression may not be NULL, even if all table @@ -139308,15 +139308,15 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( pOrTab = pWInfo->pTabList; } - /* Initialize the rowset register to contain NULL. An SQL NULL is + /* Initialize the rowset register to contain NULL. An SQL NULL is ** equivalent to an empty rowset. Or, create an ephemeral index ** capable of holding primary keys in the case of a WITHOUT ROWID. ** - ** Also initialize regReturn to contain the address of the instruction + ** Also initialize regReturn to contain the address of the instruction ** immediately following the OP_Return at the bottom of the loop. This ** is required in a few obscure LEFT JOIN cases where control jumps - ** over the top of the loop into the body of it. In this case the - ** correct response for the end-of-loop code (the OP_Return) is to + ** over the top of the loop into the body of it. In this case the + ** correct response for the end-of-loop code (the OP_Return) is to ** fall through to the next instruction, just as an OP_Next does if ** called on an uninitialized cursor. */ @@ -139341,7 +139341,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** ** Actually, each subexpression is converted to "xN AND w" where w is ** the "interesting" terms of z - terms that did not originate in the - ** ON or USING clause of a LEFT JOIN, and terms that are usable as + ** ON or USING clause of a LEFT JOIN, and terms that are usable as ** indices. ** ** This optimization also only applies if the (x1 OR x2 OR ...) term @@ -139365,7 +139365,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( /* The extra 0x10000 bit on the opcode is masked off and does not ** become part of the new Expr.op. However, it does make the ** op==TK_AND comparison inside of sqlite3PExpr() false, and this - ** prevents sqlite3PExpr() from implementing AND short-circuit + ** prevents sqlite3PExpr() from implementing AND short-circuit ** optimization, which we do not want here. */ pAndExpr = sqlite3PExpr(pParse, TK_AND|0x10000, 0, pAndExpr); } @@ -139383,8 +139383,8 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( WhereInfo *pSubWInfo; /* Info for single OR-term scan */ Expr *pOrExpr = pOrTerm->pExpr; /* Current OR clause term */ int jmp1 = 0; /* Address of jump operation */ - assert( (pTabItem[0].fg.jointype & JT_LEFT)==0 - || ExprHasProperty(pOrExpr, EP_FromJoin) + assert( (pTabItem[0].fg.jointype & JT_LEFT)==0 + || ExprHasProperty(pOrExpr, EP_FromJoin) ); if( pAndExpr ){ pAndExpr->pLeft = pOrExpr; @@ -139436,9 +139436,9 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** ** Use some of the same optimizations as OP_RowSetTest: If iSet ** is zero, assume that the key cannot already be present in - ** the temp table. And if iSet is -1, assume that there is no - ** need to insert the key into the temp table, as it will never - ** be tested for. */ + ** the temp table. And if iSet is -1, assume that there is no + ** need to insert the key into the temp table, as it will never + ** be tested for. */ if( iSet ){ jmp1 = sqlite3VdbeAddOp4Int(v, OP_Found, regRowset, 0, r, nPk); VdbeCoverage(v); @@ -139477,8 +139477,8 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** If the call to sqlite3WhereBegin() above resulted in a scan that ** uses an index, and this is either the first OR-connected term ** processed or the index is the same as that used by all previous - ** terms, set pCov to the candidate covering index. Otherwise, set - ** pCov to NULL to indicate that no candidate covering index will + ** terms, set pCov to the candidate covering index. Otherwise, set + ** pCov to NULL to indicate that no candidate covering index will ** be available. */ pSubLoop = pSubWInfo->a[0].pWLoop; @@ -139550,7 +139550,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** ** iLoop==1: Code only expressions that are entirely covered by pIdx. ** iLoop==2: Code remaining expressions that do not contain correlated - ** sub-queries. + ** sub-queries. ** iLoop==3: Code all remaining expressions. ** ** An effort is made to skip unnecessary iterations of the loop. @@ -139575,7 +139575,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( if( (pTabItem->fg.jointype&JT_LEFT) && !ExprHasProperty(pE,EP_FromJoin) ){ continue; } - + if( iLoop==1 && !sqlite3ExprCoveredByIndex(pE, pLevel->iTabCur, pIdx) ){ iNext = 2; continue; @@ -139638,7 +139638,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( WO_EQ|WO_IN|WO_IS, 0); if( pAlt==0 ) continue; if( pAlt->wtFlags & (TERM_CODED) ) continue; - if( (pAlt->eOperator & WO_IN) + if( (pAlt->eOperator & WO_IN) && (pAlt->pExpr->flags & EP_xIsSelect) && (pAlt->pExpr->x.pSelect->pEList->nExpr>1) ){ @@ -139654,7 +139654,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( } /* For a LEFT OUTER JOIN, generate code that will record the fact that - ** at least one row of the right table has matched the left table. + ** at least one row of the right table has matched the left table. */ if( pLevel->iLeftJoin ){ pLevel->addrFirst = sqlite3VdbeCurrentAddr(v); @@ -139795,7 +139795,7 @@ static int allowedOp(int op){ ** collating sequence, then COLLATE operators are adjusted to ensure ** that the collating sequence does not change. For example: ** "Y collate NOCASE op X" becomes "X op Y" because any collation sequence on -** the left hand side of a comparison overrides any collation sequence +** the left hand side of a comparison overrides any collation sequence ** attached to the right. For the same reason the EP_Collate flag ** is not commuted. ** @@ -139967,8 +139967,8 @@ static int isLikeOrGlob( ** 2019-06-14 https://sqlite.org/src/info/ce8717f0885af975 ** 2019-09-03 https://sqlite.org/src/info/0f0428096f17252a */ - if( pLeft->op!=TK_COLUMN - || sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT + if( pLeft->op!=TK_COLUMN + || sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT || IsVirtual(pLeft->y.pTab) /* Value might be numeric */ ){ int isNum; @@ -140003,7 +140003,7 @@ static int isLikeOrGlob( ** function, then no OP_Variable will be added to the program. ** This causes problems for the sqlite3_bind_parameter_name() ** API. To work around them, add a dummy OP_Variable here. - */ + */ int r1 = sqlite3GetTempReg(pParse); sqlite3ExprCodeTarget(pParse, pRight, r1); sqlite3VdbeChangeP3(v, sqlite3VdbeCurrentAddr(v)-1, 0); @@ -140040,7 +140040,7 @@ static int isLikeOrGlob( ** 9. column IS NOT NULL SQLITE_INDEX_CONSTRAINT_ISNOTNULL ** ** In every case, "column" must be a column of a virtual table. If there -** is a match, set *ppLeft to the "column" expression, set *ppRight to the +** is a match, set *ppLeft to the "column" expression, set *ppRight to the ** "expr" expression (even though in forms (6) and (8) the column is on the ** right and the expression is on the left). Also set *peOp2 to the ** appropriate virtual table operator. The return value is 1 or 2 if there @@ -140199,7 +140199,7 @@ static WhereTerm *whereNthSubterm(WhereTerm *pTerm, int N){ ** ** The following is NOT generated: ** -** xy --> x!=y +** xy --> x!=y */ static void whereCombineDisjuncts( SrcList *pSrc, /* the FROM clause */ @@ -140296,10 +140296,10 @@ static void whereCombineDisjuncts( ** WhereTerm.u.pOrInfo->indexable |= the cursor number for table T ** ** A subterm is "indexable" if it is of the form -** "T.C " where C is any column of table T and +** "T.C " where C is any column of table T and ** is one of "=", "<", "<=", ">", ">=", "IS NULL", or "IN". ** A subterm is also indexable if it is an AND of two or more -** subsubterms at least one of which is indexable. Indexable AND +** subsubterms at least one of which is indexable. Indexable AND ** subterms have their eOperator set to WO_AND and they have ** u.pAndInfo set to a dynamically allocated WhereAndTerm object. ** @@ -140390,7 +140390,7 @@ static void exprAnalyzeOrTerm( if( !db->mallocFailed ){ for(j=0, pAndTerm=pAndWC->a; jnTerm; j++, pAndTerm++){ assert( pAndTerm->pExpr ); - if( allowedOp(pAndTerm->pExpr->op) + if( allowedOp(pAndTerm->pExpr->op) || pAndTerm->eOperator==WO_AUX ){ b |= sqlite3WhereGetMask(&pWInfo->sMaskSet, pAndTerm->leftCursor); @@ -140493,7 +140493,7 @@ static void exprAnalyzeOrTerm( pOrTerm->leftCursor))==0 ){ /* This term must be of the form t1.a==t2.b where t2 is in the ** chngToIN set but t1 is not. This term will be either preceded - ** or follwed by an inverted copy (t2.b==t1.a). Skip this term + ** or follwed by an inverted copy (t2.b==t1.a). Skip this term ** and use its inversion. */ testcase( pOrTerm->wtFlags & TERM_COPIED ); testcase( pOrTerm->wtFlags & TERM_VIRTUAL ); @@ -140522,7 +140522,7 @@ static void exprAnalyzeOrTerm( assert( pOrTerm->eOperator & WO_EQ ); if( pOrTerm->leftCursor!=iCursor ){ pOrTerm->wtFlags &= ~TERM_OR_OK; - }else if( pOrTerm->u.leftColumn!=iColumn || (iColumn==XN_EXPR + }else if( pOrTerm->u.leftColumn!=iColumn || (iColumn==XN_EXPR && sqlite3ExprCompare(pParse, pOrTerm->pExpr->pLeft, pLeft, -1) )){ okToChngToIN = 0; @@ -140544,7 +140544,7 @@ static void exprAnalyzeOrTerm( } /* At this point, okToChngToIN is true if original pTerm satisfies - ** case 1. In that case, construct a new virtual term that is + ** case 1. In that case, construct a new virtual term that is ** pTerm converted into an IN operator. */ if( okToChngToIN ){ @@ -140689,8 +140689,8 @@ static int exprMightBeIndexed( Expr *pExpr, /* An operand of a comparison operator */ int op /* The specific comparison operator */ ){ - /* If this expression is a vector to the left or right of a - ** inequality constraint (>, <, >= or <=), perform the processing + /* If this expression is a vector to the left or right of a + ** inequality constraint (>, <, >= or <=), perform the processing ** on the first element of the vector. */ assert( TK_GT+1==TK_LE && TK_GT+2==TK_LT && TK_GT+3==TK_GE ); assert( TK_ISeOperator = operatorMask(op) & opMask; } if( op==TK_IS ) pTerm->wtFlags |= TERM_IS; - if( pRight + if( pRight && exprMightBeIndexed(pSrc, pTerm->prereqRight, aiCurCol, pRight, op) ){ WhereTerm *pNew; @@ -140870,7 +140870,7 @@ static void exprAnalyze( for(i=0; i<2; i++){ Expr *pNewExpr; int idxNew; - pNewExpr = sqlite3PExpr(pParse, ops[i], + pNewExpr = sqlite3PExpr(pParse, ops[i], sqlite3ExprDup(db, pExpr->pLeft, 0), sqlite3ExprDup(db, pList->a[i].pExpr, 0)); transferJoinMarkings(pNewExpr, pExpr); @@ -140908,7 +140908,7 @@ static void exprAnalyze( ** bound is made all lowercase so that the bounds also work when comparing ** BLOBs. */ - if( pWC->op==TK_AND + if( pWC->op==TK_AND && isLikeOrGlob(pParse, pExpr, &pStr1, &isComplete, &noCase) ){ Expr *pLeft; /* LHS of LIKE/GLOB operator */ @@ -140944,7 +140944,7 @@ static void exprAnalyze( if( noCase ){ /* The point is to increment the last character before the first ** wildcard. But if we increment '@', that will push it into the - ** alphabetic range where case conversions will mess up the + ** alphabetic range where case conversions will mess up the ** inequality. To avoid this, make sure to also run the full ** LIKE on all candidate expressions by clearing the isComplete flag */ @@ -141000,7 +141000,7 @@ static void exprAnalyze( prereqColumn = sqlite3WhereExprUsage(pMaskSet, pLeft); if( (prereqExpr & prereqColumn)==0 ){ Expr *pNewExpr; - pNewExpr = sqlite3PExpr(pParse, TK_MATCH, + pNewExpr = sqlite3PExpr(pParse, TK_MATCH, 0, sqlite3ExprDup(db, pRight, 0)); if( ExprHasProperty(pExpr, EP_FromJoin) && pNewExpr ){ ExprSetProperty(pNewExpr, EP_FromJoin); @@ -141030,11 +141030,11 @@ static void exprAnalyze( ** ** This is only required if at least one side of the comparison operation ** is not a sub-select. */ - if( pWC->op==TK_AND + if( pWC->op==TK_AND && (pExpr->op==TK_EQ || pExpr->op==TK_IS) && (nLeft = sqlite3ExprVectorSize(pExpr->pLeft))>1 && sqlite3ExprVectorSize(pExpr->pRight)==nLeft - && ( (pExpr->pLeft->flags & EP_xIsSelect)==0 + && ( (pExpr->pLeft->flags & EP_xIsSelect)==0 || (pExpr->pRight->flags & EP_xIsSelect)==0) ){ int i; @@ -141056,7 +141056,7 @@ static void exprAnalyze( /* If there is a vector IN term - e.g. "(a, b) IN (SELECT ...)" - create ** a virtual term for each vector component. The expression object - ** used by each such virtual term is pExpr (the full vector IN(...) + ** used by each such virtual term is pExpr (the full vector IN(...) ** expression). The WhereTerm.iField variable identifies the index within ** the vector on the LHS that the virtual term represents. ** @@ -141245,7 +141245,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereExprListUsage(WhereMaskSet *pMaskSet, ExprLis /* -** Call exprAnalyze on all terms in a WHERE clause. +** Call exprAnalyze on all terms in a WHERE clause. ** ** Note that exprAnalyze() might add new virtual terms onto the ** end of the WHERE clause. We do not want to analyze these new @@ -141264,7 +141264,7 @@ SQLITE_PRIVATE void sqlite3WhereExprAnalyze( /* ** For table-valued-functions, transform the function arguments into -** new WHERE clause terms. +** new WHERE clause terms. ** ** Each function argument translates into an equality constraint against ** a HIDDEN column in the table. @@ -141297,7 +141297,7 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs( pColRef->iTable = pItem->iCursor; pColRef->iColumn = k++; pColRef->y.pTab = pTab; - pRhs = sqlite3PExpr(pParse, TK_UPLUS, + pRhs = sqlite3PExpr(pParse, TK_UPLUS, sqlite3ExprDup(pParse->db, pArgs->a[j].pExpr, 0), 0); pTerm = sqlite3PExpr(pParse, TK_EQ, pColRef, pRhs); whereClauseInsert(pWC, pTerm, TERM_DYNAMIC); @@ -141392,7 +141392,7 @@ SQLITE_PRIVATE int sqlite3WhereIsOrdered(WhereInfo *pWInfo){ ** be the continuation for the inner-most loop. ** ** It is always safe for this routine to return the continuation of the -** inner-most loop, in the sense that a correct answer will result. +** inner-most loop, in the sense that a correct answer will result. ** Returning the continuation the second inner loop is an optimization ** that might make the code run a little faster, but should not change ** the final answer. @@ -141400,7 +141400,7 @@ SQLITE_PRIVATE int sqlite3WhereIsOrdered(WhereInfo *pWInfo){ SQLITE_PRIVATE int sqlite3WhereOrderByLimitOptLabel(WhereInfo *pWInfo){ WhereLevel *pInner; if( !pWInfo->bOrderedInnerLoop ){ - /* The ORDER BY LIMIT optimization does not apply. Jump to the + /* The ORDER BY LIMIT optimization does not apply. Jump to the ** continuation of the inner-most loop. */ return pWInfo->iContinue; } @@ -141431,7 +141431,7 @@ SQLITE_PRIVATE int sqlite3WhereBreakLabel(WhereInfo *pWInfo){ ** operate directly on the rowis returned by a WHERE clause. Return ** ONEPASS_SINGLE (1) if the statement can operation directly because only ** a single row is to be changed. Return ONEPASS_MULTI (2) if the one-pass -** optimization can be used on multiple +** optimization can be used on multiple ** ** If the ONEPASS optimization is used (if this routine returns true) ** then also write the indices of open cursors used by ONEPASS @@ -141694,7 +141694,7 @@ static WhereTerm *whereScanInit( ** if pIdx!=0 and is one of the WO_xx operator codes specified by ** the op parameter. Return a pointer to the term. Return 0 if not found. ** -** If pIdx!=0 then it must be one of the indexes of table iCur. +** If pIdx!=0 then it must be one of the indexes of table iCur. ** Search for terms matching the iColumn-th column of pIdx ** rather than the iColumn-th column of table iCur. ** @@ -141807,17 +141807,17 @@ static int isDistinctRedundant( ){ Table *pTab; Index *pIdx; - int i; + int i; int iBase; /* If there is more than one table or sub-select in the FROM clause of - ** this query, then it will not be possible to show that the DISTINCT + ** this query, then it will not be possible to show that the DISTINCT ** clause is redundant. */ if( pTabList->nSrc!=1 ) return 0; iBase = pTabList->a[0].iCursor; pTab = pTabList->a[0].pTab; - /* If any of the expressions is an IPK column on table iBase, then return + /* If any of the expressions is an IPK column on table iBase, then return ** true. Note: The (p->iTable==iBase) part of this test may be false if the ** current SELECT is a correlated sub-query. */ @@ -141868,7 +141868,7 @@ static LogEst estLog(LogEst N){ ** Convert OP_Column opcodes to OP_Copy in previously generated code. ** ** This routine runs over generated VDBE code and translates OP_Column -** opcodes into OP_Copy when the table is being accessed via co-routine +** opcodes into OP_Copy when the table is being accessed via co-routine ** instead of via table lookup. ** ** If the iAutoidxCur is not zero, then any OP_Rowid instructions on @@ -141966,7 +141966,7 @@ static int termCanDriveIndex( char aff; if( pTerm->leftCursor!=pSrc->iCursor ) return 0; if( (pTerm->eOperator & (WO_EQ|WO_IS))==0 ) return 0; - if( (pSrc->fg.jointype & JT_LEFT) + if( (pSrc->fg.jointype & JT_LEFT) && !ExprHasProperty(pTerm->pExpr, EP_FromJoin) && (pTerm->eOperator & WO_IS) ){ @@ -142182,7 +142182,7 @@ static void constructAutomaticIndex( sqlite3VdbeChangeP5(v, SQLITE_STMTSTATUS_AUTOINDEX); sqlite3VdbeJumpHere(v, addrTop); sqlite3ReleaseTempReg(pParse, regRecord); - + /* Jump here when skipping the initialization */ sqlite3VdbeJumpHere(v, addrInit); @@ -142193,7 +142193,7 @@ end_auto_index_create: #ifndef SQLITE_OMIT_VIRTUALTABLE /* -** Allocate and populate an sqlite3_index_info structure. It is the +** Allocate and populate an sqlite3_index_info structure. It is the ** responsibility of the caller to eventually release the structure ** by passing the pointer returned by this function to sqlite3_free(). */ @@ -142232,7 +142232,7 @@ static sqlite3_index_info *allocateIndexInfo( nTerm++; } - /* If the ORDER BY clause contains only columns in the current + /* If the ORDER BY clause contains only columns in the current ** virtual table then allocate space for the aOrderBy part of ** the sqlite3_index_info structure. */ @@ -142328,7 +142328,7 @@ static sqlite3_index_info *allocateIndexInfo( assert( pTerm->eOperator&(WO_IN|WO_EQ|WO_LT|WO_LE|WO_GT|WO_GE|WO_AUX) ); if( op & (WO_LT|WO_LE|WO_GT|WO_GE) - && sqlite3ExprIsVector(pTerm->pExpr->pRight) + && sqlite3ExprIsVector(pTerm->pExpr->pRight) ){ if( i<16 ) mNoOmit |= (1 << i); if( op==WO_LT ) pIdxCons[j].op = WO_LE; @@ -142398,8 +142398,8 @@ static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){ ** Return the index of the sample that is the smallest sample that ** is greater than or equal to pRec. Note that this index is not an index ** into the aSample[] array - it is an index into a virtual set of samples -** based on the contents of aSample[] and the number of fields in record -** pRec. +** based on the contents of aSample[] and the number of fields in record +** pRec. */ static int whereKeyStats( Parse *pParse, /* Database connection */ @@ -142435,38 +142435,38 @@ static int whereKeyStats( ** consider prefixes of those samples. For example, if the set of samples ** in aSample is: ** - ** aSample[0] = (a, 5) - ** aSample[1] = (a, 10) - ** aSample[2] = (b, 5) - ** aSample[3] = (c, 100) + ** aSample[0] = (a, 5) + ** aSample[1] = (a, 10) + ** aSample[2] = (b, 5) + ** aSample[3] = (c, 100) ** aSample[4] = (c, 105) ** - ** Then the search space should ideally be the samples above and the - ** unique prefixes [a], [b] and [c]. But since that is hard to organize, + ** Then the search space should ideally be the samples above and the + ** unique prefixes [a], [b] and [c]. But since that is hard to organize, ** the code actually searches this set: ** - ** 0: (a) - ** 1: (a, 5) - ** 2: (a, 10) - ** 3: (a, 10) - ** 4: (b) - ** 5: (b, 5) - ** 6: (c) - ** 7: (c, 100) + ** 0: (a) + ** 1: (a, 5) + ** 2: (a, 10) + ** 3: (a, 10) + ** 4: (b) + ** 5: (b, 5) + ** 6: (c) + ** 7: (c, 100) ** 8: (c, 105) ** 9: (c, 105) ** ** For each sample in the aSample[] array, N samples are present in the - ** effective sample array. In the above, samples 0 and 1 are based on + ** effective sample array. In the above, samples 0 and 1 are based on ** sample aSample[0]. Samples 2 and 3 on aSample[1] etc. ** ** Often, sample i of each block of N effective samples has (i+1) fields. ** Except, each sample may be extended to ensure that it is greater than or - ** equal to the previous sample in the array. For example, in the above, - ** sample 2 is the first sample of a block of N samples, so at first it - ** appears that it should be 1 field in size. However, that would make it - ** smaller than sample 1, so the binary search would not work. As a result, - ** it is extended to two fields. The duplicates that this creates do not + ** equal to the previous sample in the array. For example, in the above, + ** sample 2 is the first sample of a block of N samples, so at first it + ** appears that it should be 1 field in size. However, that would make it + ** smaller than sample 1, so the binary search would not work. As a result, + ** it is extended to two fields. The duplicates that this creates do not ** cause any problems. */ nField = pRec->nField; @@ -142480,7 +142480,7 @@ static int whereKeyStats( iSamp = iTest / nField; if( iSamp>0 ){ /* The proposed effective sample is a prefix of sample aSample[iSamp]. - ** Specifically, the shortest prefix of at least (1 + iTest%nField) + ** Specifically, the shortest prefix of at least (1 + iTest%nField) ** fields that is greater than the previous effective sample. */ for(n=(iTest % nField) + 1; nnSample ); assert( iCol==nField-1 ); pRec->nField = nField; - assert( 0==sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec) - || pParse->db->mallocFailed + assert( 0==sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec) + || pParse->db->mallocFailed ); }else{ /* Unless i==pIdx->nSample, indicating that pRec is larger than @@ -142524,7 +142524,7 @@ static int whereKeyStats( ** (iCol+1) field prefix of sample i. */ assert( i<=pIdx->nSample && i>=0 ); pRec->nField = iCol+1; - assert( i==pIdx->nSample + assert( i==pIdx->nSample || sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec)>0 || pParse->db->mallocFailed ); @@ -142552,7 +142552,7 @@ static int whereKeyStats( aStat[0] = aSample[i].anLt[iCol]; aStat[1] = aSample[i].anEq[iCol]; }else{ - /* At this point, the (iCol+1) field prefix of aSample[i] is the first + /* At this point, the (iCol+1) field prefix of aSample[i] is the first ** sample that is greater than pRec. Or, if i==pIdx->nSample then pRec ** is larger than all samples in the array. */ tRowcnt iUpper, iGap; @@ -142584,7 +142584,7 @@ static int whereKeyStats( /* ** If it is not NULL, pTerm is a term that provides an upper or lower -** bound on a range scan. Without considering pTerm, it is estimated +** bound on a range scan. Without considering pTerm, it is estimated ** that the scan will visit nNew rows. This function returns the number ** estimated to be visited after taking pTerm into account. ** @@ -142622,18 +142622,18 @@ SQLITE_PRIVATE char sqlite3IndexColumnAffinity(sqlite3 *db, Index *pIdx, int iCo #ifdef SQLITE_ENABLE_STAT4 -/* +/* ** This function is called to estimate the number of rows visited by a ** range-scan on a skip-scan index. For example: ** ** CREATE INDEX i1 ON t1(a, b, c); ** SELECT * FROM t1 WHERE a=? AND c BETWEEN ? AND ?; ** -** Value pLoop->nOut is currently set to the estimated number of rows -** visited for scanning (a=? AND b=?). This function reduces that estimate +** Value pLoop->nOut is currently set to the estimated number of rows +** visited for scanning (a=? AND b=?). This function reduces that estimate ** by some factor to account for the (c BETWEEN ? AND ?) expression based -** on the stat4 data for the index. this scan will be peformed multiple -** times (once for each (a,b) combination that matches a=?) is dealt with +** on the stat4 data for the index. this scan will be peformed multiple +** times (once for each (a,b) combination that matches a=?) is dealt with ** by the caller. ** ** It does this by scanning through all stat4 samples, comparing values @@ -142654,7 +142654,7 @@ SQLITE_PRIVATE char sqlite3IndexColumnAffinity(sqlite3 *db, Index *pIdx, int iCo ** estimate of the number of rows delivered remains unchanged), *pbDone ** is left as is. ** -** If an error occurs, an SQLite error code is returned. Otherwise, +** If an error occurs, an SQLite error code is returned. Otherwise, ** SQLITE_OK. */ static int whereRangeSkipScanEst( @@ -142672,7 +142672,7 @@ static int whereRangeSkipScanEst( int rc = SQLITE_OK; u8 aff = sqlite3IndexColumnAffinity(db, p, nEq); CollSeq *pColl; - + sqlite3_value *p1 = 0; /* Value extracted from pLower */ sqlite3_value *p2 = 0; /* Value extracted from pUpper */ sqlite3_value *pVal = 0; /* Value extracted from record */ @@ -142704,7 +142704,7 @@ static int whereRangeSkipScanEst( nDiff = (nUpper - nLower); if( nDiff<=0 ) nDiff = 1; - /* If there is both an upper and lower bound specified, and the + /* If there is both an upper and lower bound specified, and the ** comparisons indicate that they are close together, use the fallback ** method (assume that the scan visits 1/64 of the rows) for estimating ** the number of rows visited. Otherwise, estimate the number of rows @@ -142751,7 +142751,7 @@ static int whereRangeSkipScanEst( ** ** ... FROM t1 WHERE a = ? AND b > ? AND b < ? ... ** -** then nEq is set to 1 (as the range restricted column, b, is the second +** then nEq is set to 1 (as the range restricted column, b, is the second ** left-most column of the index). Or, if the query is: ** ** ... FROM t1 WHERE a > ? AND a < ? ... @@ -142759,13 +142759,13 @@ static int whereRangeSkipScanEst( ** then nEq is set to 0. ** ** When this function is called, *pnOut is set to the sqlite3LogEst() of the -** number of rows that the index scan is expected to visit without -** considering the range constraints. If nEq is 0, then *pnOut is the number of +** number of rows that the index scan is expected to visit without +** considering the range constraints. If nEq is 0, then *pnOut is the number of ** rows in the index. Assuming no error occurs, *pnOut is adjusted (reduced) ** to account for the range constraints pLower and pUpper. -** +** ** In the absence of sqlite_stat4 ANALYZE data, or if such data cannot be -** used, a single range inequality reduces the search space by a factor of 4. +** used, a single range inequality reduces the search space by a factor of 4. ** and a pair of constraints (x>? AND xu.btree.nBtm; int nTop = pLoop->u.btree.nTop; - /* Variable iLower will be set to the estimate of the number of rows in + /* Variable iLower will be set to the estimate of the number of rows in ** the index that are less than the lower bound of the range query. The ** lower bound being the concatenation of $P and $L, where $P is the ** key-prefix formed by the nEq values matched against the nEq left-most @@ -142802,7 +142802,7 @@ static int whereRangeScanEst( ** Or, if pLower is NULL or $L cannot be extracted from it (because it ** is not a simple variable or literal value), the lower bound of the ** range is $P. Due to a quirk in the way whereKeyStats() works, even - ** if $L is available, whereKeyStats() is called for both ($P) and + ** if $L is available, whereKeyStats() is called for both ($P) and ** ($P:$L) and the larger of the two returned values is used. ** ** Similarly, iUpper is to be set to the estimate of the number of rows @@ -142826,7 +142826,7 @@ static int whereRangeScanEst( iLower = 0; iUpper = p->nRowEst0; }else{ - /* Note: this call could be optimized away - since the same values must + /* Note: this call could be optimized away - since the same values must ** have been requested when testing key $P in whereEqualScanEst(). */ whereKeyStats(pParse, p, pRec, 0, a); iLower = a[0]; @@ -142914,7 +142914,7 @@ static int whereRangeScanEst( ** reduced by an additional 75%. This means that, by default, an open-ended ** range query (e.g. col > ?) is assumed to match 1/4 of the rows in the ** index. While a closed range (e.g. col BETWEEN ? AND ?) is estimated to - ** match 1/64 of the index. */ + ** match 1/64 of the index. */ if( pLower && pLower->truthProb>0 && pUpper && pUpper->truthProb>0 ){ nNew -= 20; } @@ -142941,7 +142941,7 @@ static int whereRangeScanEst( ** for that index. When pExpr==NULL that means the constraint is ** "x IS NULL" instead of "x=VALUE". ** -** Write the estimated row count into *pnRow and return SQLITE_OK. +** Write the estimated row count into *pnRow and return SQLITE_OK. ** If unable to make an estimate, leave *pnRow unchanged and return ** non-zero. ** @@ -142992,7 +142992,7 @@ static int whereEqualScanEst( WHERETRACE(0x10,("equality scan regions %s(%d): %d\n", p->zName, nEq-1, (int)a[1])); *pnRow = a[1]; - + return rc; } #endif /* SQLITE_ENABLE_STAT4 */ @@ -143005,7 +143005,7 @@ static int whereEqualScanEst( ** ** WHERE x IN (1,2,3,4) ** -** Write the estimated row count into *pnRow and return SQLITE_OK. +** Write the estimated row count into *pnRow and return SQLITE_OK. ** If unable to make an estimate, leave *pnRow unchanged and return ** non-zero. ** @@ -143065,7 +143065,7 @@ static void whereTermPrint(WhereTerm *pTerm, int iTerm){ sqlite3_snprintf(sizeof(zLeft),zLeft,"left={%d:%d}", pTerm->leftCursor, pTerm->u.leftColumn); }else if( (pTerm->eOperator & WO_OR)!=0 && pTerm->u.pOrInfo!=0 ){ - sqlite3_snprintf(sizeof(zLeft),zLeft,"indexable=0x%lld", + sqlite3_snprintf(sizeof(zLeft),zLeft,"indexable=0x%lld", pTerm->u.pOrInfo->indexable); }else{ sqlite3_snprintf(sizeof(zLeft),zLeft,"left=%d", pTerm->leftCursor); @@ -143260,7 +143260,7 @@ static void whereInfoFree(sqlite3 *db, WhereInfo *pWInfo){ ** ** Conditions (2) and (3) mean that X is a "proper subset" of Y. ** If X is a proper subset of Y then Y is a better choice and ought -** to have a lower cost. This routine returns TRUE when that cost +** to have a lower cost. This routine returns TRUE when that cost ** relationship is inverted and needs to be adjusted. Constraint (4) ** was added because if X uses skip-scan less than Y it still might ** deserve a lower cost even if it is a proper subset of Y. Constraint (5) @@ -143287,7 +143287,7 @@ static int whereLoopCheaperProperSubset( } if( j<0 ) return 0; /* X not a subset of Y since term X[i] not used by Y */ } - if( (pX->wsFlags&WHERE_IDX_ONLY)!=0 + if( (pX->wsFlags&WHERE_IDX_ONLY)!=0 && (pY->wsFlags&WHERE_IDX_ONLY)==0 ){ return 0; /* Constraint (5) */ } @@ -143314,7 +143314,7 @@ static void whereLoopAdjustCost(const WhereLoop *p, WhereLoop *pTemplate){ if( p->iTab!=pTemplate->iTab ) continue; if( (p->wsFlags & WHERE_INDEXED)==0 ) continue; if( whereLoopCheaperProperSubset(p, pTemplate) ){ - /* Adjust pTemplate cost downward so that it is cheaper than its + /* Adjust pTemplate cost downward so that it is cheaper than its ** subset p. */ WHERETRACE(0x80,("subset cost adjustment %d,%d to %d,%d\n", pTemplate->rRun, pTemplate->nOut, p->rRun, p->nOut-1)); @@ -143360,7 +143360,7 @@ static WhereLoop **whereLoopFindLesser( /* In the current implementation, the rSetup value is either zero ** or the cost of building an automatic index (NlogN) and the NlogN ** is the same for compatible WhereLoops. */ - assert( p->rSetup==0 || pTemplate->rSetup==0 + assert( p->rSetup==0 || pTemplate->rSetup==0 || p->rSetup==pTemplate->rSetup ); /* whereLoopAddBtree() always generates and inserts the automatic index @@ -143425,7 +143425,7 @@ static WhereLoop **whereLoopFindLesser( ** ** When accumulating multiple loops (when pBuilder->pOrSet is NULL) we ** still might overwrite similar loops with the new template if the -** new template is better. Loops may be overwritten if the following +** new template is better. Loops may be overwritten if the following ** conditions are met: ** ** (1) They have the same iTab. @@ -143482,7 +143482,7 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ whereLoopPrint(pTemplate, pBuilder->pWC); } #endif - return SQLITE_OK; + return SQLITE_OK; }else{ p = *ppPrev; } @@ -143617,7 +143617,7 @@ static void whereLoopOutputAdjust( if( pLoop->nOut > nRow-iReduce ) pLoop->nOut = nRow - iReduce; } -/* +/* ** Term pTerm is a vector range comparison operation. The first comparison ** in the vector can be optimized using column nEq of the index. This ** function returns the total number of vector elements that can be used @@ -143646,7 +143646,7 @@ static int whereRangeVectorLen( nCmp = MIN(nCmp, (pIdx->nColumn - nEq)); for(i=1; iop!=TK_COLUMN - || pLhs->iTable!=iCur - || pLhs->iColumn!=pIdx->aiColumn[i+nEq] + if( pLhs->op!=TK_COLUMN + || pLhs->iTable!=iCur + || pLhs->iColumn!=pIdx->aiColumn[i+nEq] || pIdx->aSortOrder[i+nEq]!=pIdx->aSortOrder[nEq] ){ break; @@ -143694,15 +143694,15 @@ static int whereRangeVectorLen( #endif /* -** We have so far matched pBuilder->pNew->u.btree.nEq terms of the +** We have so far matched pBuilder->pNew->u.btree.nEq terms of the ** index pIndex. Try to match one more. ** -** When this function is called, pBuilder->pNew->nOut contains the -** number of rows expected to be visited by filtering using the nEq -** terms only. If it is modified, this value is restored before this +** When this function is called, pBuilder->pNew->nOut contains the +** number of rows expected to be visited by filtering using the nEq +** terms only. If it is modified, this value is restored before this ** function returns. ** -** If pProbe->idxType==SQLITE_IDXTYPE_IPK, that means pIndex is +** If pProbe->idxType==SQLITE_IDXTYPE_IPK, that means pIndex is ** a fake index used for the INTEGER PRIMARY KEY. */ static int whereLoopAddBtreeIndex( @@ -143804,9 +143804,9 @@ static int whereLoopAddBtreeIndex( pNew->prereq = (saved_prereq | pTerm->prereqRight) & ~pNew->maskSelf; assert( nInMul==0 - || (pNew->wsFlags & WHERE_COLUMN_NULL)!=0 - || (pNew->wsFlags & WHERE_COLUMN_IN)!=0 - || (pNew->wsFlags & WHERE_SKIPSCAN)!=0 + || (pNew->wsFlags & WHERE_COLUMN_NULL)!=0 + || (pNew->wsFlags & WHERE_COLUMN_IN)!=0 + || (pNew->wsFlags & WHERE_SKIPSCAN)!=0 ); if( eOp & WO_IN ){ @@ -143833,7 +143833,7 @@ static int whereLoopAddBtreeIndex( /* Let: ** N = the total number of rows in the table ** K = the number of entries on the RHS of the IN operator - ** M = the number of rows in the table that match terms to the + ** M = the number of rows in the table that match terms to the ** to the left in the same index. If the IN operator is on ** the left-most index column, M==N. ** @@ -143868,11 +143868,11 @@ static int whereLoopAddBtreeIndex( int iCol = pProbe->aiColumn[saved_nEq]; pNew->wsFlags |= WHERE_COLUMN_EQ; assert( saved_nEq==pNew->u.btree.nEq ); - if( iCol==XN_ROWID + if( iCol==XN_ROWID || (iCol>=0 && nInMul==0 && saved_nEq==pProbe->nKeyCol-1) ){ - if( iCol==XN_ROWID || pProbe->uniqNotNull - || (pProbe->nKeyCol==1 && pProbe->onError && eOp==WO_EQ) + if( iCol==XN_ROWID || pProbe->uniqNotNull + || (pProbe->nKeyCol==1 && pProbe->onError && eOp==WO_EQ) ){ pNew->wsFlags |= WHERE_ONEROW; }else{ @@ -143917,7 +143917,7 @@ static int whereLoopAddBtreeIndex( /* At this point pNew->nOut is set to the number of rows expected to ** be visited by the index scan before considering term pTerm, or the - ** values of nIn and nInMul. In other words, assuming that all + ** values of nIn and nInMul. In other words, assuming that all ** "x IN(...)" terms are replaced with "x = ?". This block updates ** the value of pNew->nOut to account for pTerm (but not nIn/nInMul). */ assert( pNew->nOut==saved_nOut ); @@ -143938,8 +143938,8 @@ static int whereLoopAddBtreeIndex( }else{ #ifdef SQLITE_ENABLE_STAT4 tRowcnt nOut = 0; - if( nInMul==0 - && pProbe->nSample + if( nInMul==0 + && pProbe->nSample && pNew->u.btree.nEq<=pProbe->nSampleCol && ((eOp & WO_IN)==0 || !ExprHasProperty(pTerm->pExpr, EP_xIsSelect)) && OptimizationEnabled(db, SQLITE_Stat4) @@ -143966,8 +143966,8 @@ static int whereLoopAddBtreeIndex( { pNew->nOut += (pProbe->aiRowLogEst[nEq] - pProbe->aiRowLogEst[nEq-1]); if( eOp & WO_ISNULL ){ - /* TUNING: If there is no likelihood() value, assume that a - ** "col IS NULL" expression matches twice as many rows + /* TUNING: If there is no likelihood() value, assume that a + ** "col IS NULL" expression matches twice as many rows ** as (col=?). */ pNew->nOut += 10; } @@ -144020,12 +144020,12 @@ static int whereLoopAddBtreeIndex( /* Consider using a skip-scan if there are no WHERE clause constraints ** available for the left-most terms of the index, and if the average - ** number of repeats in the left-most terms is at least 18. + ** number of repeats in the left-most terms is at least 18. ** ** The magic number 18 is selected on the basis that scanning 17 rows ** is almost always quicker than an index seek (even though if the index ** contains fewer than 2^17 rows we assume otherwise in other parts of - ** the code). And, even if it is not, it should not be too much slower. + ** the code). And, even if it is not, it should not be too much slower. ** On the other hand, the extra seeks could end up being significantly ** more expensive. */ assert( 42==sqlite3LogEst(18) ); @@ -144113,7 +144113,7 @@ static int whereUsablePartialIndex(int iTab, WhereClause *pWC, Expr *pWhere){ if( pTerm->wtFlags & TERM_NOPARTIDX ) continue; pExpr = pTerm->pExpr; if( (!ExprHasProperty(pExpr, EP_FromJoin) || pExpr->iRightJoinTable==iTab) - && sqlite3ExprImpliesExpr(pParse, pExpr, pWhere, iTab) + && sqlite3ExprImpliesExpr(pParse, pExpr, pWhere, iTab) ){ return 1; } @@ -144135,18 +144135,18 @@ static int whereUsablePartialIndex(int iTab, WhereClause *pWC, Expr *pWhere){ ** cost = nRow * K // scan of covering index ** cost = nRow * (K+3.0) // scan of non-covering index ** -** where K is a value between 1.1 and 3.0 set based on the relative +** where K is a value between 1.1 and 3.0 set based on the relative ** estimated average size of the index and table records. ** ** For an index scan, where nVisit is the number of index rows visited -** by the scan, and nSeek is the number of seek operations required on +** by the scan, and nSeek is the number of seek operations required on ** the index b-tree: ** ** cost = nSeek * (log(nRow) + K * nVisit) // covering index ** cost = nSeek * (log(nRow) + (K+3.0) * nVisit) // non-covering index ** -** Normally, nSeek is 1. nSeek values greater than 1 come about if the -** WHERE clause includes "x IN (....)" terms used in place of "x=?". Or when +** Normally, nSeek is 1. nSeek values greater than 1 come about if the +** WHERE clause includes "x IN (....)" terms used in place of "x=?". Or when ** implicit "x IN (SELECT x FROM tbl)" terms are added for skip-scans. ** ** The estimated values (nRow, nVisit, nSeek) often contain a large amount @@ -144176,7 +144176,7 @@ static int whereLoopAddBtree( LogEst rLogSize; /* Logarithm of the number of rows in the table */ WhereClause *pWC; /* The parsed WHERE clause */ Table *pTab; /* Table being queried */ - + pNew = pBuilder->pNew; pWInfo = pBuilder->pWInfo; pTabList = pWInfo->pTabList; @@ -144270,9 +144270,9 @@ static int whereLoopAddBtree( } #endif /* SQLITE_OMIT_AUTOMATIC_INDEX */ - /* Loop over all indices. If there was an INDEXED BY clause, then only + /* Loop over all indices. If there was an INDEXED BY clause, then only ** consider index pProbe. */ - for(; rc==SQLITE_OK && pProbe; + for(; rc==SQLITE_OK && pProbe; pProbe=(pSrc->pIBIndex ? 0 : pProbe->pNext), iSortIdx++ ){ if( pProbe->pPartIdxWhere!=0 @@ -144360,7 +144360,7 @@ static int whereLoopAddBtree( if( pTerm->eOperator & (WO_EQ|WO_IS) ) nLookup -= 19; } } - + pNew->rRun = sqlite3LogEstAdd(pNew->rRun, nLookup); } ApplyCostMultiplier(pNew->rRun, pTab->costMult); @@ -144435,13 +144435,13 @@ static int whereLoopAddVirtualOne( *pbIn = 0; pNew->prereq = mPrereq; - /* Set the usable flag on the subset of constraints identified by + /* Set the usable flag on the subset of constraints identified by ** arguments mUsable and mExclude. */ pIdxCons = *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint; for(i=0; ia[pIdxCons->iTermOffset]; pIdxCons->usable = 0; - if( (pTerm->prereqRight & mUsable)==pTerm->prereqRight + if( (pTerm->prereqRight & mUsable)==pTerm->prereqRight && (pTerm->eOperator & mExclude)==0 ){ pIdxCons->usable = 1; @@ -144589,8 +144589,8 @@ SQLITE_API const char *sqlite3_vtab_collation(sqlite3_index_info *pIdxInfo, int ** entries that occur before the virtual table in the FROM clause and are ** separated from it by at least one LEFT or CROSS JOIN. Similarly, the ** mUnusable mask contains all FROM clause entries that occur after the -** virtual table and are separated from it by at least one LEFT or -** CROSS JOIN. +** virtual table and are separated from it by at least one LEFT or +** CROSS JOIN. ** ** For example, if the query were: ** @@ -144598,9 +144598,9 @@ SQLITE_API const char *sqlite3_vtab_collation(sqlite3_index_info *pIdxInfo, int ** ** then mPrereq corresponds to (t1, t2) and mUnusable to (t5, t6). ** -** All the tables in mPrereq must be scanned before the current virtual -** table. So any terms for which all prerequisites are satisfied by -** mPrereq may be specified as "usable" in all calls to xBestIndex. +** All the tables in mPrereq must be scanned before the current virtual +** table. So any terms for which all prerequisites are satisfied by +** mPrereq may be specified as "usable" in all calls to xBestIndex. ** Conversely, all tables in mUnusable must be scanned after the current ** virtual table, so any terms for which the prerequisites overlap with ** mUnusable should always be configured as "not-usable" for xBestIndex. @@ -144629,7 +144629,7 @@ static int whereLoopAddVirtual( pNew = pBuilder->pNew; pSrc = &pWInfo->pTabList->a[pNew->iTab]; assert( IsVirtual(pSrc->pTab) ); - p = allocateIndexInfo(pParse, pWC, mUnusable, pSrc, pBuilder->pOrderBy, + p = allocateIndexInfo(pParse, pWC, mUnusable, pSrc, pBuilder->pOrderBy, &mNoOmit); if( p==0 ) return SQLITE_NOMEM_BKPT; pNew->rSetup = 0; @@ -144649,7 +144649,7 @@ static int whereLoopAddVirtual( /* If the call to xBestIndex() with all terms enabled produced a plan ** that does not require any source tables (IOW: a plan with mBest==0) - ** and does not use an IN(...) operator, then there is no point in making + ** and does not use an IN(...) operator, then there is no point in making ** any further calls to xBestIndex() since they will all return the same ** result (if the xBestIndex() implementation is sane). */ if( rc==SQLITE_OK && ((mBest = (pNew->prereq & ~mPrereq))!=0 || bIn) ){ @@ -144672,7 +144672,7 @@ static int whereLoopAddVirtual( } } - /* Call xBestIndex once for each distinct value of (prereqRight & ~mPrereq) + /* Call xBestIndex once for each distinct value of (prereqRight & ~mPrereq) ** in the set of terms that apply to the current virtual table. */ while( rc==SQLITE_OK ){ int i; @@ -144729,8 +144729,8 @@ static int whereLoopAddVirtual( ** btrees or virtual tables. */ static int whereLoopAddOr( - WhereLoopBuilder *pBuilder, - Bitmask mPrereq, + WhereLoopBuilder *pBuilder, + Bitmask mPrereq, Bitmask mUnusable ){ WhereInfo *pWInfo = pBuilder->pWInfo; @@ -144743,7 +144743,7 @@ static int whereLoopAddOr( WhereLoopBuilder sSubBuild; WhereOrSet sSum, sCur; struct SrcList_item *pItem; - + pWC = pBuilder->pWC; pWCEnd = pWC->a + pWC->nTerm; pNew = pBuilder->pNew; @@ -144753,14 +144753,14 @@ static int whereLoopAddOr( for(pTerm=pWC->a; pTermeOperator & WO_OR)!=0 - && (pTerm->u.pOrInfo->indexable & pNew->maskSelf)!=0 + && (pTerm->u.pOrInfo->indexable & pNew->maskSelf)!=0 ){ WhereClause * const pOrWC = &pTerm->u.pOrInfo->wc; WhereTerm * const pOrWCEnd = &pOrWC->a[pOrWC->nTerm]; WhereTerm *pOrTerm; int once = 1; int i, j; - + sSubBuild = *pBuilder; sSubBuild.pOrderBy = 0; sSubBuild.pOrSet = &sCur; @@ -144781,7 +144781,7 @@ static int whereLoopAddOr( } sCur.n = 0; #ifdef WHERETRACE_ENABLED - WHERETRACE(0x200, ("OR-term %d of %p has %d subterms:\n", + WHERETRACE(0x200, ("OR-term %d of %p has %d subterms:\n", (int)(pOrTerm-pOrWC->a), pTerm, sSubBuild.pWC->nTerm)); if( sqlite3WhereTrace & 0x400 ){ sqlite3WhereClausePrint(sSubBuild.pWC); @@ -144828,8 +144828,8 @@ static int whereLoopAddOr( /* TUNING: Currently sSum.a[i].rRun is set to the sum of the costs ** of all sub-scans required by the OR-scan. However, due to rounding ** errors, it may be that the cost of the OR-scan is equal to its - ** most expensive sub-scan. Add the smallest possible penalty - ** (equivalent to multiplying the cost by 1.07) to ensure that + ** most expensive sub-scan. Add the smallest possible penalty + ** (equivalent to multiplying the cost by 1.07) to ensure that ** this does not happen. Otherwise, for WHERE clauses such as the ** following where there is an index on "y": ** @@ -144849,7 +144849,7 @@ static int whereLoopAddOr( } /* -** Add all WhereLoop objects for all tables +** Add all WhereLoop objects for all tables */ static int whereLoopAddAll(WhereLoopBuilder *pBuilder){ WhereInfo *pWInfo = pBuilder->pWInfo; @@ -144916,17 +144916,17 @@ static int whereLoopAddAll(WhereLoopBuilder *pBuilder){ ** Examine a WherePath (with the addition of the extra WhereLoop of the 6th ** parameters) to see if it outputs rows in the requested ORDER BY ** (or GROUP BY) without requiring a separate sort operation. Return N: -** +** ** N>0: N terms of the ORDER BY clause are satisfied ** N==0: No terms of the ORDER BY clause are satisfied -** N<0: Unknown yet how many terms of ORDER BY might be satisfied. +** N<0: Unknown yet how many terms of ORDER BY might be satisfied. ** ** Note that processing for WHERE_GROUPBY and WHERE_DISTINCTBY is not as ** strict. With GROUP BY and DISTINCT the only requirement is that ** equivalent rows appear immediately adjacent to one another. GROUP BY ** and DISTINCT do not require rows to appear in any particular order as long ** as equivalent rows are grouped together. Thus for GROUP BY and DISTINCT -** the pOrderBy terms can be matched in any order. With ORDER BY, the +** the pOrderBy terms can be matched in any order. With ORDER BY, the ** pOrderBy terms must be matched in strict left-to-right order. */ static i8 wherePathSatisfiesOrderBy( @@ -144976,7 +144976,7 @@ static i8 wherePathSatisfiesOrderBy( ** row of the WhereLoop. Every one-row WhereLoop is automatically ** order-distinct. A WhereLoop that has no columns in the ORDER BY clause ** is not order-distinct. To be order-distinct is not quite the same as being - ** UNIQUE since a UNIQUE column or index can have multiple rows that + ** UNIQUE since a UNIQUE column or index can have multiple rows that ** are NULL and NULL values are equivalent for the purpose of order-distinct. ** To be order-distinct, the columns must be UNIQUE and NOT NULL. ** @@ -145027,7 +145027,7 @@ static i8 wherePathSatisfiesOrderBy( ~ready, eqOpMask, 0); if( pTerm==0 ) continue; if( pTerm->eOperator==WO_IN ){ - /* IN terms are only valid for sorting in the ORDER BY LIMIT + /* IN terms are only valid for sorting in the ORDER BY LIMIT ** optimization, and then only if they are actually used ** by the query plan */ assert( wctrlFlags & WHERE_ORDERBY_LIMIT ); @@ -145035,7 +145035,7 @@ static i8 wherePathSatisfiesOrderBy( if( j>=pLoop->nLTerm ) continue; } if( (pTerm->eOperator&(WO_EQ|WO_IS))!=0 && pOBExpr->iColumn>=0 ){ - if( sqlite3ExprCollSeqMatch(pWInfo->pParse, + if( sqlite3ExprCollSeqMatch(pWInfo->pParse, pOrderBy->a[i].pExpr, pTerm->pExpr)==0 ){ continue; } @@ -145069,7 +145069,7 @@ static i8 wherePathSatisfiesOrderBy( for(j=0; j=pLoop->u.btree.nEq + assert( j>=pLoop->u.btree.nEq || (pLoop->aLTerm[j]==0)==(jnSkip) ); if( ju.btree.nEq && j>=pLoop->nSkip ){ @@ -145081,7 +145081,7 @@ static i8 wherePathSatisfiesOrderBy( ** the loop need to be marked as not order-distinct because it can ** have repeated NULL rows. ** - ** If the current term is a column of an ((?,?) IN (SELECT...)) + ** If the current term is a column of an ((?,?) IN (SELECT...)) ** expression for which the SELECT returns more than one column, ** check that it is the only column used by this loop. Otherwise, ** if it is one of two or more, none of the columns can be @@ -145094,7 +145094,7 @@ static i8 wherePathSatisfiesOrderBy( testcase( isOrderDistinct ); isOrderDistinct = 0; } - continue; + continue; }else if( ALWAYS(eOp & WO_IN) ){ /* ALWAYS() justification: eOp is an equality operator due to the ** ju.btree.nEq constraint above. Any equality other @@ -145135,7 +145135,7 @@ static i8 wherePathSatisfiesOrderBy( } /* Find the ORDER BY term that corresponds to the j-th column - ** of the index and mark that ORDER BY term off + ** of the index and mark that ORDER BY term off */ isMatch = 0; for(i=0; bOnce && i0 ? -1 : nOrderBy; } @@ -145435,7 +145435,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ continue; } - /* At this point, pWLoop is a candidate to be the next loop. + /* At this point, pWLoop is a candidate to be the next loop. ** Compute its cost */ rUnsorted = sqlite3LogEstAdd(pWLoop->rSetup,pWLoop->rRun + pFrom->nRow); rUnsorted = sqlite3LogEstAdd(rUnsorted, pFrom->rUnsorted); @@ -145462,7 +145462,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ WHERETRACE(0x002, ("---- sort cost=%-3d (%d/%d) increases cost %3d to %-3d\n", - aSortCost[isOrdered], (nOrderBy-isOrdered), nOrderBy, + aSortCost[isOrdered], (nOrderBy-isOrdered), nOrderBy, rUnsorted, rCost)); }else{ rCost = rUnsorted; @@ -145527,11 +145527,11 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ ** same set of loops and has the same isOrdered setting as the ** candidate path. Check to see if the candidate should replace ** pTo or if the candidate should be skipped. - ** + ** ** The conditional is an expanded vector comparison equivalent to: ** (pTo->rCost,pTo->nRow,pTo->rUnsorted) <= (rCost,nOut,rUnsorted) */ - if( pTo->rCostrCostrCost==rCost && (pTo->nRownRow==nOut && pTo->rUnsorted<=rUnsorted) @@ -145582,8 +145582,8 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ mxCost = aTo[0].rCost; mxUnsorted = aTo[0].nRow; for(jj=1, pTo=&aTo[1]; jjrCost>mxCost - || (pTo->rCost==mxCost && pTo->rUnsorted>mxUnsorted) + if( pTo->rCost>mxCost + || (pTo->rCost==mxCost && pTo->rUnsorted>mxUnsorted) ){ mxCost = pTo->rCost; mxUnsorted = pTo->rUnsorted; @@ -145622,7 +145622,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ sqlite3DbFreeNN(db, pSpace); return SQLITE_ERROR; } - + /* Find the lowest cost path. pFrom will be left pointing to that path */ pFrom = aFrom; for(ii=1; iinOBSat = 0; if( nLoop>0 ){ u32 wsFlags = pFrom->aLoop[nLoop-1]->wsFlags; - if( (wsFlags & WHERE_ONEROW)==0 + if( (wsFlags & WHERE_ONEROW)==0 && (wsFlags&(WHERE_IPK|WHERE_COLUMN_IN))!=(WHERE_IPK|WHERE_COLUMN_IN) ){ Bitmask m = 0; @@ -145681,7 +145681,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ && pWInfo->nOBSat==pWInfo->pOrderBy->nExpr && nLoop>0 ){ Bitmask revMask = 0; - int nOrder = wherePathSatisfiesOrderBy(pWInfo, pWInfo->pOrderBy, + int nOrder = wherePathSatisfiesOrderBy(pWInfo, pWInfo->pOrderBy, pFrom, 0, nLoop-1, pFrom->aLoop[nLoop-1], &revMask ); assert( pWInfo->sorted==0 ); @@ -145708,7 +145708,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ ** times for the common case. ** ** Return non-zero on success, if this query can be handled by this -** no-frills query planner. Return zero if this query needs the +** no-frills query planner. Return zero if this query needs the ** general-purpose query planner. */ static int whereShortCut(WhereLoopBuilder *pBuilder){ @@ -145748,8 +145748,8 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){ int opMask; assert( pLoop->aLTermSpace==pLoop->aLTerm ); if( !IsUniqueIndex(pIdx) - || pIdx->pPartIdxWhere!=0 - || pIdx->nKeyCol>ArraySize(pLoop->aLTermSpace) + || pIdx->pPartIdxWhere!=0 + || pIdx->nKeyCol>ArraySize(pLoop->aLTermSpace) ) continue; opMask = pIdx->uniqNotNull ? (WO_EQ|WO_IS) : WO_EQ; for(j=0; jnKeyCol; j++){ @@ -145802,8 +145802,8 @@ static int exprNodeIsDeterministic(Walker *pWalker, Expr *pExpr){ } /* -** Return true if the expression contains no non-deterministic SQL -** functions. Do not consider non-deterministic SQL functions that are +** Return true if the expression contains no non-deterministic SQL +** functions. Do not consider non-deterministic SQL functions that are ** part of sub-select statements. */ static int exprIsDeterministic(Expr *p){ @@ -145896,7 +145896,7 @@ static int exprIsDeterministic(Expr *p){ ** if there is one. If there is no ORDER BY clause or if this routine ** is called from an UPDATE or DELETE statement, then pOrderBy is NULL. ** -** The iIdxCur parameter is the cursor number of an index. If +** The iIdxCur parameter is the cursor number of an index. If ** WHERE_OR_SUBCLAUSE is set, iIdxCur is the cursor number of an index ** to use for OR clause processing. The WHERE clause should use this ** specific cursor. If WHERE_ONEPASS_DESIRED is set, then iIdxCur is @@ -145929,8 +145929,8 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( u8 bFordelete = 0; /* OPFLAG_FORDELETE or zero, as appropriate */ assert( (wctrlFlags & WHERE_ONEPASS_MULTIROW)==0 || ( - (wctrlFlags & WHERE_ONEPASS_DESIRED)!=0 - && (wctrlFlags & WHERE_OR_SUBCLAUSE)==0 + (wctrlFlags & WHERE_ONEPASS_DESIRED)!=0 + && (wctrlFlags & WHERE_OR_SUBCLAUSE)==0 )); /* Only one of WHERE_OR_SUBCLAUSE or WHERE_USE_LIMIT */ @@ -145953,7 +145953,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( } /* The number of tables in the FROM clause is limited by the number of - ** bits in a Bitmask + ** bits in a Bitmask */ testcase( pTabList->nSrc==BMS ); if( pTabList->nSrc>BMS ){ @@ -145961,7 +145961,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( return 0; } - /* This function normally generates a nested loop for all tables in + /* This function normally generates a nested loop for all tables in ** pTabList. But if the WHERE_OR_SUBCLAUSE flag is set, then we should ** only generate code for the first table in pTabList and assume that ** any cursors associated with subsequent tables are uninitialized. @@ -145993,7 +145993,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( pWInfo->wctrlFlags = wctrlFlags; pWInfo->iLimit = iAuxArg; pWInfo->savedNQueryLoop = pParse->nQueryLoop; - memset(&pWInfo->nOBSat, 0, + memset(&pWInfo->nOBSat, 0, offsetof(WhereInfo,sWC) - offsetof(WhereInfo,nOBSat)); memset(&pWInfo->a[0], 0, sizeof(WhereLoop)+nTabList*sizeof(WhereLevel)); assert( pWInfo->eOnePass==ONEPASS_OFF ); /* ONEPASS defaults to OFF */ @@ -146013,7 +146013,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( initMaskSet(pMaskSet); sqlite3WhereClauseInit(&pWInfo->sWC, pWInfo); sqlite3WhereSplit(&pWInfo->sWC, pWhere, TK_AND); - + /* Special case: No FROM clause */ if( nTabList==0 ){ @@ -146053,14 +146053,14 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( } #endif } - + /* Analyze all of the subexpressions. */ sqlite3WhereExprAnalyze(pTabList, &pWInfo->sWC); if( db->mallocFailed ) goto whereBeginError; /* Special case: WHERE terms that do not refer to any tables in the join ** (constant expressions). Evaluate each such term, and jump over all the - ** generated code if the result is not true. + ** generated code if the result is not true. ** ** Do not do this if the expression contains non-deterministic functions ** that are not within a sub-select. This is not strictly required, but @@ -146116,7 +146116,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( if( nTabList!=1 || whereShortCut(&sWLB)==0 ){ rc = whereLoopAddAll(&sWLB); if( rc ) goto whereBeginError; - + #ifdef WHERETRACE_ENABLED if( sqlite3WhereTrace ){ /* Display all of the WhereLoop objects */ WhereLoop *p; @@ -146129,7 +146129,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( } } #endif - + wherePathSolver(pWInfo, 0); if( db->mallocFailed ) goto whereBeginError; if( pWInfo->pOrderBy ){ @@ -146176,7 +146176,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( ** 1) The query must not be an aggregate. ** 2) The table must be the RHS of a LEFT JOIN. ** 3) Either the query must be DISTINCT, or else the ON or USING clause - ** must contain a constraint that limits the scan of the table to + ** must contain a constraint that limits the scan of the table to ** at most a single row. ** 4) The table must not be referenced by any part of the query apart ** from its own USING or ON clause. @@ -146189,13 +146189,13 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( ** ** then table t2 can be omitted from the following: ** - ** SELECT v1, v3 FROM t1 + ** SELECT v1, v3 FROM t1 ** LEFT JOIN t2 USING (t1.ipk=t2.ipk) ** LEFT JOIN t3 USING (t1.ipk=t3.ipk) ** ** or from: ** - ** SELECT DISTINCT v1, v3 FROM t1 + ** SELECT DISTINCT v1, v3 FROM t1 ** LEFT JOIN t2 ** LEFT JOIN t3 USING (t1.ipk=t3.ipk) */ @@ -146473,7 +146473,7 @@ whereBeginError: #endif /* -** Generate the end of the WHERE loop. See comments on +** Generate the end of the WHERE loop. See comments on ** sqlite3WhereBegin() for additional information. */ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ @@ -146580,8 +146580,8 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ assert( pLevel->iTabCur==pTabList->a[pLevel->iFrom].iCursor ); sqlite3VdbeAddOp1(v, OP_NullRow, pLevel->iTabCur); } - if( (ws & WHERE_INDEXED) - || ((ws & WHERE_MULTI_OR) && pLevel->u.pCovidx) + if( (ws & WHERE_INDEXED) + || ((ws & WHERE_MULTI_OR) && pLevel->u.pCovidx) ){ sqlite3VdbeAddOp1(v, OP_NullRow, pLevel->iIdxCur); } @@ -146637,7 +146637,7 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ sqlite3VdbeAddOp1(v, OP_Close, pTabItem->iCursor); } if( (ws & WHERE_INDEXED)!=0 - && (ws & (WHERE_IPK|WHERE_AUTO_INDEX))==0 + && (ws & (WHERE_IPK|WHERE_AUTO_INDEX))==0 && pLevel->iIdxCur!=pWInfo->aiCurOnePass[1] ){ sqlite3VdbeAddOp1(v, OP_Close, pLevel->iIdxCur); @@ -146649,7 +146649,7 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ ** from the index instead of from the table where possible. In some cases ** this optimization prevents the table from ever being read, which can ** yield a significant performance boost. - ** + ** ** Calls to the code generator in between sqlite3WhereBegin and ** sqlite3WhereEnd will have created code that references the table ** directly. This loop scans all that code looking for opcodes @@ -146693,7 +146693,7 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ pOp->p1 = pLevel->iIdxCur; OpcodeRewriteTrace(db, k, pOp); } - assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 || x>=0 + assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 || x>=0 || pWInfo->eOnePass ); }else if( pOp->opcode==OP_Rowid ){ pOp->p1 = pLevel->iIdxCur; @@ -146761,12 +146761,12 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ ** (in this case max()) to process rows sorted in order of (c, d), which ** makes things easier for obvious reasons. More generally: ** -** * FROM, WHERE, GROUP BY and HAVING clauses are all moved to +** * FROM, WHERE, GROUP BY and HAVING clauses are all moved to ** the sub-query. ** ** * ORDER BY, LIMIT and OFFSET remain part of the parent query. ** -** * Terminals from each of the expression trees that make up the +** * Terminals from each of the expression trees that make up the ** select-list and ORDER BY expressions in the parent query are ** selected by the sub-query. For the purposes of the transformation, ** terminals are column references and aggregate functions. @@ -146775,14 +146775,14 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ ** the same window declaration (the OVER bit), then a single scan may ** be used to process more than one window function. For example: ** -** SELECT max(b) OVER (PARTITION BY c ORDER BY d), -** min(e) OVER (PARTITION BY c ORDER BY d) +** SELECT max(b) OVER (PARTITION BY c ORDER BY d), +** min(e) OVER (PARTITION BY c ORDER BY d) ** FROM t1; ** ** is transformed in the same way as the example above. However: ** -** SELECT max(b) OVER (PARTITION BY c ORDER BY d), -** min(e) OVER (PARTITION BY a ORDER BY b) +** SELECT max(b) OVER (PARTITION BY c ORDER BY d), +** min(e) OVER (PARTITION BY a ORDER BY b) ** FROM t1; ** ** Must be transformed to: @@ -146835,15 +146835,15 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ ** first_value(expr) ** last_value(expr) ** nth_value(expr, N) -** -** These are the same built-in window functions supported by Postgres. +** +** These are the same built-in window functions supported by Postgres. ** Although the behaviour of aggregate window functions (functions that ** can be used as either aggregates or window funtions) allows them to ** be implemented using an API, built-in window functions are much more -** esoteric. Additionally, some window functions (e.g. nth_value()) +** esoteric. Additionally, some window functions (e.g. nth_value()) ** may only be implemented by caching the entire partition in memory. ** As such, some built-in window functions use the same API as aggregate -** window functions and some are implemented directly using VDBE +** window functions and some are implemented directly using VDBE ** instructions. Additionally, for those functions that use the API, the ** window frame is sometimes modified before the SELECT statement is ** rewritten. For example, regardless of the specified window frame, the @@ -146855,7 +146855,7 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ ** ** As well as some of the built-in window functions, aggregate window ** functions min() and max() are implemented using VDBE instructions if -** the start of the window frame is declared as anything other than +** the start of the window frame is declared as anything other than ** UNBOUNDED PRECEDING. */ @@ -146866,7 +146866,7 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ ** ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW */ static void row_numberStepFunc( - sqlite3_context *pCtx, + sqlite3_context *pCtx, int nArg, sqlite3_value **apArg ){ @@ -146894,10 +146894,10 @@ struct CallCount { ** Implementation of built-in window function dense_rank(). Assumes that ** the window frame has been set to: ** -** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW +** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW */ static void dense_rankStepFunc( - sqlite3_context *pCtx, + sqlite3_context *pCtx, int nArg, sqlite3_value **apArg ){ @@ -146929,7 +146929,7 @@ struct NthValueCtx { sqlite3_value *pValue; }; static void nth_valueStepFunc( - sqlite3_context *pCtx, + sqlite3_context *pCtx, int nArg, sqlite3_value **apArg ){ @@ -146982,7 +146982,7 @@ static void nth_valueFinalizeFunc(sqlite3_context *pCtx){ #define nth_valueValueFunc noopValueFunc static void first_valueStepFunc( - sqlite3_context *pCtx, + sqlite3_context *pCtx, int nArg, sqlite3_value **apArg ){ @@ -147013,10 +147013,10 @@ static void first_valueFinalizeFunc(sqlite3_context *pCtx){ ** Implementation of built-in window function rank(). Assumes that ** the window frame has been set to: ** -** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW +** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW */ static void rankStepFunc( - sqlite3_context *pCtx, + sqlite3_context *pCtx, int nArg, sqlite3_value **apArg ){ @@ -147047,7 +147047,7 @@ static void rankValueFunc(sqlite3_context *pCtx){ ** GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING */ static void percent_rankStepFunc( - sqlite3_context *pCtx, + sqlite3_context *pCtx, int nArg, sqlite3_value **apArg ){ @@ -147060,7 +147060,7 @@ static void percent_rankStepFunc( } } static void percent_rankInvFunc( - sqlite3_context *pCtx, + sqlite3_context *pCtx, int nArg, sqlite3_value **apArg ){ @@ -147092,7 +147092,7 @@ static void percent_rankValueFunc(sqlite3_context *pCtx){ ** GROUPS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING */ static void cume_distStepFunc( - sqlite3_context *pCtx, + sqlite3_context *pCtx, int nArg, sqlite3_value **apArg ){ @@ -147105,7 +147105,7 @@ static void cume_distStepFunc( } } static void cume_distInvFunc( - sqlite3_context *pCtx, + sqlite3_context *pCtx, int nArg, sqlite3_value **apArg ){ @@ -147141,7 +147141,7 @@ struct NtileCtx { ** ROWS CURRENT ROW AND UNBOUNDED FOLLOWING */ static void ntileStepFunc( - sqlite3_context *pCtx, + sqlite3_context *pCtx, int nArg, sqlite3_value **apArg ){ @@ -147161,7 +147161,7 @@ static void ntileStepFunc( } } static void ntileInvFunc( - sqlite3_context *pCtx, + sqlite3_context *pCtx, int nArg, sqlite3_value **apArg ){ @@ -147207,7 +147207,7 @@ struct LastValueCtx { ** Implementation of last_value(). */ static void last_valueStepFunc( - sqlite3_context *pCtx, + sqlite3_context *pCtx, int nArg, sqlite3_value **apArg ){ @@ -147225,7 +147225,7 @@ static void last_valueStepFunc( } } static void last_valueInvFunc( - sqlite3_context *pCtx, + sqlite3_context *pCtx, int nArg, sqlite3_value **apArg ){ @@ -147378,7 +147378,7 @@ static Window *windowFind(Parse *pParse, Window *pList, const char *zName){ ** of this file), pWin is updated here. */ SQLITE_PRIVATE void sqlite3WindowUpdate( - Parse *pParse, + Parse *pParse, Window *pList, /* List of named windows for this SELECT */ Window *pWin, /* Window frame to update */ FuncDef *pFunc /* Window function definition */ @@ -147398,17 +147398,17 @@ SQLITE_PRIVATE void sqlite3WindowUpdate( sqlite3WindowChain(pParse, pWin, pList); } if( (pWin->eFrmType==TK_RANGE) - && (pWin->pStart || pWin->pEnd) + && (pWin->pStart || pWin->pEnd) && (pWin->pOrderBy==0 || pWin->pOrderBy->nExpr!=1) ){ - sqlite3ErrorMsg(pParse, + sqlite3ErrorMsg(pParse, "RANGE with offset PRECEDING/FOLLOWING requires one ORDER BY expression" ); }else if( pFunc->funcFlags & SQLITE_FUNC_WINDOW ){ sqlite3 *db = pParse->db; if( pWin->pFilter ){ - sqlite3ErrorMsg(pParse, + sqlite3ErrorMsg(pParse, "FILTER clause may only be used with aggregate window functions" ); }else{ @@ -147418,14 +147418,14 @@ SQLITE_PRIVATE void sqlite3WindowUpdate( int eStart; int eEnd; } aUp[] = { - { row_numberName, TK_ROWS, TK_UNBOUNDED, TK_CURRENT }, - { dense_rankName, TK_RANGE, TK_UNBOUNDED, TK_CURRENT }, - { rankName, TK_RANGE, TK_UNBOUNDED, TK_CURRENT }, - { percent_rankName, TK_GROUPS, TK_CURRENT, TK_UNBOUNDED }, - { cume_distName, TK_GROUPS, TK_FOLLOWING, TK_UNBOUNDED }, - { ntileName, TK_ROWS, TK_CURRENT, TK_UNBOUNDED }, - { leadName, TK_ROWS, TK_UNBOUNDED, TK_UNBOUNDED }, - { lagName, TK_ROWS, TK_UNBOUNDED, TK_CURRENT }, + { row_numberName, TK_ROWS, TK_UNBOUNDED, TK_CURRENT }, + { dense_rankName, TK_RANGE, TK_UNBOUNDED, TK_CURRENT }, + { rankName, TK_RANGE, TK_UNBOUNDED, TK_CURRENT }, + { percent_rankName, TK_GROUPS, TK_CURRENT, TK_UNBOUNDED }, + { cume_distName, TK_GROUPS, TK_FOLLOWING, TK_UNBOUNDED }, + { ntileName, TK_ROWS, TK_CURRENT, TK_UNBOUNDED }, + { leadName, TK_ROWS, TK_UNBOUNDED, TK_UNBOUNDED }, + { lagName, TK_ROWS, TK_UNBOUNDED, TK_CURRENT }, }; int i; for(i=0; iiEphCsr, where N is the number of elements in (*ppSub) after ** appending the new one. */ static void selectWindowRewriteEList( - Parse *pParse, + Parse *pParse, Window *pWin, SrcList *pSrc, ExprList *pEList, /* Rewrite expressions in this list */ @@ -147617,7 +147617,7 @@ static ExprList *exprListAppendList( /* ** If the SELECT statement passed as the second argument does not invoke -** any SQL window functions, this function is a no-op. Otherwise, it +** any SQL window functions, this function is a no-op. Otherwise, it ** rewrites the SELECT statement so that window function xStep functions ** are invoked in the correct order as described under "SELECT REWRITING" ** at the top of this file. @@ -147675,8 +147675,8 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){ selectWindowRewriteEList(pParse, pMWin, pSrc, p->pOrderBy, pTab, &pSublist); pMWin->nBufferCol = (pSublist ? pSublist->nExpr : 0); - /* Append the PARTITION BY and ORDER BY expressions to the to the - ** sub-select expression list. They are required to figure out where + /* Append the PARTITION BY and ORDER BY expressions to the to the + ** sub-select expression list. They are required to figure out where ** boundaries for partitions and sets of peer rows lie. */ pSublist = exprListAppendList(pParse, pSublist, pMWin->pPartition, 0); pSublist = exprListAppendList(pParse, pSublist, pMWin->pOrderBy, 0); @@ -147707,11 +147707,11 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){ /* If there is no ORDER BY or PARTITION BY clause, and the window ** function accepts zero arguments, and there are no other columns ** selected (e.g. "SELECT row_number() OVER () FROM t1"), it is possible - ** that pSublist is still NULL here. Add a constant expression here to - ** keep everything legal in this case. + ** that pSublist is still NULL here. Add a constant expression here to + ** keep everything legal in this case. */ if( pSublist==0 ){ - pSublist = sqlite3ExprListAppend(pParse, 0, + pSublist = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db, TK_INTEGER, "0") ); } @@ -147880,10 +147880,10 @@ windowAllocErr: ** equivalent nul-terminated string. */ SQLITE_PRIVATE Window *sqlite3WindowAssemble( - Parse *pParse, - Window *pWin, - ExprList *pPartition, - ExprList *pOrderBy, + Parse *pParse, + Window *pWin, + ExprList *pPartition, + ExprList *pOrderBy, Token *pBase ){ if( pWin ){ @@ -147921,7 +147921,7 @@ SQLITE_PRIVATE void sqlite3WindowChain(Parse *pParse, Window *pWin, Window *pLis zErr = "frame specification"; } if( zErr ){ - sqlite3ErrorMsg(pParse, + sqlite3ErrorMsg(pParse, "cannot override %s of window: %s", zErr, pWin->zBase ); }else{ @@ -147964,7 +147964,7 @@ SQLITE_PRIVATE void sqlite3WindowAttach(Parse *pParse, Expr *p, Window *pWin){ ** SELECT, or (b) the windows already linked use a compatible window frame. */ SQLITE_PRIVATE void sqlite3WindowLink(Select *pSel, Window *pWin){ - if( 0==pSel->pWin + if( 0==pSel->pWin || 0==sqlite3WindowCompare(0, pSel->pWin, pWin, 0) ){ pWin->pNextWin = pSel->pWin; @@ -148141,7 +148141,7 @@ struct WindowCsrAndReg { }; /* -** A single instance of this structure is allocated on the stack by +** A single instance of this structure is allocated on the stack by ** sqlite3WindowCodeStep() and a pointer to it passed to the various helper ** routines. This is to reduce the number of arguments required by each ** helper function. @@ -148188,7 +148188,7 @@ struct WindowCsrAndReg { ** ** Each cursor (start, current and end) consists of a VDBE cursor ** (WindowCsrAndReg.csr) and an array of registers (starting at -** WindowCodeArg.reg) that always contains a copy of the peer values +** WindowCodeArg.reg) that always contains a copy of the peer values ** read from the corresponding cursor. ** ** Depending on the window-frame in question, all three cursors may not @@ -148232,8 +148232,8 @@ static void windowReadPeerValues( } /* -** Generate VM code to invoke either xStep() (if bInverse is 0) or -** xInverse (if bInverse is non-zero) for each window function in the +** Generate VM code to invoke either xStep() (if bInverse is 0) or +** xInverse (if bInverse is non-zero) for each window function in the ** linked list starting at pMWin. Or, for built-in window functions ** that do not use the standard function API, generate the required ** inline VM code. @@ -148282,7 +148282,7 @@ static void windowAggStep( regArg = reg; if( pMWin->regStartRowid==0 - && (pFunc->funcFlags & SQLITE_FUNC_MINMAX) + && (pFunc->funcFlags & SQLITE_FUNC_MINMAX) && (pWin->eStart!=TK_UNBOUNDED) ){ int addrIsNull = sqlite3VdbeAddOp1(v, OP_IsNull, regArg); @@ -148317,7 +148317,7 @@ static void windowAggStep( VdbeCoverage(v); sqlite3ReleaseTempReg(pParse, regTmp); } - + if( pWin->bExprArgs ){ int iStart = sqlite3VdbeCurrentAddr(v); VdbeOp *pOp, *pEnd; @@ -148339,7 +148339,7 @@ static void windowAggStep( pColl = sqlite3ExprNNCollSeq(pParse, pWin->pOwner->x.pList->a[0].pExpr); sqlite3VdbeAddOp4(v, OP_CollSeq, 0,0,0, (const char*)pColl, P4_COLLSEQ); } - sqlite3VdbeAddOp3(v, bInverse? OP_AggInverse : OP_AggStep, + sqlite3VdbeAddOp3(v, bInverse? OP_AggInverse : OP_AggStep, bInverse, regArg, pWin->regAccum); sqlite3VdbeAppendP4(v, pFunc, P4_FUNCDEF); sqlite3VdbeChangeP5(v, (u8)nArg); @@ -148372,7 +148372,7 @@ static void windowAggFinal(WindowCodeArg *p, int bFin){ for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ if( pMWin->regStartRowid==0 - && (pWin->pFunc->funcFlags & SQLITE_FUNC_MINMAX) + && (pWin->pFunc->funcFlags & SQLITE_FUNC_MINMAX) && (pWin->eStart!=TK_UNBOUNDED) ){ sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult); @@ -148528,7 +148528,7 @@ static void windowReturnOneRow(WindowCodeArg *p){ int lbl = sqlite3VdbeMakeLabel(pParse); int tmpReg = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult); - + if( pFunc->zName==nth_valueName ){ sqlite3VdbeAddOp3(v, OP_Column,pMWin->iEphCsr,pWin->iArgCol+1,tmpReg); windowCheckValue(pParse, tmpReg, 2); @@ -148550,7 +148550,7 @@ static void windowReturnOneRow(WindowCodeArg *p){ int lbl = sqlite3VdbeMakeLabel(pParse); int tmpReg = sqlite3GetTempReg(pParse); int iEph = pMWin->iEphCsr; - + if( nArg<3 ){ sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult); }else{ @@ -148567,7 +148567,7 @@ static void windowReturnOneRow(WindowCodeArg *p){ sqlite3VdbeAddOp3(v, op, tmpReg2, tmpReg, tmpReg); sqlite3ReleaseTempReg(pParse, tmpReg2); } - + sqlite3VdbeAddOp3(v, OP_SeekRowid, csr, lbl, tmpReg); VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol, pWin->regResult); @@ -148612,7 +148612,7 @@ static int windowInitAccum(Parse *pParse, Window *pMWin){ return regArg; } -/* +/* ** Return true if the current frame should be cached in the ephemeral table, ** even if there are no xInverse() calls required. */ @@ -148636,9 +148636,9 @@ static int windowCacheFrame(Window *pMWin){ ** regOld and regNew are each the first register in an array of size ** pOrderBy->nExpr. This function generates code to compare the two ** arrays of registers using the collation sequences and other comparison -** parameters specified by pOrderBy. +** parameters specified by pOrderBy. ** -** If the two arrays are not equal, the contents of regNew is copied to +** If the two arrays are not equal, the contents of regNew is copied to ** regOld and control falls through. Otherwise, if the contents of the arrays ** are equal, an OP_Goto is executed. The address of the OP_Goto is returned. */ @@ -148655,7 +148655,7 @@ static void windowIfNewPeer( KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pOrderBy, 0, 0); sqlite3VdbeAddOp3(v, OP_Compare, regOld, regNew, nVal); sqlite3VdbeAppendP4(v, (void*)pKeyInfo, P4_KEYINFO); - sqlite3VdbeAddOp3(v, OP_Jump, + sqlite3VdbeAddOp3(v, OP_Jump, sqlite3VdbeCurrentAddr(v)+1, addr, sqlite3VdbeCurrentAddr(v)+1 ); VdbeCoverageEqNe(v); @@ -148689,7 +148689,7 @@ static void windowIfNewPeer( ** or subtraction is a a copy of csr1.peerVal. */ static void windowCodeRangeTest( - WindowCodeArg *p, + WindowCodeArg *p, int op, /* OP_Ge, OP_Gt, or OP_Le */ int csr1, /* Cursor number for cursor 1 */ int regVal, /* Register containing non-negative number */ @@ -148744,8 +148744,8 @@ static void windowCodeRangeTest( sqlite3VdbeAddOp3(v, arith, regVal, reg1, reg1); sqlite3VdbeJumpHere(v, addrGe); - /* If the BIGNULL flag is set for the ORDER BY, then it is required to - ** consider NULL values to be larger than all other values, instead of + /* If the BIGNULL flag is set for the ORDER BY, then it is required to + ** consider NULL values to be larger than all other values, instead of ** the usual smaller. The VDBE opcodes OP_Ge and so on do not handle this ** (and adding that capability causes a performance regression), so ** instead if the BIGNULL flag is set then cases where either reg1 or @@ -148760,23 +148760,23 @@ static void windowCodeRangeTest( ** if( op==OP_Le ) goto lbl; ** } ** - ** Additionally, if either reg1 or reg2 are NULL but the jump to lbl is + ** Additionally, if either reg1 or reg2 are NULL but the jump to lbl is ** not taken, control jumps over the comparison operator coded below this ** block. */ if( pOrderBy->a[0].sortFlags & KEYINFO_ORDER_BIGNULL ){ /* This block runs if reg1 contains a NULL. */ int addr = sqlite3VdbeAddOp1(v, OP_NotNull, reg1); VdbeCoverage(v); switch( op ){ - case OP_Ge: - sqlite3VdbeAddOp2(v, OP_Goto, 0, lbl); + case OP_Ge: + sqlite3VdbeAddOp2(v, OP_Goto, 0, lbl); break; - case OP_Gt: - sqlite3VdbeAddOp2(v, OP_NotNull, reg2, lbl); - VdbeCoverage(v); + case OP_Gt: + sqlite3VdbeAddOp2(v, OP_NotNull, reg2, lbl); + VdbeCoverage(v); break; - case OP_Le: - sqlite3VdbeAddOp2(v, OP_IsNull, reg2, lbl); - VdbeCoverage(v); + case OP_Le: + sqlite3VdbeAddOp2(v, OP_IsNull, reg2, lbl); + VdbeCoverage(v); break; default: assert( op==OP_Lt ); /* no-op */ break; } @@ -148809,7 +148809,7 @@ static void windowCodeRangeTest( /* ** Helper function for sqlite3WindowCodeStep(). Each call to this function -** generates VM code for a single RETURN_ROW, AGGSTEP or AGGINVERSE +** generates VM code for a single RETURN_ROW, AGGSTEP or AGGINVERSE ** operation. Refer to the header comment for sqlite3WindowCodeStep() for ** details. */ @@ -148868,8 +148868,8 @@ static int windowCodeOp( addrContinue = sqlite3VdbeCurrentAddr(v); /* If this is a (RANGE BETWEEN a FOLLOWING AND b FOLLOWING) or - ** (RANGE BETWEEN b PRECEDING AND a PRECEDING) frame, ensure the - ** start cursor does not advance past the end cursor within the + ** (RANGE BETWEEN b PRECEDING AND a PRECEDING) frame, ensure the + ** start cursor does not advance past the end cursor within the ** temporary table. It otherwise might, if (a>b). */ if( pMWin->eStart==pMWin->eEnd && regCountdown && pMWin->eFrmType==TK_RANGE && op==WINDOW_AGGINVERSE @@ -148998,11 +148998,11 @@ SQLITE_PRIVATE Window *sqlite3WindowListDup(sqlite3 *db, Window *p){ } /* -** Return true if it can be determined at compile time that expression -** pExpr evaluates to a value that, when cast to an integer, is greater +** Return true if it can be determined at compile time that expression +** pExpr evaluates to a value that, when cast to an integer, is greater ** than zero. False otherwise. ** -** If an OOM error occurs, this function sets the Parse.db.mallocFailed +** If an OOM error occurs, this function sets the Parse.db.mallocFailed ** flag and returns zero. */ static int windowExprGtZero(Parse *pParse, Expr *pExpr){ @@ -149018,11 +149018,11 @@ static int windowExprGtZero(Parse *pParse, Expr *pExpr){ } /* -** sqlite3WhereBegin() has already been called for the SELECT statement +** sqlite3WhereBegin() has already been called for the SELECT statement ** passed as the second argument when this function is invoked. It generates -** code to populate the Window.regResult register for each window function +** code to populate the Window.regResult register for each window function ** and invoke the sub-routine at instruction addrGosub once for each row. -** sqlite3WhereEnd() is always called before returning. +** sqlite3WhereEnd() is always called before returning. ** ** This function handles several different types of window frames, which ** require slightly different processing. The following pseudo code is @@ -149037,17 +149037,17 @@ static int windowExprGtZero(Parse *pParse, Expr *pExpr){ ** Gosub flush ** } ** Insert new row into eph table. -** +** ** if( first row of partition ){ ** // Rewind three cursors, all open on the eph table. ** Rewind(csrEnd); ** Rewind(csrStart); ** Rewind(csrCurrent); -** +** ** regEnd = // FOLLOWING expression ** regStart = // PRECEDING expression ** }else{ -** // First time this branch is taken, the eph table contains two +** // First time this branch is taken, the eph table contains two ** // rows. The first row in the partition, which all three cursors ** // currently point to, and the following row. ** AGGSTEP @@ -149076,17 +149076,17 @@ static int windowExprGtZero(Parse *pParse, Expr *pExpr){ ** with arguments read from the current row of cursor csrEnd, then ** step cursor csrEnd forward one row (i.e. sqlite3BtreeNext()). ** -** RETURN_ROW: return a row to the caller based on the contents of the -** current row of csrCurrent and the current state of all +** RETURN_ROW: return a row to the caller based on the contents of the +** current row of csrCurrent and the current state of all ** aggregates. Then step cursor csrCurrent forward one row. ** -** AGGINVERSE: invoke the aggregate xInverse() function for each window +** AGGINVERSE: invoke the aggregate xInverse() function for each window ** functions with arguments read from the current row of cursor ** csrStart. Then step csrStart forward one row. ** ** There are two other ROWS window frames that are handled significantly ** differently from the above - "BETWEEN PRECEDING AND PRECEDING" -** and "BETWEEN FOLLOWING AND FOLLOWING". These are special +** and "BETWEEN FOLLOWING AND FOLLOWING". These are special ** cases because they change the order in which the three cursors (csrStart, ** csrCurrent and csrEnd) iterate through the ephemeral table. Cases that ** use UNBOUNDED or CURRENT ROW are much simpler variations on one of these @@ -149236,15 +149236,15 @@ static int windowExprGtZero(Parse *pParse, Expr *pExpr){ ** regEnd = ** regStart = ** }else if( new group ){ -** ... +** ... ** } ** } ** -** 2. Instead of processing a single row, each RETURN_ROW, AGGSTEP or +** 2. Instead of processing a single row, each RETURN_ROW, AGGSTEP or ** AGGINVERSE step processes the current row of the relevant cursor and ** all subsequent rows belonging to the same group. ** -** RANGE window frames are a little different again. As for GROUPS, the +** RANGE window frames are a little different again. As for GROUPS, the ** main loop runs once per group only. And RETURN_ROW, AGGSTEP and AGGINVERSE ** deal in groups instead of rows. As for ROWS and GROUPS, there are three ** basic cases: @@ -149281,7 +149281,7 @@ static int windowExprGtZero(Parse *pParse, Expr *pExpr){ ** } ** } ** -** In the above notation, "csr.key" means the current value of the ORDER BY +** In the above notation, "csr.key" means the current value of the ORDER BY ** expression (there is only ever 1 for a RANGE that uses an FOLLOWING ** or PRECEDING */ int regEnd = 0; /* Value of FOLLOWING */ - assert( pMWin->eStart==TK_PRECEDING || pMWin->eStart==TK_CURRENT - || pMWin->eStart==TK_FOLLOWING || pMWin->eStart==TK_UNBOUNDED + assert( pMWin->eStart==TK_PRECEDING || pMWin->eStart==TK_CURRENT + || pMWin->eStart==TK_FOLLOWING || pMWin->eStart==TK_UNBOUNDED ); - assert( pMWin->eEnd==TK_FOLLOWING || pMWin->eEnd==TK_CURRENT - || pMWin->eEnd==TK_UNBOUNDED || pMWin->eEnd==TK_PRECEDING + assert( pMWin->eEnd==TK_FOLLOWING || pMWin->eEnd==TK_CURRENT + || pMWin->eEnd==TK_UNBOUNDED || pMWin->eEnd==TK_PRECEDING ); assert( pMWin->eExclude==0 || pMWin->eExclude==TK_CURRENT || pMWin->eExclude==TK_GROUP || pMWin->eExclude==TK_TIES @@ -149407,9 +149407,9 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep( s.end.csr = s.current.csr+3; /* Figure out when rows may be deleted from the ephemeral table. There - ** are four options - they may never be deleted (eDelete==0), they may + ** are four options - they may never be deleted (eDelete==0), they may ** be deleted as soon as they are no longer part of the window frame - ** (eDelete==WINDOW_AGGINVERSE), they may be deleted as after the row + ** (eDelete==WINDOW_AGGINVERSE), they may be deleted as after the row ** has been returned to the caller (WINDOW_RETURN_ROW), or they may ** be deleted after they enter the frame (WINDOW_AGGSTEP). */ switch( pMWin->eStart ){ @@ -149457,7 +149457,7 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep( } /* If this is not a "ROWS BETWEEN ..." frame, then allocate arrays of - ** registers to store copies of the ORDER BY expressions (peer values) + ** registers to store copies of the ORDER BY expressions (peer values) ** for the main loop, and for each cursor (start, current and end). */ if( pMWin->eFrmType!=TK_ROWS ){ int nPeer = (pOrderBy ? pOrderBy->nExpr : 0); @@ -149478,7 +149478,7 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep( sqlite3VdbeAddOp3(v, OP_MakeRecord, regNew, nInput, regRecord); /* An input row has just been read into an array of registers starting - ** at regNew. If the window has a PARTITION clause, this block generates + ** at regNew. If the window has a PARTITION clause, this block generates ** VM code to check if the input row is the start of a new partition. ** If so, it does an OP_Gosub to an address to be filled in later. The ** address of the OP_Gosub is stored in local variable addrGosubFlush. */ @@ -149785,7 +149785,7 @@ static void disableLookaside(Parse *pParse){ pLoop->pNext = pNext; pLoop->selFlags |= SF_Compound; } - if( (p->selFlags & SF_MultiValue)==0 && + if( (p->selFlags & SF_MultiValue)==0 && (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0 && cnt>mxSelect ){ @@ -149822,7 +149822,7 @@ static void disableLookaside(Parse *pParse){ } #if SQLITE_MAX_EXPR_DEPTH>0 p->nHeight = 1; -#endif +#endif if( IN_RENAME_OBJECT ){ return (Expr*)sqlite3RenameTokenMap(pParse, (void*)p, &t); } @@ -149898,7 +149898,7 @@ static void disableLookaside(Parse *pParse){ ** the minor type might be the name of the identifier. ** Each non-terminal can have a different minor type. ** Terminal symbols all have the same minor type, though. -** This macros defines the minor type for terminal +** This macros defines the minor type for terminal ** symbols. ** YYMINORTYPE is the data type used for all minor types. ** This is typically a union of many types, one of @@ -149998,7 +149998,7 @@ typedef union { /* Next are the tables used to determine what action to take based on the ** current state and lookahead token. These tables are used to implement ** functions that take a state number and lookahead value and return an -** action integer. +** action integer. ** ** Suppose the action integer is N. Then the action is determined as ** follows @@ -150615,9 +150615,9 @@ static const YYACTIONTYPE yy_default[] = { }; /********** End of lemon-generated parsing tables *****************************/ -/* The next table maps tokens (terminal symbols) into fallback tokens. +/* The next table maps tokens (terminal symbols) into fallback tokens. ** If a construct like the following: -** +** ** %fallback ID X Y Z. ** ** appears in the grammar, then ID becomes a fallback token for X, Y, @@ -150868,10 +150868,10 @@ static char *yyTracePrompt = 0; #endif /* NDEBUG */ #ifndef NDEBUG -/* +/* ** Turn parser tracing on by giving a stream to which to write the trace ** and a prompt to preface each trace message. Tracing is turned off -** by making either argument NULL +** by making either argument NULL ** ** Inputs: **
            @@ -150896,7 +150896,7 @@ SQLITE_PRIVATE void sqlite3ParserTrace(FILE *TraceFILE, char *zTracePrompt){ #if defined(YYCOVERAGE) || !defined(NDEBUG) /* For tracing shifts, the names of all terminals and nonterminals ** are required. The following table supplies these names */ -static const char *const yyTokenName[] = { +static const char *const yyTokenName[] = { /* 0 */ "$", /* 1 */ "SEMI", /* 2 */ "EXPLAIN", @@ -151625,7 +151625,7 @@ static int yyGrowStack(yyParser *p){ #endif p->yystksz = newSize; } - return pNew==0; + return pNew==0; } #endif @@ -151667,7 +151667,7 @@ SQLITE_PRIVATE void sqlite3ParserInit(void *yypRawParser sqlite3ParserCTX_PDECL) } #ifndef sqlite3Parser_ENGINEALWAYSONSTACK -/* +/* ** This function allocates a new parser. ** The only argument is a pointer to a function which works like ** malloc. @@ -151694,7 +151694,7 @@ SQLITE_PRIVATE void *sqlite3ParserAlloc(void *(*mallocProc)(YYMALLOCARGTYPE) sql /* The following function deletes the "minor type" or semantic value ** associated with a symbol. The symbol can be either a terminal ** or nonterminal. "yymajor" is the symbol code, and "yypminor" is -** a pointer to the value to be deleted. The code used to do the +** a pointer to the value to be deleted. The code used to do the ** deletions is derived from the %destructor and/or %token_destructor ** directives of the input grammar. */ @@ -151709,7 +151709,7 @@ static void yy_destructor( /* Here is inserted the actions which take place when a ** terminal or non-terminal is destroyed. This can happen ** when the symbol is popped from the stack during a - ** reduce or during error processing or when a parser is + ** reduce or during error processing or when a parser is ** being destroyed before it is finished parsing. ** ** Note: during a reduce, the only symbols destroyed are those @@ -151849,7 +151849,7 @@ SQLITE_PRIVATE void sqlite3ParserFinalize(void *p){ } #ifndef sqlite3Parser_ENGINEALWAYSONSTACK -/* +/* ** Deallocate and destroy a parser. Destructors are called for ** all stack elements before shutting the parser down. ** @@ -152071,7 +152071,7 @@ static void yy_shift( assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack) ); } #endif -#if YYSTACKDEPTH>0 +#if YYSTACKDEPTH>0 if( yypParser->yytos>yypParser->yystackEnd ){ yypParser->yytos--; yyStackOverflow(yypParser); @@ -152919,7 +152919,7 @@ static YYACTIONTYPE yy_reduce( assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack)); } #endif -#if YYSTACKDEPTH>0 +#if YYSTACKDEPTH>0 if( yypParser->yytos>=yypParser->yystackEnd ){ yyStackOverflow(yypParser); /* The call to yyStackOverflow() above pops the stack until it is @@ -153463,7 +153463,7 @@ static YYACTIONTYPE yy_reduce( } break; case 116: /* xfullname ::= nm AS nm */ -{ +{ yymsp[-2].minor.yy609 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,0); /*A-overwrites-X*/ if( yymsp[-2].minor.yy609 ) yymsp[-2].minor.yy609->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); } @@ -153559,7 +153559,7 @@ static YYACTIONTYPE yy_reduce( case 149: /* cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt */ { sqlite3SrcListIndexedBy(pParse, yymsp[-4].minor.yy609, &yymsp[-3].minor.yy0); - sqlite3ExprListCheckLength(pParse,yymsp[-1].minor.yy138,"set list"); + sqlite3ExprListCheckLength(pParse,yymsp[-1].minor.yy138,"set list"); sqlite3Update(pParse,yymsp[-4].minor.yy609,yymsp[-1].minor.yy138,yymsp[0].minor.yy46,yymsp[-5].minor.yy32,0,0,0); } break; @@ -153817,7 +153817,7 @@ static YYACTIONTYPE yy_reduce( yymsp[-4].minor.yy46->x.pList = pList; }else{ sqlite3ExprListDelete(pParse->db, pList); - } + } if( yymsp[-3].minor.yy32 ) yymsp[-4].minor.yy46 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy46, 0); } break; @@ -153915,7 +153915,7 @@ static YYACTIONTYPE yy_reduce( break; case 223: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ { - sqlite3CreateIndex(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, + sqlite3CreateIndex(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy138, yymsp[-10].minor.yy32, &yymsp[-11].minor.yy0, yymsp[0].minor.yy46, SQLITE_SO_ASC, yymsp[-8].minor.yy32, SQLITE_IDXTYPE_APPDEF); if( IN_RENAME_OBJECT && pParse->pNewIndex ){ @@ -154010,7 +154010,7 @@ static YYACTIONTYPE yy_reduce( } break; case 255: /* trigger_cmd_list ::= trigger_cmd SEMI */ -{ +{ assert( yymsp[-1].minor.yy527!=0 ); yymsp[-1].minor.yy527->pLast = yymsp[-1].minor.yy527; } @@ -154018,7 +154018,7 @@ static YYACTIONTYPE yy_reduce( case 256: /* trnm ::= nm DOT nm */ { yymsp[-2].minor.yy0 = yymsp[0].minor.yy0; - sqlite3ErrorMsg(pParse, + sqlite3ErrorMsg(pParse, "qualified table names are not allowed on INSERT, UPDATE, and DELETE " "statements within triggers"); } @@ -154057,7 +154057,7 @@ static YYACTIONTYPE yy_reduce( break; case 263: /* expr ::= RAISE LP IGNORE RP */ { - yymsp[-3].minor.yy46 = sqlite3PExpr(pParse, TK_RAISE, 0, 0); + yymsp[-3].minor.yy46 = sqlite3PExpr(pParse, TK_RAISE, 0, 0); if( yymsp[-3].minor.yy46 ){ yymsp[-3].minor.yy46->affExpr = OE_Ignore; } @@ -154065,7 +154065,7 @@ static YYACTIONTYPE yy_reduce( break; case 264: /* expr ::= RAISE LP raisetype COMMA nm RP */ { - yymsp[-5].minor.yy46 = sqlite3ExprAlloc(pParse->db, TK_RAISE, &yymsp[-1].minor.yy0, 1); + yymsp[-5].minor.yy46 = sqlite3ExprAlloc(pParse->db, TK_RAISE, &yymsp[-1].minor.yy0, 1); if( yymsp[-5].minor.yy46 ) { yymsp[-5].minor.yy46->affExpr = (char)yymsp[-3].minor.yy32; } @@ -154217,18 +154217,18 @@ static YYACTIONTYPE yy_reduce( yymsp[-1].minor.yy455 = yylhsminor.yy455; break; case 301: /* frame_opt ::= */ -{ +{ yymsp[1].minor.yy455 = sqlite3WindowAlloc(pParse, 0, TK_UNBOUNDED, 0, TK_CURRENT, 0, 0); } break; case 302: /* frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ -{ +{ yylhsminor.yy455 = sqlite3WindowAlloc(pParse, yymsp[-2].minor.yy32, yymsp[-1].minor.yy57.eType, yymsp[-1].minor.yy57.pExpr, TK_CURRENT, 0, yymsp[0].minor.yy118); } yymsp[-2].minor.yy455 = yylhsminor.yy455; break; case 303: /* frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ -{ +{ yylhsminor.yy455 = sqlite3WindowAlloc(pParse, yymsp[-5].minor.yy32, yymsp[-3].minor.yy57.eType, yymsp[-3].minor.yy57.pExpr, yymsp[-1].minor.yy57.eType, yymsp[-1].minor.yy57.pExpr, yymsp[0].minor.yy118); } yymsp[-5].minor.yy455 = yylhsminor.yy455; @@ -154540,7 +154540,7 @@ SQLITE_PRIVATE void sqlite3Parser( #ifdef YYERRORSYMBOL /* A syntax error has occurred. ** The response to an error depends upon whether or not the - ** grammar defines an error token "ERROR". + ** grammar defines an error token "ERROR". ** ** This is what we do if the grammar does define ERROR: ** @@ -154764,7 +154764,7 @@ static const unsigned char aiClass[] = { ** lower-case ASCII equivalent. On ASCII machines, this is just ** an upper-to-lower case map. On EBCDIC machines we also need ** to adjust the encoding. The mapping is only valid for alphabetics -** which are the only characters for which this feature is used. +** which are the only characters for which this feature is used. ** ** Used by keywordhash.h */ @@ -154796,7 +154796,7 @@ const unsigned char ebcdicToAscii[] = { /* ** The sqlite3KeywordCode function looks up an identifier to determine if -** it is a keyword. If it is a keyword, the token code of that keyword is +** it is a keyword. If it is a keyword, the token code of that keyword is ** returned. If the input is not a keyword, TK_ID is returned. ** ** The implementation of this routine was generated by a program, @@ -154931,35 +154931,35 @@ static const unsigned short int aKWOffset[143] = { }; /* aKWCode[i] is the parser symbol code for the i-th keyword */ static const unsigned char aKWCode[143] = { - TK_REINDEX, TK_INDEXED, TK_INDEX, TK_DESC, TK_ESCAPE, - TK_EACH, TK_CHECK, TK_KEY, TK_BEFORE, TK_FOREIGN, - TK_FOR, TK_IGNORE, TK_LIKE_KW, TK_EXPLAIN, TK_INSTEAD, - TK_ADD, TK_DATABASE, TK_AS, TK_SELECT, TK_TABLE, - TK_JOIN_KW, TK_THEN, TK_END, TK_DEFERRABLE, TK_ELSE, - TK_EXCLUDE, TK_DELETE, TK_TEMP, TK_TEMP, TK_OR, - TK_ISNULL, TK_NULLS, TK_SAVEPOINT, TK_INTERSECT, TK_TIES, - TK_NOTNULL, TK_NOT, TK_NO, TK_NULL, TK_LIKE_KW, - TK_EXCEPT, TK_TRANSACTION,TK_ACTION, TK_ON, TK_JOIN_KW, - TK_ALTER, TK_RAISE, TK_EXCLUSIVE, TK_EXISTS, TK_CONSTRAINT, - TK_INTO, TK_OFFSET, TK_OF, TK_SET, TK_TRIGGER, - TK_REFERENCES, TK_UNIQUE, TK_QUERY, TK_WITHOUT, TK_WITH, - TK_JOIN_KW, TK_RELEASE, TK_ATTACH, TK_HAVING, TK_LIKE_KW, - TK_BEGIN, TK_JOIN_KW, TK_RANGE, TK_BETWEEN, TK_NOTHING, - TK_GROUPS, TK_GROUP, TK_CASCADE, TK_ASC, TK_DETACH, - TK_CASE, TK_COLLATE, TK_CREATE, TK_CTIME_KW, TK_IMMEDIATE, - TK_JOIN, TK_INSERT, TK_MATCH, TK_PLAN, TK_ANALYZE, - TK_PRAGMA, TK_ABORT, TK_UPDATE, TK_VALUES, TK_VIRTUAL, - TK_LAST, TK_WHEN, TK_WHERE, TK_RECURSIVE, TK_AFTER, - TK_RENAME, TK_AND, TK_DEFAULT, TK_AUTOINCR, TK_TO, - TK_IN, TK_CAST, TK_COLUMNKW, TK_COMMIT, TK_CONFLICT, - TK_JOIN_KW, TK_CTIME_KW, TK_CTIME_KW, TK_CURRENT, TK_PARTITION, - TK_DEFERRED, TK_DISTINCT, TK_IS, TK_DROP, TK_PRECEDING, - TK_FAIL, TK_LIMIT, TK_FILTER, TK_REPLACE, TK_FIRST, - TK_FOLLOWING, TK_FROM, TK_JOIN_KW, TK_IF, TK_ORDER, - TK_RESTRICT, TK_OTHERS, TK_OVER, TK_JOIN_KW, TK_ROLLBACK, - TK_ROWS, TK_ROW, TK_UNBOUNDED, TK_UNION, TK_USING, - TK_VACUUM, TK_VIEW, TK_WINDOW, TK_DO, TK_BY, - TK_INITIALLY, TK_ALL, TK_PRIMARY, + TK_REINDEX, TK_INDEXED, TK_INDEX, TK_DESC, TK_ESCAPE, + TK_EACH, TK_CHECK, TK_KEY, TK_BEFORE, TK_FOREIGN, + TK_FOR, TK_IGNORE, TK_LIKE_KW, TK_EXPLAIN, TK_INSTEAD, + TK_ADD, TK_DATABASE, TK_AS, TK_SELECT, TK_TABLE, + TK_JOIN_KW, TK_THEN, TK_END, TK_DEFERRABLE, TK_ELSE, + TK_EXCLUDE, TK_DELETE, TK_TEMP, TK_TEMP, TK_OR, + TK_ISNULL, TK_NULLS, TK_SAVEPOINT, TK_INTERSECT, TK_TIES, + TK_NOTNULL, TK_NOT, TK_NO, TK_NULL, TK_LIKE_KW, + TK_EXCEPT, TK_TRANSACTION,TK_ACTION, TK_ON, TK_JOIN_KW, + TK_ALTER, TK_RAISE, TK_EXCLUSIVE, TK_EXISTS, TK_CONSTRAINT, + TK_INTO, TK_OFFSET, TK_OF, TK_SET, TK_TRIGGER, + TK_REFERENCES, TK_UNIQUE, TK_QUERY, TK_WITHOUT, TK_WITH, + TK_JOIN_KW, TK_RELEASE, TK_ATTACH, TK_HAVING, TK_LIKE_KW, + TK_BEGIN, TK_JOIN_KW, TK_RANGE, TK_BETWEEN, TK_NOTHING, + TK_GROUPS, TK_GROUP, TK_CASCADE, TK_ASC, TK_DETACH, + TK_CASE, TK_COLLATE, TK_CREATE, TK_CTIME_KW, TK_IMMEDIATE, + TK_JOIN, TK_INSERT, TK_MATCH, TK_PLAN, TK_ANALYZE, + TK_PRAGMA, TK_ABORT, TK_UPDATE, TK_VALUES, TK_VIRTUAL, + TK_LAST, TK_WHEN, TK_WHERE, TK_RECURSIVE, TK_AFTER, + TK_RENAME, TK_AND, TK_DEFAULT, TK_AUTOINCR, TK_TO, + TK_IN, TK_CAST, TK_COLUMNKW, TK_COMMIT, TK_CONFLICT, + TK_JOIN_KW, TK_CTIME_KW, TK_CTIME_KW, TK_CURRENT, TK_PARTITION, + TK_DEFERRED, TK_DISTINCT, TK_IS, TK_DROP, TK_PRECEDING, + TK_FAIL, TK_LIMIT, TK_FILTER, TK_REPLACE, TK_FIRST, + TK_FOLLOWING, TK_FROM, TK_JOIN_KW, TK_IF, TK_ORDER, + TK_RESTRICT, TK_OTHERS, TK_OVER, TK_JOIN_KW, TK_ROLLBACK, + TK_ROWS, TK_ROW, TK_UNBOUNDED, TK_UNION, TK_USING, + TK_VACUUM, TK_VIEW, TK_WINDOW, TK_DO, TK_BY, + TK_INITIALLY, TK_ALL, TK_PRIMARY, }; /* Check to see if z[0..n-1] is a keyword. If it is, write the ** parser symbol code for that keyword into *pType. Always @@ -155155,14 +155155,14 @@ SQLITE_API int sqlite3_keyword_check(const char *zName, int nName){ ** IdChar(X) will be true. Otherwise it is false. ** ** For ASCII, any character with the high-order bit set is -** allowed in an identifier. For 7-bit characters, +** allowed in an identifier. For 7-bit characters, ** sqlite3IsIdChar[X] must be 1. ** ** For EBCDIC, the rules are more complex but have the same ** end result. ** ** Ticket #1066. the SQL standard does not allow '$' in the -** middle of identifiers. But many SQL implementations do. +** middle of identifiers. But many SQL implementations do. ** SQLite will allow '$' in identifiers for compatibility. ** But the feature is undocumented. */ @@ -155202,12 +155202,12 @@ static int getToken(const unsigned char **pz){ do { z += sqlite3GetToken(z, &t); }while( t==TK_SPACE ); - if( t==TK_ID - || t==TK_STRING - || t==TK_JOIN_KW - || t==TK_WINDOW - || t==TK_OVER - || sqlite3ParserFallback(t)==TK_ID + if( t==TK_ID + || t==TK_STRING + || t==TK_JOIN_KW + || t==TK_WINDOW + || t==TK_OVER + || sqlite3ParserFallback(t)==TK_ID ){ t = TK_ID; } @@ -155224,8 +155224,8 @@ static int getToken(const unsigned char **pz){ ** ** SELECT sum(x) OVER ... ** -** In the above, "OVER" might be a keyword, or it might be an alias for the -** sum(x) expression. If a "%fallback ID OVER" directive were added to +** In the above, "OVER" might be a keyword, or it might be an alias for the +** sum(x) expression. If a "%fallback ID OVER" directive were added to ** grammar, then SQLite would always treat "OVER" as an alias, making it ** impossible to call a window-function without a FILTER clause. ** @@ -155269,7 +155269,7 @@ static int analyzeFilterKeyword(const unsigned char *z, int lastToken){ #endif /* SQLITE_OMIT_WINDOWFUNC */ /* -** Return the length (in bytes) of the token that begins at z[0]. +** Return the length (in bytes) of the token that begins at z[0]. ** Store the token type in *tokenType before returning. */ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ @@ -155447,7 +155447,7 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ *tokenType = TK_FLOAT; } if( (z[i]=='e' || z[i]=='E') && - ( sqlite3Isdigit(z[i+1]) + ( sqlite3Isdigit(z[i+1]) || ((z[i+1]=='+' || z[i+1]=='-') && sqlite3Isdigit(z[i+2])) ) ){ @@ -155552,7 +155552,7 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ /* ** Run the parser on the given SQL string. The parser structure is ** passed in. An SQLITE_ status code is returned. If an error occurs -** then an and attempt is made to write an error message into +** then an and attempt is made to write an error message into ** memory obtained from sqlite3_malloc() and to make *pzErrMsg point to that ** error message. */ @@ -155611,7 +155611,7 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr #ifndef SQLITE_OMIT_WINDOWFUNC if( tokenType>=TK_WINDOW ){ assert( tokenType==TK_SPACE || tokenType==TK_OVER || tokenType==TK_FILTER - || tokenType==TK_ILLEGAL || tokenType==TK_WINDOW + || tokenType==TK_ILLEGAL || tokenType==TK_WINDOW ); #else if( tokenType>=TK_SPACE ){ @@ -155682,7 +155682,7 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr assert( pzErrMsg!=0 ); if( pParse->zErrMsg ){ *pzErrMsg = pParse->zErrMsg; - sqlite3_log(pParse->rc, "%s in \"%s\"", + sqlite3_log(pParse->rc, "%s in \"%s\"", *pzErrMsg, pParse->zTail); pParse->zErrMsg = 0; nErr++; @@ -155704,7 +155704,7 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr #endif if( !IN_SPECIAL_PARSE ){ - /* If the pParse->declareVtab flag is set, do not delete any table + /* If the pParse->declareVtab flag is set, do not delete any table ** structure built up in pParse->pNewTable. The calling code (see vtab.c) ** will take responsibility for freeing the Table structure. */ @@ -155937,7 +155937,7 @@ SQLITE_PRIVATE const char sqlite3IsEbcdicIdChar[]; ** (2) NORMAL We are in the middle of statement which ends with a single ** semicolon. ** -** (3) EXPLAIN The keyword EXPLAIN has been seen at the beginning of +** (3) EXPLAIN The keyword EXPLAIN has been seen at the beginning of ** a statement. ** ** (4) CREATE The keyword CREATE has been seen at the beginning of a @@ -156296,13 +156296,13 @@ SQLITE_PRIVATE int sqlite3Fts5Init(sqlite3*); #ifndef SQLITE_AMALGAMATION /* IMPLEMENTATION-OF: R-46656-45156 The sqlite3_version[] string constant -** contains the text of SQLITE_VERSION macro. +** contains the text of SQLITE_VERSION macro. */ SQLITE_API const char sqlite3_version[] = SQLITE_VERSION; #endif /* IMPLEMENTATION-OF: R-53536-42575 The sqlite3_libversion() function returns -** a pointer to the to the sqlite3_version[] string constant. +** a pointer to the to the sqlite3_version[] string constant. */ SQLITE_API const char *sqlite3_libversion(void){ return sqlite3_version; } @@ -156366,13 +156366,13 @@ SQLITE_API char *sqlite3_temp_directory = 0; SQLITE_API char *sqlite3_data_directory = 0; /* -** Initialize SQLite. +** Initialize SQLite. ** ** This routine must be called to initialize the memory allocation, ** VFS, and mutex subsystems prior to doing any serious work with ** SQLite. But as long as you do not compile with SQLITE_OMIT_AUTOINIT ** this routine will be called automatically by key routines such as -** sqlite3_open(). +** sqlite3_open(). ** ** This routine is a no-op except on its very first call for the process, ** or for the first call after a call to sqlite3_shutdown. @@ -156422,7 +156422,7 @@ SQLITE_API int sqlite3_initialize(void){ */ if( sqlite3GlobalConfig.isInit ) return SQLITE_OK; - /* Make sure the mutex subsystem is initialized. If unable to + /* Make sure the mutex subsystem is initialized. If unable to ** initialize the mutex subsystem, return early with the error. ** If the system is so sick that we are unable to allocate a mutex, ** there is not much SQLite is going to be able to do. @@ -156504,7 +156504,7 @@ SQLITE_API int sqlite3_initialize(void){ } #endif if( rc==SQLITE_OK ){ - sqlite3PCacheBufferSetup( sqlite3GlobalConfig.pPage, + sqlite3PCacheBufferSetup( sqlite3GlobalConfig.pPage, sqlite3GlobalConfig.szPage, sqlite3GlobalConfig.nPage); sqlite3GlobalConfig.isInit = 1; #ifdef SQLITE_EXTRA_INIT @@ -156721,7 +156721,7 @@ SQLITE_API int sqlite3_config(int op, ...){ ** a single parameter which is a pointer to an integer and writes into ** that integer the number of extra bytes per page required for each page ** in SQLITE_CONFIG_PAGECACHE. */ - *va_arg(ap, int*) = + *va_arg(ap, int*) = sqlite3HeaderSizeBtree() + sqlite3HeaderSizePcache() + sqlite3HeaderSizePcache1(); @@ -156808,7 +156808,7 @@ SQLITE_API int sqlite3_config(int op, ...){ sqlite3GlobalConfig.nLookaside = va_arg(ap, int); break; } - + /* Record a pointer to the logger function and its first argument. ** The default is NULL. Logging is disabled if the function pointer is ** NULL. @@ -156930,7 +156930,7 @@ SQLITE_API int sqlite3_config(int op, ...){ /* ** Set up the lookaside buffers for a database connection. -** Return SQLITE_OK on success. +** Return SQLITE_OK on success. ** If lookaside is already active, return SQLITE_BUSY. ** ** The sz parameter is the number of bytes in each lookaside slot. @@ -156942,12 +156942,12 @@ SQLITE_API int sqlite3_config(int op, ...){ static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ #ifndef SQLITE_OMIT_LOOKASIDE void *pStart; - + if( sqlite3LookasideUsed(db,0)>0 ){ return SQLITE_BUSY; } /* Free any existing lookaside buffer for this handle before - ** allocating a new one so we don't have to have space for + ** allocating a new one so we don't have to have space for ** both at the same time. */ if( db->lookaside.bMalloced ){ @@ -157186,7 +157186,7 @@ SQLITE_PRIVATE int sqlite3IsBinary(const CollSeq *p){ } /* -** Another built-in collating sequence: NOCASE. +** Another built-in collating sequence: NOCASE. ** ** This collating sequence is intended to be used for "case independent ** comparison". SQLite's knowledge of upper and lower case equivalents @@ -157328,7 +157328,7 @@ static void disconnectAllVtab(sqlite3 *db){ /* ** Return TRUE if database connection db has unfinalized prepared -** statements or unfinished sqlite3_backup objects. +** statements or unfinished sqlite3_backup objects. */ static int connectionIsBusy(sqlite3 *db){ int j; @@ -157514,7 +157514,7 @@ SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3 *db){ /* The temp-database schema is allocated differently from the other schema ** objects (using sqliteMalloc() directly, instead of sqlite3BtreeSchema()). ** So it needs to be freed here. Todo: Why not roll the temp schema into - ** the same sqliteMalloc() as the one that allocates the database + ** the same sqliteMalloc() as the one that allocates the database ** structure? */ sqlite3DbFree(db, db->aDb[1].pSchema); @@ -157542,7 +157542,7 @@ SQLITE_PRIVATE void sqlite3RollbackAll(sqlite3 *db, int tripCode){ assert( sqlite3_mutex_held(db->mutex) ); sqlite3BeginBenignMalloc(); - /* Obtain all b-tree mutexes before making any calls to BtreeRollback(). + /* Obtain all b-tree mutexes before making any calls to BtreeRollback(). ** This is important in case the transaction being rolled back has ** modified the database schema. If the b-tree mutexes are not taken ** here, then another shared-cache connection might sneak in between @@ -157850,7 +157850,7 @@ SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler *p, sqlite3_file *pFile) }else{ p->nBusy++; } - return rc; + return rc; } /* @@ -157882,9 +157882,9 @@ SQLITE_API int sqlite3_busy_handler( ** be invoked every nOps opcodes. */ SQLITE_API void sqlite3_progress_handler( - sqlite3 *db, + sqlite3 *db, int nOps, - int (*xProgress)(void*), + int (*xProgress)(void*), void *pArg ){ #ifdef SQLITE_ENABLE_API_ARMOR @@ -157945,7 +157945,7 @@ SQLITE_API void sqlite3_interrupt(sqlite3 *db){ ** This function is exactly the same as sqlite3_create_function(), except ** that it is designed to be called by internal code. The difference is ** that if a malloc() fails in sqlite3_create_function(), an error code -** is returned and the mallocFailed flag cleared. +** is returned and the mallocFailed flag cleared. */ SQLITE_PRIVATE int sqlite3CreateFunc( sqlite3 *db, @@ -157980,7 +157980,7 @@ SQLITE_PRIVATE int sqlite3CreateFunc( assert( SQLITE_FUNC_DIRECT==SQLITE_DIRECTONLY ); extraFlags = enc & (SQLITE_DETERMINISTIC|SQLITE_DIRECTONLY|SQLITE_SUBTYPE); enc &= (SQLITE_FUNC_ENCMASK|SQLITE_ANY); - + #ifndef SQLITE_OMIT_UTF16 /* If SQLITE_UTF16 is specified as the encoding type, transform this ** to one of SQLITE_UTF16LE or SQLITE_UTF16BE using the @@ -158007,7 +158007,7 @@ SQLITE_PRIVATE int sqlite3CreateFunc( #else enc = SQLITE_UTF8; #endif - + /* Check if an existing function is being overridden or deleted. If so, ** and there are active VMs, then return SQLITE_BUSY. If a function ** is being overridden/deleted but there are no active VMs, allow the @@ -158016,7 +158016,7 @@ SQLITE_PRIVATE int sqlite3CreateFunc( p = sqlite3FindFunction(db, zFunctionName, nArg, (u8)enc, 0); if( p && (p->funcFlags & SQLITE_FUNC_ENCMASK)==(u32)enc && p->nArg==nArg ){ if( db->nVdbeActive ){ - sqlite3ErrorWithMsg(db, SQLITE_BUSY, + sqlite3ErrorWithMsg(db, SQLITE_BUSY, "unable to delete/modify user-function due to active statements"); assert( !db->mallocFailed ); return SQLITE_BUSY; @@ -158091,7 +158091,7 @@ static int createFunctionApi( pArg->xDestroy = xDestroy; pArg->pUserData = p; } - rc = sqlite3CreateFunc(db, zFunc, nArg, enc, p, + rc = sqlite3CreateFunc(db, zFunc, nArg, enc, p, xSFunc, xStep, xFinal, xValue, xInverse, pArg ); if( pArg && pArg->nRef==0 ){ @@ -158208,7 +158208,7 @@ static void sqlite3InvalidFunction( ** ** If the function already exists as a regular global function, then ** this routine is a no-op. If the function does not exist, then create -** a new one that always throws a run-time error. +** a new one that always throws a run-time error. ** ** When virtual tables intend to provide an overloaded function, they ** should call this routine to make sure the global function exists. @@ -158241,7 +158241,7 @@ SQLITE_API int sqlite3_overload_function( #ifndef SQLITE_OMIT_TRACE /* ** Register a trace function. The pArg from the previously registered trace -** is returned. +** is returned. ** ** A NULL trace function means that no tracing is executes. A non-NULL ** trace is a pointer to a function that is invoked at the start of each @@ -158292,8 +158292,8 @@ SQLITE_API int sqlite3_trace_v2( #ifndef SQLITE_OMIT_DEPRECATED /* -** Register a profile function. The pArg from the previously registered -** profile function is returned. +** Register a profile function. The pArg from the previously registered +** profile function is returned. ** ** A NULL profile function means that no profiling is executes. A non-NULL ** profile is a pointer to a function that is invoked at the conclusion of @@ -158427,7 +158427,7 @@ SQLITE_API void *sqlite3_preupdate_hook( ** Invoke sqlite3_wal_checkpoint if the number of frames in the log file ** is greater than sqlite3.pWalArg cast to an integer (the value configured by ** wal_autocheckpoint()). -*/ +*/ SQLITE_PRIVATE int sqlite3WalDefaultHook( void *pClientData, /* Argument */ sqlite3 *db, /* Connection */ @@ -158561,7 +158561,7 @@ SQLITE_API int sqlite3_wal_checkpoint_v2( /* ** Checkpoint database zDb. If zDb is NULL, or if the buffer zDb points -** to contains a zero-length string, all attached databases are +** to contains a zero-length string, all attached databases are ** checkpointed. */ SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb){ @@ -158575,9 +158575,9 @@ SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb){ ** Run a checkpoint on database iDb. This is a no-op if database iDb is ** not currently open in WAL mode. ** -** If a transaction is open on the database being checkpointed, this -** function returns SQLITE_LOCKED and a checkpoint is not attempted. If -** an error occurs while running the checkpoint, an SQLite error code is +** If a transaction is open on the database being checkpointed, this +** function returns SQLITE_LOCKED and a checkpoint is not attempted. If +** an error occurs while running the checkpoint, an SQLite error code is ** returned (i.e. SQLITE_IOERR). Otherwise, SQLITE_OK. ** ** The mutex on database handle db should be held by the caller. The mutex @@ -158746,7 +158746,7 @@ SQLITE_API int sqlite3_extended_errcode(sqlite3 *db){ } SQLITE_API int sqlite3_system_errno(sqlite3 *db){ return db ? db->iSysErrno : 0; -} +} /* ** Return a string that describes the kind of error specified in the @@ -158763,7 +158763,7 @@ SQLITE_API const char *sqlite3_errstr(int rc){ */ static int createCollation( sqlite3* db, - const char *zName, + const char *zName, u8 enc, void* pCtx, int(*xCompare)(void*,int,const void*,int,const void*), @@ -158771,7 +158771,7 @@ static int createCollation( ){ CollSeq *pColl; int enc2; - + assert( sqlite3_mutex_held(db->mutex) ); /* If SQLITE_UTF16 is specified as the encoding type, transform this @@ -158788,14 +158788,14 @@ static int createCollation( return SQLITE_MISUSE_BKPT; } - /* Check if this call is removing or replacing an existing collation + /* Check if this call is removing or replacing an existing collation ** sequence. If so, and there are active VMs, return busy. If there ** are no active VMs, invalidate any pre-compiled statements. */ pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, 0); if( pColl && pColl->xCmp ){ if( db->nVdbeActive ){ - sqlite3ErrorWithMsg(db, SQLITE_BUSY, + sqlite3ErrorWithMsg(db, SQLITE_BUSY, "unable to delete/modify collation sequence due to active statements"); return SQLITE_BUSY; } @@ -158806,7 +158806,7 @@ static int createCollation( ** then any copies made by synthCollSeq() need to be invalidated. ** Also, collation destructor - CollSeq.xDel() - function may need ** to be called. - */ + */ if( (pColl->enc & ~SQLITE_UTF16_ALIGNED)==enc2 ){ CollSeq *aColl = sqlite3HashFind(&db->aCollSeq, zName); int j; @@ -158955,17 +158955,17 @@ SQLITE_API int sqlite3_limit(sqlite3 *db, int limitId, int newLimit){ ** query parameter. The second argument contains the URI (or non-URI filename) ** itself. When this function is called the *pFlags variable should contain ** the default flags to open the database handle with. The value stored in -** *pFlags may be updated before returning if the URI filename contains +** *pFlags may be updated before returning if the URI filename contains ** "cache=xxx" or "mode=xxx" query parameters. ** ** If successful, SQLITE_OK is returned. In this case *ppVfs is set to point to ** the VFS that should be used to open the database file. *pzFile is set to -** point to a buffer containing the name of the file to open. It is the +** point to a buffer containing the name of the file to open. It is the ** responsibility of the caller to eventually call sqlite3_free() to release ** this buffer. ** ** If an error occurs, then an SQLite error code is returned and *pzErrMsg -** may be set to point to a buffer containing an English language error +** may be set to point to a buffer containing an English language error ** message. It is the responsibility of the caller to eventually release ** this buffer by calling sqlite3_free(). */ @@ -158973,7 +158973,7 @@ SQLITE_PRIVATE int sqlite3ParseUri( const char *zDefaultVfs, /* VFS to use if no "vfs=xxx" query option */ const char *zUri, /* Nul-terminated URI to parse */ unsigned int *pFlags, /* IN/OUT: SQLITE_OPEN_XXX flags */ - sqlite3_vfs **ppVfs, /* OUT: VFS to use */ + sqlite3_vfs **ppVfs, /* OUT: VFS to use */ char **pzFile, /* OUT: Filename component of URI */ char **pzErrMsg /* OUT: Error message (if rc!=SQLITE_OK) */ ){ @@ -158996,7 +158996,7 @@ SQLITE_PRIVATE int sqlite3ParseUri( int iOut = 0; /* Output character index */ u64 nByte = nUri+2; /* Bytes of space to allocate */ - /* Make sure the SQLITE_OPEN_URI flag is set to indicate to the VFS xOpen + /* Make sure the SQLITE_OPEN_URI flag is set to indicate to the VFS xOpen ** method that there may be extra parameters following the file-name. */ flags |= SQLITE_OPEN_URI; @@ -159011,7 +159011,7 @@ SQLITE_PRIVATE int sqlite3ParseUri( /* The following condition causes URIs with five leading / characters ** like file://///host/path to be converted into UNCs like //host/path. ** The correct URI for that UNC has only two or four leading / characters - ** file://host/path or file:////host/path. But 5 leading slashes is a + ** file://host/path or file:////host/path. But 5 leading slashes is a ** common error, we are told, so we handle it as a special case. */ if( strncmp(zUri+7, "///", 3)==0 ){ iIn++; } }else if( strncmp(zUri+5, "//localhost/", 12)==0 ){ @@ -159023,7 +159023,7 @@ SQLITE_PRIVATE int sqlite3ParseUri( iIn = 7; while( zUri[iIn] && zUri[iIn]!='/' ) iIn++; if( iIn!=7 && (iIn!=16 || memcmp("localhost", &zUri[7], 9)) ){ - *pzErrMsg = sqlite3_mprintf("invalid uri authority: %.*s", + *pzErrMsg = sqlite3_mprintf("invalid uri authority: %.*s", iIn-7, &zUri[7]); rc = SQLITE_ERROR; goto parse_uri_out; @@ -159031,8 +159031,8 @@ SQLITE_PRIVATE int sqlite3ParseUri( } #endif - /* Copy the filename and any query parameters into the zFile buffer. - ** Decode %HH escape codes along the way. + /* Copy the filename and any query parameters into the zFile buffer. + ** Decode %HH escape codes along the way. ** ** Within this loop, variable eState may be set to 0, 1 or 2, depending ** on the parsing context. As follows: @@ -159044,9 +159044,9 @@ SQLITE_PRIVATE int sqlite3ParseUri( eState = 0; while( (c = zUri[iIn])!=0 && c!='#' ){ iIn++; - if( c=='%' - && sqlite3Isxdigit(zUri[iIn]) - && sqlite3Isxdigit(zUri[iIn+1]) + if( c=='%' + && sqlite3Isxdigit(zUri[iIn]) + && sqlite3Isxdigit(zUri[iIn+1]) ){ int octet = (sqlite3HexToInt(zUri[iIn++]) << 4); octet += sqlite3HexToInt(zUri[iIn++]); @@ -159058,7 +159058,7 @@ SQLITE_PRIVATE int sqlite3ParseUri( ** case we ignore all text in the remainder of the path, name or ** value currently being parsed. So ignore the current character ** and skip to the next "?", "=" or "&", as appropriate. */ - while( (c = zUri[iIn])!=0 && c!='#' + while( (c = zUri[iIn])!=0 && c!='#' && (eState!=0 || c!='?') && (eState!=1 || (c!='=' && c!='&')) && (eState!=2 || c!='&') @@ -159096,7 +159096,7 @@ SQLITE_PRIVATE int sqlite3ParseUri( zFile[iOut++] = '\0'; zFile[iOut++] = '\0'; - /* Check if there were any options specified that should be interpreted + /* Check if there were any options specified that should be interpreted ** here. Options that are interpreted here include "vfs" and those that ** correspond to flags that may be passed to the sqlite3_open_v2() ** method. */ @@ -159132,7 +159132,7 @@ SQLITE_PRIVATE int sqlite3ParseUri( if( nOpt==4 && memcmp("mode", zOpt, 4)==0 ){ static struct OpenMode aOpenMode[] = { { "ro", SQLITE_OPEN_READONLY }, - { "rw", SQLITE_OPEN_READWRITE }, + { "rw", SQLITE_OPEN_READWRITE }, { "rwc", SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE }, { "memory", SQLITE_OPEN_MEMORY }, { 0, 0 } @@ -159236,7 +159236,7 @@ SQLITE_PRIVATE int sqlite3CodecQueryParameters( /* ** This routine does the work of opening a database on behalf of -** sqlite3_open() and sqlite3_open16(). The database filename "zFilename" +** sqlite3_open() and sqlite3_open16(). The database filename "zFilename" ** is UTF-8 encoded. */ static int openDatabase( @@ -159288,11 +159288,11 @@ static int openDatabase( flags &= ~( SQLITE_OPEN_DELETEONCLOSE | SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_MAIN_DB | - SQLITE_OPEN_TEMP_DB | - SQLITE_OPEN_TRANSIENT_DB | - SQLITE_OPEN_MAIN_JOURNAL | - SQLITE_OPEN_TEMP_JOURNAL | - SQLITE_OPEN_SUBJOURNAL | + SQLITE_OPEN_TEMP_DB | + SQLITE_OPEN_TRANSIENT_DB | + SQLITE_OPEN_MAIN_JOURNAL | + SQLITE_OPEN_TEMP_JOURNAL | + SQLITE_OPEN_SUBJOURNAL | SQLITE_OPEN_MASTER_JOURNAL | SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_FULLMUTEX | @@ -159302,7 +159302,7 @@ static int openDatabase( /* Allocate the sqlite data structure */ db = sqlite3MallocZero( sizeof(sqlite3) ); if( db==0 ) goto opendb_out; - if( isThreadsafe + if( isThreadsafe #ifdef SQLITE_ENABLE_MULTITHREADED_CHECKS || sqlite3GlobalConfig.bCoreMutex #endif @@ -159342,7 +159342,7 @@ static int openDatabase( ** ** SQLITE_DQS SQLITE_DBCONFIG_DQS_DDL SQLITE_DBCONFIG_DQS_DML ** ---------- ----------------------- ----------------------- -** undefined on on +** undefined on on ** 3 on on ** 2 on off ** 1 off on @@ -159417,14 +159417,14 @@ static int openDatabase( goto opendb_out; } /* EVIDENCE-OF: R-08308-17224 The default collating function for all - ** strings is BINARY. + ** strings is BINARY. */ db->pDfltColl = sqlite3FindCollSeq(db, SQLITE_UTF8, sqlite3StrBINARY, 0); assert( db->pDfltColl!=0 ); /* Parse the filename/URI argument ** - ** Only allow sensible combinations of bits in the flags argument. + ** Only allow sensible combinations of bits in the flags argument. ** Throw an error if any non-sense combination is used. If we ** do not block illegal combinations here, it could trigger ** assert() statements in deeper layers. Sensible combinations @@ -159470,7 +159470,7 @@ static int openDatabase( db->aDb[1].pSchema = sqlite3SchemaGet(db, 0); /* The default safety_level for the main database is FULL; for the temp - ** database it is OFF. This matches the pager layer defaults. + ** database it is OFF. This matches the pager layer defaults. */ db->aDb[0].zDbSName = "main"; db->aDb[0].safety_level = SQLITE_DEFAULT_SYNCHRONOUS+1; @@ -159492,7 +159492,7 @@ static int openDatabase( #ifdef SQLITE_ENABLE_FTS5 /* Register any built-in FTS5 module before loading the automatic - ** extensions. This allows automatic extensions to register FTS5 + ** extensions. This allows automatic extensions to register FTS5 ** tokenizers and auxiliary functions. */ if( !db->mallocFailed && rc==SQLITE_OK ){ rc = sqlite3Fts5Init(db); @@ -159618,8 +159618,8 @@ opendb_out: ** Open a new database handle. */ SQLITE_API int sqlite3_open( - const char *zFilename, - sqlite3 **ppDb + const char *zFilename, + sqlite3 **ppDb ){ return openDatabase(zFilename, ppDb, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0); @@ -159638,7 +159638,7 @@ SQLITE_API int sqlite3_open_v2( ** Open a new database handle. */ SQLITE_API int sqlite3_open16( - const void *zFilename, + const void *zFilename, sqlite3 **ppDb ){ char const *zFilename8; /* zFilename encoded in UTF-8 instead of UTF-16 */ @@ -159677,9 +159677,9 @@ SQLITE_API int sqlite3_open16( ** Register a new collation sequence with the database handle db. */ SQLITE_API int sqlite3_create_collation( - sqlite3* db, - const char *zName, - int enc, + sqlite3* db, + const char *zName, + int enc, void* pCtx, int(*xCompare)(void*,int,const void*,int,const void*) ){ @@ -159690,9 +159690,9 @@ SQLITE_API int sqlite3_create_collation( ** Register a new collation sequence with the database handle db. */ SQLITE_API int sqlite3_create_collation_v2( - sqlite3* db, - const char *zName, - int enc, + sqlite3* db, + const char *zName, + int enc, void* pCtx, int(*xCompare)(void*,int,const void*,int,const void*), void(*xDel)(void*) @@ -159715,9 +159715,9 @@ SQLITE_API int sqlite3_create_collation_v2( ** Register a new collation sequence with the database handle db. */ SQLITE_API int sqlite3_create_collation16( - sqlite3* db, + sqlite3* db, const void *zName, - int enc, + int enc, void* pCtx, int(*xCompare)(void*,int,const void*,int,const void*) ){ @@ -159745,8 +159745,8 @@ SQLITE_API int sqlite3_create_collation16( ** db. Replace any previously installed collation sequence factory. */ SQLITE_API int sqlite3_collation_needed( - sqlite3 *db, - void *pCollNeededArg, + sqlite3 *db, + void *pCollNeededArg, void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*) ){ #ifdef SQLITE_ENABLE_API_ARMOR @@ -159766,8 +159766,8 @@ SQLITE_API int sqlite3_collation_needed( ** db. Replace any previously installed collation sequence factory. */ SQLITE_API int sqlite3_collation_needed16( - sqlite3 *db, - void *pCollNeededArg, + sqlite3 *db, + void *pCollNeededArg, void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*) ){ #ifdef SQLITE_ENABLE_API_ARMOR @@ -159937,13 +159937,13 @@ SQLITE_API int sqlite3_table_column_metadata( /* The following block stores the meta information that will be returned ** to the caller in local variables zDataType, zCollSeq, notnull, primarykey ** and autoinc. At this point there are two possibilities: - ** - ** 1. The specified column name was rowid", "oid" or "_rowid_" - ** and there is no explicitly declared IPK column. ** - ** 2. The table is not a view and the column name identified an + ** 1. The specified column name was rowid", "oid" or "_rowid_" + ** and there is no explicitly declared IPK column. + ** + ** 2. The table is not a view and the column name identified an ** explicitly declared column. Copy meta information from *pCol. - */ + */ if( pCol ){ zDataType = sqlite3ColumnType(pCol,0); zCollSeq = pCol->zColl; @@ -159993,7 +159993,7 @@ SQLITE_API int sqlite3_sleep(int ms){ pVfs = sqlite3_vfs_find(0); if( pVfs==0 ) return 0; - /* This function works in milliseconds, but the underlying OsSleep() + /* This function works in milliseconds, but the underlying OsSleep() ** API uses microseconds. Hence the 1000's. */ rc = (sqlite3OsSleep(pVfs, 1000*ms)/1000); @@ -160155,7 +160155,7 @@ SQLITE_API int sqlite3_test_control(int op, ...){ /* ** sqlite3_test_control(BENIGN_MALLOC_HOOKS, xBegin, xEnd) ** - ** Register hooks to call to indicate which malloc() failures + ** Register hooks to call to indicate which malloc() failures ** are benign. */ case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS: { @@ -160253,7 +160253,7 @@ SQLITE_API int sqlite3_test_control(int op, ...){ ** 10 little-endian, determined at run-time ** 432101 big-endian, determined at compile-time ** 123410 little-endian, determined at compile-time - */ + */ case SQLITE_TESTCTRL_BYTEORDER: { rc = SQLITE_BYTEORDER*100 + SQLITE_LITTLEENDIAN*10 + SQLITE_BIGENDIAN; break; @@ -160275,7 +160275,7 @@ SQLITE_API int sqlite3_test_control(int op, ...){ /* sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS, sqlite3 *db, int N) ** - ** Enable or disable various optimizations for testing purposes. The + ** Enable or disable various optimizations for testing purposes. The ** argument N is a bitmask of optimizations to be disabled. For normal ** operation N should be 0. The idea is that a test program (like the ** SQL Logic Test or SLT test module) can run the same SQL multiple times @@ -160346,7 +160346,7 @@ SQLITE_API int sqlite3_test_control(int op, ...){ /* sqlite3_test_control(SQLITE_TESTCTRL_VDBE_COVERAGE, xCallback, ptr); ** - ** Set the VDBE coverage callback function to xCallback with context + ** Set the VDBE coverage callback function to xCallback with context ** pointer ptr. */ case SQLITE_TESTCTRL_VDBE_COVERAGE: { @@ -160444,7 +160444,7 @@ SQLITE_API int sqlite3_test_control(int op, ...){ /* ** This is a utility routine, useful to VFS implementations, that checks -** to see if a database file was a URI that contained a specific query +** to see if a database file was a URI that contained a specific query ** parameter, and if so obtains the value of the query parameter. ** ** The zFilename argument is the filename pointer passed into the xOpen() @@ -160532,11 +160532,11 @@ SQLITE_API int sqlite3_db_readonly(sqlite3 *db, const char *zDbName){ #ifdef SQLITE_ENABLE_SNAPSHOT /* -** Obtain a snapshot handle for the snapshot of database zDb currently +** Obtain a snapshot handle for the snapshot of database zDb currently ** being read by handle db. */ SQLITE_API int sqlite3_snapshot_get( - sqlite3 *db, + sqlite3 *db, const char *zDb, sqlite3_snapshot **ppSnapshot ){ @@ -160572,8 +160572,8 @@ SQLITE_API int sqlite3_snapshot_get( ** Open a read-transaction on the snapshot idendified by pSnapshot. */ SQLITE_API int sqlite3_snapshot_open( - sqlite3 *db, - const char *zDb, + sqlite3 *db, + const char *zDb, sqlite3_snapshot *pSnapshot ){ int rc = SQLITE_ERROR; @@ -160675,7 +160675,7 @@ SQLITE_API int sqlite3_compileoption_used(const char *zOptName){ int i, n; int nOpt; const char **azCompileOpt; - + #if SQLITE_ENABLE_API_ARMOR if( zOptName==0 ){ (void)SQLITE_MISUSE_BKPT; @@ -160688,7 +160688,7 @@ SQLITE_API int sqlite3_compileoption_used(const char *zOptName){ if( sqlite3StrNICmp(zOptName, "SQLITE_", 7)==0 ) zOptName += 7; n = sqlite3Strlen30(zOptName); - /* Since nOpt is normally in single digits, a linear search is + /* Since nOpt is normally in single digits, a linear search is ** adequate. No need for a binary search. */ for(i=0; ixUnlockNotify!=db->xUnlockNotify; + pp=&sqlite3BlockedList; + *pp && (*pp)->xUnlockNotify!=db->xUnlockNotify; pp=&(*pp)->pNextBlocked ); db->pNextBlocked = *pp; @@ -160881,9 +160881,9 @@ SQLITE_API int sqlite3_unlock_notify( db->xUnlockNotify = 0; db->pUnlockArg = 0; }else if( 0==db->pBlockingConnection ){ - /* The blocking transaction has been concluded. Or there never was a + /* The blocking transaction has been concluded. Or there never was a ** blocking transaction. In either case, invoke the notify callback - ** immediately. + ** immediately. */ xNotify(&pArg, 1); }else{ @@ -160909,7 +160909,7 @@ SQLITE_API int sqlite3_unlock_notify( } /* -** This function is called while stepping or preparing a statement +** This function is called while stepping or preparing a statement ** associated with connection db. The operation will return SQLITE_LOCKED ** to the user because it requires a lock that will not be available ** until connection pBlocker concludes its current transaction. @@ -160925,7 +160925,7 @@ SQLITE_PRIVATE void sqlite3ConnectionBlocked(sqlite3 *db, sqlite3 *pBlocker){ /* ** This function is called when -** the transaction opened by database db has just finished. Locks held +** the transaction opened by database db has just finished. Locks held ** by database connection db have been released. ** ** This function loops through each entry in the blocked connections @@ -160985,7 +160985,7 @@ SQLITE_PRIVATE void sqlite3ConnectionUnlocked(sqlite3 *db){ }else{ /* This occurs when the array of context pointers that need to ** be passed to the unlock-notify callback is larger than the - ** aStatic[] array allocated on the stack and the attempt to + ** aStatic[] array allocated on the stack and the attempt to ** allocate a larger array from the heap has failed. ** ** This is a difficult situation to handle. Returning an error @@ -160993,17 +160993,17 @@ SQLITE_PRIVATE void sqlite3ConnectionUnlocked(sqlite3 *db){ ** is returned the transaction on connection db will still be ** closed and the unlock-notify callbacks on blocked connections ** will go unissued. This might cause the application to wait - ** indefinitely for an unlock-notify callback that will never + ** indefinitely for an unlock-notify callback that will never ** arrive. ** ** Instead, invoke the unlock-notify callback with the context ** array already accumulated. We can then clear the array and - ** begin accumulating any further context pointers without + ** begin accumulating any further context pointers without ** requiring any dynamic allocation. This is sub-optimal because ** it means that instead of one callback with a large array of ** context pointers the application will receive two or more ** callbacks with smaller arrays of context pointers, which will - ** reduce the applications ability to prioritize multiple + ** reduce the applications ability to prioritize multiple ** connections. But it is the best that can be done under the ** circumstances. */ @@ -161038,7 +161038,7 @@ SQLITE_PRIVATE void sqlite3ConnectionUnlocked(sqlite3 *db){ } /* -** This is called when the database connection passed as an argument is +** This is called when the database connection passed as an argument is ** being closed. The connection is removed from the blocked list. */ SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db){ @@ -161115,7 +161115,7 @@ SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db){ ** A doclist (document list) holds a docid-sorted list of hits for a ** given term. Doclists hold docids and associated token positions. ** A docid is the unique integer identifier for a single document. -** A position is the index of a word within the document. The first +** A position is the index of a word within the document. The first ** word of the document has a position of 0. ** ** FTS3 used to optionally store character offsets using a compile-time @@ -161140,7 +161140,7 @@ SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db){ ** ** Here, array { X } means zero or more occurrences of X, adjacent in ** memory. A "position" is an index of a token in the token stream -** generated by the tokenizer. Note that POS_END and POS_COLUMN occur +** generated by the tokenizer. Note that POS_END and POS_COLUMN occur ** in the same logical place as the position element, and act as sentinals ** ending a position list array. POS_END is 0. POS_COLUMN is 1. ** The positions numbers are not stored literally but rather as two more @@ -161164,7 +161164,7 @@ SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db){ ** a document record consists of a docid followed by a position-list and ** a doclist consists of one or more document records. ** -** A bare doclist omits the position information, becoming an +** A bare doclist omits the position information, becoming an ** array of varint-encoded docids. ** **** Segment leaf nodes **** @@ -161360,7 +161360,7 @@ SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db){ #ifndef _FTSINT_H #define _FTSINT_H -#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) +#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) # define NDEBUG 1 #endif @@ -161427,7 +161427,7 @@ SQLITE_EXTENSION_INIT3 ** When an fts3 table is created, it passes any arguments passed to ** the tokenizer clause of the CREATE VIRTUAL TABLE statement to the ** sqlite3_tokenizer_module.xCreate() function of the requested tokenizer -** implementation. The xCreate() function in turn returns an +** implementation. The xCreate() function in turn returns an ** sqlite3_tokenizer structure representing the specific tokenizer to ** be used for the fts3 table (customized by the tokenizer clause arguments). ** @@ -161459,7 +161459,7 @@ struct sqlite3_tokenizer_module { ** then argc is set to 2, and the argv[] array contains pointers ** to the strings "arg1" and "arg2". ** - ** This method should return either SQLITE_OK (0), or an SQLite error + ** This method should return either SQLITE_OK (0), or an SQLite error ** code. If SQLITE_OK is returned, then *ppTokenizer should be set ** to point at the newly created tokenizer structure. The generic ** sqlite3_tokenizer.pModule variable should not be initialized by @@ -161480,7 +161480,7 @@ struct sqlite3_tokenizer_module { /* ** Create a tokenizer cursor to tokenize an input buffer. The caller ** is responsible for ensuring that the input buffer remains valid - ** until the cursor is closed (using the xClose() method). + ** until the cursor is closed (using the xClose() method). */ int (*xOpen)( sqlite3_tokenizer *pTokenizer, /* Tokenizer object */ @@ -161489,7 +161489,7 @@ struct sqlite3_tokenizer_module { ); /* - ** Destroy an existing tokenizer cursor. The fts3 module calls this + ** Destroy an existing tokenizer cursor. The fts3 module calls this ** method exactly once for each successful call to xOpen(). */ int (*xClose)(sqlite3_tokenizer_cursor *pCursor); @@ -161500,7 +161500,7 @@ struct sqlite3_tokenizer_module { ** "OUT" variables identified below, or SQLITE_DONE to indicate that ** the end of the buffer has been reached, or an SQLite error code. ** - ** *ppToken should be set to point at a buffer containing the + ** *ppToken should be set to point at a buffer containing the ** normalized version of the token (i.e. after any case-folding and/or ** stemming has been performed). *pnBytes should be set to the length ** of this buffer in bytes. The input text that generated the token is @@ -161512,7 +161512,7 @@ struct sqlite3_tokenizer_module { ** ** The buffer *ppToken is set to point at is managed by the tokenizer ** implementation. It is only required to be valid until the next call - ** to xNext() or xClose(). + ** to xNext() or xClose(). */ /* TODO(shess) current implementation requires pInput to be ** nul-terminated. This should either be fixed, or pInput/nBytes @@ -161530,7 +161530,7 @@ struct sqlite3_tokenizer_module { ** Methods below this point are only available if iVersion>=1. */ - /* + /* ** Configure the language id of a tokenizer cursor. */ int (*xLanguageid)(sqlite3_tokenizer_cursor *pCsr, int iLangid); @@ -161599,7 +161599,7 @@ struct Fts3Hash { } *ht; }; -/* Each element in the hash table is an instance of the following +/* Each element in the hash table is an instance of the following ** structure. All elements are stored on a single doubly-linked list. ** ** Again, this structure is intended to be opaque, but it can't really @@ -161618,10 +161618,10 @@ struct Fts3HashElem { ** (including the null-terminator, if any). Case ** is respected in comparisons. ** -** FTS3_HASH_BINARY pKey points to binary data nKey bytes long. +** FTS3_HASH_BINARY pKey points to binary data nKey bytes long. ** memcmp() is used to compare keys. ** -** A copy of the key is made if the copyKey parameter to fts3HashInit is 1. +** A copy of the key is made if the copyKey parameter to fts3HashInit is 1. */ #define FTS3_HASH_STRING 1 #define FTS3_HASH_BINARY 2 @@ -161674,7 +161674,7 @@ SQLITE_PRIVATE Fts3HashElem *sqlite3Fts3HashFindElem(const Fts3Hash *, const voi /* ** This constant determines the maximum depth of an FTS expression tree -** that the library will create and use. FTS uses recursion to perform +** that the library will create and use. FTS uses recursion to perform ** various operations on the query tree, so the disadvantage of a large ** limit is that it may allow very large queries to use large amounts ** of stack space (perhaps causing a stack overflow). @@ -161692,11 +161692,11 @@ SQLITE_PRIVATE Fts3HashElem *sqlite3Fts3HashFindElem(const Fts3Hash *, const voi #define FTS3_MERGE_COUNT 16 /* -** This is the maximum amount of data (in bytes) to store in the +** This is the maximum amount of data (in bytes) to store in the ** Fts3Table.pendingTerms hash table. Normally, the hash table is ** populated as documents are inserted/updated/deleted in a transaction ** and used to create a new segment when the transaction is committed. -** However if this limit is reached midway through a transaction, a new +** However if this limit is reached midway through a transaction, a new ** segment is created and the hash table cleared immediately. */ #define FTS3_MAX_PENDING_DATA (1*1024*1024) @@ -161727,7 +161727,7 @@ SQLITE_PRIVATE Fts3HashElem *sqlite3Fts3HashFindElem(const Fts3Hash *, const voi /* ** FTS4 virtual tables may maintain multiple indexes - one index of all terms ** in the document set and zero or more prefix indexes. All indexes are stored -** as one or more b+-trees in the %_segments and %_segdir tables. +** as one or more b+-trees in the %_segments and %_segdir tables. ** ** It is possible to determine which index a b+-tree belongs to based on the ** value stored in the "%_segdir.level" column. Given this value L, the index @@ -161735,8 +161735,8 @@ SQLITE_PRIVATE Fts3HashElem *sqlite3Fts3HashFindElem(const Fts3Hash *, const voi ** level values between 0 and 1023 (inclusive) belong to index 0, all levels ** between 1024 and 2047 to index 1, and so on. ** -** It is considered impossible for an index to use more than 1024 levels. In -** theory though this may happen, but only after at least +** It is considered impossible for an index to use more than 1024 levels. In +** theory though this may happen, but only after at least ** (FTS3_MERGE_COUNT^1024) separate flushes of the pending-terms tables. */ #define FTS3_SEGDIR_MAXLEVEL 1024 @@ -161754,11 +161754,11 @@ SQLITE_PRIVATE Fts3HashElem *sqlite3Fts3HashFindElem(const Fts3Hash *, const voi ** Terminator values for position-lists and column-lists. */ #define POS_COLUMN (1) /* Column-list terminator */ -#define POS_END (0) /* Position-list terminator */ +#define POS_END (0) /* Position-list terminator */ /* ** The assert_fts3_nc() macro is similar to the assert() macro, except that it -** is used for assert() conditions that are true only if it can be +** is used for assert() conditions that are true only if it can be ** guranteed that the database is not corrupt. */ #if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) @@ -161770,7 +161770,7 @@ SQLITE_API extern int sqlite3_fts3_may_be_corrupt; /* ** This section provides definitions to allow the -** FTS3 extension to be compiled outside of the +** FTS3 extension to be compiled outside of the ** amalgamation. */ #ifndef SQLITE_AMALGAMATION @@ -161808,7 +161808,7 @@ typedef sqlite3_int64 i64; /* 8-byte signed integer */ /* ** Activate assert() only if SQLITE_TEST is enabled. */ -#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) +#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) # define NDEBUG 1 #endif @@ -161867,8 +161867,8 @@ struct Fts3Table { int nAutoincrmerge; /* Value configured by 'automerge' */ u32 nLeafAdd; /* Number of leaf blocks added this trans */ - /* Precompiled statements used by the implementation. Each of these - ** statements is run and reset within a single virtual table API call. + /* Precompiled statements used by the implementation. Each of these + ** statements is run and reset within a single virtual table API call. */ sqlite3_stmt *aStmt[40]; sqlite3_stmt *pSeekStmt; /* Cache for fts3CursorSeekStmt() */ @@ -161886,8 +161886,8 @@ struct Fts3Table { char *zSegmentsTbl; /* Name of %_segments table */ sqlite3_blob *pSegments; /* Blob handle open on %_segments table */ - /* - ** The following array of hash tables is used to buffer pending index + /* + ** The following array of hash tables is used to buffer pending index ** updates during transactions. All pending updates buffered at any one ** time must share a common language-id (see the FTS4 langid= feature). ** The current language id is stored in variable iPrevLangid. @@ -161897,10 +161897,10 @@ struct Fts3Table { ** terms that appear in the document set. Each subsequent index in aIndex[] ** is an index of prefixes of a specific length. ** - ** Variable nPendingData contains an estimate the memory consumed by the + ** Variable nPendingData contains an estimate the memory consumed by the ** pending data structures, including hash table overhead, but not including ** malloc overhead. When nPendingData exceeds nMaxPendingData, all hash - ** tables are flushed to disk. Variable iPrevDocid is the docid of the most + ** tables are flushed to disk. Variable iPrevDocid is the docid of the most ** recently inserted record. */ int nIndex; /* Size of aIndex[] */ @@ -161973,10 +161973,10 @@ struct Fts3Cursor { ** ** CREATE VIRTUAL TABLE ex1 USING fts3(a,b,c,d); ** SELECT docid FROM ex1 WHERE b MATCH 'one two three'; -** +** ** Because the LHS of the MATCH operator is 2nd column "b", ** Fts3Cursor.eSearch will be set to FTS3_FULLTEXT_SEARCH+1. (+0 for a, -** +1 for b, +2 for c, +3 for d.) If the LHS of MATCH were "ex1" +** +1 for b, +2 for c, +3 for d.) If the LHS of MATCH were "ex1" ** indicating that all columns should be searched, ** then eSearch would be set to FTS3_FULLTEXT_SEARCH+4. */ @@ -162035,8 +162035,8 @@ struct Fts3Phrase { char *pOrPoslist; i64 iOrDocid; - /* Variables below this point are populated by fts3_expr.c when parsing - ** a MATCH expression. Everything above is part of the evaluation phase. + /* Variables below this point are populated by fts3_expr.c when parsing + ** a MATCH expression. Everything above is part of the evaluation phase. */ int nToken; /* Number of tokens in the phrase */ int iColumn; /* Index of column this phrase must match */ @@ -162046,10 +162046,10 @@ struct Fts3Phrase { /* ** A tree of these objects forms the RHS of a MATCH operator. ** -** If Fts3Expr.eType is FTSQUERY_PHRASE and isLoaded is true, then aDoclist -** points to a malloced buffer, size nDoclist bytes, containing the results -** of this phrase query in FTS3 doclist format. As usual, the initial -** "Length" field found in doclists stored on disk is omitted from this +** If Fts3Expr.eType is FTSQUERY_PHRASE and isLoaded is true, then aDoclist +** points to a malloced buffer, size nDoclist bytes, containing the results +** of this phrase query in FTS3 doclist format. As usual, the initial +** "Length" field found in doclists stored on disk is omitted from this ** buffer. ** ** Variable aMI is used only for FTSQUERY_NEAR nodes to store the global @@ -162061,7 +162061,7 @@ struct Fts3Phrase { ** aMI[iCol*3 + 1] = Number of occurrences ** aMI[iCol*3 + 2] = Number of rows containing at least one instance ** -** The aMI array is allocated using sqlite3_malloc(). It should be freed +** The aMI array is allocated using sqlite3_malloc(). It should be freed ** when the expression node is. */ struct Fts3Expr { @@ -162085,7 +162085,7 @@ struct Fts3Expr { /* ** Candidate values for Fts3Query.eType. Note that the order of the first -** four values is in order of precedence when parsing expressions. For +** four values is in order of precedence when parsing expressions. For ** example, the following: ** ** "a OR b AND c NOT d NEAR e" @@ -162142,7 +162142,7 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderStart(Fts3Table*, Fts3MultiSegReader*, Ft SQLITE_PRIVATE int sqlite3Fts3SegReaderStep(Fts3Table *, Fts3MultiSegReader *); SQLITE_PRIVATE void sqlite3Fts3SegReaderFinish(Fts3MultiSegReader *); -SQLITE_PRIVATE int sqlite3Fts3SegReaderCursor(Fts3Table *, +SQLITE_PRIVATE int sqlite3Fts3SegReaderCursor(Fts3Table *, int, int, int, const char *, int, int, int, Fts3MultiSegReader *); /* Flags allowed as part of the 4th argument to SegmentReaderIterate() */ @@ -162206,7 +162206,7 @@ SQLITE_PRIVATE int sqlite3Fts3EvalTestDeferred(Fts3Cursor *pCsr, int *pRc); /* fts3_tokenizer.c */ SQLITE_PRIVATE const char *sqlite3Fts3NextToken(const char *, int *); SQLITE_PRIVATE int sqlite3Fts3InitHashTable(sqlite3 *, Fts3Hash *, const char *); -SQLITE_PRIVATE int sqlite3Fts3InitTokenizer(Fts3Hash *pHash, const char *, +SQLITE_PRIVATE int sqlite3Fts3InitTokenizer(Fts3Hash *pHash, const char *, sqlite3_tokenizer **, char ** ); SQLITE_PRIVATE int sqlite3Fts3IsIdChar(char); @@ -162242,7 +162242,7 @@ SQLITE_PRIVATE int sqlite3Fts3MsrIncrStart( Fts3Table*, Fts3MultiSegReader*, int, const char*, int); SQLITE_PRIVATE int sqlite3Fts3MsrIncrNext( Fts3Table *, Fts3MultiSegReader *, sqlite3_int64 *, char **, int *); -SQLITE_PRIVATE int sqlite3Fts3EvalPhrasePoslist(Fts3Cursor *, Fts3Expr *, int iCol, char **); +SQLITE_PRIVATE int sqlite3Fts3EvalPhrasePoslist(Fts3Cursor *, Fts3Expr *, int iCol, char **); SQLITE_PRIVATE int sqlite3Fts3MsrOvfl(Fts3Cursor *, Fts3MultiSegReader *, int *); SQLITE_PRIVATE int sqlite3Fts3MsrIncrRestart(Fts3MultiSegReader *pCsr); @@ -162275,7 +162275,7 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeIsdiacritic(int); /* #include */ /* #include "fts3.h" */ -#ifndef SQLITE_CORE +#ifndef SQLITE_CORE /* # include "sqlite3ext.h" */ SQLITE_EXTENSION_INIT1 #endif @@ -162312,7 +162312,7 @@ SQLITE_PRIVATE int sqlite3Fts3Never(int b) { assert( !b ); return b; } */ SQLITE_API int sqlite3_fts3_may_be_corrupt = 1; -/* +/* ** Write a 64-bit variable-length integer to memory starting at p[0]. ** The length of data written will be between 1 and FTS3_VARINT_MAX bytes. ** The number of bytes written is returned. @@ -162336,7 +162336,7 @@ SQLITE_PRIVATE int sqlite3Fts3PutVarint(char *p, sqlite_int64 v){ v = (*ptr++); \ if( (v & mask2)==0 ){ var = v; return ret; } -/* +/* ** Read a 64-bit variable-length integer from memory starting at p[0]. ** Return the number of bytes read, or 0 on error. ** The value is stored in *v. @@ -162364,7 +162364,7 @@ SQLITE_PRIVATE int sqlite3Fts3GetVarint(const char *pBuf, sqlite_int64 *v){ } /* -** Similar to sqlite3Fts3GetVarint(), except that the output is truncated to +** Similar to sqlite3Fts3GetVarint(), except that the output is truncated to ** a non-negative 32-bit integer before it is returned. */ SQLITE_PRIVATE int sqlite3Fts3GetVarint32(const char *p, int *pi){ @@ -162423,7 +162423,7 @@ SQLITE_PRIVATE void sqlite3Fts3Dequote(char *z){ int iOut = 0; /* Index of next byte to write to output */ /* If the first byte was a '[', then the close-quote character is a ']' */ - if( quote=='[' ) quote = ']'; + if( quote=='[' ) quote = ']'; while( z[iIn] ){ if( z[iIn]==quote ){ @@ -162459,14 +162459,14 @@ static void fts3GetDeltaVarint(char **pp, sqlite3_int64 *pVal){ ** varint is part of. */ static void fts3GetReverseVarint( - char **pp, - char *pStart, + char **pp, + char *pStart, sqlite3_int64 *pVal ){ sqlite3_int64 iVal; char *p; - /* Pointer p now points at the first byte past the varint we are + /* Pointer p now points at the first byte past the varint we are ** interested in. So, unless the doclist is corrupt, the 0x80 bit is ** clear on character p[-1]. */ for(p = (*pp)-2; p>=pStart && *p&0x80; p--); @@ -162553,7 +162553,7 @@ static int fts3DestroyMethod(sqlite3_vtab *pVtab){ sqlite3 *db = p->db; /* Database handle */ /* Drop the shadow tables */ - fts3DbExec(&rc, db, + fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_segments';" "DROP TABLE IF EXISTS %Q.'%q_segdir';" "DROP TABLE IF EXISTS %Q.'%q_docsize';" @@ -162579,7 +162579,7 @@ static int fts3DestroyMethod(sqlite3_vtab *pVtab){ ** passed as the first argument. This is done as part of the xConnect() ** and xCreate() methods. ** -** If *pRc is non-zero when this function is called, it is a no-op. +** If *pRc is non-zero when this function is called, it is a no-op. ** Otherwise, if an error occurs, an SQLite error code is stored in *pRc ** before returning. */ @@ -162602,7 +162602,7 @@ static void fts3DeclareVtab(int *pRc, Fts3Table *p){ /* Create the whole "CREATE TABLE" statement to pass to SQLite */ zSql = sqlite3_mprintf( - "CREATE TABLE x(%s %Q HIDDEN, docid HIDDEN, %Q HIDDEN)", + "CREATE TABLE x(%s %Q HIDDEN, docid HIDDEN, %Q HIDDEN)", zCols, p->zName, zLanguageid ); if( !zCols || !zSql ){ @@ -162621,7 +162621,7 @@ static void fts3DeclareVtab(int *pRc, Fts3Table *p){ ** Create the %_stat table if it does not already exist. */ SQLITE_PRIVATE void sqlite3Fts3CreateStatTable(int *pRc, Fts3Table *p){ - fts3DbExec(pRc, p->db, + fts3DbExec(pRc, p->db, "CREATE TABLE IF NOT EXISTS %Q.'%q_stat'" "(id INTEGER PRIMARY KEY, value BLOB);", p->zDb, p->zName @@ -162657,9 +162657,9 @@ static int fts3CreateTables(Fts3Table *p){ zContentCols = sqlite3_mprintf("%z, langid", zContentCols, zLanguageid); } if( zContentCols==0 ) rc = SQLITE_NOMEM; - + /* Create the content table */ - fts3DbExec(&rc, db, + fts3DbExec(&rc, db, "CREATE TABLE %Q.'%q_content'(%s)", p->zDb, p->zName, zContentCols ); @@ -162667,11 +162667,11 @@ static int fts3CreateTables(Fts3Table *p){ } /* Create other tables */ - fts3DbExec(&rc, db, + fts3DbExec(&rc, db, "CREATE TABLE %Q.'%q_segments'(blockid INTEGER PRIMARY KEY, block BLOB);", p->zDb, p->zName ); - fts3DbExec(&rc, db, + fts3DbExec(&rc, db, "CREATE TABLE %Q.'%q_segdir'(" "level INTEGER," "idx INTEGER," @@ -162684,7 +162684,7 @@ static int fts3CreateTables(Fts3Table *p){ p->zDb, p->zName ); if( p->bHasDocsize ){ - fts3DbExec(&rc, db, + fts3DbExec(&rc, db, "CREATE TABLE %Q.'%q_docsize'(docid INTEGER PRIMARY KEY, size BLOB);", p->zDb, p->zName ); @@ -162699,7 +162699,7 @@ static int fts3CreateTables(Fts3Table *p){ /* ** Store the current database page-size in bytes in p->nPgsz. ** -** If *pRc is non-zero when this function is called, it is a no-op. +** If *pRc is non-zero when this function is called, it is a no-op. ** Otherwise, if an error occurs, an SQLite error code is stored in *pRc ** before returning. */ @@ -162708,7 +162708,7 @@ static void fts3DatabasePageSize(int *pRc, Fts3Table *p){ int rc; /* Return code */ char *zSql; /* SQL text "PRAGMA %Q.page_size" */ sqlite3_stmt *pStmt; /* Compiled "PRAGMA %Q.page_size" statement */ - + zSql = sqlite3_mprintf("PRAGMA %Q.page_size", p->zDb); if( !zSql ){ rc = SQLITE_NOMEM; @@ -162734,11 +162734,11 @@ static void fts3DatabasePageSize(int *pRc, Fts3Table *p){ ** ** = ** -** There may not be whitespace surrounding the "=" character. The +** There may not be whitespace surrounding the "=" character. The ** term may be quoted, but the may not. */ static int fts3IsSpecialColumn( - const char *z, + const char *z, int *pnKey, char **pzValue ){ @@ -162815,7 +162815,7 @@ static char *fts3QuoteId(char const *zInput){ } /* -** Return a list of comma separated SQL expressions and a FROM clause that +** Return a list of comma separated SQL expressions and a FROM clause that ** could be used in a SELECT statement such as the following: ** ** SELECT FROM %_content AS x ... @@ -162866,7 +162866,7 @@ static char *fts3ReadExprList(Fts3Table *p, const char *zFunc, int *pRc){ fts3Appendf(pRc, &zRet, ", x.%Q", p->zLanguageid); } } - fts3Appendf(pRc, &zRet, " FROM '%q'.'%q%s' AS x", + fts3Appendf(pRc, &zRet, " FROM '%q'.'%q%s' AS x", p->zDb, (p->zContentTbl ? p->zContentTbl : p->zName), (p->zContentTbl ? "" : "_content") @@ -162881,7 +162881,7 @@ static char *fts3ReadExprList(Fts3Table *p, const char *zFunc, int *pRc){ ** ** If argument zFunc is not NULL, then all but the first question mark ** is preceded by zFunc and an open bracket, and followed by a closed -** bracket. For example, if zFunc is "zip" and the FTS3 table has three +** bracket. For example, if zFunc is "zip" and the FTS3 table has three ** user-defined text columns, the following string is returned: ** ** "?, zip(?), zip(?), zip(?)" @@ -162918,11 +162918,11 @@ static char *fts3WriteExprList(Fts3Table *p, const char *zFunc, int *pRc){ /* ** This function interprets the string at (*pp) as a non-negative integer -** value. It reads the integer and sets *pnOut to the value read, then +** value. It reads the integer and sets *pnOut to the value read, then ** sets *pp to point to the byte immediately following the last byte of ** the integer value. ** -** Only decimal digits ('0'..'9') may be part of an integer value. +** Only decimal digits ('0'..'9') may be part of an integer value. ** ** If *pp does not being with a decimal digit SQLITE_ERROR is returned and ** the output value undefined. Otherwise SQLITE_OK is returned. @@ -163043,7 +163043,7 @@ static int fts3ContentColumns( char **pzErr /* OUT: error message */ ){ int rc = SQLITE_OK; /* Return code */ - char *zSql; /* "SELECT *" statement on zTbl */ + char *zSql; /* "SELECT *" statement on zTbl */ sqlite3_stmt *pStmt = 0; /* Compiled version of zSql */ zSql = sqlite3_mprintf("SELECT * FROM %Q.%Q", zDb, zTbl); @@ -163185,9 +163185,9 @@ static int fts3InitVtab( char *zVal; /* Check if this is a tokenizer specification */ - if( !pTokenizer + if( !pTokenizer && strlen(z)>8 - && 0==sqlite3_strnicmp(z, "tokenize", 8) + && 0==sqlite3_strnicmp(z, "tokenize", 8) && 0==sqlite3Fts3IsIdChar(z[8]) ){ rc = sqlite3Fts3InitTokenizer(pHash, &z[9], &pTokenizer, pzErr); @@ -163247,8 +163247,8 @@ static int fts3InitVtab( break; case 4: /* ORDER */ - if( (strlen(zVal)!=3 || sqlite3_strnicmp(zVal, "asc", 3)) - && (strlen(zVal)!=4 || sqlite3_strnicmp(zVal, "desc", 4)) + if( (strlen(zVal)!=3 || sqlite3_strnicmp(zVal, "asc", 3)) + && (strlen(zVal)!=4 || sqlite3_strnicmp(zVal, "desc", 4)) ){ sqlite3Fts3ErrMsg(pzErr, "unrecognized order: %s", zVal); rc = SQLITE_ERROR; @@ -163299,17 +163299,17 @@ static int fts3InitVtab( ** TABLE statement, use all columns from the content table. */ if( rc==SQLITE_OK && zContent ){ - sqlite3_free(zCompress); - sqlite3_free(zUncompress); + sqlite3_free(zCompress); + sqlite3_free(zUncompress); zCompress = 0; zUncompress = 0; if( nCol==0 ){ - sqlite3_free((void*)aCol); + sqlite3_free((void*)aCol); aCol = 0; rc = fts3ContentColumns(db, argv[1], zContent,&aCol,&nCol,&nString,pzErr); /* If a languageid= option was specified, remove the language id - ** column from the aCol[] array. */ + ** column from the aCol[] array. */ if( rc==SQLITE_OK && zLanguageid ){ int j; for(j=0; j0 ){ @@ -163415,7 +163415,7 @@ static int fts3InitVtab( for(i=0; iazColumn[iCol], zNot, n) + && 0==sqlite3_strnicmp(p->azColumn[iCol], zNot, n) ){ p->abNotindexed[iCol] = 1; sqlite3_free(zNot); @@ -163439,7 +163439,7 @@ static int fts3InitVtab( p->zWriteExprlist = fts3WriteExprList(p, zCompress, &rc); if( rc!=SQLITE_OK ) goto fts3_init_out; - /* If this is an xCreate call, create the underlying tables in the + /* If this is an xCreate call, create the underlying tables in the ** database. TODO: For xConnect(), it could verify that said tables exist. */ if( isCreate ){ @@ -163535,11 +163535,11 @@ static void fts3SetUniqueFlag(sqlite3_index_info *pIdxInfo){ #endif } -/* +/* ** Implementation of the xBestIndex method for FTS3 tables. There ** are three possible strategies, in order of preference: ** -** 1. Direct lookup by rowid or docid. +** 1. Direct lookup by rowid or docid. ** 2. Full-text search using a MATCH operator on a non-docid column. ** 3. Linear scan of %_content table. */ @@ -163554,7 +163554,7 @@ static int fts3BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ int iIdx; /* By default use a full table scan. This is an expensive option, - ** so search through the constraints to see if a more efficient + ** so search through the constraints to see if a more efficient ** strategy is possible. */ pInfo->idxNum = FTS3_FULLSCAN_SEARCH; @@ -163590,12 +163590,12 @@ static int fts3BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ ** ** If there is more than one MATCH constraint available, use the first ** one encountered. If there is both a MATCH constraint and a direct - ** rowid/docid lookup, prefer the MATCH strategy. This is done even + ** rowid/docid lookup, prefer the MATCH strategy. This is done even ** though the rowid/docid lookup is faster than a MATCH query, selecting - ** it would lead to an "unable to use function MATCH in the requested + ** it would lead to an "unable to use function MATCH in the requested ** context" error. */ - if( pCons->op==SQLITE_INDEX_CONSTRAINT_MATCH + if( pCons->op==SQLITE_INDEX_CONSTRAINT_MATCH && pCons->iColumn>=0 && pCons->iColumn<=p->nColumn ){ pInfo->idxNum = FTS3_FULLTEXT_SEARCH + pCons->iColumn; @@ -163604,7 +163604,7 @@ static int fts3BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ } /* Equality constraint on the langid column */ - if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ + if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ && pCons->iColumn==p->nColumn + 2 ){ iLangidCons = i; @@ -163632,22 +163632,22 @@ static int fts3BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ if( iCons>=0 ){ pInfo->aConstraintUsage[iCons].argvIndex = iIdx++; pInfo->aConstraintUsage[iCons].omit = 1; - } + } if( iLangidCons>=0 ){ pInfo->idxNum |= FTS3_HAVE_LANGID; pInfo->aConstraintUsage[iLangidCons].argvIndex = iIdx++; - } + } if( iDocidGe>=0 ){ pInfo->idxNum |= FTS3_HAVE_DOCID_GE; pInfo->aConstraintUsage[iDocidGe].argvIndex = iIdx++; - } + } if( iDocidLe>=0 ){ pInfo->idxNum |= FTS3_HAVE_DOCID_LE; pInfo->aConstraintUsage[iDocidLe].argvIndex = iIdx++; - } + } /* Regardless of the strategy selected, FTS can deliver rows in rowid (or - ** docid) order. Both ascending and descending are possible. + ** docid) order. Both ascending and descending are possible. */ if( pInfo->nOrderBy==1 ){ struct sqlite3_index_orderby *pOrder = &pInfo->aOrderBy[0]; @@ -163674,7 +163674,7 @@ static int fts3OpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){ UNUSED_PARAMETER(pVTab); /* Allocate a buffer large enough for an Fts3Cursor structure. If the - ** allocation succeeds, zero it and return SQLITE_OK. Otherwise, + ** allocation succeeds, zero it and return SQLITE_OK. Otherwise, ** if the allocation fails, return SQLITE_NOMEM. */ *ppCsr = pCsr = (sqlite3_vtab_cursor *)sqlite3_malloc(sizeof(Fts3Cursor)); @@ -163762,7 +163762,7 @@ static int fts3CursorSeekStmt(Fts3Cursor *pCsr){ /* ** Position the pCsr->pStmt statement so that it is on the row ** of the %_content table that contains the last match. Return -** SQLITE_OK on success. +** SQLITE_OK on success. */ static int fts3CursorSeek(sqlite3_context *pContext, Fts3Cursor *pCsr){ int rc = SQLITE_OK; @@ -163794,7 +163794,7 @@ static int fts3CursorSeek(sqlite3_context *pContext, Fts3Cursor *pCsr){ /* ** This function is used to process a single interior node when searching -** a b-tree for a term or term prefix. The node data is passed to this +** a b-tree for a term or term prefix. The node data is passed to this ** function via the zNode/nNode parameters. The term to search for is ** passed in zTerm/nTerm. ** @@ -163823,9 +163823,9 @@ static int fts3ScanInteriorNode( int isFirstTerm = 1; /* True when processing first term on page */ sqlite3_int64 iChild; /* Block id of child node to descend to */ - /* Skip over the 'height' varint that occurs at the start of every + /* Skip over the 'height' varint that occurs at the start of every ** interior node. Then load the blockid of the left-child of the b-tree - ** node into variable iChild. + ** node into variable iChild. ** ** Even if the data structure on disk is corrupted, this (reading two ** varints from the buffer) does not risk an overread. If zNode is a @@ -163841,13 +163841,13 @@ static int fts3ScanInteriorNode( if( zCsr>zEnd ){ return FTS_CORRUPT_VTAB; } - + while( zCsr=0 && nSuffix>=0 ); if( nPrefix>zCsr-zNode || nSuffix>zEnd-zCsr || nSuffix==0 ){ rc = FTS_CORRUPT_VTAB; @@ -163878,8 +163878,8 @@ static int fts3ScanInteriorNode( /* Compare the term we are searching for with the term just loaded from ** the interior node. If the specified term is greater than or equal - ** to the term from the interior node, then all terms on the sub-tree - ** headed by node iChild are smaller than zTerm. No need to search + ** to the term from the interior node, then all terms on the sub-tree + ** headed by node iChild are smaller than zTerm. No need to search ** iChild. ** ** If the interior node term is larger than the specified term, then @@ -163915,20 +163915,20 @@ static int fts3ScanInteriorNode( ** node for the range of leaf nodes that may contain the specified term ** or terms for which the specified term is a prefix. ** -** If piLeaf is not NULL, then *piLeaf is set to the blockid of the +** If piLeaf is not NULL, then *piLeaf is set to the blockid of the ** left-most leaf node in the tree that may contain the specified term. ** If piLeaf2 is not NULL, then *piLeaf2 is set to the blockid of the ** right-most leaf node that may contain a term for which the specified ** term is a prefix. ** -** It is possible that the range of returned leaf nodes does not contain -** the specified term or any terms for which it is a prefix. However, if the +** It is possible that the range of returned leaf nodes does not contain +** the specified term or any terms for which it is a prefix. However, if the ** segment does contain any such terms, they are stored within the identified ** range. Because this function only inspects interior segment nodes (and ** never loads leaf nodes into memory), it is not possible to be sure. ** ** If an error occurs, an error code other than SQLITE_OK is returned. -*/ +*/ static int fts3SelectLeaf( Fts3Table *p, /* Virtual table handle */ const char *zTerm, /* Term to select leaves for */ @@ -163974,7 +163974,7 @@ static int fts3SelectLeaf( } /* -** This function is used to create delta-encoded serialized lists of FTS3 +** This function is used to create delta-encoded serialized lists of FTS3 ** varints. Each call to this function appends a single varint to a list. */ static void fts3PutDeltaVarint( @@ -163988,11 +163988,11 @@ static void fts3PutDeltaVarint( } /* -** When this function is called, *ppPoslist is assumed to point to the +** When this function is called, *ppPoslist is assumed to point to the ** start of a position-list. After it returns, *ppPoslist points to the ** first byte after the position-list. ** -** A position list is list of positions (delta encoded) and columns for +** A position list is list of positions (delta encoded) and columns for ** a single document record of a doclist. So, in other words, this ** routine advances *ppPoslist so that it points to the next docid in ** the doclist, or to the first byte past the end of the doclist. @@ -164005,12 +164005,12 @@ static void fts3PoslistCopy(char **pp, char **ppPoslist){ char *pEnd = *ppPoslist; char c = 0; - /* The end of a position list is marked by a zero encoded as an FTS3 + /* The end of a position list is marked by a zero encoded as an FTS3 ** varint. A single POS_END (0) byte. Except, if the 0 byte is preceded by ** a byte with the 0x80 bit set, then it is not a varint 0, but the tail ** of some other, multi-byte, value. ** - ** The following while-loop moves pEnd to point to the first byte that is not + ** The following while-loop moves pEnd to point to the first byte that is not ** immediately preceded by a byte with the 0x80 bit set. Then increments ** pEnd once more so that it points to the byte immediately following the ** last byte in the position-list. @@ -164032,7 +164032,7 @@ static void fts3PoslistCopy(char **pp, char **ppPoslist){ } /* -** When this function is called, *ppPoslist is assumed to point to the +** When this function is called, *ppPoslist is assumed to point to the ** start of a column-list. After it returns, *ppPoslist points to the ** to the terminator (POS_COLUMN or POS_END) byte of the column-list. ** @@ -164083,7 +164083,7 @@ static void fts3ColumnlistCopy(char **pp, char **ppPoslist){ ** (in which case **pp will be a terminator bytes POS_END (0) or ** (1)). ** -** If *pp points past the end of the current position-list, set *pi to +** If *pp points past the end of the current position-list, set *pi to ** POSITION_LIST_END and return. Otherwise, read the next varint from *pp, ** increment the current value of *pi by the value read, and set *pp to ** point to the next value before returning. @@ -164111,7 +164111,7 @@ static void fts3ReadNextPos( ** the value of iCol encoded as a varint to *pp. This will start a new ** column list. ** -** Set *pp to point to the byte just after the last byte written before +** Set *pp to point to the byte just after the last byte written before ** returning (do not modify it if iCol==0). Return the total number of bytes ** written (0 if iCol==0). */ @@ -164146,7 +164146,7 @@ static int fts3PoslistMerge( int iCol1; /* The current column index in pp1 */ int iCol2; /* The current column index in pp2 */ - if( *p1==POS_COLUMN ){ + if( *p1==POS_COLUMN ){ fts3GetVarint32(&p1[1], &iCol1); if( iCol1==0 ) return FTS_CORRUPT_VTAB; } @@ -164170,7 +164170,7 @@ static int fts3PoslistMerge( /* At this point, both p1 and p2 point to the start of column-lists ** for the same column (the column with index iCol1 and iCol2). - ** A column-list is a list of non-negative delta-encoded varints, each + ** A column-list is a list of non-negative delta-encoded varints, each ** incremented by 2 before being stored. Each list is terminated by a ** POS_END (0) or POS_COLUMN (1). The following block merges the two lists ** and writes the results to buffer p. p is left pointing to the byte @@ -164180,7 +164180,7 @@ static int fts3PoslistMerge( fts3GetDeltaVarint(&p1, &i1); fts3GetDeltaVarint(&p2, &i2); do { - fts3PutDeltaVarint(&p, &iPrev, (i1pos(*pp1) && pos(*pp2)-pos(*pp1)<=nToken). i.e. ** when the *pp1 token appears before the *pp2 token, but not more than nToken @@ -164248,11 +164248,11 @@ static int fts3PoslistPhraseMerge( assert( isSaveLeft==0 || isExact==0 ); assert( p!=0 && *p1!=0 && *p2!=0 ); - if( *p1==POS_COLUMN ){ + if( *p1==POS_COLUMN ){ p1++; p1 += fts3GetVarint32(p1, &iCol1); } - if( *p2==POS_COLUMN ){ + if( *p2==POS_COLUMN ){ p2++; p2 += fts3GetVarint32(p2, &iCol2); } @@ -164274,8 +164274,8 @@ static int fts3PoslistPhraseMerge( if( iPos1<0 || iPos2<0 ) break; while( 1 ){ - if( iPos2==iPos1+nToken - || (isExact==0 && iPos2>iPos1 && iPos2<=iPos1+nToken) + if( iPos2==iPos1+nToken + || (isExact==0 && iPos2>iPos1 && iPos2<=iPos1+nToken) ){ sqlite3_int64 iSave; iSave = isSaveLeft ? iPos1 : iPos2; @@ -164310,8 +164310,8 @@ static int fts3PoslistPhraseMerge( /* Advance pointer p1 or p2 (whichever corresponds to the smaller of ** iCol1 and iCol2) so that it points to either the 0x00 that marks the - ** end of the position list, or the 0x01 that precedes the next - ** column-number in the position list. + ** end of the position list, or the 0x01 that precedes the next + ** column-number in the position list. */ else if( iCol1bDescIdx, + int rc = fts3DoclistOrMerge(p->bDescIdx, pTS->aaOutput[i], pTS->anOutput[i], aOut, nOut, &aNew, &nNew ); if( rc!=SQLITE_OK ){ @@ -164779,15 +164779,15 @@ static int fts3TermSelectMerge( ){ if( pTS->aaOutput[0]==0 ){ /* If this is the first term selected, copy the doclist to the output - ** buffer using memcpy(). + ** buffer using memcpy(). ** - ** Add FTS3_VARINT_MAX bytes of unused space to the end of the + ** Add FTS3_VARINT_MAX bytes of unused space to the end of the ** allocation. This is so as to ensure that the buffer is big enough ** to hold the current doclist AND'd with any other doclist. If the ** doclists are stored in order=ASC order, this padding would not be ** required (since the size of [doclistA AND doclistB] is always less ** than or equal to the size of [doclistA] in that case). But this is - ** not true for order=DESC. For example, a doclist containing (1, -1) + ** not true for order=DESC. For example, a doclist containing (1, -1) ** may be smaller than (-1), as in the first example the -1 may be stored ** as a single-byte delta, whereas in the second it must be stored as a ** FTS3_VARINT_MAX byte varint. @@ -164817,7 +164817,7 @@ static int fts3TermSelectMerge( char *aNew; int nNew; - int rc = fts3DoclistOrMerge(p->bDescIdx, aMerge, nMerge, + int rc = fts3DoclistOrMerge(p->bDescIdx, aMerge, nMerge, pTS->aaOutput[iOut], pTS->anOutput[iOut], &aNew, &nNew ); if( rc!=SQLITE_OK ){ @@ -164828,7 +164828,7 @@ static int fts3TermSelectMerge( if( aMerge!=aDoclist ) sqlite3_free(aMerge); sqlite3_free(pTS->aaOutput[iOut]); pTS->aaOutput[iOut] = 0; - + aMerge = aNew; nMerge = nNew; if( (iOut+1)==SizeofArray(pTS->aaOutput) ){ @@ -164845,7 +164845,7 @@ static int fts3TermSelectMerge( ** Append SegReader object pNew to the end of the pCsr->apSegment[] array. */ static int fts3SegReaderCursorAppend( - Fts3MultiSegReader *pCsr, + Fts3MultiSegReader *pCsr, Fts3SegReader *pNew ){ if( (pCsr->nSegment%16)==0 ){ @@ -164884,10 +164884,10 @@ static int fts3SegReaderCursor( sqlite3_stmt *pStmt = 0; /* Statement to iterate through segments */ int rc2; /* Result of sqlite3_reset() */ - /* If iLevel is less than 0 and this is not a scan, include a seg-reader + /* If iLevel is less than 0 and this is not a scan, include a seg-reader ** for the pending-terms. If this is a scan, then this call must be being ** made by an fts4aux module, not an FTS table. In this case calling - ** Fts3SegReaderPending might segfault, as the data structures used by + ** Fts3SegReaderPending might segfault, as the data structures used by ** fts4aux are not completely populated. So it's easiest to filter these ** calls out here. */ if( iLevel<0 && p->aIndex ){ @@ -164921,10 +164921,10 @@ static int fts3SegReaderCursor( if( rc!=SQLITE_OK ) goto finished; if( isPrefix==0 && isScan==0 ) iLeavesEndBlock = iStartBlock; } - - rc = sqlite3Fts3SegReaderNew(pCsr->nSegment+1, + + rc = sqlite3Fts3SegReaderNew(pCsr->nSegment+1, (isPrefix==0 && isScan==0), - iStartBlock, iLeavesEndBlock, + iStartBlock, iLeavesEndBlock, iEndBlock, zRoot, nRoot, &pSeg ); if( rc!=SQLITE_OK ) goto finished; @@ -164940,7 +164940,7 @@ static int fts3SegReaderCursor( } /* -** Set up a cursor object for iterating through a full-text index or a +** Set up a cursor object for iterating through a full-text index or a ** single level therein. */ SQLITE_PRIVATE int sqlite3Fts3SegReaderCursor( @@ -164956,7 +164956,7 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderCursor( ){ assert( iIndex>=0 && iIndexnIndex ); assert( iLevel==FTS3_SEGCURSOR_ALL - || iLevel==FTS3_SEGCURSOR_PENDING + || iLevel==FTS3_SEGCURSOR_PENDING || iLevel>=0 ); assert( iLevelnIndex; i++){ if( p->aIndex[i].nPrefix==nTerm ){ bFound = 1; - rc = sqlite3Fts3SegReaderCursor(p, pCsr->iLangid, + rc = sqlite3Fts3SegReaderCursor(p, pCsr->iLangid, i, FTS3_SEGCURSOR_ALL, zTerm, nTerm, 0, 0, pSegcsr ); pSegcsr->bLookup = 1; @@ -165030,7 +165030,7 @@ static int fts3TermSegReaderCursor( for(i=1; bFound==0 && inIndex; i++){ if( p->aIndex[i].nPrefix==nTerm+1 ){ bFound = 1; - rc = sqlite3Fts3SegReaderCursor(p, pCsr->iLangid, + rc = sqlite3Fts3SegReaderCursor(p, pCsr->iLangid, i, FTS3_SEGCURSOR_ALL, zTerm, nTerm, 1, 0, pSegcsr ); if( rc==SQLITE_OK ){ @@ -165043,7 +165043,7 @@ static int fts3TermSegReaderCursor( } if( bFound==0 ){ - rc = sqlite3Fts3SegReaderCursor(p, pCsr->iLangid, + rc = sqlite3Fts3SegReaderCursor(p, pCsr->iLangid, 0, FTS3_SEGCURSOR_ALL, zTerm, nTerm, isPrefix, 0, pSegcsr ); pSegcsr->bLookup = !isPrefix; @@ -165091,7 +165091,7 @@ static int fts3TermSelect( rc = sqlite3Fts3SegReaderStart(p, pSegcsr, &filter); while( SQLITE_OK==rc - && SQLITE_ROW==(rc = sqlite3Fts3SegReaderStep(p, pSegcsr)) + && SQLITE_ROW==(rc = sqlite3Fts3SegReaderStep(p, pSegcsr)) ){ rc = fts3TermSelectMerge(p, &tsc, pSegcsr->aDoclist, pSegcsr->nDoclist); } @@ -165120,7 +165120,7 @@ static int fts3TermSelect( ** ** If the isPoslist argument is true, then it is assumed that the doclist ** contains a position-list following each docid. Otherwise, it is assumed -** that the doclist is simply a list of docids stored as delta encoded +** that the doclist is simply a list of docids stored as delta encoded ** varints. */ static int fts3DoclistCountDocids(char *aList, int nList){ @@ -165259,7 +165259,7 @@ static int fts3FilterMethod( assert( p->base.zErrMsg==0 ); rc = sqlite3Fts3ExprParse(p->pTokenizer, pCsr->iLangid, - p->azColumn, p->bFts4, p->nColumn, iCol, zQuery, -1, &pCsr->pExpr, + p->azColumn, p->bFts4, p->nColumn, iCol, zQuery, -1, &pCsr->pExpr, &p->base.zErrMsg ); if( rc!=SQLITE_OK ){ @@ -165286,7 +165286,7 @@ static int fts3FilterMethod( (pCsr->bDesc ? "DESC" : "ASC") ); }else{ - zSql = sqlite3_mprintf("SELECT %s ORDER BY rowid %s", + zSql = sqlite3_mprintf("SELECT %s ORDER BY rowid %s", p->zReadExprlist, (pCsr->bDesc ? "DESC" : "ASC") ); } @@ -165307,8 +165307,8 @@ static int fts3FilterMethod( return fts3NextMethod(pCursor); } -/* -** This is the xEof method of the virtual table. SQLite calls this +/* +** This is the xEof method of the virtual table. SQLite calls this ** routine to find out if it has reached the end of a result set. */ static int fts3EofMethod(sqlite3_vtab_cursor *pCursor){ @@ -165320,7 +165320,7 @@ static int fts3EofMethod(sqlite3_vtab_cursor *pCursor){ return pCsr->isEof; } -/* +/* ** This is the xRowid method. The SQLite core calls this routine to ** retrieve the rowid for the current row of the result set. fts3 ** exposes %_content.docid as the rowid for the virtual table. The @@ -165332,7 +165332,7 @@ static int fts3RowidMethod(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){ return SQLITE_OK; } -/* +/* ** This is the xColumn method, called by SQLite to request a value from ** the row that the supplied cursor currently points to. ** @@ -165392,8 +165392,8 @@ static int fts3ColumnMethod( return rc; } -/* -** This function is the implementation of the xUpdate callback used by +/* +** This function is the implementation of the xUpdate callback used by ** FTS3 virtual tables. It is invoked by SQLite each time a row is to be ** inserted, updated or deleted. */ @@ -165428,7 +165428,7 @@ static int fts3SyncMethod(sqlite3_vtab *pVtab){ ** ** Of course, updating the input segments also involves deleting a bunch ** of blocks from the segments table. But this is not considered overhead - ** as it would also be required by a crisis-merge that used the same input + ** as it would also be required by a crisis-merge that used the same input ** segments. */ const u32 nMinMerge = 64; /* Minimum amount of incr-merge work to do */ @@ -165438,8 +165438,8 @@ static int fts3SyncMethod(sqlite3_vtab *pVtab){ i64 iLastRowid = sqlite3_last_insert_rowid(p->db); rc = sqlite3Fts3PendingTermsFlush(p); - if( rc==SQLITE_OK - && p->nLeafAdd>(nMinMerge/16) + if( rc==SQLITE_OK + && p->nLeafAdd>(nMinMerge/16) && p->nAutoincrmerge && p->nAutoincrmerge!=0xff ){ int mxLevel = 0; /* Maximum relative level value in db */ @@ -165478,7 +165478,7 @@ static int fts3SetHasStat(Fts3Table *p){ } /* -** Implementation of xBegin() method. +** Implementation of xBegin() method. */ static int fts3BeginMethod(sqlite3_vtab *pVtab){ Fts3Table *p = (Fts3Table*)pVtab; @@ -165534,17 +165534,17 @@ static void fts3ReversePoslist(char *pStart, char **ppPoslist){ /* Skip backwards passed any trailing 0x00 bytes added by NearTrim() */ while( p>pStart && (c=*p--)==0 ); - /* Search backwards for a varint with value zero (the end of the previous + /* Search backwards for a varint with value zero (the end of the previous ** poslist). This is an 0x00 byte preceded by some byte that does not ** have the 0x80 bit set. */ - while( p>pStart && (*p & 0x80) | c ){ - c = *p--; + while( p>pStart && (*p & 0x80) | c ){ + c = *p--; } assert( p==pStart || c==0 ); /* At this point p points to that preceding byte without the 0x80 bit ** set. So to find the start of the poslist, skip forward 2 bytes then - ** over a varint. + ** over a varint. ** ** Normally. The other case is that p==pStart and the poslist to return ** is the first in the doclist. In this case do not skip forward 2 bytes. @@ -165565,7 +165565,7 @@ static void fts3ReversePoslist(char *pStart, char **ppPoslist){ ** offsets() and optimize() SQL functions. ** ** If the value passed as the third argument is a blob of size -** sizeof(Fts3Cursor*), then the blob contents are copied to the +** sizeof(Fts3Cursor*), then the blob contents are copied to the ** output variable *ppCsr and SQLITE_OK is returned. Otherwise, an error ** message is written to context pContext and SQLITE_ERROR returned. The ** string passed via zFunc is used as part of the error message. @@ -165610,7 +165610,7 @@ static void fts3SnippetFunc( assert( nVal>=1 ); if( nVal>6 ){ - sqlite3_result_error(pContext, + sqlite3_result_error(pContext, "wrong number of arguments to function snippet()", -1); return; } @@ -165652,8 +165652,8 @@ static void fts3OffsetsFunc( } } -/* -** Implementation of the special optimize() function for FTS3. This +/* +** Implementation of the special optimize() function for FTS3. This ** function merges all segments in the database to a single segment. ** Example usage is: ** @@ -165762,10 +165762,10 @@ static int fts3RenameMethod( /* At this point it must be known if the %_stat table exists or not. ** So bHasStat may not be 2. */ rc = fts3SetHasStat(p); - + /* As it happens, the pending terms table is always empty here. This is - ** because an "ALTER TABLE RENAME TABLE" statement inside a transaction - ** always opens a savepoint transaction. And the xSavepoint() method + ** because an "ALTER TABLE RENAME TABLE" statement inside a transaction + ** always opens a savepoint transaction. And the xSavepoint() method ** flushes the pending terms table. But leave the (no-op) call to ** PendingTermsFlush() in in case that changes. */ @@ -165856,7 +165856,7 @@ static int fts3RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){ */ static int fts3ShadowName(const char *zName){ static const char *azName[] = { - "content", "docsize", "segdir", "segments", "stat", + "content", "docsize", "segdir", "segments", "stat", }; unsigned int i; for(i=0; ipPhrase->aToken[i]; - int rc = fts3TermSegReaderCursor(pCsr, + int rc = fts3TermSegReaderCursor(pCsr, pToken->z, pToken->n, pToken->isPrefix, &pToken->pSegcsr ); if( rc!=SQLITE_OK ){ @@ -166258,7 +166258,7 @@ static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){ sqlite3_free(aPoslist); return SQLITE_NOMEM; } - + pPhrase->doclist.pList = aOut; if( fts3PoslistPhraseMerge(&aOut, nDistance, 0, 1, &p1, &p2) ){ pPhrase->doclist.bFreeList = 1; @@ -166283,7 +166283,7 @@ static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){ #define MAX_INCR_PHRASE_TOKENS 4 /* -** This function is called for each Fts3Phrase in a full-text query +** This function is called for each Fts3Phrase in a full-text query ** expression to initialize the mechanism for returning rows. Once this ** function has been called successfully on an Fts3Phrase, it may be ** used with fts3EvalPhraseNext() to iterate through the matching docids. @@ -166301,12 +166301,12 @@ static int fts3EvalPhraseStart(Fts3Cursor *pCsr, int bOptOk, Fts3Phrase *p){ /* Determine if doclists may be loaded from disk incrementally. This is ** possible if the bOptOk argument is true, the FTS doclists will be - ** scanned in forward order, and the phrase consists of + ** scanned in forward order, and the phrase consists of ** MAX_INCR_PHRASE_TOKENS or fewer tokens, none of which are are "^first" ** tokens or prefix tokens that cannot use a prefix-index. */ int bHaveIncr = 0; - int bIncrOk = (bOptOk - && pCsr->bDesc==pTab->bDescIdx + int bIncrOk = (bOptOk + && pCsr->bDesc==pTab->bDescIdx && p->nToken<=MAX_INCR_PHRASE_TOKENS && p->nToken>0 #ifdef SQLITE_TEST && pTab->bNoIncrDoclist==0 @@ -166342,12 +166342,12 @@ static int fts3EvalPhraseStart(Fts3Cursor *pCsr, int bOptOk, Fts3Phrase *p){ } /* -** This function is used to iterate backwards (from the end to start) +** This function is used to iterate backwards (from the end to start) ** through doclists. It is used by this module to iterate through phrase ** doclists in reverse and by the fts3_write.c module to iterate through ** pending-terms lists when writing to databases with "order=desc". ** -** The doclist may be sorted in ascending (parameter bDescIdx==0) or +** The doclist may be sorted in ascending (parameter bDescIdx==0) or ** descending (parameter bDescIdx==1) order of docid. Regardless, this ** function iterates from the end of the doclist to the beginning. */ @@ -166427,7 +166427,7 @@ SQLITE_PRIVATE void sqlite3Fts3DoclistNext( p += sqlite3Fts3GetVarint(p, piDocid); }else{ fts3PoslistCopy(0, &p); - while( p<&aDoclist[nDoclist] && *p==0 ) p++; + while( p<&aDoclist[nDoclist] && *p==0 ) p++; if( p>=&aDoclist[nDoclist] ){ *pbEof = 1; }else{ @@ -166451,7 +166451,7 @@ static void fts3EvalDlPhraseNext( ){ char *pIter; /* Used to iterate through aAll */ char *pEnd = &pDL->aAll[pDL->nAll]; /* 1 byte past end of aAll */ - + if( pDL->pNextDocid ){ pIter = pDL->pNextDocid; }else{ @@ -166499,12 +166499,12 @@ struct TokenDoclist { }; /* -** Token pToken is an incrementally loaded token that is part of a +** Token pToken is an incrementally loaded token that is part of a ** multi-token phrase. Advance it to the next matching document in the ** database and populate output variable *p with the details of the new ** entry. Or, if the iterator has reached EOF, set *pbEof to true. ** -** If an error occurs, return an SQLite error code. Otherwise, return +** If an error occurs, return an SQLite error code. Otherwise, return ** SQLITE_OK. */ static int incrPhraseTokenNext( @@ -166545,18 +166545,18 @@ static int incrPhraseTokenNext( /* ** The phrase iterator passed as the second argument: ** -** * features at least one token that uses an incremental doclist, and +** * features at least one token that uses an incremental doclist, and ** ** * does not contain any deferred tokens. ** ** Advance it to the next matching documnent in the database and populate -** the Fts3Doclist.pList and nList fields. +** the Fts3Doclist.pList and nList fields. ** ** If there is no "next" entry and no error occurs, then *pbEof is set to ** 1 before returning. Otherwise, if no error occurs and the iterator is ** successfully advanced, *pbEof is set to 0. ** -** If an error occurs, return an SQLite error code. Otherwise, return +** If an error occurs, return an SQLite error code. Otherwise, return ** SQLITE_OK. */ static int fts3EvalIncrPhraseNext( @@ -166574,7 +166574,7 @@ static int fts3EvalIncrPhraseNext( assert( p->bIncr==1 ); if( p->nToken==1 ){ - rc = sqlite3Fts3MsrIncrNext(pTab, p->aToken[0].pSegcsr, + rc = sqlite3Fts3MsrIncrNext(pTab, p->aToken[0].pSegcsr, &pDL->iDocid, &pDL->pList, &pDL->nList ); if( pDL->pList==0 ) bEof = 1; @@ -166604,8 +166604,8 @@ static int fts3EvalIncrPhraseNext( /* Keep advancing iterators until they all point to the same document */ for(i=0; inToken; i++){ - while( rc==SQLITE_OK && bEof==0 - && a[i].bIgnore==0 && DOCID_CMP(a[i].iDocid, iMax)<0 + while( rc==SQLITE_OK && bEof==0 + && a[i].bIgnore==0 && DOCID_CMP(a[i].iDocid, iMax)<0 ){ rc = incrPhraseTokenNext(pTab, p, i, &a[i], &bEof); if( DOCID_CMP(a[i].iDocid, iMax)>0 ){ @@ -166652,8 +166652,8 @@ static int fts3EvalIncrPhraseNext( } /* -** Attempt to move the phrase iterator to point to the next matching docid. -** If an error occurs, return an SQLite error code. Otherwise, return +** Attempt to move the phrase iterator to point to the next matching docid. +** If an error occurs, return an SQLite error code. Otherwise, return ** SQLITE_OK. ** ** If there is no "next" entry and no error occurs, then *pbEof is set to @@ -166672,7 +166672,7 @@ static int fts3EvalPhraseNext( if( p->bIncr ){ rc = fts3EvalIncrPhraseNext(pCsr, p, pbEof); }else if( pCsr->bDesc!=pTab->bDescIdx && pDL->nAll ){ - sqlite3Fts3DoclistPrev(pTab->bDescIdx, pDL->aAll, pDL->nAll, + sqlite3Fts3DoclistPrev(pTab->bDescIdx, pDL->aAll, pDL->nAll, &pDL->pNextDocid, &pDL->iDocid, &pDL->nList, pbEof ); pDL->pList = pDL->pNextDocid; @@ -166732,7 +166732,7 @@ static void fts3EvalStartReaders( ** Tokens are divided into AND/NEAR clusters. All tokens in a cluster belong ** to phrases that are connected only by AND and NEAR operators (not OR or ** NOT). When determining tokens to defer, each AND/NEAR cluster is considered -** separately. The root of a tokens AND/NEAR cluster is stored in +** separately. The root of a tokens AND/NEAR cluster is stored in ** Fts3TokenAndCost.pRoot. */ typedef struct Fts3TokenAndCost Fts3TokenAndCost; @@ -166800,7 +166800,7 @@ static void fts3EvalTokenCosts( ** write this value to *pnPage and return SQLITE_OK. Otherwise, return ** an SQLite error code. ** -** The average document size in pages is calculated by first calculating +** The average document size in pages is calculated by first calculating ** determining the average size in bytes, B. If B is less than the amount ** of data that will fit on a single leaf page of an intkey table in ** this database, then the average docsize is 1. Otherwise, it is 1 plus @@ -166810,10 +166810,10 @@ static int fts3EvalAverageDocsize(Fts3Cursor *pCsr, int *pnPage){ int rc = SQLITE_OK; if( pCsr->nRowAvg==0 ){ /* The average document size, which is required to calculate the cost - ** of each doclist, has not yet been determined. Read the required + ** of each doclist, has not yet been determined. Read the required ** data from the %_stat table to calculate it. ** - ** Entry 0 of the %_stat table is a blob containing (nCol+1) FTS3 + ** Entry 0 of the %_stat table is a blob containing (nCol+1) FTS3 ** varints, where nCol is the number of columns in the FTS3 table. ** The first varint is the number of documents currently stored in ** the table. The following nCol varints contain the total amount of @@ -166844,7 +166844,7 @@ static int fts3EvalAverageDocsize(Fts3Cursor *pCsr, int *pnPage){ pCsr->nDoc = nDoc; pCsr->nRowAvg = (int)(((nByte / nDoc) + p->nPgsz) / p->nPgsz); - assert( pCsr->nRowAvg>0 ); + assert( pCsr->nRowAvg>0 ); rc = sqlite3_reset(pStmt); } @@ -166853,11 +166853,11 @@ static int fts3EvalAverageDocsize(Fts3Cursor *pCsr, int *pnPage){ } /* -** This function is called to select the tokens (if any) that will be +** This function is called to select the tokens (if any) that will be ** deferred. The array aTC[] has already been populated when this is ** called. ** -** This function is called once for each AND/NEAR cluster in the +** This function is called once for each AND/NEAR cluster in the ** expression. Each invocation determines which tokens to defer within ** the cluster with root node pRoot. See comments above the definition ** of struct Fts3TokenAndCost for more details. @@ -166907,8 +166907,8 @@ static int fts3EvalSelectDeferred( assert( rc!=SQLITE_OK || nDocSize>0 ); - /* Iterate through all tokens in this AND/NEAR cluster, in ascending order - ** of the number of overflow pages that will be loaded by the pager layer + /* Iterate through all tokens in this AND/NEAR cluster, in ascending order + ** of the number of overflow pages that will be loaded by the pager layer ** to retrieve the entire doclist for the token from the full-text index. ** Load the doclists for tokens that are either: ** @@ -166919,7 +166919,7 @@ static int fts3EvalSelectDeferred( ** ** After each token doclist is loaded, merge it with the others from the ** same phrase and count the number of documents that the merged doclist - ** contains. Set variable "nMinEst" to the smallest number of documents in + ** contains. Set variable "nMinEst" to the smallest number of documents in ** any phrase doclist for which 1 or more token doclists have been loaded. ** Let nOther be the number of other phrases for which it is certain that ** one or more tokens will not be deferred. @@ -166935,8 +166935,8 @@ static int fts3EvalSelectDeferred( /* Set pTC to point to the cheapest remaining token. */ for(iTC=0; iTCnOvfl) + if( aTC[iTC].pToken && aTC[iTC].pRoot==pRoot + && (!pTC || aTC[iTC].nOvflnOvfl) ){ pTC = &aTC[iTC]; } @@ -166945,7 +166945,7 @@ static int fts3EvalSelectDeferred( if( ii && pTC->nOvfl>=((nMinEst+(nLoad4/4)-1)/(nLoad4/4))*nDocSize ){ /* The number of overflow pages to load for this (and therefore all - ** subsequent) tokens is greater than the estimated number of pages + ** subsequent) tokens is greater than the estimated number of pages ** that will be loaded if all subsequent tokens are deferred. */ Fts3PhraseToken *pToken = pTC->pToken; @@ -166954,7 +166954,7 @@ static int fts3EvalSelectDeferred( pToken->pSegcsr = 0; }else{ /* Set nLoad4 to the value of (4^nOther) for the next iteration of the - ** for-loop. Except, limit the value to 2^24 to prevent it from + ** for-loop. Except, limit the value to 2^24 to prevent it from ** overflowing the 32-bit integer it is stored in. */ if( ii<12 ) nLoad4 = nLoad4*4; @@ -167076,7 +167076,7 @@ static void fts3EvalInvalidatePoslist(Fts3Phrase *pPhrase){ ** close to a position in the *paPoslist position list are removed. If this ** leaves 0 positions, zero is returned. Otherwise, non-zero. ** -** Before returning, *paPoslist is set to point to the position lsit +** Before returning, *paPoslist is set to point to the position lsit ** associated with pPhrase. And *pnToken is set to the number of tokens in ** pPhrase. */ @@ -167090,8 +167090,8 @@ static int fts3EvalNearTrim( int nParam1 = nNear + pPhrase->nToken; int nParam2 = nNear + *pnToken; int nNew; - char *p2; - char *pOut; + char *p2; + char *pOut; int res; assert( pPhrase->doclist.pList ); @@ -167138,19 +167138,19 @@ static int fts3EvalNearTrim( ** ** 1. Deferred tokens are not taken into account. If a phrase consists ** entirely of deferred tokens, it is assumed to match every row in -** the db. In this case the position-list is not populated at all. +** the db. In this case the position-list is not populated at all. ** ** Or, if a phrase contains one or more deferred tokens and one or -** more non-deferred tokens, then the expression is advanced to the +** more non-deferred tokens, then the expression is advanced to the ** next possible match, considering only non-deferred tokens. In other ** words, if the phrase is "A B C", and "B" is deferred, the expression -** is advanced to the next row that contains an instance of "A * C", +** is advanced to the next row that contains an instance of "A * C", ** where "*" may match any single token. The position list in this case ** is populated as for "A * C" before returning. ** -** 2. NEAR is treated as AND. If the expression is "x NEAR y", it is +** 2. NEAR is treated as AND. If the expression is "x NEAR y", it is ** advanced to point to the next row that matches "x AND y". -** +** ** See sqlite3Fts3EvalTestDeferred() for details on testing if a row is ** really a match, taking into account deferred tokens and NEAR operators. */ @@ -167218,7 +167218,7 @@ static void fts3EvalNextRow( } break; } - + case FTSQUERY_OR: { Fts3Expr *pLeft = pExpr->pLeft; Fts3Expr *pRight = pExpr->pRight; @@ -167258,9 +167258,9 @@ static void fts3EvalNextRow( fts3EvalNextRow(pCsr, pLeft, pRc); if( pLeft->bEof==0 ){ - while( !*pRc - && !pRight->bEof - && DOCID_CMP(pLeft->iDocid, pRight->iDocid)>0 + while( !*pRc + && !pRight->bEof + && DOCID_CMP(pLeft->iDocid, pRight->iDocid)>0 ){ fts3EvalNextRow(pCsr, pRight, pRc); } @@ -167285,14 +167285,14 @@ static void fts3EvalNextRow( ** If *pRc is not SQLITE_OK, or if pExpr is not the root node of a NEAR ** cluster, then this function returns 1 immediately. ** -** Otherwise, it checks if the current row really does match the NEAR -** expression, using the data currently stored in the position lists -** (Fts3Expr->pPhrase.doclist.pList/nList) for each phrase in the expression. +** Otherwise, it checks if the current row really does match the NEAR +** expression, using the data currently stored in the position lists +** (Fts3Expr->pPhrase.doclist.pList/nList) for each phrase in the expression. ** ** If the current row is a match, the position list associated with each ** phrase in the NEAR expression is edited in place to contain only those ** phrase instances sufficiently close to their peers to satisfy all NEAR -** constraints. In this case it returns 1. If the NEAR expression does not +** constraints. In this case it returns 1. If the NEAR expression does not ** match the current row, 0 is returned. The position lists may or may not ** be edited if 0 is returned. */ @@ -167315,15 +167315,15 @@ static int fts3EvalNearTest(Fts3Expr *pExpr, int *pRc){ ** | | ** "w" "x" ** - ** The right-hand child of a NEAR node is always a phrase. The + ** The right-hand child of a NEAR node is always a phrase. The ** left-hand child may be either a phrase or a NEAR node. There are ** no exceptions to this - it's the way the parser in fts3_expr.c works. */ - if( *pRc==SQLITE_OK - && pExpr->eType==FTSQUERY_NEAR + if( *pRc==SQLITE_OK + && pExpr->eType==FTSQUERY_NEAR && (pExpr->pParent==0 || pExpr->pParent->eType!=FTSQUERY_NEAR) ){ - Fts3Expr *p; + Fts3Expr *p; sqlite3_int64 nTmp = 0; /* Bytes of temp space */ char *aTmp; /* Temp space for PoslistNearMerge() */ @@ -167370,12 +167370,12 @@ static int fts3EvalNearTest(Fts3Expr *pExpr, int *pRc){ /* ** This function is a helper function for sqlite3Fts3EvalTestDeferred(). ** Assuming no error occurs or has occurred, It returns non-zero if the -** expression passed as the second argument matches the row that pCsr +** expression passed as the second argument matches the row that pCsr ** currently points to, or zero if it does not. ** ** If *pRc is not SQLITE_OK when this function is called, it is a no-op. -** If an error occurs during execution of this function, *pRc is set to -** the appropriate SQLite error code. In this case the returned value is +** If an error occurs during execution of this function, *pRc is set to +** the appropriate SQLite error code. In this case the returned value is ** undefined. */ static int fts3EvalTestExpr( @@ -167394,10 +167394,10 @@ static int fts3EvalTestExpr( && fts3EvalNearTest(pExpr, pRc) ); - /* If the NEAR expression does not match any rows, zero the doclist for + /* If the NEAR expression does not match any rows, zero the doclist for ** all phrases involved in the NEAR. This is because the snippet(), - ** offsets() and matchinfo() functions are not supposed to recognize - ** any instances of phrases that are part of unmatched NEAR queries. + ** offsets() and matchinfo() functions are not supposed to recognize + ** any instances of phrases that are part of unmatched NEAR queries. ** For example if this expression: ** ** ... MATCH 'a OR (b NEAR c)' @@ -167409,8 +167409,8 @@ static int fts3EvalTestExpr( ** then any snippet() should ony highlight the "a" term, not the "b" ** (as "b" is part of a non-matching NEAR clause). */ - if( bHit==0 - && pExpr->eType==FTSQUERY_NEAR + if( bHit==0 + && pExpr->eType==FTSQUERY_NEAR && (pExpr->pParent==0 || pExpr->pParent->eType!=FTSQUERY_NEAR) ){ Fts3Expr *p; @@ -167442,7 +167442,7 @@ static int fts3EvalTestExpr( default: { #ifndef SQLITE_DISABLE_FTS4_DEFERRED - if( pCsr->pDeferred + if( pCsr->pDeferred && (pExpr->iDocid==pCsr->iPrevId || pExpr->bDeferred) ){ Fts3Phrase *pPhrase = pExpr->pPhrase; @@ -167498,7 +167498,7 @@ SQLITE_PRIVATE int sqlite3Fts3EvalTestDeferred(Fts3Cursor *pCsr, int *pRc){ ** memory and scan it to determine the position list for each deferred ** token. Then, see if this row is really a match, considering deferred ** tokens and NEAR operators (neither of which were taken into account - ** earlier, by fts3EvalNextRow()). + ** earlier, by fts3EvalNextRow()). */ if( pCsr->pDeferred ){ rc = fts3CursorSeek(0, pCsr); @@ -167553,7 +167553,7 @@ static int fts3EvalNext(Fts3Cursor *pCsr){ /* ** Restart interation for expression pExpr so that the next call to -** fts3EvalNext() visits the first row. Do not allow incremental +** fts3EvalNext() visits the first row. Do not allow incremental ** loading or merging of phrase doclists for this iteration. ** ** If *pRc is other than SQLITE_OK when this function is called, it is @@ -167596,11 +167596,11 @@ static void fts3EvalRestart( } /* -** After allocating the Fts3Expr.aMI[] array for each phrase in the +** After allocating the Fts3Expr.aMI[] array for each phrase in the ** expression rooted at pExpr, the cursor iterates through all rows matched ** by pExpr, calling this function for each row. This function increments ** the values in Fts3Expr.aMI[] according to the position-list currently -** found in Fts3Expr.pPhrase->doclist.pList for each of the phrase +** found in Fts3Expr.pPhrase->doclist.pList for each of the phrase ** expression nodes. */ static void fts3EvalUpdateCounts(Fts3Expr *pExpr, int nCol){ @@ -167694,9 +167694,9 @@ static int fts3EvalGatherStats( pCsr->isRequireSeek = 1; pCsr->isMatchinfoNeeded = 1; pCsr->iPrevId = pRoot->iDocid; - }while( pCsr->isEof==0 - && pRoot->eType==FTSQUERY_NEAR - && sqlite3Fts3EvalTestDeferred(pCsr, &rc) + }while( pCsr->isEof==0 + && pRoot->eType==FTSQUERY_NEAR + && sqlite3Fts3EvalTestDeferred(pCsr, &rc) ); if( rc==SQLITE_OK && pCsr->isEof==0 ){ @@ -167711,7 +167711,7 @@ static int fts3EvalGatherStats( pRoot->bEof = bEof; }else{ /* Caution: pRoot may iterate through docids in ascending or descending - ** order. For this reason, even though it seems more defensive, the + ** order. For this reason, even though it seems more defensive, the ** do loop can not be written: ** ** do {...} while( pRoot->iDocid=0 && iColnColumn ); @@ -167835,8 +167835,8 @@ SQLITE_PRIVATE int sqlite3Fts3EvalPhrasePoslist( Fts3Expr *pNear; /* Most senior NEAR ancestor (or pExpr) */ int bMatch; - /* Check if this phrase descends from an OR expression node. If not, - ** return NULL. Otherwise, the entry that corresponds to docid + /* Check if this phrase descends from an OR expression node. If not, + ** return NULL. Otherwise, the entry that corresponds to docid ** pCsr->iPrevId may lie earlier in the doclist buffer. Or, if the ** tree that the node is part of has been marked as EOF, but the node ** itself is not EOF, then it may point to an earlier entry. */ @@ -167884,7 +167884,7 @@ SQLITE_PRIVATE int sqlite3Fts3EvalPhrasePoslist( (pIter >= (pPh->doclist.aAll + pPh->doclist.nAll)); while( (pIter==0 || DOCID_CMP(iDocid, pCsr->iPrevId)<0 ) && bEof==0 ){ sqlite3Fts3DoclistNext( - bDescDoclist, pPh->doclist.aAll, pPh->doclist.nAll, + bDescDoclist, pPh->doclist.aAll, pPh->doclist.nAll, &pIter, &iDocid, &bEof ); } @@ -167893,7 +167893,7 @@ SQLITE_PRIVATE int sqlite3Fts3EvalPhrasePoslist( while( (pIter==0 || DOCID_CMP(iDocid, pCsr->iPrevId)>0 ) && bEof==0 ){ int dummy; sqlite3Fts3DoclistPrev( - bDescDoclist, pPh->doclist.aAll, pPh->doclist.nAll, + bDescDoclist, pPh->doclist.aAll, pPh->doclist.nAll, &pIter, &iDocid, &dummy, &bEof ); } @@ -167969,7 +167969,7 @@ SQLITE_PRIVATE int sqlite3Fts3Corrupt(){ __declspec(dllexport) #endif SQLITE_API int sqlite3_fts3_init( - sqlite3 *db, + sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi ){ @@ -168063,11 +168063,11 @@ static int fts3auxConnectMethod( */ if( argc!=4 && argc!=5 ) goto bad_args; - zDb = argv[1]; + zDb = argv[1]; nDb = (int)strlen(zDb); if( argc==5 ){ if( nDb==4 && 0==sqlite3_strnicmp("temp", zDb, 4) ){ - zDb = argv[3]; + zDb = argv[3]; nDb = (int)strlen(zDb); zFts3 = argv[4]; }else{ @@ -168131,7 +168131,7 @@ static int fts3auxDisconnectMethod(sqlite3_vtab *pVtab){ ** xBestIndex - Analyze a WHERE and ORDER BY clause. */ static int fts3auxBestIndexMethod( - sqlite3_vtab *pVTab, + sqlite3_vtab *pVTab, sqlite3_index_info *pInfo ){ int i; @@ -168144,14 +168144,14 @@ static int fts3auxBestIndexMethod( UNUSED_PARAMETER(pVTab); /* This vtab delivers always results in "ORDER BY term ASC" order. */ - if( pInfo->nOrderBy==1 - && pInfo->aOrderBy[0].iColumn==0 + if( pInfo->nOrderBy==1 + && pInfo->aOrderBy[0].iColumn==0 && pInfo->aOrderBy[0].desc==0 ){ pInfo->orderByConsumed = 1; } - /* Search for equality and range constraints on the "term" column. + /* Search for equality and range constraints on the "term" column. ** And equality constraints on the hidden "languageid" column. */ for(i=0; inConstraint; i++){ if( pInfo->aConstraint[i].usable ){ @@ -168232,11 +168232,11 @@ static int fts3auxCloseMethod(sqlite3_vtab_cursor *pCursor){ static int fts3auxGrowStatArray(Fts3auxCursor *pCsr, int nSize){ if( nSize>pCsr->nStat ){ struct Fts3auxColstats *aNew; - aNew = (struct Fts3auxColstats *)sqlite3_realloc64(pCsr->aStat, + aNew = (struct Fts3auxColstats *)sqlite3_realloc64(pCsr->aStat, sizeof(struct Fts3auxColstats) * nSize ); if( aNew==0 ) return SQLITE_NOMEM; - memset(&aNew[pCsr->nStat], 0, + memset(&aNew[pCsr->nStat], 0, sizeof(struct Fts3auxColstats) * (nSize - pCsr->nStat) ); pCsr->aStat = aNew; @@ -168296,8 +168296,8 @@ static int fts3auxNextMethod(sqlite3_vtab_cursor *pCursor){ /* State 1. In this state we are expecting either a 1, indicating ** that the following integer will be a column number, or the - ** start of a position list for column 0. - ** + ** start of a position list for column 0. + ** ** The only difference between state 1 and state 2 is that if the ** integer encountered in state 1 is not 0 or 1, then we need to ** increment the column 0 "nDoc" count for this term. @@ -168410,7 +168410,7 @@ static int fts3auxFilterMethod( if( pCsr->zStop==0 ) return SQLITE_NOMEM; pCsr->nStop = (int)strlen(pCsr->zStop); } - + if( iLangid>=0 ){ iLangVal = sqlite3_value_int(apVal[iLangid]); @@ -168549,15 +168549,15 @@ SQLITE_PRIVATE int sqlite3Fts3InitAux(sqlite3 *db){ ****************************************************************************** ** ** This module contains code that implements a parser for fts3 query strings -** (the right-hand argument to the MATCH operator). Because the supported +** (the right-hand argument to the MATCH operator). Because the supported ** syntax is relatively simple, the whole tokenizer/parser system is -** hand-coded. +** hand-coded. */ /* #include "fts3Int.h" */ #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) /* -** By default, this module parses the legacy syntax that has been +** By default, this module parses the legacy syntax that has been ** traditionally used by fts3. Or, if SQLITE_ENABLE_FTS3_PARENTHESIS ** is defined, then it uses the new syntax. The differences between ** the new and the old syntaxes are: @@ -168566,7 +168566,7 @@ SQLITE_PRIVATE int sqlite3Fts3InitAux(sqlite3 *db){ ** ** b) The new syntax supports the AND and NOT operators. The old does not. ** -** c) The old syntax supports the "-" token qualifier. This is not +** c) The old syntax supports the "-" token qualifier. This is not ** supported by the new syntax (it is replaced by the NOT operator). ** ** d) When using the old syntax, the OR operator has a greater precedence @@ -168575,7 +168575,7 @@ SQLITE_PRIVATE int sqlite3Fts3InitAux(sqlite3 *db){ ** ** If compiled with SQLITE_TEST defined, then this module exports the ** symbol "int sqlite3_fts3_enable_parentheses". Setting this variable -** to zero causes the module to use the old syntax. If it is set to +** to zero causes the module to use the old syntax. If it is set to ** non-zero the new syntax is activated. This is so both syntaxes can ** be tested using a single build of testfixture. ** @@ -168604,7 +168604,7 @@ SQLITE_PRIVATE int sqlite3Fts3InitAux(sqlite3 *db){ #ifdef SQLITE_TEST SQLITE_API int sqlite3_fts3_enable_parentheses = 0; #else -# ifdef SQLITE_ENABLE_FTS3_PARENTHESIS +# ifdef SQLITE_ENABLE_FTS3_PARENTHESIS # define sqlite3_fts3_enable_parentheses 1 # else # define sqlite3_fts3_enable_parentheses 0 @@ -168622,7 +168622,7 @@ SQLITE_API int sqlite3_fts3_enable_parentheses = 0; /* ** isNot: ** This variable is used by function getNextNode(). When getNextNode() is -** called, it sets ParseContext.isNot to true if the 'next node' is a +** called, it sets ParseContext.isNot to true if the 'next node' is a ** FTSQUERY_PHRASE with a unary "-" attached to it. i.e. "mysql" in the ** FTS3 query "sqlite -mysql". Otherwise, ParseContext.isNot is set to ** zero. @@ -168641,7 +168641,7 @@ struct ParseContext { }; /* -** This function is equivalent to the standard isspace() function. +** This function is equivalent to the standard isspace() function. ** ** The standard isspace() can be awkward to use safely, because although it ** is defined to accept an argument of type int, its behavior when passed @@ -168657,7 +168657,7 @@ static int fts3isspace(char c){ /* ** Allocate nByte bytes of memory using sqlite3_malloc(). If successful, -** zero the memory before returning a pointer to it. If unsuccessful, +** zero the memory before returning a pointer to it. If unsuccessful, ** return NULL. */ static void *fts3MallocZero(sqlite3_int64 nByte){ @@ -168705,7 +168705,7 @@ static int fts3ExprParse(ParseContext *, const char *, int, Fts3Expr **, int *); ** structure of type FTSQUERY_PHRASE containing a phrase consisting of this ** single token and set *ppExpr to point to it. If the end of the buffer is ** reached before a token is found, set *ppExpr to zero. It is the -** responsibility of the caller to eventually deallocate the allocated +** responsibility of the caller to eventually deallocate the allocated ** Fts3Expr structure (if any) by passing it to sqlite3_free(). ** ** Return SQLITE_OK if successful, or SQLITE_NOMEM if a memory allocation @@ -168759,8 +168759,8 @@ static int getNextToken( } while( 1 ){ - if( !sqlite3_fts3_enable_parentheses - && iStart>0 && z[iStart-1]=='-' + if( !sqlite3_fts3_enable_parentheses + && iStart>0 && z[iStart-1]=='-' ){ pParse->isNot = 1; iStart--; @@ -168780,7 +168780,7 @@ static int getNextToken( pModule->xClose(pCursor); } - + *ppExpr = pRet; return rc; } @@ -168802,7 +168802,7 @@ static void *fts3ReallocOrFree(void *pOrig, sqlite3_int64 nNew){ ** Buffer zInput, length nInput, contains the contents of a quoted string ** that appeared as part of an fts3 query expression. Neither quote character ** is included in the buffer. This function attempts to tokenize the entire -** input buffer and create an Fts3Expr structure of type FTSQUERY_PHRASE +** input buffer and create an Fts3Expr structure of type FTSQUERY_PHRASE ** containing the results. ** ** If successful, SQLITE_OK is returned and *ppExpr set to point at the @@ -168827,7 +168827,7 @@ static int getNextString( int nToken = 0; /* The final Fts3Expr data structure, including the Fts3Phrase, - ** Fts3PhraseToken structures token buffers are all stored as a single + ** Fts3PhraseToken structures token buffers are all stored as a single ** allocation so that the expression can be freed with a single call to ** sqlite3_free(). Setting this up requires a two pass approach. ** @@ -168836,7 +168836,7 @@ static int getNextString( ** to assemble data in two dynamic buffers: ** ** Buffer p: Points to the Fts3Expr structure, followed by the Fts3Phrase - ** structure, followed by the array of Fts3PhraseToken + ** structure, followed by the array of Fts3PhraseToken ** structures. This pass only populates the Fts3PhraseToken array. ** ** Buffer zTemp: Contains copies of all tokens. @@ -168921,7 +168921,7 @@ no_mem: } /* -** The output variable *ppExpr is populated with an allocated Fts3Expr +** The output variable *ppExpr is populated with an allocated Fts3Expr ** structure, or set to 0 if the end of the input buffer is reached. ** ** Returns an SQLite error code. SQLITE_OK if everything works, SQLITE_NOMEM @@ -168957,7 +168957,7 @@ static int getNextNode( pParse->isNot = 0; /* Skip over any whitespace before checking for a keyword, an open or - ** close bracket, or a quoted string. + ** close bracket, or a quoted string. */ while( nInput>0 && fts3isspace(*zInput) ){ nInput--; @@ -168993,10 +168993,10 @@ static int getNextNode( /* At this point this is probably a keyword. But for that to be true, ** the next byte must contain either whitespace, an open or close - ** parenthesis, a quote character, or EOF. + ** parenthesis, a quote character, or EOF. */ cNext = zInput[nKey]; - if( fts3isspace(cNext) + if( fts3isspace(cNext) || cNext=='"' || cNext=='(' || cNext==')' || cNext==0 ){ pRet = (Fts3Expr *)fts3MallocZero(sizeof(Fts3Expr)); @@ -169045,15 +169045,15 @@ static int getNextNode( } } - /* If control flows to this point, this must be a regular token, or + /* If control flows to this point, this must be a regular token, or ** the end of the input. Read a regular token using the sqlite3_tokenizer ** interface. Before doing so, figure out if there is an explicit - ** column specifier for the token. + ** column specifier for the token. ** ** TODO: Strangely, it is not possible to associate a column specifier ** with a quoted phrase, only with a single token. Not sure if this was ** an implementation artifact or an intentional decision when fts3 was - ** first implemented. Whichever it was, this module duplicates the + ** first implemented. Whichever it was, this module duplicates the ** limitation. */ iCol = pParse->iDefaultCol; @@ -169061,8 +169061,8 @@ static int getNextNode( for(ii=0; iinCol; ii++){ const char *zStr = pParse->azCol[ii]; int nStr = (int)strlen(zStr); - if( nInput>nStr && zInput[nStr]==':' - && sqlite3_strnicmp(zStr, zInput, nStr)==0 + if( nInput>nStr && zInput[nStr]==':' + && sqlite3_strnicmp(zStr, zInput, nStr)==0 ){ iCol = ii; iColLen = (int)((zInput - z) + nStr + 1); @@ -169107,7 +169107,7 @@ static int opPrecedence(Fts3Expr *p){ } /* -** Argument ppHead contains a pointer to the current head of a query +** Argument ppHead contains a pointer to the current head of a query ** expression tree being parsed. pPrev is the expression node most recently ** inserted into the tree. This function adds pNew, which is always a binary ** operator node, into the expression tree based on the relative precedence @@ -169137,7 +169137,7 @@ static void insertBinaryOperator( /* ** Parse the fts3 query expression found in buffer z, length n. This function -** returns either when the end of the buffer is reached or an unmatched +** returns either when the end of the buffer is reached or an unmatched ** closing bracket - ')' - is encountered. ** ** If successful, SQLITE_OK is returned, *ppExpr is set to point to the @@ -169169,8 +169169,8 @@ static int fts3ExprParse( if( p ){ int isPhrase; - if( !sqlite3_fts3_enable_parentheses - && p->eType==FTSQUERY_PHRASE && pParse->isNot + if( !sqlite3_fts3_enable_parentheses + && p->eType==FTSQUERY_PHRASE && pParse->isNot ){ /* Create an implicit NOT operator. */ Fts3Expr *pNot = fts3MallocZero(sizeof(Fts3Expr)); @@ -169291,13 +169291,13 @@ exprparse_out: } /* -** Return SQLITE_ERROR if the maximum depth of the expression tree passed +** Return SQLITE_ERROR if the maximum depth of the expression tree passed ** as the only argument is more than nMaxDepth. */ static int fts3ExprCheckDepth(Fts3Expr *p, int nMaxDepth){ int rc = SQLITE_OK; if( p ){ - if( nMaxDepth<0 ){ + if( nMaxDepth<0 ){ rc = SQLITE_TOOBIG; }else{ rc = fts3ExprCheckDepth(p->pLeft, nMaxDepth-1); @@ -169312,12 +169312,12 @@ static int fts3ExprCheckDepth(Fts3Expr *p, int nMaxDepth){ /* ** This function attempts to transform the expression tree at (*pp) to ** an equivalent but more balanced form. The tree is modified in place. -** If successful, SQLITE_OK is returned and (*pp) set to point to the -** new root expression node. +** If successful, SQLITE_OK is returned and (*pp) set to point to the +** new root expression node. ** ** nMaxDepth is the maximum allowable depth of the balanced sub-tree. ** -** Otherwise, if an error occurs, an SQLite error code is returned and +** Otherwise, if an error occurs, an SQLite error code is returned and ** expression (*pp) freed. */ static int fts3ExprBalance(Fts3Expr **pp, int nMaxDepth){ @@ -169432,7 +169432,7 @@ static int fts3ExprBalance(Fts3Expr **pp, int nMaxDepth){ } pRoot = p; }else{ - /* An error occurred. Delete the contents of the apLeaf[] array + /* An error occurred. Delete the contents of the apLeaf[] array ** and pFree list. Everything else is cleaned up by the call to ** sqlite3Fts3ExprFree(pRoot) below. */ Fts3Expr *pDel; @@ -169474,7 +169474,7 @@ static int fts3ExprBalance(Fts3Expr **pp, int nMaxDepth){ } } } - + if( rc!=SQLITE_OK ){ sqlite3Fts3ExprFree(pRoot); pRoot = 0; @@ -169488,9 +169488,9 @@ static int fts3ExprBalance(Fts3Expr **pp, int nMaxDepth){ ** differences: ** ** 1. It does not do expression rebalancing. -** 2. It does not check that the expression does not exceed the +** 2. It does not check that the expression does not exceed the ** maximum allowable depth. -** 3. Even if it fails, *ppExpr may still be set to point to an +** 3. Even if it fails, *ppExpr may still be set to point to an ** expression tree. It should be deleted using sqlite3Fts3ExprFree() ** in this case. */ @@ -169529,7 +169529,7 @@ static int fts3ExprParseUnbalanced( if( rc==SQLITE_OK && sParse.nNest ){ rc = SQLITE_ERROR; } - + return rc; } @@ -169548,7 +169548,7 @@ static int fts3ExprParseUnbalanced( ** The first parameter, pTokenizer, is passed the fts3 tokenizer module to ** use to normalize query tokens while parsing the expression. The azCol[] ** array, which is assumed to contain nCol entries, should contain the names -** of each column in the target fts3 table, in order from left to right. +** of each column in the target fts3 table, in order from left to right. ** Column names must be nul-terminated strings. ** ** The iDefaultCol parameter should be passed the index of the table column @@ -169571,7 +169571,7 @@ SQLITE_PRIVATE int sqlite3Fts3ExprParse( int rc = fts3ExprParseUnbalanced( pTokenizer, iLangid, azCol, bFts4, nCol, iDefaultCol, z, n, ppExpr ); - + /* Rebalance the expression. And check that its depth does not exceed ** SQLITE_FTS3_MAX_EXPR_DEPTH. */ if( rc==SQLITE_OK && *ppExpr ){ @@ -169586,7 +169586,7 @@ SQLITE_PRIVATE int sqlite3Fts3ExprParse( *ppExpr = 0; if( rc==SQLITE_TOOBIG ){ sqlite3Fts3ErrMsg(pzErr, - "FTS expression tree is too large (maximum depth %d)", + "FTS expression tree is too large (maximum depth %d)", SQLITE_FTS3_MAX_EXPR_DEPTH ); rc = SQLITE_ERROR; @@ -169648,11 +169648,11 @@ SQLITE_PRIVATE void sqlite3Fts3ExprFree(Fts3Expr *pDel){ /* ** Return a pointer to a buffer containing a text representation of the ** expression passed as the first argument. The buffer is obtained from -** sqlite3_malloc(). It is the responsibility of the caller to use +** sqlite3_malloc(). It is the responsibility of the caller to use ** sqlite3_free() to release the memory. If an OOM condition is encountered, ** NULL is returned. ** -** If the second argument is not NULL, then its contents are prepended to +** If the second argument is not NULL, then its contents are prepended to ** the returned expression text and then freed using sqlite3_free(). */ static char *exprToString(Fts3Expr *pExpr, char *zBuf){ @@ -169666,7 +169666,7 @@ static char *exprToString(Fts3Expr *pExpr, char *zBuf){ zBuf = sqlite3_mprintf( "%zPHRASE %d 0", zBuf, pPhrase->iColumn); for(i=0; zBuf && inToken; i++){ - zBuf = sqlite3_mprintf("%z %.*s%s", zBuf, + zBuf = sqlite3_mprintf("%z %.*s%s", zBuf, pPhrase->aToken[i].n, pPhrase->aToken[i].z, (pPhrase->aToken[i].isPrefix?"+":"") ); @@ -169699,7 +169699,7 @@ static char *exprToString(Fts3Expr *pExpr, char *zBuf){ } /* -** This is the implementation of a scalar SQL function used to test the +** This is the implementation of a scalar SQL function used to test the ** expression parser. It should be called as follows: ** ** fts3_exprtest(, , , ...); @@ -169732,7 +169732,7 @@ static void fts3ExprTestCommon( char *zErr = 0; if( argc<3 ){ - sqlite3_result_error(context, + sqlite3_result_error(context, "Usage: fts3_exprtest(tokenizer, expr, col1, ...", -1 ); return; @@ -169810,15 +169810,15 @@ static void fts3ExprTestRebalance( } /* -** Register the query expression parser test function fts3_exprtest() -** with database connection db. +** Register the query expression parser test function fts3_exprtest() +** with database connection db. */ SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3 *db, Fts3Hash *pHash){ int rc = sqlite3_create_function( db, "fts3_exprtest", -1, SQLITE_UTF8, (void*)pHash, fts3ExprTest, 0, 0 ); if( rc==SQLITE_OK ){ - rc = sqlite3_create_function(db, "fts3_exprtest_rebalance", + rc = sqlite3_create_function(db, "fts3_exprtest_rebalance", -1, SQLITE_UTF8, (void*)pHash, fts3ExprTestRebalance, 0, 0 ); } @@ -169882,8 +169882,8 @@ static void fts3HashFree(void *p){ ** fields of the Hash structure. ** ** "pNew" is a pointer to the hash table that is to be initialized. -** keyClass is one of the constants -** FTS3_HASH_BINARY or FTS3_HASH_STRING. The value of keyClass +** keyClass is one of the constants +** FTS3_HASH_BINARY or FTS3_HASH_STRING. The value of keyClass ** determines what kind of key the hash table will use. "copyKey" is ** true if the hash table should make its own private copy of keys and ** false if it should just use the supplied pointer. @@ -169960,7 +169960,7 @@ static int fts3BinCompare(const void *pKey1, int n1, const void *pKey2, int n2){ /* ** Return a pointer to the appropriate hash function given the key class. ** -** The C syntax in this function definition may be unfamilar to some +** The C syntax in this function definition may be unfamilar to some ** programmers, so we provide the following additional explanation: ** ** The name of the function is "ftsHashFunction". The function takes a @@ -170020,7 +170020,7 @@ static void fts3HashInsertElement( /* Resize the hash table so that it cantains "new_size" buckets. -** "new_size" must be a power of 2. The hash table might fail +** "new_size" must be a power of 2. The hash table might fail ** to resize if sqliteMalloc() fails. ** ** Return non-zero if a memory allocation error occurs. @@ -170065,7 +170065,7 @@ static Fts3HashElem *fts3FindElementByHash( count = pEntry->count; xCompare = ftsCompareFunction(pH->keyClass); while( count-- && elem ){ - if( (*xCompare)(elem->pKey,elem->nKey,pKey,nKey)==0 ){ + if( (*xCompare)(elem->pKey,elem->nKey,pKey,nKey)==0 ){ return elem; } elem = elem->next; @@ -170084,7 +170084,7 @@ static void fts3RemoveElementByHash( ){ struct _fts3ht *pEntry; if( elem->prev ){ - elem->prev->next = elem->next; + elem->prev->next = elem->next; }else{ pH->first = elem->next; } @@ -170112,8 +170112,8 @@ static void fts3RemoveElementByHash( } SQLITE_PRIVATE Fts3HashElem *sqlite3Fts3HashFindElem( - const Fts3Hash *pH, - const void *pKey, + const Fts3Hash *pH, + const void *pKey, int nKey ){ int h; /* A hash on key */ @@ -170127,7 +170127,7 @@ SQLITE_PRIVATE Fts3HashElem *sqlite3Fts3HashFindElem( return fts3FindElementByHash(pH,pKey,nKey, h & (pH->htsize-1)); } -/* +/* ** Attempt to locate an element of the hash table pH with a key ** that matches pKey,nKey. Return the data for this element if it is ** found, or NULL if there is no match. @@ -170301,7 +170301,7 @@ static int porterDestroy(sqlite3_tokenizer *pTokenizer){ /* ** Prepare to begin tokenizing a particular string. The input ** string to be tokenized is zInput[0..nInput-1]. A cursor -** used to incrementally tokenize this string is returned in +** used to incrementally tokenize this string is returned in ** *ppCursor. */ static int porterOpen( @@ -170354,7 +170354,7 @@ static const char cType[] = { /* ** isConsonant() and isVowel() determine if their first character in ** the string they point to is a consonant or a vowel, according -** to Porter ruls. +** to Porter ruls. ** ** A consonate is any letter other than 'a', 'e', 'i', 'o', or 'u'. ** 'Y' is a consonant unless it follows another consonant, @@ -170474,11 +170474,11 @@ static int star_oh(const char *z){ /* ** If the word ends with zFrom and xCond() is true for the stem -** of the word that preceeds the zFrom ending, then change the +** of the word that preceeds the zFrom ending, then change the ** ending to zTo. ** ** The input word *pz and zFrom are both in reverse order. zTo -** is in normal order. +** is in normal order. ** ** Return TRUE if zFrom matches. Return FALSE if zFrom does not ** match. Not that TRUE is returned even if xCond() fails and @@ -170547,9 +170547,9 @@ static void copy_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){ ** word contains digits, 3 bytes are taken from the beginning and ** 3 bytes from the end. For long words without digits, 10 bytes ** are taken from each end. US-ASCII case folding still applies. -** -** If the input word contains not digits but does characters not -** in [a-zA-Z] then no stemming is attempted and this routine just +** +** If the input word contains not digits but does characters not +** in [a-zA-Z] then no stemming is attempted and this routine just ** copies the input into the input into the output with US-ASCII ** case folding. ** @@ -170594,11 +170594,11 @@ static void porter_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){ } } - /* Step 1b */ + /* Step 1b */ z2 = z; if( stem(&z, "dee", "ee", m_gt_0) ){ /* Do nothing. The work was all in the test */ - }else if( + }else if( (stem(&z, "gni", "", hasVowel) || stem(&z, "de", "", hasVowel)) && z!=z2 ){ @@ -170637,7 +170637,7 @@ static void porter_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){ stem(&z, "igol", "log", m_gt_0); break; case 'l': - if( !stem(&z, "ilb", "ble", m_gt_0) + if( !stem(&z, "ilb", "ble", m_gt_0) && !stem(&z, "illa", "al", m_gt_0) && !stem(&z, "iltne", "ent", m_gt_0) && !stem(&z, "ile", "e", m_gt_0) @@ -170925,7 +170925,7 @@ static int fts3TokenizerEnabled(sqlite3_context *context){ } /* -** Implementation of the SQL scalar function for accessing the underlying +** Implementation of the SQL scalar function for accessing the underlying ** hash table. This function may be called as follows: ** ** SELECT (); @@ -171097,7 +171097,7 @@ SQLITE_PRIVATE int sqlite3Fts3InitTokenizer( if( rc!=SQLITE_OK ){ sqlite3Fts3ErrMsg(pzErr, "unknown tokenizer"); }else{ - (*ppTok)->pModule = m; + (*ppTok)->pModule = m; } sqlite3_free((void *)aArg); } @@ -171117,7 +171117,7 @@ SQLITE_PRIVATE int sqlite3Fts3InitTokenizer( /* #include */ /* -** Implementation of a special SQL scalar function for testing tokenizers +** Implementation of a special SQL scalar function for testing tokenizers ** designed to be used in concert with the Tcl testing framework. This ** function must be called with two or more arguments: ** @@ -171129,9 +171129,9 @@ SQLITE_PRIVATE int sqlite3Fts3InitTokenizer( ** ** The return value is a string that may be interpreted as a Tcl ** list. For each token in the , three elements are -** added to the returned list. The first is the token position, the +** added to the returned list. The first is the token position, the ** second is the token text (folded, stemmed, etc.) and the third is the -** substring of associated with the token. For example, +** substring of associated with the token. For example, ** using the built-in "simple" tokenizer: ** ** SELECT fts_tokenizer_test('simple', 'I don't see how'); @@ -171139,7 +171139,7 @@ SQLITE_PRIVATE int sqlite3Fts3InitTokenizer( ** will return the string: ** ** "{0 i I 1 dont don't 2 see see 3 how how}" -** +** */ static void testFunc( sqlite3_context *context, @@ -171234,8 +171234,8 @@ finish: static int registerTokenizer( - sqlite3 *db, - char *zName, + sqlite3 *db, + char *zName, const sqlite3_tokenizer_module *p ){ int rc; @@ -171257,8 +171257,8 @@ int registerTokenizer( static int queryTokenizer( - sqlite3 *db, - char *zName, + sqlite3 *db, + char *zName, const sqlite3_tokenizer_module **pp ){ int rc; @@ -171341,23 +171341,23 @@ static void intTestFunc( /* ** Set up SQL objects in database db used to access the contents of ** the hash table pointed to by argument pHash. The hash table must -** been initialized to use string keys, and to take a private copy +** been initialized to use string keys, and to take a private copy ** of the key when a value is inserted. i.e. by a call similar to: ** ** sqlite3Fts3HashInit(pHash, FTS3_HASH_STRING, 1); ** ** This function adds a scalar function (see header comment above ** fts3TokenizerFunc() in this file for details) and, if ENABLE_TABLE is -** defined at compilation time, a temporary virtual table (see header -** comment above struct HashTableVtab) to the database schema. Both +** defined at compilation time, a temporary virtual table (see header +** comment above struct HashTableVtab) to the database schema. Both ** provide read/write access to the contents of *pHash. ** ** The third argument to this function, zName, is used as the name ** of both the scalar and, if created, the virtual table. */ SQLITE_PRIVATE int sqlite3Fts3InitHashTable( - sqlite3 *db, - Fts3Hash *pHash, + sqlite3 *db, + Fts3Hash *pHash, const char *zName ){ int rc = SQLITE_OK; @@ -171511,7 +171511,7 @@ static int simpleDestroy(sqlite3_tokenizer *pTokenizer){ /* ** Prepare to begin tokenizing a particular string. The input ** string to be tokenized is pInput[0..nBytes-1]. A cursor -** used to incrementally tokenize this string is returned in +** used to incrementally tokenize this string is returned in ** *ppCursor. */ static int simpleOpen( @@ -171666,8 +171666,8 @@ SQLITE_PRIVATE void sqlite3Fts3SimpleTokenizerModule( ** ** input = ** -** The virtual table module tokenizes this , using the FTS3 -** tokenizer specified by the arguments to the CREATE VIRTUAL TABLE +** The virtual table module tokenizes this , using the FTS3 +** tokenizer specified by the arguments to the CREATE VIRTUAL TABLE ** statement and returns one row for each token in the result. With ** fields set as follows: ** @@ -171736,7 +171736,7 @@ static int fts3tokQueryTokenizer( /* ** The second argument, argv[], is an array of pointers to nul-terminated -** strings. This function makes a copy of the array and strings into a +** strings. This function makes a copy of the array and strings into a ** single block of memory. It then dequotes any of the strings that appear ** to be quoted. ** @@ -171792,7 +171792,7 @@ static int fts3tokDequoteArray( ** and xCreate are identical operations. ** ** argv[0]: module name -** argv[1]: database name +** argv[1]: database name ** argv[2]: table name ** argv[3]: first argument (tokenizer name) */ @@ -171872,16 +171872,16 @@ static int fts3tokDisconnectMethod(sqlite3_vtab *pVtab){ ** xBestIndex - Analyze a WHERE and ORDER BY clause. */ static int fts3tokBestIndexMethod( - sqlite3_vtab *pVTab, + sqlite3_vtab *pVTab, sqlite3_index_info *pInfo ){ int i; UNUSED_PARAMETER(pVTab); for(i=0; inConstraint; i++){ - if( pInfo->aConstraint[i].usable - && pInfo->aConstraint[i].iColumn==0 - && pInfo->aConstraint[i].op==SQLITE_INDEX_CONSTRAINT_EQ + if( pInfo->aConstraint[i].usable + && pInfo->aConstraint[i].iColumn==0 + && pInfo->aConstraint[i].op==SQLITE_INDEX_CONSTRAINT_EQ ){ pInfo->idxNum = 1; pInfo->aConstraintUsage[i].argvIndex = 1; @@ -172112,7 +172112,7 @@ SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3 *db, Fts3Hash *pHash){ ** This file is part of the SQLite FTS3 extension module. Specifically, ** this file contains code to insert, update and delete rows from FTS3 ** tables. It also contains code to merge FTS3 b-tree segments. Some -** of the sub-routines used to merge segments are also used by the query +** of the sub-routines used to merge segments are also used by the query ** code in fts3.c. */ @@ -172128,7 +172128,7 @@ SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3 *db, Fts3Hash *pHash){ /* ** When full-text index nodes are loaded from disk, the buffer that they -** are loaded into has the following number of bytes of padding at the end +** are loaded into has the following number of bytes of padding at the end ** of it. i.e. if a full-text index node is 900 bytes in size, then a buffer ** of 920 bytes is allocated for it. ** @@ -172145,10 +172145,10 @@ SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3 *db, Fts3Hash *pHash){ ** method before retrieving all query results (as may happen, for example, ** if a query has a LIMIT clause). ** -** Incremental loading is used for b-tree nodes FTS3_NODE_CHUNK_THRESHOLD +** Incremental loading is used for b-tree nodes FTS3_NODE_CHUNK_THRESHOLD ** bytes and larger. Nodes are loaded in chunks of FTS3_NODE_CHUNKSIZE bytes. -** The code is written so that the hard lower-limit for each of these values -** is 1. Clearly such small values would be inefficient, but can be useful +** The code is written so that the hard lower-limit for each of these values +** is 1. Clearly such small values would be inefficient, but can be useful ** for testing purposes. ** ** If this module is built with SQLITE_TEST defined, these constants may @@ -172161,7 +172161,7 @@ int test_fts3_node_chunk_threshold = (4*1024)*4; # define FTS3_NODE_CHUNKSIZE test_fts3_node_chunksize # define FTS3_NODE_CHUNK_THRESHOLD test_fts3_node_chunk_threshold #else -# define FTS3_NODE_CHUNKSIZE (4*1024) +# define FTS3_NODE_CHUNKSIZE (4*1024) # define FTS3_NODE_CHUNK_THRESHOLD (FTS3_NODE_CHUNKSIZE*4) #endif @@ -172175,7 +172175,7 @@ int test_fts3_node_chunk_threshold = (4*1024)*4; /* ** If FTS_LOG_MERGES is defined, call sqlite3_log() to report each automatic -** and incremental merge operation that takes place. This is used for +** and incremental merge operation that takes place. This is used for ** debugging FTS only, it should not usually be turned on in production ** systems. */ @@ -172261,7 +172261,7 @@ struct Fts3SegReader { char *aDoclist; /* Pointer to doclist of current entry */ int nDoclist; /* Size of doclist in current entry */ - /* The following variables are used by fts3SegReaderNextDocid() to iterate + /* The following variables are used by fts3SegReaderNextDocid() to iterate ** through the current doclist (aDoclist/nDoclist). */ char *pOffsetList; @@ -172306,11 +172306,11 @@ struct SegmentWriter { ** fts3NodeFree() ** ** When a b+tree is written to the database (either as a result of a merge -** or the pending-terms table being flushed), leaves are written into the +** or the pending-terms table being flushed), leaves are written into the ** database file as soon as they are completely populated. The interior of ** the tree is assembled in memory and written out only once all leaves have ** been populated and stored. This is Ok, as the b+-tree fanout is usually -** very large, meaning that the interior of the tree consumes relatively +** very large, meaning that the interior of the tree consumes relatively ** little memory. */ struct SegmentNode { @@ -172331,7 +172331,7 @@ struct SegmentNode { */ #define SQL_DELETE_CONTENT 0 #define SQL_IS_EMPTY 1 -#define SQL_DELETE_ALL_CONTENT 2 +#define SQL_DELETE_ALL_CONTENT 2 #define SQL_DELETE_ALL_SEGMENTS 3 #define SQL_DELETE_ALL_SEGDIR 4 #define SQL_DELETE_ALL_DOCSIZE 5 @@ -172379,7 +172379,7 @@ struct SegmentNode { ** Otherwise, an SQLite error code is returned and *pp is set to 0. ** ** If argument apVal is not NULL, then it must point to an array with -** at least as many entries as the requested statement has bound +** at least as many entries as the requested statement has bound ** parameters. The values are bound to the statements parameters before ** returning. */ @@ -172403,7 +172403,7 @@ static int fts3SqlStmt( /* 10 */ "SELECT coalesce((SELECT max(blockid) FROM %Q.'%q_segments') + 1, 1)", /* 11 */ "REPLACE INTO %Q.'%q_segdir' VALUES(?,?,?,?,?,?)", - /* Return segments in order from oldest to newest.*/ + /* Return segments in order from oldest to newest.*/ /* 12 */ "SELECT idx, start_block, leaves_end_block, end_block, root " "FROM %Q.'%q_segdir' WHERE level = ? ORDER BY idx ASC", /* 13 */ "SELECT idx, start_block, leaves_end_block, end_block, root " @@ -172437,7 +172437,7 @@ static int fts3SqlStmt( " ORDER BY (level %% 1024) ASC LIMIT 1", /* Estimate the upper limit on the number of leaf nodes in a new segment -** created by merging the oldest :2 segments from absolute level :1. See +** created by merging the oldest :2 segments from absolute level :1. See ** function sqlite3Fts3Incrmerge() for details. */ /* 29 */ "SELECT 2 * total(1 + leaves_end_block - start_block) " " FROM %Q.'%q_segdir' WHERE level = ? AND idx < ?", @@ -172452,7 +172452,7 @@ static int fts3SqlStmt( /* 31 */ "UPDATE %Q.'%q_segdir' SET idx = ? WHERE level=? AND idx=?", /* SQL_SELECT_SEGDIR -** Read a single entry from the %_segdir table. The entry from absolute +** Read a single entry from the %_segdir table. The entry from absolute ** level :1 with index value :2. */ /* 32 */ "SELECT idx, start_block, leaves_end_block, end_block, root " "FROM %Q.'%q_segdir' WHERE level = ? AND idx = ?", @@ -172476,7 +172476,7 @@ static int fts3SqlStmt( ** Return the largest relative level in the FTS index or indexes. */ /* 36 */ "SELECT max( level %% 1024 ) FROM %Q.'%q_segdir'", - /* Return segments in order from oldest to newest.*/ + /* Return segments in order from oldest to newest.*/ /* 37 */ "SELECT level, idx, end_block " "FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ? " "ORDER BY level DESC, idx ASC", @@ -172492,7 +172492,7 @@ static int fts3SqlStmt( assert( SizeofArray(azSql)==SizeofArray(p->aStmt) ); assert( eStmt=0 ); - + pStmt = p->aStmt[eStmt]; if( !pStmt ){ int f = SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_NO_VTAB; @@ -172597,7 +172597,7 @@ static void fts3SqlExec( sqlite3_stmt *pStmt; int rc; if( *pRC ) return; - rc = fts3SqlStmt(p, eStmt, &pStmt, apVal); + rc = fts3SqlStmt(p, eStmt, &pStmt, apVal); if( rc==SQLITE_OK ){ sqlite3_step(pStmt); rc = sqlite3_reset(pStmt); @@ -172607,22 +172607,22 @@ static void fts3SqlExec( /* -** This function ensures that the caller has obtained an exclusive -** shared-cache table-lock on the %_segdir table. This is required before +** This function ensures that the caller has obtained an exclusive +** shared-cache table-lock on the %_segdir table. This is required before ** writing data to the fts3 table. If this lock is not acquired first, then ** the caller may end up attempting to take this lock as part of committing -** a transaction, causing SQLite to return SQLITE_LOCKED or +** a transaction, causing SQLite to return SQLITE_LOCKED or ** LOCKED_SHAREDCACHEto a COMMIT command. ** -** It is best to avoid this because if FTS3 returns any error when -** committing a transaction, the whole transaction will be rolled back. -** And this is not what users expect when they get SQLITE_LOCKED_SHAREDCACHE. -** It can still happen if the user locks the underlying tables directly +** It is best to avoid this because if FTS3 returns any error when +** committing a transaction, the whole transaction will be rolled back. +** And this is not what users expect when they get SQLITE_LOCKED_SHAREDCACHE. +** It can still happen if the user locks the underlying tables directly ** instead of accessing them via FTS. */ static int fts3Writelock(Fts3Table *p){ int rc = SQLITE_OK; - + if( p->nPendingData==0 ){ sqlite3_stmt *pStmt; rc = fts3SqlStmt(p, SQL_DELETE_SEGDIR_LEVEL, &pStmt, 0); @@ -172639,7 +172639,7 @@ static int fts3Writelock(Fts3Table *p){ /* ** FTS maintains a separate indexes for each language-id (a 32-bit integer). ** Within each language id, a separate index is maintained to store the -** document terms, and each configured prefix size (configured the FTS +** document terms, and each configured prefix size (configured the FTS ** "prefix=" option). And each index consists of multiple levels ("relative ** levels"). ** @@ -172649,14 +172649,14 @@ static int fts3Writelock(Fts3Table *p){ ** separate component values into the single 64-bit integer value that ** can be used to query the %_segdir table. ** -** Specifically, each language-id/index combination is allocated 1024 +** Specifically, each language-id/index combination is allocated 1024 ** 64-bit integer level values ("absolute levels"). The main terms index ** for language-id 0 is allocate values 0-1023. The first prefix index ** (if any) for language-id 0 is allocated values 1024-2047. And so on. ** Language 1 indexes are allocated immediately following language 0. ** ** So, for a system with nPrefix prefix indexes configured, the block of -** absolute levels that corresponds to language-id iLangid and index +** absolute levels that corresponds to language-id iLangid and index ** iIndex starts at absolute level ((iLangid * (nPrefix+1) + iIndex) * 1024). */ static sqlite3_int64 getAbsoluteLevel( @@ -172677,7 +172677,7 @@ static sqlite3_int64 getAbsoluteLevel( /* ** Set *ppStmt to a statement handle that may be used to iterate through ** all rows in the %_segdir table, from oldest to newest. If successful, -** return SQLITE_OK. If an error occurs while preparing the statement, +** return SQLITE_OK. If an error occurs while preparing the statement, ** return an SQLite error code. ** ** There is only ever one instance of this SQL statement compiled for @@ -172708,16 +172708,16 @@ SQLITE_PRIVATE int sqlite3Fts3AllSegdirs( if( iLevel<0 ){ /* "SELECT * FROM %_segdir WHERE level BETWEEN ? AND ? ORDER BY ..." */ rc = fts3SqlStmt(p, SQL_SELECT_LEVEL_RANGE, &pStmt, 0); - if( rc==SQLITE_OK ){ + if( rc==SQLITE_OK ){ sqlite3_bind_int64(pStmt, 1, getAbsoluteLevel(p, iLangid, iIndex, 0)); - sqlite3_bind_int64(pStmt, 2, + sqlite3_bind_int64(pStmt, 2, getAbsoluteLevel(p, iLangid, iIndex, FTS3_SEGDIR_MAXLEVEL-1) ); } }else{ /* "SELECT * FROM %_segdir WHERE level = ? ORDER BY ..." */ rc = fts3SqlStmt(p, SQL_SELECT_LEVEL, &pStmt, 0); - if( rc==SQLITE_OK ){ + if( rc==SQLITE_OK ){ sqlite3_bind_int64(pStmt, 1, getAbsoluteLevel(p, iLangid, iIndex,iLevel)); } } @@ -172861,7 +172861,7 @@ static int fts3PendingTermsAddOne( } if( fts3PendingListAppend(&pList, p->iPrevDocid, iCol, iPos, &rc) ){ if( pList==fts3HashInsert(pHash, zToken, nToken, pList) ){ - /* Malloc failed while inserting the new entry. This can only + /* Malloc failed while inserting the new entry. This can only ** happen if there was no previous entry for this token. */ assert( 0==fts3HashFind(pHash, zToken, nToken) ); @@ -172907,7 +172907,7 @@ static int fts3PendingTermsAdd( assert( pTokenizer && pModule ); /* If the user has inserted a NULL value, this function may be called with - ** zText==0. In this case, add zero token entries to the hash table and + ** zText==0. In this case, add zero token entries to the hash table and ** return early. */ if( zText==0 ){ *pnWord = 0; @@ -172938,8 +172938,8 @@ static int fts3PendingTermsAdd( rc = fts3PendingTermsAddOne( p, iCol, iPos, &p->aIndex[0].hPending, zToken, nToken ); - - /* Add the term to each of the prefix indexes that it is not too + + /* Add the term to each of the prefix indexes that it is not too ** short for. */ for(i=1; rc==SQLITE_OK && inIndex; i++){ struct Fts3Index *pIndex = &p->aIndex[i]; @@ -172955,8 +172955,8 @@ static int fts3PendingTermsAdd( return (rc==SQLITE_DONE ? SQLITE_OK : rc); } -/* -** Calling this function indicates that subsequent calls to +/* +** Calling this function indicates that subsequent calls to ** fts3PendingTermsAdd() are to add term/position-list pairs for the ** contents of the document with docid iDocid. */ @@ -172975,10 +172975,10 @@ static int fts3PendingTermsDocid( ** buffer was half empty, that would let the less frequent terms ** generate longer doclists. */ - if( iDocidiPrevDocid + if( iDocidiPrevDocid || (iDocid==p->iPrevDocid && p->bPrevDelete==0) || p->iPrevLangid!=iLangid - || p->nPendingData>p->nMaxPendingData + || p->nPendingData>p->nMaxPendingData ){ int rc = sqlite3Fts3PendingTermsFlush(p); if( rc!=SQLITE_OK ) return rc; @@ -172990,7 +172990,7 @@ static int fts3PendingTermsDocid( } /* -** Discard the contents of the pending-terms hash tables. +** Discard the contents of the pending-terms hash tables. */ SQLITE_PRIVATE void sqlite3Fts3PendingTermsClear(Fts3Table *p){ int i; @@ -173015,9 +173015,9 @@ SQLITE_PRIVATE void sqlite3Fts3PendingTermsClear(Fts3Table *p){ ** fts3InsertData(). Parameter iDocid is the docid of the new row. */ static int fts3InsertTerms( - Fts3Table *p, - int iLangid, - sqlite3_value **apVal, + Fts3Table *p, + int iLangid, + sqlite3_value **apVal, u32 *aSz ){ int i; /* Iterator variable */ @@ -173080,7 +173080,7 @@ static int fts3InsertData( rc = fts3SqlStmt(p, SQL_CONTENT_INSERT, &pContentInsert, &apVal[1]); if( rc==SQLITE_OK && p->zLanguageid ){ rc = sqlite3_bind_int( - pContentInsert, p->nColumn+2, + pContentInsert, p->nColumn+2, sqlite3_value_int(apVal[p->nColumn+4]) ); } @@ -173107,8 +173107,8 @@ static int fts3InsertData( if( rc!=SQLITE_OK ) return rc; } - /* Execute the statement to insert the record. Set *piDocid to the - ** new docid value. + /* Execute the statement to insert the record. Set *piDocid to the + ** new docid value. */ sqlite3_step(pContentInsert); rc = sqlite3_reset(pContentInsert); @@ -173158,7 +173158,7 @@ static int langidFromSelect(Fts3Table *p, sqlite3_stmt *pSelect){ ** (an integer) of a row about to be deleted. Remove all terms from the ** full-text index. */ -static void fts3DeleteTerms( +static void fts3DeleteTerms( int *pRC, /* Result code */ Fts3Table *p, /* The FTS table to delete from */ sqlite3_value *pRowid, /* The docid to be deleted */ @@ -173205,7 +173205,7 @@ static void fts3DeleteTerms( */ static int fts3SegmentMerge(Fts3Table *, int, int, int); -/* +/* ** This function allocates a new level iLevel index in the segdir table. ** Usually, indexes are allocated within a level sequentially starting ** with 0, so the allocated index is one greater than the value returned @@ -173214,17 +173214,17 @@ static int fts3SegmentMerge(Fts3Table *, int, int, int); ** SELECT max(idx) FROM %_segdir WHERE level = :iLevel ** ** However, if there are already FTS3_MERGE_COUNT indexes at the requested -** level, they are merged into a single level (iLevel+1) segment and the +** level, they are merged into a single level (iLevel+1) segment and the ** allocated index is 0. ** ** If successful, *piIdx is set to the allocated index slot and SQLITE_OK ** returned. Otherwise, an SQLite error code is returned. */ static int fts3AllocateSegdirIdx( - Fts3Table *p, + Fts3Table *p, int iLangid, /* Language id */ int iIndex, /* Index for p->aIndex */ - int iLevel, + int iLevel, int *piIdx ){ int rc; /* Return Code */ @@ -173272,7 +173272,7 @@ static int fts3AllocateSegdirIdx( ** This function reads data from a single row of the %_segments table. The ** specific row is identified by the iBlockid parameter. If paBlob is not ** NULL, then a buffer is allocated using sqlite3_malloc() and populated -** with the contents of the blob stored in the "block" column of the +** with the contents of the blob stored in the "block" column of the ** identified table row is. Whether or not paBlob is NULL, *pnBlob is set ** to the size of the blob in bytes before returning. ** @@ -173349,14 +173349,14 @@ SQLITE_PRIVATE void sqlite3Fts3SegmentsClose(Fts3Table *p){ sqlite3_blob_close(p->pSegments); p->pSegments = 0; } - + static int fts3SegReaderIncrRead(Fts3SegReader *pReader){ int nRead; /* Number of bytes to read */ int rc; /* Return code */ nRead = MIN(pReader->nNode - pReader->nPopulate, FTS3_NODE_CHUNKSIZE); rc = sqlite3_blob_read( - pReader->pBlob, + pReader->pBlob, &pReader->aNode[pReader->nPopulate], nRead, pReader->nPopulate @@ -173376,10 +173376,10 @@ static int fts3SegReaderIncrRead(Fts3SegReader *pReader){ static int fts3SegReaderRequire(Fts3SegReader *pReader, char *pFrom, int nByte){ int rc = SQLITE_OK; - assert( !pReader->pBlob + assert( !pReader->pBlob || (pFrom>=pReader->aNode && pFrom<&pReader->aNode[pReader->nNode]) ); - while( pReader->pBlob && rc==SQLITE_OK + while( pReader->pBlob && rc==SQLITE_OK && (pFrom - pReader->aNode + nByte)>pReader->nPopulate ){ rc = fts3SegReaderIncrRead(pReader); @@ -173405,7 +173405,7 @@ static void fts3SegReaderSetEof(Fts3SegReader *pSeg){ ** SQLITE_DONE. Otherwise, an SQLite error code. */ static int fts3SegReaderNext( - Fts3Table *p, + Fts3Table *p, Fts3SegReader *pReader, int bIncr ){ @@ -173445,7 +173445,7 @@ static int fts3SegReaderNext( fts3SegReaderSetEof(pReader); - /* If iCurrentBlock>=iLeafEndBlock, this is an EOF condition. All leaf + /* If iCurrentBlock>=iLeafEndBlock, this is an EOF condition. All leaf ** blocks have already been traversed. */ #ifdef CORRUPT_DB assert( pReader->iCurrentBlock<=pReader->iLeafEndBlock || CORRUPT_DB ); @@ -173455,7 +173455,7 @@ static int fts3SegReaderNext( } rc = sqlite3Fts3ReadBlock( - p, ++pReader->iCurrentBlock, &pReader->aNode, &pReader->nNode, + p, ++pReader->iCurrentBlock, &pReader->aNode, &pReader->nNode, (bIncr ? &pReader->nPopulate : 0) ); if( rc!=SQLITE_OK ) return rc; @@ -173471,12 +173471,12 @@ static int fts3SegReaderNext( rc = fts3SegReaderRequire(pReader, pNext, FTS3_VARINT_MAX*2); if( rc!=SQLITE_OK ) return rc; - - /* Because of the FTS3_NODE_PADDING bytes of padding, the following is + + /* Because of the FTS3_NODE_PADDING bytes of padding, the following is ** safe (no risk of overread) even if the node data is corrupted. */ pNext += fts3GetVarint32(pNext, &nPrefix); pNext += fts3GetVarint32(pNext, &nSuffix); - if( nSuffix<=0 + if( nSuffix<=0 || (&pReader->aNode[pReader->nNode] - pNext)pReader->nTermAlloc ){ @@ -173507,7 +173507,7 @@ static int fts3SegReaderNext( pReader->pOffsetList = 0; /* Check that the doclist does not appear to extend past the end of the - ** b-tree node. And that the final byte of the doclist is 0x00. If either + ** b-tree node. And that the final byte of the doclist is 0x00. If either ** of these statements is untrue, then the data structure is corrupt. */ if( pReader->nDoclist > pReader->nNode-(pReader->aDoclist-pReader->aNode) @@ -173531,7 +173531,7 @@ static int fts3SegReaderFirstDocid(Fts3Table *pTab, Fts3SegReader *pReader){ pReader->iDocid = 0; pReader->nOffsetList = 0; sqlite3Fts3DoclistPrev(0, - pReader->aDoclist, pReader->nDoclist, &pReader->pOffsetList, + pReader->aDoclist, pReader->nDoclist, &pReader->pOffsetList, &pReader->iDocid, &pReader->nOffsetList, &bEof ); }else{ @@ -173547,8 +173547,8 @@ static int fts3SegReaderFirstDocid(Fts3Table *pTab, Fts3SegReader *pReader){ /* ** Advance the SegReader to point to the next docid in the doclist ** associated with the current term. -** -** If arguments ppOffsetList and pnOffsetList are not NULL, then +** +** If arguments ppOffsetList and pnOffsetList are not NULL, then ** *ppOffsetList is set to point to the first column-offset list ** in the doclist entry (i.e. immediately past the docid varint). ** *pnOffsetList is set to the length of the set of column-offset @@ -173591,22 +173591,22 @@ static int fts3SegReaderNextDocid( ** following block advances it to point one byte past the end of ** the same offset list. */ while( 1 ){ - + /* The following line of code (and the "p++" below the while() loop) is - ** normally all that is required to move pointer p to the desired + ** normally all that is required to move pointer p to the desired ** position. The exception is if this node is being loaded from disk ** incrementally and pointer "p" now points to the first byte past ** the populated part of pReader->aNode[]. */ while( *p | c ) c = *p++ & 0x80; assert( *p==0 ); - + if( pReader->pBlob==0 || p<&pReader->aNode[pReader->nPopulate] ) break; rc = fts3SegReaderIncrRead(pReader); if( rc!=SQLITE_OK ) return rc; } p++; - + /* If required, populate the output variables with a pointer to and the ** size of the previous offset-list. */ @@ -173617,7 +173617,7 @@ static int fts3SegReaderNextDocid( /* List may have been edited in place by fts3EvalNearTrim() */ while( pnSegment; ii++){ Fts3SegReader *pReader = pMsr->apSegment[ii]; - if( !fts3SegReaderIsPending(pReader) - && !fts3SegReaderIsRootOnly(pReader) + if( !fts3SegReaderIsPending(pReader) + && !fts3SegReaderIsRootOnly(pReader) ){ sqlite3_int64 jj; for(jj=pReader->iStartBlock; jj<=pReader->iLeafEndBlock; jj++){ @@ -173678,7 +173678,7 @@ SQLITE_PRIVATE int sqlite3Fts3MsrOvfl( } /* -** Free all allocations associated with the iterator passed as the +** Free all allocations associated with the iterator passed as the ** second argument. */ SQLITE_PRIVATE void sqlite3Fts3SegReaderFree(Fts3SegReader *pReader){ @@ -173837,7 +173837,7 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderPending( }else{ /* The query is a simple term lookup that matches at most one term in - ** the index. All that is required is a straight hash-lookup. + ** the index. All that is required is a straight hash-lookup. ** ** Because the stack address of pE may be accessed via the aElem pointer ** below, the "Fts3HashElem *pE" must be declared so that it is valid @@ -173872,7 +173872,7 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderPending( } /* -** Compare the entries pointed to by two Fts3SegReader structures. +** Compare the entries pointed to by two Fts3SegReader structures. ** Comparison is as follows: ** ** 1) EOF is greater than not EOF. @@ -173943,7 +173943,7 @@ static int fts3SegReaderDoclistCmpRev(Fts3SegReader *pLhs, Fts3SegReader *pRhs){ /* ** Compare the term that the Fts3SegReader object passed as the first argument -** points to with the term specified by arguments zTerm and nTerm. +** points to with the term specified by arguments zTerm and nTerm. ** ** If the pSeg iterator is already at EOF, return 0. Otherwise, return ** -ve if the pSeg term is less than zTerm/nTerm, 0 if the two terms are @@ -174004,7 +174004,7 @@ static void fts3SegReaderSort( #endif } -/* +/* ** Insert a record into the %_segments table. */ static int fts3WriteSegment( @@ -174046,7 +174046,7 @@ SQLITE_PRIVATE int sqlite3Fts3MaxLevel(Fts3Table *p, int *pnMax){ return rc; } -/* +/* ** Insert a record into the %_segdir table. */ static int fts3WriteSegdir( @@ -174084,7 +174084,7 @@ static int fts3WriteSegdir( /* ** Return the size of the common prefix (if any) shared by zPrev and -** zNext, in bytes. For example, +** zNext, in bytes. For example, ** ** fts3PrefixCompress("abc", 3, "abcdef", 6) // returns 3 ** fts3PrefixCompress("abX", 3, "abcdef", 6) // returns 2 @@ -174108,7 +174108,7 @@ static int fts3PrefixCompress( */ static int fts3NodeAddTerm( Fts3Table *p, /* Virtual table handle */ - SegmentNode **ppTree, /* IN/OUT: SegmentNode handle */ + SegmentNode **ppTree, /* IN/OUT: SegmentNode handle */ int isCopyTerm, /* True if zTerm/nTerm is transient */ const char *zTerm, /* Pointer to buffer containing term */ int nTerm /* Size of term in bytes */ @@ -174117,7 +174117,7 @@ static int fts3NodeAddTerm( int rc; SegmentNode *pNew; - /* First try to append the term to the current node. Return early if + /* First try to append the term to the current node. Return early if ** this is possible. */ if( pTree ){ @@ -174137,8 +174137,8 @@ static int fts3NodeAddTerm( ** and the static node buffer (p->nNodeSize bytes) is not large ** enough. Use a separately malloced buffer instead This wastes ** p->nNodeSize bytes, but since this scenario only comes about when - ** the database contain two terms that share a prefix of almost 2KB, - ** this is not expected to be a serious problem. + ** the database contain two terms that share a prefix of almost 2KB, + ** this is not expected to be a serious problem. */ assert( pTree->aData==(char *)&pTree[1] ); pTree->aData = (char *)sqlite3_malloc(nReq); @@ -174182,7 +174182,7 @@ static int fts3NodeAddTerm( ** If this is the first node in the tree, the term is added to it. ** ** Otherwise, the term is not added to the new node, it is left empty for - ** now. Instead, the term is inserted into the parent of pTree. If pTree + ** now. Instead, the term is inserted into the parent of pTree. If pTree ** has no parent, one is created here. */ pNew = (SegmentNode *)sqlite3_malloc(sizeof(SegmentNode) + p->nNodeSize); @@ -174207,7 +174207,7 @@ static int fts3NodeAddTerm( pTree->zMalloc = 0; }else{ pNew->pLeftmost = pNew; - rc = fts3NodeAddTerm(p, &pNew, isCopyTerm, zTerm, nTerm); + rc = fts3NodeAddTerm(p, &pNew, isCopyTerm, zTerm, nTerm); } *ppTree = pNew; @@ -174218,8 +174218,8 @@ static int fts3NodeAddTerm( ** Helper function for fts3NodeWrite(). */ static int fts3TreeFinishNode( - SegmentNode *pTree, - int iHeight, + SegmentNode *pTree, + int iHeight, sqlite3_int64 iLeftChild ){ int nStart; @@ -174232,15 +174232,15 @@ static int fts3TreeFinishNode( /* ** Write the buffer for the segment node pTree and all of its peers to the -** database. Then call this function recursively to write the parent of -** pTree and its peers to the database. +** database. Then call this function recursively to write the parent of +** pTree and its peers to the database. ** ** Except, if pTree is a root node, do not write it to the database. Instead, ** set output variables *paRoot and *pnRoot to contain the root node. ** ** If successful, SQLITE_OK is returned and output variable *piLast is ** set to the largest blockid written to the database (or zero if no -** blocks were written to the db). Otherwise, an SQLite error code is +** blocks were written to the db). Otherwise, an SQLite error code is ** returned. */ static int fts3NodeWrite( @@ -174268,7 +174268,7 @@ static int fts3NodeWrite( for(pIter=pTree->pLeftmost; pIter && rc==SQLITE_OK; pIter=pIter->pRight){ int nStart = fts3TreeFinishNode(pIter, iHeight, iNextLeaf); int nWrite = pIter->nData - nStart; - + rc = fts3WriteSegment(p, iNextFree, &pIter->aData[nStart], nWrite); iNextFree++; iNextLeaf += (pIter->nEntry+1); @@ -174314,7 +174314,7 @@ static void fts3NodeFree(SegmentNode *pTree){ */ static int fts3SegWriterAdd( Fts3Table *p, /* Virtual table handle */ - SegmentWriter **ppWriter, /* IN/OUT: SegmentWriter handle */ + SegmentWriter **ppWriter, /* IN/OUT: SegmentWriter handle */ int isCopyTerm, /* True if buffer zTerm must be copied */ const char *zTerm, /* Pointer to buffer containing term */ int nTerm, /* Size of term in bytes */ @@ -174357,7 +174357,7 @@ static int fts3SegWriterAdd( nPrefix = fts3PrefixCompress(pWriter->zTerm, pWriter->nTerm, zTerm, nTerm); nSuffix = nTerm-nPrefix; - /* If nSuffix is zero or less, then zTerm/nTerm must be a prefix of + /* If nSuffix is zero or less, then zTerm/nTerm must be a prefix of ** pWriter->zTerm/pWriter->nTerm. i.e. must be equal to or less than when ** compared with BINARY collation. This indicates corruption. */ if( nSuffix<=0 ) return FTS_CORRUPT_VTAB; @@ -174479,12 +174479,12 @@ static int fts3SegWriterFlush( pWriter->iFirst, pWriter->iFree, &iLast, &zRoot, &nRoot); } if( rc==SQLITE_OK ){ - rc = fts3WriteSegdir(p, iLevel, iIdx, + rc = fts3WriteSegdir(p, iLevel, iIdx, pWriter->iFirst, iLastLeaf, iLast, pWriter->nLeafData, zRoot, nRoot); } }else{ /* The entire tree fits on the root node. Write it to the segdir table. */ - rc = fts3WriteSegdir(p, iLevel, iIdx, + rc = fts3WriteSegdir(p, iLevel, iIdx, 0, 0, 0, pWriter->nLeafData, pWriter->aData, pWriter->nData); } p->nLeafAdd++; @@ -174492,7 +174492,7 @@ static int fts3SegWriterFlush( } /* -** Release all memory held by the SegmentWriter object passed as the +** Release all memory held by the SegmentWriter object passed as the ** first argument. */ static void fts3SegWriterFree(SegmentWriter *pWriter){ @@ -174542,9 +174542,9 @@ static int fts3IsEmpty(Fts3Table *p, sqlite3_value *pRowid, int *pisEmpty){ ** Return SQLITE_OK if successful, or an SQLite error code if not. */ static int fts3SegmentMaxLevel( - Fts3Table *p, + Fts3Table *p, int iLangid, - int iIndex, + int iIndex, sqlite3_int64 *pnMax ){ sqlite3_stmt *pStmt; @@ -174560,7 +174560,7 @@ static int fts3SegmentMaxLevel( rc = fts3SqlStmt(p, SQL_SELECT_SEGDIR_MAX_LEVEL, &pStmt, 0); if( rc!=SQLITE_OK ) return rc; sqlite3_bind_int64(pStmt, 1, getAbsoluteLevel(p, iLangid, iIndex, 0)); - sqlite3_bind_int64(pStmt, 2, + sqlite3_bind_int64(pStmt, 2, getAbsoluteLevel(p, iLangid, iIndex, FTS3_SEGDIR_MAXLEVEL-1) ); if( SQLITE_ROW==sqlite3_step(pStmt) ){ @@ -174589,7 +174589,7 @@ static int fts3SegmentIsMaxLevel(Fts3Table *p, i64 iAbsLevel, int *pbMax){ int rc = fts3SqlStmt(p, SQL_SELECT_SEGDIR_MAX_LEVEL, &pStmt, 0); if( rc!=SQLITE_OK ) return rc; sqlite3_bind_int64(pStmt, 1, iAbsLevel+1); - sqlite3_bind_int64(pStmt, 2, + sqlite3_bind_int64(pStmt, 2, ((iAbsLevel/FTS3_SEGDIR_MAXLEVEL)+1) * FTS3_SEGDIR_MAXLEVEL ); @@ -174627,9 +174627,9 @@ static int fts3DeleteSegment( ** This function is used after merging multiple segments into a single large ** segment to delete the old, now redundant, segment b-trees. Specifically, ** it: -** -** 1) Deletes all %_segments entries for the segments associated with -** each of the SegReader objects in the array passed as the third +** +** 1) Deletes all %_segments entries for the segments associated with +** each of the SegReader objects in the array passed as the third ** argument, and ** ** 2) deletes all %_segdir entries with level iLevel, or all %_segdir @@ -174661,7 +174661,7 @@ static int fts3DeleteSegdir( rc = fts3SqlStmt(p, SQL_DELETE_SEGDIR_RANGE, &pDelete, 0); if( rc==SQLITE_OK ){ sqlite3_bind_int64(pDelete, 1, getAbsoluteLevel(p, iLangid, iIndex, 0)); - sqlite3_bind_int64(pDelete, 2, + sqlite3_bind_int64(pDelete, 2, getAbsoluteLevel(p, iLangid, iIndex, FTS3_SEGDIR_MAXLEVEL-1) ); } @@ -174683,7 +174683,7 @@ static int fts3DeleteSegdir( } /* -** When this function is called, buffer *ppList (size *pnList bytes) contains +** When this function is called, buffer *ppList (size *pnList bytes) contains ** a position list that may (or may not) feature multiple columns. This ** function adjusts the pointer *ppList and the length *pnList so that they ** identify the subset of the position list that corresponds to column iCol. @@ -174710,7 +174710,7 @@ static void fts3ColumnFilter( while( 1 ){ char c = 0; while( ppOffsetList && apSegment[j]->iDocid==iDocid @@ -174833,7 +174833,7 @@ static int fts3SegReaderStart( int i; int nSeg = pCsr->nSegment; - /* If the Fts3SegFilter defines a specific term (or term prefix) to search + /* If the Fts3SegFilter defines a specific term (or term prefix) to search ** for, then advance each segment iterator until it points to a term of ** equal or greater value than the specified term. This prevents many ** unnecessary merge/sort operations for the case where single segment @@ -174917,7 +174917,7 @@ SQLITE_PRIVATE int sqlite3Fts3MsrIncrStart( ** sqlite3Fts3SegReaderStart() ** sqlite3Fts3SegReaderStep() ** -** then the entire doclist for the term is available in +** then the entire doclist for the term is available in ** MultiSegReader.aDoclist/nDoclist. */ SQLITE_PRIVATE int sqlite3Fts3MsrIncrRestart(Fts3MultiSegReader *pCsr){ @@ -174965,9 +174965,9 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderStep( do { int nMerge; int i; - + /* Advance the first pCsr->nAdvance entries in the apSegment[] array - ** forward. Then sort the list in order of current term again. + ** forward. Then sort the list in order of current term again. */ for(i=0; inAdvance; i++){ Fts3SegReader *pSeg = apSegment[i]; @@ -174989,34 +174989,34 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderStep( pCsr->zTerm = apSegment[0]->zTerm; /* If this is a prefix-search, and if the term that apSegment[0] points - ** to does not share a suffix with pFilter->zTerm/nTerm, then all + ** to does not share a suffix with pFilter->zTerm/nTerm, then all ** required callbacks have been made. In this case exit early. ** ** Similarly, if this is a search for an exact match, and the first term ** of segment apSegment[0] is not a match, exit early. */ if( pFilter->zTerm && !isScan ){ - if( pCsr->nTermnTerm + if( pCsr->nTermnTerm || (!isPrefix && pCsr->nTerm>pFilter->nTerm) - || memcmp(pCsr->zTerm, pFilter->zTerm, pFilter->nTerm) + || memcmp(pCsr->zTerm, pFilter->zTerm, pFilter->nTerm) ){ break; } } nMerge = 1; - while( nMergeaNode - && apSegment[nMerge]->nTerm==pCsr->nTerm + && apSegment[nMerge]->nTerm==pCsr->nTerm && 0==memcmp(pCsr->zTerm, apSegment[nMerge]->zTerm, pCsr->nTerm) ){ nMerge++; } assert( isIgnoreEmpty || (isRequirePos && !isColFilter) ); - if( nMerge==1 - && !isIgnoreEmpty - && !isFirst + if( nMerge==1 + && !isIgnoreEmpty + && !isFirst && (p->bDescIdx==0 || fts3SegReaderIsPending(apSegment[0])==0) ){ pCsr->nDoclist = apSegment[0]->nDoclist; @@ -175061,7 +175061,7 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderStep( if( !isIgnoreEmpty || nList>0 ){ - /* Calculate the 'docid' delta value to write into the merged + /* Calculate the 'docid' delta value to write into the merged ** doclist. */ sqlite3_int64 iDelta; if( p->bDescIdx && nDoclist>0 ){ @@ -175088,7 +175088,7 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderStep( if( isFirst ){ char *a = &pCsr->aBuffer[nDoclist]; int nWrite; - + nWrite = sqlite3Fts3FirstFilter(iDelta, pList, nList, a); if( nWrite ){ iPrev = iDocid; @@ -175138,18 +175138,18 @@ SQLITE_PRIVATE void sqlite3Fts3SegReaderFinish( } /* -** Decode the "end_block" field, selected by column iCol of the SELECT -** statement passed as the first argument. +** Decode the "end_block" field, selected by column iCol of the SELECT +** statement passed as the first argument. ** ** The "end_block" field may contain either an integer, or a text field -** containing the text representation of two non-negative integers separated -** by one or more space (0x20) characters. In the first case, set *piEndBlock -** to the integer value and *pnByte to zero before returning. In the second, +** containing the text representation of two non-negative integers separated +** by one or more space (0x20) characters. In the first case, set *piEndBlock +** to the integer value and *pnByte to zero before returning. In the second, ** set *piEndBlock to the first value and *pnByte to the second. */ static void fts3ReadEndBlockField( - sqlite3_stmt *pStmt, - int iCol, + sqlite3_stmt *pStmt, + int iCol, i64 *piEndBlock, i64 *pnByte ){ @@ -175195,10 +175195,10 @@ static int fts3PromoteSegments( i64 iLast = (iAbsLevel/FTS3_SEGDIR_MAXLEVEL + 1) * FTS3_SEGDIR_MAXLEVEL - 1; i64 nLimit = (nByte*3)/2; - /* Loop through all entries in the %_segdir table corresponding to + /* Loop through all entries in the %_segdir table corresponding to ** segments in this index on levels greater than iAbsLevel. If there is - ** at least one such segment, and it is possible to determine that all - ** such segments are smaller than nLimit bytes in size, they will be + ** at least one such segment, and it is possible to determine that all + ** such segments are smaller than nLimit bytes in size, they will be ** promoted to level iAbsLevel. */ sqlite3_bind_int64(pRange, 1, iAbsLevel+1); sqlite3_bind_int64(pRange, 2, iLast); @@ -175206,7 +175206,7 @@ static int fts3PromoteSegments( i64 nSize = 0, dummy; fts3ReadEndBlockField(pRange, 2, &dummy, &nSize); if( nSize<=0 || nSize>nLimit ){ - /* If nSize==0, then the %_segdir.end_block field does not not + /* If nSize==0, then the %_segdir.end_block field does not not ** contain a size value. This happens if it was written by an ** old version of FTS. In this case it is not possible to determine ** the size of the segment, and so segment promotion does not @@ -175272,18 +175272,18 @@ static int fts3PromoteSegments( } /* -** Merge all level iLevel segments in the database into a single +** Merge all level iLevel segments in the database into a single ** iLevel+1 segment. Or, if iLevel<0, merge all segments into a -** single segment with a level equal to the numerically largest level +** single segment with a level equal to the numerically largest level ** currently present in the database. ** ** If this function is called with iLevel<0, but there is only one -** segment in the database, SQLITE_DONE is returned immediately. -** Otherwise, if successful, SQLITE_OK is returned. If an error occurs, +** segment in the database, SQLITE_DONE is returned immediately. +** Otherwise, if successful, SQLITE_OK is returned. If an error occurs, ** an SQLite error code is returned. */ static int fts3SegmentMerge( - Fts3Table *p, + Fts3Table *p, int iLangid, /* Language id to merge */ int iIndex, /* Index in p->aIndex[] to merge */ int iLevel /* Level to merge */ @@ -175327,7 +175327,7 @@ static int fts3SegmentMerge( }else{ /* This call is to merge all segments at level iLevel. find the next ** available segment index at level iLevel+1. The call to - ** fts3AllocateSegdirIdx() will merge the segments at level iLevel+1 to + ** fts3AllocateSegdirIdx() will merge the segments at level iLevel+1 to ** a single iLevel+2 segment if necessary. */ assert( FTS3_SEGCURSOR_PENDING==-1 ); iNewLevel = getAbsoluteLevel(p, iLangid, iIndex, iLevel+1); @@ -175338,8 +175338,8 @@ static int fts3SegmentMerge( assert( csr.nSegment>0 ); assert_fts3_nc( iNewLevel>=getAbsoluteLevel(p, iLangid, iIndex, 0) ); - assert_fts3_nc( - iNewLevelnIndex; i++){ rc = fts3SegmentMerge(p, p->iPrevLangid, i, FTS3_SEGCURSOR_PENDING); if( rc==SQLITE_DONE ) rc = SQLITE_OK; @@ -175488,7 +175488,7 @@ static void fts3InsertDocsize( /* ** Record 0 of the %_stat table contains a blob consisting of N varints, ** where N is the number of user defined columns in the fts3 table plus -** two. If nCol is the number of user defined columns, then values of the +** two. If nCol is the number of user defined columns, then values of the ** varints are set as follows: ** ** Varint 0: Total number of rows in the table. @@ -175573,7 +175573,7 @@ static void fts3UpdateDocTotals( } /* -** Merge the entire database so that there is one segment for each +** Merge the entire database so that there is one segment for each ** iIndex/iLangid combination. */ static int fts3DoOptimize(Fts3Table *p, int bReturnDone){ @@ -175612,7 +175612,7 @@ static int fts3DoOptimize(Fts3Table *p, int bReturnDone){ ** ** INSERT INTO () VALUES('rebuild'); ** -** The entire FTS index is discarded and rebuilt. If the table is one +** The entire FTS index is discarded and rebuilt. If the table is one ** created using the content=xxx option, then the new index is based on ** the current contents of the xxx table. Otherwise, it is rebuilt based ** on the contents of the %_content table. @@ -175692,9 +175692,9 @@ static int fts3DoRebuild(Fts3Table *p){ /* -** This function opens a cursor used to read the input data for an +** This function opens a cursor used to read the input data for an ** incremental merge operation. Specifically, it opens a cursor to scan -** the oldest nSeg segments (idx=0 through idx=(nSeg-1)) in absolute +** the oldest nSeg segments (idx=0 through idx=(nSeg-1)) in absolute ** level iAbsLevel. */ static int fts3IncrmergeCsr( @@ -175704,7 +175704,7 @@ static int fts3IncrmergeCsr( Fts3MultiSegReader *pCsr /* Cursor object to populate */ ){ int rc; /* Return Code */ - sqlite3_stmt *pStmt = 0; /* Statement used to read %_segdir entry */ + sqlite3_stmt *pStmt = 0; /* Statement used to read %_segdir entry */ sqlite3_int64 nByte; /* Bytes allocated at pCsr->apSegment[] */ /* Allocate space for the Fts3MultiSegReader.aCsr[] array */ @@ -175759,7 +175759,7 @@ struct Blob { }; /* -** This structure is used to build up buffers containing segment b-tree +** This structure is used to build up buffers containing segment b-tree ** nodes (blocks). */ struct NodeWriter { @@ -175828,12 +175828,12 @@ static void blobGrowBuffer(Blob *pBlob, int nMin, int *pRc){ /* ** Attempt to advance the node-reader object passed as the first argument to -** the next entry on the node. +** the next entry on the node. ** -** Return an error code if an error occurs (SQLITE_NOMEM is possible). +** Return an error code if an error occurs (SQLITE_NOMEM is possible). ** Otherwise return SQLITE_OK. If there is no next entry on the node ** (e.g. because the current entry is the last) set NodeReader->aNode to -** NULL to indicate EOF. Otherwise, populate the NodeReader structure output +** NULL to indicate EOF. Otherwise, populate the NodeReader structure output ** variables for the new entry. */ static int nodeReaderNext(NodeReader *p){ @@ -175886,7 +175886,7 @@ static void nodeReaderRelease(NodeReader *p){ /* ** Initialize a node-reader object to read the node in buffer aNode/nNode. ** -** If successful, SQLITE_OK is returned and the NodeReader object set to +** If successful, SQLITE_OK is returned and the NodeReader object set to ** point to the first entry on the node (if any). Otherwise, an SQLite ** error code is returned. */ @@ -175935,7 +175935,7 @@ static int fts3IncrmergePush( int nSpace; /* Figure out how much space the key will consume if it is written to - ** the current node of layer iLayer. Due to the prefix compression, + ** the current node of layer iLayer. Due to the prefix compression, ** the space required changes depending on which node the key is to ** be added to. */ nPrefix = fts3PrefixCompress(pNode->key.a, pNode->key.n, zTerm, nTerm); @@ -175943,9 +175943,9 @@ static int fts3IncrmergePush( nSpace = sqlite3Fts3VarintLen(nPrefix); nSpace += sqlite3Fts3VarintLen(nSuffix) + nSuffix; - if( pNode->key.n==0 || (pNode->block.n + nSpace)<=p->nNodeSize ){ + if( pNode->key.n==0 || (pNode->block.n + nSpace)<=p->nNodeSize ){ /* If the current node of layer iLayer contains zero keys, or if adding - ** the key to it will not cause it to grow to larger than nNodeSize + ** the key to it will not cause it to grow to larger than nNodeSize ** bytes in size, write the key here. */ Blob *pBlk = &pNode->block; @@ -176001,12 +176001,12 @@ static int fts3IncrmergePush( ** A node header is a single 0x00 byte for a leaf node, or a height varint ** followed by the left-hand-child varint for an internal node. ** -** The term to be appended is passed via arguments zTerm/nTerm. For a +** The term to be appended is passed via arguments zTerm/nTerm. For a ** leaf node, the doclist is passed as aDoclist/nDoclist. For an internal ** node, both aDoclist and nDoclist must be passed 0. ** ** If the size of the value in blob pPrev is zero, then this is the first -** term written to the node. Otherwise, pPrev contains a copy of the +** term written to the node. Otherwise, pPrev contains a copy of the ** previous term. Before this function returns, it is updated to contain a ** copy of zTerm/nTerm. ** @@ -176023,7 +176023,7 @@ static int fts3AppendToNode( const char *zTerm, /* New term to write */ int nTerm, /* Size of zTerm in bytes */ const char *aDoclist, /* Doclist (or NULL) to write */ - int nDoclist /* Size of aDoclist in bytes */ + int nDoclist /* Size of aDoclist in bytes */ ){ int rc = SQLITE_OK; /* Return code */ int bFirst = (pPrev->n==0); /* True if this is the first term written */ @@ -176098,7 +176098,7 @@ static int fts3IncrmergeAppend( rc = fts3WriteSegment(p, pLeaf->iBlock, pLeaf->block.a, pLeaf->block.n); pWriter->nWork++; - /* Add the current term to the parent node. The term added to the + /* Add the current term to the parent node. The term added to the ** parent must: ** ** a) be greater than the largest term on the leaf node just written @@ -176163,7 +176163,7 @@ static void fts3IncrmergeRelease( NodeWriter *pRoot; /* NodeWriter for root node */ int rc = *pRc; /* Error code */ - /* Set iRoot to the index in pWriter->aNodeWriter[] of the output segment + /* Set iRoot to the index in pWriter->aNodeWriter[] of the output segment ** root node. If the segment fits entirely on a single leaf node, iRoot ** will be set to 0. If the root node is the parent of the leaves, iRoot ** will be 1. And so on. */ @@ -176181,17 +176181,17 @@ static void fts3IncrmergeRelease( /* The entire output segment fits on a single node. Normally, this means ** the node would be stored as a blob in the "root" column of the %_segdir - ** table. However, this is not permitted in this case. The problem is that - ** space has already been reserved in the %_segments table, and so the - ** start_block and end_block fields of the %_segdir table must be populated. - ** And, by design or by accident, released versions of FTS cannot handle + ** table. However, this is not permitted in this case. The problem is that + ** space has already been reserved in the %_segments table, and so the + ** start_block and end_block fields of the %_segdir table must be populated. + ** And, by design or by accident, released versions of FTS cannot handle ** segments that fit entirely on the root node with start_block!=0. ** - ** Instead, create a synthetic root node that contains nothing but a + ** Instead, create a synthetic root node that contains nothing but a ** pointer to the single content node. So that the segment consists of a ** single leaf and a single interior (root) node. ** - ** Todo: Better might be to defer allocating space in the %_segments + ** Todo: Better might be to defer allocating space in the %_segments ** table until we are sure it is needed. */ if( iRoot==0 ){ @@ -176219,7 +176219,7 @@ static void fts3IncrmergeRelease( /* Write the %_segdir record. */ if( rc==SQLITE_OK ){ - rc = fts3WriteSegdir(p, + rc = fts3WriteSegdir(p, pWriter->iAbsLevel+1, /* level */ pWriter->iIdx, /* idx */ pWriter->iStart, /* start_block */ @@ -176258,11 +176258,11 @@ static int fts3TermCmp( /* -** Query to see if the entry in the %_segments table with blockid iEnd is +** Query to see if the entry in the %_segments table with blockid iEnd is ** NULL. If no error occurs and the entry is NULL, set *pbRes 1 before -** returning. Otherwise, set *pbRes to 0. +** returning. Otherwise, set *pbRes to 0. ** -** Or, if an error occurs while querying the database, return an SQLite +** Or, if an error occurs while querying the database, return an SQLite ** error code. The final value of *pbRes is undefined in this case. ** ** This is used to test if a segment is an "appendable" segment. If it @@ -176280,14 +176280,14 @@ static int fts3IsAppendable(Fts3Table *p, sqlite3_int64 iEnd, int *pbRes){ if( SQLITE_ROW==sqlite3_step(pCheck) ) bRes = 1; rc = sqlite3_reset(pCheck); } - + *pbRes = bRes; return rc; } /* ** This function is called when initializing an incremental-merge operation. -** It checks if the existing segment with index value iIdx at absolute level +** It checks if the existing segment with index value iIdx at absolute level ** (iAbsLevel+1) can be appended to by the incremental merge. If it can, the ** merge-writer object *pWriter is initialized to write to it. ** @@ -176296,7 +176296,7 @@ static int fts3IsAppendable(Fts3Table *p, sqlite3_int64 iEnd, int *pbRes){ ** * It was initially created as an appendable segment (with all required ** space pre-allocated), and ** -** * The first key read from the input (arguments zKey and nKey) is +** * The first key read from the input (arguments zKey and nKey) is ** greater than the largest key currently stored in the potential ** output segment. */ @@ -176382,7 +176382,7 @@ static int fts3IncrmergeLoad( pNode = &pWriter->aNodeWriter[nHeight]; pNode->iBlock = pWriter->iStart + pWriter->nLeafEst*nHeight; - blobGrowBuffer(&pNode->block, + blobGrowBuffer(&pNode->block, MAX(nRoot, p->nNodeSize)+FTS3_NODE_PADDING, &rc ); if( rc==SQLITE_OK ){ @@ -176408,7 +176408,7 @@ static int fts3IncrmergeLoad( pNode = &pWriter->aNodeWriter[i-1]; pNode->iBlock = reader.iChild; rc = sqlite3Fts3ReadBlock(p, reader.iChild, &aBlock, &nBlock, 0); - blobGrowBuffer(&pNode->block, + blobGrowBuffer(&pNode->block, MAX(nBlock, p->nNodeSize)+FTS3_NODE_PADDING, &rc ); if( rc==SQLITE_OK ){ @@ -176434,13 +176434,13 @@ static int fts3IncrmergeLoad( /* ** Determine the largest segment index value that exists within absolute ** level iAbsLevel+1. If no error occurs, set *piIdx to this value plus -** one before returning SQLITE_OK. Or, if there are no segments at all +** one before returning SQLITE_OK. Or, if there are no segments at all ** within level iAbsLevel, set *piIdx to zero. ** ** If an error occurs, return an SQLite error code. The final value of ** *piIdx is undefined in this case. */ -static int fts3IncrmergeOutputIdx( +static int fts3IncrmergeOutputIdx( Fts3Table *p, /* FTS Table handle */ sqlite3_int64 iAbsLevel, /* Absolute index of input segments */ int *piIdx /* OUT: Next free index at iAbsLevel+1 */ @@ -176459,7 +176459,7 @@ static int fts3IncrmergeOutputIdx( return rc; } -/* +/* ** Allocate an appendable output segment on absolute level iAbsLevel+1 ** with idx value iIdx. ** @@ -176473,7 +176473,7 @@ static int fts3IncrmergeOutputIdx( ** When an appendable segment is allocated, it is estimated that the ** maximum number of leaf blocks that may be required is the sum of the ** number of leaf blocks consumed by the input segments, plus the number -** of input segments, multiplied by two. This value is stored in stack +** of input segments, multiplied by two. This value is stored in stack ** variable nLeafEst. ** ** A total of 16*nLeafEst blocks are allocated when an appendable segment @@ -176482,10 +176482,10 @@ static int fts3IncrmergeOutputIdx( ** of interior nodes that are parents of the leaf nodes start at block ** (start_block + (1 + end_block - start_block) / 16). And so on. ** -** In the actual code below, the value "16" is replaced with the +** In the actual code below, the value "16" is replaced with the ** pre-processor macro FTS_MAX_APPENDABLE_HEIGHT. */ -static int fts3IncrmergeWriter( +static int fts3IncrmergeWriter( Fts3Table *p, /* Fts3 table handle */ sqlite3_int64 iAbsLevel, /* Absolute level of input segments */ int iIdx, /* Index of new output segment */ @@ -176523,7 +176523,7 @@ static int fts3IncrmergeWriter( if( rc!=SQLITE_OK ) return rc; /* Insert the marker in the %_segments table to make sure nobody tries - ** to steal the space just allocated. This is also used to identify + ** to steal the space just allocated. This is also used to identify ** appendable segments. */ rc = fts3WriteSegment(p, pWriter->iEnd, 0, 0); if( rc!=SQLITE_OK ) return rc; @@ -176540,13 +176540,13 @@ static int fts3IncrmergeWriter( } /* -** Remove an entry from the %_segdir table. This involves running the +** Remove an entry from the %_segdir table. This involves running the ** following two statements: ** ** DELETE FROM %_segdir WHERE level = :iAbsLevel AND idx = :iIdx ** UPDATE %_segdir SET idx = idx - 1 WHERE level = :iAbsLevel AND idx > :iIdx ** -** The DELETE statement removes the specific %_segdir level. The UPDATE +** The DELETE statement removes the specific %_segdir level. The UPDATE ** statement ensures that the remaining segments have contiguously allocated ** idx values. */ @@ -176671,8 +176671,8 @@ static int fts3TruncateNode( pNew->n = 0; /* Populate new node buffer */ - for(rc = nodeReaderInit(&reader, aNode, nNode); - rc==SQLITE_OK && reader.aNode; + for(rc = nodeReaderInit(&reader, aNode, nNode); + rc==SQLITE_OK && reader.aNode; rc = nodeReaderNext(&reader) ){ if( pNew->n==0 ){ @@ -176699,7 +176699,7 @@ static int fts3TruncateNode( } /* -** Remove all terms smaller than zTerm/nTerm from segment iIdx in absolute +** Remove all terms smaller than zTerm/nTerm from segment iIdx in absolute ** level iAbsLevel. This may involve deleting entries from the %_segments ** table, and modifying existing entries in both the %_segments and %_segdir ** tables. @@ -176823,9 +176823,9 @@ static int fts3IncrmergeChomp( } *pnRem = 0; }else{ - /* The incremental merge did not copy all the data from this + /* The incremental merge did not copy all the data from this ** segment to the upper level. The segment is modified in place - ** so that it contains no keys smaller than zTerm/nTerm. */ + ** so that it contains no keys smaller than zTerm/nTerm. */ const char *zTerm = pSeg->zTerm; int nTerm = pSeg->nTerm; rc = fts3TruncateSegment(p, iAbsLevel, pSeg->iIdx, zTerm, nTerm); @@ -176861,7 +176861,7 @@ static int fts3IncrmergeHintStore(Fts3Table *p, Blob *pHint){ } /* -** Load an incr-merge hint from the database. The incr-merge hint, if one +** Load an incr-merge hint from the database. The incr-merge hint, if one ** exists, is stored in the rowid==1 row of the %_stat table. ** ** If successful, populate blob *pHint with the value read from the %_stat @@ -176898,7 +176898,7 @@ static int fts3IncrmergeHintLoad(Fts3Table *p, Blob *pHint){ /* ** If *pRc is not SQLITE_OK when this function is called, it is a no-op. ** Otherwise, append an entry to the hint stored in blob *pHint. Each entry -** consists of two varints, the absolute level number of the input segments +** consists of two varints, the absolute level number of the input segments ** and the number of input segments. ** ** If successful, leave *pRc set to SQLITE_OK and return. If an error occurs, @@ -176919,7 +176919,7 @@ static void fts3IncrmergeHintPush( /* ** Read the last entry (most recently pushed) from the hint blob *pHint -** and then remove the entry. Write the two values read to *piAbsLevel and +** and then remove the entry. Write the two values read to *piAbsLevel and ** *pnInput before returning. ** ** If no error occurs, return SQLITE_OK. If the hint blob in *pHint does @@ -176945,10 +176945,10 @@ static int fts3IncrmergeHintPop(Blob *pHint, i64 *piAbsLevel, int *pnInput){ /* ** Attempt an incremental merge that writes nMerge leaf blocks. ** -** Incremental merges happen nMin segments at a time. The segments -** to be merged are the nMin oldest segments (the ones with the smallest -** values for the _segdir.idx field) in the highest level that contains -** at least nMin segments. Multiple merges might occur in an attempt to +** Incremental merges happen nMin segments at a time. The segments +** to be merged are the nMin oldest segments (the ones with the smallest +** values for the _segdir.idx field) in the highest level that contains +** at least nMin segments. Multiple merges might occur in an attempt to ** write the quota of nMerge leaf blocks. */ SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ @@ -176979,7 +176979,7 @@ SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ /* Search the %_segdir table for the absolute level with the smallest ** relative level number that contains at least nMin segments, if any. ** If one is found, set iAbsLevel to the absolute level number and - ** nSeg to nMin. If no level with at least nMin segments can be found, + ** nSeg to nMin. If no level with at least nMin segments can be found, ** set nSeg to -1. */ rc = fts3SqlStmt(p, SQL_FIND_MERGE_LEVEL, &pFindLevel, 0); @@ -176995,7 +176995,7 @@ SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ /* If the hint read from the %_stat table is not empty, check if the ** last entry in it specifies a relative level smaller than or equal - ** to the level identified by the block above (if any). If so, this + ** to the level identified by the block above (if any). If so, this ** iteration of the loop will work on merging at the hinted level. */ if( rc==SQLITE_OK && hint.n ){ @@ -177021,11 +177021,11 @@ SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ ** Exit early in this case. */ if( nSeg<0 ) break; - /* Open a cursor to iterate through the contents of the oldest nSeg - ** indexes of absolute level iAbsLevel. If this cursor is opened using + /* Open a cursor to iterate through the contents of the oldest nSeg + ** indexes of absolute level iAbsLevel. If this cursor is opened using ** the 'hint' parameters, it is possible that there are less than nSeg ** segments available in level iAbsLevel. In this case, no work is - ** done on iAbsLevel - fall through to the next iteration of the loop + ** done on iAbsLevel - fall through to the next iteration of the loop ** to start work on some other level. */ memset(pWriter, 0, nAlloc); pFilter->flags = FTS3_SEGMENT_REQUIRE_POS; @@ -177104,7 +177104,7 @@ SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ ** the integer. ** ** This function used for parameters to merge= and incrmerge= -** commands. +** commands. */ static int fts3Getint(const char **pz){ const char *z = *pz; @@ -177295,7 +177295,7 @@ static u64 fts3ChecksumIndex( ** to true and return SQLITE_OK. Or if the contents do not match, set *pbOk ** to false before returning. ** -** If an error occurs (e.g. an OOM or IO error), return an SQLite error +** If an error occurs (e.g. an OOM or IO error), return an SQLite error ** code. The final value of *pbOk is undefined in this case. */ static int fts3IntegrityCheck(Fts3Table *p, int *pbOk){ @@ -177326,7 +177326,7 @@ static int fts3IntegrityCheck(Fts3Table *p, int *pbOk){ sqlite3_tokenizer_module const *pModule = p->pTokenizer->pModule; sqlite3_stmt *pStmt = 0; char *zSql; - + zSql = sqlite3_mprintf("SELECT %s" , p->zReadExprlist); if( !zSql ){ rc = SQLITE_NOMEM; @@ -177386,7 +177386,7 @@ static int fts3IntegrityCheck(Fts3Table *p, int *pbOk){ ** the FTS index are correct, return SQLITE_OK. Or, if the contents of the ** FTS index are incorrect, return SQLITE_CORRUPT_VTAB. ** -** Or, if an error (e.g. an OOM or IO error) occurs, return an SQLite +** Or, if an error (e.g. an OOM or IO error) occurs, return an SQLite ** error code. ** ** The integrity-check works as follows. For each token and indexed token @@ -177395,7 +177395,7 @@ static int fts3IntegrityCheck(Fts3Table *p, int *pbOk){ ** ** + The index number (0 for the main index, 1 for the first prefix ** index etc.), -** + The token (or token prefix) text itself, +** + The token (or token prefix) text itself, ** + The language-id of the row it appears in, ** + The docid of the row it appears in, ** + The column it appears in, and @@ -177406,7 +177406,7 @@ static int fts3IntegrityCheck(Fts3Table *p, int *pbOk){ ** ** The integrity-check code calculates the same checksum in two ways: ** -** 1. By scanning the contents of the FTS index, and +** 1. By scanning the contents of the FTS index, and ** 2. By scanning and tokenizing the content table. ** ** If the two checksums are identical, the integrity-check is deemed to have @@ -177427,7 +177427,7 @@ static int fts3DoIntegrityCheck( ** ** "INSERT INTO tbl(tbl) VALUES()" ** -** Argument pVal contains the result of . Currently the only +** Argument pVal contains the result of . Currently the only ** meaningful value to insert is the text 'optimize'. */ static int fts3SpecialInsert(Fts3Table *p, sqlite3_value *pVal){ @@ -177479,7 +177479,7 @@ SQLITE_PRIVATE void sqlite3Fts3FreeDeferredDoclists(Fts3Cursor *pCsr){ } /* -** Free all entries in the pCsr->pDeffered list. Entries are added to +** Free all entries in the pCsr->pDeffered list. Entries are added to ** this list using sqlite3Fts3DeferToken(). */ SQLITE_PRIVATE void sqlite3Fts3FreeDeferredTokens(Fts3Cursor *pCsr){ @@ -177507,14 +177507,14 @@ SQLITE_PRIVATE int sqlite3Fts3CacheDeferredDoclists(Fts3Cursor *pCsr){ int i; /* Used to iterate through table columns */ sqlite3_int64 iDocid; /* Docid of the row pCsr points to */ Fts3DeferredToken *pDef; /* Used to iterate through deferred tokens */ - + Fts3Table *p = (Fts3Table *)pCsr->base.pVtab; sqlite3_tokenizer *pT = p->pTokenizer; sqlite3_tokenizer_module const *pModule = pT->pModule; - + assert( pCsr->isRequireSeek==0 ); iDocid = sqlite3_column_int64(pCsr->pStmt, 0); - + for(i=0; inColumn && rc==SQLITE_OK; i++){ if( p->abNotindexed[i]==0 ){ const char *zText = (const char *)sqlite3_column_text(pCsr->pStmt, i+1); @@ -177555,8 +177555,8 @@ SQLITE_PRIVATE int sqlite3Fts3CacheDeferredDoclists(Fts3Cursor *pCsr){ } SQLITE_PRIVATE int sqlite3Fts3DeferredTokenList( - Fts3DeferredToken *p, - char **ppData, + Fts3DeferredToken *p, + char **ppData, int *pnData ){ char *pRet; @@ -177576,7 +177576,7 @@ SQLITE_PRIVATE int sqlite3Fts3DeferredTokenList( nSkip = sqlite3Fts3GetVarint(p->pList->aData, &dummy); *pnData = p->pList->nData - nSkip; *ppData = pRet; - + memcpy(pRet, &p->pList->aData[nSkip], *pnData); return SQLITE_OK; } @@ -177596,7 +177596,7 @@ SQLITE_PRIVATE int sqlite3Fts3DeferToken( } memset(pDeferred, 0, sizeof(*pDeferred)); pDeferred->pToken = pToken; - pDeferred->pNext = pCsr->pDeferred; + pDeferred->pNext = pCsr->pDeferred; pDeferred->iCol = iCol; pCsr->pDeferred = pDeferred; @@ -177613,8 +177613,8 @@ SQLITE_PRIVATE int sqlite3Fts3DeferToken( ** of subsiduary data structures accordingly. */ static int fts3DeleteByRowid( - Fts3Table *p, - sqlite3_value *pRowid, + Fts3Table *p, + sqlite3_value *pRowid, int *pnChng, /* IN/OUT: Decrement if row is deleted */ u32 *aSzDel ){ @@ -177652,14 +177652,14 @@ static int fts3DeleteByRowid( ** This function does the work for the xUpdate method of FTS3 virtual ** tables. The schema of the virtual table being: ** -** CREATE TABLE ( +** CREATE TABLE
            ( ** , -**
            HIDDEN, -** docid HIDDEN, +**
            HIDDEN, +** docid HIDDEN, ** HIDDEN ** ); ** -** +** */ SQLITE_PRIVATE int sqlite3Fts3UpdateMethod( sqlite3_vtab *pVtab, /* FTS3 vtab object */ @@ -177679,7 +177679,7 @@ SQLITE_PRIVATE int sqlite3Fts3UpdateMethod( assert( p->bHasStat==0 || p->bHasStat==1 ); assert( p->pSegments==0 ); - assert( + assert( nArg==1 /* DELETE operations */ || nArg==(2 + p->nColumn + 3) /* INSERT or UPDATE operations */ ); @@ -177688,9 +177688,9 @@ SQLITE_PRIVATE int sqlite3Fts3UpdateMethod( ** ** INSERT INTO xyz(xyz) VALUES('command'); */ - if( nArg>1 - && sqlite3_value_type(apVal[0])==SQLITE_NULL - && sqlite3_value_type(apVal[p->nColumn+2])!=SQLITE_NULL + if( nArg>1 + && sqlite3_value_type(apVal[0])==SQLITE_NULL + && sqlite3_value_type(apVal[p->nColumn+2])!=SQLITE_NULL ){ rc = fts3SpecialInsert(p, apVal[p->nColumn+2]); goto update_out; @@ -177729,24 +177729,24 @@ SQLITE_PRIVATE int sqlite3Fts3UpdateMethod( pNewRowid = apVal[1]; } - if( sqlite3_value_type(pNewRowid)!=SQLITE_NULL && ( + if( sqlite3_value_type(pNewRowid)!=SQLITE_NULL && ( sqlite3_value_type(apVal[0])==SQLITE_NULL || sqlite3_value_int64(apVal[0])!=sqlite3_value_int64(pNewRowid) )){ /* The new rowid is not NULL (in this case the rowid will be - ** automatically assigned and there is no chance of a conflict), and + ** automatically assigned and there is no chance of a conflict), and ** the statement is either an INSERT or an UPDATE that modifies the ** rowid column. So if the conflict mode is REPLACE, then delete any - ** existing row with rowid=pNewRowid. + ** existing row with rowid=pNewRowid. ** - ** Or, if the conflict mode is not REPLACE, insert the new record into + ** Or, if the conflict mode is not REPLACE, insert the new record into ** the %_content table. If we hit the duplicate rowid constraint (or any ** other error) while doing so, return immediately. ** ** This branch may also run if pNewRowid contains a value that cannot - ** be losslessly converted to an integer. In this case, the eventual + ** be losslessly converted to an integer. In this case, the eventual ** call to fts3InsertData() (either just below or further on in this - ** function) will return SQLITE_MISMATCH. If fts3DeleteByRowid is + ** function) will return SQLITE_MISMATCH. If fts3DeleteByRowid is ** invoked, it will delete zero rows (since no row will have ** docid=$pNewRowid if $pNewRowid is not an integer value). */ @@ -177767,7 +177767,7 @@ SQLITE_PRIVATE int sqlite3Fts3UpdateMethod( assert( sqlite3_value_type(apVal[0])==SQLITE_INTEGER ); rc = fts3DeleteByRowid(p, apVal[0], &nChng, aSzDel); } - + /* If this is an INSERT or UPDATE operation, insert the new record. */ if( nArg>1 && rc==SQLITE_OK ){ int iLangid = sqlite3_value_int(apVal[2 + p->nColumn + 2]); @@ -177800,10 +177800,10 @@ SQLITE_PRIVATE int sqlite3Fts3UpdateMethod( return rc; } -/* +/* ** Flush any data in the pending-terms hash table to disk. If successful, -** merge all segments in the database (including the new segment, if -** there was any data to flush) into a single segment. +** merge all segments in the database (including the new segment, if +** there was any data to flush) into a single segment. */ SQLITE_PRIVATE int sqlite3Fts3Optimize(Fts3Table *p){ int rc; @@ -177859,7 +177859,7 @@ SQLITE_PRIVATE int sqlite3Fts3Optimize(Fts3Table *p){ #define FTS3_MATCHINFO_LHITS_BM 'b' /* nCol*nPhrase values */ /* -** The default value for the second argument to matchinfo(). +** The default value for the second argument to matchinfo(). */ #define FTS3_MATCHINFO_DEFAULT "pcx" @@ -177876,7 +177876,7 @@ struct LoadDoclistCtx { }; /* -** The following types are used as part of the implementation of the +** The following types are used as part of the implementation of the ** fts3BestSnippet() routine. */ typedef struct SnippetIter SnippetIter; @@ -177909,7 +177909,7 @@ struct SnippetFragment { }; /* -** This type is used as an fts3ExprIterate() context object while +** This type is used as an fts3ExprIterate() context object while ** accumulating the data returned by the matchinfo() function. */ typedef struct MatchInfo MatchInfo; @@ -177980,8 +177980,8 @@ static MatchinfoBuffer *fts3MIBufferNew(size_t nElem, const char *zMatchinfo){ static void fts3MIBufferFree(void *p){ MatchinfoBuffer *pBuf = (MatchinfoBuffer*)((u8*)p - ((u32*)p)[-1]); - assert( (u32*)p==&pBuf->aMatchinfo[1] - || (u32*)p==&pBuf->aMatchinfo[pBuf->nElem+2] + assert( (u32*)p==&pBuf->aMatchinfo[1] + || (u32*)p==&pBuf->aMatchinfo[pBuf->nElem+2] ); if( (u32*)p==&pBuf->aMatchinfo[1] ){ pBuf->aRef[1] = 0; @@ -178037,7 +178037,7 @@ SQLITE_PRIVATE void sqlite3Fts3MIBufferFree(MatchinfoBuffer *p){ } } -/* +/* ** End of MatchinfoBuffer code. *************************************************************************/ @@ -178098,7 +178098,7 @@ static int fts3ExprIterate2( ** are part of a sub-tree that is the right-hand-side of a NOT operator. ** For each phrase node found, the supplied callback function is invoked. ** -** If the callback function returns anything other than SQLITE_OK, +** If the callback function returns anything other than SQLITE_OK, ** the iteration is abandoned and the error code returned immediately. ** Otherwise, SQLITE_OK is returned after a callback has been made for ** all eligible phrase nodes. @@ -178133,11 +178133,11 @@ static int fts3ExprLoadDoclistsCb(Fts3Expr *pExpr, int iPhrase, void *ctx){ /* ** Load the doclists for each phrase in the query associated with FTS3 cursor -** pCsr. +** pCsr. ** -** If pnPhrase is not NULL, then *pnPhrase is set to the number of matchable -** phrases in the expression (all phrases except those directly or -** indirectly descended from the right-hand-side of a NOT operator). If +** If pnPhrase is not NULL, then *pnPhrase is set to the number of matchable +** phrases in the expression (all phrases except those directly or +** indirectly descended from the right-hand-side of a NOT operator). If ** pnToken is not NULL, then it is set to the number of tokens in all ** matchable phrases of the expression. */ @@ -178167,7 +178167,7 @@ static int fts3ExprPhraseCount(Fts3Expr *pExpr){ } /* -** Advance the position list iterator specified by the first two +** Advance the position list iterator specified by the first two ** arguments so that it points to the first element with a value greater ** than or equal to parameter iNext. */ @@ -178236,7 +178236,7 @@ static int fts3SnippetNextCandidate(SnippetIter *pIter){ } /* -** Retrieve information about the current candidate snippet of snippet +** Retrieve information about the current candidate snippet of snippet ** iterator pIter. */ static void fts3SnippetDetails( @@ -178316,7 +178316,7 @@ static int fts3SnippetFindPositions(Fts3Expr *pExpr, int iPhrase, void *ctx){ } }else{ assert( rc!=SQLITE_OK || ( - pPhrase->pList==0 && pPhrase->pHead==0 && pPhrase->pTail==0 + pPhrase->pList==0 && pPhrase->pHead==0 && pPhrase->pTail==0 )); } @@ -178324,14 +178324,14 @@ static int fts3SnippetFindPositions(Fts3Expr *pExpr, int iPhrase, void *ctx){ } /* -** Select the fragment of text consisting of nFragment contiguous tokens +** Select the fragment of text consisting of nFragment contiguous tokens ** from column iCol that represent the "best" snippet. The best snippet ** is the snippet with the highest score, where scores are calculated ** by adding: ** ** (a) +1 point for each occurrence of a matchable phrase in the snippet. ** -** (b) +1000 points for the first occurrence of each matchable phrase in +** (b) +1000 points for the first occurrence of each matchable phrase in ** the snippet for which the corresponding mCovered bit is not set. ** ** The selected snippet parameters are stored in structure *pFragment before @@ -178392,7 +178392,7 @@ static int fts3BestSnippet( } } - /* Loop through all candidate snippets. Store the best snippet in + /* Loop through all candidate snippets. Store the best snippet in ** *pFragment. Store its associated 'score' in iBestScore. */ pFragment->iCol = iCol; @@ -178464,8 +178464,8 @@ static int fts3StringAppend( ** ** ........X.....X ** -** This function "shifts" the beginning of the snippet forward in the -** document so that there are approximately the same number of +** This function "shifts" the beginning of the snippet forward in the +** document so that there are approximately the same number of ** non-highlighted terms to the right of the final highlighted term as there ** are to the left of the first highlighted term. For example, to this: ** @@ -178473,8 +178473,8 @@ static int fts3StringAppend( ** ** This is done as part of extracting the snippet text, not when selecting ** the snippet. Snippet selection is done based on doclists only, so there -** is no way for fts3BestSnippet() to know whether or not the document -** actually contains terms that follow the final highlighted term. +** is no way for fts3BestSnippet() to know whether or not the document +** actually contains terms that follow the final highlighted term. */ static int fts3SnippetShift( Fts3Table *pTab, /* FTS3 table snippet comes from */ @@ -178564,7 +178564,7 @@ static int fts3SnippetText( int iCol = pFragment->iCol+1; /* Query column to extract text from */ sqlite3_tokenizer_module *pMod; /* Tokenizer module methods object */ sqlite3_tokenizer_cursor *pC; /* Tokenizer cursor open on zDoc/nDoc */ - + zDoc = (const char *)sqlite3_column_text(pCsr->pStmt, iCol); if( zDoc==0 ){ if( sqlite3_column_type(pCsr->pStmt, iCol)!=SQLITE_NULL ){ @@ -178604,7 +178604,7 @@ static int fts3SnippetText( if( rc==SQLITE_DONE ){ /* Special case - the last token of the snippet is also the last token ** of the column. Append any punctuation that occurred between the end - ** of the previous token and the end of the document to the output. + ** of the previous token and the end of the document to the output. ** Then break out of the loop. */ rc = fts3StringAppend(pOut, &zDoc[iEnd], -1); } @@ -178621,7 +178621,7 @@ static int fts3SnippetText( /* Now that the shift has been done, check if the initial "..." are ** required. They are required if (a) this is not the first fragment, - ** or (b) this fragment does not begin at position 0 of its column. + ** or (b) this fragment does not begin at position 0 of its column. */ if( rc==SQLITE_OK ){ if( iPos>0 || iFragment>0 ){ @@ -178657,8 +178657,8 @@ static int fts3SnippetText( /* -** This function is used to count the entries in a column-list (a -** delta-encoded list of term offsets within a single column of a single +** This function is used to count the entries in a column-list (a +** delta-encoded list of term offsets within a single column of a single ** row). When this function is called, *ppCollist should point to the ** beginning of the first varint in the column-list (the varint that ** contains the position of the first matching term in the column data). @@ -178744,11 +178744,11 @@ static int fts3ExprLHitGather( /* ** fts3ExprIterate() callback used to collect the "global" matchinfo stats -** for a single query. +** for a single query. ** ** fts3ExprIterate() callback to load the 'global' elements of a -** FTS3_MATCHINFO_HITS matchinfo array. The global stats are those elements -** of the matchinfo array that are constant for all rows returned by the +** FTS3_MATCHINFO_HITS matchinfo array. The global stats are those elements +** of the matchinfo array that are constant for all rows returned by the ** current query. ** ** Argument pCtx is actually a pointer to a struct of type MatchInfo. This @@ -178764,7 +178764,7 @@ static int fts3ExprLHitGather( ** at least one instance of phrase iPhrase. ** ** If the phrase pExpr consists entirely of deferred tokens, then all X and -** Y values are set to nDoc, where nDoc is the number of documents in the +** Y values are set to nDoc, where nDoc is the number of documents in the ** file system. This is done because the full-text index doclist is required ** to calculate these values properly, and the full-text index doclist is ** not available for deferred tokens. @@ -178782,7 +178782,7 @@ static int fts3ExprGlobalHitsCb( /* ** fts3ExprIterate() callback used to collect the "local" part of the -** FTS3_MATCHINFO_HITS array. The local stats are those elements of the +** FTS3_MATCHINFO_HITS array. The local stats are those elements of the ** array that are different for each row returned by the query. */ static int fts3ExprLocalHitsCb( @@ -178809,7 +178809,7 @@ static int fts3ExprLocalHitsCb( } static int fts3MatchinfoCheck( - Fts3Table *pTab, + Fts3Table *pTab, char cArg, char **pzErr ){ @@ -178834,8 +178834,8 @@ static size_t fts3MatchinfoSize(MatchInfo *pInfo, char cArg){ switch( cArg ){ case FTS3_MATCHINFO_NDOC: - case FTS3_MATCHINFO_NPHRASE: - case FTS3_MATCHINFO_NCOL: + case FTS3_MATCHINFO_NPHRASE: + case FTS3_MATCHINFO_NCOL: nVal = 1; break; @@ -178889,7 +178889,7 @@ static int fts3MatchinfoSelectDoctotal( } /* -** An instance of the following structure is used to store state while +** An instance of the following structure is used to store state while ** iterating through a multi-column position-list corresponding to the ** hits for a single phrase on a single row in order to calculate the ** values for a matchinfo() FTS3_MATCHINFO_LCS request. @@ -178902,7 +178902,7 @@ struct LcsIterator { int iPos; /* Current position */ }; -/* +/* ** If LcsIterator.iCol is set to the following value, the iterator has ** finished iterating through all offsets for all columns. */ @@ -178939,16 +178939,16 @@ static int fts3LcsIteratorAdvance(LcsIterator *pIter){ pIter->pRead = pRead; return rc; } - + /* -** This function implements the FTS3_MATCHINFO_LCS matchinfo() flag. +** This function implements the FTS3_MATCHINFO_LCS matchinfo() flag. ** ** If the call is successful, the longest-common-substring lengths for each -** column are written into the first nCol elements of the pInfo->aMatchinfo[] +** column are written into the first nCol elements of the pInfo->aMatchinfo[] ** array before returning. SQLITE_OK is returned in this case. ** ** Otherwise, if an error occurs, an SQLite error code is returned and the -** data written to the first nCol elements of pInfo->aMatchinfo[] is +** data written to the first nCol elements of pInfo->aMatchinfo[] is ** undefined. */ static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ @@ -179025,7 +179025,7 @@ static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ /* ** Populate the buffer pInfo->aMatchinfo[] with an array of integers to -** be returned by the matchinfo() function. Argument zArg contains the +** be returned by the matchinfo() function. Argument zArg contains the ** format string passed as the second argument to matchinfo (or the ** default value "pcx" if no second argument was specified). The format ** string has already been validated and the pInfo->aMatchinfo[] array @@ -179036,7 +179036,7 @@ static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ ** rows (i.e. FTS3_MATCHINFO_NPHRASE, NCOL, NDOC, AVGLENGTH and part of HITS) ** have already been populated. ** -** Return SQLITE_OK if successful, or an SQLite error code if an error +** Return SQLITE_OK if successful, or an SQLite error code if an error ** occurs. If a value other than SQLITE_OK is returned, the state the ** pInfo->aMatchinfo[] buffer is left in is undefined. */ @@ -179061,7 +179061,7 @@ static int fts3MatchinfoValues( case FTS3_MATCHINFO_NCOL: if( bGlobal ) pInfo->aMatchinfo[0] = pInfo->nCol; break; - + case FTS3_MATCHINFO_NDOC: if( bGlobal ){ sqlite3_int64 nDoc = 0; @@ -179070,7 +179070,7 @@ static int fts3MatchinfoValues( } break; - case FTS3_MATCHINFO_AVGLENGTH: + case FTS3_MATCHINFO_AVGLENGTH: if( bGlobal ){ sqlite3_int64 nDoc; /* Number of rows in table */ const char *a; /* Aggregate column length array */ @@ -179149,7 +179149,7 @@ static int fts3MatchinfoValues( /* -** Populate pCsr->aMatchinfo[] with data for the current row. The +** Populate pCsr->aMatchinfo[] with data for the current row. The ** 'matchinfo' data is an array of 32-bit unsigned integers (C type u32). */ static void fts3GetMatchinfo( @@ -179169,8 +179169,8 @@ static void fts3GetMatchinfo( sInfo.pCursor = pCsr; sInfo.nCol = pTab->nColumn; - /* If there is cached matchinfo() data, but the format string for the - ** cache does not match the format string for this request, discard + /* If there is cached matchinfo() data, but the format string for the + ** cache does not match the format string for this request, discard ** the cached data. */ if( pCsr->pMIBuffer && strcmp(pCsr->pMIBuffer->zMatchinfo, zArg) ){ sqlite3Fts3MIBufferFree(pCsr->pMIBuffer); @@ -179178,7 +179178,7 @@ static void fts3GetMatchinfo( } /* If Fts3Cursor.pMIBuffer is NULL, then this is the first time the - ** matchinfo function has been called for this query. In this case + ** matchinfo function has been called for this query. In this case ** allocate the array used to accumulate the matchinfo data and ** initialize those elements that are constant for every row. */ @@ -179253,7 +179253,7 @@ SQLITE_PRIVATE void sqlite3Fts3Snippet( /* The returned text includes up to four fragments of text extracted from ** the data in the current row. The first iteration of the for(...) loop - ** below attempts to locate a single fragment of text nToken tokens in + ** below attempts to locate a single fragment of text nToken tokens in ** size that contains at least one instance of all phrases in the query ** expression that appear in the current row. If such a fragment of text ** cannot be found, the second iteration of the loop attempts to locate @@ -179324,7 +179324,7 @@ SQLITE_PRIVATE void sqlite3Fts3Snippet( assert( nFToken>0 ); for(i=0; iiPrevId; sCtx.pCsr = pCsr; - /* Loop through the table columns, appending offset information to + /* Loop through the table columns, appending offset information to ** string-buffer res for each column. */ for(iCol=0; iColnColumn; iCol++){ @@ -179435,7 +179435,7 @@ SQLITE_PRIVATE void sqlite3Fts3Offsets( const char *zDoc; int nDoc; - /* Initialize the contents of sCtx.aTerm[] for column iCol. There is + /* Initialize the contents of sCtx.aTerm[] for column iCol. There is ** no way that this operation can fail, so the return code from ** fts3ExprIterate() can be discarded. */ @@ -179443,11 +179443,11 @@ SQLITE_PRIVATE void sqlite3Fts3Offsets( sCtx.iTerm = 0; (void)fts3ExprIterate(pCsr->pExpr, fts3ExprTermOffsetInit, (void*)&sCtx); - /* Retreive the text stored in column iCol. If an SQL NULL is stored + /* Retreive the text stored in column iCol. If an SQL NULL is stored ** in column iCol, jump immediately to the next iteration of the loop. ** If an OOM occurs while retrieving the data (this can happen if SQLite - ** needs to transform the data from utf-16 to utf-8), return SQLITE_NOMEM - ** to the caller. + ** needs to transform the data from utf-16 to utf-8), return SQLITE_NOMEM + ** to the caller. */ zDoc = (const char *)sqlite3_column_text(pCsr->pStmt, iCol+1); nDoc = sqlite3_column_bytes(pCsr->pStmt, iCol+1); @@ -179494,7 +179494,7 @@ SQLITE_PRIVATE void sqlite3Fts3Offsets( } if( rc==SQLITE_OK ){ char aBuffer[64]; - sqlite3_snprintf(sizeof(aBuffer), aBuffer, + sqlite3_snprintf(sizeof(aBuffer), aBuffer, "%d %d %d %d ", iCol, pTerm-sCtx.aTerm, iStart, iEnd-iStart ); rc = fts3StringAppend(&res, aBuffer, -1); @@ -179675,7 +179675,7 @@ static int unicodeDestroy(sqlite3_tokenizer *pTokenizer){ ** ** For each codepoint in the zIn/nIn string, this function checks if the ** sqlite3FtsUnicodeIsalnum() function already returns the desired result. -** If so, no action is taken. Otherwise, the codepoint is added to the +** If so, no action is taken. Otherwise, the codepoint is added to the ** unicode_tokenizer.aiException[] array. For the purposes of tokenization, ** the return value of sqlite3FtsUnicodeIsalnum() is inverted for all ** codepoints in the aiException[] array. @@ -179701,8 +179701,8 @@ static int unicodeAddExceptions( while( zaInput[pCsr->nInput]; /* Scan past any delimiter characters before the start of the next token. - ** Return SQLITE_DONE early if this takes us all the way to the end of + ** Return SQLITE_DONE early if this takes us all the way to the end of ** the input. */ while( z=zTerm ) break; READ_UTF8(z, zTerm, iCode); - }while( unicodeIsAlnum(p, (int)iCode) + }while( unicodeIsAlnum(p, (int)iCode) || sqlite3FtsUnicodeIsdiacritic((int)iCode) ); @@ -179933,7 +179933,7 @@ static int unicodeNext( } /* -** Set *ppModule to a pointer to the sqlite3_tokenizer_module +** Set *ppModule to a pointer to the sqlite3_tokenizer_module ** structure for the unicode tokenizer. */ SQLITE_PRIVATE void sqlite3Fts3UnicodeTokenizer(sqlite3_tokenizer_module const **ppModule){ @@ -179988,11 +179988,11 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeIsalnum(int c){ ** range of unicode codepoints that are not either letters or numbers (i.e. ** codepoints for which this function should return 0). ** - ** The most significant 22 bits in each 32-bit value contain the first + ** The most significant 22 bits in each 32-bit value contain the first ** codepoint in the range. The least significant 10 bits are used to store - ** the size of the range (always at least 1). In other words, the value - ** ((C<<22) + N) represents a range of N codepoints starting with codepoint - ** C. It is not possible to represent a range larger than 1023 codepoints + ** the size of the range (always at least 1). In other words, the value + ** ((C<<22) + N) represents a range of N codepoints starting with codepoint + ** C. It is not possible to represent a range larger than 1023 codepoints ** using this format. */ static const unsigned int aEntry[] = { @@ -180117,46 +180117,46 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeIsalnum(int c){ */ static int remove_diacritic(int c, int bComplex){ unsigned short aDia[] = { - 0, 1797, 1848, 1859, 1891, 1928, 1940, 1995, - 2024, 2040, 2060, 2110, 2168, 2206, 2264, 2286, - 2344, 2383, 2472, 2488, 2516, 2596, 2668, 2732, - 2782, 2842, 2894, 2954, 2984, 3000, 3028, 3336, - 3456, 3696, 3712, 3728, 3744, 3766, 3832, 3896, - 3912, 3928, 3944, 3968, 4008, 4040, 4056, 4106, - 4138, 4170, 4202, 4234, 4266, 4296, 4312, 4344, - 4408, 4424, 4442, 4472, 4488, 4504, 6148, 6198, - 6264, 6280, 6360, 6429, 6505, 6529, 61448, 61468, - 61512, 61534, 61592, 61610, 61642, 61672, 61688, 61704, - 61726, 61784, 61800, 61816, 61836, 61880, 61896, 61914, - 61948, 61998, 62062, 62122, 62154, 62184, 62200, 62218, - 62252, 62302, 62364, 62410, 62442, 62478, 62536, 62554, - 62584, 62604, 62640, 62648, 62656, 62664, 62730, 62766, - 62830, 62890, 62924, 62974, 63032, 63050, 63082, 63118, - 63182, 63242, 63274, 63310, 63368, 63390, + 0, 1797, 1848, 1859, 1891, 1928, 1940, 1995, + 2024, 2040, 2060, 2110, 2168, 2206, 2264, 2286, + 2344, 2383, 2472, 2488, 2516, 2596, 2668, 2732, + 2782, 2842, 2894, 2954, 2984, 3000, 3028, 3336, + 3456, 3696, 3712, 3728, 3744, 3766, 3832, 3896, + 3912, 3928, 3944, 3968, 4008, 4040, 4056, 4106, + 4138, 4170, 4202, 4234, 4266, 4296, 4312, 4344, + 4408, 4424, 4442, 4472, 4488, 4504, 6148, 6198, + 6264, 6280, 6360, 6429, 6505, 6529, 61448, 61468, + 61512, 61534, 61592, 61610, 61642, 61672, 61688, 61704, + 61726, 61784, 61800, 61816, 61836, 61880, 61896, 61914, + 61948, 61998, 62062, 62122, 62154, 62184, 62200, 62218, + 62252, 62302, 62364, 62410, 62442, 62478, 62536, 62554, + 62584, 62604, 62640, 62648, 62656, 62664, 62730, 62766, + 62830, 62890, 62924, 62974, 63032, 63050, 63082, 63118, + 63182, 63242, 63274, 63310, 63368, 63390, }; #define HIBIT ((unsigned char)0x80) unsigned char aChar[] = { - '\0', 'a', 'c', 'e', 'i', 'n', - 'o', 'u', 'y', 'y', 'a', 'c', - 'd', 'e', 'e', 'g', 'h', 'i', - 'j', 'k', 'l', 'n', 'o', 'r', - 's', 't', 'u', 'u', 'w', 'y', - 'z', 'o', 'u', 'a', 'i', 'o', - 'u', 'u'|HIBIT, 'a'|HIBIT, 'g', 'k', 'o', - 'o'|HIBIT, 'j', 'g', 'n', 'a'|HIBIT, 'a', - 'e', 'i', 'o', 'r', 'u', 's', - 't', 'h', 'a', 'e', 'o'|HIBIT, 'o', - 'o'|HIBIT, 'y', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', 'a', 'b', - 'c'|HIBIT, 'd', 'd', 'e'|HIBIT, 'e', 'e'|HIBIT, - 'f', 'g', 'h', 'h', 'i', 'i'|HIBIT, - 'k', 'l', 'l'|HIBIT, 'l', 'm', 'n', - 'o'|HIBIT, 'p', 'r', 'r'|HIBIT, 'r', 's', - 's'|HIBIT, 't', 'u', 'u'|HIBIT, 'v', 'w', - 'w', 'x', 'y', 'z', 'h', 't', - 'w', 'y', 'a', 'a'|HIBIT, 'a'|HIBIT, 'a'|HIBIT, - 'e', 'e'|HIBIT, 'e'|HIBIT, 'i', 'o', 'o'|HIBIT, - 'o'|HIBIT, 'o'|HIBIT, 'u', 'u'|HIBIT, 'u'|HIBIT, 'y', + '\0', 'a', 'c', 'e', 'i', 'n', + 'o', 'u', 'y', 'y', 'a', 'c', + 'd', 'e', 'e', 'g', 'h', 'i', + 'j', 'k', 'l', 'n', 'o', 'r', + 's', 't', 'u', 'u', 'w', 'y', + 'z', 'o', 'u', 'a', 'i', 'o', + 'u', 'u'|HIBIT, 'a'|HIBIT, 'g', 'k', 'o', + 'o'|HIBIT, 'j', 'g', 'n', 'a'|HIBIT, 'a', + 'e', 'i', 'o', 'r', 'u', 's', + 't', 'h', 'a', 'e', 'o'|HIBIT, 'o', + 'o'|HIBIT, 'y', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', 'a', 'b', + 'c'|HIBIT, 'd', 'd', 'e'|HIBIT, 'e', 'e'|HIBIT, + 'f', 'g', 'h', 'h', 'i', 'i'|HIBIT, + 'k', 'l', 'l'|HIBIT, 'l', 'm', 'n', + 'o'|HIBIT, 'p', 'r', 'r'|HIBIT, 'r', 's', + 's'|HIBIT, 't', 'u', 'u'|HIBIT, 'v', 'w', + 'w', 'x', 'y', 'z', 'h', 't', + 'w', 'y', 'a', 'a'|HIBIT, 'a'|HIBIT, 'a'|HIBIT, + 'e', 'e'|HIBIT, 'e'|HIBIT, 'i', 'o', 'o'|HIBIT, + 'o'|HIBIT, 'o'|HIBIT, 'u', 'u'|HIBIT, 'u'|HIBIT, 'y', }; unsigned int key = (((unsigned int)c)<<3) | 0x00000007; @@ -180278,19 +180278,19 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int eRemoveDiacritic){ {42802, 1, 62}, {42873, 1, 4}, {42877, 76, 1}, {42878, 1, 10}, {42891, 0, 1}, {42893, 74, 1}, {42896, 1, 4}, {42912, 1, 10}, {42922, 72, 1}, - {65313, 14, 26}, + {65313, 14, 26}, }; static const unsigned short aiOff[] = { - 1, 2, 8, 15, 16, 26, 28, 32, - 37, 38, 40, 48, 63, 64, 69, 71, - 79, 80, 116, 202, 203, 205, 206, 207, - 209, 210, 211, 213, 214, 217, 218, 219, - 775, 7264, 10792, 10795, 23228, 23256, 30204, 54721, - 54753, 54754, 54756, 54787, 54793, 54809, 57153, 57274, - 57921, 58019, 58363, 61722, 65268, 65341, 65373, 65406, - 65408, 65410, 65415, 65424, 65436, 65439, 65450, 65462, - 65472, 65476, 65478, 65480, 65482, 65488, 65506, 65511, - 65514, 65521, 65527, 65528, 65529, + 1, 2, 8, 15, 16, 26, 28, 32, + 37, 38, 40, 48, 63, 64, 69, 71, + 79, 80, 116, 202, 203, 205, 206, 207, + 209, 210, 211, 213, 214, 217, 218, 219, + 775, 7264, 10792, 10795, 23228, 23256, 30204, 54721, + 54753, 54754, 54756, 54787, 54793, 54809, 57153, 57274, + 57921, 58019, 58363, 61722, 65268, 65341, 65373, 65406, + 65408, 65410, 65415, 65424, 65436, 65439, 65450, 65462, + 65472, 65476, 65478, 65480, 65482, 65488, 65506, 65511, + 65514, 65521, 65527, 65528, 65529, }; int ret = c; @@ -180328,7 +180328,7 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int eRemoveDiacritic){ ret = remove_diacritic(ret, eRemoveDiacritic==2); } } - + else if( c>=66560 && c<66600 ){ ret = c + 40; } @@ -180557,7 +180557,7 @@ static void jsonReset(JsonString *p){ } -/* Report an out-of-memory (OOM) condition +/* Report an out-of-memory (OOM) condition */ static void jsonOom(JsonString *p){ p->bErr = 1; @@ -180674,7 +180674,7 @@ static void jsonAppendString(JsonString *p, const char *zIn, u32 N){ } /* -** Append a function parameter value to the JSON string under +** Append a function parameter value to the JSON string under ** construction. */ static void jsonAppendValue( @@ -180719,7 +180719,7 @@ static void jsonAppendValue( */ static void jsonResult(JsonString *p){ if( p->bErr==0 ){ - sqlite3_result_text64(p->pCtx, p->zBuf, p->nUsed, + sqlite3_result_text64(p->pCtx, p->zBuf, p->nUsed, p->bStatic ? SQLITE_TRANSIENT : sqlite3_free, SQLITE_UTF8); jsonZero(p); @@ -180931,7 +180931,7 @@ static void jsonReturn( if( pNode->jnFlags & JNODE_RAW ){ sqlite3_result_text(pCtx, pNode->u.zJContent, pNode->n, SQLITE_TRANSIENT); - }else + }else #endif assert( (pNode->jnFlags & JNODE_RAW)==0 ); if( (pNode->jnFlags & JNODE_ESCAPE)==0 ){ @@ -181612,7 +181612,7 @@ static void jsonWrongNumArgs( char *zMsg = sqlite3_mprintf("json_%s() needs an odd number of arguments", zFuncName); sqlite3_result_error(pCtx, zMsg, -1); - sqlite3_free(zMsg); + sqlite3_free(zMsg); } /* @@ -181699,7 +181699,7 @@ static void jsonTest1Func( /* ** Implementation of the json_QUOTE(VALUE) function. Return a JSON value -** corresponding to the SQL value input. Mostly this means putting +** corresponding to the SQL value input. Mostly this means putting ** double-quotes around strings and returning the unquoted string "null" ** when given a NULL input. */ @@ -181746,7 +181746,7 @@ static void jsonArrayFunc( ** json_array_length(JSON) ** json_array_length(JSON, PATH) ** -** Return the number of elements in the top-level JSON array. +** Return the number of elements in the top-level JSON array. ** Return 0 if the input is not a well-formed JSON array. */ static void jsonArrayLengthFunc( @@ -182239,7 +182239,7 @@ static void jsonGroupInverse( if( c=='}' || c==']' ) nNest--; } } - pStr->nUsed -= i; + pStr->nUsed -= i; memmove(&z[1], &z[i+1], (size_t)pStr->nUsed-1); } #else @@ -182355,7 +182355,7 @@ static int jsonEachConnect( UNUSED_PARAM(argv); UNUSED_PARAM(argc); UNUSED_PARAM(pAux); - rc = sqlite3_declare_vtab(db, + rc = sqlite3_declare_vtab(db, "CREATE TABLE x(key,value,type,atom,id,parent,fullkey,path," "json HIDDEN,root HIDDEN)"); if( rc==SQLITE_OK ){ @@ -182533,7 +182533,7 @@ static int jsonEachColumn( break; } case JEACH_ID: { - sqlite3_result_int64(ctx, + sqlite3_result_int64(ctx, (sqlite3_int64)p->i + ((pThis->jnFlags & JNODE_LABEL)!=0)); break; } @@ -182880,8 +182880,8 @@ SQLITE_PRIVATE int sqlite3Json1Init(sqlite3 *db){ __declspec(dllexport) #endif SQLITE_API int sqlite3_json_init( - sqlite3 *db, - char **pzErrMsg, + sqlite3 *db, + char **pzErrMsg, const sqlite3_api_routines *pApi ){ SQLITE_EXTENSION_INIT2(pApi); @@ -182912,7 +182912,7 @@ SQLITE_API int sqlite3_json_init( ** Database Format of R-Tree Tables ** -------------------------------- ** -** The data structure for a single virtual r-tree table is stored in three +** The data structure for a single virtual r-tree table is stored in three ** native SQLite tables declared as follows. In each case, the '%' character ** in the table name is replaced with the user-supplied name of the r-tree ** table. @@ -182938,7 +182938,7 @@ SQLITE_API int sqlite3_json_init( ** of the node contain the tree depth as a big-endian integer. ** For non-root nodes, the first 2 bytes are left unused. ** -** 2. The next 2 bytes contain the number of entries currently +** 2. The next 2 bytes contain the number of entries currently ** stored in the node. ** ** 3. The remainder of the node contains the node entries. Each entry @@ -183000,7 +183000,7 @@ typedef struct RtreeSearchPoint RtreeSearchPoint; #define RTREE_MAX_AUX_COLUMN 100 /* Size of hash table Rtree.aHash. This hash table is not expected to -** ever contain very many entries, so a fixed number of buckets is +** ever contain very many entries, so a fixed number of buckets is ** used. */ #define HASHSIZE 97 @@ -183009,13 +183009,13 @@ typedef struct RtreeSearchPoint RtreeSearchPoint; ** the number of rows in the virtual table to calculate the costs of ** various strategies. If possible, this estimate is loaded from the ** sqlite_stat1 table (with RTREE_MIN_ROWEST as a hard-coded minimum). -** Otherwise, if no sqlite_stat1 entry is available, use +** Otherwise, if no sqlite_stat1 entry is available, use ** RTREE_DEFAULT_ROWEST. */ #define RTREE_DEFAULT_ROWEST 1048576 #define RTREE_MIN_ROWEST 100 -/* +/* ** An rtree virtual-table object. */ struct Rtree { @@ -183034,7 +183034,7 @@ struct Rtree { #endif int iDepth; /* Current depth of the r-tree structure */ char *zDb; /* Name of database containing r-tree table */ - char *zName; /* Name of r-tree table */ + char *zName; /* Name of r-tree table */ u32 nBusy; /* Current number of users of this structure */ i64 nRowEst; /* Estimated number of rows in this table */ u32 nCursor; /* Number of open cursors */ @@ -183043,7 +183043,7 @@ struct Rtree { /* List of nodes removed during a CondenseTree operation. List is ** linked together via the pointer normally used for hash chains - - ** RtreeNode.pNext. RtreeNode.iNode stores the depth of the sub-tree + ** RtreeNode.pNext. RtreeNode.iNode stores the depth of the sub-tree ** headed by the node (leaf nodes have RtreeNode.iNode==0). */ RtreeNode *pDeleted; @@ -183069,7 +183069,7 @@ struct Rtree { /* Statement for writing to the "aux:" fields, if there are any */ sqlite3_stmt *pWriteAux; - RtreeNode *aHash[HASHSIZE]; /* Hash table of in-memory nodes. */ + RtreeNode *aHash[HASHSIZE]; /* Hash table of in-memory nodes. */ }; /* Possible values for Rtree.eCoordType: */ @@ -183118,7 +183118,7 @@ struct RtreeSearchPoint { }; /* -** The minimum number of cells allowed for a node is a third of the +** The minimum number of cells allowed for a node is a third of the ** maximum. In Gutman's notation: ** ** m = M/3 @@ -183133,7 +183133,7 @@ struct RtreeSearchPoint { /* ** The smallest possible node-size is (512-64)==448 bytes. And the largest ** supported cell size is 48 bytes (8 byte rowid + ten 4 byte coordinates). -** Therefore all non-root nodes must contain at least 3 entries. Since +** Therefore all non-root nodes must contain at least 3 entries. Since ** 3^40 is greater than 2^64, an r-tree structure always has a depth of ** 40 or less. */ @@ -183147,7 +183147,7 @@ struct RtreeSearchPoint { */ #define RTREE_CACHE_SZ 5 -/* +/* ** An rtree cursor object. */ struct RtreeCursor { @@ -183221,7 +183221,7 @@ struct RtreeConstraint { #define RTREE_QUERY 0x47 /* G: New-style sqlite3_rtree_query_callback() */ -/* +/* ** An rtree structure node. */ struct RtreeNode { @@ -183236,7 +183236,7 @@ struct RtreeNode { /* Return the number of cells in a node */ #define NCELL(pNode) readInt16(&(pNode)->zData[2]) -/* +/* ** A single cell from a node, deserialized */ struct RtreeCell { @@ -183251,11 +183251,11 @@ struct RtreeCell { ** sqlite3_rtree_query_callback() and which appear on the right of MATCH ** operators in order to constrain a search. ** -** xGeom and xQueryFunc are the callback functions. Exactly one of +** xGeom and xQueryFunc are the callback functions. Exactly one of ** xGeom and xQueryFunc fields is non-NULL, depending on whether the ** SQL function was created using sqlite3_rtree_geometry_callback() or ** sqlite3_rtree_query_callback(). -** +** ** This object is deleted automatically by the destructor mechanism in ** sqlite3_create_function_v2(). */ @@ -183356,9 +183356,9 @@ static void readCoord(u8 *p, RtreeCoord *pCoord){ pCoord->u = *(u32*)p; #else pCoord->u = ( - (((u32)p[0]) << 24) + - (((u32)p[1]) << 16) + - (((u32)p[2]) << 8) + + (((u32)p[0]) << 24) + + (((u32)p[1]) << 16) + + (((u32)p[2]) << 8) + (((u32)p[3]) << 0) ); #endif @@ -183378,13 +183378,13 @@ static i64 readInt64(u8 *p){ return x; #else return (i64)( - (((u64)p[0]) << 56) + - (((u64)p[1]) << 48) + - (((u64)p[2]) << 40) + - (((u64)p[3]) << 32) + - (((u64)p[4]) << 24) + - (((u64)p[5]) << 16) + - (((u64)p[6]) << 8) + + (((u64)p[0]) << 56) + + (((u64)p[1]) << 48) + + (((u64)p[2]) << 40) + + (((u64)p[3]) << 32) + + (((u64)p[4]) << 24) + + (((u64)p[5]) << 16) + + (((u64)p[6]) << 8) + (((u64)p[7]) << 0) ); #endif @@ -183638,7 +183638,7 @@ static int nodeAcquire( } /* If no error has occurred so far, check if the "number of entries" - ** field on the node is too large. If so, set the return code to + ** field on the node is too large. If so, set the return code to ** SQLITE_CORRUPT_VTAB. */ if( pNode && rc==SQLITE_OK ){ @@ -183837,7 +183837,7 @@ static int rtreeInit( sqlite3 *, void *, int, const char *const*, sqlite3_vtab **, char **, int ); -/* +/* ** Rtree virtual table module xCreate method. */ static int rtreeCreate( @@ -183850,7 +183850,7 @@ static int rtreeCreate( return rtreeInit(db, pAux, argc, argv, ppVtab, pzErr, 1); } -/* +/* ** Rtree virtual table module xConnect method. */ static int rtreeConnect( @@ -183895,7 +183895,7 @@ static void rtreeRelease(Rtree *pRtree){ } } -/* +/* ** Rtree virtual table module xDisconnect method. */ static int rtreeDisconnect(sqlite3_vtab *pVtab){ @@ -183903,7 +183903,7 @@ static int rtreeDisconnect(sqlite3_vtab *pVtab){ return SQLITE_OK; } -/* +/* ** Rtree virtual table module xDestroy method. */ static int rtreeDestroy(sqlite3_vtab *pVtab){ @@ -183913,7 +183913,7 @@ static int rtreeDestroy(sqlite3_vtab *pVtab){ "DROP TABLE '%q'.'%q_node';" "DROP TABLE '%q'.'%q_rowid';" "DROP TABLE '%q'.'%q_parent';", - pRtree->zDb, pRtree->zName, + pRtree->zDb, pRtree->zName, pRtree->zDb, pRtree->zName, pRtree->zDb, pRtree->zName ); @@ -183931,7 +183931,7 @@ static int rtreeDestroy(sqlite3_vtab *pVtab){ return rc; } -/* +/* ** Rtree virtual table module xOpen method. */ static int rtreeOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ @@ -183970,7 +183970,7 @@ static void freeCursorConstraints(RtreeCursor *pCsr){ } } -/* +/* ** Rtree virtual table module xClose method. */ static int rtreeClose(sqlite3_vtab_cursor *cur){ @@ -183991,7 +183991,7 @@ static int rtreeClose(sqlite3_vtab_cursor *cur){ /* ** Rtree virtual table module xEof method. ** -** Return non-zero if the cursor does not currently point to a valid +** Return non-zero if the cursor does not currently point to a valid ** record (i.e if the scan has finished), or zero otherwise. */ static int rtreeEof(sqlite3_vtab_cursor *cur){ @@ -184047,7 +184047,7 @@ static int rtreeEof(sqlite3_vtab_cursor *cur){ /* ** Check the RTree node or entry given by pCellData and p against the MATCH -** constraint pConstraint. +** constraint pConstraint. */ static int rtreeCallbackConstraint( RtreeConstraint *pConstraint, /* The constraint to test */ @@ -184120,7 +184120,7 @@ static int rtreeCallbackConstraint( return rc; } -/* +/* ** Check the internal RTree node given by pCellData against constraint p. ** If this constraint cannot be satisfied by any child within the node, ** set *peWithin to NOT_WITHIN. @@ -184138,7 +184138,7 @@ static void rtreeNonleafConstraint( */ pCellData += 8 + 4*(p->iCoord&0xfe); - assert(p->op==RTREE_LE || p->op==RTREE_LT || p->op==RTREE_GE + assert(p->op==RTREE_LE || p->op==RTREE_LT || p->op==RTREE_GE || p->op==RTREE_GT || p->op==RTREE_EQ ); assert( ((((char*)pCellData) - (char*)0)&3)==0 ); /* 4-byte aligned */ switch( p->op ){ @@ -184178,7 +184178,7 @@ static void rtreeLeafConstraint( ){ RtreeDValue xN; /* Coordinate value converted to a double */ - assert(p->op==RTREE_LE || p->op==RTREE_LT || p->op==RTREE_GE + assert(p->op==RTREE_LE || p->op==RTREE_LT || p->op==RTREE_GE || p->op==RTREE_GT || p->op==RTREE_EQ ); pCellData += 8 + p->iCoord*4; assert( ((((char*)pCellData) - (char*)0)&3)==0 ); /* 4-byte aligned */ @@ -184194,12 +184194,12 @@ static void rtreeLeafConstraint( } /* -** One of the cells in node pNode is guaranteed to have a 64-bit +** One of the cells in node pNode is guaranteed to have a 64-bit ** integer value equal to iRowid. Return the index of this cell. */ static int nodeRowidIndex( - Rtree *pRtree, - RtreeNode *pNode, + Rtree *pRtree, + RtreeNode *pNode, i64 iRowid, int *piIndex ){ @@ -184341,7 +184341,7 @@ static RtreeSearchPoint *rtreeSearchPointNew( pFirst = rtreeSearchPointFirst(pCur); pCur->anQueue[iLevel]++; if( pFirst==0 - || pFirst->rScore>rScore + || pFirst->rScore>rScore || (pFirst->rScore==rScore && pFirst->iLevel>iLevel) ){ if( pCur->bPoint ){ @@ -184525,7 +184525,7 @@ static int rtreeStepToLeaf(RtreeCursor *pCur){ return SQLITE_OK; } -/* +/* ** Rtree virtual table module xNext method. */ static int rtreeNext(sqlite3_vtab_cursor *pVtabCursor){ @@ -184543,7 +184543,7 @@ static int rtreeNext(sqlite3_vtab_cursor *pVtabCursor){ return rc; } -/* +/* ** Rtree virtual table module xRowid method. */ static int rtreeRowid(sqlite3_vtab_cursor *pVtabCursor, sqlite_int64 *pRowid){ @@ -184557,7 +184557,7 @@ static int rtreeRowid(sqlite3_vtab_cursor *pVtabCursor, sqlite_int64 *pRowid){ return rc; } -/* +/* ** Rtree virtual table module xColumn method. */ static int rtreeColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){ @@ -184590,7 +184590,7 @@ static int rtreeColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){ &pCsr->pReadAux, 0); if( rc ) return rc; } - sqlite3_bind_int64(pCsr->pReadAux, 1, + sqlite3_bind_int64(pCsr->pReadAux, 1, nodeGetRowid(pRtree, pNode, p->iCell)); rc = sqlite3_step(pCsr->pReadAux); if( rc==SQLITE_ROW ){ @@ -184603,12 +184603,12 @@ static int rtreeColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){ } sqlite3_result_value(ctx, sqlite3_column_value(pCsr->pReadAux, i - pRtree->nDim2 + 1)); - } + } return SQLITE_OK; } -/* -** Use nodeAcquire() to obtain the leaf node containing the record with +/* +** Use nodeAcquire() to obtain the leaf node containing the record with ** rowid iRowid. If successful, set *ppLeaf to point to the node and ** return SQLITE_OK. If there is no such record in the table, set ** *ppLeaf to 0 and return SQLITE_OK. If an error occurs, set *ppLeaf @@ -184667,11 +184667,11 @@ static int deserializeGeometry(sqlite3_value *pValue, RtreeConstraint *pCons){ return SQLITE_OK; } -/* +/* ** Rtree virtual table module xFilter method. */ static int rtreeFilter( - sqlite3_vtab_cursor *pVtabCursor, + sqlite3_vtab_cursor *pVtabCursor, int idxNum, const char *idxStr, int argc, sqlite3_value **argv ){ @@ -184714,8 +184714,8 @@ static int rtreeFilter( pCsr->atEOF = 1; } }else{ - /* Normal case - r-tree scan. Set up the RtreeCursor.aConstraint array - ** with the configured constraints. + /* Normal case - r-tree scan. Set up the RtreeCursor.aConstraint array + ** with the configured constraints. */ rc = nodeAcquire(pRtree, 1, 0, &pRoot); if( rc==SQLITE_OK && argc>0 ){ @@ -184776,7 +184776,7 @@ static int rtreeFilter( /* ** Rtree virtual table module xBestIndex method. There are three -** table scan strategies to choose from (in order from most to +** table scan strategies to choose from (in order from most to ** least desirable): ** ** idxNum idxStr Strategy @@ -184786,8 +184786,8 @@ static int rtreeFilter( ** ------------------------------------------------ ** ** If strategy 1 is used, then idxStr is not meaningful. If strategy -** 2 is used, idxStr is formatted to contain 2 bytes for each -** constraint used. The first two bytes of idxStr correspond to +** 2 is used, idxStr is formatted to contain 2 bytes for each +** constraint used. The first two bytes of idxStr correspond to ** the constraint in sqlite3_index_info.aConstraintUsage[] with ** (argvIndex==1) etc. ** @@ -184833,8 +184833,8 @@ static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ for(ii=0; iinConstraint && iIdx<(int)(sizeof(zIdxStr)-1); ii++){ struct sqlite3_index_constraint *p = &pIdxInfo->aConstraint[ii]; - if( bMatch==0 && p->usable - && p->iColumn==0 && p->op==SQLITE_INDEX_CONSTRAINT_EQ + if( bMatch==0 && p->usable + && p->iColumn==0 && p->op==SQLITE_INDEX_CONSTRAINT_EQ ){ /* We have an equality constraint on the rowid. Use strategy 1. */ int jj; @@ -184847,11 +184847,11 @@ static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ pIdxInfo->aConstraintUsage[jj].omit = 1; /* This strategy involves a two rowid lookups on an B-Tree structures - ** and then a linear search of an R-Tree node. This should be - ** considered almost as quick as a direct rowid lookup (for which + ** and then a linear search of an R-Tree node. This should be + ** considered almost as quick as a direct rowid lookup (for which ** sqlite uses an internal cost of 0.0). It is expected to return ** a single row. - */ + */ pIdxInfo->estimatedCost = 30.0; pIdxInfo->estimatedRows = 1; pIdxInfo->idxFlags = SQLITE_INDEX_SCAN_UNIQUE; @@ -184967,8 +184967,8 @@ static int cellContains(Rtree *pRtree, RtreeCell *p1, RtreeCell *p2){ for(ii=0; iinDim2; ii+=2){ RtreeCoord *a1 = &p1->aCoord[ii]; RtreeCoord *a2 = &p2->aCoord[ii]; - if( (!isInt && (a2[0].fa1[1].f)) - || ( isInt && (a2[0].ia1[1].i)) + if( (!isInt && (a2[0].fa1[1].f)) + || ( isInt && (a2[0].ia1[1].i)) ){ return 0; } @@ -184989,9 +184989,9 @@ static RtreeDValue cellGrowth(Rtree *pRtree, RtreeCell *p, RtreeCell *pCell){ } static RtreeDValue cellOverlap( - Rtree *pRtree, - RtreeCell *p, - RtreeCell *aCell, + Rtree *pRtree, + RtreeCell *p, + RtreeCell *aCell, int nCell ){ int ii; @@ -185102,7 +185102,7 @@ static int AdjustTree( cellUnion(pRtree, &cell, pCell); nodeOverwriteCell(pRtree, pParent, &cell, iCell); } - + p = pParent; } return SQLITE_OK; @@ -185133,7 +185133,7 @@ static int rtreeInsertCell(Rtree *, RtreeNode *, RtreeCell *, int); /* ** Arguments aIdx, aDistance and aSpare all point to arrays of size -** nIdx. The aIdx array contains the set of integers from 0 to +** nIdx. The aIdx array contains the set of integers from 0 to ** (nIdx-1) in no particular order. This function sorts the values ** in aIdx according to the indexed values in aDistance. For ** example, assuming the inputs: @@ -185149,9 +185149,9 @@ static int rtreeInsertCell(Rtree *, RtreeNode *, RtreeCell *, int); ** sorting algorithm. */ static void SortByDistance( - int *aIdx, - int nIdx, - RtreeDValue *aDistance, + int *aIdx, + int nIdx, + RtreeDValue *aDistance, int *aSpare ){ if( nIdx>1 ){ @@ -185205,7 +185205,7 @@ static void SortByDistance( /* ** Arguments aIdx, aCell and aSpare all point to arrays of size -** nIdx. The aIdx array contains the set of integers from 0 to +** nIdx. The aIdx array contains the set of integers from 0 to ** (nIdx-1) in no particular order. This function sorts the values ** in aIdx according to dimension iDim of the cells in aCell. The ** minimum value of dimension iDim is considered first, the @@ -185216,10 +185216,10 @@ static void SortByDistance( */ static void SortByDimension( Rtree *pRtree, - int *aIdx, - int nIdx, - int iDim, - RtreeCell *aCell, + int *aIdx, + int nIdx, + int iDim, + RtreeCell *aCell, int *aSpare ){ if( nIdx>1 ){ @@ -185316,8 +185316,8 @@ static int splitNodeStartree( int nLeft; for( - nLeft=RTREE_MINCELLS(pRtree); - nLeft<=(nCell-RTREE_MINCELLS(pRtree)); + nLeft=RTREE_MINCELLS(pRtree); + nLeft<=(nCell-RTREE_MINCELLS(pRtree)); nLeft++ ){ RtreeCell left; @@ -185372,9 +185372,9 @@ static int splitNodeStartree( static int updateMapping( - Rtree *pRtree, - i64 iRowid, - RtreeNode *pNode, + Rtree *pRtree, + i64 iRowid, + RtreeNode *pNode, int iHeight ){ int (*xSetMapping)(Rtree *, sqlite3_int64, sqlite3_int64); @@ -185410,7 +185410,7 @@ static int SplitNode( RtreeCell leftbbox; RtreeCell rightbbox; - /* Allocate an array and populate it with a copy of pCell and + /* Allocate an array and populate it with a copy of pCell and ** all cells from node pLeft. Then zero the original node. */ aCell = sqlite3_malloc64((sizeof(RtreeCell)+sizeof(int))*(nCell+1)); @@ -185527,14 +185527,14 @@ splitnode_out: } /* -** If node pLeaf is not the root of the r-tree and its pParent pointer is +** If node pLeaf is not the root of the r-tree and its pParent pointer is ** still NULL, load all ancestor nodes of pLeaf into memory and populate ** the pLeaf->pParent chain all the way up to the root node. ** ** This operation is required when a row is deleted (or updated - an update ** is implemented as a delete followed by an insert). SQLite provides the ** rowid of the row to delete, which can be used to find the leaf on which -** the entry resides (argument pLeaf). Once the leaf is located, this +** the entry resides (argument pLeaf). Once the leaf is located, this ** function is called to determine its ancestry. */ static int fixLeafParent(Rtree *pRtree, RtreeNode *pLeaf){ @@ -185608,7 +185608,7 @@ static int removeNode(Rtree *pRtree, RtreeNode *pNode, int iHeight){ if( SQLITE_OK!=(rc = sqlite3_reset(pRtree->pDeleteParent)) ){ return rc; } - + /* Remove the node from the in-memory hash table and link it into ** the Rtree.pDeleted list. Its contents will be re-inserted later on. */ @@ -185623,9 +185623,9 @@ static int removeNode(Rtree *pRtree, RtreeNode *pNode, int iHeight){ static int fixBoundingBox(Rtree *pRtree, RtreeNode *pNode){ RtreeNode *pParent = pNode->pParent; - int rc = SQLITE_OK; + int rc = SQLITE_OK; if( pParent ){ - int ii; + int ii; int nCell = NCELL(pNode); RtreeCell box; /* Bounding box for pNode */ nodeGetCell(pRtree, pNode, 0, &box); @@ -185680,9 +185680,9 @@ static int deleteCell(Rtree *pRtree, RtreeNode *pNode, int iCell, int iHeight){ } static int Reinsert( - Rtree *pRtree, - RtreeNode *pNode, - RtreeCell *pCell, + Rtree *pRtree, + RtreeNode *pNode, + RtreeCell *pCell, int iHeight ){ int *aOrder; @@ -185736,7 +185736,7 @@ static int Reinsert( for(ii=0; iinDim; iDim++){ - RtreeDValue coord = (DCOORD(aCell[ii].aCoord[iDim*2+1]) - + RtreeDValue coord = (DCOORD(aCell[ii].aCoord[iDim*2+1]) - DCOORD(aCell[ii].aCoord[iDim*2])); aDistance[ii] += (coord-aCenterCoord[iDim])*(coord-aCenterCoord[iDim]); } @@ -185781,7 +185781,7 @@ static int Reinsert( } /* -** Insert cell pCell into node pNode. Node pNode is the head of a +** Insert cell pCell into node pNode. Node pNode is the head of a ** subtree iHeight high (leaf nodes have iHeight==0). */ static int rtreeInsertCell( @@ -185871,8 +185871,8 @@ static int rtreeDeleteRowid(Rtree *pRtree, sqlite3_int64 iDelete){ /* Obtain a reference to the root node to initialize Rtree.iDepth */ rc = nodeAcquire(pRtree, 1, 0, &pRoot); - /* Obtain a reference to the leaf node that contains the entry - ** about to be deleted. + /* Obtain a reference to the leaf node that contains the entry + ** about to be deleted. */ if( rc==SQLITE_OK ){ rc = findLeafNode(pRtree, iDelete, &pLeaf, 0); @@ -185903,11 +185903,11 @@ static int rtreeDeleteRowid(Rtree *pRtree, sqlite3_int64 iDelete){ } /* Check if the root node now has exactly one child. If so, remove - ** it, schedule the contents of the child for reinsertion and + ** it, schedule the contents of the child for reinsertion and ** reduce the tree height by one. ** ** This is equivalent to copying the contents of the child into - ** the root node (the operation that Gutman's paper says to perform + ** the root node (the operation that Gutman's paper says to perform ** in this scenario). */ if( rc==SQLITE_OK && pRtree->iDepth>0 && NCELL(pRoot)==1 ){ @@ -185977,8 +185977,8 @@ static RtreeValue rtreeValueUp(sqlite3_value *v){ #endif /* !defined(SQLITE_RTREE_INT_ONLY) */ /* -** A constraint has failed while inserting a row into an rtree table. -** Assuming no OOM error occurs, this function sets the error message +** A constraint has failed while inserting a row into an rtree table. +** Assuming no OOM error occurs, this function sets the error message ** (at pRtree->base.zErrMsg) to an appropriate value and returns ** SQLITE_CONSTRAINT. ** @@ -185991,7 +185991,7 @@ static RtreeValue rtreeValueUp(sqlite3_value *v){ */ static int rtreeConstraintError(Rtree *pRtree, int iCol){ sqlite3_stmt *pStmt = 0; - char *zSql; + char *zSql; int rc; assert( iCol==0 || iCol%2 ); @@ -186028,9 +186028,9 @@ static int rtreeConstraintError(Rtree *pRtree, int iCol){ ** The xUpdate method for rtree module virtual tables. */ static int rtreeUpdate( - sqlite3_vtab *pVtab, - int nData, - sqlite3_value **aData, + sqlite3_vtab *pVtab, + int nData, + sqlite3_value **aData, sqlite_int64 *pRowid ){ Rtree *pRtree = (Rtree *)pVtab; @@ -186097,7 +186097,7 @@ static int rtreeUpdate( } } - /* If a rowid value was supplied, check if it is already present in + /* If a rowid value was supplied, check if it is already present in ** the table. If so, the constraint has failed. */ if( sqlite3_value_type(aData[2])!=SQLITE_NULL ){ cell.iRowid = sqlite3_value_int64(aData[2]); @@ -186203,8 +186203,8 @@ static int rtreeRename(sqlite3_vtab *pVtab, const char *zNewName){ "ALTER TABLE %Q.'%q_node' RENAME TO \"%w_node\";" "ALTER TABLE %Q.'%q_parent' RENAME TO \"%w_parent\";" "ALTER TABLE %Q.'%q_rowid' RENAME TO \"%w_rowid\";" - , pRtree->zDb, pRtree->zName, zNewName - , pRtree->zDb, pRtree->zName, zNewName + , pRtree->zDb, pRtree->zName, zNewName + , pRtree->zDb, pRtree->zName, zNewName , pRtree->zDb, pRtree->zName, zNewName ); if( zSql ){ @@ -186219,8 +186219,8 @@ static int rtreeRename(sqlite3_vtab *pVtab, const char *zNewName){ ** The xSavepoint method. ** ** This module does not need to do anything to support savepoints. However, -** it uses this hook to close any open blob handle. This is done because a -** DROP TABLE command - which fortunately always opens a savepoint - cannot +** it uses this hook to close any open blob handle. This is done because a +** DROP TABLE command - which fortunately always opens a savepoint - cannot ** succeed if there are any open blob handles. i.e. if the blob handle were ** not closed here, the following would fail: ** @@ -186327,10 +186327,10 @@ static sqlite3_module rtreeModule = { }; static int rtreeSqlInit( - Rtree *pRtree, - sqlite3 *db, - const char *zDb, - const char *zPrefix, + Rtree *pRtree, + sqlite3 *db, + const char *zDb, + const char *zPrefix, int isCreate ){ int rc = SQLITE_OK; @@ -186410,7 +186410,7 @@ static int rtreeSqlInit( } zSql = sqlite3_mprintf(zFormat, zDb, zPrefix); if( zSql ){ - rc = sqlite3_prepare_v3(db, zSql, -1, f, appStmt[i], 0); + rc = sqlite3_prepare_v3(db, zSql, -1, f, appStmt[i], 0); }else{ rc = SQLITE_NOMEM; } @@ -186440,7 +186440,7 @@ static int rtreeSqlInit( if( zSql==0 ){ rc = SQLITE_NOMEM; }else{ - rc = sqlite3_prepare_v3(db, zSql, -1, f, &pRtree->pWriteAux, 0); + rc = sqlite3_prepare_v3(db, zSql, -1, f, &pRtree->pWriteAux, 0); sqlite3_free(zSql); } } @@ -186481,9 +186481,9 @@ static int getIntFromStmt(sqlite3 *db, const char *zSql, int *piVal){ ** table already exists. In this case the node-size is determined by inspecting ** the root node of the tree. ** -** Otherwise, for an xCreate(), use 64 bytes less than the database page-size. -** This ensures that each node is stored on a single database page. If the -** database page-size is so large that more than RTREE_MAXCELLS entries +** Otherwise, for an xCreate(), use 64 bytes less than the database page-size. +** This ensures that each node is stored on a single database page. If the +** database page-size is so large that more than RTREE_MAXCELLS entries ** would fit in a single node, use a smaller node-size. */ static int getNodeSize( @@ -186526,7 +186526,7 @@ static int getNodeSize( return rc; } -/* +/* ** This function is the implementation of both the xConnect and xCreate ** methods of the r-tree virtual table. ** @@ -186665,7 +186665,7 @@ rtreeInit_fail: ** ** The human readable string takes the form of a Tcl list with one ** entry for each cell in the r-tree node. Each entry is itself a -** list, containing the 8-byte rowid/pageno followed by the +** list, containing the 8-byte rowid/pageno followed by the ** *2 coordinates. */ static void rtreenode(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){ @@ -186721,10 +186721,10 @@ static void rtreenode(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){ */ static void rtreedepth(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){ UNUSED_PARAMETER(nArg); - if( sqlite3_value_type(apArg[0])!=SQLITE_BLOB + if( sqlite3_value_type(apArg[0])!=SQLITE_BLOB || sqlite3_value_bytes(apArg[0])<2 ){ - sqlite3_result_error(ctx, "Invalid argument to rtreedepth()", -1); + sqlite3_result_error(ctx, "Invalid argument to rtreedepth()", -1); }else{ u8 *zBlob = (u8 *)sqlite3_value_blob(apArg[0]); sqlite3_result_int(ctx, readInt16(zBlob)); @@ -186807,7 +186807,7 @@ static void rtreeCheckAppendMsg(RtreeCheck *pCheck, const char *zFmt, ...){ if( z==0 ){ pCheck->rc = SQLITE_NOMEM; }else{ - pCheck->zReport = sqlite3_mprintf("%z%s%z", + pCheck->zReport = sqlite3_mprintf("%z%s%z", pCheck->zReport, (pCheck->zReport ? "\n" : ""), z ); if( pCheck->zReport==0 ){ @@ -186838,7 +186838,7 @@ static u8 *rtreeCheckGetNode(RtreeCheck *pCheck, i64 iNode, int *pnNode){ if( pCheck->rc==SQLITE_OK && pCheck->pGetNode==0 ){ pCheck->pGetNode = rtreeCheckPrepare(pCheck, - "SELECT data FROM %Q.'%q_node' WHERE nodeno=?", + "SELECT data FROM %Q.'%q_node' WHERE nodeno=?", pCheck->zDb, pCheck->zTab ); } @@ -186908,7 +186908,7 @@ static void rtreeCheckMapping( }else if( rc==SQLITE_ROW ){ i64 ii = sqlite3_column_int64(pStmt, 0); if( ii!=iVal ){ - rtreeCheckAppendMsg(pCheck, + rtreeCheckAppendMsg(pCheck, "Found (%lld -> %lld) in %s table, expected (%lld -> %lld)", iKey, ii, (bLeaf ? "%_rowid" : "%_parent"), iKey, iVal ); @@ -186924,13 +186924,13 @@ static void rtreeCheckMapping( ** if they are not. ** ** Additionally, if pParent is not NULL, then it is assumed to point to -** the array of coordinates on the parent page that bound the page +** the array of coordinates on the parent page that bound the page ** containing pCell. In this case it is also verified that the two ** sets of coordinates are mutually consistent and an error message added ** to the RtreeCheck object if they are not. */ static void rtreeCheckCellCoord( - RtreeCheck *pCheck, + RtreeCheck *pCheck, i64 iNode, /* Node id to use in error messages */ int iCell, /* Cell number to use in error messages */ u8 *pCell, /* Pointer to cell coordinates */ @@ -186946,7 +186946,7 @@ static void rtreeCheckCellCoord( /* printf("%e, %e\n", c1.u.f, c2.u.f); */ if( pCheck->bInt ? c1.i>c2.i : c1.f>c2.f ){ - rtreeCheckAppendMsg(pCheck, + rtreeCheckAppendMsg(pCheck, "Dimension %d of cell %d on node %lld is corrupt", i, iCell, iNode ); } @@ -186955,10 +186955,10 @@ static void rtreeCheckCellCoord( readCoord(&pParent[4*2*i], &p1); readCoord(&pParent[4*(2*i + 1)], &p2); - if( (pCheck->bInt ? c1.ibInt ? c1.ibInt ? c2.i>p2.i : c2.f>p2.f) ){ - rtreeCheckAppendMsg(pCheck, + rtreeCheckAppendMsg(pCheck, "Dimension %d of cell %d on node %lld is corrupt relative to parent" , i, iCell, iNode ); @@ -186990,7 +186990,7 @@ static void rtreeCheckNode( aNode = rtreeCheckGetNode(pCheck, iNode, &nNode); if( aNode ){ if( nNode<4 ){ - rtreeCheckAppendMsg(pCheck, + rtreeCheckAppendMsg(pCheck, "Node %lld is too small (%d bytes)", iNode, nNode ); }else{ @@ -187006,8 +187006,8 @@ static void rtreeCheckNode( } nCell = readInt16(&aNode[2]); if( (4 + nCell*(8 + pCheck->nDim*2*4))>nNode ){ - rtreeCheckAppendMsg(pCheck, - "Node %lld is too small for cell count of %d (%d bytes)", + rtreeCheckAppendMsg(pCheck, + "Node %lld is too small for cell count of %d (%d bytes)", iNode, nCell, nNode ); }else{ @@ -187150,11 +187150,11 @@ static int rtreeCheckTable( ** b) unless the cell is on the root node, that the cell is bounded ** by the parent cell on the parent node. ** -** c) for leaf nodes, that there is an entry in the %_rowid -** table corresponding to the cell's rowid value that +** c) for leaf nodes, that there is an entry in the %_rowid +** table corresponding to the cell's rowid value that ** points to the correct node. ** -** d) for cells on non-leaf nodes, that there is an entry in the +** d) for cells on non-leaf nodes, that there is an entry in the ** %_parent table mapping from the cell's child node to the ** node that it resides on. ** @@ -187163,17 +187163,17 @@ static int rtreeCheckTable( ** is a leaf cell that corresponds to each entry in the %_rowid table. ** ** 3. That there are the same number of entries in the %_parent table -** as there are non-leaf cells in the r-tree structure, and that -** there is a non-leaf cell that corresponds to each entry in the +** as there are non-leaf cells in the r-tree structure, and that +** there is a non-leaf cell that corresponds to each entry in the ** %_parent table. */ static void rtreecheck( - sqlite3_context *ctx, - int nArg, + sqlite3_context *ctx, + int nArg, sqlite3_value **apArg ){ if( nArg!=1 && nArg!=2 ){ - sqlite3_result_error(ctx, + sqlite3_result_error(ctx, "wrong number of arguments to function rtreecheck()", -1 ); }else{ @@ -187564,7 +187564,7 @@ static void geopolyBlobFunc( ){ GeoPoly *p = geopolyFuncParam(context, argv[0], 0); if( p ){ - sqlite3_result_blob(context, p->hdr, + sqlite3_result_blob(context, p->hdr, 4+8*p->nVertex, SQLITE_TRANSIENT); sqlite3_free(p); } @@ -187672,7 +187672,7 @@ static void geopolyXformFunc( GeoX(p,ii) = x1; GeoY(p,ii) = y1; } - sqlite3_result_blob(context, p->hdr, + sqlite3_result_blob(context, p->hdr, 4+8*p->nVertex, SQLITE_TRANSIENT); sqlite3_free(p); } @@ -187716,7 +187716,7 @@ static void geopolyAreaFunc( if( p ){ sqlite3_result_double(context, geopolyArea(p)); sqlite3_free(p); - } + } } /* @@ -187724,7 +187724,7 @@ static void geopolyAreaFunc( ** ** If the rotation of polygon X is clockwise (incorrect) instead of ** counter-clockwise (the correct winding order according to RFC7946) -** then reverse the order of the vertexes in polygon X. +** then reverse the order of the vertexes in polygon X. ** ** In other words, this routine returns a CCW polygon regardless of the ** winding order of its input. @@ -187750,10 +187750,10 @@ static void geopolyCcwFunc( GeoY(p,jj) = t; } } - sqlite3_result_blob(context, p->hdr, + sqlite3_result_blob(context, p->hdr, 4+8*p->nVertex, SQLITE_TRANSIENT); sqlite3_free(p); - } + } } #define GEOPOLY_PI 3.1415926535897932385 @@ -187900,7 +187900,7 @@ static void geopolyBBoxFunc( ){ GeoPoly *p = geopolyBBox(context, argv[0], 0, 0); if( p ){ - sqlite3_result_blob(context, p->hdr, + sqlite3_result_blob(context, p->hdr, 4+8*p->nVertex, SQLITE_TRANSIENT); sqlite3_free(p); } @@ -187951,7 +187951,7 @@ static void geopolyBBoxFinal( if( pBBox==0 ) return; p = geopolyBBox(context, 0, pBBox->a, 0); if( p ){ - sqlite3_result_blob(context, p->hdr, + sqlite3_result_blob(context, p->hdr, 4+8*p->nVertex, SQLITE_TRANSIENT); sqlite3_free(p); } @@ -188131,7 +188131,7 @@ static void geopolyAddOneSegment( pEvent->eType = 1; pEvent->pSeg = pSeg; } - + /* @@ -188171,7 +188171,7 @@ static GeoEvent *geopolyEventMerge(GeoEvent *pLeft, GeoEvent *pRight){ } } pLast->pNext = pRight ? pRight : pLeft; - return head.pNext; + return head.pNext; } /* @@ -188220,7 +188220,7 @@ static GeoSegment *geopolySegmentMerge(GeoSegment *pLeft, GeoSegment *pRight){ } } pLast->pNext = pRight ? pRight : pLeft; - return head.pNext; + return head.pNext; } /* @@ -188265,8 +188265,8 @@ static int geopolyOverlap(GeoPoly *p1, GeoPoly *p2){ GeoSegment *pSeg; unsigned char aOverlap[4]; - nByte = sizeof(GeoEvent)*nVertex*2 - + sizeof(GeoSegment)*nVertex + nByte = sizeof(GeoEvent)*nVertex*2 + + sizeof(GeoSegment)*nVertex + sizeof(GeoOverlap); p = sqlite3_malloc64( nByte ); if( p==0 ) return -1; @@ -188408,7 +188408,7 @@ static void geopolyDebugFunc( #endif } -/* +/* ** This function is the implementation of both the xConnect and xCreate ** methods of the geopoly virtual table. ** @@ -188498,7 +188498,7 @@ geopolyInit_fail: } -/* +/* ** GEOPOLY virtual table module xCreate method. */ static int geopolyCreate( @@ -188511,7 +188511,7 @@ static int geopolyCreate( return geopolyInit(db, pAux, argc, argv, ppVtab, pzErr, 1); } -/* +/* ** GEOPOLY virtual table module xConnect method. */ static int geopolyConnect( @@ -188525,7 +188525,7 @@ static int geopolyConnect( } -/* +/* ** GEOPOLY virtual table module xFilter method. ** ** Query plans: @@ -188581,8 +188581,8 @@ static int geopolyFilter( pCsr->atEOF = 1; } }else{ - /* Normal case - r-tree scan. Set up the RtreeCursor.aConstraint array - ** with the configured constraints. + /* Normal case - r-tree scan. Set up the RtreeCursor.aConstraint array + ** with the configured constraints. */ rc = nodeAcquire(pRtree, 1, 0, &pRoot); if( rc==SQLITE_OK && idxNum<=3 ){ @@ -188663,7 +188663,7 @@ geopoly_filter_end: /* ** Rtree virtual table module xBestIndex method. There are three -** table scan strategies to choose from (in order from most to +** table scan strategies to choose from (in order from most to ** least desirable): ** ** idxNum idxStr Strategy @@ -188723,7 +188723,7 @@ static int geopolyBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ } -/* +/* ** GEOPOLY virtual table module xColumn method. */ static int geopolyColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){ @@ -188743,7 +188743,7 @@ static int geopolyColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){ &pCsr->pReadAux, 0); if( rc ) return rc; } - sqlite3_bind_int64(pCsr->pReadAux, 1, + sqlite3_bind_int64(pCsr->pReadAux, 1, nodeGetRowid(pRtree, pNode, p->iCell)); rc = sqlite3_step(pCsr->pReadAux); if( rc==SQLITE_ROW ){ @@ -188782,9 +188782,9 @@ static int geopolyColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){ ** argv[3] = new value for first application-defined column.... */ static int geopolyUpdate( - sqlite3_vtab *pVtab, - int nData, - sqlite3_value **aData, + sqlite3_vtab *pVtab, + int nData, + sqlite3_value **aData, sqlite_int64 *pRowid ){ Rtree *pRtree = (Rtree *)pVtab; @@ -188826,7 +188826,7 @@ static int geopolyUpdate( } coordChange = 1; - /* If a rowid value was supplied, check if it is already present in + /* If a rowid value was supplied, check if it is already present in ** the table. If so, the constraint has failed. */ if( newRowidValid && (!oldRowidValid || oldRowid!=newRowid) ){ int steprc; @@ -189016,7 +189016,7 @@ static int sqlite3_geopoly_init(sqlite3 *db){ /* ** Register the r-tree module with database handle db. This creates the -** virtual table module "rtree" and the debugging/analysis scalar +** virtual table module "rtree" and the debugging/analysis scalar ** function "rtreenode". */ SQLITE_PRIVATE int sqlite3RtreeInit(sqlite3 *db){ @@ -189143,7 +189143,7 @@ SQLITE_API int sqlite3_rtree_geometry_callback( pGeomCtx->xQueryFunc = 0; pGeomCtx->xDestructor = 0; pGeomCtx->pContext = pContext; - return sqlite3_create_function_v2(db, zGeom, -1, SQLITE_ANY, + return sqlite3_create_function_v2(db, zGeom, -1, SQLITE_ANY, (void *)pGeomCtx, geomCallback, 0, 0, rtreeFreeCallback ); } @@ -189168,7 +189168,7 @@ SQLITE_API int sqlite3_rtree_query_callback( pGeomCtx->xQueryFunc = xQueryFunc; pGeomCtx->xDestructor = xDestructor; pGeomCtx->pContext = pContext; - return sqlite3_create_function_v2(db, zQueryFunc, -1, SQLITE_ANY, + return sqlite3_create_function_v2(db, zQueryFunc, -1, SQLITE_ANY, (void *)pGeomCtx, geomCallback, 0, 0, rtreeFreeCallback ); } @@ -189204,9 +189204,9 @@ SQLITE_API int sqlite3_rtree_init( ************************************************************************* ** $Id: icu.c,v 1.7 2007/12/13 21:54:11 drh Exp $ ** -** This file implements an integration between the ICU library -** ("International Components for Unicode", an open-source library -** for handling unicode data) and SQLite. The integration uses +** This file implements an integration between the ICU library +** ("International Components for Unicode", an open-source library +** for handling unicode data) and SQLite. The integration uses ** ICU to provide the following to SQLite: ** ** * An implementation of the SQL regexp() function (and hence REGEXP @@ -189217,7 +189217,7 @@ SQLITE_API int sqlite3_rtree_init( ** ** * Integration of ICU and SQLite collation sequences. ** -** * An implementation of the LIKE operator that uses ICU to +** * An implementation of the LIKE operator that uses ICU to ** provide case-independent matching. */ @@ -189244,7 +189244,7 @@ SQLITE_API int sqlite3_rtree_init( ** This function is called when an ICU function called from within ** the implementation of an SQL scalar function returns an error. ** -** The scalar function context passed as the first argument is +** The scalar function context passed as the first argument is ** loaded with an error message based on the following two args. */ static void icuFunctionError( @@ -189309,7 +189309,7 @@ static const unsigned char icuUtf8Trans1[] = { /* ** Compare two UTF-8 strings for equality where the first string is -** a "LIKE" expression. Return true (1) if they are the same and +** a "LIKE" expression. Return true (1) if they are the same and ** false (0) if they are different. */ static int icuLikeCompare( @@ -189341,7 +189341,7 @@ static int icuLikeCompare( uint8_t c; /* Skip any MATCH_ALL or MATCH_ONE characters that follow a - ** MATCH_ALL. For each MATCH_ONE, skip one character in the + ** MATCH_ALL. For each MATCH_ONE, skip one character in the ** test string. */ while( (c=*zPattern) == MATCH_ALL || c == MATCH_ONE ){ @@ -189394,15 +189394,15 @@ static int icuLikeCompare( ** ** A LIKE B ** -** is implemented as like(B, A). If there is an escape character E, +** is implemented as like(B, A). If there is an escape character E, ** ** A LIKE B ESCAPE E ** ** is mapped to like(B, A, E). */ static void icuLikeFunc( - sqlite3_context *context, - int argc, + sqlite3_context *context, + int argc, sqlite3_value **argv ){ const unsigned char *zA = sqlite3_value_text(argv[0]); @@ -189428,7 +189428,7 @@ static void icuLikeFunc( if( zE==0 ) return; U8_NEXT(zE, i, nE, uEsc); if( i!=nE){ - sqlite3_result_error(context, + sqlite3_result_error(context, "ESCAPE expression must be a single character", -1); return; } @@ -189451,7 +189451,7 @@ static void icuRegexpDelete(void *p){ /* ** Implementation of SQLite REGEXP operator. This scalar function takes ** two arguments. The first is a regular expression pattern to compile -** the second is a string to match against that pattern. If either +** the second is a string to match against that pattern. If either ** argument is an SQL NULL, then NULL Is returned. Otherwise, the result ** is 1 if the string matches the pattern, or 0 otherwise. ** @@ -189475,8 +189475,8 @@ static void icuRegexpFunc(sqlite3_context *p, int nArg, sqlite3_value **apArg){ (void)nArg; /* Unused parameter */ - /* If the left hand side of the regexp operator is NULL, - ** then the result is also NULL. + /* If the left hand side of the regexp operator is NULL, + ** then the result is also NULL. */ if( !zString ){ return; @@ -189514,7 +189514,7 @@ static void icuRegexpFunc(sqlite3_context *p, int nArg, sqlite3_value **apArg){ } /* Set the text that the regular expression operates on to a NULL - ** pointer. This is not really necessary, but it is tidier than + ** pointer. This is not really necessary, but it is tidier than ** leaving the regular expression object configured with an invalid ** pointer after this function returns. */ @@ -189525,7 +189525,7 @@ static void icuRegexpFunc(sqlite3_context *p, int nArg, sqlite3_value **apArg){ } /* -** Implementations of scalar functions for case mapping - upper() and +** Implementations of scalar functions for case mapping - upper() and ** lower(). Function upper() converts its input to upper-case (ABC). ** Function lower() converts to lower-case (abc). ** @@ -189533,7 +189533,7 @@ static void icuRegexpFunc(sqlite3_context *p, int nArg, sqlite3_value **apArg){ ** "language specific". Refer to ICU documentation for the differences ** between the two. ** -** To utilise "general" case mapping, the upper() or lower() scalar +** To utilise "general" case mapping, the upper() or lower() scalar ** functions are invoked with one argument: ** ** upper('ABC') -> 'abc' @@ -189641,7 +189641,7 @@ static int icuCollationColl( /* ** Implementation of the scalar function icu_load_collation(). ** -** This scalar function is used to add ICU collation based collation +** This scalar function is used to add ICU collation based collation ** types to an SQLite database connection. It is intended to be called ** as follows: ** @@ -189652,8 +189652,8 @@ static int icuCollationColl( ** collation sequence to create. */ static void icuLoadCollation( - sqlite3_context *p, - int nArg, + sqlite3_context *p, + int nArg, sqlite3_value **apArg ){ sqlite3 *db = (sqlite3 *)sqlite3_user_data(p); @@ -189679,7 +189679,7 @@ static void icuLoadCollation( } assert(p); - rc = sqlite3_create_collation_v2(db, zName, SQLITE_UTF16, (void *)pUCollator, + rc = sqlite3_create_collation_v2(db, zName, SQLITE_UTF16, (void *)pUCollator, icuCollationColl, icuCollationDel ); if( rc!=SQLITE_OK ){ @@ -189716,11 +189716,11 @@ SQLITE_PRIVATE int sqlite3IcuInit(sqlite3 *db){ }; int rc = SQLITE_OK; int i; - + for(i=0; rc==SQLITE_OK && i<(int)(sizeof(scalars)/sizeof(scalars[0])); i++){ const struct IcuScalar *p = &scalars[i]; rc = sqlite3_create_function( - db, p->zName, p->nArg, p->enc, + db, p->zName, p->nArg, p->enc, p->iContext ? (void*)db : (void*)0, p->xFunc, 0, 0 ); @@ -189734,7 +189734,7 @@ SQLITE_PRIVATE int sqlite3IcuInit(sqlite3 *db){ __declspec(dllexport) #endif SQLITE_API int sqlite3_icu_init( - sqlite3 *db, + sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi ){ @@ -189837,7 +189837,7 @@ static int icuDestroy(sqlite3_tokenizer *pTokenizer){ /* ** Prepare to begin tokenizing a particular string. The input ** string to be tokenized is pInput[0..nBytes-1]. A cursor -** used to incrementally tokenize this string is returned in +** used to incrementally tokenize this string is returned in ** *ppCursor. */ static int icuOpen( @@ -189879,7 +189879,7 @@ static int icuOpen( pCsr->aOffset = (int *)&pCsr->aChar[(nChar+3)&~3]; pCsr->aOffset[iOut] = iInput; - U8_NEXT(zInput, iInput, nInput, c); + U8_NEXT(zInput, iInput, nInput, c); while( c>0 ){ int isError = 0; c = u_foldCase(c, opt); @@ -190025,7 +190025,7 @@ SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule( ************************************************************************* ** ** -** OVERVIEW +** OVERVIEW ** ** The RBU extension requires that the RBU update be packaged as an ** SQLite database. The tables it expects to find are described in @@ -190033,34 +190033,34 @@ SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule( ** that the user wishes to write to, a corresponding data_xyz table is ** created in the RBU database and populated with one row for each row to ** update, insert or delete from the target table. -** +** ** The update proceeds in three stages: -** +** ** 1) The database is updated. The modified database pages are written ** to a *-oal file. A *-oal file is just like a *-wal file, except ** that it is named "-oal" instead of "-wal". ** Because regular SQLite clients do not look for file named ** "-oal", they go on using the original database in ** rollback mode while the *-oal file is being generated. -** +** ** During this stage RBU does not update the database by writing ** directly to the target tables. Instead it creates "imposter" ** tables using the SQLITE_TESTCTRL_IMPOSTER interface that it uses ** to update each b-tree individually. All updates required by each ** b-tree are completed before moving on to the next, and all ** updates are done in sorted key order. -** +** ** 2) The "-oal" file is moved to the equivalent "-wal" ** location using a call to rename(2). Before doing this the RBU ** module takes an EXCLUSIVE lock on the database file, ensuring ** that there are no other active readers. -** +** ** Once the EXCLUSIVE lock is released, any other database readers ** detect the new *-wal file and read the database in wal mode. At ** this point they see the new version of the database - including ** the updates made as part of the RBU update. -** -** 3) The new *-wal file is checkpointed. This proceeds in the same way +** +** 3) The new *-wal file is checkpointed. This proceeds in the same way ** as a regular database checkpoint, except that a single frame is ** checkpointed each time sqlite3rbu_step() is called. If the RBU ** handle is closed before the entire *-wal file is checkpointed, @@ -190069,7 +190069,7 @@ SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule( ** the future. ** ** POTENTIAL PROBLEMS -** +** ** The rename() call might not be portable. And RBU is not currently ** syncing the directory after renaming the file. ** @@ -190091,7 +190091,7 @@ SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule( ** fields are collected. This means we're probably writing a lot more ** data to disk when saving the state of an ongoing update to the RBU ** update database than is strictly necessary. -** +** */ /* #include */ @@ -190115,42 +190115,42 @@ SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule( ** ************************************************************************* ** -** This file contains the public interface for the RBU extension. +** This file contains the public interface for the RBU extension. */ /* ** SUMMARY ** -** Writing a transaction containing a large number of operations on +** Writing a transaction containing a large number of operations on ** b-tree indexes that are collectively larger than the available cache -** memory can be very inefficient. +** memory can be very inefficient. ** ** The problem is that in order to update a b-tree, the leaf page (at least) ** containing the entry being inserted or deleted must be modified. If the -** working set of leaves is larger than the available cache memory, then a -** single leaf that is modified more than once as part of the transaction +** working set of leaves is larger than the available cache memory, then a +** single leaf that is modified more than once as part of the transaction ** may be loaded from or written to the persistent media multiple times. ** Additionally, because the index updates are likely to be applied in -** random order, access to pages within the database is also likely to be in +** random order, access to pages within the database is also likely to be in ** random order, which is itself quite inefficient. ** ** One way to improve the situation is to sort the operations on each index ** by index key before applying them to the b-tree. This leads to an IO ** pattern that resembles a single linear scan through the index b-tree, -** and all but guarantees each modified leaf page is loaded and stored +** and all but guarantees each modified leaf page is loaded and stored ** exactly once. SQLite uses this trick to improve the performance of ** CREATE INDEX commands. This extension allows it to be used to improve ** the performance of large transactions on existing databases. ** -** Additionally, this extension allows the work involved in writing the -** large transaction to be broken down into sub-transactions performed -** sequentially by separate processes. This is useful if the system cannot -** guarantee that a single update process will run for long enough to apply -** the entire update, for example because the update is being applied on a -** mobile device that is frequently rebooted. Even after the writer process +** Additionally, this extension allows the work involved in writing the +** large transaction to be broken down into sub-transactions performed +** sequentially by separate processes. This is useful if the system cannot +** guarantee that a single update process will run for long enough to apply +** the entire update, for example because the update is being applied on a +** mobile device that is frequently rebooted. Even after the writer process ** has committed one or more sub-transactions, other database clients continue -** to read from the original database snapshot. In other words, partially -** applied transactions are not visible to other clients. +** to read from the original database snapshot. In other words, partially +** applied transactions are not visible to other clients. ** ** "RBU" stands for "Resumable Bulk Update". As in a large database update ** transmitted via a wireless network to a mobile device. A transaction @@ -190166,9 +190166,9 @@ SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule( ** ** * INSERT statements may not use any default values. ** -** * UPDATE and DELETE statements must identify their target rows by +** * UPDATE and DELETE statements must identify their target rows by ** non-NULL PRIMARY KEY values. Rows with NULL values stored in PRIMARY -** KEY fields may not be updated or deleted. If the table being written +** KEY fields may not be updated or deleted. If the table being written ** has no PRIMARY KEY, affected rows must be identified by rowid. ** ** * UPDATE statements may not modify PRIMARY KEY columns. @@ -190185,10 +190185,10 @@ SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule( ** PREPARATION ** ** An "RBU update" is stored as a separate SQLite database. A database -** containing an RBU update is an "RBU database". For each table in the +** containing an RBU update is an "RBU database". For each table in the ** target database to be updated, the RBU database should contain a table ** named "data_" containing the same set of columns as the -** target table, and one more - "rbu_control". The data_% table should +** target table, and one more - "rbu_control". The data_% table should ** have no PRIMARY KEY or UNIQUE constraints, but each column should have ** the same type as the corresponding column in the target database. ** The "rbu_control" column should have no type at all. For example, if @@ -190203,22 +190203,22 @@ SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule( ** The order of the columns in the data_% table does not matter. ** ** Instead of a regular table, the RBU database may also contain virtual -** tables or view named using the data_ naming scheme. +** tables or view named using the data_ naming scheme. ** -** Instead of the plain data_ naming scheme, RBU database tables +** Instead of the plain data_ naming scheme, RBU database tables ** may also be named data_, where is any sequence ** of zero or more numeric characters (0-9). This can be significant because -** tables within the RBU database are always processed in order sorted by +** tables within the RBU database are always processed in order sorted by ** name. By judicious selection of the portion of the names ** of the RBU tables the user can therefore control the order in which they ** are processed. This can be useful, for example, to ensure that "external ** content" FTS4 tables are updated before their underlying content tables. ** ** If the target database table is a virtual table or a table that has no -** PRIMARY KEY declaration, the data_% table must also contain a column -** named "rbu_rowid". This column is mapped to the tables implicit primary -** key column - "rowid". Virtual tables for which the "rowid" column does -** not function like a primary key value cannot be updated using RBU. For +** PRIMARY KEY declaration, the data_% table must also contain a column +** named "rbu_rowid". This column is mapped to the tables implicit primary +** key column - "rowid". Virtual tables for which the "rowid" column does +** not function like a primary key value cannot be updated using RBU. For ** example, if the target db contains either of the following: ** ** CREATE VIRTUAL TABLE x1 USING fts3(a, b); @@ -190241,35 +190241,35 @@ SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule( ** CREATE TABLE data_ft1(a, b, langid, rbu_rowid, rbu_control); ** CREATE TABLE data_ft1(a, b, rbu_rowid, rbu_control); ** -** For each row to INSERT into the target database as part of the RBU +** For each row to INSERT into the target database as part of the RBU ** update, the corresponding data_% table should contain a single record ** with the "rbu_control" column set to contain integer value 0. The -** other columns should be set to the values that make up the new record -** to insert. +** other columns should be set to the values that make up the new record +** to insert. ** -** If the target database table has an INTEGER PRIMARY KEY, it is not -** possible to insert a NULL value into the IPK column. Attempting to +** If the target database table has an INTEGER PRIMARY KEY, it is not +** possible to insert a NULL value into the IPK column. Attempting to ** do so results in an SQLITE_MISMATCH error. ** -** For each row to DELETE from the target database as part of the RBU +** For each row to DELETE from the target database as part of the RBU ** update, the corresponding data_% table should contain a single record ** with the "rbu_control" column set to contain integer value 1. The ** real primary key values of the row to delete should be stored in the ** corresponding columns of the data_% table. The values stored in the ** other columns are not used. ** -** For each row to UPDATE from the target database as part of the RBU +** For each row to UPDATE from the target database as part of the RBU ** update, the corresponding data_% table should contain a single record ** with the "rbu_control" column set to contain a value of type text. -** The real primary key values identifying the row to update should be +** The real primary key values identifying the row to update should be ** stored in the corresponding columns of the data_% table row, as should -** the new values of all columns being update. The text value in the +** the new values of all columns being update. The text value in the ** "rbu_control" column must contain the same number of characters as ** there are columns in the target database table, and must consist entirely -** of 'x' and '.' characters (or in some special cases 'd' - see below). For +** of 'x' and '.' characters (or in some special cases 'd' - see below). For ** each column that is being updated, the corresponding character is set to ** 'x'. For those that remain as they are, the corresponding character of the -** rbu_control value should be set to '.'. For example, given the tables +** rbu_control value should be set to '.'. For example, given the tables ** above, the update statement: ** ** UPDATE t1 SET c = 'usa' WHERE a = 4; @@ -190283,30 +190283,30 @@ SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule( ** target table with the value stored in the corresponding data_% column, the ** user-defined SQL function "rbu_delta()" is invoked and the result stored in ** the target table column. rbu_delta() is invoked with two arguments - the -** original value currently stored in the target table column and the +** original value currently stored in the target table column and the ** value specified in the data_xxx table. ** ** For example, this row: ** ** INSERT INTO data_t1(a, b, c, rbu_control) VALUES(4, NULL, 'usa', '..d'); ** -** is similar to an UPDATE statement such as: +** is similar to an UPDATE statement such as: ** ** UPDATE t1 SET c = rbu_delta(c, 'usa') WHERE a = 4; ** -** Finally, if an 'f' character appears in place of a 'd' or 's' in an +** Finally, if an 'f' character appears in place of a 'd' or 's' in an ** ota_control string, the contents of the data_xxx table column is assumed ** to be a "fossil delta" - a patch to be applied to a blob value in the ** format used by the fossil source-code management system. In this case -** the existing value within the target database table must be of type BLOB. +** the existing value within the target database table must be of type BLOB. ** It is replaced by the result of applying the specified fossil delta to ** itself. ** ** If the target database table is a virtual table or a table with no PRIMARY -** KEY, the rbu_control value should not include a character corresponding +** KEY, the rbu_control value should not include a character corresponding ** to the rbu_rowid value. For example, this: ** -** INSERT INTO data_ft1(a, b, rbu_rowid, rbu_control) +** INSERT INTO data_ft1(a, b, rbu_rowid, rbu_control) ** VALUES(NULL, 'usa', 12, '.x'); ** ** causes a result similar to: @@ -190316,14 +190316,14 @@ SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule( ** The data_xxx tables themselves should have no PRIMARY KEY declarations. ** However, RBU is more efficient if reading the rows in from each data_xxx ** table in "rowid" order is roughly the same as reading them sorted by -** the PRIMARY KEY of the corresponding target database table. In other -** words, rows should be sorted using the destination table PRIMARY KEY +** the PRIMARY KEY of the corresponding target database table. In other +** words, rows should be sorted using the destination table PRIMARY KEY ** fields before they are inserted into the data_xxx tables. ** ** USAGE ** -** The API declared below allows an application to apply an RBU update -** stored on disk to an existing target database. Essentially, the +** The API declared below allows an application to apply an RBU update +** stored on disk to an existing target database. Essentially, the ** application: ** ** 1) Opens an RBU handle using the sqlite3rbu_open() function. @@ -190334,24 +190334,24 @@ SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule( ** ** 3) Calls the sqlite3rbu_step() function one or more times on ** the new handle. Each call to sqlite3rbu_step() performs a single -** b-tree operation, so thousands of calls may be required to apply +** b-tree operation, so thousands of calls may be required to apply ** a complete update. ** ** 4) Calls sqlite3rbu_close() to close the RBU update handle. If ** sqlite3rbu_step() has been called enough times to completely ** apply the update to the target database, then the RBU database -** is marked as fully applied. Otherwise, the state of the RBU -** update application is saved in the RBU database for later +** is marked as fully applied. Otherwise, the state of the RBU +** update application is saved in the RBU database for later ** resumption. ** ** See comments below for more detail on APIs. ** ** If an update is only partially applied to the target database by the -** time sqlite3rbu_close() is called, various state information is saved +** time sqlite3rbu_close() is called, various state information is saved ** within the RBU database. This allows subsequent processes to automatically ** resume the RBU update from where it left off. ** -** To remove all RBU extension state information, returning an RBU database +** To remove all RBU extension state information, returning an RBU database ** to its original contents, it is sufficient to drop all tables that begin ** with the prefix "rbu_" ** @@ -190387,21 +190387,21 @@ typedef struct sqlite3rbu sqlite3rbu; ** the path to the RBU database. Each call to this function must be matched ** by a call to sqlite3rbu_close(). When opening the databases, RBU passes ** the SQLITE_CONFIG_URI flag to sqlite3_open_v2(). So if either zTarget -** or zRbu begin with "file:", it will be interpreted as an SQLite +** or zRbu begin with "file:", it will be interpreted as an SQLite ** database URI, not a regular file name. ** -** If the zState argument is passed a NULL value, the RBU extension stores -** the current state of the update (how many rows have been updated, which +** If the zState argument is passed a NULL value, the RBU extension stores +** the current state of the update (how many rows have been updated, which ** indexes are yet to be updated etc.) within the RBU database itself. This ** can be convenient, as it means that the RBU application does not need to -** organize removing a separate state file after the update is concluded. -** Or, if zState is non-NULL, it must be a path to a database file in which +** organize removing a separate state file after the update is concluded. +** Or, if zState is non-NULL, it must be a path to a database file in which ** the RBU extension can store the state of the update. ** ** When resuming an RBU update, the zState argument must be passed the same ** value as when the RBU update was started. ** -** Once the RBU update is finished, the RBU extension does not +** Once the RBU update is finished, the RBU extension does not ** automatically remove any zState database file, even if it created it. ** ** By default, RBU uses the default VFS to access the files on disk. To @@ -190414,7 +190414,7 @@ typedef struct sqlite3rbu sqlite3rbu; ** the zipvfs_create_vfs() API below for details on using RBU with zipvfs. */ SQLITE_API sqlite3rbu *sqlite3rbu_open( - const char *zTarget, + const char *zTarget, const char *zRbu, const char *zState ); @@ -190424,13 +190424,13 @@ SQLITE_API sqlite3rbu *sqlite3rbu_open( ** An RBU vacuum is similar to SQLite's built-in VACUUM command, except ** that it can be suspended and resumed like an RBU update. ** -** The second argument to this function identifies a database in which -** to store the state of the RBU vacuum operation if it is suspended. The +** The second argument to this function identifies a database in which +** to store the state of the RBU vacuum operation if it is suspended. The ** first time sqlite3rbu_vacuum() is called, to start an RBU vacuum ** operation, the state database should either not exist or be empty -** (contain no tables). If an RBU vacuum is suspended by calling +** (contain no tables). If an RBU vacuum is suspended by calling ** sqlite3rbu_close() on the RBU handle before sqlite3rbu_step() has -** returned SQLITE_DONE, the vacuum state is stored in the state database. +** returned SQLITE_DONE, the vacuum state is stored in the state database. ** The vacuum can be resumed by calling this function to open a new RBU ** handle specifying the same target and state databases. ** @@ -190438,26 +190438,26 @@ SQLITE_API sqlite3rbu *sqlite3rbu_open( ** name of the state database is "-vacuum", where ** is the name of the target database file. In this case, on UNIX, if the ** state database is not already present in the file-system, it is created -** with the same permissions as the target db is made. +** with the same permissions as the target db is made. ** -** With an RBU vacuum, it is an SQLITE_MISUSE error if the name of the -** state database ends with "-vactmp". This name is reserved for internal +** With an RBU vacuum, it is an SQLITE_MISUSE error if the name of the +** state database ends with "-vactmp". This name is reserved for internal ** use. ** ** This function does not delete the state database after an RBU vacuum ** is completed, even if it created it. However, if the call to ** sqlite3rbu_close() returns any value other than SQLITE_OK, the contents ** of the state tables within the state database are zeroed. This way, -** the next call to sqlite3rbu_vacuum() opens a handle that starts a +** the next call to sqlite3rbu_vacuum() opens a handle that starts a ** new RBU vacuum operation. ** ** As with sqlite3rbu_open(), Zipvfs users should rever to the comment -** describing the sqlite3rbu_create_vfs() API function below for -** a description of the complications associated with using RBU with +** describing the sqlite3rbu_create_vfs() API function below for +** a description of the complications associated with using RBU with ** zipvfs databases. */ SQLITE_API sqlite3rbu *sqlite3rbu_vacuum( - const char *zTarget, + const char *zTarget, const char *zState ); @@ -190469,7 +190469,7 @@ SQLITE_API sqlite3rbu *sqlite3rbu_vacuum( ** is removed entirely. If the second parameter is negative, the limit is ** not modified (this is useful for querying the current limit). ** -** In all cases the returned value is the current limit in bytes (zero +** In all cases the returned value is the current limit in bytes (zero ** indicates unlimited). ** ** If the temp space limit is exceeded during operation, an SQLITE_FULL @@ -190478,13 +190478,13 @@ SQLITE_API sqlite3rbu *sqlite3rbu_vacuum( SQLITE_API sqlite3_int64 sqlite3rbu_temp_size_limit(sqlite3rbu*, sqlite3_int64); /* -** Return the current amount of temp file space, in bytes, currently used by +** Return the current amount of temp file space, in bytes, currently used by ** the RBU handle passed as the only argument. */ SQLITE_API sqlite3_int64 sqlite3rbu_temp_size(sqlite3rbu*); /* -** Internally, each RBU connection uses a separate SQLite database +** Internally, each RBU connection uses a separate SQLite database ** connection to access the target and rbu update databases. This ** API allows the application direct access to these database handles. ** @@ -190495,10 +190495,10 @@ SQLITE_API sqlite3_int64 sqlite3rbu_temp_size(sqlite3rbu*); ** following scenarios: ** ** * If any target tables are virtual tables, it may be necessary to -** call sqlite3_create_module() on the target database handle to +** call sqlite3_create_module() on the target database handle to ** register the required virtual table implementations. ** -** * If the data_xxx tables in the RBU source database are virtual +** * If the data_xxx tables in the RBU source database are virtual ** tables, the application may need to call sqlite3_create_module() on ** the rbu update db handle to any required virtual table ** implementations. @@ -190517,12 +190517,12 @@ SQLITE_API sqlite3_int64 sqlite3rbu_temp_size(sqlite3rbu*); SQLITE_API sqlite3 *sqlite3rbu_db(sqlite3rbu*, int bRbu); /* -** Do some work towards applying the RBU update to the target db. +** Do some work towards applying the RBU update to the target db. ** -** Return SQLITE_DONE if the update has been completely applied, or +** Return SQLITE_DONE if the update has been completely applied, or ** SQLITE_OK if no error occurs but there remains work to do to apply -** the RBU update. If an error does occur, some other error code is -** returned. +** the RBU update. If an error does occur, some other error code is +** returned. ** ** Once a call to sqlite3rbu_step() has returned a value other than ** SQLITE_OK, all subsequent calls on the same RBU handle are no-ops @@ -190535,7 +190535,7 @@ SQLITE_API int sqlite3rbu_step(sqlite3rbu *pRbu); ** ** If a power failure or application crash occurs during an update, following ** system recovery RBU may resume the update from the point at which the state -** was last saved. In other words, from the most recent successful call to +** was last saved. In other words, from the most recent successful call to ** sqlite3rbu_close() or this function. ** ** SQLITE_OK is returned if successful, or an SQLite error code otherwise. @@ -190543,7 +190543,7 @@ SQLITE_API int sqlite3rbu_step(sqlite3rbu *pRbu); SQLITE_API int sqlite3rbu_savestate(sqlite3rbu *pRbu); /* -** Close an RBU handle. +** Close an RBU handle. ** ** If the RBU update has been completely applied, mark the RBU database ** as fully applied. Otherwise, assuming no error has occurred, save the @@ -190557,20 +190557,20 @@ SQLITE_API int sqlite3rbu_savestate(sqlite3rbu *pRbu); ** eventually free any such buffer using sqlite3_free(). ** ** Otherwise, if no error occurs, this function returns SQLITE_OK if the -** update has been partially applied, or SQLITE_DONE if it has been +** update has been partially applied, or SQLITE_DONE if it has been ** completely applied. */ SQLITE_API int sqlite3rbu_close(sqlite3rbu *pRbu, char **pzErrmsg); /* -** Return the total number of key-value operations (inserts, deletes or +** Return the total number of key-value operations (inserts, deletes or ** updates) that have been performed on the target database since the ** current RBU update was started. */ SQLITE_API sqlite3_int64 sqlite3rbu_progress(sqlite3rbu *pRbu); /* -** Obtain permyriadage (permyriadage is to 10000 as percentage is to 100) +** Obtain permyriadage (permyriadage is to 10000 as percentage is to 100) ** progress indications for the two stages of an RBU update. This API may ** be useful for driving GUI progress indicators and similar. ** @@ -190583,16 +190583,16 @@ SQLITE_API sqlite3_int64 sqlite3rbu_progress(sqlite3rbu *pRbu); ** The update is visible to non-RBU clients during stage 2. During stage 1 ** non-RBU reader clients may see the original database. ** -** If this API is called during stage 2 of the update, output variable +** If this API is called during stage 2 of the update, output variable ** (*pnOne) is set to 10000 to indicate that stage 1 has finished and (*pnTwo) ** to a value between 0 and 10000 to indicate the permyriadage progress of -** stage 2. A value of 5000 indicates that stage 2 is half finished, +** stage 2. A value of 5000 indicates that stage 2 is half finished, ** 9000 indicates that it is 90% finished, and so on. ** -** If this API is called during stage 1 of the update, output variable +** If this API is called during stage 1 of the update, output variable ** (*pnTwo) is set to 0 to indicate that stage 2 has not yet started. The -** value to which (*pnOne) is set depends on whether or not the RBU -** database contains an "rbu_count" table. The rbu_count table, if it +** value to which (*pnOne) is set depends on whether or not the RBU +** database contains an "rbu_count" table. The rbu_count table, if it ** exists, must contain the same columns as the following: ** ** CREATE TABLE rbu_count(tbl TEXT PRIMARY KEY, cnt INTEGER) WITHOUT ROWID; @@ -190651,20 +190651,20 @@ SQLITE_API int sqlite3rbu_state(sqlite3rbu *pRbu); /* ** Create an RBU VFS named zName that accesses the underlying file-system -** via existing VFS zParent. Or, if the zParent parameter is passed NULL, +** via existing VFS zParent. Or, if the zParent parameter is passed NULL, ** then the new RBU VFS uses the default system VFS to access the file-system. -** The new object is registered as a non-default VFS with SQLite before +** The new object is registered as a non-default VFS with SQLite before ** returning. ** ** Part of the RBU implementation uses a custom VFS object. Usually, this -** object is created and deleted automatically by RBU. +** object is created and deleted automatically by RBU. ** ** The exception is for applications that also use zipvfs. In this case, ** the custom VFS must be explicitly created by the user before the RBU ** handle is opened. The RBU VFS should be installed so that the zipvfs -** VFS uses the RBU VFS, which in turn uses any other VFS layers in use +** VFS uses the RBU VFS, which in turn uses any other VFS layers in use ** (for example multiplexor) to access the file-system. For example, -** to assemble an RBU enabled VFS stack that uses both zipvfs and +** to assemble an RBU enabled VFS stack that uses both zipvfs and ** multiplexor (error checking omitted): ** ** // Create a VFS named "multiplex" (not the default). @@ -190686,9 +190686,9 @@ SQLITE_API int sqlite3rbu_state(sqlite3rbu *pRbu); ** may be used by RBU clients. Attempting to use RBU with a zipvfs VFS stack ** that does not include the RBU layer results in an error. ** -** The overhead of adding the "rbu" VFS to the system is negligible for -** non-RBU users. There is no harm in an application accessing the -** file-system via "rbu" all the time, even if it only uses RBU functionality +** The overhead of adding the "rbu" VFS to the system is negligible for +** non-RBU users. There is no harm in an application accessing the +** file-system via "rbu" all the time, even if it only uses RBU functionality ** occasionally. */ SQLITE_API int sqlite3rbu_create_vfs(const char *zName, const char *zParent); @@ -190741,17 +190741,17 @@ SQLITE_API void sqlite3rbu_destroy_vfs(const char *zName); ** RBU_STATE_STAGE: ** May be set to integer values 1, 2, 4 or 5. As follows: ** 1: the *-rbu file is currently under construction. -** 2: the *-rbu file has been constructed, but not yet moved +** 2: the *-rbu file has been constructed, but not yet moved ** to the *-wal path. ** 4: the checkpoint is underway. ** 5: the rbu update has been checkpointed. ** ** RBU_STATE_TBL: -** Only valid if STAGE==1. The target database name of the table +** Only valid if STAGE==1. The target database name of the table ** currently being written. ** ** RBU_STATE_IDX: -** Only valid if STAGE==1. The target database name of the index +** Only valid if STAGE==1. The target database name of the index ** currently being written, or NULL if the main table is currently being ** updated. ** @@ -190771,14 +190771,14 @@ SQLITE_API void sqlite3rbu_destroy_vfs(const char *zName); ** be continued if this happens). ** ** RBU_STATE_COOKIE: -** Valid if STAGE==1. The current change-counter cookie value in the +** Valid if STAGE==1. The current change-counter cookie value in the ** target db file. ** ** RBU_STATE_OALSZ: ** Valid if STAGE==1. The size in bytes of the *-oal file. ** ** RBU_STATE_DATATBL: -** Only valid if STAGE==1. The RBU database name of the table +** Only valid if STAGE==1. The RBU database name of the table ** currently being read. */ #define RBU_STATE_STAGE 1 @@ -190860,7 +190860,7 @@ struct RbuSpan { ** the target database that require updating. For each such table, the ** iterator visits, in order: ** -** * the table itself, +** * the table itself, ** * each index of the table (zero or more points to visit), and ** * a special "cleanup table" state. ** @@ -190874,7 +190874,7 @@ struct RbuSpan { ** this array set set to 1. This is because in that case, the module has ** no way to tell which fields will be required to add and remove entries ** from the partial indexes. -** +** */ struct RbuObjIter { sqlite3_stmt *pTblIter; /* Iterate through tables */ @@ -190956,7 +190956,7 @@ struct RbuFrame { ** ** nPhaseOneStep: ** If the RBU database contains an rbu_count table, this value is set to -** a running estimate of the number of b-tree operations required to +** a running estimate of the number of b-tree operations required to ** finish populating the *-oal file. This allows the sqlite3_bp_progress() ** API to calculate the permyriadage progress of populating the *-oal file ** using the formula: @@ -190976,7 +190976,7 @@ struct RbuFrame { ** ** * the RBU update contains any UPDATE operations. If the PK specified ** for an UPDATE operation does not exist in the target table, then -** no b-tree operations are required on index b-trees. Or if the +** no b-tree operations are required on index b-trees. Or if the ** specified PK does exist, then (nIndex*2) such operations are ** required (one delete and one insert on each index b-tree). ** @@ -191333,7 +191333,7 @@ static void rbuFossilDeltaFunc( /* ** Prepare the SQL statement in buffer zSql against database handle db. ** If successful, set *ppStmt to point to the new statement and return -** SQLITE_OK. +** SQLITE_OK. ** ** Otherwise, if an error does occur, set *ppStmt to NULL and return ** an SQLite error code. Additionally, set output variable *pzErrmsg to @@ -191341,7 +191341,7 @@ static void rbuFossilDeltaFunc( ** of the caller to (eventually) free this buffer using sqlite3_free(). */ static int prepareAndCollectError( - sqlite3 *db, + sqlite3 *db, sqlite3_stmt **ppStmt, char **pzErrmsg, const char *zSql @@ -191373,9 +191373,9 @@ static int resetAndCollectError(sqlite3_stmt *pStmt, char **pzErrmsg){ /* ** Unless it is NULL, argument zSql points to a buffer allocated using ** sqlite3_malloc containing an SQL statement. This function prepares the SQL -** statement against database db and frees the buffer. If statement -** compilation is successful, *ppStmt is set to point to the new statement -** handle and SQLITE_OK is returned. +** statement against database db and frees the buffer. If statement +** compilation is successful, *ppStmt is set to point to the new statement +** handle and SQLITE_OK is returned. ** ** Otherwise, if an error occurs, *ppStmt is set to NULL and an error code ** returned. In this case, *pzErrmsg may also be set to point to an error @@ -191386,7 +191386,7 @@ static int resetAndCollectError(sqlite3_stmt *pStmt, char **pzErrmsg){ ** In this case SQLITE_NOMEM is returned and *ppStmt set to NULL. */ static int prepareFreeAndCollectError( - sqlite3 *db, + sqlite3 *db, sqlite3_stmt **ppStmt, char **pzErrmsg, char *zSql @@ -191443,7 +191443,7 @@ static void rbuObjIterClearStatements(RbuObjIter *pIter){ } sqlite3_free(pIter->aIdxCol); sqlite3_free(pIter->zIdxSql); - + pIter->pSelect = 0; pIter->pInsert = 0; pIter->pDelete = 0; @@ -191470,16 +191470,16 @@ static void rbuObjIterFinalize(RbuObjIter *pIter){ /* ** Advance the iterator to the next position. ** -** If no error occurs, SQLITE_OK is returned and the iterator is left -** pointing to the next entry. Otherwise, an error code and message is -** left in the RBU handle passed as the first argument. A copy of the +** If no error occurs, SQLITE_OK is returned and the iterator is left +** pointing to the next entry. Otherwise, an error code and message is +** left in the RBU handle passed as the first argument. A copy of the ** error code is returned. */ static int rbuObjIterNext(sqlite3rbu *p, RbuObjIter *pIter){ int rc = p->rc; if( rc==SQLITE_OK ){ - /* Free any SQLite statements used while processing the previous object */ + /* Free any SQLite statements used while processing the previous object */ rbuObjIterClearStatements(pIter); if( pIter->zIdx==0 ){ rc = sqlite3_exec(p->dbMain, @@ -191538,7 +191538,7 @@ static int rbuObjIterNext(sqlite3rbu *p, RbuObjIter *pIter){ ** The implementation of the rbu_target_name() SQL function. This function ** accepts one or two arguments. The first argument is the name of a table - ** the name of a table in the RBU database. The second, if it is present, is 1 -** for a view or 0 for a table. +** for a view or 0 for a table. ** ** For a non-vacuum RBU handle, if the table name matches the pattern: ** @@ -191586,16 +191586,16 @@ static void rbuTargetNameFunc( /* ** Initialize the iterator structure passed as the second argument. ** -** If no error occurs, SQLITE_OK is returned and the iterator is left -** pointing to the first entry. Otherwise, an error code and message is -** left in the RBU handle passed as the first argument. A copy of the +** If no error occurs, SQLITE_OK is returned and the iterator is left +** pointing to the first entry. Otherwise, an error code and message is +** left in the RBU handle passed as the first argument. A copy of the ** error code is returned. */ static int rbuObjIterFirst(sqlite3rbu *p, RbuObjIter *pIter){ int rc; memset(pIter, 0, sizeof(RbuObjIter)); - rc = prepareFreeAndCollectError(p->dbRbu, &pIter->pTblIter, &p->zErrmsg, + rc = prepareFreeAndCollectError(p->dbRbu, &pIter->pTblIter, &p->zErrmsg, sqlite3_mprintf( "SELECT rbu_target_name(name, type='view') AS target, name " "FROM sqlite_master " @@ -191623,7 +191623,7 @@ static int rbuObjIterFirst(sqlite3rbu *p, RbuObjIter *pIter){ ** ** If an error has already occurred (p->rc is already set to something other ** than SQLITE_OK), then this function returns NULL without modifying the -** stored error code. In this case it still calls sqlite3_free() on any +** stored error code. In this case it still calls sqlite3_free() on any ** printf() parameters associated with %z conversions. */ static char *rbuMPrintf(sqlite3rbu *p, const char *zFmt, ...){ @@ -191669,12 +191669,12 @@ static int rbuMPrintfExec(sqlite3rbu *p, sqlite3 *db, const char *zFmt, ...){ } /* -** Attempt to allocate and return a pointer to a zeroed block of nByte -** bytes. +** Attempt to allocate and return a pointer to a zeroed block of nByte +** bytes. ** -** If an error (i.e. an OOM condition) occurs, return NULL and leave an -** error code in the rbu handle passed as the first argument. Or, if an -** error has already occurred when this function is called, return NULL +** If an error (i.e. an OOM condition) occurs, return NULL and leave an +** error code in the rbu handle passed as the first argument. Or, if an +** error has already occurred when this function is called, return NULL ** immediately without attempting the allocation or modifying the stored ** error code. */ @@ -191771,7 +191771,7 @@ static void rbuFinalize(sqlite3rbu *p, sqlite3_stmt *pStmt){ ** RBU_PK_VTAB: Table is a virtual table. ** ** Argument *piPk is also of type (int*), and also points to an output -** parameter. Unless the table has an external primary key index +** parameter. Unless the table has an external primary key index ** (i.e. unless *peType is set to 3), then *piPk is set to zero. Or, ** if the table does have an external primary key index, then *piPk ** is set to the root page number of the primary key index before @@ -191806,7 +191806,7 @@ static void rbuTableType( /* ** 0) SELECT count(*) FROM sqlite_master where name=%Q AND IsVirtual(%Q) ** 1) PRAGMA index_list = ? - ** 2) SELECT count(*) FROM sqlite_master where name=%Q + ** 2) SELECT count(*) FROM sqlite_master where name=%Q ** 3) PRAGMA table_info = ? */ sqlite3_stmt *aStmt[4] = {0, 0, 0, 0}; @@ -191815,7 +191815,7 @@ static void rbuTableType( *piPk = 0; assert( p->rc==SQLITE_OK ); - p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[0], &p->zErrmsg, + p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[0], &p->zErrmsg, sqlite3_mprintf( "SELECT (sql LIKE 'create virtual%%'), rootpage" " FROM sqlite_master" @@ -191831,7 +191831,7 @@ static void rbuTableType( } *piTnum = sqlite3_column_int(aStmt[0], 1); - p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[1], &p->zErrmsg, + p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[1], &p->zErrmsg, sqlite3_mprintf("PRAGMA index_list=%Q",zTab) ); if( p->rc ) goto rbuTableType_end; @@ -191839,7 +191839,7 @@ static void rbuTableType( const u8 *zOrig = sqlite3_column_text(aStmt[1], 3); const u8 *zIdx = sqlite3_column_text(aStmt[1], 1); if( zOrig && zIdx && zOrig[0]=='p' ){ - p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[2], &p->zErrmsg, + p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[2], &p->zErrmsg, sqlite3_mprintf( "SELECT rootpage FROM sqlite_master WHERE name = %Q", zIdx )); @@ -191855,7 +191855,7 @@ static void rbuTableType( } } - p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[3], &p->zErrmsg, + p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[3], &p->zErrmsg, sqlite3_mprintf("PRAGMA table_info=%Q",zTab) ); if( p->rc==SQLITE_OK ){ @@ -191931,7 +191931,7 @@ static void rbuObjIterCacheIndexedCols(sqlite3rbu *p, RbuObjIter *pIter){ ** the table (not index) that the iterator currently points to. ** ** Return SQLITE_OK if successful, or an SQLite error code otherwise. If -** an error does occur, an error code and error message are also left in +** an error does occur, an error code and error message are also left in ** the RBU handle. */ static int rbuObjIterCacheTableInfo(sqlite3rbu *p, RbuObjIter *pIter){ @@ -191953,7 +191953,7 @@ static int rbuObjIterCacheTableInfo(sqlite3rbu *p, RbuObjIter *pIter){ if( p->rc ) return p->rc; if( pIter->zIdx==0 ) pIter->iTnum = iTnum; - assert( pIter->eType==RBU_PK_NONE || pIter->eType==RBU_PK_IPK + assert( pIter->eType==RBU_PK_NONE || pIter->eType==RBU_PK_IPK || pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_WITHOUT_ROWID || pIter->eType==RBU_PK_VTAB ); @@ -191961,7 +191961,7 @@ static int rbuObjIterCacheTableInfo(sqlite3rbu *p, RbuObjIter *pIter){ /* Populate the azTblCol[] and nTblCol variables based on the columns ** of the input table. Ignore any input table columns that begin with ** "rbu_". */ - p->rc = prepareFreeAndCollectError(p->dbRbu, &pStmt, &p->zErrmsg, + p->rc = prepareFreeAndCollectError(p->dbRbu, &pStmt, &p->zErrmsg, sqlite3_mprintf("SELECT * FROM '%q'", pIter->zDataTbl) ); if( p->rc==SQLITE_OK ){ @@ -191997,7 +191997,7 @@ static int rbuObjIterCacheTableInfo(sqlite3rbu *p, RbuObjIter *pIter){ ** present in the input table. Populate the abTblPk[], azTblType[] and ** aiTblOrder[] arrays at the same time. */ if( p->rc==SQLITE_OK ){ - p->rc = prepareFreeAndCollectError(p->dbMain, &pStmt, &p->zErrmsg, + p->rc = prepareFreeAndCollectError(p->dbMain, &pStmt, &p->zErrmsg, sqlite3_mprintf("PRAGMA table_info(%Q)", pIter->zTbl) ); } @@ -192040,8 +192040,8 @@ static int rbuObjIterCacheTableInfo(sqlite3rbu *p, RbuObjIter *pIter){ } /* -** This function constructs and returns a pointer to a nul-terminated -** string containing some SQL clause or list based on one or more of the +** This function constructs and returns a pointer to a nul-terminated +** string containing some SQL clause or list based on one or more of the ** column names currently stored in the pIter->azTblCol[] array. */ static char *rbuObjIterGetCollist( @@ -192092,10 +192092,10 @@ static char *rbuObjIterGetPkList( } /* -** This function is called as part of restarting an RBU vacuum within +** This function is called as part of restarting an RBU vacuum within ** stage 1 of the process (while the *-oal file is being built) while ** updating a table (not an index). The table may be a rowid table or -** a WITHOUT ROWID table. It queries the target database to find the +** a WITHOUT ROWID table. It queries the target database to find the ** largest key that has already been written to the target table and ** constructs a WHERE clause that can be used to extract the remaining ** rows from the source table. For a rowid table, the WHERE clause @@ -192119,7 +192119,7 @@ static char *rbuVacuumTableStart( sqlite3_stmt *pMax = 0; char *zRet = 0; if( bRowid ){ - p->rc = prepareFreeAndCollectError(p->dbMain, &pMax, &p->zErrmsg, + p->rc = prepareFreeAndCollectError(p->dbMain, &pMax, &p->zErrmsg, sqlite3_mprintf( "SELECT max(_rowid_) FROM \"%s%w\"", zWrite, pIter->zTbl ) @@ -192135,9 +192135,9 @@ static char *rbuVacuumTableStart( char *zList = rbuObjIterGetPkList(p, pIter, "", ", ", ""); if( p->rc==SQLITE_OK ){ - p->rc = prepareFreeAndCollectError(p->dbMain, &pMax, &p->zErrmsg, + p->rc = prepareFreeAndCollectError(p->dbMain, &pMax, &p->zErrmsg, sqlite3_mprintf( - "SELECT %s FROM \"%s%w\" ORDER BY %s LIMIT 1", + "SELECT %s FROM \"%s%w\" ORDER BY %s LIMIT 1", zSelect, zWrite, pIter->zTbl, zOrder ) ); @@ -192159,12 +192159,12 @@ static char *rbuVacuumTableStart( ** This function is called as part of restating an RBU vacuum when the ** current operation is writing content to an index. If possible, it ** queries the target index b-tree for the largest key already written to -** it, then composes and returns an expression that can be used in a WHERE -** clause to select the remaining required rows from the source table. +** it, then composes and returns an expression that can be used in a WHERE +** clause to select the remaining required rows from the source table. ** It is only possible to return such an expression if: ** ** * The index contains no DESC columns, and -** * The last key written to the index before the operation was +** * The last key written to the index before the operation was ** suspended does not contain any NULL values. ** ** The expression is of the form: @@ -192174,7 +192174,7 @@ static char *rbuVacuumTableStart( ** except that the "?" placeholders are replaced with literal values. ** ** If the expression cannot be created, NULL is returned. In this case, -** the caller has to use an OFFSET clause to extract only the required +** the caller has to use an OFFSET clause to extract only the required ** rows from the sourct table, just as it does for an RBU update operation. */ char *rbuVacuumIndexStart( @@ -192267,23 +192267,23 @@ char *rbuVacuumIndexStart( } /* -** This function is used to create a SELECT list (the list of SQL -** expressions that follows a SELECT keyword) for a SELECT statement -** used to read from an data_xxx or rbu_tmp_xxx table while updating the -** index object currently indicated by the iterator object passed as the -** second argument. A "PRAGMA index_xinfo = " statement is used +** This function is used to create a SELECT list (the list of SQL +** expressions that follows a SELECT keyword) for a SELECT statement +** used to read from an data_xxx or rbu_tmp_xxx table while updating the +** index object currently indicated by the iterator object passed as the +** second argument. A "PRAGMA index_xinfo = " statement is used ** to obtain the required information. ** ** If the index is of the following form: ** ** CREATE INDEX i1 ON t1(c, b COLLATE nocase); ** -** and "t1" is a table with an explicit INTEGER PRIMARY KEY column +** and "t1" is a table with an explicit INTEGER PRIMARY KEY column ** "ipk", the returned string is: ** ** "`c` COLLATE 'BINARY', `b` COLLATE 'NOCASE', `ipk` COLLATE 'BINARY'" ** -** As well as the returned string, three other malloc'd strings are +** As well as the returned string, three other malloc'd strings are ** returned via output parameters. As follows: ** ** pzImposterCols: ... @@ -192353,11 +192353,11 @@ static char *rbuObjIterGetIndexCols( if( pIter->bUnique==0 || sqlite3_column_int(pXInfo, 5) ){ const char *zOrder = (bDesc ? " DESC" : ""); - zImpPK = sqlite3_mprintf("%z%s\"rbu_imp_%d%w\"%s", + zImpPK = sqlite3_mprintf("%z%s\"rbu_imp_%d%w\"%s", zImpPK, zCom, nBind, zCol, zOrder ); } - zImpCols = sqlite3_mprintf("%z%s\"rbu_imp_%d%w\" %s COLLATE %Q", + zImpCols = sqlite3_mprintf("%z%s\"rbu_imp_%d%w\" %s COLLATE %Q", zImpCols, zCom, nBind, zCol, zType, zCollate ); zWhere = sqlite3_mprintf( @@ -192403,7 +192403,7 @@ static char *rbuObjIterGetIndexCols( ** the text ", old._rowid_" to the returned value. */ static char *rbuObjIterGetOldlist( - sqlite3rbu *p, + sqlite3rbu *p, RbuObjIter *pIter, const char *zObj ){ @@ -192444,7 +192444,7 @@ static char *rbuObjIterGetOldlist( ** "b = ?1 AND c = ?2" */ static char *rbuObjIterGetWhere( - sqlite3rbu *p, + sqlite3rbu *p, RbuObjIter *pIter ){ char *zList = 0; @@ -192459,7 +192459,7 @@ static char *rbuObjIterGetWhere( zSep = " AND "; } } - zList = rbuMPrintf(p, + zList = rbuMPrintf(p, "_rowid_ = (SELECT id FROM rbu_imposter2 WHERE %z)", zList ); @@ -192499,7 +192499,7 @@ static void rbuBadControlError(sqlite3rbu *p){ ** ** The memory for the returned string is obtained from sqlite3_malloc(). ** It is the responsibility of the caller to eventually free it using -** sqlite3_free(). +** sqlite3_free(). ** ** If an OOM error is encountered when allocating space for the new ** string, an error code is left in the rbu handle passed as the first @@ -192523,19 +192523,19 @@ static char *rbuObjIterGetSetlist( for(i=0; inTblCol; i++){ char c = zMask[pIter->aiSrcOrder[i]]; if( c=='x' ){ - zList = rbuMPrintf(p, "%z%s\"%w\"=?%d", + zList = rbuMPrintf(p, "%z%s\"%w\"=?%d", zList, zSep, pIter->azTblCol[i], i+1 ); zSep = ", "; } else if( c=='d' ){ - zList = rbuMPrintf(p, "%z%s\"%w\"=rbu_delta(\"%w\", ?%d)", + zList = rbuMPrintf(p, "%z%s\"%w\"=rbu_delta(\"%w\", ?%d)", zList, zSep, pIter->azTblCol[i], pIter->azTblCol[i], i+1 ); zSep = ", "; } else if( c=='f' ){ - zList = rbuMPrintf(p, "%z%s\"%w\"=rbu_fossil_delta(\"%w\", ?%d)", + zList = rbuMPrintf(p, "%z%s\"%w\"=rbu_fossil_delta(\"%w\", ?%d)", zList, zSep, pIter->azTblCol[i], pIter->azTblCol[i], i+1 ); zSep = ", "; @@ -192553,7 +192553,7 @@ static char *rbuObjIterGetSetlist( ** ** The memory for the returned string is obtained from sqlite3_malloc(). ** It is the responsibility of the caller to eventually free it using -** sqlite3_free(). +** sqlite3_free(). ** ** If an OOM error is encountered when allocating space for the new ** string, an error code is left in the rbu handle passed as the first @@ -192577,8 +192577,8 @@ static char *rbuObjIterGetBindlist(sqlite3rbu *p, int nBind){ } /* -** The iterator currently points to a table (not index) of type -** RBU_PK_WITHOUT_ROWID. This function creates the PRIMARY KEY +** The iterator currently points to a table (not index) of type +** RBU_PK_WITHOUT_ROWID. This function creates the PRIMARY KEY ** declaration for the corresponding imposter table. For example, ** if the iterator points to a table created as: ** @@ -192595,7 +192595,7 @@ static char *rbuWithoutRowidPK(sqlite3rbu *p, RbuObjIter *pIter){ const char *zSep = "PRIMARY KEY("; sqlite3_stmt *pXList = 0; /* PRAGMA index_list = (pIter->zTbl) */ sqlite3_stmt *pXInfo = 0; /* PRAGMA index_xinfo = */ - + p->rc = prepareFreeAndCollectError(p->dbMain, &pXList, &p->zErrmsg, sqlite3_mprintf("PRAGMA main.index_list = %Q", pIter->zTbl) ); @@ -192633,7 +192633,7 @@ static char *rbuWithoutRowidPK(sqlite3rbu *p, RbuObjIter *pIter){ ** a table b-tree where the table has an external primary key. If the ** iterator passed as the second argument does not currently point to ** a table (not index) with an external primary key, this function is a -** no-op. +** no-op. ** ** Assuming the iterator does point to a table with an external PK, this ** function creates a WITHOUT ROWID imposter table named "rbu_imposter2" @@ -192660,7 +192660,7 @@ static void rbuCreateImposterTable2(sqlite3rbu *p, RbuObjIter *pIter){ /* Figure out the name of the primary key index for the current table. ** This is needed for the argument to "PRAGMA index_xinfo". Set ** zIdx to point to a nul-terminated string containing this name. */ - p->rc = prepareAndCollectError(p->dbMain, &pQuery, &p->zErrmsg, + p->rc = prepareAndCollectError(p->dbMain, &pQuery, &p->zErrmsg, "SELECT name FROM sqlite_master WHERE rootpage = ?" ); if( p->rc==SQLITE_OK ){ @@ -192682,7 +192682,7 @@ static void rbuCreateImposterTable2(sqlite3rbu *p, RbuObjIter *pIter){ int iCid = sqlite3_column_int(pXInfo, 1); int bDesc = sqlite3_column_int(pXInfo, 3); const char *zCollate = (const char*)sqlite3_column_text(pXInfo, 4); - zCols = rbuMPrintf(p, "%z%sc%d %s COLLATE %Q", zCols, zComma, + zCols = rbuMPrintf(p, "%z%sc%d %s COLLATE %Q", zCols, zComma, iCid, pIter->azTblType[iCid], zCollate ); zPk = rbuMPrintf(p, "%z%sc%d%s", zPk, zComma, iCid, bDesc?" DESC":""); @@ -192694,7 +192694,7 @@ static void rbuCreateImposterTable2(sqlite3rbu *p, RbuObjIter *pIter){ sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 1, tnum); rbuMPrintfExec(p, p->dbMain, - "CREATE TABLE rbu_imposter2(%z, PRIMARY KEY(%z)) WITHOUT ROWID", + "CREATE TABLE rbu_imposter2(%z, PRIMARY KEY(%z)) WITHOUT ROWID", zCols, zPk ); sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 0); @@ -192702,7 +192702,7 @@ static void rbuCreateImposterTable2(sqlite3rbu *p, RbuObjIter *pIter){ } /* -** If an error has already occurred when this function is called, it +** If an error has already occurred when this function is called, it ** immediately returns zero (without doing any work). Or, if an error ** occurs during the execution of this function, it sets the error code ** in the sqlite3rbu object indicated by the first argument and returns @@ -192715,9 +192715,9 @@ static void rbuCreateImposterTable2(sqlite3rbu *p, RbuObjIter *pIter){ ** an imposter table are created, or zero otherwise. ** ** An imposter table is required in all cases except RBU_PK_VTAB. Only -** virtual tables are written to directly. The imposter table has the -** same schema as the actual target table (less any UNIQUE constraints). -** More precisely, the "same schema" means the same columns, types, +** virtual tables are written to directly. The imposter table has the +** same schema as the actual target table (less any UNIQUE constraints). +** More precisely, the "same schema" means the same columns, types, ** collation sequences. For tables that do not have an external PRIMARY ** KEY, it also means the same PRIMARY KEY declaration. */ @@ -192743,7 +192743,7 @@ static void rbuCreateImposterTable(sqlite3rbu *p, RbuObjIter *pIter){ ** "PRIMARY KEY" to the imposter table column declaration. */ zPk = "PRIMARY KEY "; } - zSql = rbuMPrintf(p, "%z%s\"%w\" %s %sCOLLATE %Q%s", + zSql = rbuMPrintf(p, "%z%s\"%w\" %s %sCOLLATE %Q%s", zSql, zComma, zCol, pIter->azTblType[iCol], zPk, zColl, (pIter->abNotNull[iCol] ? " NOT NULL" : "") ); @@ -192758,8 +192758,8 @@ static void rbuCreateImposterTable(sqlite3rbu *p, RbuObjIter *pIter){ } sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 1, tnum); - rbuMPrintfExec(p, p->dbMain, "CREATE TABLE \"rbu_imp_%w\"(%z)%s", - pIter->zTbl, zSql, + rbuMPrintfExec(p, p->dbMain, "CREATE TABLE \"rbu_imp_%w\"(%z)%s", + pIter->zTbl, zSql, (pIter->eType==RBU_PK_WITHOUT_ROWID ? " WITHOUT ROWID" : "") ); sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 0); @@ -192773,12 +192773,12 @@ static void rbuCreateImposterTable(sqlite3rbu *p, RbuObjIter *pIter){ ** INSERT INTO rbu_tmp_xxx VALUES(?, ?, ? ...); ** ** The number of bound variables is equal to the number of columns in -** the target table, plus one (for the rbu_control column), plus one more -** (for the rbu_rowid column) if the target table is an implicit IPK or +** the target table, plus one (for the rbu_control column), plus one more +** (for the rbu_rowid column) if the target table is an implicit IPK or ** virtual table. */ static void rbuObjIterPrepareTmpInsert( - sqlite3rbu *p, + sqlite3rbu *p, RbuObjIter *pIter, const char *zCollist, const char *zRbuRowid @@ -192789,14 +192789,14 @@ static void rbuObjIterPrepareTmpInsert( assert( pIter->pTmpInsert==0 ); p->rc = prepareFreeAndCollectError( p->dbRbu, &pIter->pTmpInsert, &p->zErrmsg, sqlite3_mprintf( - "INSERT INTO %s.'rbu_tmp_%q'(rbu_control,%s%s) VALUES(%z)", + "INSERT INTO %s.'rbu_tmp_%q'(rbu_control,%s%s) VALUES(%z)", p->zStateDb, pIter->zDataTbl, zCollist, zRbuRowid, zBind )); } } static void rbuTmpInsertFunc( - sqlite3_context *pCtx, + sqlite3_context *pCtx, int nVal, sqlite3_value **apVal ){ @@ -192805,8 +192805,8 @@ static void rbuTmpInsertFunc( int i; assert( sqlite3_value_int(apVal[0])!=0 - || p->objiter.eType==RBU_PK_EXTERNAL - || p->objiter.eType==RBU_PK_NONE + || p->objiter.eType==RBU_PK_EXTERNAL + || p->objiter.eType==RBU_PK_NONE ); if( sqlite3_value_int(apVal[0])!=0 ){ p->nPhaseOneStep += p->objiter.nIndex; @@ -192921,12 +192921,12 @@ static char *rbuObjIterGetIndexWhere(sqlite3rbu *p, RbuObjIter *pIter){ } /* -** Ensure that the SQLite statement handles required to update the -** target database object currently indicated by the iterator passed +** Ensure that the SQLite statement handles required to update the +** target database object currently indicated by the iterator passed ** as the second argument are available. */ static int rbuObjIterPrepareAll( - sqlite3rbu *p, + sqlite3rbu *p, RbuObjIter *pIter, int nOffset /* Add "LIMIT -1 OFFSET $nOffset" to SELECT */ ){ @@ -193000,9 +193000,9 @@ static int rbuObjIterPrepareAll( zSql = sqlite3_mprintf( "SELECT %s, 0 AS rbu_control FROM '%q' %s %s %s ORDER BY %s%s", - zCollist, + zCollist, pIter->zDataTbl, - zPart, + zPart, (zStart ? (zPart ? "AND" : "WHERE") : ""), zStart, zCollist, zLimit ); @@ -193023,7 +193023,7 @@ static int rbuObjIterPrepareAll( "%s %s typeof(rbu_control)='integer' AND rbu_control!=1 " "ORDER BY %s%s", zCollist, p->zStateDb, pIter->zDataTbl, zPart, - zCollist, pIter->zDataTbl, + zCollist, pIter->zDataTbl, zPart, (zPart ? "AND" : "WHERE"), zCollist, zLimit @@ -193065,7 +193065,7 @@ static int rbuObjIterPrepareAll( if( p->rc==SQLITE_OK ){ p->rc = prepareFreeAndCollectError(p->dbMain, &pIter->pInsert, pz, sqlite3_mprintf( - "INSERT INTO \"%s%w\"(%s%s) VALUES(%s)", + "INSERT INTO \"%s%w\"(%s%s) VALUES(%s)", zWrite, zTbl, zCollist, (bRbuRowid ? ", _rowid_" : ""), zBindings ) ); @@ -193158,10 +193158,10 @@ static int rbuObjIterPrepareAll( p->rc = prepareFreeAndCollectError(p->dbRbu, &pIter->pSelect, pz, sqlite3_mprintf( "SELECT %s,%s rbu_control%s FROM '%q'%s %s %s %s", - zCollist, + zCollist, (rbuIsVacuum(p) ? "0 AS " : ""), zRbuRowid, - pIter->zDataTbl, (zStart ? zStart : ""), + pIter->zDataTbl, (zStart ? zStart : ""), (zOrder ? "ORDER BY" : ""), zOrder, zLimit ) @@ -193179,16 +193179,16 @@ static int rbuObjIterPrepareAll( sqlite3_free(zCollist); sqlite3_free(zLimit); } - + return p->rc; } /* ** Set output variable *ppStmt to point to an UPDATE statement that may ** be used to update the imposter table for the main table b-tree of the -** table object that pIter currently points to, assuming that the +** table object that pIter currently points to, assuming that the ** rbu_control column of the data_xyz table contains zMask. -** +** ** If the zMask string does not specify any columns to update, then this ** is not an error. Output variable *ppStmt is set to NULL in this case. */ @@ -193215,7 +193215,7 @@ static int rbuGetUpdateStmt( *pp = pUp->pNext; pUp->pNext = pIter->pRbuUpdate; pIter->pRbuUpdate = pUp; - *ppStmt = pUp->pUpdate; + *ppStmt = pUp->pUpdate; return SQLITE_OK; } nUp++; @@ -193245,7 +193245,7 @@ static int rbuGetUpdateStmt( const char *zPrefix = ""; if( pIter->eType!=RBU_PK_VTAB ) zPrefix = "rbu_imp_"; - zUpdate = sqlite3_mprintf("UPDATE \"%s%w\" SET %s WHERE %s", + zUpdate = sqlite3_mprintf("UPDATE \"%s%w\" SET %s WHERE %s", zPrefix, pIter->zTbl, zSet, zWhere ); p->rc = prepareFreeAndCollectError( @@ -193261,8 +193261,8 @@ static int rbuGetUpdateStmt( } static sqlite3 *rbuOpenDbhandle( - sqlite3rbu *p, - const char *zName, + sqlite3rbu *p, + const char *zName, int bUseVfs ){ sqlite3 *db = 0; @@ -193291,8 +193291,8 @@ static void rbuFreeState(RbuState *p){ } /* -** Allocate an RbuState object and load the contents of the rbu_state -** table into it. Return a pointer to the new object. It is the +** Allocate an RbuState object and load the contents of the rbu_state +** table into it. Return a pointer to the new object. It is the ** responsibility of the caller to eventually free the object using ** sqlite3_free(). ** @@ -193308,7 +193308,7 @@ static RbuState *rbuLoadState(sqlite3rbu *p){ pRet = (RbuState*)rbuMalloc(p, sizeof(RbuState)); if( pRet==0 ) return 0; - rc = prepareFreeAndCollectError(p->dbRbu, &pStmt, &p->zErrmsg, + rc = prepareFreeAndCollectError(p->dbRbu, &pStmt, &p->zErrmsg, sqlite3_mprintf("SELECT k, v FROM %s.rbu_state", p->zStateDb) ); while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ @@ -193418,7 +193418,7 @@ static void rbuOpenDatabase(sqlite3rbu *p, int *pbRetry){ p->rc = prepareAndCollectError(p->dbRbu, &pCnt, &p->zErrmsg, "SELECT count(*) FROM stat.sqlite_master" ); - if( p->rc==SQLITE_OK + if( p->rc==SQLITE_OK && sqlite3_step(pCnt)==SQLITE_ROW && 1==sqlite3_column_int(pCnt, 0) ){ @@ -193431,7 +193431,7 @@ static void rbuOpenDatabase(sqlite3rbu *p, int *pbRetry){ p->rc = SQLITE_ERROR; p->zErrmsg = sqlite3_mprintf("invalid state database"); } - + if( p->rc==SQLITE_OK ){ p->rc = sqlite3_exec(p->dbRbu, "COMMIT", 0, 0, 0); } @@ -193485,7 +193485,7 @@ static void rbuOpenDatabase(sqlite3rbu *p, int *pbRetry){ if( *zExtra=='\0' ) zExtra = 0; } - zTarget = sqlite3_mprintf("file:%s-vactmp?rbu_memory=1%s%s", + zTarget = sqlite3_mprintf("file:%s-vactmp?rbu_memory=1%s%s", sqlite3_db_filename(p->dbRbu, "main"), (zExtra==0 ? "" : "&"), (zExtra==0 ? "" : zExtra) ); @@ -193500,19 +193500,19 @@ static void rbuOpenDatabase(sqlite3rbu *p, int *pbRetry){ } if( p->rc==SQLITE_OK ){ - p->rc = sqlite3_create_function(p->dbMain, + p->rc = sqlite3_create_function(p->dbMain, "rbu_tmp_insert", -1, SQLITE_UTF8, (void*)p, rbuTmpInsertFunc, 0, 0 ); } if( p->rc==SQLITE_OK ){ - p->rc = sqlite3_create_function(p->dbMain, + p->rc = sqlite3_create_function(p->dbMain, "rbu_fossil_delta", 2, SQLITE_UTF8, 0, rbuFossilDeltaFunc, 0, 0 ); } if( p->rc==SQLITE_OK ){ - p->rc = sqlite3_create_function(p->dbRbu, + p->rc = sqlite3_create_function(p->dbRbu, "rbu_target_name", -1, SQLITE_UTF8, (void*)p, rbuTargetNameFunc, 0, 0 ); } @@ -193522,7 +193522,7 @@ static void rbuOpenDatabase(sqlite3rbu *p, int *pbRetry){ } rbuMPrintfExec(p, p->dbMain, "SELECT * FROM sqlite_master"); - /* Mark the database file just opened as an RBU target database. If + /* Mark the database file just opened as an RBU target database. If ** this call returns SQLITE_NOTFOUND, then the RBU vfs is not in use. ** This is an error. */ if( p->rc==SQLITE_OK ){ @@ -193570,10 +193570,10 @@ static void rbuFileSuffix3(const char *zBase, char *z){ } /* -** Return the current wal-index header checksum for the target database +** Return the current wal-index header checksum for the target database ** as a 64-bit integer. ** -** The checksum is store in the first page of xShmMap memory as an 8-byte +** The checksum is store in the first page of xShmMap memory as an 8-byte ** blob starting at byte offset 40. */ static i64 rbuShmChecksum(sqlite3rbu *p){ @@ -193591,11 +193591,11 @@ static i64 rbuShmChecksum(sqlite3rbu *p){ /* ** This function is called as part of initializing or reinitializing an -** incremental checkpoint. +** incremental checkpoint. ** -** It populates the sqlite3rbu.aFrame[] array with the set of -** (wal frame -> db page) copy operations required to checkpoint the -** current wal file, and obtains the set of shm locks required to safely +** It populates the sqlite3rbu.aFrame[] array with the set of +** (wal frame -> db page) copy operations required to checkpoint the +** current wal file, and obtains the set of shm locks required to safely ** perform the copy operations directly on the file-system. ** ** If argument pState is not NULL, then the incremental checkpoint is @@ -193630,19 +193630,19 @@ static void rbuSetupCheckpoint(sqlite3rbu *p, RbuState *pState){ ** would be read/written are recorded in the sqlite3rbu.aFrame[] ** array. ** - ** * Calls to xShmLock(UNLOCK) to release the exclusive shm WRITER, + ** * Calls to xShmLock(UNLOCK) to release the exclusive shm WRITER, ** READ0 and CHECKPOINT locks taken as part of the checkpoint are ** no-ops. These locks will not be released until the connection ** is closed. ** - ** * Attempting to xSync() the database file causes an SQLITE_INTERNAL + ** * Attempting to xSync() the database file causes an SQLITE_INTERNAL ** error. ** ** As a result, unless an error (i.e. OOM or SQLITE_BUSY) occurs, the ** checkpoint below fails with SQLITE_INTERNAL, and leaves the aFrame[] - ** array populated with a set of (frame -> page) mappings. Because the - ** WRITER, CHECKPOINT and READ0 locks are still held, it is safe to copy - ** data from the wal file into the database file according to the + ** array populated with a set of (frame -> page) mappings. Because the + ** WRITER, CHECKPOINT and READ0 locks are still held, it is safe to copy + ** data from the wal file into the database file according to the ** contents of aFrame[]. */ if( p->rc==SQLITE_OK ){ @@ -193675,9 +193675,9 @@ static void rbuSetupCheckpoint(sqlite3rbu *p, RbuState *pState){ p->nPagePerSector = 1; } - /* Call xSync() on the wal file. This causes SQLite to sync the - ** directory in which the target database and the wal file reside, in - ** case it has not been synced since the rename() call in + /* Call xSync() on the wal file. This causes SQLite to sync the + ** directory in which the target database and the wal file reside, in + ** case it has not been synced since the rename() call in ** rbuMoveOalFile(). */ p->rc = pWal->pMethods->xSync(pWal, SQLITE_SYNC_NORMAL); } @@ -193718,7 +193718,7 @@ static int rbuCaptureWalRead(sqlite3rbu *pRbu, i64 iOff, int iAmt){ /* ** Called when a page of data is written to offset iOff of the database -** file while the rbu handle is in capture mode. Record the page number +** file while the rbu handle is in capture mode. Record the page number ** of the page being written in the aFrame[] array. */ static int rbuCaptureDbWrite(sqlite3rbu *pRbu, i64 iOff){ @@ -193786,7 +193786,7 @@ static LPWSTR rbuWinUtf8ToUnicode(const char *zFilename){ ** The RBU handle is currently in RBU_STAGE_OAL state, with a SHARED lock ** on the database file. This proc moves the *-oal file to the *-wal path, ** then reopens the database file (this time in vanilla, non-oal, WAL mode). -** If an error occurs, leave an error code and error message in the rbu +** If an error occurs, leave an error code and error message in the rbu ** handle. */ static void rbuMoveOalFile(sqlite3rbu *p){ @@ -193808,7 +193808,7 @@ static void rbuMoveOalFile(sqlite3rbu *p){ }else{ /* Move the *-oal file to *-wal. At this point connection p->db is ** holding a SHARED lock on the target database file (because it is - ** in WAL mode). So no other connection may be writing the db. + ** in WAL mode). So no other connection may be writing the db. ** ** In order to ensure that there are no database readers, an EXCLUSIVE ** lock is obtained here before the *-oal is moved to *-wal. @@ -193966,8 +193966,8 @@ static void rbuStepOneOp(sqlite3rbu *p, int eType){ /* If this is an INSERT into a table b-tree and the table has an ** explicit INTEGER PRIMARY KEY, check that this is not an attempt ** to write a NULL into the IPK column. That is not permitted. */ - if( eType==RBU_INSERT - && pIter->zIdx==0 && pIter->eType==RBU_PK_IPK && pIter->abTblPk[i] + if( eType==RBU_INSERT + && pIter->zIdx==0 && pIter->eType==RBU_PK_IPK && pIter->abTblPk[i] && sqlite3_column_type(pIter->pSelect, i)==SQLITE_NULL ){ p->rc = SQLITE_MISMATCH; @@ -193984,18 +193984,18 @@ static void rbuStepOneOp(sqlite3rbu *p, int eType){ if( p->rc ) return; } if( pIter->zIdx==0 ){ - if( pIter->eType==RBU_PK_VTAB - || pIter->eType==RBU_PK_NONE - || (pIter->eType==RBU_PK_EXTERNAL && rbuIsVacuum(p)) + if( pIter->eType==RBU_PK_VTAB + || pIter->eType==RBU_PK_NONE + || (pIter->eType==RBU_PK_EXTERNAL && rbuIsVacuum(p)) ){ - /* For a virtual table, or a table with no primary key, the + /* For a virtual table, or a table with no primary key, the ** SELECT statement is: ** ** SELECT , rbu_control, rbu_rowid FROM .... ** ** Hence column_value(pIter->nCol+1). */ - assertColumnName(pIter->pSelect, pIter->nCol+1, + assertColumnName(pIter->pSelect, pIter->nCol+1, rbuIsVacuum(p) ? "rowid" : "rbu_rowid" ); pVal = sqlite3_column_value(pIter->pSelect, pIter->nCol+1); @@ -194059,8 +194059,8 @@ static int rbuStep(sqlite3rbu *p){ p->rc = sqlite3_bind_value(pUpdate, i+1, pVal); } } - if( p->rc==SQLITE_OK - && (pIter->eType==RBU_PK_VTAB || pIter->eType==RBU_PK_NONE) + if( p->rc==SQLITE_OK + && (pIter->eType==RBU_PK_VTAB || pIter->eType==RBU_PK_NONE) ){ /* Bind the rbu_rowid value to column _rowid_ */ assertColumnName(pIter->pSelect, pIter->nCol+1, "rbu_rowid"); @@ -194090,7 +194090,7 @@ static void rbuIncrSchemaCookie(sqlite3rbu *p){ int iCookie = 1000000; sqlite3_stmt *pStmt; - p->rc = prepareAndCollectError(dbread, &pStmt, &p->zErrmsg, + p->rc = prepareAndCollectError(dbread, &pStmt, &p->zErrmsg, "PRAGMA schema_version" ); if( p->rc==SQLITE_OK ){ @@ -194122,7 +194122,7 @@ static void rbuSaveState(sqlite3rbu *p, int eStage){ int rc; assert( p->zErrmsg==0 ); - rc = prepareFreeAndCollectError(p->dbRbu, &pInsert, &p->zErrmsg, + rc = prepareFreeAndCollectError(p->dbRbu, &pInsert, &p->zErrmsg, sqlite3_mprintf( "INSERT OR REPLACE INTO %s.rbu_state(k, v) VALUES " "(%d, %d), " @@ -194137,9 +194137,9 @@ static void rbuSaveState(sqlite3rbu *p, int eStage){ "(%d, %Q) ", p->zStateDb, RBU_STATE_STAGE, eStage, - RBU_STATE_TBL, p->objiter.zTbl, - RBU_STATE_IDX, p->objiter.zIdx, - RBU_STATE_ROW, p->nStep, + RBU_STATE_TBL, p->objiter.zTbl, + RBU_STATE_IDX, p->objiter.zIdx, + RBU_STATE_ROW, p->nStep, RBU_STATE_PROGRESS, p->nProgress, RBU_STATE_CKPT, p->iWalCksum, RBU_STATE_COOKIE, (i64)pFd->iCookie, @@ -194160,7 +194160,7 @@ static void rbuSaveState(sqlite3rbu *p, int eStage){ /* -** The second argument passed to this function is the name of a PRAGMA +** The second argument passed to this function is the name of a PRAGMA ** setting - "page_size", "auto_vacuum", "user_version" or "application_id". ** This function executes the following on sqlite3rbu.dbRbu: ** @@ -194179,7 +194179,7 @@ static void rbuSaveState(sqlite3rbu *p, int eStage){ static void rbuCopyPragma(sqlite3rbu *p, const char *zPragma){ if( p->rc==SQLITE_OK ){ sqlite3_stmt *pPragma = 0; - p->rc = prepareFreeAndCollectError(p->dbRbu, &pPragma, &p->zErrmsg, + p->rc = prepareFreeAndCollectError(p->dbRbu, &pPragma, &p->zErrmsg, sqlite3_mprintf("PRAGMA main.%s", zPragma) ); if( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPragma) ){ @@ -194192,7 +194192,7 @@ static void rbuCopyPragma(sqlite3rbu *p, const char *zPragma){ } /* -** The RBU handle passed as the only argument has just been opened and +** The RBU handle passed as the only argument has just been opened and ** the state database is empty. If this RBU handle was opened for an ** RBU vacuum operation, create the schema in the target db. */ @@ -194203,7 +194203,7 @@ static void rbuCreateTargetSchema(sqlite3rbu *p){ assert( rbuIsVacuum(p) ); p->rc = sqlite3_exec(p->dbMain, "PRAGMA writable_schema=1", 0,0, &p->zErrmsg); if( p->rc==SQLITE_OK ){ - p->rc = prepareAndCollectError(p->dbRbu, &pSql, &p->zErrmsg, + p->rc = prepareAndCollectError(p->dbRbu, &pSql, &p->zErrmsg, "SELECT sql FROM sqlite_master WHERE sql!='' AND rootpage!=0" " AND name!='sqlite_sequence' " " ORDER BY type DESC" @@ -194218,13 +194218,13 @@ static void rbuCreateTargetSchema(sqlite3rbu *p){ if( p->rc!=SQLITE_OK ) return; if( p->rc==SQLITE_OK ){ - p->rc = prepareAndCollectError(p->dbRbu, &pSql, &p->zErrmsg, - "SELECT * FROM sqlite_master WHERE rootpage=0 OR rootpage IS NULL" + p->rc = prepareAndCollectError(p->dbRbu, &pSql, &p->zErrmsg, + "SELECT * FROM sqlite_master WHERE rootpage=0 OR rootpage IS NULL" ); } if( p->rc==SQLITE_OK ){ - p->rc = prepareAndCollectError(p->dbMain, &pInsert, &p->zErrmsg, + p->rc = prepareAndCollectError(p->dbMain, &pInsert, &p->zErrmsg, "INSERT INTO sqlite_master VALUES(?,?,?,?,?)" ); } @@ -194265,11 +194265,11 @@ SQLITE_API int sqlite3rbu_step(sqlite3rbu *p){ while( p->rc==SQLITE_OK && pIter->zTbl ){ if( pIter->bCleanup ){ - /* Clean up the rbu_tmp_xxx table for the previous table. It + /* Clean up the rbu_tmp_xxx table for the previous table. It ** cannot be dropped as there are currently active SQL statements. ** But the contents can be deleted. */ if( rbuIsVacuum(p)==0 && pIter->abIndexed ){ - rbuMPrintfExec(p, p->dbRbu, + rbuMPrintfExec(p, p->dbRbu, "DELETE FROM %s.'rbu_tmp_%q'", p->zStateDb, pIter->zDataTbl ); } @@ -194319,10 +194319,10 @@ SQLITE_API int sqlite3rbu_step(sqlite3rbu *p){ if( p->rc==SQLITE_OK ){ if( p->nStep>=p->nFrame ){ sqlite3_file *pDb = p->pTargetFd->pReal; - + /* Sync the db file */ p->rc = pDb->pMethods->xSync(pDb, SQLITE_SYNC_NORMAL); - + /* Update nBackfill */ if( p->rc==SQLITE_OK ){ void volatile *ptr; @@ -194331,7 +194331,7 @@ SQLITE_API int sqlite3rbu_step(sqlite3rbu *p){ ((u32 volatile*)ptr)[24] = p->iMaxFrame; } } - + if( p->rc==SQLITE_OK ){ p->eStage = RBU_STAGE_DONE; p->rc = SQLITE_DONE; @@ -194339,7 +194339,7 @@ SQLITE_API int sqlite3rbu_step(sqlite3rbu *p){ }else{ /* At one point the following block copied a single frame from the ** wal file to the database file. So that one call to sqlite3rbu_step() - ** checkpointed a single frame. + ** checkpointed a single frame. ** ** However, if the sector-size is larger than the page-size, and the ** application calls sqlite3rbu_savestate() or close() immediately @@ -194353,7 +194353,7 @@ SQLITE_API int sqlite3rbu_step(sqlite3rbu *p){ iSector = (pFrame->iDbPage-1) / p->nPagePerSector; rbuCheckpointFrame(p, pFrame); p->nStep++; - }while( p->nStepnFrame + }while( p->nStepnFrame && iSector==((p->aFrame[p->nStep].iDbPage-1) / p->nPagePerSector) && p->rc==SQLITE_OK ); @@ -194399,7 +194399,7 @@ static void rbuSetupOal(sqlite3rbu *p, RbuState *pState){ RbuObjIter *pIter = &p->objiter; int rc = SQLITE_OK; - while( rc==SQLITE_OK && pIter->zTbl && (pIter->bCleanup + while( rc==SQLITE_OK && pIter->zTbl && (pIter->bCleanup || rbuStrCompare(pIter->zIdx, pState->zIdx) || (pState->zDataTbl==0 && rbuStrCompare(pIter->zTbl, pState->zTbl)) || (pState->zDataTbl && rbuStrCompare(pIter->zDataTbl, pState->zDataTbl)) @@ -194475,7 +194475,7 @@ static void rbuDeleteVfs(sqlite3rbu *p){ ** the number of auxilliary indexes on the table. */ static void rbuIndexCntFunc( - sqlite3_context *pCtx, + sqlite3_context *pCtx, int nVal, sqlite3_value **apVal ){ @@ -194486,8 +194486,8 @@ static void rbuIndexCntFunc( sqlite3 *db = (rbuIsVacuum(p) ? p->dbRbu : p->dbMain); assert( nVal==1 ); - - rc = prepareFreeAndCollectError(db, &pStmt, &zErrmsg, + + rc = prepareFreeAndCollectError(db, &pStmt, &zErrmsg, sqlite3_mprintf("SELECT count(*) FROM sqlite_master " "WHERE type='index' AND tbl_name = %Q", sqlite3_value_text(apVal[0])) ); @@ -194521,7 +194521,7 @@ static void rbuIndexCntFunc( ** and the cnt column the number of rows it contains. ** ** sqlite3rbu.nPhaseOneStep is initialized to the sum of (1 + nIndex) * cnt -** for all rows in the rbu_count table, where nIndex is the number of +** for all rows in the rbu_count table, where nIndex is the number of ** indexes on the corresponding target database table. */ static void rbuInitPhaseOneSteps(sqlite3rbu *p){ @@ -194531,10 +194531,10 @@ static void rbuInitPhaseOneSteps(sqlite3rbu *p){ p->nPhaseOneStep = -1; - p->rc = sqlite3_create_function(p->dbRbu, + p->rc = sqlite3_create_function(p->dbRbu, "rbu_index_cnt", 1, SQLITE_UTF8, (void*)p, rbuIndexCntFunc, 0, 0 ); - + /* Check for the rbu_count table. If it does not exist, or if an error ** occurs, nPhaseOneStep will be left set to -1. */ if( p->rc==SQLITE_OK ){ @@ -194548,7 +194548,7 @@ static void rbuInitPhaseOneSteps(sqlite3rbu *p){ } p->rc = sqlite3_finalize(pStmt); } - + if( p->rc==SQLITE_OK && bExists ){ p->rc = prepareAndCollectError(p->dbRbu, &pStmt, &p->zErrmsg, "SELECT sum(cnt * (1 + rbu_index_cnt(rbu_target_name(tbl))))" @@ -194566,7 +194566,7 @@ static void rbuInitPhaseOneSteps(sqlite3rbu *p){ static sqlite3rbu *openRbuHandle( - const char *zTarget, + const char *zTarget, const char *zRbu, const char *zState ){ @@ -194604,7 +194604,7 @@ static sqlite3rbu *openRbuHandle( ** to be a wal-mode db. But, this may have happened due to an earlier ** RBU vacuum operation leaving an old wal file in the directory. ** If this is the case, it will have been checkpointed and deleted - ** when the handle was closed and a second attempt to open the + ** when the handle was closed and a second attempt to open the ** database may succeed. */ rbuOpenDatabase(p, &bRetry); if( bRetry ){ @@ -194617,7 +194617,7 @@ static sqlite3rbu *openRbuHandle( assert( pState || p->rc!=SQLITE_OK ); if( p->rc==SQLITE_OK ){ - if( pState->eStage==0 ){ + if( pState->eStage==0 ){ rbuDeleteOalFile(p); rbuInitPhaseOneSteps(p); p->eStage = RBU_STAGE_OAL; @@ -194641,15 +194641,15 @@ static sqlite3rbu *openRbuHandle( } } - if( p->rc==SQLITE_OK + if( p->rc==SQLITE_OK && (p->eStage==RBU_STAGE_OAL || p->eStage==RBU_STAGE_MOVE) && pState->eStage!=0 ){ rbu_file *pFd = (rbuIsVacuum(p) ? p->pRbuFd : p->pTargetFd); - if( pFd->iCookie!=pState->iCookie ){ + if( pFd->iCookie!=pState->iCookie ){ /* At this point (pTargetFd->iCookie) contains the value of the - ** change-counter cookie (the thing that gets incremented when a - ** transaction is committed in rollback mode) currently stored on + ** change-counter cookie (the thing that gets incremented when a + ** transaction is committed in rollback mode) currently stored on ** page 1 of the database file. */ p->rc = SQLITE_BUSY; p->zErrmsg = sqlite3_mprintf("database modified during rbu %s", @@ -194686,7 +194686,7 @@ static sqlite3rbu *openRbuHandle( } /* Check if the main database is a zipvfs db. If it is, set the upper - ** level pager to use "journal_mode=off". This prevents it from + ** level pager to use "journal_mode=off". This prevents it from ** generating a large journal using a temp file. */ if( p->rc==SQLITE_OK ){ int frc = sqlite3_file_control(db, "main", SQLITE_FCNTL_ZIPVFS, 0); @@ -194732,10 +194732,10 @@ static sqlite3rbu *rbuMisuseError(void){ } /* -** Open and return a new RBU handle. +** Open and return a new RBU handle. */ SQLITE_API sqlite3rbu *sqlite3rbu_open( - const char *zTarget, + const char *zTarget, const char *zRbu, const char *zState ){ @@ -194748,7 +194748,7 @@ SQLITE_API sqlite3rbu *sqlite3rbu_open( ** Open a handle to begin or resume an RBU VACUUM operation. */ SQLITE_API sqlite3rbu *sqlite3rbu_vacuum( - const char *zTarget, + const char *zTarget, const char *zState ){ if( zTarget==0 ){ return rbuMisuseError(); } @@ -194822,8 +194822,8 @@ SQLITE_API int sqlite3rbu_close(sqlite3rbu *p, char **pzErrmsg){ rbuObjIterFinalize(&p->objiter); /* If this is an RBU vacuum handle and the vacuum has either finished - ** successfully or encountered an error, delete the contents of the - ** state table. This causes the next call to sqlite3rbu_vacuum() + ** successfully or encountered an error, delete the contents of the + ** state table. This causes the next call to sqlite3rbu_vacuum() ** specifying the current target and state databases to start a new ** vacuum from scratch. */ if( rbuIsVacuum(p) && p->rc!=SQLITE_OK && p->dbRbu ){ @@ -194856,7 +194856,7 @@ SQLITE_API int sqlite3rbu_close(sqlite3rbu *p, char **pzErrmsg){ } /* -** Return the total number of key-value operations (inserts, deletes or +** Return the total number of key-value operations (inserts, deletes or ** updates) that have been performed on the target database since the ** current RBU update was started. */ @@ -194954,7 +194954,7 @@ SQLITE_API int sqlite3rbu_savestate(sqlite3rbu *p){ if( p->eStage==RBU_STAGE_OAL ){ assert( rc!=SQLITE_DONE ); if( rc==SQLITE_OK ) rc = sqlite3_exec(p->dbRbu, "COMMIT", 0, 0, 0); - if( rc==SQLITE_OK ){ + if( rc==SQLITE_OK ){ const char *zBegin = rbuIsVacuum(p) ? "BEGIN" : "BEGIN IMMEDIATE"; rc = sqlite3_exec(p->dbRbu, zBegin, 0, 0, 0); } @@ -194969,7 +194969,7 @@ SQLITE_API int sqlite3rbu_savestate(sqlite3rbu *p){ ** Beginning of RBU VFS shim methods. The VFS shim modifies the behaviour ** of a standard VFS in the following ways: ** -** 1. Whenever the first page of a main database file is read or +** 1. Whenever the first page of a main database file is read or ** written, the value of the change-counter cookie is stored in ** rbu_file.iCookie. Similarly, the value of the "write-version" ** database header field is stored in rbu_file.iWriteVer. This ensures @@ -194977,15 +194977,15 @@ SQLITE_API int sqlite3rbu_savestate(sqlite3rbu *p){ ** ** 2. Whenever an SQLITE_OPEN_WAL file is opened, the (rbu_file.pWalFd) ** member variable of the associated database file descriptor is set -** to point to the new file. A mutex protected linked list of all main -** db fds opened using a particular RBU VFS is maintained at +** to point to the new file. A mutex protected linked list of all main +** db fds opened using a particular RBU VFS is maintained at ** rbu_vfs.pMain to facilitate this. ** -** 3. Using a new file-control "SQLITE_FCNTL_RBU", a main db rbu_file +** 3. Using a new file-control "SQLITE_FCNTL_RBU", a main db rbu_file ** object can be marked as the target database of an RBU update. This ** turns on the following extra special behaviour: ** -** 3a. If xAccess() is called to check if there exists a *-wal file +** 3a. If xAccess() is called to check if there exists a *-wal file ** associated with an RBU target database currently in RBU_STAGE_OAL ** stage (preparing the *-oal file), the following special handling ** applies: @@ -194998,26 +194998,26 @@ SQLITE_API int sqlite3rbu_savestate(sqlite3rbu *p){ ** ** Then, when xOpen() is called to open the *-wal file associated with ** the RBU target in RBU_STAGE_OAL stage, instead of opening the *-wal -** file, the rbu vfs opens the corresponding *-oal file instead. +** file, the rbu vfs opens the corresponding *-oal file instead. ** ** 3b. The *-shm pages returned by xShmMap() for a target db file in ** RBU_STAGE_OAL mode are actually stored in heap memory. This is to ** avoid creating a *-shm file on disk. Additionally, xShmLock() calls ** are no-ops on target database files in RBU_STAGE_OAL mode. This is -** because assert() statements in some VFS implementations fail if +** because assert() statements in some VFS implementations fail if ** xShmLock() is called before xShmMap(). ** ** 3c. If an EXCLUSIVE lock is attempted on a target database file in any -** mode except RBU_STAGE_DONE (all work completed and checkpointed), it +** mode except RBU_STAGE_DONE (all work completed and checkpointed), it ** fails with an SQLITE_BUSY error. This is to stop RBU connections ** from automatically checkpointing a *-wal (or *-oal) file from within ** sqlite3_close(). ** ** 3d. In RBU_STAGE_CAPTURE mode, all xRead() calls on the wal file, and -** all xWrite() calls on the target database file perform no IO. +** all xWrite() calls on the target database file perform no IO. ** Instead the frame and page numbers that would be read and written ** are recorded. Additionally, successful attempts to obtain exclusive -** xShmLock() WRITER, CHECKPOINTER and READ0 locks on the target +** xShmLock() WRITER, CHECKPOINTER and READ0 locks on the target ** database file are recorded. xShmLock() calls to unlock the same ** locks are no-ops (so that once obtained, these locks are never ** relinquished). Finally, calls to xSync() on the target database @@ -195093,7 +195093,7 @@ static void rbuMainlistRemove(rbu_file *p){ } /* -** Given that zWal points to a buffer containing a wal file name passed to +** Given that zWal points to a buffer containing a wal file name passed to ** either the xOpen() or xAccess() VFS method, search the main-db list for ** a file-handle opened by the same database connection on the corresponding ** database file. @@ -195146,7 +195146,7 @@ static int rbuVfsClose(sqlite3_file *pFile){ /* -** Read and return an unsigned 32-bit big-endian integer from the buffer +** Read and return an unsigned 32-bit big-endian integer from the buffer ** passed as the only argument. */ static u32 rbuGetU32(u8 *aBuf){ @@ -195176,9 +195176,9 @@ static void rbuPutU16(u8 *aBuf, u16 iVal){ ** Read data from an rbuVfs-file. */ static int rbuVfsRead( - sqlite3_file *pFile, - void *zBuf, - int iAmt, + sqlite3_file *pFile, + void *zBuf, + int iAmt, sqlite_int64 iOfst ){ rbu_file *p = (rbu_file*)pFile; @@ -195189,20 +195189,20 @@ static int rbuVfsRead( assert( p->openFlags & SQLITE_OPEN_WAL ); rc = rbuCaptureWalRead(p->pRbu, iOfst, iAmt); }else{ - if( pRbu && pRbu->eStage==RBU_STAGE_OAL - && (p->openFlags & SQLITE_OPEN_WAL) - && iOfst>=pRbu->iOalSz + if( pRbu && pRbu->eStage==RBU_STAGE_OAL + && (p->openFlags & SQLITE_OPEN_WAL) + && iOfst>=pRbu->iOalSz ){ rc = SQLITE_OK; memset(zBuf, 0, iAmt); }else{ rc = p->pReal->pMethods->xRead(p->pReal, zBuf, iAmt, iOfst); #if 1 - /* If this is being called to read the first page of the target - ** database as part of an rbu vacuum operation, synthesize the + /* If this is being called to read the first page of the target + ** database as part of an rbu vacuum operation, synthesize the ** contents of the first page if it does not yet exist. Otherwise, ** SQLite will not check for a *-wal file. */ - if( pRbu && rbuIsVacuum(pRbu) + if( pRbu && rbuIsVacuum(pRbu) && rc==SQLITE_IOERR_SHORT_READ && iOfst==0 && (p->openFlags & SQLITE_OPEN_MAIN_DB) && pRbu->rc==SQLITE_OK @@ -195242,9 +195242,9 @@ static int rbuVfsRead( ** Write data to an rbuVfs-file. */ static int rbuVfsWrite( - sqlite3_file *pFile, - const void *zBuf, - int iAmt, + sqlite3_file *pFile, + const void *zBuf, + int iAmt, sqlite_int64 iOfst ){ rbu_file *p = (rbu_file*)pFile; @@ -195256,8 +195256,8 @@ static int rbuVfsWrite( rc = rbuCaptureDbWrite(p->pRbu, iOfst); }else{ if( pRbu ){ - if( pRbu->eStage==RBU_STAGE_OAL - && (p->openFlags & SQLITE_OPEN_WAL) + if( pRbu->eStage==RBU_STAGE_OAL + && (p->openFlags & SQLITE_OPEN_WAL) && iOfst>=pRbu->iOalSz ){ pRbu->iOalSz = iAmt + iOfst; @@ -195317,10 +195317,10 @@ static int rbuVfsFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){ /* If this is an RBU vacuum operation and this is the target database, ** pretend that it has at least one page. Otherwise, SQLite will not - ** check for the existance of a *-wal file. rbuVfsRead() contains + ** check for the existance of a *-wal file. rbuVfsRead() contains ** similar logic. */ - if( rc==SQLITE_OK && *pSize==0 - && p->pRbu && rbuIsVacuum(p->pRbu) + if( rc==SQLITE_OK && *pSize==0 + && p->pRbu && rbuIsVacuum(p->pRbu) && (p->openFlags & SQLITE_OPEN_MAIN_DB) ){ *pSize = 1024; @@ -195337,10 +195337,10 @@ static int rbuVfsLock(sqlite3_file *pFile, int eLock){ int rc = SQLITE_OK; assert( p->openFlags & (SQLITE_OPEN_MAIN_DB|SQLITE_OPEN_TEMP_DB) ); - if( eLock==SQLITE_LOCK_EXCLUSIVE + if( eLock==SQLITE_LOCK_EXCLUSIVE && (p->bNolock || (pRbu && pRbu->eStage!=RBU_STAGE_DONE)) ){ - /* Do not allow EXCLUSIVE locks. Preventing SQLite from taking this + /* Do not allow EXCLUSIVE locks. Preventing SQLite from taking this ** prevents it from checkpointing the database from sqlite3_close(). */ rc = SQLITE_BUSY; }else{ @@ -195453,8 +195453,8 @@ static int rbuVfsShmLock(sqlite3_file *pFile, int ofst, int n, int flags){ assert( p->openFlags & (SQLITE_OPEN_MAIN_DB|SQLITE_OPEN_TEMP_DB) ); if( pRbu && (pRbu->eStage==RBU_STAGE_OAL || pRbu->eStage==RBU_STAGE_MOVE) ){ /* Magic number 1 is the WAL_CKPT_LOCK lock. Preventing SQLite from - ** taking this lock also prevents any checkpoints from occurring. - ** todo: really, it's not clear why this might occur, as + ** taking this lock also prevents any checkpoints from occurring. + ** todo: really, it's not clear why this might occur, as ** wal_autocheckpoint ought to be turned off. */ if( ofst==WAL_LOCK_CKPT && n==1 ) rc = SQLITE_BUSY; }else{ @@ -195478,10 +195478,10 @@ static int rbuVfsShmLock(sqlite3_file *pFile, int ofst, int n, int flags){ ** Obtain a pointer to a mapping of a single 32KiB page of the *-shm file. */ static int rbuVfsShmMap( - sqlite3_file *pFile, - int iRegion, - int szRegion, - int isWrite, + sqlite3_file *pFile, + int iRegion, + int szRegion, + int isWrite, void volatile **pp ){ rbu_file *p = (rbu_file*)pFile; @@ -195489,7 +195489,7 @@ static int rbuVfsShmMap( int eStage = (p->pRbu ? p->pRbu->eStage : 0); /* If not in RBU_STAGE_OAL, allow this call to pass through. Or, if this - ** rbu is in the RBU_STAGE_OAL state, use heap memory for *-shm space + ** rbu is in the RBU_STAGE_OAL state, use heap memory for *-shm space ** instead of a file on disk. */ assert( p->openFlags & (SQLITE_OPEN_MAIN_DB|SQLITE_OPEN_TEMP_DB) ); if( eStage==RBU_STAGE_OAL ){ @@ -195559,12 +195559,12 @@ static int rbuVfsShmUnmap(sqlite3_file *pFile, int delFlag){ return rc; } -/* -** A main database named zName has just been opened. The following +/* +** A main database named zName has just been opened. The following ** function returns a pointer to a buffer owned by SQLite that contains ** the name of the *-wal file this db connection will use. SQLite ** happens to pass a pointer to this buffer when using xAccess() -** or xOpen() to operate on the *-wal file. +** or xOpen() to operate on the *-wal file. */ static const char *rbuMainToWal(const char *zName, int flags){ int n = (int)strlen(zName); @@ -195642,7 +195642,7 @@ static int rbuVfsOpen( if( pDb->pRbu && pDb->pRbu->eStage==RBU_STAGE_OAL ){ /* This call is to open a *-wal file. Intead, open the *-oal. This ** code ensures that the string passed to xOpen() is terminated by a - ** pair of '\0' bytes in case the VFS attempts to extract a URI + ** pair of '\0' bytes in case the VFS attempts to extract a URI ** parameter from it. */ const char *zBase = zName; size_t nCopy; @@ -195671,8 +195671,8 @@ static int rbuVfsOpen( pFd->pRbu = pRbuVfs->pRbu; } - if( oflags & SQLITE_OPEN_MAIN_DB - && sqlite3_uri_boolean(zName, "rbu_memory", 0) + if( oflags & SQLITE_OPEN_MAIN_DB + && sqlite3_uri_boolean(zName, "rbu_memory", 0) ){ assert( oflags & SQLITE_OPEN_MAIN_DB ); oflags = SQLITE_OPEN_TEMP_DB | SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | @@ -195711,9 +195711,9 @@ static int rbuVfsDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ ** is available, or false otherwise. */ static int rbuVfsAccess( - sqlite3_vfs *pVfs, - const char *zPath, - int flags, + sqlite3_vfs *pVfs, + const char *zPath, + int flags, int *pResOut ){ rbu_vfs *pRbuVfs = (rbu_vfs*)pVfs; @@ -195729,7 +195729,7 @@ static int rbuVfsAccess( ** a) if the *-wal file does exist, return SQLITE_CANTOPEN. This ** ensures that the RBU extension never tries to update a database ** in wal mode, even if the first page of the database file has - ** been damaged. + ** been damaged. ** ** b) if the *-wal file does not exist, claim that it does anyway, ** causing SQLite to call xOpen() to open it. This call will also @@ -195759,9 +195759,9 @@ static int rbuVfsAccess( ** of at least (DEVSYM_MAX_PATHNAME+1) bytes. */ static int rbuVfsFullPathname( - sqlite3_vfs *pVfs, - const char *zPath, - int nOut, + sqlite3_vfs *pVfs, + const char *zPath, + int nOut, char *zOut ){ sqlite3_vfs *pRealVfs = ((rbu_vfs*)pVfs)->pRealVfs; @@ -195779,7 +195779,7 @@ static void *rbuVfsDlOpen(sqlite3_vfs *pVfs, const char *zPath){ /* ** Populate the buffer zErrMsg (size nByte bytes) with a human readable -** utf-8 string describing the most recent error encountered associated +** utf-8 string describing the most recent error encountered associated ** with dynamic libraries. */ static void rbuVfsDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){ @@ -195791,8 +195791,8 @@ static void rbuVfsDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){ ** Return a pointer to the symbol zSymbol in the dynamic library pHandle. */ static void (*rbuVfsDlSym( - sqlite3_vfs *pVfs, - void *pArg, + sqlite3_vfs *pVfs, + void *pArg, const char *zSym ))(void){ sqlite3_vfs *pRealVfs = ((rbu_vfs*)pVfs)->pRealVfs; @@ -195809,7 +195809,7 @@ static void rbuVfsDlClose(sqlite3_vfs *pVfs, void *pHandle){ #endif /* SQLITE_OMIT_LOAD_EXTENSION */ /* -** Populate the buffer pointed to by zBufOut with nByte bytes of +** Populate the buffer pointed to by zBufOut with nByte bytes of ** random data. */ static int rbuVfsRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ @@ -195818,7 +195818,7 @@ static int rbuVfsRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ } /* -** Sleep for nMicro microseconds. Return the number of microseconds +** Sleep for nMicro microseconds. Return the number of microseconds ** actually slept. */ static int rbuVfsSleep(sqlite3_vfs *pVfs, int nMicro){ @@ -195984,22 +195984,22 @@ SQLITE_API sqlite3_int64 sqlite3rbu_temp_size(sqlite3rbu *pRbu){ /* ** Page paths: -** -** The value of the 'path' column describes the path taken from the -** root-node of the b-tree structure to each page. The value of the +** +** The value of the 'path' column describes the path taken from the +** root-node of the b-tree structure to each page. The value of the ** root-node path is '/'. ** ** The value of the path for the left-most child page of the root of ** a b-tree is '/000/'. (Btrees store content ordered from left to right ** so the pages to the left have smaller keys than the pages to the right.) ** The next to left-most child of the root page is -** '/001', and so on, each sibling page identified by a 3-digit hex +** '/001', and so on, each sibling page identified by a 3-digit hex ** value. The children of the 451st left-most sibling have paths such ** as '/1c2/000/, '/1c2/001/' etc. ** -** Overflow pages are specified by appending a '+' character and a +** Overflow pages are specified by appending a '+' character and a ** six-digit hexadecimal value to the path to the cell they are linked -** from. For example, the three overflow pages in a chain linked from +** from. For example, the three overflow pages in a chain linked from ** the left-most cell of the 450th child of the root page are identified ** by the paths: ** @@ -196168,8 +196168,8 @@ static int statBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ } - /* Records are always returned in ascending order of (name, path). - ** If this will satisfy the client, set the orderByConsumed flag so that + /* Records are always returned in ascending order of (name, path). + ** If this will satisfy the client, set the orderByConsumed flag so that ** SQLite does not do an external sort. */ if( ( pIdxInfo->nOrderBy==1 @@ -196260,7 +196260,7 @@ static void getLocalPayload( int nLocal; int nMinLocal; int nMaxLocal; - + if( flags==0x0D ){ /* Table leaf node */ nMinLocal = (nUsable - 12) * 32 / 255 - 23; nMaxLocal = nUsable - 35; @@ -196366,7 +196366,7 @@ static int statDecodePage(Btree *pBt, StatPage *p){ if( rc!=SQLITE_OK ){ assert( pPg==0 ); return rc; - } + } pCell->aOvfl[j] = sqlite3Get4byte(sqlite3PagerGetData(pPg)); sqlite3PagerUnref(pPg); } @@ -196455,7 +196455,7 @@ statNextRestart: if( pCell->iOvflnOvfl ){ int nUsable; sqlite3BtreeEnter(pBt); - nUsable = sqlite3BtreeGetPageSize(pBt) - + nUsable = sqlite3BtreeGetPageSize(pBt) - sqlite3BtreeGetReserveNoMutex(pBt); sqlite3BtreeLeave(pBt); pCsr->zName = (char *)sqlite3_column_text(pCsr->pStmt, 0); @@ -196555,7 +196555,7 @@ static int statEof(sqlite3_vtab_cursor *pCursor){ } static int statFilter( - sqlite3_vtab_cursor *pCursor, + sqlite3_vtab_cursor *pCursor, int idxNum, const char *idxStr, int argc, sqlite3_value **argv ){ @@ -196598,8 +196598,8 @@ static int statFilter( } static int statColumn( - sqlite3_vtab_cursor *pCursor, - sqlite3_context *ctx, + sqlite3_vtab_cursor *pCursor, + sqlite3_context *ctx, int i ){ StatCursor *pCsr = (StatCursor *)pCursor; @@ -196703,7 +196703,7 @@ SQLITE_PRIVATE int sqlite3DbstatRegister(sqlite3 *db){ return SQLITE_OK; } ** This file contains an implementation of the "sqlite_dbpage" virtual table. ** ** The sqlite_dbpage virtual table is used to read or write whole raw -** pages of the database file. The pager interface is used so that +** pages of the database file. The pager interface is used so that ** uncommitted changes and changes recorded in the WAL file are correctly ** retrieved. ** @@ -196763,7 +196763,7 @@ static int dbpageConnect( DbpageTable *pTab = 0; int rc = SQLITE_OK; - rc = sqlite3_declare_vtab(db, + rc = sqlite3_declare_vtab(db, "CREATE TABLE x(pgno INTEGER PRIMARY KEY, data BLOB, schema HIDDEN)"); if( rc==SQLITE_OK ){ pTab = (DbpageTable *)sqlite3_malloc64(sizeof(DbpageTable)); @@ -196903,7 +196903,7 @@ static int dbpageEof(sqlite3_vtab_cursor *pCursor){ ** idxStr is not used */ static int dbpageFilter( - sqlite3_vtab_cursor *pCursor, + sqlite3_vtab_cursor *pCursor, int idxNum, const char *idxStr, int argc, sqlite3_value **argv ){ @@ -196914,7 +196914,7 @@ static int dbpageFilter( Btree *pBt; /* Default setting is no rows of result */ - pCsr->pgno = 1; + pCsr->pgno = 1; pCsr->mxPgno = 0; if( idxNum & 2 ){ @@ -196949,8 +196949,8 @@ static int dbpageFilter( } static int dbpageColumn( - sqlite3_vtab_cursor *pCursor, - sqlite3_context *ctx, + sqlite3_vtab_cursor *pCursor, + sqlite3_context *ctx, int i ){ DbpageCursor *pCsr = (DbpageCursor *)pCursor; @@ -197027,7 +197027,7 @@ static int dbpageUpdate( goto update_fail; } szPage = sqlite3BtreeGetPageSize(pBt); - if( sqlite3_value_type(argv[3])!=SQLITE_BLOB + if( sqlite3_value_type(argv[3])!=SQLITE_BLOB || sqlite3_value_bytes(argv[3])!=szPage ){ zErr = "bad page value"; @@ -197172,7 +197172,7 @@ struct SessionBuffer { }; /* -** An object of this type is used internally as an abstraction for +** An object of this type is used internally as an abstraction for ** input data. Input data may be supplied either as a single large buffer ** (e.g. sqlite3changeset_start()) or using a stream function (e.g. ** sqlite3changeset_start_strm()). @@ -197233,11 +197233,11 @@ struct SessionTable { SessionChange **apChange; /* Hash table buckets */ }; -/* +/* ** RECORD FORMAT: ** -** The following record format is similar to (but not compatible with) that -** used in SQLite database files. This format is used as part of the +** The following record format is similar to (but not compatible with) that +** used in SQLite database files. This format is used as part of the ** change-set binary format, and so must be architecture independent. ** ** Unlike the SQLite database record format, each field is self-contained - @@ -197271,7 +197271,7 @@ struct SessionTable { ** Real values: ** An 8-byte big-endian IEEE 754-2008 real value. ** -** Varint values are encoded in the same way as varints in the SQLite +** Varint values are encoded in the same way as varints in the SQLite ** record format. ** ** CHANGESET FORMAT: @@ -197303,7 +197303,7 @@ struct SessionTable { ** ** The new.* record that is part of each INSERT change contains the values ** that make up the new row. Similarly, the old.* record that is part of each -** DELETE change contains the values that made up the row that was deleted +** DELETE change contains the values that made up the row that was deleted ** from the database. In the changeset format, the records that are part ** of INSERT or DELETE changes never contain any undefined (type byte 0x00) ** fields. @@ -197312,8 +197312,8 @@ struct SessionTable { ** associated with table columns that are not PRIMARY KEY columns and are ** not modified by the UPDATE change are set to "undefined". Other fields ** are set to the values that made up the row before the UPDATE that the -** change records took place. Within the new.* record, fields associated -** with table columns modified by the UPDATE change contain the new +** change records took place. Within the new.* record, fields associated +** with table columns modified by the UPDATE change contain the new ** values. Fields associated with table columns that are not modified ** are set to "undefined". ** @@ -197339,7 +197339,7 @@ struct SessionTable { ** ** As in the changeset format, each field of the single record that is part ** of a patchset change is associated with the correspondingly positioned -** table column, counting from left to right within the CREATE TABLE +** table column, counting from left to right within the CREATE TABLE ** statement. ** ** For a DELETE change, all fields within the record except those associated @@ -197357,7 +197357,7 @@ struct SessionTable { ** ** REBASE BLOB FORMAT: ** -** A rebase blob may be output by sqlite3changeset_apply_v2() and its +** A rebase blob may be output by sqlite3changeset_apply_v2() and its ** streaming equivalent for use with the sqlite3_rebaser APIs to rebase ** existing changesets. A rebase blob contains one entry for each conflict ** resolved using either the OMIT or REPLACE strategies within the apply_v2() @@ -197381,7 +197381,7 @@ struct SessionTable { ** ** In a rebase blob, the first field is set to SQLITE_INSERT if the change ** that caused the conflict was an INSERT or UPDATE, or to SQLITE_DELETE if -** it was a DELETE. The second field is set to 0x01 if the conflict +** it was a DELETE. The second field is set to 0x01 if the conflict ** resolution strategy was REPLACE, or 0x00 if it was OMIT. ** ** If the change that caused the conflict was a DELETE, then the single @@ -197405,7 +197405,7 @@ struct SessionChange { }; /* -** Write a varint with value iVal into the buffer at aBuf. Return the +** Write a varint with value iVal into the buffer at aBuf. Return the ** number of bytes written. */ static int sessionVarintPut(u8 *aBuf, int iVal){ @@ -197420,7 +197420,7 @@ static int sessionVarintLen(int iVal){ } /* -** Read a varint value from aBuf[] into *piVal. Return the number of +** Read a varint value from aBuf[] into *piVal. Return the number of ** bytes read. */ static int sessionVarintGet(u8 *aBuf, int *piVal){ @@ -197459,13 +197459,13 @@ static void sessionPutI64(u8 *aBuf, sqlite3_int64 i){ ** This function is used to serialize the contents of value pValue (see ** comment titled "RECORD FORMAT" above). ** -** If it is non-NULL, the serialized form of the value is written to +** If it is non-NULL, the serialized form of the value is written to ** buffer aBuf. *pnWrite is set to the number of bytes written before ** returning. Or, if aBuf is NULL, the only thing this function does is ** set *pnWrite. ** ** If no error occurs, SQLITE_OK is returned. Or, if an OOM error occurs -** within a call to sqlite3_value_text() (may fail if the db is utf-16)) +** within a call to sqlite3_value_text() (may fail if the db is utf-16)) ** SQLITE_NOMEM is returned. */ static int sessionSerializeValue( @@ -197477,16 +197477,16 @@ static int sessionSerializeValue( if( pValue ){ int eType; /* Value type (SQLITE_NULL, TEXT etc.) */ - + eType = sqlite3_value_type(pValue); if( aBuf ) aBuf[0] = eType; - + switch( eType ){ - case SQLITE_NULL: + case SQLITE_NULL: nByte = 1; break; - - case SQLITE_INTEGER: + + case SQLITE_INTEGER: case SQLITE_FLOAT: if( aBuf ){ /* TODO: SQLite does something special to deal with mixed-endian @@ -197503,14 +197503,14 @@ static int sessionSerializeValue( } sessionPutI64(&aBuf[1], i); } - nByte = 9; + nByte = 9; break; - + default: { u8 *z; int n; int nVarint; - + assert( eType==SQLITE_TEXT || eType==SQLITE_BLOB ); if( eType==SQLITE_TEXT ){ z = (u8 *)sqlite3_value_text(pValue); @@ -197520,12 +197520,12 @@ static int sessionSerializeValue( n = sqlite3_value_bytes(pValue); if( z==0 && (eType!=SQLITE_BLOB || n>0) ) return SQLITE_NOMEM; nVarint = sessionVarintLen(n); - + if( aBuf ){ sessionVarintPut(&aBuf[1], n); if( n ) memcpy(&aBuf[nVarint + 1], z, n); } - + nByte = 1 + nVarint + n; break; } @@ -197567,7 +197567,7 @@ static unsigned int sessionHashAppendI64(unsigned int h, i64 i){ } /* -** Append the hash of the blob passed via the second and third arguments to +** Append the hash of the blob passed via the second and third arguments to ** the hash-key value passed as the first. Return the new hash-key value. */ static unsigned int sessionHashAppendBlob(unsigned int h, int n, const u8 *z){ @@ -197586,7 +197586,7 @@ static unsigned int sessionHashAppendType(unsigned int h, int eType){ /* ** This function may only be called from within a pre-update callback. -** It calculates a hash based on the primary key values of the old.* or +** It calculates a hash based on the primary key values of the old.* or ** new.* row currently available and, assuming no error occurs, writes it to ** *piHash before returning. If the primary key contains one or more NULL ** values, *pbNullPK is set to true before returning. @@ -197693,12 +197693,12 @@ static unsigned int sessionChangeHash( int isPK = pTab->abPK[i]; if( bPkOnly && isPK==0 ) continue; - /* It is not possible for eType to be SQLITE_NULL here. The session + /* It is not possible for eType to be SQLITE_NULL here. The session ** module does not record changes for rows with NULL values stored in ** primary key columns. */ - assert( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT - || eType==SQLITE_TEXT || eType==SQLITE_BLOB - || eType==SQLITE_NULL || eType==0 + assert( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT + || eType==SQLITE_TEXT || eType==SQLITE_BLOB + || eType==SQLITE_NULL || eType==0 ); assert( !isPK || (eType!=0 && eType!=SQLITE_NULL) ); @@ -197709,7 +197709,7 @@ static unsigned int sessionChangeHash( h = sessionHashAppendI64(h, sessionGetI64(a)); a += 8; }else{ - int n; + int n; a += sessionVarintGet(a, &n); h = sessionHashAppendBlob(h, n, a); a += n; @@ -197724,7 +197724,7 @@ static unsigned int sessionChangeHash( /* ** Arguments aLeft and aRight are pointers to change records for table pTab. ** This function returns true if the two records apply to the same row (i.e. -** have the same values stored in the primary key columns), or false +** have the same values stored in the primary key columns), or false ** otherwise. */ static int sessionChangeEqual( @@ -197761,17 +197761,17 @@ static int sessionChangeEqual( ** Arguments aLeft and aRight both point to buffers containing change ** records with nCol columns. This function "merges" the two records into ** a single records which is written to the buffer at *paOut. *paOut is -** then set to point to one byte after the last byte written before +** then set to point to one byte after the last byte written before ** returning. ** -** The merging of records is done as follows: For each column, if the +** The merging of records is done as follows: For each column, if the ** aRight record contains a value for the column, copy the value from ** their. Otherwise, if aLeft contains a value, copy it. If neither ** record contains a value for a given column, then neither does the ** output record. */ static void sessionMergeRecord( - u8 **paOut, + u8 **paOut, int nCol, u8 *aLeft, u8 *aRight @@ -197801,13 +197801,13 @@ static void sessionMergeRecord( /* ** This is a helper function used by sessionMergeUpdate(). ** -** When this function is called, both *paOne and *paTwo point to a value -** within a change record. Before it returns, both have been advanced so +** When this function is called, both *paOne and *paTwo point to a value +** within a change record. Before it returns, both have been advanced so ** as to point to the next value in the record. ** ** If, when this function is called, *paTwo points to a valid value (i.e. ** *paTwo[0] is not 0x00 - the "no value" placeholder), a copy of the *paTwo -** pointer is returned and *pnVal is set to the number of bytes in the +** pointer is returned and *pnVal is set to the number of bytes in the ** serialized value. Otherwise, a copy of *paOne is returned and *pnVal ** set to the number of bytes in the value at *paOne. If *paOne points ** to the "no value" placeholder, *pnVal is set to 1. In other words: @@ -197906,8 +197906,8 @@ static int sessionMergeUpdate( aOld = sessionMergeValue(&aOld1, &aOld2, &nOld); aNew = sessionMergeValue(&aNew1, &aNew2, &nNew); - if( bPatchset==0 - && (pTab->abPK[i] || (nOld==nNew && 0==memcmp(aOld, aNew, nNew))) + if( bPatchset==0 + && (pTab->abPK[i] || (nOld==nNew && 0==memcmp(aOld, aNew, nNew))) ){ *(aOut++) = '\0'; }else{ @@ -197996,7 +197996,7 @@ static int sessionPreupdateEqual( } /* -** If required, grow the hash table used to store changes on table pTab +** If required, grow the hash table used to store changes on table pTab ** (part of the session pSession). If a fatal OOM error occurs, set the ** session object to failed and return SQLITE_ERROR. Otherwise, return ** SQLITE_OK. @@ -198136,7 +198136,7 @@ static int sessionTableInfo( *pzTab = (char *)pAlloc; pAlloc += nThis+1; } - + i = 0; while( SQLITE_ROW==sqlite3_step(pStmt) ){ int nName = sqlite3_column_bytes(pStmt, 1); @@ -198149,7 +198149,7 @@ static int sessionTableInfo( i++; } rc = sqlite3_reset(pStmt); - + } /* If successful, populate the output variables. Otherwise, zero them and @@ -198179,14 +198179,14 @@ static int sessionTableInfo( ** If an error occurs, an error code is stored in sqlite3_session.rc and ** non-zero returned. Or, if no error occurs but the table has no primary ** key, sqlite3_session.rc is left set to SQLITE_OK and non-zero returned to -** indicate that updates on this table should be ignored. SessionTable.abPK +** indicate that updates on this table should be ignored. SessionTable.abPK ** is set to NULL in this case. */ static int sessionInitTable(sqlite3_session *pSession, SessionTable *pTab){ if( pTab->nCol==0 ){ u8 *abPK; assert( pTab->azCol==0 || pTab->abPK==0 ); - pSession->rc = sessionTableInfo(pSession->db, pSession->zDb, + pSession->rc = sessionTableInfo(pSession->db, pSession->zDb, pTab->zName, &pTab->nCol, 0, &pTab->azCol, &abPK ); if( pSession->rc==SQLITE_OK ){ @@ -198247,7 +198247,7 @@ static int sessionStat1Depth(void *pCtx){ /* -** This function is only called from with a pre-update-hook reporting a +** This function is only called from with a pre-update-hook reporting a ** change on table pTab (attached to session pSession). The type of change ** (UPDATE, INSERT, DELETE) is specified by the first argument. ** @@ -198259,8 +198259,8 @@ static void sessionPreupdateOneChange( sqlite3_session *pSession, /* Session object pTab is attached to */ SessionTable *pTab /* Table that change applies to */ ){ - int iHash; - int bNull = 0; + int iHash; + int bNull = 0; int rc = SQLITE_OK; SessionStat1Ctx stat1 = {{0,0,0,0,0},0}; @@ -198269,7 +198269,7 @@ static void sessionPreupdateOneChange( /* Load table details if required */ if( sessionInitTable(pSession, pTab) ) return; - /* Check the number of columns in this xPreUpdate call matches the + /* Check the number of columns in this xPreUpdate call matches the ** number of columns in the table. */ if( pTab->nCol!=pSession->hook.xCount(pSession->hook.pCtx) ){ pSession->rc = SQLITE_SCHEMA; @@ -198321,10 +198321,10 @@ static void sessionPreupdateOneChange( SessionChange *pChange; /* New change object */ sqlite3_int64 nByte; /* Number of bytes to allocate */ int i; /* Used to iterate through columns */ - + assert( rc==SQLITE_OK ); pTab->nEntry++; - + /* Figure out how large an allocation is required */ nByte = sizeof(SessionChange); for(i=0; inCol; i++){ @@ -198342,7 +198342,7 @@ static void sessionPreupdateOneChange( rc = sessionSerializeValue(0, p, &nByte); if( rc!=SQLITE_OK ) goto error_out; } - + /* Allocate the change object */ pChange = (SessionChange *)sqlite3_malloc64(nByte); if( !pChange ){ @@ -198352,7 +198352,7 @@ static void sessionPreupdateOneChange( memset(pChange, 0, sizeof(SessionChange)); pChange->aRecord = (u8 *)&pChange[1]; } - + /* Populate the change object. None of the preupdate_old(), ** preupdate_new() or SerializeValue() calls below may fail as all ** required values and encodings have already been cached in memory. @@ -198380,8 +198380,8 @@ static void sessionPreupdateOneChange( }else if( pC->bIndirect ){ /* If the existing change is considered "indirect", but this current ** change is "direct", mark the change object as direct. */ - if( pSession->hook.xDepth(pSession->hook.pCtx)==0 - && pSession->bIndirect==0 + if( pSession->hook.xDepth(pSession->hook.pCtx)==0 + && pSession->bIndirect==0 ){ pC->bIndirect = 0; } @@ -198399,7 +198399,7 @@ static void sessionPreupdateOneChange( } static int sessionFindTable( - sqlite3_session *pSession, + sqlite3_session *pSession, const char *zName, SessionTable **ppTab ){ @@ -198416,7 +198416,7 @@ static int sessionFindTable( /* If there is a table-filter configured, invoke it. If it returns 0, ** do not automatically add the new table. */ if( pSession->xTableFilter==0 - || pSession->xTableFilter(pSession->pFilterCtx, zName) + || pSession->xTableFilter(pSession->pFilterCtx, zName) ){ rc = sqlite3session_attach(pSession, zName); if( rc==SQLITE_OK ){ @@ -198451,8 +198451,8 @@ static void xPreUpdate( for(pSession=(sqlite3_session *)pCtx; pSession; pSession=pSession->pNext){ SessionTable *pTab; - /* If this session is attached to a different database ("main", "temp" - ** etc.), or if it is not currently enabled, there is nothing to do. Skip + /* If this session is attached to a different database ("main", "temp" + ** etc.), or if it is not currently enabled, there is nothing to do. Skip ** to the next session object attached to this database. */ if( pSession->bEnable==0 ) continue; if( pSession->rc ) continue; @@ -198543,7 +198543,7 @@ static void sessionDiffHooks( static char *sessionExprComparePK( int nCol, - const char *zDb1, const char *zDb2, + const char *zDb1, const char *zDb2, const char *zTab, const char **azCol, u8 *abPK ){ @@ -198566,7 +198566,7 @@ static char *sessionExprComparePK( static char *sessionExprCompareOther( int nCol, - const char *zDb1, const char *zDb2, + const char *zDb1, const char *zDb2, const char *zTab, const char **azCol, u8 *abPK ){ @@ -198643,9 +198643,9 @@ static int sessionDiffFindNew( } static int sessionDiffFindModified( - sqlite3_session *pSession, - SessionTable *pTab, - const char *zFrom, + sqlite3_session *pSession, + SessionTable *pTab, + const char *zFrom, const char *zExpr ){ int rc = SQLITE_OK; @@ -198744,7 +198744,7 @@ SQLITE_API int sqlite3session_diff( } if( rc==SQLITE_OK ){ - zExpr = sessionExprComparePK(pTo->nCol, + zExpr = sessionExprComparePK(pTo->nCol, zDb, zFrom, pTo->zName, pTo->azCol, pTo->abPK ); } @@ -198799,7 +198799,7 @@ SQLITE_API int sqlite3session_create( memcpy(pNew->zDb, zDb, nDb+1); sessionPreupdateHooks(pNew); - /* Add the new session object to the linked list of session objects + /* Add the new session object to the linked list of session objects ** attached to database handle $db. Do this under the cover of the db ** handle mutex. */ sqlite3_mutex_enter(sqlite3_db_mutex(db)); @@ -198858,7 +198858,7 @@ SQLITE_API void sqlite3session_delete(sqlite3_session *pSession){ sqlite3_mutex_leave(sqlite3_db_mutex(db)); sqlite3ValueFree(pSession->pZeroBlob); - /* Delete all attached table objects. And the contents of their + /* Delete all attached table objects. And the contents of their ** associated hash-tables. */ sessionDeleteTable(pSession->pTable); @@ -198870,7 +198870,7 @@ SQLITE_API void sqlite3session_delete(sqlite3_session *pSession){ ** Set a table filter on a Session Object. */ SQLITE_API void sqlite3session_table_filter( - sqlite3_session *pSession, + sqlite3_session *pSession, int(*xFilter)(void*, const char*), void *pCtx /* First argument passed to xFilter */ ){ @@ -198914,7 +198914,7 @@ SQLITE_API int sqlite3session_attach( rc = SQLITE_NOMEM; }else{ /* Populate the new SessionTable object and link it into the list. - ** The new object must be linked onto the end of the list, not + ** The new object must be linked onto the end of the list, not ** simply added to the start of it in order to ensure that tables ** appear in the correct order when a changeset or patchset is ** eventually generated. */ @@ -198982,8 +198982,8 @@ static void sessionAppendValue(SessionBuffer *p, sqlite3_value *pVal, int *pRc){ } /* -** This function is a no-op if *pRc is other than SQLITE_OK when it is -** called. Otherwise, append a single byte to the buffer. +** This function is a no-op if *pRc is other than SQLITE_OK when it is +** called. Otherwise, append a single byte to the buffer. ** ** If an OOM condition is encountered, set *pRc to SQLITE_NOMEM before ** returning. @@ -198995,8 +198995,8 @@ static void sessionAppendByte(SessionBuffer *p, u8 v, int *pRc){ } /* -** This function is a no-op if *pRc is other than SQLITE_OK when it is -** called. Otherwise, append a single varint to the buffer. +** This function is a no-op if *pRc is other than SQLITE_OK when it is +** called. Otherwise, append a single varint to the buffer. ** ** If an OOM condition is encountered, set *pRc to SQLITE_NOMEM before ** returning. @@ -199008,16 +199008,16 @@ static void sessionAppendVarint(SessionBuffer *p, int v, int *pRc){ } /* -** This function is a no-op if *pRc is other than SQLITE_OK when it is -** called. Otherwise, append a blob of data to the buffer. +** This function is a no-op if *pRc is other than SQLITE_OK when it is +** called. Otherwise, append a blob of data to the buffer. ** ** If an OOM condition is encountered, set *pRc to SQLITE_NOMEM before ** returning. */ static void sessionAppendBlob( - SessionBuffer *p, - const u8 *aBlob, - int nBlob, + SessionBuffer *p, + const u8 *aBlob, + int nBlob, int *pRc ){ if( nBlob>0 && 0==sessionBufferGrow(p, nBlob, pRc) ){ @@ -199027,7 +199027,7 @@ static void sessionAppendBlob( } /* -** This function is a no-op if *pRc is other than SQLITE_OK when it is +** This function is a no-op if *pRc is other than SQLITE_OK when it is ** called. Otherwise, append a string to the buffer. All bytes in the string ** up to (but not including) the nul-terminator are written to the buffer. ** @@ -199035,8 +199035,8 @@ static void sessionAppendBlob( ** returning. */ static void sessionAppendStr( - SessionBuffer *p, - const char *zStr, + SessionBuffer *p, + const char *zStr, int *pRc ){ int nStr = sqlite3Strlen30(zStr); @@ -199047,7 +199047,7 @@ static void sessionAppendStr( } /* -** This function is a no-op if *pRc is other than SQLITE_OK when it is +** This function is a no-op if *pRc is other than SQLITE_OK when it is ** called. Otherwise, append the string representation of integer iVal ** to the buffer. No nul-terminator is written. ** @@ -199065,9 +199065,9 @@ static void sessionAppendInteger( } /* -** This function is a no-op if *pRc is other than SQLITE_OK when it is +** This function is a no-op if *pRc is other than SQLITE_OK when it is ** called. Otherwise, append the string zStr enclosed in quotes (") and -** with any embedded quote characters escaped to the buffer. No +** with any embedded quote characters escaped to the buffer. No ** nul-terminator byte is written. ** ** If an OOM condition is encountered, set *pRc to SQLITE_NOMEM before @@ -199140,8 +199140,8 @@ static void sessionAppendCol( /* ** -** This function appends an update change to the buffer (see the comments -** under "CHANGESET FORMAT" at the top of the file). An update change +** This function appends an update change to the buffer (see the comments +** under "CHANGESET FORMAT" at the top of the file). An update change ** consists of: ** ** 1 byte: SQLITE_UPDATE (0x17) @@ -199156,10 +199156,10 @@ static void sessionAppendCol( ** If all of the old.* values are equal to their corresponding new.* value ** (i.e. nothing has changed), then no data at all is appended to the buffer. ** -** Otherwise, the old.* record contains all primary key values and the -** original values of any fields that have been modified. The new.* record +** Otherwise, the old.* record contains all primary key values and the +** original values of any fields that have been modified. The new.* record ** contains the new values of only those fields that have been modified. -*/ +*/ static int sessionAppendUpdate( SessionBuffer *pBuf, /* Buffer to append to */ int bPatchset, /* True for "patchset", 0 for "changeset" */ @@ -199210,8 +199210,8 @@ static int sessionAppendUpdate( int nHdr = 1 + sessionVarintGet(&pCsr[1], &n); assert( eType==SQLITE_TEXT || eType==SQLITE_BLOB ); nAdvance = nHdr + n; - if( eType==sqlite3_column_type(pStmt, i) - && n==sqlite3_column_bytes(pStmt, i) + if( eType==sqlite3_column_type(pStmt, i) + && n==sqlite3_column_bytes(pStmt, i) && (n==0 || 0==memcmp(&pCsr[nHdr], sqlite3_column_blob(pStmt, i), n)) ){ break; @@ -199438,7 +199438,7 @@ static int sessionSelectBind( /* ** This function is a no-op if *pRc is set to other than SQLITE_OK when it -** is called. Otherwise, append a serialized table header (part of the binary +** is called. Otherwise, append a serialized table header (part of the binary ** changeset format) to buffer *pBuf. If an error occurs, set *pRc to an ** SQLite error code before returning. */ @@ -199462,7 +199462,7 @@ static void sessionAppendTableHdr( ** ** If no error occurs, SQLITE_OK is returned and the new changeset/patchset ** stored in output variables *pnChangeset and *ppChangeset. Or, if an error -** occurs, an SQLite error code is returned and both output variables set +** occurs, an SQLite error code is returned and both output variables set ** to 0. */ static int sessionGenerateChangeset( @@ -199547,10 +199547,10 @@ static int sessionGenerateChangeset( /* If the buffer is now larger than sessions_strm_chunk_size, pass ** its contents to the xOutput() callback. */ - if( xOutput - && rc==SQLITE_OK - && buf.nBuf>nNoop - && buf.nBuf>sessions_strm_chunk_size + if( xOutput + && rc==SQLITE_OK + && buf.nBuf>nNoop + && buf.nBuf>sessions_strm_chunk_size ){ rc = xOutput(pOut, (void*)buf.aBuf, buf.nBuf); nNoop = -1; @@ -199585,10 +199585,10 @@ static int sessionGenerateChangeset( } /* -** Obtain a changeset object containing all changes recorded by the +** Obtain a changeset object containing all changes recorded by the ** session object passed as the first argument. ** -** It is the responsibility of the caller to eventually free the buffer +** It is the responsibility of the caller to eventually free the buffer ** using sqlite3_free(). */ SQLITE_API int sqlite3session_changeset( @@ -199622,10 +199622,10 @@ SQLITE_API int sqlite3session_patchset_strm( } /* -** Obtain a patchset object containing all changes recorded by the +** Obtain a patchset object containing all changes recorded by the ** session object passed as the first argument. ** -** It is the responsibility of the caller to eventually free the buffer +** It is the responsibility of the caller to eventually free the buffer ** using sqlite3_free(). */ SQLITE_API int sqlite3session_patchset( @@ -199831,7 +199831,7 @@ static void sessionSkipRecord( /* ** This function sets the value of the sqlite3_value object passed as the -** first argument to a copy of the string or blob held in the aData[] +** first argument to a copy of the string or blob held in the aData[] ** buffer. SQLITE_OK is returned if successful, or SQLITE_NOMEM if an OOM ** error occurs. */ @@ -199842,7 +199842,7 @@ static int sessionValueSetStr( u8 enc /* String encoding (0 for blobs) */ ){ /* In theory this code could just pass SQLITE_TRANSIENT as the final - ** argument to sqlite3ValueSetStr() and have the copy created + ** argument to sqlite3ValueSetStr() and have the copy created ** automatically. But doing so makes it difficult to detect any OOM ** error. Hence the code to create the copy externally. */ u8 *aCopy = sqlite3_malloc64((sqlite3_int64)nData+1); @@ -199943,7 +199943,7 @@ static int sessionReadRecord( ** + array of PK flags (1 byte per column), ** + table name (nul terminated). ** -** This function ensures that all of the above is present in the input +** This function ensures that all of the above is present in the input ** buffer (i.e. that it can be accessed without any calls to xInput()). ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error code. ** The input pointer is not moved. @@ -199957,11 +199957,11 @@ static int sessionChangesetBufferTblhdr(SessionInput *pIn, int *pnByte){ if( rc==SQLITE_OK ){ nRead += sessionVarintGet(&pIn->aData[pIn->iNext + nRead], &nCol); /* The hard upper limit for the number of columns in an SQLite - ** database table is, according to sqliteLimit.h, 32676. So - ** consider any table-header that purports to have more than 65536 - ** columns to be corrupt. This is convenient because otherwise, - ** if the (nCol>65536) condition below were omitted, a sufficiently - ** large value for nCol may cause nRead to wrap around and become + ** database table is, according to sqliteLimit.h, 32676. So + ** consider any table-header that purports to have more than 65536 + ** columns to be corrupt. This is convenient because otherwise, + ** if the (nCol>65536) condition below were omitted, a sufficiently + ** large value for nCol may cause nRead to wrap around and become ** negative. Leading to a crash. */ if( nCol<0 || nCol>65536 ){ rc = SQLITE_CORRUPT_BKPT; @@ -200026,8 +200026,8 @@ static int sessionChangesetBufferRecord( ** + array of PK flags (1 byte per column), ** + table name (nul terminated). ** -** This function decodes the table-header and populates the p->nCol, -** p->zTab and p->abPK[] variables accordingly. The p->apValue[] array is +** This function decodes the table-header and populates the p->nCol, +** p->zTab and p->abPK[] variables accordingly. The p->apValue[] array is ** also allocated or resized according to the new value of p->nCol. The ** input pointer is left pointing to the byte following the table header. ** @@ -200080,9 +200080,9 @@ static int sessionChangesetReadTblhdr(sqlite3_changeset_iter *p){ ** record is written to *paRec before returning and the number of bytes in ** the record to *pnRec. ** -** Either way, this function returns SQLITE_ROW if the iterator is -** successfully advanced to the next change in the changeset, an SQLite -** error code if an error occurs, or SQLITE_DONE if there are no further +** Either way, this function returns SQLITE_ROW if the iterator is +** successfully advanced to the next change in the changeset, an SQLite +** error code if an error occurs, or SQLITE_DONE if there are no further ** changes in the changeset. */ static int sessionChangesetNext( @@ -200146,7 +200146,7 @@ static int sessionChangesetNext( return (p->rc = SQLITE_CORRUPT_BKPT); } - if( paRec ){ + if( paRec ){ int nVal; /* Number of values to buffer */ if( p->bPatchset==0 && op==SQLITE_UPDATE ){ nVal = p->nCol * 2; @@ -200313,7 +200313,7 @@ SQLITE_API int sqlite3changeset_new( /* ** This function may only be called with a changeset iterator that has been -** passed to an SQLITE_CHANGESET_DATA or SQLITE_CHANGESET_CONFLICT +** passed to an SQLITE_CHANGESET_DATA or SQLITE_CHANGESET_CONFLICT ** conflict-handler function. Otherwise, SQLITE_MISUSE is returned. ** ** If successful, *ppValue is set to point to an sqlite3_value structure @@ -200663,7 +200663,7 @@ static int sessionDeleteRow( } /* -** Formulate and prepare a statement to UPDATE a row from database db. +** Formulate and prepare a statement to UPDATE a row from database db. ** Assuming a table structure like this: ** ** CREATE TABLE x(a, b, c, d, PRIMARY KEY(a, c)); @@ -200675,7 +200675,7 @@ static int sessionDeleteRow( ** b = CASE WHEN ?5 THEN ?6 ELSE b END, ** c = CASE WHEN ?8 THEN ?9 ELSE c END, ** d = CASE WHEN ?11 THEN ?12 ELSE d END -** WHERE a = ?1 AND c = ?7 AND (?13 OR +** WHERE a = ?1 AND c = ?7 AND (?13 OR ** (?5==0 OR b IS ?4) AND (?11==0 OR d IS ?10) AND ** ) ** @@ -200827,7 +200827,7 @@ static int sessionPrepare(sqlite3 *db, sqlite3_stmt **pp, const char *zSql){ /* ** Prepare statements for applying changes to the sqlite_stat1 table. ** These are similar to those created by sessionSelectRow(), -** sessionInsertRow(), sessionUpdateRow() and sessionDeleteRow() for +** sessionInsertRow(), sessionUpdateRow() and sessionDeleteRow() for ** other tables. */ static int sessionStat1Sql(sqlite3 *db, SessionApplyCtx *p){ @@ -200861,7 +200861,7 @@ static int sessionStat1Sql(sqlite3 *db, SessionApplyCtx *p){ } /* -** A wrapper around sqlite3_bind_value() that detects an extra problem. +** A wrapper around sqlite3_bind_value() that detects an extra problem. ** See comments in the body of this function for details. */ static int sessionBindValue( @@ -200884,15 +200884,15 @@ static int sessionBindValue( } /* -** Iterator pIter must point to an SQLITE_INSERT entry. This function +** Iterator pIter must point to an SQLITE_INSERT entry. This function ** transfers new.* values from the current iterator entry to statement ** pStmt. The table being inserted into has nCol columns. ** -** New.* value $i from the iterator is bound to variable ($i+1) of +** New.* value $i from the iterator is bound to variable ($i+1) of ** statement pStmt. If parameter abPK is NULL, all values from 0 to (nCol-1) ** are transfered to the statement. Otherwise, if abPK is not NULL, it points -** to an array nCol elements in size. In this case only those values for -** which abPK[$i] is true are read from the iterator and bound to the +** to an array nCol elements in size. In this case only those values for +** which abPK[$i] is true are read from the iterator and bound to the ** statement. ** ** An SQLite error code is returned if an error occurs. Otherwise, SQLITE_OK. @@ -200908,8 +200908,8 @@ static int sessionBindRow( int rc = SQLITE_OK; /* Neither sqlite3changeset_old or sqlite3changeset_new can fail if the - ** argument iterator points to a suitable entry. Make sure that xValue - ** is one of these to guarantee that it is safe to ignore the return + ** argument iterator points to a suitable entry. Make sure that xValue + ** is one of these to guarantee that it is safe to ignore the return ** in the code below. */ assert( xValue==sqlite3changeset_old || xValue==sqlite3changeset_new ); @@ -200933,18 +200933,18 @@ static int sessionBindRow( ** SQL statement pSelect is as generated by the sessionSelectRow() function. ** This function binds the primary key values from the change that changeset ** iterator pIter points to to the SELECT and attempts to seek to the table -** entry. If a row is found, the SELECT statement left pointing at the row +** entry. If a row is found, the SELECT statement left pointing at the row ** and SQLITE_ROW is returned. Otherwise, if no row is found and no error ** has occured, the statement is reset and SQLITE_OK is returned. If an ** error occurs, the statement is reset and an SQLite error code is returned. ** -** If this function returns SQLITE_ROW, the caller must eventually reset() +** If this function returns SQLITE_ROW, the caller must eventually reset() ** statement pSelect. If any other value is returned, the statement does ** not require a reset(). ** ** If the iterator currently points to an INSERT record, bind values from the ** new.* record to the SELECT statement. Or, if it points to a DELETE or -** UPDATE, bind values from the old.* record. +** UPDATE, bind values from the old.* record. */ static int sessionSeekToRow( sqlite3 *db, /* Database handle */ @@ -200958,7 +200958,7 @@ static int sessionSeekToRow( const char *zDummy; /* Unused */ sqlite3changeset_op(pIter, &zDummy, &nCol, &op, 0); - rc = sessionBindRow(pIter, + rc = sessionBindRow(pIter, op==SQLITE_INSERT ? sqlite3changeset_new : sqlite3changeset_old, nCol, abPK, pSelect ); @@ -200975,7 +200975,7 @@ static int sessionSeekToRow( ** This function is called from within sqlite3changeset_apply_v2() when ** a conflict is encountered and resolved using conflict resolution ** mode eType (either SQLITE_CHANGESET_OMIT or SQLITE_CHANGESET_REPLACE).. -** It adds a conflict resolution record to the buffer in +** It adds a conflict resolution record to the buffer in ** SessionApplyCtx.rebase, which will eventually be returned to the caller ** of apply_v2() as the "rebase" buffer. ** @@ -201003,7 +201003,7 @@ static int sessionRebaseAdd( assert( eType==SQLITE_CHANGESET_REPLACE||eType==SQLITE_CHANGESET_OMIT ); assert( eOp==SQLITE_DELETE || eOp==SQLITE_INSERT || eOp==SQLITE_UPDATE ); - sessionAppendByte(&p->rebase, + sessionAppendByte(&p->rebase, (eOp==SQLITE_DELETE ? SQLITE_DELETE : SQLITE_INSERT), &rc ); sessionAppendByte(&p->rebase, (eType==SQLITE_CHANGESET_REPLACE), &rc); @@ -201051,7 +201051,7 @@ static int sessionRebaseAdd( ** is set to non-zero before returning SQLITE_OK. ** ** If the conflict handler returns SQLITE_CHANGESET_ABORT, SQLITE_ABORT is -** returned. Or, if the conflict handler returns an invalid value, +** returned. Or, if the conflict handler returns an invalid value, ** SQLITE_MISUSE. If the conflict handler returns SQLITE_CHANGESET_OMIT, ** this function returns SQLITE_OK. */ @@ -201141,16 +201141,16 @@ static int sessionConflictHandler( ** to true before returning. In this case the caller will invoke this function ** again, this time with pbRetry set to NULL. ** -** If argument pbReplace is NULL and a CHANGESET_CONFLICT conflict is +** If argument pbReplace is NULL and a CHANGESET_CONFLICT conflict is ** encountered invoke the conflict handler with CHANGESET_CONSTRAINT instead. ** Or, if pbReplace is not NULL, invoke it with CHANGESET_CONFLICT. If such ** an invocation returns SQLITE_CHANGESET_REPLACE, set *pbReplace to true ** before retrying. In this case the caller attempts to remove the conflicting -** row before invoking this function again, this time with pbReplace set +** row before invoking this function again, this time with pbReplace set ** to NULL. ** ** If any conflict handler returns SQLITE_CHANGESET_ABORT, this function -** returns SQLITE_ABORT. Otherwise, if no error occurs, SQLITE_OK is +** returns SQLITE_ABORT. Otherwise, if no error occurs, SQLITE_OK is ** returned. */ static int sessionApplyOneOp( @@ -201250,7 +201250,7 @@ static int sessionApplyOneOp( assert( op==SQLITE_INSERT ); if( p->bStat1 ){ /* Check if there is a conflicting row. For sqlite_stat1, this needs - ** to be done using a SELECT, as there is no PRIMARY KEY in the + ** to be done using a SELECT, as there is no PRIMARY KEY in the ** database schema to throw an exception if a duplicate is inserted. */ rc = sessionSeekToRow(p->db, pIter, p->abPK, p->pSelect); if( rc==SQLITE_ROW ){ @@ -201283,7 +201283,7 @@ static int sessionApplyOneOp( ** the conflict handler callback. ** ** The difference between this function and sessionApplyOne() is that this -** function handles the case where the conflict-handler is invoked and +** function handles the case where the conflict-handler is invoked and ** returns SQLITE_CHANGESET_REPLACE - indicating that the change should be ** retried in some manner. */ @@ -201303,7 +201303,7 @@ static int sessionApplyOneWithRetry( /* If the bRetry flag is set, the change has not been applied due to an ** SQLITE_CHANGESET_DATA problem (i.e. this is an UPDATE or DELETE and ** a row with the correct PK is present in the db, but one or more other - ** fields do not contain the expected values) and the conflict handler + ** fields do not contain the expected values) and the conflict handler ** returned SQLITE_CHANGESET_REPLACE. In this case retry the operation, ** but pass NULL as the final argument so that sessionApplyOneOp() ignores ** the SQLITE_CHANGESET_DATA problem. */ @@ -201321,7 +201321,7 @@ static int sessionApplyOneWithRetry( assert( pIter->op==SQLITE_INSERT ); rc = sqlite3_exec(db, "SAVEPOINT replace_op", 0, 0, 0); if( rc==SQLITE_OK ){ - rc = sessionBindRow(pIter, + rc = sessionBindRow(pIter, sqlite3changeset_new, pApply->nCol, pApply->abPK, pApply->pDelete); sqlite3_bind_int(pApply->pDelete, pApply->nCol+1, 1); } @@ -201345,7 +201345,7 @@ static int sessionApplyOneWithRetry( ** Retry the changes accumulated in the pApply->constraints buffer. */ static int sessionRetryConstraints( - sqlite3 *db, + sqlite3 *db, int bPatchset, const char *zTab, SessionApplyCtx *pApply, @@ -201393,7 +201393,7 @@ static int sessionRetryConstraints( /* ** Argument pIter is a changeset iterator that has been initialized, but -** not yet passed to sqlite3changeset_next(). This function applies the +** not yet passed to sqlite3changeset_next(). This function applies the ** changeset to the main database attached to handle "db". The supplied ** conflict handler callback is invoked to resolve any conflicts encountered ** while applying the change. @@ -201437,7 +201437,7 @@ static int sessionChangesetApply( int nCol; int op; const char *zNew; - + sqlite3changeset_op(pIter, &zNew, &nCol, &op, 0); if( zTab==0 || sqlite3_strnicmp(zNew, zTab, nTab+1) ){ @@ -201450,7 +201450,7 @@ static int sessionChangesetApply( sqlite3_free((char*)sApply.azCol); /* cast works around VC++ bug */ sqlite3_finalize(sApply.pDelete); - sqlite3_finalize(sApply.pUpdate); + sqlite3_finalize(sApply.pUpdate); sqlite3_finalize(sApply.pInsert); sqlite3_finalize(sApply.pSelect); sApply.db = db; @@ -201466,7 +201466,7 @@ static int sessionChangesetApply( sApply.bRebaseStarted = 0; memset(&sApply.constraints, 0, sizeof(SessionBuffer)); - /* If an xFilter() callback was specified, invoke it now. If the + /* If an xFilter() callback was specified, invoke it now. If the ** xFilter callback returns zero, skip this table. If it returns ** non-zero, proceed. */ schemaMismatch = (xFilter && (0==xFilter(pCtx, zNew))); @@ -201490,18 +201490,18 @@ static int sessionChangesetApply( for(i=0; iop; - /* + /* ** op1=INSERT, op2=INSERT -> Unsupported. Discard op2. ** op1=INSERT, op2=UPDATE -> INSERT. ** op1=INSERT, op2=DELETE -> (none) @@ -201813,7 +201813,7 @@ static int sessionChangeMerge( ** op1=DELETE, op2=INSERT -> UPDATE. ** op1=DELETE, op2=UPDATE -> Unsupported. Discard op2. ** op1=DELETE, op2=DELETE -> Unsupported. Discard op2. - */ + */ if( (op1==SQLITE_INSERT && op2==SQLITE_INSERT) || (op1==SQLITE_UPDATE && op2==SQLITE_INSERT) || (op1==SQLITE_DELETE && op2==SQLITE_UPDATE) @@ -201952,7 +201952,7 @@ static int sessionChangesetToHash( /* The new object must be linked on to the end of the list, not ** simply added to the start of it. This is to ensure that the - ** tables within the output of sqlite3changegroup_output() are in + ** tables within the output of sqlite3changegroup_output() are in ** the right order. */ for(ppTab=&pGrp->pList; *ppTab; ppTab=&(*ppTab)->pNext); *ppTab = pTab; @@ -201970,7 +201970,7 @@ static int sessionChangesetToHash( pTab, (pIter->bPatchset && op==SQLITE_DELETE), aRec, pTab->nChange ); - /* Search for existing entry. If found, remove it from the hash table. + /* Search for existing entry. If found, remove it from the hash table. ** Code below may link it back in. */ for(pp=&pTab->apChange[iHash]; *pp; pp=&(*pp)->pNext){ @@ -201988,7 +201988,7 @@ static int sessionChangesetToHash( } } - rc = sessionChangeMerge(pTab, bRebase, + rc = sessionChangeMerge(pTab, bRebase, pIter->bPatchset, pExist, op, bIndirect, aRec, nRec, &pChange ); if( rc ) break; @@ -202009,7 +202009,7 @@ static int sessionChangesetToHash( ** ** If xOutput is not NULL, then the changeset/patchset is returned to the ** user via one or more calls to xOutput, as with the other streaming -** interfaces. +** interfaces. ** ** Or, if xOutput is NULL, then (*ppOut) is populated with a pointer to a ** buffer containing the output changeset before this function returns. In @@ -202034,7 +202034,7 @@ static int sessionChangegroupOutput( assert( xOutput==0 || (ppOut==0 && pnOut==0) ); /* Create the serialized output changeset based on the contents of the - ** hash tables attached to the SessionTable objects in list p->pList. + ** hash tables attached to the SessionTable objects in list p->pList. */ for(pTab=pGrp->pList; rc==SQLITE_OK && pTab; pTab=pTab->pNext){ int i; @@ -202137,7 +202137,7 @@ SQLITE_API int sqlite3changegroup_add_strm( */ SQLITE_API int sqlite3changegroup_output_strm( sqlite3_changegroup *pGrp, - int (*xOutput)(void *pOut, const void *pData, int nData), + int (*xOutput)(void *pOut, const void *pData, int nData), void *pOut ){ return sessionChangegroupOutput(pGrp, xOutput, pOut, 0, 0); @@ -202153,7 +202153,7 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup *pGrp){ } } -/* +/* ** Combine two changesets together. */ SQLITE_API int sqlite3changeset_concat( @@ -202220,7 +202220,7 @@ struct sqlite3_rebaser { /* ** Buffers a1 and a2 must both contain a sessions module record nCol -** fields in size. This function appends an nCol sessions module +** fields in size. This function appends an nCol sessions module ** record to buffer pBuf that is a copy of a1, except that for ** each field that is undefined in a1[], swap in the field from a2[]. */ @@ -202255,20 +202255,20 @@ static void sessionAppendRecordMerge( } /* -** This function is called when rebasing a local UPDATE change against one +** This function is called when rebasing a local UPDATE change against one ** or more remote UPDATE changes. The aRec/nRec buffer contains the current ** old.* and new.* records for the change. The rebase buffer (a single ** record) is in aChange/nChange. The rebased change is appended to buffer ** pBuf. ** -** Rebasing the UPDATE involves: +** Rebasing the UPDATE involves: ** ** * Removing any changes to fields for which the corresponding field ** in the rebase buffer is set to "replaced" (type 0xFF). If this ** means the UPDATE change updates no fields, nothing is appended ** to the output buffer. ** -** * For each field modified by the local change for which the +** * For each field modified by the local change for which the ** corresponding field in the rebase buffer is not "undefined" (0x00) ** or "replaced" (0xFF), the old.* value is replaced by the value ** in the rebase buffer. @@ -202327,15 +202327,15 @@ static void sessionAppendPartialUpdate( } /* -** pIter is configured to iterate through a changeset. This function rebases -** that changeset according to the current configuration of the rebaser +** pIter is configured to iterate through a changeset. This function rebases +** that changeset according to the current configuration of the rebaser ** object passed as the first argument. If no error occurs and argument xOutput ** is not NULL, then the changeset is returned to the caller by invoking ** xOutput zero or more times and SQLITE_OK returned. Or, if xOutput is NULL, ** then (*ppOut) is set to point to a buffer containing the rebased changeset ** before this function returns. In this case (*pnOut) is set to the size of ** the buffer in bytes. It is the responsibility of the caller to eventually -** free the (*ppOut) buffer using sqlite3_free(). +** free the (*ppOut) buffer using sqlite3_free(). ** ** If an error occurs, an SQLite error code is returned. If ppOut and ** pnOut are not NULL, then the two output parameters are set to 0 before @@ -202413,7 +202413,7 @@ static int sessionRebase( sessionAppendByte(&sOut, SQLITE_INSERT, &rc); sessionAppendByte(&sOut, pIter->bIndirect, &rc); sessionAppendRecordMerge(&sOut, pIter->nCol, - pCsr, nRec-(pCsr-aRec), + pCsr, nRec-(pCsr-aRec), pChange->aRecord, pChange->nRecord, &rc ); } @@ -202470,7 +202470,7 @@ static int sessionRebase( return rc; } -/* +/* ** Create a new rebaser object. */ SQLITE_API int sqlite3rebaser_create(sqlite3_rebaser **ppNew){ @@ -202487,11 +202487,11 @@ SQLITE_API int sqlite3rebaser_create(sqlite3_rebaser **ppNew){ return rc; } -/* +/* ** Call this one or more times to configure a rebaser. */ SQLITE_API int sqlite3rebaser_configure( - sqlite3_rebaser *p, + sqlite3_rebaser *p, int nRebase, const void *pRebase ){ sqlite3_changeset_iter *pIter = 0; /* Iterator opened on pData/nData */ @@ -202504,15 +202504,15 @@ SQLITE_API int sqlite3rebaser_configure( return rc; } -/* -** Rebase a changeset according to current rebaser configuration +/* +** Rebase a changeset according to current rebaser configuration */ SQLITE_API int sqlite3rebaser_rebase( sqlite3_rebaser *p, - int nIn, const void *pIn, - int *pnOut, void **ppOut + int nIn, const void *pIn, + int *pnOut, void **ppOut ){ - sqlite3_changeset_iter *pIter = 0; /* Iterator to skip through input */ + sqlite3_changeset_iter *pIter = 0; /* Iterator to skip through input */ int rc = sqlite3changeset_start(&pIter, nIn, (void*)pIn); if( rc==SQLITE_OK ){ @@ -202523,8 +202523,8 @@ SQLITE_API int sqlite3rebaser_rebase( return rc; } -/* -** Rebase a changeset according to current rebaser configuration +/* +** Rebase a changeset according to current rebaser configuration */ SQLITE_API int sqlite3rebaser_rebase_strm( sqlite3_rebaser *p, @@ -202533,7 +202533,7 @@ SQLITE_API int sqlite3rebaser_rebase_strm( int (*xOutput)(void *pOut, const void *pData, int nData), void *pOut ){ - sqlite3_changeset_iter *pIter = 0; /* Iterator to skip through input */ + sqlite3_changeset_iter *pIter = 0; /* Iterator to skip through input */ int rc = sqlite3changeset_start_strm(&pIter, xInput, pIn); if( rc==SQLITE_OK ){ @@ -202544,8 +202544,8 @@ SQLITE_API int sqlite3rebaser_rebase_strm( return rc; } -/* -** Destroy a rebaser object +/* +** Destroy a rebaser object */ SQLITE_API void sqlite3rebaser_delete(sqlite3_rebaser *p){ if( p ){ @@ -202554,7 +202554,7 @@ SQLITE_API void sqlite3rebaser_delete(sqlite3_rebaser *p){ } } -/* +/* ** Global configuration */ SQLITE_API int sqlite3session_config(int op, void *pArg){ @@ -202581,9 +202581,9 @@ SQLITE_API int sqlite3session_config(int op, void *pArg){ /************** Begin file fts5.c ********************************************/ -#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS5) +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS5) -#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) +#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) # define NDEBUG 1 #endif #if defined(NDEBUG) && defined(SQLITE_DEBUG) @@ -202602,7 +202602,7 @@ SQLITE_API int sqlite3session_config(int op, void *pArg){ ** ****************************************************************************** ** -** Interfaces to extend FTS5. Using the interfaces defined in this file, +** Interfaces to extend FTS5. Using the interfaces defined in this file, ** FTS5 may be extended with: ** ** * custom tokenizers, and @@ -202647,19 +202647,19 @@ struct Fts5PhraseIter { ** EXTENSION API FUNCTIONS ** ** xUserData(pFts): -** Return a copy of the context pointer the extension function was +** Return a copy of the context pointer the extension function was ** registered with. ** ** xColumnTotalSize(pFts, iCol, pnToken): ** If parameter iCol is less than zero, set output variable *pnToken ** to the total number of tokens in the FTS5 table. Or, if iCol is ** non-negative but less than the number of columns in the table, return -** the total number of tokens in column iCol, considering all rows in +** the total number of tokens in column iCol, considering all rows in ** the FTS5 table. ** ** If parameter iCol is greater than or equal to the number of columns ** in the table, SQLITE_RANGE is returned. Or, if an error occurs (e.g. -** an OOM condition or IO error), an appropriate SQLite error code is +** an OOM condition or IO error), an appropriate SQLite error code is ** returned. ** ** xColumnCount(pFts): @@ -202673,7 +202673,7 @@ struct Fts5PhraseIter { ** ** If parameter iCol is greater than or equal to the number of columns ** in the table, SQLITE_RANGE is returned. Or, if an error occurs (e.g. -** an OOM condition or IO error), an appropriate SQLite error code is +** an OOM condition or IO error), an appropriate SQLite error code is ** returned. ** ** This function may be quite inefficient if used with an FTS5 table @@ -202700,8 +202700,8 @@ struct Fts5PhraseIter { ** an error code (i.e. SQLITE_NOMEM) if an error occurs. ** ** This API can be quite slow if used with an FTS5 table created with the -** "detail=none" or "detail=column" option. If the FTS5 table is created -** with either "detail=none" or "detail=column" and "content=" option +** "detail=none" or "detail=column" option. If the FTS5 table is created +** with either "detail=none" or "detail=column" and "content=" option ** (i.e. if it is a contentless table), then this API always returns 0. ** ** xInst: @@ -202716,7 +202716,7 @@ struct Fts5PhraseIter { ** code (i.e. SQLITE_NOMEM) if an error occurs. ** ** This API can be quite slow if used with an FTS5 table created with the -** "detail=none" or "detail=column" option. +** "detail=none" or "detail=column" option. ** ** xRowid: ** Returns the rowid of the current row. @@ -202732,11 +202732,11 @@ struct Fts5PhraseIter { ** ** with $p set to a phrase equivalent to the phrase iPhrase of the ** current query is executed. Any column filter that applies to -** phrase iPhrase of the current query is included in $p. For each -** row visited, the callback function passed as the fourth argument -** is invoked. The context and API objects passed to the callback +** phrase iPhrase of the current query is included in $p. For each +** row visited, the callback function passed as the fourth argument +** is invoked. The context and API objects passed to the callback ** function may be used to access the properties of each matched row. -** Invoking Api.xUserData() returns a copy of the pointer passed as +** Invoking Api.xUserData() returns a copy of the pointer passed as ** the third argument to pUserData. ** ** If the callback function returns any value other than SQLITE_OK, the @@ -202751,14 +202751,14 @@ struct Fts5PhraseIter { ** ** xSetAuxdata(pFts5, pAux, xDelete) ** -** Save the pointer passed as the second argument as the extension functions +** Save the pointer passed as the second argument as the extension functions ** "auxiliary data". The pointer may then be retrieved by the current or any ** future invocation of the same fts5 extension function made as part of ** the same MATCH query using the xGetAuxdata() API. ** ** Each extension function is allocated a single auxiliary data slot for -** each FTS query (MATCH expression). If the extension function is invoked -** more than once for a single FTS query, then all invocations share a +** each FTS query (MATCH expression). If the extension function is invoked +** more than once for a single FTS query, then all invocations share a ** single auxiliary data context. ** ** If there is already an auxiliary data pointer when this function is @@ -202777,7 +202777,7 @@ struct Fts5PhraseIter { ** ** xGetAuxdata(pFts5, bClear) ** -** Returns the current auxiliary data pointer for the fts5 extension +** Returns the current auxiliary data pointer for the fts5 extension ** function. See the xSetAuxdata() method for details. ** ** If the bClear argument is non-zero, then the auxiliary data is cleared @@ -202797,7 +202797,7 @@ struct Fts5PhraseIter { ** method, to iterate through all instances of a single query phrase within ** the current row. This is the same information as is accessible via the ** xInstCount/xInst APIs. While the xInstCount/xInst APIs are more convenient -** to use, this API may be faster under some circumstances. To iterate +** to use, this API may be faster under some circumstances. To iterate ** through instances of phrase iPhrase, use the following code: ** ** Fts5PhraseIter iter; @@ -202815,8 +202815,8 @@ struct Fts5PhraseIter { ** xPhraseFirstColumn() and xPhraseNextColumn() as illustrated below). ** ** This API can be quite slow if used with an FTS5 table created with the -** "detail=none" or "detail=column" option. If the FTS5 table is created -** with either "detail=none" or "detail=column" and "content=" option +** "detail=none" or "detail=column" option. If the FTS5 table is created +** with either "detail=none" or "detail=column" and "content=" option ** (i.e. if it is a contentless table), then this API always iterates ** through an empty set (all calls to xPhraseFirst() set iCol to -1). ** @@ -202840,16 +202840,16 @@ struct Fts5PhraseIter { ** } ** ** This API can be quite slow if used with an FTS5 table created with the -** "detail=none" option. If the FTS5 table is created with either -** "detail=none" "content=" option (i.e. if it is a contentless table), -** then this API always iterates through an empty set (all calls to +** "detail=none" option. If the FTS5 table is created with either +** "detail=none" "content=" option (i.e. if it is a contentless table), +** then this API always iterates through an empty set (all calls to ** xPhraseFirstColumn() set iCol to -1). ** ** The information accessed using this API and its companion ** xPhraseFirstColumn() may also be obtained using xPhraseFirst/xPhraseNext ** (or xInst/xInstCount). The chief advantage of this API is that it is ** significantly more efficient than those alternatives when used with -** "detail=column" tables. +** "detail=column" tables. ** ** xPhraseNextColumn() ** See xPhraseFirstColumn above. @@ -202863,7 +202863,7 @@ struct Fts5ExtensionApi { int (*xRowCount)(Fts5Context*, sqlite3_int64 *pnRow); int (*xColumnTotalSize)(Fts5Context*, int iCol, sqlite3_int64 *pnToken); - int (*xTokenize)(Fts5Context*, + int (*xTokenize)(Fts5Context*, const char *pText, int nText, /* Text to tokenize */ void *pCtx, /* Context passed to xToken() */ int (*xToken)(void*, int, const char*, int, int, int) /* Callback */ @@ -202892,15 +202892,15 @@ struct Fts5ExtensionApi { void (*xPhraseNextColumn)(Fts5Context*, Fts5PhraseIter*, int *piCol); }; -/* +/* ** CUSTOM AUXILIARY FUNCTIONS *************************************************************************/ /************************************************************************* ** CUSTOM TOKENIZERS ** -** Applications may also register custom tokenizer types. A tokenizer -** is registered by providing fts5 with a populated instance of the +** Applications may also register custom tokenizer types. A tokenizer +** is registered by providing fts5 with a populated instance of the ** following structure. All structure methods must be defined, setting ** any member of the fts5_tokenizer struct to NULL leads to undefined ** behaviour. The structure methods are expected to function as follows: @@ -202911,16 +202911,16 @@ struct Fts5ExtensionApi { ** ** The first argument passed to this function is a copy of the (void*) ** pointer provided by the application when the fts5_tokenizer object -** was registered with FTS5 (the third argument to xCreateTokenizer()). +** was registered with FTS5 (the third argument to xCreateTokenizer()). ** The second and third arguments are an array of nul-terminated strings ** containing the tokenizer arguments, if any, specified following the ** tokenizer name as part of the CREATE VIRTUAL TABLE statement used ** to create the FTS5 table. ** -** The final argument is an output variable. If successful, (*ppOut) +** The final argument is an output variable. If successful, (*ppOut) ** should be set to point to the new tokenizer handle and SQLITE_OK ** returned. If an error occurs, some value other than SQLITE_OK should -** be returned. In this case, fts5 assumes that the final value of *ppOut +** be returned. In this case, fts5 assumes that the final value of *ppOut ** is undefined. ** ** xDelete: @@ -202929,7 +202929,7 @@ struct Fts5ExtensionApi { ** be invoked exactly once for each successful call to xCreate(). ** ** xTokenize: -** This function is expected to tokenize the nText byte string indicated +** This function is expected to tokenize the nText byte string indicated ** by argument pText. pText may or may not be nul-terminated. The first ** argument passed to this function is a pointer to an Fts5Tokenizer object ** returned by an earlier call to xCreate(). @@ -202943,8 +202943,8 @@ struct Fts5ExtensionApi { ** determine the set of tokens to add to (or delete from) the ** FTS index. ** -**
          • FTS5_TOKENIZE_QUERY - A MATCH query is being executed -** against the FTS index. The tokenizer is being called to tokenize +**
          • FTS5_TOKENIZE_QUERY - A MATCH query is being executed +** against the FTS index. The tokenizer is being called to tokenize ** a bareword or quoted string specified as part of the query. ** **
          • (FTS5_TOKENIZE_QUERY | FTS5_TOKENIZE_PREFIX) - Same as @@ -202952,10 +202952,10 @@ struct Fts5ExtensionApi { ** followed by a "*" character, indicating that the last token ** returned by the tokenizer will be treated as a token prefix. ** -**
          • FTS5_TOKENIZE_AUX - The tokenizer is being invoked to +**
          • FTS5_TOKENIZE_AUX - The tokenizer is being invoked to ** satisfy an fts5_api.xTokenize() request made by an auxiliary ** function. Or an fts5_api.xColumnSize() request made by the same -** on a columnsize=0 database. +** on a columnsize=0 database. ** ** ** For each token in the input string, the supplied callback xToken() must @@ -202967,10 +202967,10 @@ struct Fts5ExtensionApi { ** which the token is derived within the input. ** ** The second argument passed to the xToken() callback ("tflags") should -** normally be set to 0. The exception is if the tokenizer supports +** normally be set to 0. The exception is if the tokenizer supports ** synonyms. In this case see the discussion below for details. ** -** FTS5 assumes the xToken() callback is invoked for each token in the +** FTS5 assumes the xToken() callback is invoked for each token in the ** order that they occur within the input text. ** ** If an xToken() callback returns any value other than SQLITE_OK, then @@ -202984,7 +202984,7 @@ struct Fts5ExtensionApi { ** SYNONYM SUPPORT ** ** Custom tokenizers may also support synonyms. Consider a case in which a -** user wishes to query for a phrase such as "first place". Using the +** user wishes to query for a phrase such as "first place". Using the ** built-in tokenizers, the FTS5 query 'first + place' will match instances ** of "first place" within the document set, but not alternative forms ** such as "1st place". In some applications, it would be better to match @@ -202993,7 +202993,7 @@ struct Fts5ExtensionApi { ** ** There are several ways to approach this in FTS5: ** -**
            1. By mapping all synonyms to a single token. In this case, the +**
              1. By mapping all synonyms to a single token. In this case, the ** In the above example, this means that the tokenizer returns the ** same token for inputs "first" and "1st". Say that token is in ** fact "first", so that when the user inserts the document "I won @@ -203004,34 +203004,34 @@ struct Fts5ExtensionApi { ** **
              2. By querying the index for all synonyms of each query term ** separately. In this case, when tokenizing query text, the -** tokenizer may provide multiple synonyms for a single term -** within the document. FTS5 then queries the index for each +** tokenizer may provide multiple synonyms for a single term +** within the document. FTS5 then queries the index for each ** synonym individually. For example, faced with the query: ** ** ** ... MATCH 'first place' ** ** the tokenizer offers both "1st" and "first" as synonyms for the -** first token in the MATCH query and FTS5 effectively runs a query +** first token in the MATCH query and FTS5 effectively runs a query ** similar to: ** ** ** ... MATCH '(first OR 1st) place' ** ** except that, for the purposes of auxiliary functions, the query -** still appears to contain just two phrases - "(first OR 1st)" +** still appears to contain just two phrases - "(first OR 1st)" ** being treated as a single phrase. ** **
              3. By adding multiple synonyms for a single term to the FTS index. ** Using this method, when tokenizing document text, the tokenizer -** provides multiple synonyms for each token. So that when a +** provides multiple synonyms for each token. So that when a ** document such as "I won first place" is tokenized, entries are ** added to the FTS index for "i", "won", "first", "1st" and ** "place". ** ** This way, even if the tokenizer does not provide synonyms ** when tokenizing query text (it should not - to do so would be -** inefficient), it doesn't matter if the user queries for +** inefficient), it doesn't matter if the user queries for ** 'first + place' or '1st + place', as there are entries in the ** FTS index corresponding to both forms of the first token. **
              @@ -203052,11 +203052,11 @@ struct Fts5ExtensionApi { ** ** It is an error to specify the FTS5_TOKEN_COLOCATED flag the first time ** xToken() is called. Multiple synonyms may be specified for a single token -** by making multiple calls to xToken(FTS5_TOKEN_COLOCATED) in sequence. +** by making multiple calls to xToken(FTS5_TOKEN_COLOCATED) in sequence. ** There is no limit to the number of synonyms that may be provided for a ** single token. ** -** In many cases, method (1) above is the best approach. It does not add +** In many cases, method (1) above is the best approach. It does not add ** extra data to the FTS index or require FTS5 to query for multiple terms, ** so it is efficient in terms of disk space and query speed. However, it ** does not support prefix queries very well. If, as suggested above, the @@ -203068,18 +203068,18 @@ struct Fts5ExtensionApi { ** will not match documents that contain the token "1st" (as the tokenizer ** will probably not map "1s" to any prefix of "first"). ** -** For full prefix support, method (3) may be preferred. In this case, +** For full prefix support, method (3) may be preferred. In this case, ** because the index contains entries for both "first" and "1st", prefix ** queries such as 'fi*' or '1s*' will match correctly. However, because ** extra entries are added to the FTS index, this method uses more space ** within the database. ** ** Method (2) offers a midpoint between (1) and (3). Using this method, -** a query such as '1s*' will match documents that contain the literal +** a query such as '1s*' will match documents that contain the literal ** token "1st", but not "first" (assuming the tokenizer is not able to ** provide synonyms for prefixes). However, a non-prefix query like '1st' ** will match against "1st" and "first". This method does not require -** extra disk space, as no extra entries are added to the FTS index. +** extra disk space, as no extra entries are added to the FTS index. ** On the other hand, it may require more CPU cycles to run MATCH queries, ** as separate queries of the FTS index are required for each synonym. ** @@ -203093,10 +203093,10 @@ typedef struct fts5_tokenizer fts5_tokenizer; struct fts5_tokenizer { int (*xCreate)(void*, const char **azArg, int nArg, Fts5Tokenizer **ppOut); void (*xDelete)(Fts5Tokenizer*); - int (*xTokenize)(Fts5Tokenizer*, + int (*xTokenize)(Fts5Tokenizer*, void *pCtx, int flags, /* Mask of FTS5_TOKENIZE_* flags */ - const char *pText, int nText, + const char *pText, int nText, int (*xToken)( void *pCtx, /* Copy of 2nd argument to xTokenize() */ int tflags, /* Mask of FTS5_TOKEN_* flags */ @@ -203217,7 +203217,7 @@ typedef sqlite3_uint64 u64; #endif -/* Truncate very long tokens to this many bytes. Hard limit is +/* Truncate very long tokens to this many bytes. Hard limit is ** (65536-1-1-4-9)==65521 bytes. The limiting factor is the 16-bit offset ** field that occurs at the start of each leaf page (see fts5_index.c). */ #define FTS5_MAX_TOKEN_SIZE 32768 @@ -203245,7 +203245,7 @@ static int sqlite3Fts5Corrupt(void); /* ** The assert_nc() macro is similar to the assert() macro, except that it -** is used for assert() conditions that are true only if it can be +** is used for assert() conditions that are true only if it can be ** guranteed that the database is not corrupt. */ #ifdef SQLITE_DEBUG @@ -203274,7 +203274,7 @@ SQLITE_API extern int sqlite3_fts5_may_be_corrupt; typedef struct Fts5Global Fts5Global; typedef struct Fts5Colset Fts5Colset; -/* If a NEAR() clump or phrase may only match a specific set of columns, +/* If a NEAR() clump or phrase may only match a specific set of columns, ** then an object of the following type is used to record the set of columns. ** Each entry in the aiCol[] array is a column that may be matched. ** @@ -203302,20 +203302,20 @@ typedef struct Fts5Config Fts5Config; ** ** nAutomerge: ** The minimum number of segments that an auto-merge operation should -** attempt to merge together. A value of 1 sets the object to use the +** attempt to merge together. A value of 1 sets the object to use the ** compile time default. Zero disables auto-merge altogether. ** ** zContent: ** ** zContentRowid: -** The value of the content_rowid= option, if one was specified. Or +** The value of the content_rowid= option, if one was specified. Or ** the string "rowid" otherwise. This text is not quoted - if it is ** used as part of an SQL statement it needs to be quoted appropriately. ** ** zContentExprlist: ** ** pzErrmsg: -** This exists in order to allow the fts5_index.c module to return a +** This exists in order to allow the fts5_index.c module to return a ** decent error message if it encounters a file-format version it does ** not understand. ** @@ -203339,8 +203339,8 @@ struct Fts5Config { int nPrefix; /* Number of prefix indexes */ int *aPrefix; /* Sizes in bytes of nPrefix prefix indexes */ int eContent; /* An FTS5_CONTENT value */ - char *zContent; /* content table */ - char *zContentRowid; /* "content_rowid=" option value */ + char *zContent; /* content table */ + char *zContentRowid; /* "content_rowid=" option value */ int bColumnsize; /* "columnsize=" option value (dflt==1) */ int eDetail; /* FTS5_DETAIL_XXX value */ char *zContentExprlist; @@ -203542,27 +203542,27 @@ static int sqlite3Fts5IndexClose(Fts5Index *p); ** Return a simple checksum value based on the arguments. */ static u64 sqlite3Fts5IndexEntryCksum( - i64 iRowid, - int iCol, - int iPos, + i64 iRowid, + int iCol, + int iPos, int iIdx, const char *pTerm, int nTerm ); /* -** Argument p points to a buffer containing utf-8 text that is n bytes in +** Argument p points to a buffer containing utf-8 text that is n bytes in ** size. Return the number of bytes in the nChar character prefix of the ** buffer, or 0 if there are less than nChar characters in total. */ static int sqlite3Fts5IndexCharlenToBytelen( - const char *p, - int nByte, + const char *p, + int nByte, int nChar ); /* -** Open a new iterator to iterate though all rowids that match the +** Open a new iterator to iterate though all rowids that match the ** specified token or token prefix. */ static int sqlite3Fts5IndexQuery( @@ -203593,7 +203593,7 @@ static int sqlite3Fts5IterNextScan(Fts5IndexIter*); /* -** Insert or remove data to or from the index. Each time a document is +** Insert or remove data to or from the index. Each time a document is ** added to or removed from the index, this function is called one or more ** times. ** @@ -203628,7 +203628,7 @@ static int sqlite3Fts5IndexSync(Fts5Index *p); /* ** Discard any data stored in the in-memory hash tables. Do not write it ** to the database. Additionally, assume that the contents of the %_data -** table may have changed on disk. So any in-memory caches of %_data +** table may have changed on disk. So any in-memory caches of %_data ** records must be invalidated. */ static int sqlite3Fts5IndexRollback(Fts5Index *p); @@ -203644,16 +203644,16 @@ static int sqlite3Fts5IndexSetAverages(Fts5Index *p, const u8*, int); */ static int sqlite3Fts5IndexIntegrityCheck(Fts5Index*, u64 cksum); -/* -** Called during virtual module initialization to register UDF -** fts5_decode() with SQLite +/* +** Called during virtual module initialization to register UDF +** fts5_decode() with SQLite */ static int sqlite3Fts5IndexInit(sqlite3*); static int sqlite3Fts5IndexSetCookie(Fts5Index*, int); /* -** Return the total number of entries read from the %_data table by +** Return the total number of entries read from the %_data table by ** this connection since it was created. */ static int sqlite3Fts5IndexReads(Fts5Index *p); @@ -203670,7 +203670,7 @@ static int sqlite3Fts5IndexLoadConfig(Fts5Index *p); **************************************************************************/ /************************************************************************** -** Interface to code in fts5_varint.c. +** Interface to code in fts5_varint.c. */ static int sqlite3Fts5GetVarint32(const unsigned char *p, u32 *v); static int sqlite3Fts5GetVarintLen(u32 iVal); @@ -203695,7 +203695,7 @@ static int sqlite3Fts5PutVarint(unsigned char *p, u64 v); /************************************************************************** -** Interface to code in fts5_main.c. +** Interface to code in fts5_main.c. */ /* @@ -203709,7 +203709,7 @@ struct Fts5Table { }; static int sqlite3Fts5GetTokenizer( - Fts5Global*, + Fts5Global*, const char **azArg, int nArg, Fts5Tokenizer**, @@ -203726,7 +203726,7 @@ static int sqlite3Fts5FlushToDisk(Fts5Table*); **************************************************************************/ /************************************************************************** -** Interface to code in fts5_hash.c. +** Interface to code in fts5_hash.c. */ typedef struct Fts5Hash Fts5Hash; @@ -203776,7 +203776,7 @@ static void sqlite3Fts5HashScanEntry(Fts5Hash *, **************************************************************************/ /************************************************************************** -** Interface to code in fts5_storage.c. fts5_storage.c contains contains +** Interface to code in fts5_storage.c. fts5_storage.c contains contains ** code to access the data stored in the %_content and %_docsize tables. */ @@ -203825,7 +203825,7 @@ static int sqlite3Fts5StorageReset(Fts5Storage *p); /************************************************************************** -** Interface to code in fts5_expr.c. +** Interface to code in fts5_expr.c. */ typedef struct Fts5Expr Fts5Expr; typedef struct Fts5ExprNode Fts5ExprNode; @@ -203841,10 +203841,10 @@ struct Fts5Token { /* Parse a MATCH expression. */ static int sqlite3Fts5ExprNew( - Fts5Config *pConfig, + Fts5Config *pConfig, int iCol, /* Column on LHS of MATCH operator */ const char *zExpr, - Fts5Expr **ppNew, + Fts5Expr **ppNew, char **pzErr ); @@ -203905,8 +203905,8 @@ static Fts5ExprNode *sqlite3Fts5ParseImplicitAnd( ); static Fts5ExprPhrase *sqlite3Fts5ParseTerm( - Fts5Parse *pParse, - Fts5ExprPhrase *pPhrase, + Fts5Parse *pParse, + Fts5ExprPhrase *pPhrase, Fts5Token *pToken, int bPrefix ); @@ -203914,14 +203914,14 @@ static Fts5ExprPhrase *sqlite3Fts5ParseTerm( static void sqlite3Fts5ParseSetCaret(Fts5ExprPhrase*); static Fts5ExprNearset *sqlite3Fts5ParseNearset( - Fts5Parse*, + Fts5Parse*, Fts5ExprNearset*, - Fts5ExprPhrase* + Fts5ExprPhrase* ); static Fts5Colset *sqlite3Fts5ParseColset( - Fts5Parse*, - Fts5Colset*, + Fts5Parse*, + Fts5Colset*, Fts5Token * ); @@ -203942,7 +203942,7 @@ static void sqlite3Fts5ParseNear(Fts5Parse *pParse, Fts5Token*); /************************************************************************** -** Interface to code in fts5_aux.c. +** Interface to code in fts5_aux.c. */ static int sqlite3Fts5AuxInit(fts5_api*); @@ -203951,7 +203951,7 @@ static int sqlite3Fts5AuxInit(fts5_api*); **************************************************************************/ /************************************************************************** -** Interface to code in fts5_tokenizer.c. +** Interface to code in fts5_tokenizer.c. */ static int sqlite3Fts5TokenizerInit(fts5_api*); @@ -203960,7 +203960,7 @@ static int sqlite3Fts5TokenizerInit(fts5_api*); **************************************************************************/ /************************************************************************** -** Interface to code in fts5_vocab.c. +** Interface to code in fts5_vocab.c. */ static int sqlite3Fts5VocabInit(Fts5Global*, sqlite3*); @@ -203971,7 +203971,7 @@ static int sqlite3Fts5VocabInit(Fts5Global*, sqlite3*); /************************************************************************** -** Interface to automatically generated code in fts5_unicode2.c. +** Interface to automatically generated code in fts5_unicode2.c. */ static int sqlite3Fts5UnicodeIsdiacritic(int c); static int sqlite3Fts5UnicodeFold(int c, int bRemoveDiacritic); @@ -204085,7 +204085,7 @@ static void sqlite3Fts5UnicodeAscii(u8*, u8*); ** the minor type might be the name of the identifier. ** Each non-terminal can have a different minor type. ** Terminal symbols all have the same minor type, though. -** This macros defines the minor type for terminal +** This macros defines the minor type for terminal ** symbols. ** fts5YYMINORTYPE is the data type used for all minor types. ** This is typically a union of many types, one of @@ -204173,7 +204173,7 @@ typedef union { /* Next are the tables used to determine what action to take based on the ** current state and lookahead token. These tables are used to implement ** functions that take a state number and lookahead value and return an -** action integer. +** action integer. ** ** Suppose the action integer is N. Then the action is determined as ** follows @@ -204273,9 +204273,9 @@ static const fts5YYACTIONTYPE fts5yy_default[] = { }; /********** End of lemon-generated parsing tables *****************************/ -/* The next table maps tokens (terminal symbols) into fallback tokens. +/* The next table maps tokens (terminal symbols) into fallback tokens. ** If a construct like the following: -** +** ** %fallback ID X Y Z. ** ** appears in the grammar, then ID becomes a fallback token for X, Y, @@ -204347,10 +204347,10 @@ static char *fts5yyTracePrompt = 0; #endif /* NDEBUG */ #ifndef NDEBUG -/* +/* ** Turn parser tracing on by giving a stream to which to write the trace ** and a prompt to preface each trace message. Tracing is turned off -** by making either argument NULL +** by making either argument NULL ** ** Inputs: **
                @@ -204375,7 +204375,7 @@ static void sqlite3Fts5ParserTrace(FILE *TraceFILE, char *zTracePrompt){ #if defined(fts5YYCOVERAGE) || !defined(NDEBUG) /* For tracing shifts, the names of all terminals and nonterminals ** are required. The following table supplies these names */ -static const char *const fts5yyTokenName[] = { +static const char *const fts5yyTokenName[] = { /* 0 */ "$", /* 1 */ "OR", /* 2 */ "AND", @@ -204471,7 +204471,7 @@ static int fts5yyGrowStack(fts5yyParser *p){ #endif p->fts5yystksz = newSize; } - return pNew==0; + return pNew==0; } #endif @@ -204513,7 +204513,7 @@ static void sqlite3Fts5ParserInit(void *fts5yypRawParser sqlite3Fts5ParserCTX_PD } #ifndef sqlite3Fts5Parser_ENGINEALWAYSONSTACK -/* +/* ** This function allocates a new parser. ** The only argument is a pointer to a function which works like ** malloc. @@ -204540,7 +204540,7 @@ static void *sqlite3Fts5ParserAlloc(void *(*mallocProc)(fts5YYMALLOCARGTYPE) sql /* The following function deletes the "minor type" or semantic value ** associated with a symbol. The symbol can be either a terminal ** or nonterminal. "fts5yymajor" is the symbol code, and "fts5yypminor" is -** a pointer to the value to be deleted. The code used to do the +** a pointer to the value to be deleted. The code used to do the ** deletions is derived from the %destructor and/or %token_destructor ** directives of the input grammar. */ @@ -204555,7 +204555,7 @@ static void fts5yy_destructor( /* Here is inserted the actions which take place when a ** terminal or non-terminal is destroyed. This can happen ** when the symbol is popped from the stack during a - ** reduce or during error processing or when a parser is + ** reduce or during error processing or when a parser is ** being destroyed before it is finished parsing. ** ** Note: during a reduce, the only symbols destroyed are those @@ -204565,31 +204565,31 @@ static void fts5yy_destructor( /********* Begin destructor definitions ***************************************/ case 16: /* input */ { - (void)pParse; + (void)pParse; } break; case 17: /* expr */ case 18: /* cnearset */ case 19: /* exprlist */ { - sqlite3Fts5ParseNodeFree((fts5yypminor->fts5yy24)); + sqlite3Fts5ParseNodeFree((fts5yypminor->fts5yy24)); } break; case 20: /* colset */ case 21: /* colsetlist */ { - sqlite3_free((fts5yypminor->fts5yy11)); + sqlite3_free((fts5yypminor->fts5yy11)); } break; case 22: /* nearset */ case 23: /* nearphrases */ { - sqlite3Fts5ParseNearsetFree((fts5yypminor->fts5yy46)); + sqlite3Fts5ParseNearsetFree((fts5yypminor->fts5yy46)); } break; case 24: /* phrase */ { - sqlite3Fts5ParsePhraseFree((fts5yypminor->fts5yy53)); + sqlite3Fts5ParsePhraseFree((fts5yypminor->fts5yy53)); } break; /********* End destructor definitions *****************************************/ @@ -204630,7 +204630,7 @@ static void sqlite3Fts5ParserFinalize(void *p){ } #ifndef sqlite3Fts5Parser_ENGINEALWAYSONSTACK -/* +/* ** Deallocate and destroy a parser. Destructors are called for ** all stack elements before shutting the parser down. ** @@ -204852,7 +204852,7 @@ static void fts5yy_shift( assert( fts5yypParser->fts5yyhwm == (int)(fts5yypParser->fts5yytos - fts5yypParser->fts5yystack) ); } #endif -#if fts5YYSTACKDEPTH>0 +#if fts5YYSTACKDEPTH>0 if( fts5yypParser->fts5yytos>fts5yypParser->fts5yystackEnd ){ fts5yypParser->fts5yytos--; fts5yyStackOverflow(fts5yypParser); @@ -204994,7 +204994,7 @@ static fts5YYACTIONTYPE fts5yy_reduce( assert( fts5yypParser->fts5yyhwm == (int)(fts5yypParser->fts5yytos - fts5yypParser->fts5yystack)); } #endif -#if fts5YYSTACKDEPTH>0 +#if fts5YYSTACKDEPTH>0 if( fts5yypParser->fts5yytos>=fts5yypParser->fts5yystackEnd ){ fts5yyStackOverflow(fts5yypParser); /* The call to fts5yyStackOverflow() above pops the stack until it is @@ -205031,7 +205031,7 @@ static fts5YYACTIONTYPE fts5yy_reduce( { sqlite3Fts5ParseFinished(pParse, fts5yymsp[0].minor.fts5yy24); } break; case 1: /* colset ::= MINUS LCP colsetlist RCP */ -{ +{ fts5yymsp[-3].minor.fts5yy11 = sqlite3Fts5ParseColsetInvert(pParse, fts5yymsp[-1].minor.fts5yy11); } break; @@ -205051,13 +205051,13 @@ static fts5YYACTIONTYPE fts5yy_reduce( } break; case 5: /* colsetlist ::= colsetlist STRING */ -{ +{ fts5yylhsminor.fts5yy11 = sqlite3Fts5ParseColset(pParse, fts5yymsp[-1].minor.fts5yy11, &fts5yymsp[0].minor.fts5yy0); } fts5yymsp[-1].minor.fts5yy11 = fts5yylhsminor.fts5yy11; break; case 6: /* colsetlist ::= STRING */ -{ - fts5yylhsminor.fts5yy11 = sqlite3Fts5ParseColset(pParse, 0, &fts5yymsp[0].minor.fts5yy0); +{ + fts5yylhsminor.fts5yy11 = sqlite3Fts5ParseColset(pParse, 0, &fts5yymsp[0].minor.fts5yy0); } fts5yymsp[0].minor.fts5yy11 = fts5yylhsminor.fts5yy11; break; @@ -205101,14 +205101,14 @@ static fts5YYACTIONTYPE fts5yy_reduce( fts5yymsp[-1].minor.fts5yy24 = fts5yylhsminor.fts5yy24; break; case 15: /* cnearset ::= nearset */ -{ - fts5yylhsminor.fts5yy24 = sqlite3Fts5ParseNode(pParse, FTS5_STRING, 0, 0, fts5yymsp[0].minor.fts5yy46); +{ + fts5yylhsminor.fts5yy24 = sqlite3Fts5ParseNode(pParse, FTS5_STRING, 0, 0, fts5yymsp[0].minor.fts5yy46); } fts5yymsp[0].minor.fts5yy24 = fts5yylhsminor.fts5yy24; break; case 16: /* cnearset ::= colset COLON nearset */ -{ - fts5yylhsminor.fts5yy24 = sqlite3Fts5ParseNode(pParse, FTS5_STRING, 0, 0, fts5yymsp[0].minor.fts5yy46); +{ + fts5yylhsminor.fts5yy24 = sqlite3Fts5ParseNode(pParse, FTS5_STRING, 0, 0, fts5yymsp[0].minor.fts5yy46); sqlite3Fts5ParseSetColset(pParse, fts5yylhsminor.fts5yy24, fts5yymsp[-2].minor.fts5yy11); } fts5yymsp[-2].minor.fts5yy24 = fts5yylhsminor.fts5yy24; @@ -205118,9 +205118,9 @@ static fts5YYACTIONTYPE fts5yy_reduce( fts5yymsp[0].minor.fts5yy46 = fts5yylhsminor.fts5yy46; break; case 18: /* nearset ::= CARET phrase */ -{ +{ sqlite3Fts5ParseSetCaret(fts5yymsp[0].minor.fts5yy53); - fts5yymsp[-1].minor.fts5yy46 = sqlite3Fts5ParseNearset(pParse, 0, fts5yymsp[0].minor.fts5yy53); + fts5yymsp[-1].minor.fts5yy46 = sqlite3Fts5ParseNearset(pParse, 0, fts5yymsp[0].minor.fts5yy53); } break; case 19: /* nearset ::= STRING LP nearphrases neardist_opt RP */ @@ -205132,8 +205132,8 @@ static fts5YYACTIONTYPE fts5yy_reduce( fts5yymsp[-4].minor.fts5yy46 = fts5yylhsminor.fts5yy46; break; case 20: /* nearphrases ::= phrase */ -{ - fts5yylhsminor.fts5yy46 = sqlite3Fts5ParseNearset(pParse, 0, fts5yymsp[0].minor.fts5yy53); +{ + fts5yylhsminor.fts5yy46 = sqlite3Fts5ParseNearset(pParse, 0, fts5yymsp[0].minor.fts5yy53); } fts5yymsp[0].minor.fts5yy46 = fts5yylhsminor.fts5yy46; break; @@ -205150,13 +205150,13 @@ static fts5YYACTIONTYPE fts5yy_reduce( { fts5yymsp[-1].minor.fts5yy0 = fts5yymsp[0].minor.fts5yy0; } break; case 24: /* phrase ::= phrase PLUS STRING star_opt */ -{ +{ fts5yylhsminor.fts5yy53 = sqlite3Fts5ParseTerm(pParse, fts5yymsp[-3].minor.fts5yy53, &fts5yymsp[-1].minor.fts5yy0, fts5yymsp[0].minor.fts5yy4); } fts5yymsp[-3].minor.fts5yy53 = fts5yylhsminor.fts5yy53; break; case 25: /* phrase ::= STRING star_opt */ -{ +{ fts5yylhsminor.fts5yy53 = sqlite3Fts5ParseTerm(pParse, 0, &fts5yymsp[-1].minor.fts5yy0, fts5yymsp[0].minor.fts5yy4); } fts5yymsp[-1].minor.fts5yy53 = fts5yylhsminor.fts5yy53; @@ -205347,7 +205347,7 @@ static void sqlite3Fts5Parser( #ifdef fts5YYERRORSYMBOL /* A syntax error has occurred. ** The response to an error depends upon whether or not the - ** grammar defines an error token "ERROR". + ** grammar defines an error token "ERROR". ** ** This is what we do if the grammar does define ERROR: ** @@ -205483,7 +205483,7 @@ static int sqlite3Fts5ParserFallback(int iToken){ #include /* amalgamator: keep */ /* -** Object used to iterate through all "coalesced phrase instances" in +** Object used to iterate through all "coalesced phrase instances" in ** a single column of the current row. If the phrase instances in the ** column being considered do not overlap, this object simply iterates ** through them. Or, if they do overlap (share one or more tokens in @@ -205546,7 +205546,7 @@ static int fts5CInstIterNext(CInstIter *pIter){ } /* -** Initialize the iterator object indicated by the final parameter to +** Initialize the iterator object indicated by the final parameter to ** iterate through coalesced phrase instances in column iCol. */ static int fts5CInstIterInit( @@ -205591,16 +205591,16 @@ struct HighlightContext { /* ** Append text to the HighlightContext output string - p->zOut. Argument -** z points to a buffer containing n bytes of text to append. If n is +** z points to a buffer containing n bytes of text to append. If n is ** negative, everything up until the first '\0' is appended to the output. ** -** If *pRc is set to any value other than SQLITE_OK when this function is -** called, it is a no-op. If an error (i.e. an OOM condition) is encountered, -** *pRc is set to an error code before returning. +** If *pRc is set to any value other than SQLITE_OK when this function is +** called, it is a no-op. If an error (i.e. an OOM condition) is encountered, +** *pRc is set to an error code before returning. */ static void fts5HighlightAppend( - int *pRc, - HighlightContext *p, + int *pRc, + HighlightContext *p, const char *z, int n ){ if( *pRc==SQLITE_OK && z ){ @@ -205827,7 +205827,7 @@ static int fts5SnippetScore( } /* -** Return the value in pVal interpreted as utf-8 text. Except, if pVal +** Return the value in pVal interpreted as utf-8 text. Except, if pVal ** contains a NULL value, return a pointer to a static string zero ** bytes in length instead of a NULL pointer. */ @@ -205896,7 +205896,7 @@ static void fts5SnippetFunction( sFinder.nFirst = 0; rc = pApi->xColumnText(pFts, i, &sFinder.zDoc, &nDoc); if( rc!=SQLITE_OK ) break; - rc = pApi->xTokenize(pFts, + rc = pApi->xTokenize(pFts, sFinder.zDoc, nDoc, (void*)&sFinder,fts5SentenceFinderCb ); if( rc!=SQLITE_OK ) break; @@ -205931,7 +205931,7 @@ static void fts5SnippetFunction( if( sFinder.aFirst[jj]nPhrase; i++){ score += pData->aIDF[i] * ( - ( aFreq[i] * (k1 + 1.0) ) / + ( aFreq[i] * (k1 + 1.0) ) / ( aFreq[i] + k1 * (1 - b + b * D / pData->avgdl) ) ); } - + /* If no error has occurred, return the calculated score. Otherwise, ** throw an SQL exception. */ if( rc==SQLITE_OK ){ @@ -206240,14 +206240,14 @@ static int sqlite3Fts5Get32(const u8 *aBuf){ } /* -** Append buffer nData/pData to buffer pBuf. If an OOM error occurs, set +** Append buffer nData/pData to buffer pBuf. If an OOM error occurs, set ** the error code in p. If an error has already occurred when this function ** is called, it is a no-op. */ static void sqlite3Fts5BufferAppendBlob( int *pRc, - Fts5Buffer *pBuf, - u32 nData, + Fts5Buffer *pBuf, + u32 nData, const u8 *pData ){ assert_nc( *pRc || nData>=0 ); @@ -206260,12 +206260,12 @@ static void sqlite3Fts5BufferAppendBlob( /* ** Append the nul-terminated string zStr to the buffer pBuf. This function -** ensures that the byte following the buffer data is set to 0x00, even +** ensures that the byte following the buffer data is set to 0x00, even ** though this byte is not included in the pBuf->n count. */ static void sqlite3Fts5BufferAppendString( int *pRc, - Fts5Buffer *pBuf, + Fts5Buffer *pBuf, const char *zStr ){ int nStr = (int)strlen(zStr); @@ -206277,13 +206277,13 @@ static void sqlite3Fts5BufferAppendString( ** Argument zFmt is a printf() style format string. This function performs ** the printf() style processing, then appends the results to buffer pBuf. ** -** Like sqlite3Fts5BufferAppendString(), this function ensures that the byte +** Like sqlite3Fts5BufferAppendString(), this function ensures that the byte ** following the buffer data is set to 0x00, even though this byte is not ** included in the pBuf->n count. -*/ +*/ static void sqlite3Fts5BufferAppendPrintf( int *pRc, - Fts5Buffer *pBuf, + Fts5Buffer *pBuf, char *zFmt, ... ){ if( *pRc==SQLITE_OK ){ @@ -206310,12 +206310,12 @@ static char *sqlite3Fts5Mprintf(int *pRc, const char *zFmt, ...){ zRet = sqlite3_vmprintf(zFmt, ap); va_end(ap); if( zRet==0 ){ - *pRc = SQLITE_NOMEM; + *pRc = SQLITE_NOMEM; } } return zRet; } - + /* ** Free any buffer allocated by pBuf. Zero the structure before returning. @@ -206326,7 +206326,7 @@ static void sqlite3Fts5BufferFree(Fts5Buffer *pBuf){ } /* -** Zero the contents of the buffer object. But do not free the associated +** Zero the contents of the buffer object. But do not free the associated ** memory allocation. */ static void sqlite3Fts5BufferZero(Fts5Buffer *pBuf){ @@ -206340,8 +206340,8 @@ static void sqlite3Fts5BufferZero(Fts5Buffer *pBuf){ */ static void sqlite3Fts5BufferSet( int *pRc, - Fts5Buffer *pBuf, - int nData, + Fts5Buffer *pBuf, + int nData, const u8 *pData ){ pBuf->n = 0; @@ -206357,7 +206357,7 @@ static int sqlite3Fts5PoslistNext64( if( i>=n ){ /* EOF */ *piOff = -1; - return 1; + return 1; }else{ i64 iOff = *piOff; int iVal; @@ -206412,8 +206412,8 @@ static int sqlite3Fts5PoslistReaderInit( ** to iPos before returning. */ static void sqlite3Fts5PoslistSafeAppend( - Fts5Buffer *pBuf, - i64 *piPrev, + Fts5Buffer *pBuf, + i64 *piPrev, i64 iPos ){ static const i64 colmask = ((i64)(0x7FFFFFFF)) << 32; @@ -206427,7 +206427,7 @@ static void sqlite3Fts5PoslistSafeAppend( } static int sqlite3Fts5PoslistWriterAppend( - Fts5Buffer *pBuf, + Fts5Buffer *pBuf, Fts5PoslistWriter *pWriter, i64 iPos ){ @@ -206456,7 +206456,7 @@ static void *sqlite3Fts5MallocZero(int *pRc, sqlite3_int64 nByte){ ** the length of the string is determined using strlen(). ** ** It is the responsibility of the caller to eventually free the returned -** buffer using sqlite3_free(). If an OOM error occurs, NULL is returned. +** buffer using sqlite3_free(). If an OOM error occurs, NULL is returned. */ static char *sqlite3Fts5Strndup(int *pRc, const char *pIn, int nIn){ char *zRet = 0; @@ -206523,9 +206523,9 @@ static int sqlite3Fts5TermsetNew(Fts5Termset **pp){ } static int sqlite3Fts5TermsetAdd( - Fts5Termset *p, + Fts5Termset *p, int iIdx, - const char *pTerm, int nTerm, + const char *pTerm, int nTerm, int *pbPresent ){ int rc = SQLITE_OK; @@ -206546,9 +206546,9 @@ static int sqlite3Fts5TermsetAdd( hash = hash % ArraySize(p->apHash); for(pEntry=p->apHash[hash]; pEntry; pEntry=pEntry->pNext){ - if( pEntry->iIdx==iIdx - && pEntry->nTerm==nTerm - && memcmp(pEntry->pTerm, pTerm, nTerm)==0 + if( pEntry->iIdx==iIdx + && pEntry->nTerm==nTerm + && memcmp(pEntry->pTerm, pTerm, nTerm)==0 ){ *pbPresent = 1; break; @@ -206622,8 +206622,8 @@ static int fts5_isopenquote(char x){ } /* -** Argument pIn points to a character that is part of a nul-terminated -** string. Return a pointer to the first character following *pIn in +** Argument pIn points to a character that is part of a nul-terminated +** string. Return a pointer to the first character following *pIn in ** the string that is not a white-space character. */ static const char *fts5ConfigSkipWhitespace(const char *pIn){ @@ -206635,8 +206635,8 @@ static const char *fts5ConfigSkipWhitespace(const char *pIn){ } /* -** Argument pIn points to a character that is part of a nul-terminated -** string. Return a pointer to the first character following *pIn in +** Argument pIn points to a character that is part of a nul-terminated +** string. Return a pointer to the first character following *pIn in ** the string that is not a "bareword" character. */ static const char *fts5ConfigSkipBareword(const char *pIn){ @@ -206667,9 +206667,9 @@ static const char *fts5ConfigSkipLiteral(const char *pIn){ p++; if( *p=='\'' ){ p++; - while( (*p>='a' && *p<='f') - || (*p>='A' && *p<='F') - || (*p>='0' && *p<='9') + while( (*p>='a' && *p<='f') + || (*p>='A' && *p<='F') + || (*p>='0' && *p<='9') ){ p++; } @@ -206700,7 +206700,7 @@ static const char *fts5ConfigSkipLiteral(const char *pIn){ if( *p=='+' || *p=='-' ) p++; while( fts5_isdigit(*p) ) p++; - /* At this point, if the literal was an integer, the parse is + /* At this point, if the literal was an integer, the parse is ** finished. Or, if it is a floating point value, it may continue ** with either a decimal point or an 'E' character. */ if( *p=='.' && fts5_isdigit(p[1]) ){ @@ -206724,8 +206724,8 @@ static const char *fts5ConfigSkipLiteral(const char *pIn){ ** nul-terminator byte. ** ** If the close-quote is found, the value returned is the byte offset of -** the character immediately following it. Or, if the close-quote is not -** found, -1 is returned. If -1 is returned, the buffer is left in an +** the character immediately following it. Or, if the close-quote is not +** found, -1 is returned. If -1 is returned, the buffer is left in an ** undefined state. */ static int fts5Dequote(char *z){ @@ -206736,7 +206736,7 @@ static int fts5Dequote(char *z){ /* Set stack variable q to the close-quote character */ assert( q=='[' || q=='\'' || q=='"' || q=='`' ); - if( q=='[' ) q = ']'; + if( q=='[' ) q = ']'; while( ALWAYS(z[iIn]) ){ if( z[iIn]==q ){ @@ -206746,7 +206746,7 @@ static int fts5Dequote(char *z){ break; }else{ /* Character iIn and iIn+1 form an escaped quote character. Skip - ** the input cursor past both and copy a single quote character + ** the input cursor past both and copy a single quote character ** to the output buffer. */ iIn += 2; z[iOut++] = q; @@ -206791,8 +206791,8 @@ struct Fts5Enum { typedef struct Fts5Enum Fts5Enum; static int fts5ConfigSetEnum( - const Fts5Enum *aEnum, - const char *zEnum, + const Fts5Enum *aEnum, + const char *zEnum, int *peVal ){ int nEnum = (int)strlen(zEnum); @@ -206912,7 +206912,7 @@ static int fts5ConfigParseSpecial( *pzErr = sqlite3_mprintf("parse error in tokenize directive"); rc = SQLITE_ERROR; }else{ - rc = sqlite3Fts5GetTokenizer(pGlobal, + rc = sqlite3Fts5GetTokenizer(pGlobal, (const char**)azArg, (int)nArg, &pConfig->pTok, &pConfig->pTokApi, pzErr ); @@ -206979,7 +206979,7 @@ static int fts5ConfigParseSpecial( } /* -** Allocate an instance of the default tokenizer ("simple") at +** Allocate an instance of the default tokenizer ("simple") at ** Fts5Config.pTokenizer. Return SQLITE_OK if successful, or an SQLite error ** code if an error occurs. */ @@ -207046,14 +207046,14 @@ static const char *fts5ConfigGobbleWord( } static int fts5ConfigParseColumn( - Fts5Config *p, - char *zCol, - char *zArg, + Fts5Config *p, + char *zCol, + char *zArg, char **pzErr ){ int rc = SQLITE_OK; - if( 0==sqlite3_stricmp(zCol, FTS5_RANK_NAME) - || 0==sqlite3_stricmp(zCol, FTS5_ROWID_NAME) + if( 0==sqlite3_stricmp(zCol, FTS5_RANK_NAME) + || 0==sqlite3_stricmp(zCol, FTS5_ROWID_NAME) ){ *pzErr = sqlite3_mprintf("reserved fts5 column name: %s", zCol); rc = SQLITE_ERROR; @@ -207096,14 +207096,14 @@ static int fts5ConfigMakeExprlist(Fts5Config *p){ /* ** Arguments nArg/azArg contain the string arguments passed to the xCreate -** or xConnect method of the virtual table. This function attempts to +** or xConnect method of the virtual table. This function attempts to ** allocate an instance of Fts5Config containing the results of parsing ** those arguments. ** ** If successful, SQLITE_OK is returned and *ppOut is set to point to the -** new Fts5Config object. If an error occurs, an SQLite error code is +** new Fts5Config object. If an error occurs, an SQLite error code is ** returned, *ppOut is set to NULL and an error message may be left in -** *pzErr. It is the responsibility of the caller to eventually free any +** *pzErr. It is the responsibility of the caller to eventually free any ** such error message using sqlite3_free(). */ static int sqlite3Fts5ConfigParse( @@ -207190,8 +207190,8 @@ static int sqlite3Fts5ConfigParse( /* If no zContent option was specified, fill in the default values. */ if( rc==SQLITE_OK && pRet->zContent==0 ){ const char *zTail = 0; - assert( pRet->eContent==FTS5_CONTENT_NORMAL - || pRet->eContent==FTS5_CONTENT_NONE + assert( pRet->eContent==FTS5_CONTENT_NORMAL + || pRet->eContent==FTS5_CONTENT_NONE ); if( pRet->eContent==FTS5_CONTENT_NORMAL ){ zTail = "content"; @@ -207262,7 +207262,7 @@ static int sqlite3Fts5ConfigDeclareVtab(Fts5Config *pConfig){ const char *zSep = (i==0?"":", "); zSql = sqlite3Fts5Mprintf(&rc, "%z%s%Q", zSql, zSep, pConfig->azCol[i]); } - zSql = sqlite3Fts5Mprintf(&rc, "%z, %Q HIDDEN, %s HIDDEN)", + zSql = sqlite3Fts5Mprintf(&rc, "%z, %Q HIDDEN, %s HIDDEN)", zSql, pConfig->zName, FTS5_RANK_NAME ); @@ -207271,7 +207271,7 @@ static int sqlite3Fts5ConfigDeclareVtab(Fts5Config *pConfig){ rc = sqlite3_declare_vtab(pConfig->db, zSql); sqlite3_free(zSql); } - + return rc; } @@ -207289,7 +207289,7 @@ static int sqlite3Fts5ConfigDeclareVtab(Fts5Config *pConfig){ ** int iPos // Position of token in input (first token is 0) ** ** If the callback returns a non-zero value the tokenization is abandoned -** and no further callbacks are issued. +** and no further callbacks are issued. ** ** This function returns SQLITE_OK if successful or an SQLite error code ** if an error occurs. If the tokenization was abandoned early because @@ -207319,7 +207319,7 @@ static int sqlite3Fts5Tokenize( */ static const char *fts5ConfigSkipArgs(const char *pIn){ const char *p = pIn; - + while( 1 ){ p = fts5ConfigSkipWhitespace(p); p = fts5ConfigSkipLiteral(p); @@ -207336,7 +207336,7 @@ static const char *fts5ConfigSkipArgs(const char *pIn){ } /* -** Parameter zIn contains a rank() function specification. The format of +** Parameter zIn contains a rank() function specification. The format of ** this is: ** ** + Bareword (function name) @@ -207378,7 +207378,7 @@ static int sqlite3Fts5ConfigParseRank( p++; } if( rc==SQLITE_OK ){ - const char *pArgs; + const char *pArgs; p = fts5ConfigSkipWhitespace(p); pArgs = p; if( *p!=')' ){ @@ -207404,8 +207404,8 @@ static int sqlite3Fts5ConfigParseRank( } static int sqlite3Fts5ConfigSetValue( - Fts5Config *pConfig, - const char *zKey, + Fts5Config *pConfig, + const char *zKey, sqlite3_value *pVal, int *pbBadkey ){ @@ -207530,7 +207530,7 @@ static int sqlite3Fts5ConfigLoad(Fts5Config *pConfig, int iCookie){ } rc = sqlite3_finalize(p); } - + if( rc==SQLITE_OK && iVersion!=FTS5_CURRENT_VERSION ){ rc = SQLITE_ERROR; if( pConfig->pzErrmsg ){ @@ -207619,7 +207619,7 @@ struct Fts5ExprNode { i64 iRowid; /* Current rowid */ Fts5ExprNearset *pNear; /* For FTS5_STRING - cluster of phrases */ - /* Child nodes. For a NOT node, this array always contains 2 entries. For + /* Child nodes. For a NOT node, this array always contains 2 entries. For ** AND or OR nodes, it contains 2 or more entries. */ int nChild; /* Number of child nodes */ Fts5ExprNode *apChild[1]; /* Array of child nodes */ @@ -207698,7 +207698,7 @@ static int fts5ExprIsspace(char t){ ** Read the first token from the nul-terminated string at *pz. */ static int fts5ExprGetToken( - Fts5Parse *pParse, + Fts5Parse *pParse, const char **pz, /* IN/OUT: Pointer into buffer */ Fts5Token *pToken ){ @@ -207768,7 +207768,7 @@ static int sqlite3Fts5ExprNew( Fts5Config *pConfig, /* FTS5 Configuration */ int iCol, const char *zExpr, /* Expression text */ - Fts5Expr **ppNew, + Fts5Expr **ppNew, char **pzErr ){ Fts5Parse sParse; @@ -207924,7 +207924,7 @@ static i64 fts5ExprSynonymRowid(Fts5ExprTerm *pTerm, int bDesc, int *pbEof){ ** Argument pTerm must be a synonym iterator. */ static int fts5ExprSynonymList( - Fts5ExprTerm *pTerm, + Fts5ExprTerm *pTerm, i64 iRowid, Fts5Buffer *pBuf, /* Use this buffer for space if required */ u8 **pa, int *pn @@ -207997,13 +207997,13 @@ static int fts5ExprSynonymList( /* ** All individual term iterators in pPhrase are guaranteed to be valid and -** pointing to the same rowid when this function is called. This function +** pointing to the same rowid when this function is called. This function ** checks if the current rowid really is a match, and if so populates ** the pPhrase->poslist buffer accordingly. Output parameter *pbMatch ** is set to true if this is really a match, or false otherwise. ** -** SQLITE_OK is returned if an error occurs, or an SQLite error code -** otherwise. It is not considered an error code if the current rowid is +** SQLITE_OK is returned if an error occurs, or an SQLite error code +** otherwise. It is not considered an error code if the current rowid is ** not a match. */ static int fts5ExprPhraseIsMatch( @@ -208017,7 +208017,7 @@ static int fts5ExprPhraseIsMatch( int i; int rc = SQLITE_OK; int bFirst = pPhrase->aTerm[0].bFirst; - + fts5BufferZero(&pPhrase->poslist); /* If the aStatic[] array is not large enough, allocate a large array @@ -208139,7 +208139,7 @@ struct Fts5NearTrimmer { ** function is called, it is a no-op. Or, if an error (e.g. SQLITE_NOMEM) ** occurs within this function (*pRc) is set accordingly before returning. ** The return value is undefined in both these cases. -** +** ** If no error occurs and non-zero (a match) is returned, the position-list ** of each phrase object is edited to contain only those entries that ** meet the constraint before returning. @@ -208171,7 +208171,7 @@ static int fts5ExprNearIsMatch(int *pRc, Fts5ExprNearset *pNear){ /* Initialize a lookahead iterator for each phrase. After passing the ** buffer and buffer size to the lookaside-reader init function, zero ** the phrase poslist buffer. The new poslist for the phrase (containing - ** the same entries as the original with some entries removed on account + ** the same entries as the original with some entries removed on account ** of the NEAR constraint) is written over the original even as it is ** being read. This is safe as the entries for the new poslist are a ** subset of the old, so it is not possible for data yet to be read to @@ -208328,7 +208328,7 @@ static int fts5ExprNearTest( ** phrase is not a match, break out of the loop early. */ for(i=0; rc==SQLITE_OK && inPhrase; i++){ Fts5ExprPhrase *pPhrase = pNear->apPhrase[i]; - if( pPhrase->nTerm>1 || pPhrase->aTerm[0].pSynonym + if( pPhrase->nTerm>1 || pPhrase->aTerm[0].pSynonym || pNear->pColset || pPhrase->aTerm[0].bFirst ){ int bMatch = 0; @@ -208476,7 +208476,7 @@ static void fts5ExprNodeZeroPoslist(Fts5ExprNode *pNode){ */ static int fts5NodeCompare( Fts5Expr *pExpr, - Fts5ExprNode *p1, + Fts5ExprNode *p1, Fts5ExprNode *p2 ){ if( p2->bEof ) return -1; @@ -208491,7 +208491,7 @@ static int fts5NodeCompare( ** If an EOF is reached before this happens, *pbEof is set to true before ** returning. ** -** SQLITE_OK is returned if an error occurs, or an SQLite error code +** SQLITE_OK is returned if an error occurs, or an SQLite error code ** otherwise. It is not considered an error code if an iterator reaches ** EOF. */ @@ -208508,8 +208508,8 @@ static int fts5ExprNodeTest_STRING( const int bDesc = pExpr->bDesc; /* Check that this node should not be FTS5_TERM */ - assert( pNear->nPhrase>1 - || pNear->apPhrase[0]->nTerm>1 + assert( pNear->nPhrase>1 + || pNear->apPhrase[0]->nTerm>1 || pNear->apPhrase[0]->aTerm[0].pSynonym || pNear->apPhrase[0]->aTerm[0].bFirst ); @@ -208569,7 +208569,7 @@ static int fts5ExprNodeNext_STRING( Fts5Expr *pExpr, /* Expression pPhrase belongs to */ Fts5ExprNode *pNode, /* FTS5_STRING or FTS5_TERM node */ int bFromValid, - i64 iFrom + i64 iFrom ){ Fts5ExprTerm *pTerm = &pNode->pNear->apPhrase[0]->aTerm[0]; int rc = SQLITE_OK; @@ -208587,8 +208587,8 @@ static int fts5ExprNodeNext_STRING( for(p=pTerm; p; p=p->pSynonym){ if( sqlite3Fts5IterEof(p->pIter)==0 ){ i64 ii = p->pIter->iRowid; - if( ii==iRowid - || (bFromValid && ii!=iFrom && (ii>iFrom)==pExpr->bDesc) + if( ii==iRowid + || (bFromValid && ii!=iFrom && (ii>iFrom)==pExpr->bDesc) ){ if( bFromValid ){ rc = sqlite3Fts5IterNextFrom(p->pIter, iFrom); @@ -208634,9 +208634,9 @@ static int fts5ExprNodeTest_TERM( Fts5Expr *pExpr, /* Expression that pNear is a part of */ Fts5ExprNode *pNode /* The "NEAR" node (FTS5_TERM) */ ){ - /* As this "NEAR" object is actually a single phrase that consists + /* As this "NEAR" object is actually a single phrase that consists ** of a single term only, grab pointers into the poslist managed by the - ** fts5_index.c iterator object. This is much faster than synthesizing + ** fts5_index.c iterator object. This is much faster than synthesizing ** a new poslist the way we have to for more complicated phrase or NEAR ** expressions. */ Fts5ExprPhrase *pPhrase = pNode->pNear->apPhrase[0]; @@ -208659,7 +208659,7 @@ static int fts5ExprNodeTest_TERM( ** xNext() method for a node of type FTS5_TERM. */ static int fts5ExprNodeNext_TERM( - Fts5Expr *pExpr, + Fts5Expr *pExpr, Fts5ExprNode *pNode, int bFromValid, i64 iFrom @@ -208702,7 +208702,7 @@ static void fts5ExprNodeTest_OR( } static int fts5ExprNodeNext_OR( - Fts5Expr *pExpr, + Fts5Expr *pExpr, Fts5ExprNode *pNode, int bFromValid, i64 iFrom @@ -208714,7 +208714,7 @@ static int fts5ExprNodeNext_OR( Fts5ExprNode *p1 = pNode->apChild[i]; assert( p1->bEof || fts5RowidCmp(pExpr, p1->iRowid, iLast)>=0 ); if( p1->bEof==0 ){ - if( (p1->iRowid==iLast) + if( (p1->iRowid==iLast) || (bFromValid && fts5RowidCmp(pExpr, p1->iRowid, iFrom)<0) ){ int rc = fts5ExprNodeNext(pExpr, p1, bFromValid, iFrom); @@ -208786,7 +208786,7 @@ static int fts5ExprNodeTest_AND( } static int fts5ExprNodeNext_AND( - Fts5Expr *pExpr, + Fts5Expr *pExpr, Fts5ExprNode *pNode, int bFromValid, i64 iFrom @@ -208829,7 +208829,7 @@ static int fts5ExprNodeTest_NOT( } static int fts5ExprNodeNext_NOT( - Fts5Expr *pExpr, + Fts5Expr *pExpr, Fts5ExprNode *pNode, int bFromValid, i64 iFrom @@ -208886,7 +208886,7 @@ static int fts5ExprNodeTest( return rc; } - + /* ** Set node pNode, which is part of expression pExpr, to point to the first ** match. If there are no matches, set the Node.bEof flag to indicate EOF. @@ -208940,8 +208940,8 @@ static int fts5ExprNodeFirst(Fts5Expr *pExpr, Fts5ExprNode *pNode){ /* ** Begin iterating through the set of documents in index pIdx matched by -** the MATCH expression passed as the first argument. If the "bDesc" -** parameter is passed a non-zero value, iteration is in descending rowid +** the MATCH expression passed as the first argument. If the "bDesc" +** parameter is passed a non-zero value, iteration is in descending rowid ** order. Or, if it is zero, in ascending order. ** ** If iterating in ascending rowid order (bDesc==0), the first document @@ -208963,9 +208963,9 @@ static int sqlite3Fts5ExprFirst(Fts5Expr *p, Fts5Index *pIdx, i64 iFirst, int bD /* If not at EOF but the current rowid occurs earlier than iFirst in ** the iteration order, move to document iFirst or later. */ - if( rc==SQLITE_OK - && 0==pRoot->bEof - && fts5RowidCmp(p, pRoot->iRowid, iFirst)<0 + if( rc==SQLITE_OK + && 0==pRoot->bEof + && fts5RowidCmp(p, pRoot->iRowid, iFirst)<0 ){ rc = fts5ExprNodeNext(p, pRoot, 1, iFirst); } @@ -208979,7 +208979,7 @@ static int sqlite3Fts5ExprFirst(Fts5Expr *p, Fts5Index *pIdx, i64 iFirst, int bD } /* -** Move to the next document +** Move to the next document ** ** Return SQLITE_OK if successful, or an SQLite error code otherwise. It ** is not considered an error if the query does not match any documents. @@ -209161,7 +209161,7 @@ static int fts5ParseTokenize( Fts5ExprPhrase *pNew; int nNew = SZALLOC + (pPhrase ? pPhrase->nTerm : 0); - pNew = (Fts5ExprPhrase*)sqlite3_realloc64(pPhrase, + pNew = (Fts5ExprPhrase*)sqlite3_realloc64(pPhrase, sizeof(Fts5ExprPhrase) + sizeof(Fts5ExprTerm) * nNew ); if( pNew==0 ){ @@ -209278,8 +209278,8 @@ static Fts5ExprPhrase *sqlite3Fts5ParseTerm( ** expression passed as the second argument. */ static int sqlite3Fts5ExprClonePhrase( - Fts5Expr *pExpr, - int iPhrase, + Fts5Expr *pExpr, + int iPhrase, Fts5Expr **ppNew ){ int rc = SQLITE_OK; /* Return code */ @@ -209290,15 +209290,15 @@ static int sqlite3Fts5ExprClonePhrase( pOrig = pExpr->apExprPhrase[iPhrase]; pNew = (Fts5Expr*)sqlite3Fts5MallocZero(&rc, sizeof(Fts5Expr)); if( rc==SQLITE_OK ){ - pNew->apExprPhrase = (Fts5ExprPhrase**)sqlite3Fts5MallocZero(&rc, + pNew->apExprPhrase = (Fts5ExprPhrase**)sqlite3Fts5MallocZero(&rc, sizeof(Fts5ExprPhrase*)); } if( rc==SQLITE_OK ){ - pNew->pRoot = (Fts5ExprNode*)sqlite3Fts5MallocZero(&rc, + pNew->pRoot = (Fts5ExprNode*)sqlite3Fts5MallocZero(&rc, sizeof(Fts5ExprNode)); } if( rc==SQLITE_OK ){ - pNew->pRoot->pNear = (Fts5ExprNearset*)sqlite3Fts5MallocZero(&rc, + pNew->pRoot->pNear = (Fts5ExprNearset*)sqlite3Fts5MallocZero(&rc, sizeof(Fts5ExprNearset) + sizeof(Fts5ExprPhrase*)); } if( rc==SQLITE_OK ){ @@ -209308,7 +209308,7 @@ static int sqlite3Fts5ExprClonePhrase( Fts5Colset *pColset; nByte = sizeof(Fts5Colset) + (pColsetOrig->nCol-1) * sizeof(int); pColset = (Fts5Colset*)sqlite3Fts5MallocZero(&rc, nByte); - if( pColset ){ + if( pColset ){ memcpy(pColset, pColsetOrig, (size_t)nByte); } pNew->pRoot->pNear->pColset = pColset; @@ -209347,9 +209347,9 @@ static int sqlite3Fts5ExprClonePhrase( pNew->pRoot->pNear->nPhrase = 1; sCtx.pPhrase->pNode = pNew->pRoot; - if( pOrig->nTerm==1 - && pOrig->aTerm[0].pSynonym==0 - && pOrig->aTerm[0].bFirst==0 + if( pOrig->nTerm==1 + && pOrig->aTerm[0].pSynonym==0 + && pOrig->aTerm[0].bFirst==0 ){ pNew->pRoot->eType = FTS5_TERM; pNew->pRoot->xNext = fts5ExprNodeNext_TERM; @@ -209382,7 +209382,7 @@ static void sqlite3Fts5ParseNear(Fts5Parse *pParse, Fts5Token *pTok){ } static void sqlite3Fts5ParseSetDistance( - Fts5Parse *pParse, + Fts5Parse *pParse, Fts5ExprNearset *pNear, Fts5Token *p ){ @@ -209411,7 +209411,7 @@ static void sqlite3Fts5ParseSetDistance( ** The second argument passed to this function may be NULL, or it may be ** an existing Fts5Colset object. This function returns a pointer to ** a new colset object containing the contents of (p) with new value column -** number iCol appended. +** number iCol appended. ** ** If an OOM error occurs, store an error code in pParse and return NULL. ** The old colset object (if any) is not freed in this case. @@ -209461,7 +209461,7 @@ static Fts5Colset *sqlite3Fts5ParseColsetInvert(Fts5Parse *pParse, Fts5Colset *p Fts5Colset *pRet; int nCol = pParse->pConfig->nCol; - pRet = (Fts5Colset*)sqlite3Fts5MallocZero(&pParse->rc, + pRet = (Fts5Colset*)sqlite3Fts5MallocZero(&pParse->rc, sizeof(Fts5Colset) + sizeof(int)*nCol ); if( pRet ){ @@ -209514,7 +209514,7 @@ static Fts5Colset *sqlite3Fts5ParseColset( /* ** If argument pOrig is NULL, or if (*pRc) is set to anything other than -** SQLITE_OK when this function is called, NULL is returned. +** SQLITE_OK when this function is called, NULL is returned. ** ** Otherwise, a copy of (*pOrig) is made into memory obtained from ** sqlite3Fts5MallocZero() and a pointer to it returned. If the allocation @@ -209525,7 +209525,7 @@ static Fts5Colset *fts5CloneColset(int *pRc, Fts5Colset *pOrig){ if( pOrig ){ sqlite3_int64 nByte = sizeof(Fts5Colset) + (pOrig->nCol-1) * sizeof(int); pRet = (Fts5Colset*)sqlite3Fts5MallocZero(pRc, nByte); - if( pRet ){ + if( pRet ){ memcpy(pRet, pOrig, (size_t)nByte); } }else{ @@ -209564,13 +209564,13 @@ static void fts5MergeColset(Fts5Colset *pColset, Fts5Colset *pMerge){ ** zero, or it may create copies of pColset using fts5CloneColset(). */ static void fts5ParseSetColset( - Fts5Parse *pParse, - Fts5ExprNode *pNode, + Fts5Parse *pParse, + Fts5ExprNode *pNode, Fts5Colset *pColset, Fts5Colset **ppFree ){ if( pParse->rc==SQLITE_OK ){ - assert( pNode->eType==FTS5_TERM || pNode->eType==FTS5_STRING + assert( pNode->eType==FTS5_TERM || pNode->eType==FTS5_STRING || pNode->eType==FTS5_AND || pNode->eType==FTS5_OR || pNode->eType==FTS5_NOT || pNode->eType==FTS5_EOF ); @@ -209602,9 +209602,9 @@ static void fts5ParseSetColset( ** Apply colset pColset to expression node pExpr and all of its descendents. */ static void sqlite3Fts5ParseSetColset( - Fts5Parse *pParse, - Fts5ExprNode *pExpr, - Fts5Colset *pColset + Fts5Parse *pParse, + Fts5ExprNode *pExpr, + Fts5Colset *pColset ){ Fts5Colset *pFree = pColset; if( pParse->pConfig->eDetail==FTS5_DETAIL_NONE ){ @@ -209622,7 +209622,7 @@ static void fts5ExprAssignXNext(Fts5ExprNode *pNode){ switch( pNode->eType ){ case FTS5_STRING: { Fts5ExprNearset *pNear = pNode->pNear; - if( pNear->nPhrase==1 && pNear->apPhrase[0]->nTerm==1 + if( pNear->nPhrase==1 && pNear->apPhrase[0]->nTerm==1 && pNear->apPhrase[0]->aTerm[0].pSynonym==0 && pNear->apPhrase[0]->aTerm[0].bFirst==0 ){ @@ -209678,7 +209678,7 @@ static Fts5ExprNode *sqlite3Fts5ParseNode( if( pParse->rc==SQLITE_OK ){ int nChild = 0; /* Number of children of returned node */ sqlite3_int64 nByte; /* Bytes of space to allocate for this node */ - + assert( (eType!=FTS5_STRING && !pNear) || (eType==FTS5_STRING && !pLeft && !pRight) ); @@ -209713,7 +209713,7 @@ static Fts5ExprNode *sqlite3Fts5ParseNode( if( pParse->pConfig->eDetail!=FTS5_DETAIL_FULL ){ Fts5ExprPhrase *pPhrase = pNear->apPhrase[0]; - if( pNear->nPhrase!=1 + if( pNear->nPhrase!=1 || pPhrase->nTerm>1 || (pPhrase->nTerm>0 && pPhrase->aTerm[0].bFirst) ){ @@ -209721,7 +209721,7 @@ static Fts5ExprNode *sqlite3Fts5ParseNode( pParse->rc = SQLITE_ERROR; assert( pParse->zErr==0 ); pParse->zErr = sqlite3_mprintf( - "fts5: %s queries are not supported (detail!=full)", + "fts5: %s queries are not supported (detail!=full)", pNear->nPhrase==1 ? "phrase": "NEAR" ); sqlite3_free(pRet); @@ -209757,14 +209757,14 @@ static Fts5ExprNode *sqlite3Fts5ParseImplicitAnd( sqlite3Fts5ParseNodeFree(pRight); }else{ - assert( pLeft->eType==FTS5_STRING + assert( pLeft->eType==FTS5_STRING || pLeft->eType==FTS5_TERM || pLeft->eType==FTS5_EOF || pLeft->eType==FTS5_AND ); - assert( pRight->eType==FTS5_STRING - || pRight->eType==FTS5_TERM - || pRight->eType==FTS5_EOF + assert( pRight->eType==FTS5_STRING + || pRight->eType==FTS5_TERM + || pRight->eType==FTS5_EOF ); if( pLeft->eType==FTS5_AND ){ @@ -209772,9 +209772,9 @@ static Fts5ExprNode *sqlite3Fts5ParseImplicitAnd( }else{ pPrev = pLeft; } - assert( pPrev->eType==FTS5_STRING - || pPrev->eType==FTS5_TERM - || pPrev->eType==FTS5_EOF + assert( pPrev->eType==FTS5_STRING + || pPrev->eType==FTS5_TERM + || pPrev->eType==FTS5_EOF ); if( pRight->eType==FTS5_EOF ){ @@ -209856,20 +209856,20 @@ static char *fts5PrintfAppend(char *zApp, const char *zFmt, ...){ } /* -** Compose a tcl-readable representation of expression pExpr. Return a -** pointer to a buffer containing that representation. It is the -** responsibility of the caller to at some point free the buffer using +** Compose a tcl-readable representation of expression pExpr. Return a +** pointer to a buffer containing that representation. It is the +** responsibility of the caller to at some point free the buffer using ** sqlite3_free(). */ static char *fts5ExprPrintTcl( - Fts5Config *pConfig, + Fts5Config *pConfig, const char *zNearsetCmd, Fts5ExprNode *pExpr ){ char *zRet = 0; if( pExpr->eType==FTS5_STRING || pExpr->eType==FTS5_TERM ){ Fts5ExprNearset *pNear = pExpr->pNear; - int i; + int i; int iTerm; zRet = fts5PrintfAppend(zRet, "%s ", zNearsetCmd); @@ -209919,9 +209919,9 @@ static char *fts5ExprPrintTcl( switch( pExpr->eType ){ case FTS5_AND: zOp = "AND"; break; case FTS5_NOT: zOp = "NOT"; break; - default: + default: assert( pExpr->eType==FTS5_OR ); - zOp = "OR"; + zOp = "OR"; break; } @@ -209947,7 +209947,7 @@ static char *fts5ExprPrint(Fts5Config *pConfig, Fts5ExprNode *pExpr){ }else if( pExpr->eType==FTS5_STRING || pExpr->eType==FTS5_TERM ){ Fts5ExprNearset *pNear = pExpr->pNear; - int i; + int i; int iTerm; if( pNear->pColset ){ @@ -209992,9 +209992,9 @@ static char *fts5ExprPrint(Fts5Config *pConfig, Fts5ExprNode *pExpr){ switch( pExpr->eType ){ case FTS5_AND: zOp = " AND "; break; case FTS5_NOT: zOp = " NOT "; break; - default: + default: assert( pExpr->eType==FTS5_OR ); - zOp = " OR "; + zOp = " OR "; break; } @@ -210006,7 +210006,7 @@ static char *fts5ExprPrint(Fts5Config *pConfig, Fts5ExprNode *pExpr){ }else{ int e = pExpr->apChild[i]->eType; int b = (e!=FTS5_STRING && e!=FTS5_TERM && e!=FTS5_EOF); - zRet = fts5PrintfAppend(zRet, "%s%s%z%s", + zRet = fts5PrintfAppend(zRet, "%s%s%z%s", (i==0 ? "" : zOp), (b?"(":""), z, (b?")":"") ); @@ -210122,7 +210122,7 @@ static void fts5ExprFunctionTcl( /* ** The implementation of an SQLite user-defined-function that accepts a -** single integer as an argument. If the integer is an alpha-numeric +** single integer as an argument. If the integer is an alpha-numeric ** unicode code point, 1 is returned. Otherwise 0. */ static void fts5ExprIsAlnum( @@ -210133,7 +210133,7 @@ static void fts5ExprIsAlnum( int iCode; u8 aArr[32]; if( nArg!=1 ){ - sqlite3_result_error(pCtx, + sqlite3_result_error(pCtx, "wrong number of arguments to function fts5_isalnum", -1 ); return; @@ -210152,7 +210152,7 @@ static void fts5ExprFold( sqlite3_value **apVal /* Function arguments */ ){ if( nArg!=1 && nArg!=2 ){ - sqlite3_result_error(pCtx, + sqlite3_result_error(pCtx, "wrong number of arguments to function fts5_fold", -1 ); }else{ @@ -210246,7 +210246,7 @@ static Fts5PoslistPopulator *sqlite3Fts5ExprClearPoslists(Fts5Expr *pExpr, int b Fts5Buffer *pBuf = &pExpr->apExprPhrase[i]->poslist; Fts5ExprNode *pNode = pExpr->apExprPhrase[i]->pNode; assert( pExpr->apExprPhrase[i]->nTerm==1 ); - if( bLive && + if( bLive && (pBuf->n==0 || pNode->iRowid!=pExpr->pRoot->iRowid || pNode->bEof) ){ pRet[i].bMiss = 1; @@ -210313,9 +210313,9 @@ static int fts5ExprPopulatePoslistsCb( static int sqlite3Fts5ExprPopulatePoslists( Fts5Config *pConfig, - Fts5Expr *pExpr, + Fts5Expr *pExpr, Fts5PoslistPopulator *aPopulator, - int iCol, + int iCol, const char *z, int n ){ int i; @@ -210327,7 +210327,7 @@ static int sqlite3Fts5ExprPopulatePoslists( for(i=0; inPhrase; i++){ Fts5ExprNode *pNode = pExpr->apExprPhrase[i]->pNode; Fts5Colset *pColset = pNode->pNear->pColset; - if( (pColset && 0==fts5ExprColsetTest(pColset, iCol)) + if( (pColset && 0==fts5ExprColsetTest(pColset, iCol)) || aPopulator[i].bMiss ){ aPopulator[i].bOk = 0; @@ -210336,7 +210336,7 @@ static int sqlite3Fts5ExprPopulatePoslists( } } - return sqlite3Fts5Tokenize(pConfig, + return sqlite3Fts5Tokenize(pConfig, FTS5_TOKENIZE_DOCUMENT, z, n, (void*)&sCtx, fts5ExprPopulatePoslistsCb ); } @@ -210401,12 +210401,12 @@ static void sqlite3Fts5ExprCheckPoslists(Fts5Expr *pExpr, i64 iRowid){ } /* -** This function is only called for detail=columns tables. +** This function is only called for detail=columns tables. */ static int sqlite3Fts5ExprPhraseCollist( - Fts5Expr *pExpr, - int iPhrase, - const u8 **ppCollist, + Fts5Expr *pExpr, + int iPhrase, + const u8 **ppCollist, int *pnCollist ){ Fts5ExprPhrase *pPhrase = pExpr->apExprPhrase[iPhrase]; @@ -210416,8 +210416,8 @@ static int sqlite3Fts5ExprPhraseCollist( assert( iPhrase>=0 && iPhrasenPhrase ); assert( pExpr->pConfig->eDetail==FTS5_DETAIL_COLUMNS ); - if( pNode->bEof==0 - && pNode->iRowid==pExpr->pRoot->iRowid + if( pNode->bEof==0 + && pNode->iRowid==pExpr->pRoot->iRowid && pPhrase->poslist.n>0 ){ Fts5ExprTerm *pTerm = &pPhrase->aTerm[0]; @@ -210475,9 +210475,9 @@ struct Fts5Hash { }; /* -** Each entry in the hash table is represented by an object of the -** following type. Each object, its key (a nul-terminated string) and -** its current data are stored in a single memory allocation. The +** Each entry in the hash table is represented by an object of the +** following type. Each object, its key (a nul-terminated string) and +** its current data are stored in a single memory allocation. The ** key immediately follows the object in memory. The position list ** data immediately follows the key data in memory. ** @@ -210499,7 +210499,7 @@ struct Fts5Hash { struct Fts5HashEntry { Fts5HashEntry *pHashNext; /* Next hash entry with same hash-key */ Fts5HashEntry *pScanNext; /* Next entry in sorted order */ - + int nAlloc; /* Total size of allocation */ int iSzPoslist; /* Offset of space for 4-byte poslist size */ int nData; /* Total bytes of data (incl. structure) */ @@ -210628,7 +210628,7 @@ static int fts5HashResize(Fts5Hash *pHash){ } static int fts5HashAddPoslistSize( - Fts5Hash *pHash, + Fts5Hash *pHash, Fts5HashEntry *p, Fts5HashEntry *p2 ){ @@ -210691,16 +210691,16 @@ static int sqlite3Fts5HashWrite( u8 *pPtr; int nIncr = 0; /* Amount to increment (*pHash->pnByte) by */ int bNew; /* If non-delete entry should be written */ - + bNew = (pHash->eDetail==FTS5_DETAIL_FULL); /* Attempt to locate an existing hash entry */ iHash = fts5HashKey2(pHash->nSlot, (u8)bByte, (const u8*)pToken, nToken); for(p=pHash->aSlot[iHash]; p; p=p->pHashNext){ char *zKey = fts5EntryKey(p); - if( zKey[0]==bByte + if( zKey[0]==bByte && p->nKey==nToken - && memcmp(&zKey[1], pToken, nToken)==0 + && memcmp(&zKey[1], pToken, nToken)==0 ){ break; } @@ -210749,8 +210749,8 @@ static int sqlite3Fts5HashWrite( nIncr += p->nData; }else{ - /* Appending to an existing hash-entry. Check that there is enough - ** space to append the largest possible new entry. Worst case scenario + /* Appending to an existing hash-entry. Check that there is enough + ** space to append the largest possible new entry. Worst case scenario ** is: ** ** + 9 bytes for a new rowid, @@ -210878,7 +210878,7 @@ static Fts5HashEntry *fts5HashEntryMerge( ** list. */ static int fts5HashEntrySort( - Fts5Hash *pHash, + Fts5Hash *pHash, const char *pTerm, int nTerm, /* Query prefix, if any */ Fts5HashEntry **ppSorted ){ @@ -210896,7 +210896,7 @@ static int fts5HashEntrySort( for(iSlot=0; iSlotnSlot; iSlot++){ Fts5HashEntry *pIter; for(pIter=pHash->aSlot[iSlot]; pIter; pIter=pIter->pHashNext){ - if( pTerm==0 + if( pTerm==0 || (pIter->nKey+1>=nTerm && 0==memcmp(fts5EntryKey(pIter), pTerm, nTerm)) ){ Fts5HashEntry *pEntry = pIter; @@ -211011,7 +211011,7 @@ static void sqlite3Fts5HashScanEntry( ** ****************************************************************************** ** -** Low level access to the FTS index stored in the database file. The +** Low level access to the FTS index stored in the database file. The ** routines in this file file implement all read and write access to the ** %_data table. Other parts of the system access this functionality via ** the interface defined in fts5Int.h. @@ -211027,10 +211027,10 @@ static void sqlite3Fts5HashScanEntry( ** As well as the main term index, there may be up to 31 prefix indexes. ** The format is similar to FTS3/4, except that: ** -** * all segment b-tree leaf data is stored in fixed size page records -** (e.g. 1000 bytes). A single doclist may span multiple pages. Care is -** taken to ensure it is possible to iterate in either direction through -** the entries in a doclist, or to seek to a specific entry within a +** * all segment b-tree leaf data is stored in fixed size page records +** (e.g. 1000 bytes). A single doclist may span multiple pages. Care is +** taken to ensure it is possible to iterate in either direction through +** the entries in a doclist, or to seek to a specific entry within a ** doclist, without loading it into memory. ** ** * large doclists that span many pages have associated "doclist index" @@ -211063,14 +211063,14 @@ static void sqlite3Fts5HashScanEntry( ** CREATE TABLE %_data(id INTEGER PRIMARY KEY, block BLOB); ** ** , contains the following 5 types of records. See the comments surrounding -** the FTS5_*_ROWID macros below for a description of how %_data rowids are +** the FTS5_*_ROWID macros below for a description of how %_data rowids are ** assigned to each fo them. ** ** 1. Structure Records: ** ** The set of segments that make up an index - the index structure - are ** recorded in a single record within the %_data table. The record consists -** of a single 32-bit configuration cookie value followed by a list of +** of a single 32-bit configuration cookie value followed by a list of ** SQLite varints. If the FTS table features more than one index (because ** there are one or more prefix indexes), it is guaranteed that all share ** the same cookie value. @@ -211102,7 +211102,7 @@ static void sqlite3Fts5HashScanEntry( ** ** TERM/DOCLIST FORMAT: ** -** Most of each segment leaf is taken up by term/doclist data. The +** Most of each segment leaf is taken up by term/doclist data. The ** general format of term/doclist, starting with the first term ** on the leaf page, is: ** @@ -211145,7 +211145,7 @@ static void sqlite3Fts5HashScanEntry( ** ** PAGE FORMAT ** -** Each leaf page begins with a 4-byte header containing 2 16-bit +** Each leaf page begins with a 4-byte header containing 2 16-bit ** unsigned integer fields in big-endian format. They are: ** ** * The byte offset of the first rowid on the page, if it exists @@ -211180,7 +211180,7 @@ static void sqlite3Fts5HashScanEntry( ** 5. Segment doclist indexes: ** ** Doclist indexes are themselves b-trees, however they usually consist of -** a single leaf record only. The format of each doclist index leaf page +** a single leaf record only. The format of each doclist index leaf page ** is: ** ** * Flags byte. Bits are: @@ -211190,8 +211190,8 @@ static void sqlite3Fts5HashScanEntry( ** ** * First rowid on page indicated by previous field. As a varint. ** -** * A list of varints, one for each subsequent termless page. A -** positive delta if the termless page contains at least one rowid, +** * A list of varints, one for each subsequent termless page. A +** positive delta if the termless page contains at least one rowid, ** or an 0x00 byte otherwise. ** ** Internal doclist index nodes are: @@ -211204,7 +211204,7 @@ static void sqlite3Fts5HashScanEntry( ** * Copy of first rowid on page indicated by previous field. As a varint. ** ** * A list of delta-encoded varints - the first rowid on each subsequent -** child page. +** child page. ** */ @@ -211221,7 +211221,7 @@ static void sqlite3Fts5HashScanEntry( ** ** Each segment has a unique non-zero 16-bit id. ** -** The rowid for each segment leaf is found by passing the segment id and +** The rowid for each segment leaf is found by passing the segment id and ** the leaf page number to the FTS5_SEGMENT_ROWID macro. Leaves are numbered ** sequentially starting from 1. */ @@ -211241,7 +211241,7 @@ static void sqlite3Fts5HashScanEntry( #define FTS5_DLIDX_ROWID(segid, height, pgno) fts5_dri(segid, 1, height, pgno) /* -** Maximum segments permitted in a single index +** Maximum segments permitted in a single index */ #define FTS5_MAX_SEGMENT 2000 @@ -211323,7 +211323,7 @@ struct Fts5DoclistIter { /* ** The contents of the "structure" record for each index are represented -** using an Fts5Structure record in memory. Which uses instances of the +** using an Fts5Structure record in memory. Which uses instances of the ** other Fts5StructureXXX types as components. */ struct Fts5StructureSegment { @@ -211396,10 +211396,10 @@ struct Fts5CResult { ** Current leaf page number within segment. ** ** iLeafOffset: -** Byte offset within the current leaf that is the first byte of the +** Byte offset within the current leaf that is the first byte of the ** position list data (one byte passed the position-list size field). ** rowid field of the current entry. Usually this is the size field of the -** position list data. The exception is if the rowid for the current entry +** position list data. The exception is if the rowid for the current entry ** is the last thing on the leaf page. ** ** pLeaf: @@ -211413,7 +211413,7 @@ struct Fts5CResult { ** Mask of FTS5_SEGITER_XXX values. Interpreted as follows: ** ** FTS5_SEGITER_ONETERM: -** If set, set the iterator to point to EOF after the current doclist +** If set, set the iterator to point to EOF after the current doclist ** has been exhausted. Do not proceed to the next term in the segment. ** ** FTS5_SEGITER_REVERSE: @@ -211442,7 +211442,7 @@ struct Fts5SegIter { /* Next method */ void (*xNext)(Fts5Index*, Fts5SegIter*, int*); - /* The page and offset from which the current term was read. The offset + /* The page and offset from which the current term was read. The offset ** is the offset of the first rowid in the current doclist. */ int iTermLeafPgno; int iTermLeafOffset; @@ -211465,7 +211465,7 @@ struct Fts5SegIter { }; /* -** Argument is a pointer to an Fts5Data structure that contains a +** Argument is a pointer to an Fts5Data structure that contains a ** leaf page. */ #define ASSERT_SZLEAF_OK(x) assert( \ @@ -211475,7 +211475,7 @@ struct Fts5SegIter { #define FTS5_SEGITER_ONETERM 0x01 #define FTS5_SEGITER_REVERSE 0x02 -/* +/* ** Argument is a pointer to an Fts5Data structure that contains a leaf ** page. This macro evaluates to true if the leaf contains no terms, or ** false if it contains at least one term. @@ -211497,13 +211497,13 @@ struct Fts5SegIter { ** on empty segments. ** ** The results of comparing segments aSeg[N] and aSeg[N+1], where N is an -** even number, is stored in aFirst[(nSeg+N)/2]. The "result" of the +** even number, is stored in aFirst[(nSeg+N)/2]. The "result" of the ** comparison in this context is the index of the iterator that currently ** points to the smaller term/rowid combination. Iterators at EOF are ** considered to be greater than all other iterators. ** ** aFirst[1] contains the index in aSeg[] of the iterator that points to -** the smallest key overall. aFirst[0] is unused. +** the smallest key overall. aFirst[0] is unused. ** ** poslist: ** Used by sqlite3Fts5IterPoslist() when the poslist needs to be buffered. @@ -211565,7 +211565,7 @@ static void fts5PutU16(u8 *aOut, u16 iVal){ static u16 fts5GetU16(const u8 *aIn){ return ((u16)aIn[0] << 8) + aIn[1]; -} +} /* ** Allocate and return a buffer at least nByte bytes in size. @@ -211631,7 +211631,7 @@ static void fts5CloseReader(Fts5Index *p){ /* ** Retrieve a record from the %_data table. ** -** If an error occurs, NULL is returned and an error left in the +** If an error occurs, NULL is returned and an error left in the ** Fts5Index object. */ static Fts5Data *fts5DataRead(Fts5Index *p, i64 iRowid){ @@ -211654,11 +211654,11 @@ static Fts5Data *fts5DataRead(Fts5Index *p, i64 iRowid){ if( rc==SQLITE_ABORT ) rc = SQLITE_OK; } - /* If the blob handle is not open at this point, open it and seek + /* If the blob handle is not open at this point, open it and seek ** to the requested entry. */ if( p->pReader==0 && rc==SQLITE_OK ){ Fts5Config *pConfig = p->pConfig; - rc = sqlite3_blob_open(pConfig->db, + rc = sqlite3_blob_open(pConfig->db, pConfig->zDb, p->zDataTbl, "block", iRowid, 0, &p->pReader ); } @@ -211666,7 +211666,7 @@ static Fts5Data *fts5DataRead(Fts5Index *p, i64 iRowid){ /* If either of the sqlite3_blob_open() or sqlite3_blob_reopen() calls ** above returned SQLITE_ERROR, return SQLITE_CORRUPT_VTAB instead. ** All the reasons those functions might return SQLITE_ERROR - missing - ** table, missing row, non-blob/text in block column - indicate + ** table, missing row, non-blob/text in block column - indicate ** backing store corruption. */ if( rc==SQLITE_ERROR ) rc = FTS5_CORRUPT; @@ -211751,7 +211751,7 @@ static void fts5DataWrite(Fts5Index *p, i64 iRowid, const u8 *pData, int nData){ if( p->pWriter==0 ){ Fts5Config *pConfig = p->pConfig; fts5IndexPrepareStmt(p, &p->pWriter, sqlite3_mprintf( - "REPLACE INTO '%q'.'%q_data'(id, block) VALUES(?,?)", + "REPLACE INTO '%q'.'%q_data'(id, block) VALUES(?,?)", pConfig->zDb, pConfig->zName )); if( p->rc ) return; @@ -211775,7 +211775,7 @@ static void fts5DataDelete(Fts5Index *p, i64 iFirst, i64 iLast){ if( p->pDeleter==0 ){ Fts5Config *pConfig = p->pConfig; char *zSql = sqlite3_mprintf( - "DELETE FROM '%q'.'%q_data' WHERE id>=? AND id<=?", + "DELETE FROM '%q'.'%q_data' WHERE id>=? AND id<=?", pConfig->zDb, pConfig->zName ); if( fts5IndexPrepareStmt(p, &p->pDeleter, zSql) ) return; @@ -211809,7 +211809,7 @@ static void fts5DataRemoveSegment(Fts5Index *p, int iSegid){ } /* -** Release a reference to an Fts5Structure object returned by an earlier +** Release a reference to an Fts5Structure object returned by an earlier ** call to fts5StructureRead() or fts5StructureDecode(). */ static void fts5StructureRelease(Fts5Structure *pStruct){ @@ -211889,7 +211889,7 @@ static int fts5StructureDecode( i += fts5GetVarint32(&pData[i], pLvl->nMerge); i += fts5GetVarint32(&pData[i], nTotal); if( nTotalnMerge ) rc = FTS5_CORRUPT; - pLvl->aSeg = (Fts5StructureSegment*)sqlite3Fts5MallocZero(&rc, + pLvl->aSeg = (Fts5StructureSegment*)sqlite3Fts5MallocZero(&rc, nTotal * sizeof(Fts5StructureSegment) ); nSegment -= nTotal; @@ -211955,10 +211955,10 @@ static void fts5StructureAddLevel(int *pRc, Fts5Structure **ppStruct){ ** segments. */ static void fts5StructureExtendLevel( - int *pRc, - Fts5Structure *pStruct, - int iLvl, - int nExtra, + int *pRc, + Fts5Structure *pStruct, + int iLvl, + int nExtra, int bInsert ){ if( *pRc==SQLITE_OK ){ @@ -212012,7 +212012,7 @@ static i64 fts5IndexDataVersion(Fts5Index *p){ if( p->rc==SQLITE_OK ){ if( p->pDataVersion==0 ){ - p->rc = fts5IndexPrepareStmt(p, &p->pDataVersion, + p->rc = fts5IndexPrepareStmt(p, &p->pDataVersion, sqlite3_mprintf("PRAGMA %Q.data_version", p->pConfig->zDb) ); if( p->rc ) return 0; @@ -212031,7 +212031,7 @@ static i64 fts5IndexDataVersion(Fts5Index *p){ ** Read, deserialize and return the structure record. ** ** The Fts5Structure.aLevel[] and each Fts5StructureLevel.aSeg[] array -** are over-allocated as described for function fts5StructureDecode() +** are over-allocated as described for function fts5StructureDecode() ** above. ** ** If an error occurs, NULL is returned and an error code left in the @@ -212180,8 +212180,8 @@ static int fts5SegmentSize(Fts5StructureSegment *pSeg){ } /* -** Return a copy of index structure pStruct. Except, promote as many -** segments as possible to level iPromote. If an OOM occurs, NULL is +** Return a copy of index structure pStruct. Except, promote as many +** segments as possible to level iPromote. If an OOM occurs, NULL is ** returned. */ static void fts5StructurePromoteTo( @@ -212221,8 +212221,8 @@ static void fts5StructurePromoteTo( ** ** b) If the segment just written is larger than the newest segment on ** the next populated level, then that segment, and any other adjacent -** segments that are also smaller than the one just written, are -** promoted. +** segments that are also smaller than the one just written, are +** promoted. ** ** If one or more segments are promoted, the structure object is updated ** to reflect this. @@ -212256,7 +212256,7 @@ static void fts5StructurePromote( if( sz>szMax ) szMax = sz; } if( szMax>=szSeg ){ - /* Condition (a) is true. Promote the newest segment on level + /* Condition (a) is true. Promote the newest segment on level ** iLvl to level iTst. */ iPromote = iTst; szPromote = szMax; @@ -212275,7 +212275,7 @@ static void fts5StructurePromote( /* -** Advance the iterator passed as the only argument. If the end of the +** Advance the iterator passed as the only argument. If the end of the ** doclist-index page is reached, return non-zero. */ static int fts5DlidxLvlNext(Fts5DlidxLvl *pLvl){ @@ -212290,7 +212290,7 @@ static int fts5DlidxLvlNext(Fts5DlidxLvl *pLvl){ }else{ int iOff; for(iOff=pLvl->iOff; iOffnn; iOff++){ - if( pData->p[iOff] ) break; + if( pData->p[iOff] ) break; } if( iOffnn ){ @@ -212320,7 +212320,7 @@ static int fts5DlidxIterNextR(Fts5Index *p, Fts5DlidxIter *pIter, int iLvl){ if( pLvl[1].bEof==0 ){ fts5DataRelease(pLvl->pData); memset(pLvl, 0, sizeof(Fts5DlidxLvl)); - pLvl->pData = fts5DataRead(p, + pLvl->pData = fts5DataRead(p, FTS5_DLIDX_ROWID(pIter->iSegid, iLvl, pLvl[1].iLeafPgno) ); if( pLvl->pData ) fts5DlidxLvlNext(pLvl); @@ -212340,7 +212340,7 @@ static int fts5DlidxIterNext(Fts5Index *p, Fts5DlidxIter *pIter){ ** points to the first rowid in the doclist-index. ** ** pData: -** pointer to doclist-index record, +** pointer to doclist-index record, ** ** When this function is called pIter->iLeafPgno is the page number the ** doclist is associated with (the one featuring the term). @@ -212371,7 +212371,7 @@ static void fts5DlidxIterLast(Fts5Index *p, Fts5DlidxIter *pIter){ Fts5DlidxLvl *pChild = &pLvl[-1]; fts5DataRelease(pChild->pData); memset(pChild, 0, sizeof(Fts5DlidxLvl)); - pChild->pData = fts5DataRead(p, + pChild->pData = fts5DataRead(p, FTS5_DLIDX_ROWID(pIter->iSegid, i-1, pLvl->iLeafPgno) ); } @@ -212394,8 +212394,8 @@ static int fts5DlidxLvlPrev(Fts5DlidxLvl *pLvl){ int ii; int nZero = 0; - /* Currently iOff points to the first byte of a varint. This block - ** decrements iOff until it points to the first byte of the previous + /* Currently iOff points to the first byte of a varint. This block + ** decrements iOff until it points to the first byte of the previous ** varint. Taking care not to read any memory locations that occur ** before the buffer in memory. */ iLimit = (iOff>9 ? iOff-9 : 0); @@ -212440,7 +212440,7 @@ static int fts5DlidxIterPrevR(Fts5Index *p, Fts5DlidxIter *pIter, int iLvl){ if( pLvl[1].bEof==0 ){ fts5DataRelease(pLvl->pData); memset(pLvl, 0, sizeof(Fts5DlidxLvl)); - pLvl->pData = fts5DataRead(p, + pLvl->pData = fts5DataRead(p, FTS5_DLIDX_ROWID(pIter->iSegid, iLvl, pLvl[1].iLeafPgno) ); if( pLvl->pData ){ @@ -212539,7 +212539,7 @@ static void fts5SegIterNextPage( pIter->pLeaf = pIter->pNextLeaf; pIter->pNextLeaf = 0; }else if( pIter->iLeafPgno<=pSeg->pgnoLast ){ - pIter->pLeaf = fts5LeafRead(p, + pIter->pLeaf = fts5LeafRead(p, FTS5_SEGMENT_ROWID(pSeg->iSegid, pIter->iLeafPgno) ); }else{ @@ -212583,7 +212583,7 @@ static int fts5GetPoslistSize(const u8 *p, int *pnSz, int *pbDel){ ** Fts5SegIter.nPos ** Fts5SegIter.bDel ** -** Leave Fts5SegIter.iLeafOffset pointing to the first byte of the +** Leave Fts5SegIter.iLeafOffset pointing to the first byte of the ** position list content (if any). */ static void fts5SegIterLoadNPos(Fts5Index *p, Fts5SegIter *pIter){ @@ -212634,7 +212634,7 @@ static void fts5SegIterLoadRowid(Fts5Index *p, Fts5SegIter *pIter){ } /* -** Fts5SegIter.iLeafOffset currently points to the first byte of the +** Fts5SegIter.iLeafOffset currently points to the first byte of the ** "nSuffix" field of a term. Function parameter nKeep contains the value ** of the "nPrefix" field (if there was one - it is passed 0 if this is ** the first term in the segment). @@ -212645,7 +212645,7 @@ static void fts5SegIterLoadRowid(Fts5Index *p, Fts5SegIter *pIter){ ** Fts5SegIter.rowid ** ** accordingly and leaves (Fts5SegIter.iLeafOffset) set to the content of -** the first position list. The position list belonging to document +** the first position list. The position list belonging to document ** (Fts5SegIter.iRowid). */ static void fts5SegIterLoadTerm(Fts5Index *p, Fts5SegIter *pIter, int nKeep){ @@ -212693,10 +212693,10 @@ static void fts5SegIterSetNext(Fts5Index *p, Fts5SegIter *pIter){ /* ** Initialize the iterator object pIter to iterate through the entries in -** segment pSeg. The iterator is left pointing to the first entry when +** segment pSeg. The iterator is left pointing to the first entry when ** this function returns. ** -** If an error occurs, Fts5Index.rc is set to an appropriate error code. If +** If an error occurs, Fts5Index.rc is set to an appropriate error code. If ** an error has already occurred when this function is called, it is a no-op. */ static void fts5SegIterInit( @@ -212741,8 +212741,8 @@ static void fts5SegIterInit( ** the position-list size field for the first relevant rowid on the page. ** Fts5SegIter.rowid is set, but nPos and bDel are not. ** -** This function advances the iterator so that it points to the last -** relevant rowid on the page and, if necessary, initializes the +** This function advances the iterator so that it points to the last +** relevant rowid on the page and, if necessary, initializes the ** aRowidOffset[] and iRowidOffset variables. At this point the iterator ** is in its regular state - Fts5SegIter.iLeafOffset points to the first ** byte of the position list content associated with said rowid. @@ -212962,10 +212962,10 @@ static void fts5SegIterNext_None( /* -** Advance iterator pIter to the next entry. +** Advance iterator pIter to the next entry. ** -** If an error occurs, Fts5Index.rc is set to an appropriate error code. It -** is not considered an error if the iterator reaches EOF. If an error has +** If an error occurs, Fts5Index.rc is set to an appropriate error code. It +** is not considered an error if the iterator reaches EOF. If an error has ** already occurred when this function is called, it is a no-op. */ static void fts5SegIterNext( @@ -213076,7 +213076,7 @@ static void fts5SegIterNext( }else{ /* The following could be done by calling fts5SegIterLoadNPos(). But ** this block is particularly performance critical, so equivalent - ** code is inlined. + ** code is inlined. ** ** Later: Switched back to fts5SegIterLoadNPos() because it supports ** detail=none mode. Not ideal. @@ -213156,7 +213156,7 @@ static void fts5SegIterReverse(Fts5Index *p, Fts5SegIter *pIter){ } /* If pLast is NULL at this point, then the last rowid for this doclist - ** lies on the page currently indicated by the iterator. In this case + ** lies on the page currently indicated by the iterator. In this case ** pIter->iLeafOffset is already set to point to the position-list size ** field associated with the first relevant rowid on the page. ** @@ -213186,8 +213186,8 @@ static void fts5SegIterReverse(Fts5Index *p, Fts5SegIter *pIter){ /* ** Iterator pIter currently points to the first rowid of a doclist. -** There is a doclist-index associated with the final term on the current -** page. If the current term is the last term on the page, load the +** There is a doclist-index associated with the final term on the current +** page. If the current term is the last term on the page, load the ** doclist-index from disk and initialize an iterator at (pIter->pDlidx). */ static void fts5SegIterLoadDlidx(Fts5Index *p, Fts5SegIter *pIter){ @@ -213201,8 +213201,8 @@ static void fts5SegIterLoadDlidx(Fts5Index *p, Fts5SegIter *pIter){ /* Check if the current doclist ends on this page. If it does, return ** early without loading the doclist-index (as it belongs to a different ** term. */ - if( pIter->iTermLeafPgno==pIter->iLeafPgno - && pIter->iEndofDoclistszLeaf + if( pIter->iTermLeafPgno==pIter->iLeafPgno + && pIter->iEndofDoclistszLeaf ){ return; } @@ -213367,7 +213367,7 @@ static sqlite3_stmt *fts5IdxSelectStmt(Fts5Index *p){ ** Initialize the object pIter to point to term pTerm/nTerm within segment ** pSeg. If there is no such term in the index, the iterator is set to EOF. ** -** If an error occurs, Fts5Index.rc is set to an appropriate error code. If +** If an error occurs, Fts5Index.rc is set to an appropriate error code. If ** an error has already occurred when this function is called, it is a no-op. */ static void fts5SegIterSeekInit( @@ -213447,10 +213447,10 @@ static void fts5SegIterSeekInit( /* ** Initialize the object pIter to point to term pTerm/nTerm within the -** in-memory hash table. If there is no such term in the hash-table, the +** in-memory hash table. If there is no such term in the hash-table, the ** iterator is set to EOF. ** -** If an error occurs, Fts5Index.rc is set to an appropriate error code. If +** If an error occurs, Fts5Index.rc is set to an appropriate error code. If ** an error has already occurred when this function is called, it is a no-op. */ static void fts5SegIterHashInit( @@ -213480,7 +213480,7 @@ static void fts5SegIterHashInit( } } }else{ - p->rc = sqlite3Fts5HashQuery(p->pHash, sizeof(Fts5Data), + p->rc = sqlite3Fts5HashQuery(p->pHash, sizeof(Fts5Data), (const char*)pTerm, nTerm, (void**)&pLeaf, &nList ); if( pLeaf ){ @@ -213530,7 +213530,7 @@ static void fts5SegIterClear(Fts5SegIter *pIter){ ** two iterators. */ static void fts5AssertComparisonResult( - Fts5Iter *pIter, + Fts5Iter *pIter, Fts5SegIter *p1, Fts5SegIter *p2, Fts5CResult *pRes @@ -213567,7 +213567,7 @@ static void fts5AssertComparisonResult( /* ** This function is a no-op unless SQLITE_DEBUG is defined when this module -** is compiled. In that case, this function is essentially an assert() +** is compiled. In that case, this function is essentially an assert() ** statement used to verify that the contents of the pIter->aFirst[] array ** are correct. */ @@ -213581,9 +213581,9 @@ static void fts5AssertMultiIterSetup(Fts5Index *p, Fts5Iter *pIter){ /* Check that pIter->iSwitchRowid is set correctly. */ for(i=0; inSeg; i++){ Fts5SegIter *p1 = &pIter->aSeg[i]; - assert( p1==pFirst - || p1->pLeaf==0 - || fts5BufferCompare(&pFirst->term, &p1->term) + assert( p1==pFirst + || p1->pLeaf==0 + || fts5BufferCompare(&pFirst->term, &p1->term) || p1->iRowid==pIter->iSwitchRowid || (p1->iRowidiSwitchRowid)==pIter->bRev ); @@ -213613,7 +213613,7 @@ static void fts5AssertMultiIterSetup(Fts5Index *p, Fts5Iter *pIter){ ** ** If the returned value is non-zero, then it is the index of an entry ** in the pIter->aSeg[] array that is (a) not at EOF, and (b) pointing -** to a key that is a duplicate of another, higher priority, +** to a key that is a duplicate of another, higher priority, ** segment-iterator in the pSeg->aSeg[] array. */ static int fts5MultiIterDoCompare(Fts5Iter *pIter, int iOut){ @@ -213704,7 +213704,7 @@ static void fts5SegIterGotoPage( } /* -** Advance the iterator passed as the second argument until it is at or +** Advance the iterator passed as the second argument until it is at or ** past rowid iFrom. Regardless of the value of iFrom, the iterator is ** always advanced at least once. */ @@ -213800,7 +213800,7 @@ static void fts5MultiIterAdvanced( ** If non-zero is returned, the caller should call fts5MultiIterAdvanced() ** on the iterator instead. That function does the same as this one, except ** that it deals with more complicated cases as well. -*/ +*/ static int fts5MultiIterAdvanceRowid( Fts5Iter *pIter, /* Iterator to update aFirst[] array for */ int iChanged, /* Index of sub-iterator just advanced */ @@ -213851,14 +213851,14 @@ static void fts5MultiIterSetEof(Fts5Iter *pIter){ } /* -** Move the iterator to the next entry. +** Move the iterator to the next entry. ** -** If an error occurs, an error code is left in Fts5Index.rc. It is not -** considered an error if the iterator reaches EOF, or if it is already at +** If an error occurs, an error code is left in Fts5Index.rc. It is not +** considered an error if the iterator reaches EOF, or if it is already at ** EOF when this function is called. */ static void fts5MultiIterNext( - Fts5Index *p, + Fts5Index *p, Fts5Iter *pIter, int bFrom, /* True if argument iFrom is valid */ i64 iFrom /* Advance at least as far as this */ @@ -213876,7 +213876,7 @@ static void fts5MultiIterNext( pSeg->xNext(p, pSeg, &bNewTerm); } - if( pSeg->pLeaf==0 || bNewTerm + if( pSeg->pLeaf==0 || bNewTerm || fts5MultiIterAdvanceRowid(pIter, iFirst, &pSeg) ){ fts5MultiIterAdvanced(p, pIter, iFirst, 1); @@ -213896,7 +213896,7 @@ static void fts5MultiIterNext( } static void fts5MultiIterNext2( - Fts5Index *p, + Fts5Index *p, Fts5Iter *pIter, int *pbNewTerm /* OUT: True if *might* be new term */ ){ @@ -213910,7 +213910,7 @@ static void fts5MultiIterNext2( assert( p->rc==SQLITE_OK ); pSeg->xNext(p, pSeg, &bNewTerm); - if( pSeg->pLeaf==0 || bNewTerm + if( pSeg->pLeaf==0 || bNewTerm || fts5MultiIterAdvanceRowid(pIter, iFirst, &pSeg) ){ fts5MultiIterAdvanced(p, pIter, iFirst, 1); @@ -213935,7 +213935,7 @@ static Fts5Iter *fts5MultiIterAlloc( int nSlot; /* Power of two >= nSeg */ for(nSlot=2; nSlotaSeg[] */ sizeof(Fts5CResult) * nSlot /* pNew->aFirst[] */ @@ -213950,8 +213950,8 @@ static Fts5Iter *fts5MultiIterAlloc( } static void fts5PoslistCallback( - Fts5Index *pUnused, - void *pContext, + Fts5Index *pUnused, + void *pContext, const u8 *pChunk, int nChunk ){ UNUSED_PARAM(pUnused); @@ -213988,8 +213988,8 @@ static int fts5IndexColsetTest(Fts5Colset *pColset, int iCol){ } static void fts5PoslistOffsetsCallback( - Fts5Index *pUnused, - void *pContext, + Fts5Index *pUnused, + void *pContext, const u8 *pChunk, int nChunk ){ PoslistOffsetsCtx *pCtx = (PoslistOffsetsCtx*)pContext; @@ -214012,7 +214012,7 @@ static void fts5PoslistOffsetsCallback( static void fts5PoslistFilterCallback( Fts5Index *pUnused, - void *pContext, + void *pContext, const u8 *pChunk, int nChunk ){ PoslistCallbackCtx *pCtx = (PoslistCallbackCtx*)pContext; @@ -214157,7 +214157,7 @@ static int fts5IndexExtractCol( while( iCol>iCurrent ){ /* Advance pointer p until it points to pEnd or an 0x01 byte that is ** not part of a varint. Note that it is not possible for a negative - ** or extremely large varint to occur within an uncorrupted position + ** or extremely large varint to occur within an uncorrupted position ** list. So the last byte of each varint may be assumed to have a clear ** 0x80 bit. */ while( *p!=0x01 ){ @@ -214222,7 +214222,7 @@ static void fts5IterSetOutputs_Nocolset(Fts5Iter *pIter, Fts5SegIter *pSeg){ assert( pIter->pColset==0 ); if( pSeg->iLeafOffset+pSeg->nPos<=pSeg->pLeaf->szLeaf ){ - /* All data is stored on the current page. Populate the output + /* All data is stored on the current page. Populate the output ** variables to point into the body of the page object. */ pIter->base.pData = &pSeg->pLeaf->p[pSeg->iLeafOffset]; }else{ @@ -214258,13 +214258,13 @@ static void fts5IterSetOutputs_Col(Fts5Iter *pIter, Fts5SegIter *pSeg){ } /* -** xSetOutputs callback used when: +** xSetOutputs callback used when: ** ** * detail=col, ** * there is a column filter, and -** * the table contains 100 or fewer columns. +** * the table contains 100 or fewer columns. ** -** The last point is to ensure all column numbers are stored as +** The last point is to ensure all column numbers are stored as ** single-byte varints. */ static void fts5IterSetOutputs_Col100(Fts5Iter *pIter, Fts5SegIter *pSeg){ @@ -214276,7 +214276,7 @@ static void fts5IterSetOutputs_Col100(Fts5Iter *pIter, Fts5SegIter *pSeg){ fts5IterSetOutputs_Col(pIter, pSeg); }else{ u8 *a = (u8*)&pSeg->pLeaf->p[pSeg->iLeafOffset]; - u8 *pEnd = (u8*)&a[pSeg->nPos]; + u8 *pEnd = (u8*)&a[pSeg->nPos]; int iPrev = 0; int *aiCol = pIter->pColset->aiCol; int *aiColEnd = &aiCol[pIter->pColset->nCol]; @@ -214315,7 +214315,7 @@ static void fts5IterSetOutputs_Full(Fts5Iter *pIter, Fts5SegIter *pSeg){ assert( pColset ); if( pSeg->iLeafOffset+pSeg->nPos<=pSeg->pLeaf->szLeaf ){ - /* All data is stored on the current page. Populate the output + /* All data is stored on the current page. Populate the output ** variables to point into the body of the page object. */ const u8 *a = &pSeg->pLeaf->p[pSeg->iLeafOffset]; if( pColset->nCol==1 ){ @@ -214379,7 +214379,7 @@ static void fts5IterSetOutputCb(int *pRc, Fts5Iter *pIter){ ** is zero or greater, data from the first nSegment segments on level iLevel ** is merged. ** -** The iterator initially points to the first term/rowid entry in the +** The iterator initially points to the first term/rowid entry in the ** iterated data. */ static void fts5MultiIterNew( @@ -214448,8 +214448,8 @@ static void fts5MultiIterNew( assert( iIter==nSeg ); } - /* If the above was successful, each component iterators now points - ** to the first entry in its segment. In this case initialize the + /* If the above was successful, each component iterators now points + ** to the first entry in its segment. In this case initialize the ** aFirst[] array. Or, if an error has occurred, free the iterator ** object and set the output variable to NULL. */ if( p->rc==SQLITE_OK ){ @@ -214518,12 +214518,12 @@ static void fts5MultiIterNew2( } /* -** Return true if the iterator is at EOF or if an error has occurred. +** Return true if the iterator is at EOF or if an error has occurred. ** False otherwise. */ static int fts5MultiIterEof(Fts5Index *p, Fts5Iter *pIter){ - assert( p->rc - || (pIter->aSeg[ pIter->aFirst[1].iFirst ].pLeaf==0)==pIter->base.bEof + assert( p->rc + || (pIter->aSeg[ pIter->aFirst[1].iFirst ].pLeaf==0)==pIter->base.bEof ); return (p->rc || pIter->base.bEof); } @@ -214542,8 +214542,8 @@ static i64 fts5MultiIterRowid(Fts5Iter *pIter){ ** Move the iterator to the next entry at or following iMatch. */ static void fts5MultiIterNextFrom( - Fts5Index *p, - Fts5Iter *pIter, + Fts5Index *p, + Fts5Iter *pIter, i64 iMatch ){ while( 1 ){ @@ -214557,7 +214557,7 @@ static void fts5MultiIterNextFrom( } /* -** Return a pointer to a buffer containing the term associated with the +** Return a pointer to a buffer containing the term associated with the ** entry that the iterator currently points to. */ static const u8 *fts5MultiIterTerm(Fts5Iter *pIter, int *pn){ @@ -214568,11 +214568,11 @@ static const u8 *fts5MultiIterTerm(Fts5Iter *pIter, int *pn){ /* ** Allocate a new segment-id for the structure pStruct. The new segment -** id must be between 1 and 65335 inclusive, and must not be used by +** id must be between 1 and 65335 inclusive, and must not be used by ** any currently existing segment. If a free segment id cannot be found, ** SQLITE_FULL is returned. ** -** If an error has already occurred, this function is a no-op. 0 is +** If an error has already occurred, this function is a no-op. 0 is ** returned in this case. */ static int fts5AllocateSegid(Fts5Index *p, Fts5Structure *pStruct){ @@ -214641,10 +214641,10 @@ static void fts5IndexDiscardData(Fts5Index *p){ } /* -** Return the size of the prefix, in bytes, that buffer +** Return the size of the prefix, in bytes, that buffer ** (pNew/) shares with buffer (pOld/nOld). ** -** Buffer (pNew/) is guaranteed to be greater +** Buffer (pNew/) is guaranteed to be greater ** than buffer (pOld/nOld). */ static int fts5PrefixCompress(int nOld, const u8 *pOld, const u8 *pNew){ @@ -214656,7 +214656,7 @@ static int fts5PrefixCompress(int nOld, const u8 *pOld, const u8 *pNew){ } static void fts5WriteDlidxClear( - Fts5Index *p, + Fts5Index *p, Fts5SegWriter *pWriter, int bFlush /* If true, write dlidx to disk */ ){ @@ -214667,7 +214667,7 @@ static void fts5WriteDlidxClear( if( pDlidx->buf.n==0 ) break; if( bFlush ){ assert( pDlidx->pgno!=0 ); - fts5DataWrite(p, + fts5DataWrite(p, FTS5_DLIDX_ROWID(pWriter->iSegid, i, pDlidx->pgno), pDlidx->buf.p, pDlidx->buf.n ); @@ -214721,8 +214721,8 @@ static int fts5WriteFlushDlidx(Fts5Index *p, Fts5SegWriter *pWriter){ } /* -** This function is called whenever processing of the doclist for the -** last term on leaf page (pWriter->iBtPage) is completed. +** This function is called whenever processing of the doclist for the +** last term on leaf page (pWriter->iBtPage) is completed. ** ** The doclist-index for that term is currently stored in-memory within the ** Fts5SegWriter.aDlidx[] array. If it is large enough, this function @@ -214807,8 +214807,8 @@ static i64 fts5DlidxExtractFirstRowid(Fts5Buffer *pBuf){ ** doclist-index. */ static void fts5WriteDlidxAppend( - Fts5Index *p, - Fts5SegWriter *pWriter, + Fts5Index *p, + Fts5SegWriter *pWriter, i64 iRowid ){ int i; @@ -214821,11 +214821,11 @@ static void fts5WriteDlidxAppend( if( pDlidx->buf.n>=p->pConfig->pgsz ){ /* The current doclist-index page is full. Write it to disk and push ** a copy of iRowid (which will become the first rowid on the next - ** doclist-index leaf page) up into the next level of the b-tree + ** doclist-index leaf page) up into the next level of the b-tree ** hierarchy. If the node being flushed is currently the root node, ** also push its first rowid upwards. */ pDlidx->buf.p[0] = 0x01; /* Not the root node */ - fts5DataWrite(p, + fts5DataWrite(p, FTS5_DLIDX_ROWID(pWriter->iSegid, i, pDlidx->pgno), pDlidx->buf.p, pDlidx->buf.n ); @@ -214909,13 +214909,13 @@ static void fts5WriteFlushLeaf(Fts5Index *p, Fts5SegWriter *pWriter){ ** Append term pTerm/nTerm to the segment being written by the writer passed ** as the second argument. ** -** If an error occurs, set the Fts5Index.rc error code. If an error has +** If an error occurs, set the Fts5Index.rc error code. If an error has ** already occurred, this function is a no-op. */ static void fts5WriteAppendTerm( - Fts5Index *p, + Fts5Index *p, Fts5SegWriter *pWriter, - int nTerm, const u8 *pTerm + int nTerm, const u8 *pTerm ){ int nPrefix; /* Bytes of prefix compression for term */ Fts5PageWriter *pPage = &pWriter->writer; @@ -214934,7 +214934,7 @@ static void fts5WriteAppendTerm( } fts5BufferGrow(&p->rc, &pPage->buf, nTerm+FTS5_DATA_PADDING); } - + /* TODO1: Updating pgidx here. */ pPgidx->n += sqlite3Fts5PutVarint( &pPgidx->p[pPgidx->n], pPage->buf.n - pPage->iPrevPgidx @@ -214950,11 +214950,11 @@ static void fts5WriteAppendTerm( if( pPage->pgno!=1 ){ /* This is the first term on a leaf that is not the leftmost leaf in ** the segment b-tree. In this case it is necessary to add a term to - ** the b-tree hierarchy that is (a) larger than the largest term + ** the b-tree hierarchy that is (a) larger than the largest term ** already written to the segment and (b) smaller than or equal to ** this term. In other words, a prefix of (pTerm/nTerm) that is one ** byte longer than the longest prefix (pTerm/nTerm) shares with the - ** previous term. + ** previous term. ** ** Usually, the previous term is available in pPage->term. The exception ** is if this is the first term written in an incremental-merge step. @@ -214991,10 +214991,10 @@ static void fts5WriteAppendTerm( } /* -** Append a rowid and position-list size field to the writers output. +** Append a rowid and position-list size field to the writers output. */ static void fts5WriteAppendRowid( - Fts5Index *p, + Fts5Index *p, Fts5SegWriter *pWriter, i64 iRowid ){ @@ -215005,7 +215005,7 @@ static void fts5WriteAppendRowid( fts5WriteFlushLeaf(p, pWriter); } - /* If this is to be the first rowid written to the page, set the + /* If this is to be the first rowid written to the page, set the ** rowid-pointer in the page-header. Also append a value to the dlidx ** buffer, in case a doclist-index is required. */ if( pWriter->bFirstRowidInPage ){ @@ -215027,18 +215027,18 @@ static void fts5WriteAppendRowid( } static void fts5WriteAppendPoslistData( - Fts5Index *p, - Fts5SegWriter *pWriter, - const u8 *aData, + Fts5Index *p, + Fts5SegWriter *pWriter, + const u8 *aData, int nData ){ Fts5PageWriter *pPage = &pWriter->writer; const u8 *a = aData; int n = nData; - + assert( p->pConfig->pgsz>0 ); - while( p->rc==SQLITE_OK - && (pPage->buf.n + pPage->pgidx.n + n)>=p->pConfig->pgsz + while( p->rc==SQLITE_OK + && (pPage->buf.n + pPage->pgidx.n + n)>=p->pConfig->pgsz ){ int nReq = p->pConfig->pgsz - pPage->buf.n - pPage->pgidx.n; int nCopy = 0; @@ -215061,7 +215061,7 @@ static void fts5WriteAppendPoslistData( ** allocations associated with the writer. */ static void fts5WriteFinish( - Fts5Index *p, + Fts5Index *p, Fts5SegWriter *pWriter, /* Writer object */ int *pnLeaf /* OUT: Number of leaf pages in b-tree */ ){ @@ -215089,8 +215089,8 @@ static void fts5WriteFinish( } static void fts5WriteInit( - Fts5Index *p, - Fts5SegWriter *pWriter, + Fts5Index *p, + Fts5SegWriter *pWriter, int iSegid ){ const int nBuffer = p->pConfig->pgsz + FTS5_DATA_PADDING; @@ -215113,7 +215113,7 @@ static void fts5WriteInit( if( p->pIdxWriter==0 ){ Fts5Config *pConfig = p->pConfig; fts5IndexPrepareStmt(p, &p->pIdxWriter, sqlite3_mprintf( - "INSERT INTO '%q'.'%q_idx'(segid,term,pgno) VALUES(?,?,?)", + "INSERT INTO '%q'.'%q_idx'(segid,term,pgno) VALUES(?,?,?)", pConfig->zDb, pConfig->zName )); } @@ -215179,13 +215179,13 @@ static void fts5TrimSegments(Fts5Index *p, Fts5Iter *pIter){ /* Set up the new page-index array */ fts5BufferAppendVarint(&p->rc, &buf, 4); - if( pSeg->iLeafPgno==pSeg->iTermLeafPgno + if( pSeg->iLeafPgno==pSeg->iTermLeafPgno && pSeg->iEndofDoclistszLeaf && pSeg->iPgidxOff<=pData->nn ){ int nDiff = pData->szLeaf - pSeg->iEndofDoclist; fts5BufferAppendVarint(&p->rc, &buf, buf.n - 1 - nDiff - 4); - fts5BufferAppendBlob(&p->rc, &buf, + fts5BufferAppendBlob(&p->rc, &buf, pData->nn - pSeg->iPgidxOff, &pData->p[pSeg->iPgidxOff] ); } @@ -215202,8 +215202,8 @@ static void fts5TrimSegments(Fts5Index *p, Fts5Iter *pIter){ } static void fts5MergeChunkCallback( - Fts5Index *p, - void *pCtx, + Fts5Index *p, + void *pCtx, const u8 *pChunk, int nChunk ){ Fts5SegWriter *pWriter = (Fts5SegWriter*)pCtx; @@ -215418,7 +215418,7 @@ static int fts5IndexMerge( ** segment. This function updates the write-counter accordingly and, if ** necessary, performs incremental merge work. ** -** If an error occurs, set the Fts5Index.rc error code. If an error has +** If an error occurs, set the Fts5Index.rc error code. If an error has ** already occurred, this function is a no-op. */ static void fts5IndexAutomerge( @@ -215469,12 +215469,12 @@ static int fts5IndexReturn(Fts5Index *p){ typedef struct Fts5FlushCtx Fts5FlushCtx; struct Fts5FlushCtx { Fts5Index *pIdx; - Fts5SegWriter writer; + Fts5SegWriter writer; }; /* ** Buffer aBuf[] contains a list of varints, all small enough to fit -** in a 32-bit integer. Return the size of the largest prefix of this +** in a 32-bit integer. Return the size of the largest prefix of this ** list nMax bytes or less in size. */ static int fts5PoslistPrefix(const u8 *aBuf, int nMax){ @@ -215492,10 +215492,10 @@ static int fts5PoslistPrefix(const u8 *aBuf, int nMax){ } /* -** Flush the contents of in-memory hash table iHash to a new level-0 +** Flush the contents of in-memory hash table iHash to a new level-0 ** segment on disk. Also update the corresponding structure record. ** -** If an error occurs, set the Fts5Index.rc error code. If an error has +** If an error occurs, set the Fts5Index.rc error code. If an error has ** already occurred, this function is a no-op. */ static void fts5FlushOneHash(Fts5Index *p){ @@ -215552,13 +215552,13 @@ static void fts5FlushOneHash(Fts5Index *p){ i64 iDelta = 0; int iOff = 0; - /* The entire doclist will not fit on this leaf. The following - ** loop iterates through the poslists that make up the current + /* The entire doclist will not fit on this leaf. The following + ** loop iterates through the poslists that make up the current ** doclist. */ while( p->rc==SQLITE_OK && iOffp[0], (u16)pBuf->n); /* first rowid on page */ pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], iRowid); @@ -215662,7 +215662,7 @@ static void fts5IndexFlush(Fts5Index *p){ } static Fts5Structure *fts5IndexOptimizeStruct( - Fts5Index *p, + Fts5Index *p, Fts5Structure *pStruct ){ Fts5Structure *pNew = 0; @@ -215673,7 +215673,7 @@ static Fts5Structure *fts5IndexOptimizeStruct( /* Figure out if this structure requires optimization. A structure does ** not require optimization if either: ** - ** + it consists of fewer than two segments, or + ** + it consists of fewer than two segments, or ** + all segments are on the same level, or ** + all segments except one are currently inputs to a merge operation. ** @@ -215750,7 +215750,7 @@ static int sqlite3Fts5IndexOptimize(Fts5Index *p){ fts5StructureRelease(pNew); } - return fts5IndexReturn(p); + return fts5IndexReturn(p); } /* @@ -215834,7 +215834,7 @@ static void fts5DoclistIterNext(Fts5DoclistIter *pIter){ } static void fts5DoclistIterInit( - Fts5Buffer *pBuf, + Fts5Buffer *pBuf, Fts5DoclistIter *pIter ){ memset(pIter, 0, sizeof(*pIter)); @@ -215950,17 +215950,17 @@ static void fts5MergePrefixLists( Fts5Buffer out = {0, 0, 0}; Fts5Buffer tmp = {0, 0, 0}; - /* The maximum size of the output is equal to the sum of the two + /* The maximum size of the output is equal to the sum of the two ** input sizes + 1 varint (9 bytes). The extra varint is because if the ** first rowid in one input is a large negative number, and the first in ** the other a non-negative number, the delta for the non-negative ** number will be larger on disk than the literal integer value - ** was. + ** was. ** ** Or, if the input position-lists are corrupt, then the output might ** include up to 2 extra 10-byte positions created by interpreting -1 ** (the value PoslistNext64() uses for EOF) as a position and appending - ** it to the output. This can happen at most once for each input + ** it to the output. This can happen at most once for each input ** position-list, hence two 10 byte paddings. */ if( sqlite3Fts5BufferSize(&p->rc, &out, p1->n + p2->n + 9+10+10) ) return; fts5DoclistIterInit(p1, &i1); @@ -215984,7 +215984,7 @@ static void fts5MergePrefixLists( assert( out.n<=((i1.aPoslist-p1->p) + (i2.aPoslist-p2->p)+9+10+10) ); } else{ - /* Merge the two position lists. */ + /* Merge the two position lists. */ i64 iPos1 = 0; i64 iPos2 = 0; int iOff1 = 0; @@ -216109,8 +216109,8 @@ static void fts5SetupPrefixIter( pStruct = fts5StructureRead(p); if( aBuf && pStruct ){ - const int flags = FTS5INDEX_QUERY_SCAN - | FTS5INDEX_QUERY_SKIPEMPTY + const int flags = FTS5INDEX_QUERY_SCAN + | FTS5INDEX_QUERY_SKIPEMPTY | FTS5INDEX_QUERY_NOOUTPUT; int i; i64 iLastRowid = 0; @@ -216192,9 +216192,9 @@ static int sqlite3Fts5IndexBeginWrite(Fts5Index *p, int bDelete, i64 iRowid){ } /* Flush the hash table to disk if required */ - if( iRowidiWriteRowid + if( iRowidiWriteRowid || (iRowid==p->iWriteRowid && p->bDelete==0) - || (p->nPendingData > p->pConfig->nHashSize) + || (p->nPendingData > p->pConfig->nHashSize) ){ fts5IndexFlush(p); } @@ -216217,7 +216217,7 @@ static int sqlite3Fts5IndexSync(Fts5Index *p){ /* ** Discard any data stored in the in-memory hash tables. Do not write it ** to the database. Additionally, assume that the contents of the %_data -** table may have changed on disk. So any in-memory caches of %_data +** table may have changed on disk. So any in-memory caches of %_data ** records must be invalidated. */ static int sqlite3Fts5IndexRollback(Fts5Index *p){ @@ -216250,8 +216250,8 @@ static int sqlite3Fts5IndexReinit(Fts5Index *p){ ** Otherwise, set *pp to NULL and return an SQLite error code. */ static int sqlite3Fts5IndexOpen( - Fts5Config *pConfig, - int bCreate, + Fts5Config *pConfig, + int bCreate, Fts5Index **pp, char **pzErr ){ @@ -216268,8 +216268,8 @@ static int sqlite3Fts5IndexOpen( pConfig, "data", "id INTEGER PRIMARY KEY, block BLOB", 0, pzErr ); if( rc==SQLITE_OK ){ - rc = sqlite3Fts5CreateTable(pConfig, "idx", - "segid, term, pgno, PRIMARY KEY(segid, term)", + rc = sqlite3Fts5CreateTable(pConfig, "idx", + "segid, term, pgno, PRIMARY KEY(segid, term)", 1, pzErr ); } @@ -216309,13 +216309,13 @@ static int sqlite3Fts5IndexClose(Fts5Index *p){ } /* -** Argument p points to a buffer containing utf-8 text that is n bytes in +** Argument p points to a buffer containing utf-8 text that is n bytes in ** size. Return the number of bytes in the nChar character prefix of the ** buffer, or 0 if there are less than nChar characters in total. */ static int sqlite3Fts5IndexCharlenToBytelen( - const char *p, - int nByte, + const char *p, + int nByte, int nChar ){ int n = 0; @@ -216337,7 +216337,7 @@ static int sqlite3Fts5IndexCharlenToBytelen( ** unicode characters in the string. */ static int fts5IndexCharlen(const char *pIn, int nIn){ - int nChar = 0; + int nChar = 0; int i = 0; while( i=0xc0 ){ @@ -216349,7 +216349,7 @@ static int fts5IndexCharlen(const char *pIn, int nIn){ } /* -** Insert or remove data to or from the index. Each time a document is +** Insert or remove data to or from the index. Each time a document is ** added to or removed from the index, this function is called one or more ** times. ** @@ -216380,7 +216380,7 @@ static int sqlite3Fts5IndexWrite( const int nChar = pConfig->aPrefix[i]; int nByte = sqlite3Fts5IndexCharlenToBytelen(pToken, nToken, nChar); if( nByte ){ - rc = sqlite3Fts5HashWrite(p->pHash, + rc = sqlite3Fts5HashWrite(p->pHash, p->iWriteRowid, iCol, iPos, (char)(FTS5_MAIN_PREFIX+i+1), pToken, nByte ); @@ -216391,7 +216391,7 @@ static int sqlite3Fts5IndexWrite( } /* -** Open a new iterator to iterate though all rowid that match the +** Open a new iterator to iterate though all rowid that match the ** specified token or token prefix. */ static int sqlite3Fts5IndexQuery( @@ -216418,9 +216418,9 @@ static int sqlite3Fts5IndexQuery( ** satisfied by scanning multiple terms in the main index. ** ** If the QUERY_TEST_NOIDX flag was specified, then this must be a - ** prefix-query. Instead of using a prefix-index (if one exists), + ** prefix-query. Instead of using a prefix-index (if one exists), ** evaluate the prefix query using the main FTS index. This is used - ** for internal sanity checking by the integrity-check in debug + ** for internal sanity checking by the integrity-check in debug ** mode only. */ #ifdef SQLITE_DEBUG if( pConfig->bPrefixIndex==0 || (flags & FTS5INDEX_QUERY_TEST_NOIDX) ){ @@ -216440,7 +216440,7 @@ static int sqlite3Fts5IndexQuery( Fts5Structure *pStruct = fts5StructureRead(p); buf.p[0] = (u8)(FTS5_MAIN_PREFIX + iIdx); if( pStruct ){ - fts5MultiIterNew(p, pStruct, flags | FTS5INDEX_QUERY_SKIPEMPTY, + fts5MultiIterNew(p, pStruct, flags | FTS5INDEX_QUERY_SKIPEMPTY, pColset, buf.p, nToken+1, -1, 0, &pRet ); fts5StructureRelease(pStruct); @@ -216474,7 +216474,7 @@ static int sqlite3Fts5IndexQuery( ** Return true if the iterator passed as the only argument is at EOF. */ /* -** Move to the next matching rowid. +** Move to the next matching rowid. */ static int sqlite3Fts5IterNext(Fts5IndexIter *pIndexIter){ Fts5Iter *pIter = (Fts5Iter*)pIndexIter; @@ -216539,7 +216539,7 @@ static void sqlite3Fts5IterClose(Fts5IndexIter *pIndexIter){ } /* -** Read and decode the "averages" record from the database. +** Read and decode the "averages" record from the database. ** ** Parameter anSize must point to an array of size nCol, where nCol is ** the number of user defined columns in the FTS table. @@ -216565,7 +216565,7 @@ static int sqlite3Fts5IndexGetAverages(Fts5Index *p, i64 *pnRow, i64 *anSize){ } /* -** Replace the current "averages" record with the contents of the buffer +** Replace the current "averages" record with the contents of the buffer ** supplied as the second argument. */ static int sqlite3Fts5IndexSetAverages(Fts5Index *p, const u8 *pData, int nData){ @@ -216583,7 +216583,7 @@ static int sqlite3Fts5IndexReads(Fts5Index *p){ } /* -** Set the 32-bit cookie value stored at the start of all structure +** Set the 32-bit cookie value stored at the start of all structure ** records to the value passed as the second argument. ** ** Return SQLITE_OK if successful, or an SQLite error code if an error @@ -216598,7 +216598,7 @@ static int sqlite3Fts5IndexSetCookie(Fts5Index *p, int iNew){ assert( p->rc==SQLITE_OK ); sqlite3Fts5Put32(aCookie, iNew); - rc = sqlite3_blob_open(pConfig->db, pConfig->zDb, p->zDataTbl, + rc = sqlite3_blob_open(pConfig->db, pConfig->zDb, p->zDataTbl, "block", FTS5_STRUCTURE_ROWID, 1, &pBlob ); if( rc==SQLITE_OK ){ @@ -216619,7 +216619,7 @@ static int sqlite3Fts5IndexLoadConfig(Fts5Index *p){ /************************************************************************* ************************************************************************** -** Below this point is the implementation of the integrity-check +** Below this point is the implementation of the integrity-check ** functionality. */ @@ -216627,9 +216627,9 @@ static int sqlite3Fts5IndexLoadConfig(Fts5Index *p){ ** Return a simple checksum value based on the arguments. */ static u64 sqlite3Fts5IndexEntryCksum( - i64 iRowid, - int iCol, - int iPos, + i64 iRowid, + int iCol, + int iPos, int iIdx, const char *pTerm, int nTerm @@ -216645,15 +216645,15 @@ static u64 sqlite3Fts5IndexEntryCksum( #ifdef SQLITE_DEBUG /* -** This function is purely an internal test. It does not contribute to +** This function is purely an internal test. It does not contribute to ** FTS functionality, or even the integrity-check, in any way. ** -** Instead, it tests that the same set of pgno/rowid combinations are +** Instead, it tests that the same set of pgno/rowid combinations are ** visited regardless of whether the doclist-index identified by parameters ** iSegid/iLeaf is iterated in forwards or reverse order. */ static void fts5TestDlidxReverse( - Fts5Index *p, + Fts5Index *p, int iSegid, /* Segment id to load from */ int iLeaf /* Load doclist-index for this leaf */ ){ @@ -216729,11 +216729,11 @@ static int fts5QueryCksum( /* -** This function is also purely an internal test. It does not contribute to +** This function is also purely an internal test. It does not contribute to ** FTS functionality, or even the integrity-check, in any way. */ static void fts5TestTerm( - Fts5Index *p, + Fts5Index *p, Fts5Buffer *pPrev, /* Previous term */ const char *z, int n, /* Possibly new term to test */ u64 expected, @@ -216762,7 +216762,7 @@ static void fts5TestTerm( if( rc==SQLITE_OK && ck1!=ck2 ) rc = FTS5_CORRUPT; /* If this is a prefix query, check that the results returned if the - ** the index is disabled are the same. In both ASC and DESC order. + ** the index is disabled are the same. In both ASC and DESC order. ** ** This check may only be performed if the hash table is empty. This ** is because the hash table only supports a single scan query at @@ -216793,7 +216793,7 @@ static void fts5TestTerm( } p->rc = rc; } - + #else # define fts5TestDlidxReverse(x,y,z) # define fts5TestTerm(u,v,w,x,y,z) @@ -216905,7 +216905,7 @@ static void fts5IndexIntegrityCheckSegment( int iIdxLeaf = sqlite3_column_int(pStmt, 2); int bIdxDlidx = sqlite3_column_int(pStmt, 3); - /* If the leaf in question has already been trimmed from the segment, + /* If the leaf in question has already been trimmed from the segment, ** ignore this b-tree entry. Otherwise, load it into memory. */ if( iIdxLeafpgnoFirst ) continue; iRow = FTS5_SEGMENT_ROWID(pSeg->iSegid, iIdxLeaf); @@ -217013,7 +217013,7 @@ static void fts5IndexIntegrityCheckSegment( /* -** Run internal checks to ensure that the FTS index (a) is internally +** Run internal checks to ensure that the FTS index (a) is internally ** consistent and (b) contains entries for which the XOR of the checksums ** as calculated by sqlite3Fts5IndexEntryCksum() is cksum. ** @@ -217035,7 +217035,7 @@ static int sqlite3Fts5IndexIntegrityCheck(Fts5Index *p, u64 cksum){ Fts5Buffer term = {0,0,0}; /* Buffer used to hold most recent term */ #endif const int flags = FTS5INDEX_QUERY_NOOUTPUT; - + /* Load the FTS index structure */ pStruct = fts5StructureRead(p); @@ -217057,7 +217057,7 @@ static int sqlite3Fts5IndexIntegrityCheck(Fts5Index *p, u64 cksum){ ** ** Two versions of the same checksum are calculated. The first (stack ** variable cksum2) based on entries extracted from the full-text index - ** while doing a linear scan of each individual index in turn. + ** while doing a linear scan of each individual index in turn. ** ** As each term visited by the linear scans, a separate query for the ** same term is performed. cksum3 is calculated based on the entries @@ -217159,12 +217159,12 @@ static void fts5DebugStructure( for(iLvl=0; iLvlnLevel; iLvl++){ Fts5StructureLevel *pLvl = &p->aLevel[iLvl]; - sqlite3Fts5BufferAppendPrintf(pRc, pBuf, + sqlite3Fts5BufferAppendPrintf(pRc, pBuf, " {lvl=%d nMerge=%d nSeg=%d", iLvl, pLvl->nMerge, pLvl->nSeg ); for(iSeg=0; iSegnSeg; iSeg++){ Fts5StructureSegment *pSeg = &pLvl->aSeg[iSeg]; - sqlite3Fts5BufferAppendPrintf(pRc, pBuf, " {id=%d leaves=%d..%d}", + sqlite3Fts5BufferAppendPrintf(pRc, pBuf, " {id=%d leaves=%d..%d}", pSeg->iSegid, pSeg->pgnoFirst, pSeg->pgnoLast ); } @@ -217177,7 +217177,7 @@ static void fts5DebugStructure( ** ** Arguments pBlob/nBlob contain a serialized Fts5Structure object. This ** function appends a human-readable representation of the same object -** to the buffer passed as the second argument. +** to the buffer passed as the second argument. */ static void fts5DecodeStructure( int *pRc, /* IN/OUT: error code */ @@ -217200,9 +217200,9 @@ static void fts5DecodeStructure( /* ** This is part of the fts5_decode() debugging aid. ** -** Arguments pBlob/nBlob contain an "averages" record. This function -** appends a human-readable representation of record to the buffer passed -** as the second argument. +** Arguments pBlob/nBlob contain an "averages" record. This function +** appends a human-readable representation of record to the buffer passed +** as the second argument. */ static void fts5DecodeAverages( int *pRc, /* IN/OUT: error code */ @@ -217241,7 +217241,7 @@ static int fts5DecodePoslist(int *pRc, Fts5Buffer *pBuf, const u8 *a, int n){ ** The start of buffer (a/n) contains the start of a doclist. The doclist ** may or may not finish within the buffer. This function appends a text ** representation of the part of the doclist that is present to buffer -** pBuf. +** pBuf. ** ** The return value is the number of bytes read from the input buffer. */ @@ -217271,7 +217271,7 @@ static int fts5DecodeDoclist(int *pRc, Fts5Buffer *pBuf, const u8 *a, int n){ } /* -** This function is part of the fts5_decode() debugging function. It is +** This function is part of the fts5_decode() debugging function. It is ** only ever used with detail=none tables. ** ** Buffer (pData/nData) contains a doclist in the format used by detail=none @@ -217358,7 +217358,7 @@ static void fts5DecodeFunction( lvl.iLeafPgno = iPgno; for(fts5DlidxLvlNext(&lvl); lvl.bEof==0; fts5DlidxLvlNext(&lvl)){ - sqlite3Fts5BufferAppendPrintf(&rc, &s, + sqlite3Fts5BufferAppendPrintf(&rc, &s, " %d(%lld)", lvl.iLeafPgno, lvl.iRowid ); } @@ -217469,7 +217469,7 @@ static void fts5DecodeFunction( int bFirst = (iPgidxOff==szLeaf); /* True for first term on page */ int nByte; /* Bytes of data */ int iEnd; - + iPgidxOff += fts5GetVarint32(&a[iPgidxOff], nByte); iPgidxPrev += nByte; iOff = iPgidxPrev; @@ -217509,7 +217509,7 @@ static void fts5DecodeFunction( fts5BufferFree(&term); } - + decode_out: sqlite3_free(a); if( rc==SQLITE_OK ){ @@ -217537,7 +217537,7 @@ static void fts5RowidFunction( i64 iRowid; int segid, pgno; if( nArg!=3 ){ - sqlite3_result_error(pCtx, + sqlite3_result_error(pCtx, "should be: fts5_rowid('segment', segid, pgno))", -1 ); }else{ @@ -217547,7 +217547,7 @@ static void fts5RowidFunction( sqlite3_result_int64(pCtx, iRowid); } }else{ - sqlite3_result_error(pCtx, + sqlite3_result_error(pCtx, "first arg to fts5_rowid() must be 'segment'" , -1 ); } @@ -217569,7 +217569,7 @@ static int sqlite3Fts5IndexInit(sqlite3 *db){ if( rc==SQLITE_OK ){ rc = sqlite3_create_function( - db, "fts5_decode_none", 2, + db, "fts5_decode_none", 2, SQLITE_UTF8, (void*)db, fts5DecodeFunction, 0, 0 ); } @@ -217626,9 +217626,9 @@ typedef struct Fts5Sorter Fts5Sorter; typedef struct Fts5TokenizerModule Fts5TokenizerModule; /* -** NOTES ON TRANSACTIONS: +** NOTES ON TRANSACTIONS: ** -** SQLite invokes the following virtual table methods as transactions are +** SQLite invokes the following virtual table methods as transactions are ** opened and closed by the user: ** ** xBegin(): Start of a new transaction. @@ -217637,7 +217637,7 @@ typedef struct Fts5TokenizerModule Fts5TokenizerModule; ** xRollback(): Rollback the transaction. ** ** Anything that is required as part of a commit that may fail is performed -** in the xSync() callback. Current versions of SQLite ignore any errors +** in the xSync() callback. Current versions of SQLite ignore any errors ** returned by xCommit(). ** ** And as sub-transactions are opened/closed: @@ -217646,9 +217646,9 @@ typedef struct Fts5TokenizerModule Fts5TokenizerModule; ** xRelease(int S): Commit and close savepoint S. ** xRollbackTo(int S): Rollback to start of savepoint S. ** -** During a write-transaction the fts5_index.c module may cache some data +** During a write-transaction the fts5_index.c module may cache some data ** in-memory. It is flushed to disk whenever xSync(), xRelease() or -** xSavepoint() is called. And discarded whenever xRollback() or xRollbackTo() +** xSavepoint() is called. And discarded whenever xRollback() or xRollbackTo() ** is called. ** ** Additionally, if SQLITE_DEBUG is defined, an instance of the following @@ -217662,13 +217662,13 @@ struct Fts5TransactionState { }; /* -** A single object of this type is allocated when the FTS5 module is +** A single object of this type is allocated when the FTS5 module is ** registered with a database handle. It is used to store pointers to ** all registered FTS5 extensions - tokenizers and auxiliary functions. */ struct Fts5Global { fts5_api api; /* User visible part of object (see fts5.h) */ - sqlite3 *db; /* Associated database connection */ + sqlite3 *db; /* Associated database connection */ i64 iNextId; /* Used to allocate unique cursor ids */ Fts5Auxiliary *pAux; /* First in list of all aux. functions */ Fts5TokenizerModule *pTok; /* First in list of all tokenizer modules */ @@ -217724,7 +217724,7 @@ struct Fts5MatchPhrase { ** ** aIdx[]: ** There is one entry in the aIdx[] array for each phrase in the query, -** the value of which is the offset within aPoslist[] following the last +** the value of which is the offset within aPoslist[] following the last ** byte of the position list for the corresponding phrase. */ struct Fts5Sorter { @@ -217740,8 +217740,8 @@ struct Fts5Sorter { ** Virtual-table cursor object. ** ** iSpecial: -** If this is a 'special' query (refer to function fts5SpecialMatch()), -** then this variable contains the result of the query. +** If this is a 'special' query (refer to function fts5SpecialMatch()), +** then this variable contains the result of the query. ** ** iFirstRowid, iLastRowid: ** These variables are only used for FTS5_PLAN_MATCH cursors. Assuming the @@ -217792,7 +217792,7 @@ struct Fts5Cursor { }; /* -** Bits that make up the "idxNum" parameter passed indirectly by +** Bits that make up the "idxNum" parameter passed indirectly by ** xBestIndex() to xFilter(). */ #define FTS5_BI_MATCH 0x0001 /* MATCH ? */ @@ -217871,7 +217871,7 @@ static void fts5CheckTransactionState(Fts5FullTable *p, int op, int iSavepoint){ assert( iSavepoint>=p->ts.iSavepoint ); p->ts.iSavepoint = iSavepoint; break; - + case FTS5_RELEASE: assert( p->ts.eState==1 ); assert( iSavepoint>=0 ); @@ -217899,7 +217899,7 @@ static int fts5IsContentless(Fts5FullTable *pTab){ } /* -** Delete a virtual table handle allocated by fts5InitVtab(). +** Delete a virtual table handle allocated by fts5InitVtab(). */ static void fts5FreeVtab(Fts5FullTable *pTab){ if( pTab ){ @@ -218055,7 +218055,7 @@ static void fts5SetUniqueFlag(sqlite3_index_info *pIdxInfo){ } /* -** Implementation of the xBestIndex method for FTS5 tables. Within the +** Implementation of the xBestIndex method for FTS5 tables. Within the ** WHERE constraint, it searches for the following: ** ** 1. A MATCH constraint against the table column. @@ -218070,7 +218070,7 @@ static void fts5SetUniqueFlag(sqlite3_index_info *pIdxInfo){ ** 5. ORDER BY rank [ASC|DESC] ** 6. ORDER BY rowid [ASC|DESC] ** -** Information for the xFilter call is passed via both the idxNum and +** Information for the xFilter call is passed via both the idxNum and ** idxStr variables. Specifically, idxNum is a bitmask of the following ** flags used to encode the ORDER BY clause: ** @@ -218157,7 +218157,7 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ ){ /* A MATCH operator or equivalent */ if( p->usable==0 || iCol<0 ){ - /* As there exists an unusable MATCH constraint this is an + /* As there exists an unusable MATCH constraint this is an ** unusable plan. Set a prohibitively high cost. */ pInfo->estimatedCost = 1e50; assert( iIdxStr < pInfo->nConstraint*6 + 1 ); @@ -218181,8 +218181,8 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ pInfo->aConstraintUsage[i].omit = 1; } } - else if( p->usable && bSeenEq==0 - && p->op==SQLITE_INDEX_CONSTRAINT_EQ && iCol<0 + else if( p->usable && bSeenEq==0 + && p->op==SQLITE_INDEX_CONSTRAINT_EQ && iCol<0 ){ idxStr[iIdxStr++] = '='; bSeenEq = 1; @@ -218290,15 +218290,15 @@ static int fts5StmtType(Fts5Cursor *pCsr){ /* ** This function is called after the cursor passed as the only argument -** is moved to point at a different row. It clears all cached data +** is moved to point at a different row. It clears all cached data ** specific to the previous row stored by the cursor object. */ static void fts5CsrNewrow(Fts5Cursor *pCsr){ - CsrFlagSet(pCsr, - FTS5CSR_REQUIRE_CONTENT - | FTS5CSR_REQUIRE_DOCSIZE - | FTS5CSR_REQUIRE_INST - | FTS5CSR_REQUIRE_POSLIST + CsrFlagSet(pCsr, + FTS5CSR_REQUIRE_CONTENT + | FTS5CSR_REQUIRE_DOCSIZE + | FTS5CSR_REQUIRE_INST + | FTS5CSR_REQUIRE_POSLIST ); } @@ -218401,14 +218401,14 @@ static int fts5SorterNext(Fts5Cursor *pCsr){ /* -** Set the FTS5CSR_REQUIRE_RESEEK flag on all FTS5_PLAN_MATCH cursors +** Set the FTS5CSR_REQUIRE_RESEEK flag on all FTS5_PLAN_MATCH cursors ** open on table pTab. */ static void fts5TripCursors(Fts5FullTable *pTab){ Fts5Cursor *pCsr; for(pCsr=pTab->pGlobal->pCsr; pCsr; pCsr=pCsr->pNext){ if( pCsr->ePlan==FTS5_PLAN_MATCH - && pCsr->base.pVtab==(sqlite3_vtab*)pTab + && pCsr->base.pVtab==(sqlite3_vtab*)pTab ){ CsrFlagSet(pCsr, FTS5CSR_REQUIRE_RESEEK); } @@ -218417,14 +218417,14 @@ static void fts5TripCursors(Fts5FullTable *pTab){ /* ** If the REQUIRE_RESEEK flag is set on the cursor passed as the first -** argument, close and reopen all Fts5IndexIter iterators that the cursor +** argument, close and reopen all Fts5IndexIter iterators that the cursor ** is using. Then attempt to move the cursor to a rowid equal to or laster -** (in the cursors sort order - ASC or DESC) than the current rowid. +** (in the cursors sort order - ASC or DESC) than the current rowid. ** ** If the new rowid is not equal to the old, set output parameter *pbSkip ** to 1 before returning. Otherwise, leave it unchanged. ** -** Return SQLITE_OK if successful or if no reseek was required, or an +** Return SQLITE_OK if successful or if no reseek was required, or an ** error code if an error occurred. */ static int fts5CursorReseek(Fts5Cursor *pCsr, int *pbSkip){ @@ -218452,7 +218452,7 @@ static int fts5CursorReseek(Fts5Cursor *pCsr, int *pbSkip){ /* -** Advance the cursor to the next row in the table that matches the +** Advance the cursor to the next row in the table that matches the ** search criteria. ** ** Return SQLITE_OK if nothing goes wrong. SQLITE_OK is returned @@ -218464,7 +218464,7 @@ static int fts5NextMethod(sqlite3_vtab_cursor *pCursor){ int rc; assert( (pCsr->ePlan<3)== - (pCsr->ePlan==FTS5_PLAN_MATCH || pCsr->ePlan==FTS5_PLAN_SOURCE) + (pCsr->ePlan==FTS5_PLAN_MATCH || pCsr->ePlan==FTS5_PLAN_SOURCE) ); assert( !CsrFlagTest(pCsr, FTS5CSR_EOF) ); @@ -218481,12 +218481,12 @@ static int fts5NextMethod(sqlite3_vtab_cursor *pCursor){ rc = SQLITE_OK; break; } - + case FTS5_PLAN_SORTED_MATCH: { rc = fts5SorterNext(pCsr); break; } - + default: rc = sqlite3_step(pCsr->pStmt); if( rc!=SQLITE_ROW ){ @@ -218498,14 +218498,14 @@ static int fts5NextMethod(sqlite3_vtab_cursor *pCursor){ break; } } - + return rc; } static int fts5PrepareStatement( sqlite3_stmt **ppStmt, - Fts5Config *pConfig, + Fts5Config *pConfig, const char *zFmt, ... ){ @@ -218517,9 +218517,9 @@ static int fts5PrepareStatement( va_start(ap, zFmt); zSql = sqlite3_vmprintf(zFmt, ap); if( zSql==0 ){ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM; }else{ - rc = sqlite3_prepare_v3(pConfig->db, zSql, -1, + rc = sqlite3_prepare_v3(pConfig->db, zSql, -1, SQLITE_PREPARE_PERSISTENT, &pRet, 0); if( rc!=SQLITE_OK ){ *pConfig->pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(pConfig->db)); @@ -218530,11 +218530,11 @@ static int fts5PrepareStatement( va_end(ap); *ppStmt = pRet; return rc; -} +} static int fts5CursorFirstSorted( - Fts5FullTable *pTab, - Fts5Cursor *pCsr, + Fts5FullTable *pTab, + Fts5Cursor *pCsr, int bDesc ){ Fts5Config *pConfig = pTab->p.pConfig; @@ -218544,7 +218544,7 @@ static int fts5CursorFirstSorted( int rc; const char *zRank = pCsr->zRank; const char *zRankArgs = pCsr->zRankArgs; - + nPhrase = sqlite3Fts5ExprPhraseCount(pCsr->pExpr); nByte = sizeof(Fts5Sorter) + sizeof(int) * (nPhrase-1); pSorter = (Fts5Sorter*)sqlite3_malloc64(nByte); @@ -218555,7 +218555,7 @@ static int fts5CursorFirstSorted( /* TODO: It would be better to have some system for reusing statement ** handles here, rather than preparing a new one for each query. But that ** is not possible as SQLite reference counts the virtual table objects. - ** And since the statement required here reads from this very virtual + ** And since the statement required here reads from this very virtual ** table, saving it creates a circular reference. ** ** If SQLite a built-in statement cache, this wouldn't be a problem. */ @@ -218602,8 +218602,8 @@ static int fts5CursorFirst(Fts5FullTable *pTab, Fts5Cursor *pCsr, int bDesc){ ** parameters. */ static int fts5SpecialMatch( - Fts5FullTable *pTab, - Fts5Cursor *pCsr, + Fts5FullTable *pTab, + Fts5Cursor *pCsr, const char *zQuery ){ int rc = SQLITE_OK; /* Return code */ @@ -218701,7 +218701,7 @@ static int fts5FindRankFunction(Fts5Cursor *pCsr){ static int fts5CursorParseRank( Fts5Config *pConfig, - Fts5Cursor *pCsr, + Fts5Cursor *pCsr, sqlite3_value *pRank ){ int rc = SQLITE_OK; @@ -218750,7 +218750,7 @@ static i64 fts5GetRowidLimit(sqlite3_value *pVal, i64 iDefault){ ** This is the xFilter interface for the virtual table. See ** the virtual table xFilter method documentation for additional ** information. -** +** ** There are three possible query strategies: ** ** 1. Full-text search using a MATCH operator. @@ -218848,7 +218848,7 @@ static int fts5FilterMethod( bOrderByRank = ((idxNum & FTS5_BI_ORDER_RANK) ? 1 : 0); pCsr->bDesc = bDesc = ((idxNum & FTS5_BI_ORDER_DESC) ? 1 : 0); - /* Set the cursor upper and lower rowid limits. Only some strategies + /* Set the cursor upper and lower rowid limits. Only some strategies ** actually use them. This is ok, as the xBestIndex() method leaves the ** sqlite3_index_constraint.omit flag clear for range constraints ** on the rowid field. */ @@ -218864,11 +218864,11 @@ static int fts5FilterMethod( } if( pTab->pSortCsr ){ - /* If pSortCsr is non-NULL, then this call is being made as part of + /* If pSortCsr is non-NULL, then this call is being made as part of ** processing for a "... MATCH ORDER BY rank" query (ePlan is ** set to FTS5_PLAN_SORTED_MATCH). pSortCsr is the cursor that will - ** return results to the user for this query. The current cursor - ** (pCursor) is used to execute the query issued by function + ** return results to the user for this query. The current cursor + ** (pCursor) is used to execute the query issued by function ** fts5CursorFirstSorted() above. */ assert( pRowidEq==0 && pRowidLe==0 && pRowidGe==0 && pRank==0 ); assert( nVal==0 && bOrderByRank==0 && bDesc==0 ); @@ -218924,8 +218924,8 @@ static int fts5FilterMethod( return rc; } -/* -** This is the xEof method of the virtual table. SQLite calls this +/* +** This is the xEof method of the virtual table. SQLite calls this ** routine to find out if it has reached the end of a result set. */ static int fts5EofMethod(sqlite3_vtab_cursor *pCursor){ @@ -218937,9 +218937,9 @@ static int fts5EofMethod(sqlite3_vtab_cursor *pCursor){ ** Return the rowid that the cursor currently points to. */ static i64 fts5CursorRowid(Fts5Cursor *pCsr){ - assert( pCsr->ePlan==FTS5_PLAN_MATCH - || pCsr->ePlan==FTS5_PLAN_SORTED_MATCH - || pCsr->ePlan==FTS5_PLAN_SOURCE + assert( pCsr->ePlan==FTS5_PLAN_MATCH + || pCsr->ePlan==FTS5_PLAN_SORTED_MATCH + || pCsr->ePlan==FTS5_PLAN_SOURCE ); if( pCsr->pSorter ){ return pCsr->pSorter->iRowid; @@ -218948,7 +218948,7 @@ static i64 fts5CursorRowid(Fts5Cursor *pCsr){ } } -/* +/* ** This is the xRowid method. The SQLite core calls this routine to ** retrieve the rowid for the current row of the result set. fts5 ** exposes %_content.rowid as the rowid for the virtual table. The @@ -218957,7 +218957,7 @@ static i64 fts5CursorRowid(Fts5Cursor *pCsr){ static int fts5RowidMethod(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){ Fts5Cursor *pCsr = (Fts5Cursor*)pCursor; int ePlan = pCsr->ePlan; - + assert( CsrFlagTest(pCsr, FTS5CSR_EOF)==0 ); switch( ePlan ){ case FTS5_PLAN_SPECIAL: @@ -218988,7 +218988,7 @@ static int fts5RowidMethod(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){ static int fts5SeekCursor(Fts5Cursor *pCsr, int bErrormsg){ int rc = SQLITE_OK; - /* If the cursor does not yet have a statement handle, obtain one now. */ + /* If the cursor does not yet have a statement handle, obtain one now. */ if( pCsr->pStmt==0 ){ Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); int eStmt = fts5StmtType(pCsr); @@ -219032,7 +219032,7 @@ static void fts5SetVtabError(Fts5FullTable *p, const char *zFormat, ...){ ** INSERT INTO fts(fts) VALUES($pCmd) ** INSERT INTO fts(fts, rank) VALUES($pCmd, $pVal) ** -** Argument pVal is the value assigned to column "fts" by the INSERT +** Argument pVal is the value assigned to column "fts" by the INSERT ** statement. This function returns SQLITE_OK if successful, or an SQLite ** error code if an error occurs. ** @@ -219051,7 +219051,7 @@ static int fts5SpecialInsert( if( 0==sqlite3_stricmp("delete-all", zCmd) ){ if( pConfig->eContent==FTS5_CONTENT_NORMAL ){ - fts5SetVtabError(pTab, + fts5SetVtabError(pTab, "'delete-all' may only be used with a " "contentless or external content fts5 table" ); @@ -219061,7 +219061,7 @@ static int fts5SpecialInsert( } }else if( 0==sqlite3_stricmp("rebuild", zCmd) ){ if( pConfig->eContent==FTS5_CONTENT_NONE ){ - fts5SetVtabError(pTab, + fts5SetVtabError(pTab, "'rebuild' may not be used with a contentless fts5 table" ); rc = SQLITE_ERROR; @@ -219096,7 +219096,7 @@ static int fts5SpecialInsert( } static int fts5SpecialDelete( - Fts5FullTable *pTab, + Fts5FullTable *pTab, sqlite3_value **apVal ){ int rc = SQLITE_OK; @@ -219109,9 +219109,9 @@ static int fts5SpecialDelete( } static void fts5StorageInsert( - int *pRc, - Fts5FullTable *pTab, - sqlite3_value **apVal, + int *pRc, + Fts5FullTable *pTab, + sqlite3_value **apVal, i64 *piRowid ){ int rc = *pRc; @@ -219124,13 +219124,13 @@ static void fts5StorageInsert( *pRc = rc; } -/* -** This function is the implementation of the xUpdate callback used by +/* +** This function is the implementation of the xUpdate callback used by ** FTS3 virtual tables. It is invoked by SQLite each time a row is to be ** inserted, updated or deleted. ** ** A delete specifies a single argument - the rowid of the row to remove. -** +** ** Update and insert operations pass: ** ** 1. The "old" rowid, or NULL. @@ -219154,8 +219154,8 @@ static int fts5UpdateMethod( assert( pVtab->zErrMsg==0 ); assert( nArg==1 || nArg==(2+pConfig->nCol+2) ); - assert( sqlite3_value_type(apVal[0])==SQLITE_INTEGER - || sqlite3_value_type(apVal[0])==SQLITE_NULL + assert( sqlite3_value_type(apVal[0])==SQLITE_INTEGER + || sqlite3_value_type(apVal[0])==SQLITE_NULL ); assert( pTab->p.pConfig->pzErrmsg==0 ); pTab->p.pConfig->pzErrmsg = &pTab->p.base.zErrMsg; @@ -219164,13 +219164,13 @@ static int fts5UpdateMethod( fts5TripCursors(pTab); eType0 = sqlite3_value_type(apVal[0]); - if( eType0==SQLITE_NULL - && sqlite3_value_type(apVal[2+pConfig->nCol])!=SQLITE_NULL + if( eType0==SQLITE_NULL + && sqlite3_value_type(apVal[2+pConfig->nCol])!=SQLITE_NULL ){ /* A "special" INSERT op. These are handled separately. */ const char *z = (const char*)sqlite3_value_text(apVal[2+pConfig->nCol]); - if( pConfig->eContent!=FTS5_CONTENT_NORMAL - && 0==sqlite3_stricmp("delete", z) + if( pConfig->eContent!=FTS5_CONTENT_NORMAL + && 0==sqlite3_stricmp("delete", z) ){ rc = fts5SpecialDelete(pTab, apVal); }else{ @@ -219178,7 +219178,7 @@ static int fts5UpdateMethod( } }else{ /* A regular INSERT, UPDATE or DELETE statement. The trick here is that - ** any conflict on the rowid value must be detected before any + ** any conflict on the rowid value must be detected before any ** modifications are made to the database file. There are 4 cases: ** ** 1) DELETE @@ -219200,7 +219200,7 @@ static int fts5UpdateMethod( ** This is not suported. */ if( eType0==SQLITE_INTEGER && fts5IsContentless(pTab) ){ pTab->p.base.zErrMsg = sqlite3_mprintf( - "cannot %s contentless fts5 table: %s", + "cannot %s contentless fts5 table: %s", (nArg>1 ? "UPDATE" : "DELETE from"), pConfig->zName ); rc = SQLITE_ERROR; @@ -219220,7 +219220,7 @@ static int fts5UpdateMethod( rc = SQLITE_MISMATCH; } - else if( eType0!=SQLITE_INTEGER ){ + else if( eType0!=SQLITE_INTEGER ){ /* If this is a REPLACE, first remove the current entry (if any) */ if( eConflict==SQLITE_REPLACE && eType1==SQLITE_INTEGER ){ i64 iNew = sqlite3_value_int64(apVal[1]); /* Rowid to delete */ @@ -219262,7 +219262,7 @@ static int fts5UpdateMethod( } /* -** Implementation of xSync() method. +** Implementation of xSync() method. */ static int fts5SyncMethod(sqlite3_vtab *pVtab){ int rc; @@ -219276,7 +219276,7 @@ static int fts5SyncMethod(sqlite3_vtab *pVtab){ } /* -** Implementation of xBegin() method. +** Implementation of xBegin() method. */ static int fts5BeginMethod(sqlite3_vtab *pVtab){ fts5CheckTransactionState((Fts5FullTable*)pVtab, FTS5_BEGIN, 0); @@ -219320,8 +219320,8 @@ static int fts5ApiColumnCount(Fts5Context *pCtx){ } static int fts5ApiColumnTotalSize( - Fts5Context *pCtx, - int iCol, + Fts5Context *pCtx, + int iCol, sqlite3_int64 *pnToken ){ Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; @@ -219336,8 +219336,8 @@ static int fts5ApiRowCount(Fts5Context *pCtx, i64 *pnRow){ } static int fts5ApiTokenize( - Fts5Context *pCtx, - const char *pText, int nText, + Fts5Context *pCtx, + const char *pText, int nText, void *pUserData, int (*xToken)(void*, int, const char*, int, int, int) ){ @@ -219359,15 +219359,15 @@ static int fts5ApiPhraseSize(Fts5Context *pCtx, int iPhrase){ } static int fts5ApiColumnText( - Fts5Context *pCtx, - int iCol, - const char **pz, + Fts5Context *pCtx, + int iCol, + const char **pz, int *pn ){ int rc = SQLITE_OK; Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - if( fts5IsContentless((Fts5FullTable*)(pCsr->base.pVtab)) - || pCsr->ePlan==FTS5_PLAN_SPECIAL + if( fts5IsContentless((Fts5FullTable*)(pCsr->base.pVtab)) + || pCsr->ePlan==FTS5_PLAN_SPECIAL ){ *pz = 0; *pn = 0; @@ -219382,8 +219382,8 @@ static int fts5ApiColumnText( } static int fts5CsrPoslist( - Fts5Cursor *pCsr, - int iPhrase, + Fts5Cursor *pCsr, + int iPhrase, const u8 **pa, int *pn ){ @@ -219438,7 +219438,7 @@ static int fts5CacheInstArray(Fts5Cursor *pCsr){ Fts5PoslistReader *aIter; /* One iterator for each phrase */ int nIter; /* Number of iterators/phrases */ int nCol = ((Fts5Table*)pCsr->base.pVtab)->pConfig->nCol; - + nIter = sqlite3Fts5ExprPhraseCount(pCsr->pExpr); if( pCsr->aInstIter==0 ){ sqlite3_int64 nByte = sizeof(Fts5PoslistReader) * nIter; @@ -219453,7 +219453,7 @@ static int fts5CacheInstArray(Fts5Cursor *pCsr){ /* Initialize all iterators */ for(i=0; inInstCount; } @@ -219516,16 +219516,16 @@ static int fts5ApiInstCount(Fts5Context *pCtx, int *pnInst){ } static int fts5ApiInst( - Fts5Context *pCtx, - int iIdx, - int *piPhrase, - int *piCol, + Fts5Context *pCtx, + int iIdx, + int *piPhrase, + int *piCol, int *piOff ){ Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; int rc = SQLITE_OK; - if( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_INST)==0 - || SQLITE_OK==(rc = fts5CacheInstArray(pCsr)) + if( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_INST)==0 + || SQLITE_OK==(rc = fts5CacheInstArray(pCsr)) ){ if( iIdx<0 || iIdx>=pCsr->nInstCount ){ rc = SQLITE_RANGE; @@ -219674,8 +219674,8 @@ static void *fts5ApiGetAuxdata(Fts5Context *pCtx, int bClear){ } static void fts5ApiPhraseNext( - Fts5Context *pUnused, - Fts5PhraseIter *pIter, + Fts5Context *pUnused, + Fts5PhraseIter *pIter, int *piCol, int *piOff ){ UNUSED_PARAM(pUnused); @@ -219696,9 +219696,9 @@ static void fts5ApiPhraseNext( } static int fts5ApiPhraseFirst( - Fts5Context *pCtx, - int iPhrase, - Fts5PhraseIter *pIter, + Fts5Context *pCtx, + int iPhrase, + Fts5PhraseIter *pIter, int *piCol, int *piOff ){ Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; @@ -219714,8 +219714,8 @@ static int fts5ApiPhraseFirst( } static void fts5ApiPhraseNextColumn( - Fts5Context *pCtx, - Fts5PhraseIter *pIter, + Fts5Context *pCtx, + Fts5PhraseIter *pIter, int *piCol ){ Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; @@ -219744,9 +219744,9 @@ static void fts5ApiPhraseNextColumn( } static int fts5ApiPhraseFirstColumn( - Fts5Context *pCtx, - int iPhrase, - Fts5PhraseIter *pIter, + Fts5Context *pCtx, + int iPhrase, + Fts5PhraseIter *pIter, int *piCol ){ int rc = SQLITE_OK; @@ -219787,7 +219787,7 @@ static int fts5ApiPhraseFirstColumn( } -static int fts5ApiQueryPhrase(Fts5Context*, int, void*, +static int fts5ApiQueryPhrase(Fts5Context*, int, void*, int(*)(const Fts5ExtensionApi*, Fts5Context*, void*) ); @@ -219818,8 +219818,8 @@ static const Fts5ExtensionApi sFts5Api = { ** Implementation of API function xQueryPhrase(). */ static int fts5ApiQueryPhrase( - Fts5Context *pCtx, - int iPhrase, + Fts5Context *pCtx, + int iPhrase, void *pUserData, int(*xCallback)(const Fts5ExtensionApi*, Fts5Context*, void*) ){ @@ -219901,7 +219901,7 @@ static void fts5ApiCallback( /* -** Given cursor id iId, return a pointer to the corresponding Fts5Table +** Given cursor id iId, return a pointer to the corresponding Fts5Table ** object. Or NULL If the cursor id does not exist. */ static Fts5Table *sqlite3Fts5TableFromCsrid( @@ -219984,7 +219984,7 @@ static int fts5PoslistBlob(sqlite3_context *pCtx, Fts5Cursor *pCsr){ return rc; } -/* +/* ** This is the xColumn method, called by SQLite to request a value from ** the row that the supplied cursor currently points to. */ @@ -219997,7 +219997,7 @@ static int fts5ColumnMethod( Fts5Config *pConfig = pTab->p.pConfig; Fts5Cursor *pCsr = (Fts5Cursor*)pCursor; int rc = SQLITE_OK; - + assert( CsrFlagTest(pCsr, FTS5CSR_EOF)==0 ); if( pCsr->ePlan==FTS5_PLAN_SPECIAL ){ @@ -220017,7 +220017,7 @@ static int fts5ColumnMethod( /* The value of the "rank" column. */ if( pCsr->ePlan==FTS5_PLAN_SOURCE ){ fts5PoslistBlob(pCtx, pCsr); - }else if( + }else if( pCsr->ePlan==FTS5_PLAN_MATCH || pCsr->ePlan==FTS5_PLAN_SORTED_MATCH ){ @@ -220151,7 +220151,7 @@ static int fts5CreateAux( } /* -** Register a new tokenizer. This is the implementation of the +** Register a new tokenizer. This is the implementation of the ** fts5_api.xCreateTokenizer() method. */ static int fts5CreateTokenizer( @@ -220190,7 +220190,7 @@ static int fts5CreateTokenizer( } static Fts5TokenizerModule *fts5LocateTokenizer( - Fts5Global *pGlobal, + Fts5Global *pGlobal, const char *zName ){ Fts5TokenizerModule *pMod = 0; @@ -220207,7 +220207,7 @@ static Fts5TokenizerModule *fts5LocateTokenizer( } /* -** Find a tokenizer. This is the implementation of the +** Find a tokenizer. This is the implementation of the ** fts5_api.xFindTokenizer() method. */ static int fts5FindTokenizer( @@ -220232,7 +220232,7 @@ static int fts5FindTokenizer( } static int sqlite3Fts5GetTokenizer( - Fts5Global *pGlobal, + Fts5Global *pGlobal, const char **azArg, int nArg, Fts5Tokenizer **ppTok, @@ -220402,7 +220402,7 @@ static int fts5Init(sqlite3 *db){ ** this module is being built as part of the SQLite core (SQLITE_CORE is ** defined), then sqlite3_open() will call sqlite3Fts5Init() directly. ** -** Or, if this module is being built as a loadable extension, +** Or, if this module is being built as a loadable extension, ** sqlite3Fts5Init() is omitted and the two standard entry points ** sqlite3_fts_init() and sqlite3_fts5_init() defined instead. */ @@ -220461,19 +220461,19 @@ struct Fts5Storage { Fts5Index *pIndex; int bTotalsValid; /* True if nTotalRow/aTotalSize[] are valid */ i64 nTotalRow; /* Total number of rows in FTS table */ - i64 *aTotalSize; /* Total sizes of each column */ + i64 *aTotalSize; /* Total sizes of each column */ sqlite3_stmt *aStmt[11]; }; -#if FTS5_STMT_SCAN_ASC!=0 -# error "FTS5_STMT_SCAN_ASC mismatch" +#if FTS5_STMT_SCAN_ASC!=0 +# error "FTS5_STMT_SCAN_ASC mismatch" #endif -#if FTS5_STMT_SCAN_DESC!=1 -# error "FTS5_STMT_SCAN_DESC mismatch" +#if FTS5_STMT_SCAN_DESC!=1 +# error "FTS5_STMT_SCAN_DESC mismatch" #endif #if FTS5_STMT_LOOKUP!=2 -# error "FTS5_STMT_LOOKUP mismatch" +# error "FTS5_STMT_LOOKUP mismatch" #endif #define FTS5_STMT_INSERT_CONTENT 3 @@ -220499,12 +220499,12 @@ static int fts5StorageGetStmt( ){ int rc = SQLITE_OK; - /* If there is no %_docsize table, there should be no requests for + /* If there is no %_docsize table, there should be no requests for ** statements to operate on it. */ assert( p->pConfig->bColumnsize || ( - eStmt!=FTS5_STMT_REPLACE_DOCSIZE - && eStmt!=FTS5_STMT_DELETE_DOCSIZE - && eStmt!=FTS5_STMT_LOOKUP_DOCSIZE + eStmt!=FTS5_STMT_REPLACE_DOCSIZE + && eStmt!=FTS5_STMT_DELETE_DOCSIZE + && eStmt!=FTS5_STMT_LOOKUP_DOCSIZE )); assert( eStmt>=0 && eStmtaStmt) ); @@ -220530,26 +220530,26 @@ static int fts5StorageGetStmt( switch( eStmt ){ case FTS5_STMT_SCAN: - zSql = sqlite3_mprintf(azStmt[eStmt], + zSql = sqlite3_mprintf(azStmt[eStmt], pC->zContentExprlist, pC->zContent ); break; case FTS5_STMT_SCAN_ASC: case FTS5_STMT_SCAN_DESC: - zSql = sqlite3_mprintf(azStmt[eStmt], pC->zContentExprlist, + zSql = sqlite3_mprintf(azStmt[eStmt], pC->zContentExprlist, pC->zContent, pC->zContentRowid, pC->zContentRowid, pC->zContentRowid ); break; case FTS5_STMT_LOOKUP: - zSql = sqlite3_mprintf(azStmt[eStmt], + zSql = sqlite3_mprintf(azStmt[eStmt], pC->zContentExprlist, pC->zContent, pC->zContentRowid ); break; - case FTS5_STMT_INSERT_CONTENT: + case FTS5_STMT_INSERT_CONTENT: case FTS5_STMT_REPLACE_CONTENT: { int nCol = pC->nCol + 1; char *zBind; @@ -220623,7 +220623,7 @@ static int fts5ExecPrintf( ** code otherwise. */ static int sqlite3Fts5DropAll(Fts5Config *pConfig){ - int rc = fts5ExecPrintf(pConfig->db, 0, + int rc = fts5ExecPrintf(pConfig->db, 0, "DROP TABLE IF EXISTS %Q.'%q_data';" "DROP TABLE IF EXISTS %Q.'%q_idx';" "DROP TABLE IF EXISTS %Q.'%q_config';", @@ -220632,13 +220632,13 @@ static int sqlite3Fts5DropAll(Fts5Config *pConfig){ pConfig->zDb, pConfig->zName ); if( rc==SQLITE_OK && pConfig->bColumnsize ){ - rc = fts5ExecPrintf(pConfig->db, 0, + rc = fts5ExecPrintf(pConfig->db, 0, "DROP TABLE IF EXISTS %Q.'%q_docsize';", pConfig->zDb, pConfig->zName ); } if( rc==SQLITE_OK && pConfig->eContent==FTS5_CONTENT_NORMAL ){ - rc = fts5ExecPrintf(pConfig->db, 0, + rc = fts5ExecPrintf(pConfig->db, 0, "DROP TABLE IF EXISTS %Q.'%q_content';", pConfig->zDb, pConfig->zName ); @@ -220653,7 +220653,7 @@ static void fts5StorageRenameOne( const char *zName /* New name of FTS5 table */ ){ if( *pRc==SQLITE_OK ){ - *pRc = fts5ExecPrintf(pConfig->db, 0, + *pRc = fts5ExecPrintf(pConfig->db, 0, "ALTER TABLE %Q.'%q_%s' RENAME TO '%q_%s';", pConfig->zDb, pConfig->zName, zTail, zName, zTail ); @@ -220691,7 +220691,7 @@ static int sqlite3Fts5CreateTable( char *zErr = 0; rc = fts5ExecPrintf(pConfig->db, &zErr, "CREATE TABLE %Q.'%q_%q'(%s)%s", - pConfig->zDb, pConfig->zName, zPost, zDefn, + pConfig->zDb, pConfig->zName, zPost, zDefn, #ifndef SQLITE_FTS5_NO_WITHOUT_ROWID bWithout?" WITHOUT ROWID": #endif @@ -220699,7 +220699,7 @@ static int sqlite3Fts5CreateTable( ); if( zErr ){ *pzErr = sqlite3_mprintf( - "fts5: error creating shadow table %q_%s: %s", + "fts5: error creating shadow table %q_%s: %s", pConfig->zName, zPost, zErr ); sqlite3_free(zErr); @@ -220710,15 +220710,15 @@ static int sqlite3Fts5CreateTable( /* ** Open a new Fts5Index handle. If the bCreate argument is true, create -** and initialize the underlying tables +** and initialize the underlying tables ** ** If successful, set *pp to point to the new object and return SQLITE_OK. ** Otherwise, set *pp to NULL and return an SQLite error code. */ static int sqlite3Fts5StorageOpen( - Fts5Config *pConfig, - Fts5Index *pIndex, - int bCreate, + Fts5Config *pConfig, + Fts5Index *pIndex, + int bCreate, Fts5Storage **pp, char **pzErr /* OUT: Error message */ ){ @@ -220830,8 +220830,8 @@ static int fts5StorageInsertCallback( ** remove the %_content row at this time though. */ static int fts5StorageDeleteFromIndex( - Fts5Storage *p, - i64 iDel, + Fts5Storage *p, + i64 iDel, sqlite3_value **apVal ){ Fts5Config *pConfig = p->pConfig; @@ -220865,7 +220865,7 @@ static int fts5StorageDeleteFromIndex( nText = sqlite3_value_bytes(apVal[iCol-1]); } ctx.szCol = 0; - rc = sqlite3Fts5Tokenize(pConfig, FTS5_TOKENIZE_DOCUMENT, + rc = sqlite3Fts5Tokenize(pConfig, FTS5_TOKENIZE_DOCUMENT, zText, nText, (void*)&ctx, fts5StorageInsertCallback ); p->aTotalSize[iCol-1] -= (i64)ctx.szCol; @@ -220908,7 +220908,7 @@ static int fts5StorageInsertDocsize( } /* -** Load the contents of the "averages" record from disk into the +** Load the contents of the "averages" record from disk into the ** p->nTotalRow and p->aTotalSize[] variables. If successful, and if ** argument bCache is true, set the p->bTotalsValid flag to indicate ** that the contents of aTotalSize[] and nTotalRow are valid until @@ -220927,7 +220927,7 @@ static int fts5StorageLoadTotals(Fts5Storage *p, int bCache){ } /* -** Store the current contents of the p->nTotalRow and p->aTotalSize[] +** Store the current contents of the p->nTotalRow and p->aTotalSize[] ** variables in the "averages" record on disk. ** ** Return SQLITE_OK if successful, or an SQLite error code if an error @@ -221002,7 +221002,7 @@ static int sqlite3Fts5StorageDeleteAll(Fts5Storage *p){ /* Delete the contents of the %_data and %_docsize tables. */ rc = fts5ExecPrintf(pConfig->db, 0, - "DELETE FROM %Q.'%q_data';" + "DELETE FROM %Q.'%q_data';" "DELETE FROM %Q.'%q_idx';", pConfig->zDb, pConfig->zName, pConfig->zDb, pConfig->zName @@ -221051,7 +221051,7 @@ static int sqlite3Fts5StorageRebuild(Fts5Storage *p){ for(ctx.iCol=0; rc==SQLITE_OK && ctx.iColnCol; ctx.iCol++){ ctx.szCol = 0; if( pConfig->abUnindexed[ctx.iCol]==0 ){ - rc = sqlite3Fts5Tokenize(pConfig, + rc = sqlite3Fts5Tokenize(pConfig, FTS5_TOKENIZE_DOCUMENT, (const char*)sqlite3_column_text(pScan, ctx.iCol+1), sqlite3_column_bytes(pScan, ctx.iCol+1), @@ -221122,8 +221122,8 @@ static int fts5StorageNewRowid(Fts5Storage *p, i64 *piRowid){ ** Insert a new row into the FTS content table. */ static int sqlite3Fts5StorageContentInsert( - Fts5Storage *p, - sqlite3_value **apVal, + Fts5Storage *p, + sqlite3_value **apVal, i64 *piRowid ){ Fts5Config *pConfig = p->pConfig; @@ -221157,8 +221157,8 @@ static int sqlite3Fts5StorageContentInsert( ** Insert new entries into the FTS index and %_docsize table. */ static int sqlite3Fts5StorageIndexInsert( - Fts5Storage *p, - sqlite3_value **apVal, + Fts5Storage *p, + sqlite3_value **apVal, i64 iRowid ){ Fts5Config *pConfig = p->pConfig; @@ -221176,7 +221176,7 @@ static int sqlite3Fts5StorageIndexInsert( for(ctx.iCol=0; rc==SQLITE_OK && ctx.iColnCol; ctx.iCol++){ ctx.szCol = 0; if( pConfig->abUnindexed[ctx.iCol]==0 ){ - rc = sqlite3Fts5Tokenize(pConfig, + rc = sqlite3Fts5Tokenize(pConfig, FTS5_TOKENIZE_DOCUMENT, (const char*)sqlite3_value_text(apVal[ctx.iCol+2]), sqlite3_value_bytes(apVal[ctx.iCol+2]), @@ -221203,7 +221203,7 @@ static int fts5StorageCount(Fts5Storage *p, const char *zSuffix, i64 *pnRow){ char *zSql; int rc; - zSql = sqlite3_mprintf("SELECT count(*) FROM %Q.'%q_%s'", + zSql = sqlite3_mprintf("SELECT count(*) FROM %Q.'%q_%s'", pConfig->zDb, pConfig->zName, zSuffix ); if( zSql==0 ){ @@ -221348,7 +221348,7 @@ static int sqlite3Fts5StorageIntegrity(Fts5Storage *p){ rc = sqlite3Fts5TermsetNew(&ctx.pTermset); } if( rc==SQLITE_OK ){ - rc = sqlite3Fts5Tokenize(pConfig, + rc = sqlite3Fts5Tokenize(pConfig, FTS5_TOKENIZE_DOCUMENT, (const char*)sqlite3_column_text(pScan, i+1), sqlite3_column_bytes(pScan, i+1), @@ -221412,13 +221412,13 @@ static int sqlite3Fts5StorageIntegrity(Fts5Storage *p){ ** %_content table. */ static int sqlite3Fts5StorageStmt( - Fts5Storage *p, - int eStmt, - sqlite3_stmt **pp, + Fts5Storage *p, + int eStmt, + sqlite3_stmt **pp, char **pzErrMsg ){ int rc; - assert( eStmt==FTS5_STMT_SCAN_ASC + assert( eStmt==FTS5_STMT_SCAN_ASC || eStmt==FTS5_STMT_SCAN_DESC || eStmt==FTS5_STMT_LOOKUP ); @@ -221436,8 +221436,8 @@ static int sqlite3Fts5StorageStmt( ** must match that passed to the sqlite3Fts5StorageStmt() call. */ static void sqlite3Fts5StorageStmtRelease( - Fts5Storage *p, - int eStmt, + Fts5Storage *p, + int eStmt, sqlite3_stmt *pStmt ){ assert( eStmt==FTS5_STMT_SCAN_ASC @@ -221520,7 +221520,7 @@ static int sqlite3Fts5StorageSize(Fts5Storage *p, int iCol, i64 *pnToken){ static int sqlite3Fts5StorageRowCount(Fts5Storage *p, i64 *pnRow){ int rc = fts5StorageLoadTotals(p, 0); if( rc==SQLITE_OK ){ - /* nTotalRow being zero does not necessarily indicate a corrupt + /* nTotalRow being zero does not necessarily indicate a corrupt ** database - it might be that the FTS5 table really does contain zero ** rows. However this function is only called from the xRowCount() API, ** and there is no way for that API to be invoked if the table contains @@ -221554,7 +221554,7 @@ static int sqlite3Fts5StorageRollback(Fts5Storage *p){ } static int sqlite3Fts5StorageConfigValue( - Fts5Storage *p, + Fts5Storage *p, const char *z, sqlite3_value *pVal, int iVal @@ -221604,7 +221604,7 @@ static int sqlite3Fts5StorageConfigValue( /* ** For tokenizers with no "unicode" modifier, the set of token characters -** is the same as the set of ASCII range alphanumeric characters. +** is the same as the set of ASCII range alphanumeric characters. */ static unsigned char aAsciiTokenChar[128] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00..0x0F */ @@ -221623,8 +221623,8 @@ struct AsciiTokenizer { }; static void fts5AsciiAddExceptions( - AsciiTokenizer *p, - const char *zArg, + AsciiTokenizer *p, + const char *zArg, int bTokenChars ){ int i; @@ -221646,7 +221646,7 @@ static void fts5AsciiDelete(Fts5Tokenizer *p){ ** Create an "ascii" tokenizer. */ static int fts5AsciiCreate( - void *pUnused, + void *pUnused, const char **azArg, int nArg, Fts5Tokenizer **ppOut ){ @@ -221749,7 +221749,7 @@ static int fts5AsciiTokenize( rc = xToken(pCtx, 0, pFold, nByte, is, ie); is = ie+1; } - + if( pFold!=aFold ) sqlite3_free(pFold); if( rc==SQLITE_DONE ) rc = SQLITE_OK; return rc; @@ -221854,7 +221854,7 @@ static int fts5UnicodeAddExceptions( p->aTokenChar[iCode] = (unsigned char)bTokenChars; }else{ bToken = p->aCategory[sqlite3Fts5UnicodeCategory(iCode)]; - assert( (bToken==0 || bToken==1) ); + assert( (bToken==0 || bToken==1) ); assert( (bTokenChars==0 || bTokenChars==1) ); if( bToken!=bTokenChars && sqlite3Fts5UnicodeIsdiacritic(iCode)==0 ){ int i; @@ -221933,12 +221933,12 @@ static int unicodeSetCategories(Unicode61Tokenizer *p, const char *zCat){ ** Create a "unicode61" tokenizer. */ static int fts5UnicodeCreate( - void *pUnused, + void *pUnused, const char **azArg, int nArg, Fts5Tokenizer **ppOut ){ int rc = SQLITE_OK; /* Return code */ - Unicode61Tokenizer *p = 0; /* New tokenizer object */ + Unicode61Tokenizer *p = 0; /* New tokenizer object */ UNUSED_PARAM(pUnused); @@ -222009,7 +222009,7 @@ static int fts5UnicodeCreate( /* ** Return true if, for the purposes of tokenizing with the tokenizer -** passed as the first argument, codepoint iCode is considered a token +** passed as the first argument, codepoint iCode is considered a token ** character (not a separator). */ static int fts5UnicodeIsAlnum(Unicode61Tokenizer *p, int iCode){ @@ -222101,7 +222101,7 @@ static int fts5UnicodeTokenize( } }else if( a[*zCsr]==0 ){ /* An ascii-range separator character. End of token. */ - break; + break; }else{ ascii_tokenchar: if( *zCsr>='A' && *zCsr<='Z' ){ @@ -222115,9 +222115,9 @@ static int fts5UnicodeTokenize( } /* Invoke the token callback */ - rc = xToken(pCtx, 0, aFold, zOut-aFold, is, ie); + rc = xToken(pCtx, 0, aFold, zOut-aFold, is, ie); } - + tokenize_done: if( rc==SQLITE_DONE ) rc = SQLITE_OK; return rc; @@ -222155,7 +222155,7 @@ static void fts5PorterDelete(Fts5Tokenizer *pTok){ ** Create a "porter" tokenizer. */ static int fts5PorterCreate( - void *pCtx, + void *pCtx, const char **azArg, int nArg, Fts5Tokenizer **ppOut ){ @@ -222299,7 +222299,7 @@ static int fts5Porter_Ostar(char *zStem, int nStem){ /* porter rule condition: (m > 1 and (*S or *T)) */ static int fts5Porter_MGt1_and_S_or_T(char *zStem, int nStem){ assert( nStem>0 ); - return (zStem[nStem-1]=='s' || zStem[nStem-1]=='t') + return (zStem[nStem-1]=='s' || zStem[nStem-1]=='t') && fts5Porter_MGt1(zStem, nStem); } @@ -222324,16 +222324,16 @@ static int fts5PorterStep4(char *aBuf, int *pnBuf){ int ret = 0; int nBuf = *pnBuf; switch( aBuf[nBuf-2] ){ - - case 'a': + + case 'a': if( nBuf>2 && 0==memcmp("al", &aBuf[nBuf-2], 2) ){ if( fts5Porter_MGt1(aBuf, nBuf-2) ){ *pnBuf = nBuf - 2; } } break; - - case 'c': + + case 'c': if( nBuf>4 && 0==memcmp("ance", &aBuf[nBuf-4], 4) ){ if( fts5Porter_MGt1(aBuf, nBuf-4) ){ *pnBuf = nBuf - 4; @@ -222344,24 +222344,24 @@ static int fts5PorterStep4(char *aBuf, int *pnBuf){ } } break; - - case 'e': + + case 'e': if( nBuf>2 && 0==memcmp("er", &aBuf[nBuf-2], 2) ){ if( fts5Porter_MGt1(aBuf, nBuf-2) ){ *pnBuf = nBuf - 2; } } break; - - case 'i': + + case 'i': if( nBuf>2 && 0==memcmp("ic", &aBuf[nBuf-2], 2) ){ if( fts5Porter_MGt1(aBuf, nBuf-2) ){ *pnBuf = nBuf - 2; } } break; - - case 'l': + + case 'l': if( nBuf>4 && 0==memcmp("able", &aBuf[nBuf-4], 4) ){ if( fts5Porter_MGt1(aBuf, nBuf-4) ){ *pnBuf = nBuf - 4; @@ -222372,8 +222372,8 @@ static int fts5PorterStep4(char *aBuf, int *pnBuf){ } } break; - - case 'n': + + case 'n': if( nBuf>3 && 0==memcmp("ant", &aBuf[nBuf-3], 3) ){ if( fts5Porter_MGt1(aBuf, nBuf-3) ){ *pnBuf = nBuf - 3; @@ -222392,8 +222392,8 @@ static int fts5PorterStep4(char *aBuf, int *pnBuf){ } } break; - - case 'o': + + case 'o': if( nBuf>3 && 0==memcmp("ion", &aBuf[nBuf-3], 3) ){ if( fts5Porter_MGt1_and_S_or_T(aBuf, nBuf-3) ){ *pnBuf = nBuf - 3; @@ -222404,16 +222404,16 @@ static int fts5PorterStep4(char *aBuf, int *pnBuf){ } } break; - - case 's': + + case 's': if( nBuf>3 && 0==memcmp("ism", &aBuf[nBuf-3], 3) ){ if( fts5Porter_MGt1(aBuf, nBuf-3) ){ *pnBuf = nBuf - 3; } } break; - - case 't': + + case 't': if( nBuf>3 && 0==memcmp("ate", &aBuf[nBuf-3], 3) ){ if( fts5Porter_MGt1(aBuf, nBuf-3) ){ *pnBuf = nBuf - 3; @@ -222424,76 +222424,76 @@ static int fts5PorterStep4(char *aBuf, int *pnBuf){ } } break; - - case 'u': + + case 'u': if( nBuf>3 && 0==memcmp("ous", &aBuf[nBuf-3], 3) ){ if( fts5Porter_MGt1(aBuf, nBuf-3) ){ *pnBuf = nBuf - 3; } } break; - - case 'v': + + case 'v': if( nBuf>3 && 0==memcmp("ive", &aBuf[nBuf-3], 3) ){ if( fts5Porter_MGt1(aBuf, nBuf-3) ){ *pnBuf = nBuf - 3; } } break; - - case 'z': + + case 'z': if( nBuf>3 && 0==memcmp("ize", &aBuf[nBuf-3], 3) ){ if( fts5Porter_MGt1(aBuf, nBuf-3) ){ *pnBuf = nBuf - 3; } } break; - + } return ret; } - + static int fts5PorterStep1B2(char *aBuf, int *pnBuf){ int ret = 0; int nBuf = *pnBuf; switch( aBuf[nBuf-2] ){ - - case 'a': + + case 'a': if( nBuf>2 && 0==memcmp("at", &aBuf[nBuf-2], 2) ){ memcpy(&aBuf[nBuf-2], "ate", 3); *pnBuf = nBuf - 2 + 3; ret = 1; } break; - - case 'b': + + case 'b': if( nBuf>2 && 0==memcmp("bl", &aBuf[nBuf-2], 2) ){ memcpy(&aBuf[nBuf-2], "ble", 3); *pnBuf = nBuf - 2 + 3; ret = 1; } break; - - case 'i': + + case 'i': if( nBuf>2 && 0==memcmp("iz", &aBuf[nBuf-2], 2) ){ memcpy(&aBuf[nBuf-2], "ize", 3); *pnBuf = nBuf - 2 + 3; ret = 1; } break; - + } return ret; } - + static int fts5PorterStep2(char *aBuf, int *pnBuf){ int ret = 0; int nBuf = *pnBuf; switch( aBuf[nBuf-2] ){ - - case 'a': + + case 'a': if( nBuf>7 && 0==memcmp("ational", &aBuf[nBuf-7], 7) ){ if( fts5Porter_MGt0(aBuf, nBuf-7) ){ memcpy(&aBuf[nBuf-7], "ate", 3); @@ -222506,8 +222506,8 @@ static int fts5PorterStep2(char *aBuf, int *pnBuf){ } } break; - - case 'c': + + case 'c': if( nBuf>4 && 0==memcmp("enci", &aBuf[nBuf-4], 4) ){ if( fts5Porter_MGt0(aBuf, nBuf-4) ){ memcpy(&aBuf[nBuf-4], "ence", 4); @@ -222520,8 +222520,8 @@ static int fts5PorterStep2(char *aBuf, int *pnBuf){ } } break; - - case 'e': + + case 'e': if( nBuf>4 && 0==memcmp("izer", &aBuf[nBuf-4], 4) ){ if( fts5Porter_MGt0(aBuf, nBuf-4) ){ memcpy(&aBuf[nBuf-4], "ize", 3); @@ -222529,8 +222529,8 @@ static int fts5PorterStep2(char *aBuf, int *pnBuf){ } } break; - - case 'g': + + case 'g': if( nBuf>4 && 0==memcmp("logi", &aBuf[nBuf-4], 4) ){ if( fts5Porter_MGt0(aBuf, nBuf-4) ){ memcpy(&aBuf[nBuf-4], "log", 3); @@ -222538,8 +222538,8 @@ static int fts5PorterStep2(char *aBuf, int *pnBuf){ } } break; - - case 'l': + + case 'l': if( nBuf>3 && 0==memcmp("bli", &aBuf[nBuf-3], 3) ){ if( fts5Porter_MGt0(aBuf, nBuf-3) ){ memcpy(&aBuf[nBuf-3], "ble", 3); @@ -222567,8 +222567,8 @@ static int fts5PorterStep2(char *aBuf, int *pnBuf){ } } break; - - case 'o': + + case 'o': if( nBuf>7 && 0==memcmp("ization", &aBuf[nBuf-7], 7) ){ if( fts5Porter_MGt0(aBuf, nBuf-7) ){ memcpy(&aBuf[nBuf-7], "ize", 3); @@ -222586,8 +222586,8 @@ static int fts5PorterStep2(char *aBuf, int *pnBuf){ } } break; - - case 's': + + case 's': if( nBuf>5 && 0==memcmp("alism", &aBuf[nBuf-5], 5) ){ if( fts5Porter_MGt0(aBuf, nBuf-5) ){ memcpy(&aBuf[nBuf-5], "al", 2); @@ -222610,8 +222610,8 @@ static int fts5PorterStep2(char *aBuf, int *pnBuf){ } } break; - - case 't': + + case 't': if( nBuf>5 && 0==memcmp("aliti", &aBuf[nBuf-5], 5) ){ if( fts5Porter_MGt0(aBuf, nBuf-5) ){ memcpy(&aBuf[nBuf-5], "al", 2); @@ -222629,18 +222629,18 @@ static int fts5PorterStep2(char *aBuf, int *pnBuf){ } } break; - + } return ret; } - + static int fts5PorterStep3(char *aBuf, int *pnBuf){ int ret = 0; int nBuf = *pnBuf; switch( aBuf[nBuf-2] ){ - - case 'a': + + case 'a': if( nBuf>4 && 0==memcmp("ical", &aBuf[nBuf-4], 4) ){ if( fts5Porter_MGt0(aBuf, nBuf-4) ){ memcpy(&aBuf[nBuf-4], "ic", 2); @@ -222648,16 +222648,16 @@ static int fts5PorterStep3(char *aBuf, int *pnBuf){ } } break; - - case 's': + + case 's': if( nBuf>4 && 0==memcmp("ness", &aBuf[nBuf-4], 4) ){ if( fts5Porter_MGt0(aBuf, nBuf-4) ){ *pnBuf = nBuf - 4; } } break; - - case 't': + + case 't': if( nBuf>5 && 0==memcmp("icate", &aBuf[nBuf-5], 5) ){ if( fts5Porter_MGt0(aBuf, nBuf-5) ){ memcpy(&aBuf[nBuf-5], "ic", 2); @@ -222670,24 +222670,24 @@ static int fts5PorterStep3(char *aBuf, int *pnBuf){ } } break; - - case 'u': + + case 'u': if( nBuf>3 && 0==memcmp("ful", &aBuf[nBuf-3], 3) ){ if( fts5Porter_MGt0(aBuf, nBuf-3) ){ *pnBuf = nBuf - 3; } } break; - - case 'v': + + case 'v': if( nBuf>5 && 0==memcmp("ative", &aBuf[nBuf-5], 5) ){ if( fts5Porter_MGt0(aBuf, nBuf-5) ){ *pnBuf = nBuf - 5; } } break; - - case 'z': + + case 'z': if( nBuf>5 && 0==memcmp("alize", &aBuf[nBuf-5], 5) ){ if( fts5Porter_MGt0(aBuf, nBuf-5) ){ memcpy(&aBuf[nBuf-5], "al", 2); @@ -222695,18 +222695,18 @@ static int fts5PorterStep3(char *aBuf, int *pnBuf){ } } break; - + } return ret; } - + static int fts5PorterStep1B(char *aBuf, int *pnBuf){ int ret = 0; int nBuf = *pnBuf; switch( aBuf[nBuf-2] ){ - - case 'e': + + case 'e': if( nBuf>3 && 0==memcmp("eed", &aBuf[nBuf-3], 3) ){ if( fts5Porter_MGt0(aBuf, nBuf-3) ){ memcpy(&aBuf[nBuf-3], "ee", 2); @@ -222719,8 +222719,8 @@ static int fts5PorterStep1B(char *aBuf, int *pnBuf){ } } break; - - case 'n': + + case 'n': if( nBuf>3 && 0==memcmp("ing", &aBuf[nBuf-3], 3) ){ if( fts5Porter_Vowel(aBuf, nBuf-3) ){ *pnBuf = nBuf - 3; @@ -222728,12 +222728,12 @@ static int fts5PorterStep1B(char *aBuf, int *pnBuf){ } } break; - + } return ret; } - -/* + +/* ** GENERATED CODE ENDS HERE (mkportersteps.tcl) *************************************************************************** **************************************************************************/ @@ -222742,7 +222742,7 @@ static void fts5PorterStep1A(char *aBuf, int *pnBuf){ int nBuf = *pnBuf; if( aBuf[nBuf-1]=='s' ){ if( aBuf[nBuf-2]=='e' ){ - if( (nBuf>4 && aBuf[nBuf-4]=='s' && aBuf[nBuf-3]=='s') + if( (nBuf>4 && aBuf[nBuf-4]=='s' && aBuf[nBuf-3]=='s') || (nBuf>3 && aBuf[nBuf-3]=='i' ) ){ *pnBuf = nBuf-2; @@ -222757,11 +222757,11 @@ static void fts5PorterStep1A(char *aBuf, int *pnBuf){ } static int fts5PorterCb( - void *pCtx, + void *pCtx, int tflags, - const char *pToken, - int nToken, - int iStart, + const char *pToken, + int nToken, + int iStart, int iEnd ){ PorterContext *p = (PorterContext*)pCtx; @@ -222779,8 +222779,8 @@ static int fts5PorterCb( if( fts5PorterStep1B(aBuf, &nBuf) ){ if( fts5PorterStep1B2(aBuf, &nBuf)==0 ){ char c = aBuf[nBuf-1]; - if( fts5PorterIsVowel(c, 0)==0 - && c!='l' && c!='s' && c!='z' && c==aBuf[nBuf-2] + if( fts5PorterIsVowel(c, 0)==0 + && c!='l' && c!='s' && c!='z' && c==aBuf[nBuf-2] ){ nBuf--; }else if( fts5Porter_MEq1(aBuf, nBuf) && fts5Porter_Ostar(aBuf, nBuf) ){ @@ -222802,7 +222802,7 @@ static int fts5PorterCb( /* Step 5a. */ assert( nBuf>0 ); if( aBuf[nBuf-1]=='e' ){ - if( fts5Porter_MGt1(aBuf, nBuf-1) + if( fts5Porter_MGt1(aBuf, nBuf-1) || (fts5Porter_MEq1(aBuf, nBuf-1) && !fts5Porter_Ostar(aBuf, nBuf-1)) ){ nBuf--; @@ -222810,8 +222810,8 @@ static int fts5PorterCb( } /* Step 5b. */ - if( nBuf>1 && aBuf[nBuf-1]=='l' - && aBuf[nBuf-2]=='l' && fts5Porter_MGt1(aBuf, nBuf-1) + if( nBuf>1 && aBuf[nBuf-1]=='l' + && aBuf[nBuf-2]=='l' && fts5Porter_MGt1(aBuf, nBuf-1) ){ nBuf--; } @@ -222854,7 +222854,7 @@ static int sqlite3Fts5TokenizerInit(fts5_api *pApi){ { "ascii", {fts5AsciiCreate, fts5AsciiDelete, fts5AsciiTokenize }}, { "porter", {fts5PorterCreate, fts5PorterDelete, fts5PorterTokenize }}, }; - + int rc = SQLITE_OK; /* Return code */ int i; /* To iterate through builtin functions */ @@ -222902,46 +222902,46 @@ static int sqlite3Fts5TokenizerInit(fts5_api *pApi){ */ static int fts5_remove_diacritic(int c, int bComplex){ unsigned short aDia[] = { - 0, 1797, 1848, 1859, 1891, 1928, 1940, 1995, - 2024, 2040, 2060, 2110, 2168, 2206, 2264, 2286, - 2344, 2383, 2472, 2488, 2516, 2596, 2668, 2732, - 2782, 2842, 2894, 2954, 2984, 3000, 3028, 3336, - 3456, 3696, 3712, 3728, 3744, 3766, 3832, 3896, - 3912, 3928, 3944, 3968, 4008, 4040, 4056, 4106, - 4138, 4170, 4202, 4234, 4266, 4296, 4312, 4344, - 4408, 4424, 4442, 4472, 4488, 4504, 6148, 6198, - 6264, 6280, 6360, 6429, 6505, 6529, 61448, 61468, - 61512, 61534, 61592, 61610, 61642, 61672, 61688, 61704, - 61726, 61784, 61800, 61816, 61836, 61880, 61896, 61914, - 61948, 61998, 62062, 62122, 62154, 62184, 62200, 62218, - 62252, 62302, 62364, 62410, 62442, 62478, 62536, 62554, - 62584, 62604, 62640, 62648, 62656, 62664, 62730, 62766, - 62830, 62890, 62924, 62974, 63032, 63050, 63082, 63118, - 63182, 63242, 63274, 63310, 63368, 63390, + 0, 1797, 1848, 1859, 1891, 1928, 1940, 1995, + 2024, 2040, 2060, 2110, 2168, 2206, 2264, 2286, + 2344, 2383, 2472, 2488, 2516, 2596, 2668, 2732, + 2782, 2842, 2894, 2954, 2984, 3000, 3028, 3336, + 3456, 3696, 3712, 3728, 3744, 3766, 3832, 3896, + 3912, 3928, 3944, 3968, 4008, 4040, 4056, 4106, + 4138, 4170, 4202, 4234, 4266, 4296, 4312, 4344, + 4408, 4424, 4442, 4472, 4488, 4504, 6148, 6198, + 6264, 6280, 6360, 6429, 6505, 6529, 61448, 61468, + 61512, 61534, 61592, 61610, 61642, 61672, 61688, 61704, + 61726, 61784, 61800, 61816, 61836, 61880, 61896, 61914, + 61948, 61998, 62062, 62122, 62154, 62184, 62200, 62218, + 62252, 62302, 62364, 62410, 62442, 62478, 62536, 62554, + 62584, 62604, 62640, 62648, 62656, 62664, 62730, 62766, + 62830, 62890, 62924, 62974, 63032, 63050, 63082, 63118, + 63182, 63242, 63274, 63310, 63368, 63390, }; #define HIBIT ((unsigned char)0x80) unsigned char aChar[] = { - '\0', 'a', 'c', 'e', 'i', 'n', - 'o', 'u', 'y', 'y', 'a', 'c', - 'd', 'e', 'e', 'g', 'h', 'i', - 'j', 'k', 'l', 'n', 'o', 'r', - 's', 't', 'u', 'u', 'w', 'y', - 'z', 'o', 'u', 'a', 'i', 'o', - 'u', 'u'|HIBIT, 'a'|HIBIT, 'g', 'k', 'o', - 'o'|HIBIT, 'j', 'g', 'n', 'a'|HIBIT, 'a', - 'e', 'i', 'o', 'r', 'u', 's', - 't', 'h', 'a', 'e', 'o'|HIBIT, 'o', - 'o'|HIBIT, 'y', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', 'a', 'b', - 'c'|HIBIT, 'd', 'd', 'e'|HIBIT, 'e', 'e'|HIBIT, - 'f', 'g', 'h', 'h', 'i', 'i'|HIBIT, - 'k', 'l', 'l'|HIBIT, 'l', 'm', 'n', - 'o'|HIBIT, 'p', 'r', 'r'|HIBIT, 'r', 's', - 's'|HIBIT, 't', 'u', 'u'|HIBIT, 'v', 'w', - 'w', 'x', 'y', 'z', 'h', 't', - 'w', 'y', 'a', 'a'|HIBIT, 'a'|HIBIT, 'a'|HIBIT, - 'e', 'e'|HIBIT, 'e'|HIBIT, 'i', 'o', 'o'|HIBIT, - 'o'|HIBIT, 'o'|HIBIT, 'u', 'u'|HIBIT, 'u'|HIBIT, 'y', + '\0', 'a', 'c', 'e', 'i', 'n', + 'o', 'u', 'y', 'y', 'a', 'c', + 'd', 'e', 'e', 'g', 'h', 'i', + 'j', 'k', 'l', 'n', 'o', 'r', + 's', 't', 'u', 'u', 'w', 'y', + 'z', 'o', 'u', 'a', 'i', 'o', + 'u', 'u'|HIBIT, 'a'|HIBIT, 'g', 'k', 'o', + 'o'|HIBIT, 'j', 'g', 'n', 'a'|HIBIT, 'a', + 'e', 'i', 'o', 'r', 'u', 's', + 't', 'h', 'a', 'e', 'o'|HIBIT, 'o', + 'o'|HIBIT, 'y', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', 'a', 'b', + 'c'|HIBIT, 'd', 'd', 'e'|HIBIT, 'e', 'e'|HIBIT, + 'f', 'g', 'h', 'h', 'i', 'i'|HIBIT, + 'k', 'l', 'l'|HIBIT, 'l', 'm', 'n', + 'o'|HIBIT, 'p', 'r', 'r'|HIBIT, 'r', 's', + 's'|HIBIT, 't', 'u', 'u'|HIBIT, 'v', 'w', + 'w', 'x', 'y', 'z', 'h', 't', + 'w', 'y', 'a', 'a'|HIBIT, 'a'|HIBIT, 'a'|HIBIT, + 'e', 'e'|HIBIT, 'e'|HIBIT, 'i', 'o', 'o'|HIBIT, + 'o'|HIBIT, 'o'|HIBIT, 'u', 'u'|HIBIT, 'u'|HIBIT, 'y', }; unsigned int key = (((unsigned int)c)<<3) | 0x00000007; @@ -223063,19 +223063,19 @@ static int sqlite3Fts5UnicodeFold(int c, int eRemoveDiacritic){ {42802, 1, 62}, {42873, 1, 4}, {42877, 76, 1}, {42878, 1, 10}, {42891, 0, 1}, {42893, 74, 1}, {42896, 1, 4}, {42912, 1, 10}, {42922, 72, 1}, - {65313, 14, 26}, + {65313, 14, 26}, }; static const unsigned short aiOff[] = { - 1, 2, 8, 15, 16, 26, 28, 32, - 37, 38, 40, 48, 63, 64, 69, 71, - 79, 80, 116, 202, 203, 205, 206, 207, - 209, 210, 211, 213, 214, 217, 218, 219, - 775, 7264, 10792, 10795, 23228, 23256, 30204, 54721, - 54753, 54754, 54756, 54787, 54793, 54809, 57153, 57274, - 57921, 58019, 58363, 61722, 65268, 65341, 65373, 65406, - 65408, 65410, 65415, 65424, 65436, 65439, 65450, 65462, - 65472, 65476, 65478, 65480, 65482, 65488, 65506, 65511, - 65514, 65521, 65527, 65528, 65529, + 1, 2, 8, 15, 16, 26, 28, 32, + 37, 38, 40, 48, 63, 64, 69, 71, + 79, 80, 116, 202, 203, 205, 206, 207, + 209, 210, 211, 213, 214, 217, 218, 219, + 775, 7264, 10792, 10795, 23228, 23256, 30204, 54721, + 54753, 54754, 54756, 54787, 54793, 54809, 57153, 57274, + 57921, 58019, 58363, 61722, 65268, 65341, 65373, 65406, + 65408, 65410, 65415, 65424, 65436, 65439, 65450, 65462, + 65472, 65476, 65478, 65480, 65482, 65488, 65506, 65511, + 65514, 65521, 65527, 65528, 65529, }; int ret = c; @@ -223113,7 +223113,7 @@ static int sqlite3Fts5UnicodeFold(int c, int eRemoveDiacritic){ ret = fts5_remove_diacritic(ret, eRemoveDiacritic==2); } } - + else if( c>=66560 && c<66600 ){ ret = c + 40; } @@ -223122,7 +223122,7 @@ static int sqlite3Fts5UnicodeFold(int c, int eRemoveDiacritic){ } -static int sqlite3Fts5UnicodeCatParse(const char *zCat, u8 *aArray){ +static int sqlite3Fts5UnicodeCatParse(const char *zCat, u8 *aArray){ aArray[0] = 1; switch( zCat[0] ){ case 'C': @@ -223132,7 +223132,7 @@ static int sqlite3Fts5UnicodeCatParse(const char *zCat, u8 *aArray){ case 'n': aArray[3] = 1; break; case 's': aArray[4] = 1; break; case 'o': aArray[31] = 1; break; - case '*': + case '*': aArray[1] = 1; aArray[2] = 1; aArray[3] = 1; @@ -223150,7 +223150,7 @@ static int sqlite3Fts5UnicodeCatParse(const char *zCat, u8 *aArray){ case 't': aArray[8] = 1; break; case 'u': aArray[9] = 1; break; case 'C': aArray[30] = 1; break; - case '*': + case '*': aArray[5] = 1; aArray[6] = 1; aArray[7] = 1; @@ -223166,7 +223166,7 @@ static int sqlite3Fts5UnicodeCatParse(const char *zCat, u8 *aArray){ case 'c': aArray[10] = 1; break; case 'e': aArray[11] = 1; break; case 'n': aArray[12] = 1; break; - case '*': + case '*': aArray[10] = 1; aArray[11] = 1; aArray[12] = 1; @@ -223179,7 +223179,7 @@ static int sqlite3Fts5UnicodeCatParse(const char *zCat, u8 *aArray){ case 'd': aArray[13] = 1; break; case 'l': aArray[14] = 1; break; case 'o': aArray[15] = 1; break; - case '*': + case '*': aArray[13] = 1; aArray[14] = 1; aArray[15] = 1; @@ -223196,7 +223196,7 @@ static int sqlite3Fts5UnicodeCatParse(const char *zCat, u8 *aArray){ case 'i': aArray[20] = 1; break; case 'o': aArray[21] = 1; break; case 's': aArray[22] = 1; break; - case '*': + case '*': aArray[16] = 1; aArray[17] = 1; aArray[18] = 1; @@ -223214,7 +223214,7 @@ static int sqlite3Fts5UnicodeCatParse(const char *zCat, u8 *aArray){ case 'k': aArray[24] = 1; break; case 'm': aArray[25] = 1; break; case 'o': aArray[26] = 1; break; - case '*': + case '*': aArray[23] = 1; aArray[24] = 1; aArray[25] = 1; @@ -223228,7 +223228,7 @@ static int sqlite3Fts5UnicodeCatParse(const char *zCat, u8 *aArray){ case 'l': aArray[27] = 1; break; case 'p': aArray[28] = 1; break; case 's': aArray[29] = 1; break; - case '*': + case '*': aArray[27] = 1; aArray[28] = 1; aArray[29] = 1; @@ -223241,369 +223241,369 @@ static int sqlite3Fts5UnicodeCatParse(const char *zCat, u8 *aArray){ } static u16 aFts5UnicodeBlock[] = { - 0, 1471, 1753, 1760, 1760, 1760, 1760, 1760, 1760, 1760, - 1760, 1760, 1760, 1760, 1760, 1763, 1765, + 0, 1471, 1753, 1760, 1760, 1760, 1760, 1760, 1760, 1760, + 1760, 1760, 1760, 1760, 1760, 1763, 1765, }; static u16 aFts5UnicodeMap[] = { - 0, 32, 33, 36, 37, 40, 41, 42, 43, 44, - 45, 46, 48, 58, 60, 63, 65, 91, 92, 93, - 94, 95, 96, 97, 123, 124, 125, 126, 127, 160, - 161, 162, 166, 167, 168, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 178, 180, 181, 182, 184, 185, - 186, 187, 188, 191, 192, 215, 216, 223, 247, 248, - 256, 312, 313, 329, 330, 377, 383, 385, 387, 388, - 391, 394, 396, 398, 402, 403, 405, 406, 409, 412, - 414, 415, 417, 418, 423, 427, 428, 431, 434, 436, - 437, 440, 442, 443, 444, 446, 448, 452, 453, 454, - 455, 456, 457, 458, 459, 460, 461, 477, 478, 496, - 497, 498, 499, 500, 503, 505, 506, 564, 570, 572, - 573, 575, 577, 580, 583, 584, 592, 660, 661, 688, - 706, 710, 722, 736, 741, 748, 749, 750, 751, 768, - 880, 884, 885, 886, 890, 891, 894, 900, 902, 903, - 904, 908, 910, 912, 913, 931, 940, 975, 977, 978, - 981, 984, 1008, 1012, 1014, 1015, 1018, 1020, 1021, 1072, - 1120, 1154, 1155, 1160, 1162, 1217, 1231, 1232, 1329, 1369, - 1370, 1377, 1417, 1418, 1423, 1425, 1470, 1471, 1472, 1473, - 1475, 1476, 1478, 1479, 1488, 1520, 1523, 1536, 1542, 1545, - 1547, 1548, 1550, 1552, 1563, 1566, 1568, 1600, 1601, 1611, - 1632, 1642, 1646, 1648, 1649, 1748, 1749, 1750, 1757, 1758, - 1759, 1765, 1767, 1769, 1770, 1774, 1776, 1786, 1789, 1791, - 1792, 1807, 1808, 1809, 1810, 1840, 1869, 1958, 1969, 1984, - 1994, 2027, 2036, 2038, 2039, 2042, 2048, 2070, 2074, 2075, - 2084, 2085, 2088, 2089, 2096, 2112, 2137, 2142, 2208, 2210, - 2276, 2304, 2307, 2308, 2362, 2363, 2364, 2365, 2366, 2369, - 2377, 2381, 2382, 2384, 2385, 2392, 2402, 2404, 2406, 2416, - 2417, 2418, 2425, 2433, 2434, 2437, 2447, 2451, 2474, 2482, - 2486, 2492, 2493, 2494, 2497, 2503, 2507, 2509, 2510, 2519, - 2524, 2527, 2530, 2534, 2544, 2546, 2548, 2554, 2555, 2561, - 2563, 2565, 2575, 2579, 2602, 2610, 2613, 2616, 2620, 2622, - 2625, 2631, 2635, 2641, 2649, 2654, 2662, 2672, 2674, 2677, - 2689, 2691, 2693, 2703, 2707, 2730, 2738, 2741, 2748, 2749, - 2750, 2753, 2759, 2761, 2763, 2765, 2768, 2784, 2786, 2790, - 2800, 2801, 2817, 2818, 2821, 2831, 2835, 2858, 2866, 2869, - 2876, 2877, 2878, 2879, 2880, 2881, 2887, 2891, 2893, 2902, - 2903, 2908, 2911, 2914, 2918, 2928, 2929, 2930, 2946, 2947, - 2949, 2958, 2962, 2969, 2972, 2974, 2979, 2984, 2990, 3006, - 3008, 3009, 3014, 3018, 3021, 3024, 3031, 3046, 3056, 3059, - 3065, 3066, 3073, 3077, 3086, 3090, 3114, 3125, 3133, 3134, - 3137, 3142, 3146, 3157, 3160, 3168, 3170, 3174, 3192, 3199, - 3202, 3205, 3214, 3218, 3242, 3253, 3260, 3261, 3262, 3263, - 3264, 3270, 3271, 3274, 3276, 3285, 3294, 3296, 3298, 3302, - 3313, 3330, 3333, 3342, 3346, 3389, 3390, 3393, 3398, 3402, - 3405, 3406, 3415, 3424, 3426, 3430, 3440, 3449, 3450, 3458, - 3461, 3482, 3507, 3517, 3520, 3530, 3535, 3538, 3542, 3544, - 3570, 3572, 3585, 3633, 3634, 3636, 3647, 3648, 3654, 3655, - 3663, 3664, 3674, 3713, 3716, 3719, 3722, 3725, 3732, 3737, - 3745, 3749, 3751, 3754, 3757, 3761, 3762, 3764, 3771, 3773, - 3776, 3782, 3784, 3792, 3804, 3840, 3841, 3844, 3859, 3860, - 3861, 3864, 3866, 3872, 3882, 3892, 3893, 3894, 3895, 3896, - 3897, 3898, 3899, 3900, 3901, 3902, 3904, 3913, 3953, 3967, - 3968, 3973, 3974, 3976, 3981, 3993, 4030, 4038, 4039, 4046, - 4048, 4053, 4057, 4096, 4139, 4141, 4145, 4146, 4152, 4153, - 4155, 4157, 4159, 4160, 4170, 4176, 4182, 4184, 4186, 4190, - 4193, 4194, 4197, 4199, 4206, 4209, 4213, 4226, 4227, 4229, - 4231, 4237, 4238, 4239, 4240, 4250, 4253, 4254, 4256, 4295, - 4301, 4304, 4347, 4348, 4349, 4682, 4688, 4696, 4698, 4704, - 4746, 4752, 4786, 4792, 4800, 4802, 4808, 4824, 4882, 4888, - 4957, 4960, 4969, 4992, 5008, 5024, 5120, 5121, 5741, 5743, - 5760, 5761, 5787, 5788, 5792, 5867, 5870, 5888, 5902, 5906, - 5920, 5938, 5941, 5952, 5970, 5984, 5998, 6002, 6016, 6068, - 6070, 6071, 6078, 6086, 6087, 6089, 6100, 6103, 6104, 6107, - 6108, 6109, 6112, 6128, 6144, 6150, 6151, 6155, 6158, 6160, - 6176, 6211, 6212, 6272, 6313, 6314, 6320, 6400, 6432, 6435, - 6439, 6441, 6448, 6450, 6451, 6457, 6464, 6468, 6470, 6480, - 6512, 6528, 6576, 6593, 6600, 6608, 6618, 6622, 6656, 6679, - 6681, 6686, 6688, 6741, 6742, 6743, 6744, 6752, 6753, 6754, - 6755, 6757, 6765, 6771, 6783, 6784, 6800, 6816, 6823, 6824, - 6912, 6916, 6917, 6964, 6965, 6966, 6971, 6972, 6973, 6978, - 6979, 6981, 6992, 7002, 7009, 7019, 7028, 7040, 7042, 7043, - 7073, 7074, 7078, 7080, 7082, 7083, 7084, 7086, 7088, 7098, - 7142, 7143, 7144, 7146, 7149, 7150, 7151, 7154, 7164, 7168, - 7204, 7212, 7220, 7222, 7227, 7232, 7245, 7248, 7258, 7288, - 7294, 7360, 7376, 7379, 7380, 7393, 7394, 7401, 7405, 7406, - 7410, 7412, 7413, 7424, 7468, 7531, 7544, 7545, 7579, 7616, - 7676, 7680, 7830, 7838, 7936, 7944, 7952, 7960, 7968, 7976, - 7984, 7992, 8000, 8008, 8016, 8025, 8027, 8029, 8031, 8033, - 8040, 8048, 8064, 8072, 8080, 8088, 8096, 8104, 8112, 8118, - 8120, 8124, 8125, 8126, 8127, 8130, 8134, 8136, 8140, 8141, - 8144, 8150, 8152, 8157, 8160, 8168, 8173, 8178, 8182, 8184, - 8188, 8189, 8192, 8203, 8208, 8214, 8216, 8217, 8218, 8219, - 8221, 8222, 8223, 8224, 8232, 8233, 8234, 8239, 8240, 8249, - 8250, 8251, 8255, 8257, 8260, 8261, 8262, 8263, 8274, 8275, - 8276, 8277, 8287, 8288, 8298, 8304, 8305, 8308, 8314, 8317, - 8318, 8319, 8320, 8330, 8333, 8334, 8336, 8352, 8400, 8413, - 8417, 8418, 8421, 8448, 8450, 8451, 8455, 8456, 8458, 8459, - 8462, 8464, 8467, 8468, 8469, 8470, 8472, 8473, 8478, 8484, - 8485, 8486, 8487, 8488, 8489, 8490, 8494, 8495, 8496, 8500, - 8501, 8505, 8506, 8508, 8510, 8512, 8517, 8519, 8522, 8523, - 8524, 8526, 8527, 8528, 8544, 8579, 8581, 8585, 8592, 8597, - 8602, 8604, 8608, 8609, 8611, 8612, 8614, 8615, 8622, 8623, - 8654, 8656, 8658, 8659, 8660, 8661, 8692, 8960, 8968, 8972, - 8992, 8994, 9001, 9002, 9003, 9084, 9085, 9115, 9140, 9180, - 9186, 9216, 9280, 9312, 9372, 9450, 9472, 9655, 9656, 9665, - 9666, 9720, 9728, 9839, 9840, 9985, 10088, 10089, 10090, 10091, - 10092, 10093, 10094, 10095, 10096, 10097, 10098, 10099, 10100, 10101, - 10102, 10132, 10176, 10181, 10182, 10183, 10214, 10215, 10216, 10217, - 10218, 10219, 10220, 10221, 10222, 10223, 10224, 10240, 10496, 10627, - 10628, 10629, 10630, 10631, 10632, 10633, 10634, 10635, 10636, 10637, - 10638, 10639, 10640, 10641, 10642, 10643, 10644, 10645, 10646, 10647, - 10648, 10649, 10712, 10713, 10714, 10715, 10716, 10748, 10749, 10750, - 11008, 11056, 11077, 11079, 11088, 11264, 11312, 11360, 11363, 11365, - 11367, 11374, 11377, 11378, 11380, 11381, 11383, 11388, 11390, 11393, - 11394, 11492, 11493, 11499, 11503, 11506, 11513, 11517, 11518, 11520, - 11559, 11565, 11568, 11631, 11632, 11647, 11648, 11680, 11688, 11696, - 11704, 11712, 11720, 11728, 11736, 11744, 11776, 11778, 11779, 11780, - 11781, 11782, 11785, 11786, 11787, 11788, 11789, 11790, 11799, 11800, - 11802, 11803, 11804, 11805, 11806, 11808, 11809, 11810, 11811, 11812, - 11813, 11814, 11815, 11816, 11817, 11818, 11823, 11824, 11834, 11904, - 11931, 12032, 12272, 12288, 12289, 12292, 12293, 12294, 12295, 12296, - 12297, 12298, 12299, 12300, 12301, 12302, 12303, 12304, 12305, 12306, - 12308, 12309, 12310, 12311, 12312, 12313, 12314, 12315, 12316, 12317, - 12318, 12320, 12321, 12330, 12334, 12336, 12337, 12342, 12344, 12347, - 12348, 12349, 12350, 12353, 12441, 12443, 12445, 12447, 12448, 12449, - 12539, 12540, 12543, 12549, 12593, 12688, 12690, 12694, 12704, 12736, - 12784, 12800, 12832, 12842, 12872, 12880, 12881, 12896, 12928, 12938, - 12977, 12992, 13056, 13312, 19893, 19904, 19968, 40908, 40960, 40981, - 40982, 42128, 42192, 42232, 42238, 42240, 42508, 42509, 42512, 42528, - 42538, 42560, 42606, 42607, 42608, 42611, 42612, 42622, 42623, 42624, - 42655, 42656, 42726, 42736, 42738, 42752, 42775, 42784, 42786, 42800, - 42802, 42864, 42865, 42873, 42878, 42888, 42889, 42891, 42896, 42912, - 43000, 43002, 43003, 43010, 43011, 43014, 43015, 43019, 43020, 43043, - 43045, 43047, 43048, 43056, 43062, 43064, 43065, 43072, 43124, 43136, - 43138, 43188, 43204, 43214, 43216, 43232, 43250, 43256, 43259, 43264, - 43274, 43302, 43310, 43312, 43335, 43346, 43359, 43360, 43392, 43395, - 43396, 43443, 43444, 43446, 43450, 43452, 43453, 43457, 43471, 43472, - 43486, 43520, 43561, 43567, 43569, 43571, 43573, 43584, 43587, 43588, - 43596, 43597, 43600, 43612, 43616, 43632, 43633, 43639, 43642, 43643, - 43648, 43696, 43697, 43698, 43701, 43703, 43705, 43710, 43712, 43713, - 43714, 43739, 43741, 43742, 43744, 43755, 43756, 43758, 43760, 43762, - 43763, 43765, 43766, 43777, 43785, 43793, 43808, 43816, 43968, 44003, - 44005, 44006, 44008, 44009, 44011, 44012, 44013, 44016, 44032, 55203, - 55216, 55243, 55296, 56191, 56319, 57343, 57344, 63743, 63744, 64112, - 64256, 64275, 64285, 64286, 64287, 64297, 64298, 64312, 64318, 64320, - 64323, 64326, 64434, 64467, 64830, 64831, 64848, 64914, 65008, 65020, - 65021, 65024, 65040, 65047, 65048, 65049, 65056, 65072, 65073, 65075, - 65077, 65078, 65079, 65080, 65081, 65082, 65083, 65084, 65085, 65086, - 65087, 65088, 65089, 65090, 65091, 65092, 65093, 65095, 65096, 65097, - 65101, 65104, 65108, 65112, 65113, 65114, 65115, 65116, 65117, 65118, - 65119, 65122, 65123, 65124, 65128, 65129, 65130, 65136, 65142, 65279, - 65281, 65284, 65285, 65288, 65289, 65290, 65291, 65292, 65293, 65294, - 65296, 65306, 65308, 65311, 65313, 65339, 65340, 65341, 65342, 65343, - 65344, 65345, 65371, 65372, 65373, 65374, 65375, 65376, 65377, 65378, - 65379, 65380, 65382, 65392, 65393, 65438, 65440, 65474, 65482, 65490, - 65498, 65504, 65506, 65507, 65508, 65509, 65512, 65513, 65517, 65529, - 65532, 0, 13, 40, 60, 63, 80, 128, 256, 263, - 311, 320, 373, 377, 394, 400, 464, 509, 640, 672, - 768, 800, 816, 833, 834, 842, 896, 927, 928, 968, - 976, 977, 1024, 1064, 1104, 1184, 2048, 2056, 2058, 2103, - 2108, 2111, 2135, 2136, 2304, 2326, 2335, 2336, 2367, 2432, - 2494, 2560, 2561, 2565, 2572, 2576, 2581, 2585, 2616, 2623, - 2624, 2640, 2656, 2685, 2687, 2816, 2873, 2880, 2904, 2912, - 2936, 3072, 3680, 4096, 4097, 4098, 4099, 4152, 4167, 4178, - 4198, 4224, 4226, 4227, 4272, 4275, 4279, 4281, 4283, 4285, - 4286, 4304, 4336, 4352, 4355, 4391, 4396, 4397, 4406, 4416, - 4480, 4482, 4483, 4531, 4534, 4543, 4545, 4549, 4560, 5760, - 5803, 5804, 5805, 5806, 5808, 5814, 5815, 5824, 8192, 9216, - 9328, 12288, 26624, 28416, 28496, 28497, 28559, 28563, 45056, 53248, - 53504, 53545, 53605, 53607, 53610, 53613, 53619, 53627, 53635, 53637, - 53644, 53674, 53678, 53760, 53826, 53829, 54016, 54112, 54272, 54298, - 54324, 54350, 54358, 54376, 54402, 54428, 54430, 54434, 54437, 54441, - 54446, 54454, 54459, 54461, 54469, 54480, 54506, 54532, 54535, 54541, - 54550, 54558, 54584, 54587, 54592, 54598, 54602, 54610, 54636, 54662, - 54688, 54714, 54740, 54766, 54792, 54818, 54844, 54870, 54896, 54922, - 54952, 54977, 54978, 55003, 55004, 55010, 55035, 55036, 55061, 55062, - 55068, 55093, 55094, 55119, 55120, 55126, 55151, 55152, 55177, 55178, - 55184, 55209, 55210, 55235, 55236, 55242, 55246, 60928, 60933, 60961, - 60964, 60967, 60969, 60980, 60985, 60987, 60994, 60999, 61001, 61003, - 61005, 61009, 61012, 61015, 61017, 61019, 61021, 61023, 61025, 61028, - 61031, 61036, 61044, 61049, 61054, 61056, 61067, 61089, 61093, 61099, - 61168, 61440, 61488, 61600, 61617, 61633, 61649, 61696, 61712, 61744, - 61808, 61926, 61968, 62016, 62032, 62208, 62256, 62263, 62336, 62368, - 62406, 62432, 62464, 62528, 62530, 62713, 62720, 62784, 62800, 62971, - 63045, 63104, 63232, 0, 42710, 42752, 46900, 46912, 47133, 63488, - 1, 32, 256, 0, 65533, + 0, 32, 33, 36, 37, 40, 41, 42, 43, 44, + 45, 46, 48, 58, 60, 63, 65, 91, 92, 93, + 94, 95, 96, 97, 123, 124, 125, 126, 127, 160, + 161, 162, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 180, 181, 182, 184, 185, + 186, 187, 188, 191, 192, 215, 216, 223, 247, 248, + 256, 312, 313, 329, 330, 377, 383, 385, 387, 388, + 391, 394, 396, 398, 402, 403, 405, 406, 409, 412, + 414, 415, 417, 418, 423, 427, 428, 431, 434, 436, + 437, 440, 442, 443, 444, 446, 448, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 477, 478, 496, + 497, 498, 499, 500, 503, 505, 506, 564, 570, 572, + 573, 575, 577, 580, 583, 584, 592, 660, 661, 688, + 706, 710, 722, 736, 741, 748, 749, 750, 751, 768, + 880, 884, 885, 886, 890, 891, 894, 900, 902, 903, + 904, 908, 910, 912, 913, 931, 940, 975, 977, 978, + 981, 984, 1008, 1012, 1014, 1015, 1018, 1020, 1021, 1072, + 1120, 1154, 1155, 1160, 1162, 1217, 1231, 1232, 1329, 1369, + 1370, 1377, 1417, 1418, 1423, 1425, 1470, 1471, 1472, 1473, + 1475, 1476, 1478, 1479, 1488, 1520, 1523, 1536, 1542, 1545, + 1547, 1548, 1550, 1552, 1563, 1566, 1568, 1600, 1601, 1611, + 1632, 1642, 1646, 1648, 1649, 1748, 1749, 1750, 1757, 1758, + 1759, 1765, 1767, 1769, 1770, 1774, 1776, 1786, 1789, 1791, + 1792, 1807, 1808, 1809, 1810, 1840, 1869, 1958, 1969, 1984, + 1994, 2027, 2036, 2038, 2039, 2042, 2048, 2070, 2074, 2075, + 2084, 2085, 2088, 2089, 2096, 2112, 2137, 2142, 2208, 2210, + 2276, 2304, 2307, 2308, 2362, 2363, 2364, 2365, 2366, 2369, + 2377, 2381, 2382, 2384, 2385, 2392, 2402, 2404, 2406, 2416, + 2417, 2418, 2425, 2433, 2434, 2437, 2447, 2451, 2474, 2482, + 2486, 2492, 2493, 2494, 2497, 2503, 2507, 2509, 2510, 2519, + 2524, 2527, 2530, 2534, 2544, 2546, 2548, 2554, 2555, 2561, + 2563, 2565, 2575, 2579, 2602, 2610, 2613, 2616, 2620, 2622, + 2625, 2631, 2635, 2641, 2649, 2654, 2662, 2672, 2674, 2677, + 2689, 2691, 2693, 2703, 2707, 2730, 2738, 2741, 2748, 2749, + 2750, 2753, 2759, 2761, 2763, 2765, 2768, 2784, 2786, 2790, + 2800, 2801, 2817, 2818, 2821, 2831, 2835, 2858, 2866, 2869, + 2876, 2877, 2878, 2879, 2880, 2881, 2887, 2891, 2893, 2902, + 2903, 2908, 2911, 2914, 2918, 2928, 2929, 2930, 2946, 2947, + 2949, 2958, 2962, 2969, 2972, 2974, 2979, 2984, 2990, 3006, + 3008, 3009, 3014, 3018, 3021, 3024, 3031, 3046, 3056, 3059, + 3065, 3066, 3073, 3077, 3086, 3090, 3114, 3125, 3133, 3134, + 3137, 3142, 3146, 3157, 3160, 3168, 3170, 3174, 3192, 3199, + 3202, 3205, 3214, 3218, 3242, 3253, 3260, 3261, 3262, 3263, + 3264, 3270, 3271, 3274, 3276, 3285, 3294, 3296, 3298, 3302, + 3313, 3330, 3333, 3342, 3346, 3389, 3390, 3393, 3398, 3402, + 3405, 3406, 3415, 3424, 3426, 3430, 3440, 3449, 3450, 3458, + 3461, 3482, 3507, 3517, 3520, 3530, 3535, 3538, 3542, 3544, + 3570, 3572, 3585, 3633, 3634, 3636, 3647, 3648, 3654, 3655, + 3663, 3664, 3674, 3713, 3716, 3719, 3722, 3725, 3732, 3737, + 3745, 3749, 3751, 3754, 3757, 3761, 3762, 3764, 3771, 3773, + 3776, 3782, 3784, 3792, 3804, 3840, 3841, 3844, 3859, 3860, + 3861, 3864, 3866, 3872, 3882, 3892, 3893, 3894, 3895, 3896, + 3897, 3898, 3899, 3900, 3901, 3902, 3904, 3913, 3953, 3967, + 3968, 3973, 3974, 3976, 3981, 3993, 4030, 4038, 4039, 4046, + 4048, 4053, 4057, 4096, 4139, 4141, 4145, 4146, 4152, 4153, + 4155, 4157, 4159, 4160, 4170, 4176, 4182, 4184, 4186, 4190, + 4193, 4194, 4197, 4199, 4206, 4209, 4213, 4226, 4227, 4229, + 4231, 4237, 4238, 4239, 4240, 4250, 4253, 4254, 4256, 4295, + 4301, 4304, 4347, 4348, 4349, 4682, 4688, 4696, 4698, 4704, + 4746, 4752, 4786, 4792, 4800, 4802, 4808, 4824, 4882, 4888, + 4957, 4960, 4969, 4992, 5008, 5024, 5120, 5121, 5741, 5743, + 5760, 5761, 5787, 5788, 5792, 5867, 5870, 5888, 5902, 5906, + 5920, 5938, 5941, 5952, 5970, 5984, 5998, 6002, 6016, 6068, + 6070, 6071, 6078, 6086, 6087, 6089, 6100, 6103, 6104, 6107, + 6108, 6109, 6112, 6128, 6144, 6150, 6151, 6155, 6158, 6160, + 6176, 6211, 6212, 6272, 6313, 6314, 6320, 6400, 6432, 6435, + 6439, 6441, 6448, 6450, 6451, 6457, 6464, 6468, 6470, 6480, + 6512, 6528, 6576, 6593, 6600, 6608, 6618, 6622, 6656, 6679, + 6681, 6686, 6688, 6741, 6742, 6743, 6744, 6752, 6753, 6754, + 6755, 6757, 6765, 6771, 6783, 6784, 6800, 6816, 6823, 6824, + 6912, 6916, 6917, 6964, 6965, 6966, 6971, 6972, 6973, 6978, + 6979, 6981, 6992, 7002, 7009, 7019, 7028, 7040, 7042, 7043, + 7073, 7074, 7078, 7080, 7082, 7083, 7084, 7086, 7088, 7098, + 7142, 7143, 7144, 7146, 7149, 7150, 7151, 7154, 7164, 7168, + 7204, 7212, 7220, 7222, 7227, 7232, 7245, 7248, 7258, 7288, + 7294, 7360, 7376, 7379, 7380, 7393, 7394, 7401, 7405, 7406, + 7410, 7412, 7413, 7424, 7468, 7531, 7544, 7545, 7579, 7616, + 7676, 7680, 7830, 7838, 7936, 7944, 7952, 7960, 7968, 7976, + 7984, 7992, 8000, 8008, 8016, 8025, 8027, 8029, 8031, 8033, + 8040, 8048, 8064, 8072, 8080, 8088, 8096, 8104, 8112, 8118, + 8120, 8124, 8125, 8126, 8127, 8130, 8134, 8136, 8140, 8141, + 8144, 8150, 8152, 8157, 8160, 8168, 8173, 8178, 8182, 8184, + 8188, 8189, 8192, 8203, 8208, 8214, 8216, 8217, 8218, 8219, + 8221, 8222, 8223, 8224, 8232, 8233, 8234, 8239, 8240, 8249, + 8250, 8251, 8255, 8257, 8260, 8261, 8262, 8263, 8274, 8275, + 8276, 8277, 8287, 8288, 8298, 8304, 8305, 8308, 8314, 8317, + 8318, 8319, 8320, 8330, 8333, 8334, 8336, 8352, 8400, 8413, + 8417, 8418, 8421, 8448, 8450, 8451, 8455, 8456, 8458, 8459, + 8462, 8464, 8467, 8468, 8469, 8470, 8472, 8473, 8478, 8484, + 8485, 8486, 8487, 8488, 8489, 8490, 8494, 8495, 8496, 8500, + 8501, 8505, 8506, 8508, 8510, 8512, 8517, 8519, 8522, 8523, + 8524, 8526, 8527, 8528, 8544, 8579, 8581, 8585, 8592, 8597, + 8602, 8604, 8608, 8609, 8611, 8612, 8614, 8615, 8622, 8623, + 8654, 8656, 8658, 8659, 8660, 8661, 8692, 8960, 8968, 8972, + 8992, 8994, 9001, 9002, 9003, 9084, 9085, 9115, 9140, 9180, + 9186, 9216, 9280, 9312, 9372, 9450, 9472, 9655, 9656, 9665, + 9666, 9720, 9728, 9839, 9840, 9985, 10088, 10089, 10090, 10091, + 10092, 10093, 10094, 10095, 10096, 10097, 10098, 10099, 10100, 10101, + 10102, 10132, 10176, 10181, 10182, 10183, 10214, 10215, 10216, 10217, + 10218, 10219, 10220, 10221, 10222, 10223, 10224, 10240, 10496, 10627, + 10628, 10629, 10630, 10631, 10632, 10633, 10634, 10635, 10636, 10637, + 10638, 10639, 10640, 10641, 10642, 10643, 10644, 10645, 10646, 10647, + 10648, 10649, 10712, 10713, 10714, 10715, 10716, 10748, 10749, 10750, + 11008, 11056, 11077, 11079, 11088, 11264, 11312, 11360, 11363, 11365, + 11367, 11374, 11377, 11378, 11380, 11381, 11383, 11388, 11390, 11393, + 11394, 11492, 11493, 11499, 11503, 11506, 11513, 11517, 11518, 11520, + 11559, 11565, 11568, 11631, 11632, 11647, 11648, 11680, 11688, 11696, + 11704, 11712, 11720, 11728, 11736, 11744, 11776, 11778, 11779, 11780, + 11781, 11782, 11785, 11786, 11787, 11788, 11789, 11790, 11799, 11800, + 11802, 11803, 11804, 11805, 11806, 11808, 11809, 11810, 11811, 11812, + 11813, 11814, 11815, 11816, 11817, 11818, 11823, 11824, 11834, 11904, + 11931, 12032, 12272, 12288, 12289, 12292, 12293, 12294, 12295, 12296, + 12297, 12298, 12299, 12300, 12301, 12302, 12303, 12304, 12305, 12306, + 12308, 12309, 12310, 12311, 12312, 12313, 12314, 12315, 12316, 12317, + 12318, 12320, 12321, 12330, 12334, 12336, 12337, 12342, 12344, 12347, + 12348, 12349, 12350, 12353, 12441, 12443, 12445, 12447, 12448, 12449, + 12539, 12540, 12543, 12549, 12593, 12688, 12690, 12694, 12704, 12736, + 12784, 12800, 12832, 12842, 12872, 12880, 12881, 12896, 12928, 12938, + 12977, 12992, 13056, 13312, 19893, 19904, 19968, 40908, 40960, 40981, + 40982, 42128, 42192, 42232, 42238, 42240, 42508, 42509, 42512, 42528, + 42538, 42560, 42606, 42607, 42608, 42611, 42612, 42622, 42623, 42624, + 42655, 42656, 42726, 42736, 42738, 42752, 42775, 42784, 42786, 42800, + 42802, 42864, 42865, 42873, 42878, 42888, 42889, 42891, 42896, 42912, + 43000, 43002, 43003, 43010, 43011, 43014, 43015, 43019, 43020, 43043, + 43045, 43047, 43048, 43056, 43062, 43064, 43065, 43072, 43124, 43136, + 43138, 43188, 43204, 43214, 43216, 43232, 43250, 43256, 43259, 43264, + 43274, 43302, 43310, 43312, 43335, 43346, 43359, 43360, 43392, 43395, + 43396, 43443, 43444, 43446, 43450, 43452, 43453, 43457, 43471, 43472, + 43486, 43520, 43561, 43567, 43569, 43571, 43573, 43584, 43587, 43588, + 43596, 43597, 43600, 43612, 43616, 43632, 43633, 43639, 43642, 43643, + 43648, 43696, 43697, 43698, 43701, 43703, 43705, 43710, 43712, 43713, + 43714, 43739, 43741, 43742, 43744, 43755, 43756, 43758, 43760, 43762, + 43763, 43765, 43766, 43777, 43785, 43793, 43808, 43816, 43968, 44003, + 44005, 44006, 44008, 44009, 44011, 44012, 44013, 44016, 44032, 55203, + 55216, 55243, 55296, 56191, 56319, 57343, 57344, 63743, 63744, 64112, + 64256, 64275, 64285, 64286, 64287, 64297, 64298, 64312, 64318, 64320, + 64323, 64326, 64434, 64467, 64830, 64831, 64848, 64914, 65008, 65020, + 65021, 65024, 65040, 65047, 65048, 65049, 65056, 65072, 65073, 65075, + 65077, 65078, 65079, 65080, 65081, 65082, 65083, 65084, 65085, 65086, + 65087, 65088, 65089, 65090, 65091, 65092, 65093, 65095, 65096, 65097, + 65101, 65104, 65108, 65112, 65113, 65114, 65115, 65116, 65117, 65118, + 65119, 65122, 65123, 65124, 65128, 65129, 65130, 65136, 65142, 65279, + 65281, 65284, 65285, 65288, 65289, 65290, 65291, 65292, 65293, 65294, + 65296, 65306, 65308, 65311, 65313, 65339, 65340, 65341, 65342, 65343, + 65344, 65345, 65371, 65372, 65373, 65374, 65375, 65376, 65377, 65378, + 65379, 65380, 65382, 65392, 65393, 65438, 65440, 65474, 65482, 65490, + 65498, 65504, 65506, 65507, 65508, 65509, 65512, 65513, 65517, 65529, + 65532, 0, 13, 40, 60, 63, 80, 128, 256, 263, + 311, 320, 373, 377, 394, 400, 464, 509, 640, 672, + 768, 800, 816, 833, 834, 842, 896, 927, 928, 968, + 976, 977, 1024, 1064, 1104, 1184, 2048, 2056, 2058, 2103, + 2108, 2111, 2135, 2136, 2304, 2326, 2335, 2336, 2367, 2432, + 2494, 2560, 2561, 2565, 2572, 2576, 2581, 2585, 2616, 2623, + 2624, 2640, 2656, 2685, 2687, 2816, 2873, 2880, 2904, 2912, + 2936, 3072, 3680, 4096, 4097, 4098, 4099, 4152, 4167, 4178, + 4198, 4224, 4226, 4227, 4272, 4275, 4279, 4281, 4283, 4285, + 4286, 4304, 4336, 4352, 4355, 4391, 4396, 4397, 4406, 4416, + 4480, 4482, 4483, 4531, 4534, 4543, 4545, 4549, 4560, 5760, + 5803, 5804, 5805, 5806, 5808, 5814, 5815, 5824, 8192, 9216, + 9328, 12288, 26624, 28416, 28496, 28497, 28559, 28563, 45056, 53248, + 53504, 53545, 53605, 53607, 53610, 53613, 53619, 53627, 53635, 53637, + 53644, 53674, 53678, 53760, 53826, 53829, 54016, 54112, 54272, 54298, + 54324, 54350, 54358, 54376, 54402, 54428, 54430, 54434, 54437, 54441, + 54446, 54454, 54459, 54461, 54469, 54480, 54506, 54532, 54535, 54541, + 54550, 54558, 54584, 54587, 54592, 54598, 54602, 54610, 54636, 54662, + 54688, 54714, 54740, 54766, 54792, 54818, 54844, 54870, 54896, 54922, + 54952, 54977, 54978, 55003, 55004, 55010, 55035, 55036, 55061, 55062, + 55068, 55093, 55094, 55119, 55120, 55126, 55151, 55152, 55177, 55178, + 55184, 55209, 55210, 55235, 55236, 55242, 55246, 60928, 60933, 60961, + 60964, 60967, 60969, 60980, 60985, 60987, 60994, 60999, 61001, 61003, + 61005, 61009, 61012, 61015, 61017, 61019, 61021, 61023, 61025, 61028, + 61031, 61036, 61044, 61049, 61054, 61056, 61067, 61089, 61093, 61099, + 61168, 61440, 61488, 61600, 61617, 61633, 61649, 61696, 61712, 61744, + 61808, 61926, 61968, 62016, 62032, 62208, 62256, 62263, 62336, 62368, + 62406, 62432, 62464, 62528, 62530, 62713, 62720, 62784, 62800, 62971, + 63045, 63104, 63232, 0, 42710, 42752, 46900, 46912, 47133, 63488, + 1, 32, 256, 0, 65533, }; static u16 aFts5UnicodeData[] = { - 1025, 61, 117, 55, 117, 54, 50, 53, 57, 53, - 49, 85, 333, 85, 121, 85, 841, 54, 53, 50, - 56, 48, 56, 837, 54, 57, 50, 57, 1057, 61, - 53, 151, 58, 53, 56, 58, 39, 52, 57, 34, - 58, 56, 58, 57, 79, 56, 37, 85, 56, 47, - 39, 51, 111, 53, 745, 57, 233, 773, 57, 261, - 1822, 37, 542, 37, 1534, 222, 69, 73, 37, 126, - 126, 73, 69, 137, 37, 73, 37, 105, 101, 73, - 37, 73, 37, 190, 158, 37, 126, 126, 73, 37, - 126, 94, 37, 39, 94, 69, 135, 41, 40, 37, - 41, 40, 37, 41, 40, 37, 542, 37, 606, 37, - 41, 40, 37, 126, 73, 37, 1886, 197, 73, 37, - 73, 69, 126, 105, 37, 286, 2181, 39, 869, 582, - 152, 390, 472, 166, 248, 38, 56, 38, 568, 3596, - 158, 38, 56, 94, 38, 101, 53, 88, 41, 53, - 105, 41, 73, 37, 553, 297, 1125, 94, 37, 105, - 101, 798, 133, 94, 57, 126, 94, 37, 1641, 1541, - 1118, 58, 172, 75, 1790, 478, 37, 2846, 1225, 38, - 213, 1253, 53, 49, 55, 1452, 49, 44, 53, 76, - 53, 76, 53, 44, 871, 103, 85, 162, 121, 85, - 55, 85, 90, 364, 53, 85, 1031, 38, 327, 684, - 333, 149, 71, 44, 3175, 53, 39, 236, 34, 58, - 204, 70, 76, 58, 140, 71, 333, 103, 90, 39, - 469, 34, 39, 44, 967, 876, 2855, 364, 39, 333, - 1063, 300, 70, 58, 117, 38, 711, 140, 38, 300, - 38, 108, 38, 172, 501, 807, 108, 53, 39, 359, - 876, 108, 42, 1735, 44, 42, 44, 39, 106, 268, - 138, 44, 74, 39, 236, 327, 76, 85, 333, 53, - 38, 199, 231, 44, 74, 263, 71, 711, 231, 39, - 135, 44, 39, 106, 140, 74, 74, 44, 39, 42, - 71, 103, 76, 333, 71, 87, 207, 58, 55, 76, - 42, 199, 71, 711, 231, 71, 71, 71, 44, 106, - 76, 76, 108, 44, 135, 39, 333, 76, 103, 44, - 76, 42, 295, 103, 711, 231, 71, 167, 44, 39, - 106, 172, 76, 42, 74, 44, 39, 71, 76, 333, - 53, 55, 44, 74, 263, 71, 711, 231, 71, 167, - 44, 39, 42, 44, 42, 140, 74, 74, 44, 44, - 42, 71, 103, 76, 333, 58, 39, 207, 44, 39, - 199, 103, 135, 71, 39, 71, 71, 103, 391, 74, - 44, 74, 106, 106, 44, 39, 42, 333, 111, 218, - 55, 58, 106, 263, 103, 743, 327, 167, 39, 108, - 138, 108, 140, 76, 71, 71, 76, 333, 239, 58, - 74, 263, 103, 743, 327, 167, 44, 39, 42, 44, - 170, 44, 74, 74, 76, 74, 39, 71, 76, 333, - 71, 74, 263, 103, 1319, 39, 106, 140, 106, 106, - 44, 39, 42, 71, 76, 333, 207, 58, 199, 74, - 583, 775, 295, 39, 231, 44, 106, 108, 44, 266, - 74, 53, 1543, 44, 71, 236, 55, 199, 38, 268, - 53, 333, 85, 71, 39, 71, 39, 39, 135, 231, - 103, 39, 39, 71, 135, 44, 71, 204, 76, 39, - 167, 38, 204, 333, 135, 39, 122, 501, 58, 53, - 122, 76, 218, 333, 335, 58, 44, 58, 44, 58, - 44, 54, 50, 54, 50, 74, 263, 1159, 460, 42, - 172, 53, 76, 167, 364, 1164, 282, 44, 218, 90, - 181, 154, 85, 1383, 74, 140, 42, 204, 42, 76, - 74, 76, 39, 333, 213, 199, 74, 76, 135, 108, - 39, 106, 71, 234, 103, 140, 423, 44, 74, 76, - 202, 44, 39, 42, 333, 106, 44, 90, 1225, 41, - 41, 1383, 53, 38, 10631, 135, 231, 39, 135, 1319, - 135, 1063, 135, 231, 39, 135, 487, 1831, 135, 2151, - 108, 309, 655, 519, 346, 2727, 49, 19847, 85, 551, - 61, 839, 54, 50, 2407, 117, 110, 423, 135, 108, - 583, 108, 85, 583, 76, 423, 103, 76, 1671, 76, - 42, 236, 266, 44, 74, 364, 117, 38, 117, 55, - 39, 44, 333, 335, 213, 49, 149, 108, 61, 333, - 1127, 38, 1671, 1319, 44, 39, 2247, 935, 108, 138, - 76, 106, 74, 44, 202, 108, 58, 85, 333, 967, - 167, 1415, 554, 231, 74, 333, 47, 1114, 743, 76, - 106, 85, 1703, 42, 44, 42, 236, 44, 42, 44, - 74, 268, 202, 332, 44, 333, 333, 245, 38, 213, - 140, 42, 1511, 44, 42, 172, 42, 44, 170, 44, - 74, 231, 333, 245, 346, 300, 314, 76, 42, 967, - 42, 140, 74, 76, 42, 44, 74, 71, 333, 1415, - 44, 42, 76, 106, 44, 42, 108, 74, 149, 1159, - 266, 268, 74, 76, 181, 333, 103, 333, 967, 198, - 85, 277, 108, 53, 428, 42, 236, 135, 44, 135, - 74, 44, 71, 1413, 2022, 421, 38, 1093, 1190, 1260, - 140, 4830, 261, 3166, 261, 265, 197, 201, 261, 265, - 261, 265, 197, 201, 261, 41, 41, 41, 94, 229, - 265, 453, 261, 264, 261, 264, 261, 264, 165, 69, - 137, 40, 56, 37, 120, 101, 69, 137, 40, 120, - 133, 69, 137, 120, 261, 169, 120, 101, 69, 137, - 40, 88, 381, 162, 209, 85, 52, 51, 54, 84, - 51, 54, 52, 277, 59, 60, 162, 61, 309, 52, - 51, 149, 80, 117, 57, 54, 50, 373, 57, 53, - 48, 341, 61, 162, 194, 47, 38, 207, 121, 54, - 50, 38, 335, 121, 54, 50, 422, 855, 428, 139, - 44, 107, 396, 90, 41, 154, 41, 90, 37, 105, - 69, 105, 37, 58, 41, 90, 57, 169, 218, 41, - 58, 41, 58, 41, 58, 137, 58, 37, 137, 37, - 135, 37, 90, 69, 73, 185, 94, 101, 58, 57, - 90, 37, 58, 527, 1134, 94, 142, 47, 185, 186, - 89, 154, 57, 90, 57, 90, 57, 250, 57, 1018, - 89, 90, 57, 58, 57, 1018, 8601, 282, 153, 666, - 89, 250, 54, 50, 2618, 57, 986, 825, 1306, 217, - 602, 1274, 378, 1935, 2522, 719, 5882, 57, 314, 57, - 1754, 281, 3578, 57, 4634, 3322, 54, 50, 54, 50, - 54, 50, 54, 50, 54, 50, 54, 50, 54, 50, - 975, 1434, 185, 54, 50, 1017, 54, 50, 54, 50, - 54, 50, 54, 50, 54, 50, 537, 8218, 4217, 54, - 50, 54, 50, 54, 50, 54, 50, 54, 50, 54, - 50, 54, 50, 54, 50, 54, 50, 54, 50, 54, - 50, 2041, 54, 50, 54, 50, 1049, 54, 50, 8281, - 1562, 697, 90, 217, 346, 1513, 1509, 126, 73, 69, - 254, 105, 37, 94, 37, 94, 165, 70, 105, 37, - 3166, 37, 218, 158, 108, 94, 149, 47, 85, 1221, - 37, 37, 1799, 38, 53, 44, 743, 231, 231, 231, - 231, 231, 231, 231, 231, 1036, 85, 52, 51, 52, - 51, 117, 52, 51, 53, 52, 51, 309, 49, 85, - 49, 53, 52, 51, 85, 52, 51, 54, 50, 54, - 50, 54, 50, 54, 50, 181, 38, 341, 81, 858, - 2874, 6874, 410, 61, 117, 58, 38, 39, 46, 54, - 50, 54, 50, 54, 50, 54, 50, 54, 50, 90, - 54, 50, 54, 50, 54, 50, 54, 50, 49, 54, - 82, 58, 302, 140, 74, 49, 166, 90, 110, 38, - 39, 53, 90, 2759, 76, 88, 70, 39, 49, 2887, - 53, 102, 39, 1319, 3015, 90, 143, 346, 871, 1178, - 519, 1018, 335, 986, 271, 58, 495, 1050, 335, 1274, - 495, 2042, 8218, 39, 39, 2074, 39, 39, 679, 38, - 36583, 1786, 1287, 198, 85, 8583, 38, 117, 519, 333, - 71, 1502, 39, 44, 107, 53, 332, 53, 38, 798, - 44, 2247, 334, 76, 213, 760, 294, 88, 478, 69, - 2014, 38, 261, 190, 350, 38, 88, 158, 158, 382, - 70, 37, 231, 44, 103, 44, 135, 44, 743, 74, - 76, 42, 154, 207, 90, 55, 58, 1671, 149, 74, - 1607, 522, 44, 85, 333, 588, 199, 117, 39, 333, - 903, 268, 85, 743, 364, 74, 53, 935, 108, 42, - 1511, 44, 74, 140, 74, 44, 138, 437, 38, 333, - 85, 1319, 204, 74, 76, 74, 76, 103, 44, 263, - 44, 42, 333, 149, 519, 38, 199, 122, 39, 42, - 1543, 44, 39, 108, 71, 76, 167, 76, 39, 44, - 39, 71, 38, 85, 359, 42, 76, 74, 85, 39, - 70, 42, 44, 199, 199, 199, 231, 231, 1127, 74, - 44, 74, 44, 74, 53, 42, 44, 333, 39, 39, - 743, 1575, 36, 68, 68, 36, 63, 63, 11719, 3399, - 229, 165, 39, 44, 327, 57, 423, 167, 39, 71, - 71, 3463, 536, 11623, 54, 50, 2055, 1735, 391, 55, - 58, 524, 245, 54, 50, 53, 236, 53, 81, 80, - 54, 50, 54, 50, 54, 50, 54, 50, 54, 50, - 54, 50, 54, 50, 54, 50, 85, 54, 50, 149, - 112, 117, 149, 49, 54, 50, 54, 50, 54, 50, - 117, 57, 49, 121, 53, 55, 85, 167, 4327, 34, - 117, 55, 117, 54, 50, 53, 57, 53, 49, 85, - 333, 85, 121, 85, 841, 54, 53, 50, 56, 48, - 56, 837, 54, 57, 50, 57, 54, 50, 53, 54, - 50, 85, 327, 38, 1447, 70, 999, 199, 199, 199, - 103, 87, 57, 56, 58, 87, 58, 153, 90, 98, - 90, 391, 839, 615, 71, 487, 455, 3943, 117, 1455, - 314, 1710, 143, 570, 47, 410, 1466, 44, 935, 1575, - 999, 143, 551, 46, 263, 46, 967, 53, 1159, 263, - 53, 174, 1289, 1285, 2503, 333, 199, 39, 1415, 71, - 39, 743, 53, 271, 711, 207, 53, 839, 53, 1799, - 71, 39, 108, 76, 140, 135, 103, 871, 108, 44, - 271, 309, 935, 79, 53, 1735, 245, 711, 271, 615, - 271, 2343, 1007, 42, 44, 42, 1703, 492, 245, 655, - 333, 76, 42, 1447, 106, 140, 74, 76, 85, 34, - 149, 807, 333, 108, 1159, 172, 42, 268, 333, 149, - 76, 42, 1543, 106, 300, 74, 135, 149, 333, 1383, - 44, 42, 44, 74, 204, 42, 44, 333, 28135, 3182, - 149, 34279, 18215, 2215, 39, 1482, 140, 422, 71, 7898, - 1274, 1946, 74, 108, 122, 202, 258, 268, 90, 236, - 986, 140, 1562, 2138, 108, 58, 2810, 591, 841, 837, - 841, 229, 581, 841, 837, 41, 73, 41, 73, 137, - 265, 133, 37, 229, 357, 841, 837, 73, 137, 265, - 233, 837, 73, 137, 169, 41, 233, 837, 841, 837, - 841, 837, 841, 837, 841, 837, 841, 837, 841, 901, - 809, 57, 805, 57, 197, 809, 57, 805, 57, 197, - 809, 57, 805, 57, 197, 809, 57, 805, 57, 197, - 809, 57, 805, 57, 197, 94, 1613, 135, 871, 71, - 39, 39, 327, 135, 39, 39, 39, 39, 39, 39, - 103, 71, 39, 39, 39, 39, 39, 39, 71, 39, - 135, 231, 135, 135, 39, 327, 551, 103, 167, 551, - 89, 1434, 3226, 506, 474, 506, 506, 367, 1018, 1946, - 1402, 954, 1402, 314, 90, 1082, 218, 2266, 666, 1210, - 186, 570, 2042, 58, 5850, 154, 2010, 154, 794, 2266, - 378, 2266, 3738, 39, 39, 39, 39, 39, 39, 17351, - 34, 3074, 7692, 63, 63, + 1025, 61, 117, 55, 117, 54, 50, 53, 57, 53, + 49, 85, 333, 85, 121, 85, 841, 54, 53, 50, + 56, 48, 56, 837, 54, 57, 50, 57, 1057, 61, + 53, 151, 58, 53, 56, 58, 39, 52, 57, 34, + 58, 56, 58, 57, 79, 56, 37, 85, 56, 47, + 39, 51, 111, 53, 745, 57, 233, 773, 57, 261, + 1822, 37, 542, 37, 1534, 222, 69, 73, 37, 126, + 126, 73, 69, 137, 37, 73, 37, 105, 101, 73, + 37, 73, 37, 190, 158, 37, 126, 126, 73, 37, + 126, 94, 37, 39, 94, 69, 135, 41, 40, 37, + 41, 40, 37, 41, 40, 37, 542, 37, 606, 37, + 41, 40, 37, 126, 73, 37, 1886, 197, 73, 37, + 73, 69, 126, 105, 37, 286, 2181, 39, 869, 582, + 152, 390, 472, 166, 248, 38, 56, 38, 568, 3596, + 158, 38, 56, 94, 38, 101, 53, 88, 41, 53, + 105, 41, 73, 37, 553, 297, 1125, 94, 37, 105, + 101, 798, 133, 94, 57, 126, 94, 37, 1641, 1541, + 1118, 58, 172, 75, 1790, 478, 37, 2846, 1225, 38, + 213, 1253, 53, 49, 55, 1452, 49, 44, 53, 76, + 53, 76, 53, 44, 871, 103, 85, 162, 121, 85, + 55, 85, 90, 364, 53, 85, 1031, 38, 327, 684, + 333, 149, 71, 44, 3175, 53, 39, 236, 34, 58, + 204, 70, 76, 58, 140, 71, 333, 103, 90, 39, + 469, 34, 39, 44, 967, 876, 2855, 364, 39, 333, + 1063, 300, 70, 58, 117, 38, 711, 140, 38, 300, + 38, 108, 38, 172, 501, 807, 108, 53, 39, 359, + 876, 108, 42, 1735, 44, 42, 44, 39, 106, 268, + 138, 44, 74, 39, 236, 327, 76, 85, 333, 53, + 38, 199, 231, 44, 74, 263, 71, 711, 231, 39, + 135, 44, 39, 106, 140, 74, 74, 44, 39, 42, + 71, 103, 76, 333, 71, 87, 207, 58, 55, 76, + 42, 199, 71, 711, 231, 71, 71, 71, 44, 106, + 76, 76, 108, 44, 135, 39, 333, 76, 103, 44, + 76, 42, 295, 103, 711, 231, 71, 167, 44, 39, + 106, 172, 76, 42, 74, 44, 39, 71, 76, 333, + 53, 55, 44, 74, 263, 71, 711, 231, 71, 167, + 44, 39, 42, 44, 42, 140, 74, 74, 44, 44, + 42, 71, 103, 76, 333, 58, 39, 207, 44, 39, + 199, 103, 135, 71, 39, 71, 71, 103, 391, 74, + 44, 74, 106, 106, 44, 39, 42, 333, 111, 218, + 55, 58, 106, 263, 103, 743, 327, 167, 39, 108, + 138, 108, 140, 76, 71, 71, 76, 333, 239, 58, + 74, 263, 103, 743, 327, 167, 44, 39, 42, 44, + 170, 44, 74, 74, 76, 74, 39, 71, 76, 333, + 71, 74, 263, 103, 1319, 39, 106, 140, 106, 106, + 44, 39, 42, 71, 76, 333, 207, 58, 199, 74, + 583, 775, 295, 39, 231, 44, 106, 108, 44, 266, + 74, 53, 1543, 44, 71, 236, 55, 199, 38, 268, + 53, 333, 85, 71, 39, 71, 39, 39, 135, 231, + 103, 39, 39, 71, 135, 44, 71, 204, 76, 39, + 167, 38, 204, 333, 135, 39, 122, 501, 58, 53, + 122, 76, 218, 333, 335, 58, 44, 58, 44, 58, + 44, 54, 50, 54, 50, 74, 263, 1159, 460, 42, + 172, 53, 76, 167, 364, 1164, 282, 44, 218, 90, + 181, 154, 85, 1383, 74, 140, 42, 204, 42, 76, + 74, 76, 39, 333, 213, 199, 74, 76, 135, 108, + 39, 106, 71, 234, 103, 140, 423, 44, 74, 76, + 202, 44, 39, 42, 333, 106, 44, 90, 1225, 41, + 41, 1383, 53, 38, 10631, 135, 231, 39, 135, 1319, + 135, 1063, 135, 231, 39, 135, 487, 1831, 135, 2151, + 108, 309, 655, 519, 346, 2727, 49, 19847, 85, 551, + 61, 839, 54, 50, 2407, 117, 110, 423, 135, 108, + 583, 108, 85, 583, 76, 423, 103, 76, 1671, 76, + 42, 236, 266, 44, 74, 364, 117, 38, 117, 55, + 39, 44, 333, 335, 213, 49, 149, 108, 61, 333, + 1127, 38, 1671, 1319, 44, 39, 2247, 935, 108, 138, + 76, 106, 74, 44, 202, 108, 58, 85, 333, 967, + 167, 1415, 554, 231, 74, 333, 47, 1114, 743, 76, + 106, 85, 1703, 42, 44, 42, 236, 44, 42, 44, + 74, 268, 202, 332, 44, 333, 333, 245, 38, 213, + 140, 42, 1511, 44, 42, 172, 42, 44, 170, 44, + 74, 231, 333, 245, 346, 300, 314, 76, 42, 967, + 42, 140, 74, 76, 42, 44, 74, 71, 333, 1415, + 44, 42, 76, 106, 44, 42, 108, 74, 149, 1159, + 266, 268, 74, 76, 181, 333, 103, 333, 967, 198, + 85, 277, 108, 53, 428, 42, 236, 135, 44, 135, + 74, 44, 71, 1413, 2022, 421, 38, 1093, 1190, 1260, + 140, 4830, 261, 3166, 261, 265, 197, 201, 261, 265, + 261, 265, 197, 201, 261, 41, 41, 41, 94, 229, + 265, 453, 261, 264, 261, 264, 261, 264, 165, 69, + 137, 40, 56, 37, 120, 101, 69, 137, 40, 120, + 133, 69, 137, 120, 261, 169, 120, 101, 69, 137, + 40, 88, 381, 162, 209, 85, 52, 51, 54, 84, + 51, 54, 52, 277, 59, 60, 162, 61, 309, 52, + 51, 149, 80, 117, 57, 54, 50, 373, 57, 53, + 48, 341, 61, 162, 194, 47, 38, 207, 121, 54, + 50, 38, 335, 121, 54, 50, 422, 855, 428, 139, + 44, 107, 396, 90, 41, 154, 41, 90, 37, 105, + 69, 105, 37, 58, 41, 90, 57, 169, 218, 41, + 58, 41, 58, 41, 58, 137, 58, 37, 137, 37, + 135, 37, 90, 69, 73, 185, 94, 101, 58, 57, + 90, 37, 58, 527, 1134, 94, 142, 47, 185, 186, + 89, 154, 57, 90, 57, 90, 57, 250, 57, 1018, + 89, 90, 57, 58, 57, 1018, 8601, 282, 153, 666, + 89, 250, 54, 50, 2618, 57, 986, 825, 1306, 217, + 602, 1274, 378, 1935, 2522, 719, 5882, 57, 314, 57, + 1754, 281, 3578, 57, 4634, 3322, 54, 50, 54, 50, + 54, 50, 54, 50, 54, 50, 54, 50, 54, 50, + 975, 1434, 185, 54, 50, 1017, 54, 50, 54, 50, + 54, 50, 54, 50, 54, 50, 537, 8218, 4217, 54, + 50, 54, 50, 54, 50, 54, 50, 54, 50, 54, + 50, 54, 50, 54, 50, 54, 50, 54, 50, 54, + 50, 2041, 54, 50, 54, 50, 1049, 54, 50, 8281, + 1562, 697, 90, 217, 346, 1513, 1509, 126, 73, 69, + 254, 105, 37, 94, 37, 94, 165, 70, 105, 37, + 3166, 37, 218, 158, 108, 94, 149, 47, 85, 1221, + 37, 37, 1799, 38, 53, 44, 743, 231, 231, 231, + 231, 231, 231, 231, 231, 1036, 85, 52, 51, 52, + 51, 117, 52, 51, 53, 52, 51, 309, 49, 85, + 49, 53, 52, 51, 85, 52, 51, 54, 50, 54, + 50, 54, 50, 54, 50, 181, 38, 341, 81, 858, + 2874, 6874, 410, 61, 117, 58, 38, 39, 46, 54, + 50, 54, 50, 54, 50, 54, 50, 54, 50, 90, + 54, 50, 54, 50, 54, 50, 54, 50, 49, 54, + 82, 58, 302, 140, 74, 49, 166, 90, 110, 38, + 39, 53, 90, 2759, 76, 88, 70, 39, 49, 2887, + 53, 102, 39, 1319, 3015, 90, 143, 346, 871, 1178, + 519, 1018, 335, 986, 271, 58, 495, 1050, 335, 1274, + 495, 2042, 8218, 39, 39, 2074, 39, 39, 679, 38, + 36583, 1786, 1287, 198, 85, 8583, 38, 117, 519, 333, + 71, 1502, 39, 44, 107, 53, 332, 53, 38, 798, + 44, 2247, 334, 76, 213, 760, 294, 88, 478, 69, + 2014, 38, 261, 190, 350, 38, 88, 158, 158, 382, + 70, 37, 231, 44, 103, 44, 135, 44, 743, 74, + 76, 42, 154, 207, 90, 55, 58, 1671, 149, 74, + 1607, 522, 44, 85, 333, 588, 199, 117, 39, 333, + 903, 268, 85, 743, 364, 74, 53, 935, 108, 42, + 1511, 44, 74, 140, 74, 44, 138, 437, 38, 333, + 85, 1319, 204, 74, 76, 74, 76, 103, 44, 263, + 44, 42, 333, 149, 519, 38, 199, 122, 39, 42, + 1543, 44, 39, 108, 71, 76, 167, 76, 39, 44, + 39, 71, 38, 85, 359, 42, 76, 74, 85, 39, + 70, 42, 44, 199, 199, 199, 231, 231, 1127, 74, + 44, 74, 44, 74, 53, 42, 44, 333, 39, 39, + 743, 1575, 36, 68, 68, 36, 63, 63, 11719, 3399, + 229, 165, 39, 44, 327, 57, 423, 167, 39, 71, + 71, 3463, 536, 11623, 54, 50, 2055, 1735, 391, 55, + 58, 524, 245, 54, 50, 53, 236, 53, 81, 80, + 54, 50, 54, 50, 54, 50, 54, 50, 54, 50, + 54, 50, 54, 50, 54, 50, 85, 54, 50, 149, + 112, 117, 149, 49, 54, 50, 54, 50, 54, 50, + 117, 57, 49, 121, 53, 55, 85, 167, 4327, 34, + 117, 55, 117, 54, 50, 53, 57, 53, 49, 85, + 333, 85, 121, 85, 841, 54, 53, 50, 56, 48, + 56, 837, 54, 57, 50, 57, 54, 50, 53, 54, + 50, 85, 327, 38, 1447, 70, 999, 199, 199, 199, + 103, 87, 57, 56, 58, 87, 58, 153, 90, 98, + 90, 391, 839, 615, 71, 487, 455, 3943, 117, 1455, + 314, 1710, 143, 570, 47, 410, 1466, 44, 935, 1575, + 999, 143, 551, 46, 263, 46, 967, 53, 1159, 263, + 53, 174, 1289, 1285, 2503, 333, 199, 39, 1415, 71, + 39, 743, 53, 271, 711, 207, 53, 839, 53, 1799, + 71, 39, 108, 76, 140, 135, 103, 871, 108, 44, + 271, 309, 935, 79, 53, 1735, 245, 711, 271, 615, + 271, 2343, 1007, 42, 44, 42, 1703, 492, 245, 655, + 333, 76, 42, 1447, 106, 140, 74, 76, 85, 34, + 149, 807, 333, 108, 1159, 172, 42, 268, 333, 149, + 76, 42, 1543, 106, 300, 74, 135, 149, 333, 1383, + 44, 42, 44, 74, 204, 42, 44, 333, 28135, 3182, + 149, 34279, 18215, 2215, 39, 1482, 140, 422, 71, 7898, + 1274, 1946, 74, 108, 122, 202, 258, 268, 90, 236, + 986, 140, 1562, 2138, 108, 58, 2810, 591, 841, 837, + 841, 229, 581, 841, 837, 41, 73, 41, 73, 137, + 265, 133, 37, 229, 357, 841, 837, 73, 137, 265, + 233, 837, 73, 137, 169, 41, 233, 837, 841, 837, + 841, 837, 841, 837, 841, 837, 841, 837, 841, 901, + 809, 57, 805, 57, 197, 809, 57, 805, 57, 197, + 809, 57, 805, 57, 197, 809, 57, 805, 57, 197, + 809, 57, 805, 57, 197, 94, 1613, 135, 871, 71, + 39, 39, 327, 135, 39, 39, 39, 39, 39, 39, + 103, 71, 39, 39, 39, 39, 39, 39, 71, 39, + 135, 231, 135, 135, 39, 327, 551, 103, 167, 551, + 89, 1434, 3226, 506, 474, 506, 506, 367, 1018, 1946, + 1402, 954, 1402, 314, 90, 1082, 218, 2266, 666, 1210, + 186, 570, 2042, 58, 5850, 154, 2010, 154, 794, 2266, + 378, 2266, 3738, 39, 39, 39, 39, 39, 39, 17351, + 34, 3074, 7692, 63, 63, }; -static int sqlite3Fts5UnicodeCategory(u32 iCode) { +static int sqlite3Fts5UnicodeCategory(u32 iCode) { int iRes = -1; int iHi; int iLo; @@ -223953,7 +223953,7 @@ static int FTS5_NOINLINE fts5PutVarint64(unsigned char *p, u64 v){ v >>= 7; } return 9; - } + } n = 0; do{ buf[n++] = (u8)((v & 0x7f) | 0x80); @@ -224005,7 +224005,7 @@ static int sqlite3Fts5GetVarintLen(u32 iVal){ ****************************************************************************** ** ** This is an SQLite virtual table module implementing direct access to an -** existing FTS5 index. The module may create several different types of +** existing FTS5 index. The module may create several different types of ** tables: ** ** col: @@ -224013,21 +224013,21 @@ static int sqlite3Fts5GetVarintLen(u32 iVal){ ** ** One row for each term/column combination. The value of $doc is set to ** the number of fts5 rows that contain at least one instance of term -** $term within column $col. Field $cnt is set to the total number of -** instances of term $term in column $col (in any row of the fts5 table). +** $term within column $col. Field $cnt is set to the total number of +** instances of term $term in column $col (in any row of the fts5 table). ** ** row: ** CREATE TABLE vocab(term, doc, cnt, PRIMARY KEY(term)); ** ** One row for each term in the database. The value of $doc is set to ** the number of fts5 rows that contain at least one instance of term -** $term. Field $cnt is set to the total number of instances of term +** $term. Field $cnt is set to the total number of instances of term ** $term in the database. ** ** instance: ** CREATE TABLE vocab(term, doc, col, offset, PRIMARY KEY()); ** -** One row for each term instance in the database. +** One row for each term instance in the database. */ @@ -224088,7 +224088,7 @@ struct Fts5VocabCursor { /* -** Translate a string containing an fts5vocab table type to an +** Translate a string containing an fts5vocab table type to an ** FTS5_VOCAB_XXX constant. If successful, set *peType to the output ** value and return SQLITE_OK. Otherwise, set *pzErr to an error message ** and return SQLITE_ERROR. @@ -224166,8 +224166,8 @@ static int fts5VocabInitVtab( sqlite3_vtab **ppVTab, /* Write the resulting vtab structure here */ char **pzErr /* Write any error message here */ ){ - const char *azSchema[] = { - "CREATE TABlE vocab(" FTS5_VOCAB_COL_SCHEMA ")", + const char *azSchema[] = { + "CREATE TABlE vocab(" FTS5_VOCAB_COL_SCHEMA ")", "CREATE TABlE vocab(" FTS5_VOCAB_ROW_SCHEMA ")", "CREATE TABlE vocab(" FTS5_VOCAB_INST_SCHEMA ")" }; @@ -224186,10 +224186,10 @@ static int fts5VocabInitVtab( const char *zDb = bDb ? argv[3] : argv[1]; const char *zTab = bDb ? argv[4] : argv[3]; const char *zType = bDb ? argv[5] : argv[4]; - int nDb = (int)strlen(zDb)+1; + int nDb = (int)strlen(zDb)+1; int nTab = (int)strlen(zTab)+1; int eType = 0; - + rc = fts5VocabTableType(zType, pzErr, &eType); if( rc==SQLITE_OK ){ assert( eType>=0 && eType= ? ** -** are interpreted. Less-than and less-than-or-equal are treated +** are interpreted. Less-than and less-than-or-equal are treated ** identically, as are greater-than and greater-than-or-equal. */ static int fts5VocabBestIndexMethod( @@ -224301,8 +224301,8 @@ static int fts5VocabBestIndexMethod( ** specifically - "ORDER BY term" or "ORDER BY term ASC" - set the ** sqlite3_index_info.orderByConsumed flag to tell the core the results ** are already in sorted order. */ - if( pInfo->nOrderBy==1 - && pInfo->aOrderBy[0].iColumn==0 + if( pInfo->nOrderBy==1 + && pInfo->aOrderBy[0].iColumn==0 && pInfo->aOrderBy[0].desc==0 ){ pInfo->orderByConsumed = 1; @@ -224316,7 +224316,7 @@ static int fts5VocabBestIndexMethod( ** Implementation of xOpen method. */ static int fts5VocabOpenMethod( - sqlite3_vtab *pVTab, + sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr ){ Fts5VocabTable *pTab = (Fts5VocabTable*)pVTab; @@ -224400,7 +224400,7 @@ static int fts5VocabCloseMethod(sqlite3_vtab_cursor *pCursor){ static int fts5VocabInstanceNewTerm(Fts5VocabCursor *pCsr){ int rc = SQLITE_OK; - + if( sqlite3Fts5IterEof(pCsr->pIter) ){ pCsr->bEof = 1; }else{ @@ -224426,11 +224426,11 @@ static int fts5VocabInstanceNext(Fts5VocabCursor *pCsr){ Fts5IndexIter *pIter = pCsr->pIter; i64 *pp = &pCsr->iInstPos; int *po = &pCsr->iInstOff; - + assert( sqlite3Fts5IterEof(pIter)==0 ); assert( pCsr->bEof==0 ); while( eDetail==FTS5_DETAIL_NONE - || sqlite3Fts5PoslistNext64(pIter->pData, pIter->nData, po, pp) + || sqlite3Fts5PoslistNext64(pIter->pData, pIter->nData, po, pp) ){ pCsr->iInstPos = 0; pCsr->iInstOff = 0; @@ -224555,8 +224555,8 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ if( rc==SQLITE_OK ){ zTerm = sqlite3Fts5IterTerm(pCsr->pIter, &nTerm); - if( nTerm!=pCsr->term.n - || (nTerm>0 && memcmp(zTerm, pCsr->term.p, nTerm)) + if( nTerm!=pCsr->term.n + || (nTerm>0 && memcmp(zTerm, pCsr->term.p, nTerm)) ){ break; } @@ -224635,8 +224635,8 @@ static int fts5VocabFilterMethod( if( rc==SQLITE_OK && eType==FTS5_VOCAB_INSTANCE ){ rc = fts5VocabInstanceNewTerm(pCsr); } - if( rc==SQLITE_OK && !pCsr->bEof - && (eType!=FTS5_VOCAB_INSTANCE + if( rc==SQLITE_OK && !pCsr->bEof + && (eType!=FTS5_VOCAB_INSTANCE || pCsr->pFts5->pConfig->eDetail!=FTS5_DETAIL_NONE) ){ rc = fts5VocabNextMethod(pCursor); @@ -224645,8 +224645,8 @@ static int fts5VocabFilterMethod( return rc; } -/* -** This is the xEof method of the virtual table. SQLite calls this +/* +** This is the xEof method of the virtual table. SQLite calls this ** routine to find out if it has reached the end of a result set. */ static int fts5VocabEofMethod(sqlite3_vtab_cursor *pCursor){ @@ -224721,13 +224721,13 @@ static int fts5VocabColumnMethod( return SQLITE_OK; } -/* +/* ** This is the xRowid method. The SQLite core calls this routine to ** retrieve the rowid for the current row of the result set. The ** rowid should be written to *pRowid. */ static int fts5VocabRowidMethod( - sqlite3_vtab_cursor *pCursor, + sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid ){ Fts5VocabCursor *pCsr = (Fts5VocabCursor*)pCursor; @@ -224768,7 +224768,7 @@ static int sqlite3Fts5VocabInit(Fts5Global *pGlobal, sqlite3 *db){ } - + #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS5) */ /************** End of fts5.c ************************************************/ @@ -224944,7 +224944,7 @@ static int stmtColumn( break; } case STMT_COLUMN_MEM: { - i = SQLITE_STMTSTATUS_MEMUSED + + i = SQLITE_STMTSTATUS_MEMUSED + STMT_COLUMN_NSCAN - SQLITE_STMTSTATUS_FULLSCAN_STEP; /* Fall thru */ } @@ -224984,11 +224984,11 @@ static int stmtEof(sqlite3_vtab_cursor *cur){ /* ** This method is called to "rewind" the stmt_cursor object back ** to the first row of output. This method is always called at least -** once prior to any call to stmtColumn() or stmtRowid() or +** once prior to any call to stmtColumn() or stmtRowid() or ** stmtEof(). */ static int stmtFilter( - sqlite3_vtab_cursor *pVtabCursor, + sqlite3_vtab_cursor *pVtabCursor, int idxNum, const char *idxStr, int argc, sqlite3_value **argv ){ @@ -225014,7 +225014,7 @@ static int stmtBestIndex( } /* -** This following structure defines all the methods for the +** This following structure defines all the methods for the ** stmt virtual table. */ static sqlite3_module stmtModule = { @@ -225059,8 +225059,8 @@ SQLITE_PRIVATE int sqlite3StmtVtabInit(sqlite3 *db){ __declspec(dllexport) #endif SQLITE_API int sqlite3_stmt_init( - sqlite3 *db, - char **pzErrMsg, + sqlite3 *db, + char **pzErrMsg, const sqlite3_api_routines *pApi ){ int rc = SQLITE_OK; diff --git a/stdafx.h b/stdafx.h index ee4893d..f46a9b6 100644 --- a/stdafx.h +++ b/stdafx.h @@ -37,11 +37,11 @@ constexpr bool b_WINDOWS = false; #include #include // for basic_string, allocator, char_traits #include // for initializer_list -#include +#include #include // for shared_ptr, unique_ptr #include #include -#include +#include //#include "wx/log.h" #include "wx/config.h" diff --git a/testbed.cpp b/testbed.cpp index 2b2c982..b11fd6e 100644 --- a/testbed.cpp +++ b/testbed.cpp @@ -22,7 +22,7 @@ namespace testbed { using ristretto255::hash, ristretto255::hsh, ristretto255::scalar, ristretto255::point, ro::serialize, ro::bin2hex, ro::hex2bin, ro::bin2hex, ro::fasthash,ro::CompileSizedString ; /* experimental code called during unit test -* Anything here is a residue of forgotten experiments, +* Anything here is a residue of forgotten experiments, and can safely be thrown away This is a playground, where you can do stuff without worrying you might inadvertently break something that matters diff --git a/tobedone.txt b/tobedone.txt index 64fe8ab..8daeb5b 100644 --- a/tobedone.txt +++ b/tobedone.txt @@ -1,4 +1,4 @@ -Need to write up +Need to write up docs/lightning_layer.html docs/white_paper.html docs/white_paper_YarvinAppendix.html @@ -61,7 +61,7 @@ And the first thing we set up is chat about network addresses, in the clear, and When we initially set up communication, we fail to make any use of the public key information. Once we have a completely insecure and totally trust based system working, with secrets available, then we start using those secrets to harden it. But we make the secrets available, though not the machinery for using them, before we implement communication. -So, order of implementation: +So, order of implementation: 1. Database containing human readable names, public keys, secret keys, network addresses @@ -81,11 +81,11 @@ When we finally get around to having the equivalent of bitcoin wallet files, the But everything else the could potentially be attested to by the canonical total blockchain, will have a serialization and deserialization format, and will therefore be stored in serial files, which might well have a somewhat human intelligble ascii armor format, among their formats. -I would like to have software that makes something like a blog with comments and updates available through a bittorrent like mechanism. But that can wait. The first thing required is a nameserver like mechanism that distributes authoritative keys for names. +I would like to have software that makes something like a blog with comments and updates available through a bittorrent like mechanism. But that can wait. The first thing required is a nameserver like mechanism that distributes authoritative keys for names. We start out with database entries listing public keys of names, and network addresses for names, and serialization and deserialization for these database entries. -We then add database entries for scalars (private keys) corresponding to the public keys - with different entities owning different names. We make one hard coded name owner of the authoritative list of names, +We then add database entries for scalars (private keys) corresponding to the public keys - with different entities owning different names. We make one hard coded name owner of the authoritative list of names, And then we add networking, so that entities can get updates of the list, and updates of the network addresses (for which each name is its owning authority.) @@ -154,8 +154,7 @@ The problem of the partial hash being finalized twice can be solved by making th Nah, too clever by half use of C++17 features will throw you into template code hell - better just to introduce a flag that throws if the same data structure is finalized twice. -When we hash a char *, we assume the data is zero delimited, and include the delimiter in the material to be hashed, so that +When we hash a char *, we assume the data is zero delimited, and include the delimiter in the material to be hashed, so that hash<256> x <<="quick brown "<<"fox"; hash<256> y <<="the quick" <<"brown fox"; will produce two different hashes. - diff --git a/wallet.rc b/wallet.rc index 5ecbbe8..6b72f9f 100644 --- a/wallet.rc +++ b/wallet.rc @@ -11,4 +11,3 @@ AAArho ICON "rho.ico" // this is not always needed but doesn't hurt (except making the executable // very slightly larger): this file contains the standard icons, cursors, ... #include "wx/msw/wx.rc" - diff --git a/welcome_to_rhocoin.cpp b/welcome_to_rhocoin.cpp index 59fa069..c92d6ed 100644 --- a/welcome_to_rhocoin.cpp +++ b/welcome_to_rhocoin.cpp @@ -143,4 +143,3 @@ welcome_to_rhocoin::~welcome_to_rhocoin() { assert(singletonWelcome ==this); singletonWelcome = nullptr; } - diff --git a/winConfigure.bat b/winConfigure.bat index f79d56d..f4fb7c0 100644 --- a/winConfigure.bat +++ b/winConfigure.bat @@ -98,7 +98,7 @@ IF %ERRORLEVEL% NEQ 0 ( echo on cd ..\..\.. -devenv wallet.sln /build "Debug|x64" +devenv wallet.sln /build "Debug|x64" echo off IF %ERRORLEVEL% NEQ 0 ( PAUSE diff --git a/winConfigure.sh b/winConfigure.sh index ae1bd07..e4e84f2 100644 --- a/winConfigure.sh +++ b/winConfigure.sh @@ -1,6 +1,6 @@ #!/bin/bash set -e -set -x +set -x git config --local include.path ../.gitconfig git submodule update --init --recursive git submodule foreach --recursive 'git reset --hard' @@ -68,4 +68,3 @@ src=$wxwin/include/wx/msw/setup.h cat $src | sed 's/^#define\([[:blank:]]\+\)wxUSE_IPV6\([[:blank:]]\+\).*$/#define\1wxUSE_IPV6\21/g'| sed 's/^#define\([[:blank:]]\+\)WXWIN_COMPATIBILITY_3_0\([[:blank:]]\+\).*$/#define\1WXWIN_COMPATIBILITY_3_0\20/g'| sed 's/^#define\([[:blank:]]\+\)wxUSE_COMPILER_TLS\([[:blank:]]\+\).*$/#define\1wxUSE_COMPILER_TLS\22/g'| sed 's/^#define\([[:blank:]]\+\)wxUSE_STD_CONTAINERS\([[:blank:]]\+\).*$/#define\1wxUSE_STD_CONTAINERS\21/g'| sed 's/^#define\([[:blank:]]\+\)wxUSE_DIALUP_MANAGER\([[:blank:]]\+\).*$/#define\1wxUSE_DIALUP_MANAGER\20/g'| sed 's/^#define\([[:blank:]]\+\)WXWIN_COMPATIBILITY_3_0\([[:blank:]]\+\).*$/#define\1WXWIN_COMPATIBILITY_3_0\20/g'| sed 's/^#define\([[:blank:]]\+\)wxUSE_STD_STRING_CONV_IN_WXSTRING\([[:blank:]]\+\).*$/#define\1wxUSE_STD_STRING_CONV_IN_WXSTRING\21/g'> tempx mv tempx $src docs/mkdocs.sh -