Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ast9z-0003BG-H0 for pgsql-docs@arkaria.postgresql.org; Wed, 20 Apr 2016 14:31:19 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.84_2) (envelope-from ) id 1ast9z-00068I-2j for pgsql-docs@arkaria.postgresql.org; Wed, 20 Apr 2016 14:31:19 +0000 Received: from makus.postgresql.org ([2001:4800:1501:1::229]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1ast9P-00059d-Td for pgsql-docs@postgresql.org; Wed, 20 Apr 2016 14:30:44 +0000 Received: from mout.kundenserver.de ([212.227.17.24]) by makus.postgresql.org with esmtps (TLS1.2:DHE_RSA_AES_256_CBC_SHA256:256) (Exim 4.84_2) (envelope-from ) id 1ast9H-0006w3-J9 for pgsql-docs@postgresql.org; Wed, 20 Apr 2016 14:30:42 +0000 Received: from [192.168.178.26] ([84.165.210.121]) by mrelayeu.kundenserver.de (mreue102) with ESMTPSA (Nemesis) id 0M7Kru-1bdYFm26Jq-00x4su for ; Wed, 20 Apr 2016 16:30:33 +0200 From: =?UTF-8?Q?J=c3=bcrgen_Purtz?= Subject: Docbook 5.x To: pgsql-docs@postgresql.org Message-ID: <57179283.6080704@purtz.de> Date: Wed, 20 Apr 2016 16:30:27 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------090201030506000100060508" X-Provags-ID: V03:K0:fouFx4s0hiwsxk4wr/I8BZ31XVk0VK08JGCGRQKTV6C+TPdRqvl gneQDhDmRvR+3BfVIL5W2BPLeUmpxyafNEzvdBMU4epdiI3psEL6ImUsgifuxLPX1ENDdQ+ LPIE6jdpFwaH3dbHnF8u4bH+S+faeS5K+sfEDpDf27eyhUrZUR50DubGq/dgvwmx/ckvMjH SVI7PZzdb4eJao/TBU6Lg== X-UI-Out-Filterresults: notjunk:1;V01:K0:ASs6ouQXSTE=:edtNSTar/vnBoCgAskGhII wossr/jfSkkVp3oWLJVHWwt3Xoaxok+yrLOcCJNuPqGk1+HNv2jcSj2yJb94n7lUUXlHpDlkn FV3ggVCiIh1PWeMc1WSroe6mfNLsmSbqlWAjqTkr8WgHgaPKmS/nZCykUrnDV2ESpaASg/xuq UJ45nxTXyBeKqecISC0zyXU4GEsNxqW0VMW6N0Y9rn1ABcRcXp/qL45NFRVL5O9mq3PA3DHjY 8sHI8uU/OM+toMyxr3Ldhn2aZ+ct0TDtzfwclVa+egOxBn8Nia/1mGm2GidMmVF61/vrLao/s SPP1c6ErZxfb/u6DpyeXDds+Dq4mhFG3uMykmZaCb/UO7Rv7lDoxiSoBeFZQt3g24Bqcx0DbR sFR2hecWgTpYrNuaEpkVKojBp98RishBd4FrZbvPW+UF0S8etMgwwic7OCg/n3IjV5JIDtyXt QEzebjl9jk1nTS7jQYkFt4a9/6/UzQNiykeKJRvKtCS0wWPfNtOTtsgCV7PBSiJB+9ogI78cq DtRaXLdUbc2umcHsW/RUY1a8xepGA39yogeyUX5Swp0Tx3ZAqPkI/dExHHvdgi2dsjFfpvYFr iIZcJ+D+MEm3DDd+Tkj38HQQqtNqgXiGBR7gbw4RIpu6If8Z/5WEwiRerf0KMmq7DcsisMHHt XGsUO5b4pkcbMQftGgZDon2ac8Mtg5KSCJL+wd0zjVWwjog== X-Pg-Spam-Score: -0.6 (/) List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgsql-docs Precedence: bulk Sender: pgsql-docs-owner@postgresql.org This is a multi-part message in MIME format. --------------090201030506000100060508 Content-Type: multipart/alternative; boundary="------------090303060901050508020706" --------------090303060901050508020706 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Hi, actually we use DocBook V4.2 for the PostgreSQL manuals. I suggest an upgrade to DocBook 5.x. This sounds simple, but it will be a long process with many sub-tasks. Rationale: * Sooner or later we MUST migrate as the 4.x series is outdated: V4.2 dates back to 2002. The 4.x series is no longer actively developed since 2006. See: http://www.docbook.org/tdg5/en/html/ch01.html "In October 2006, the DocBook Technical Committee released DocBook V4.5, the last release planned in the 4.x series." * V5.0 is available since 2009. See: http://www.docbook.org/tdg5/en/html/ch01.html: "DocBook V5.0 became an official Committee Specification in June 2009 and became an official OASIS Standard in October 2009." * Actually the technical committee has the third Candidate Release for V5.1. PROs: * The formal part of the migration is supported by existing tools: http://docbook.org/docs/howto/#convert4to5 (nevertheless some scripts written by ourself will be necessary). * The normative schema for Docbook 5.x is written in RELAX NG. Additionally the technical committee converts this normative schema to a XSD schema and to DTD, which are not normative but very near to RELAX NG and will fit for most applications. Hence, we have the choice between three schema syntaxes and everybody can use his favourite one. * Our source file format will switch from SGML to XML. This implies that we have access to all XML features like XLink, XPath, XSLT, XSL-FO, SVG, MathML, namespaces, ... . CONs: * The migration from 4.x to 5.x implies major changes at 3 different levels. o DocBook structure: Previously it was defined in SGML syntax (DTD). Now it is defined in RELAX NG schema language plus Schematron rules. o DocBook files: Previously we used SGML syntax for our files. We must convert them to a valid XML syntax, eg: tag omission. o Tools and style sheets: All tools which operate at the native SGML-level (editors, conversions, ...) must be replaced by XML conforming tools. As valid XML implicitly conforms to a valid SGML syntax this step may be accomplished by reconfiguring some of the tools, eg.: .emacs. What I have done so far is: * Conversion of sgml files to valid xml syntax with a perl skript. I failed to use 'osx' or 'spam'. * Conversion of these xml files to Docbook5.x format using xsltproc and Docbooks xslt-migration skripts. * Creation of html files using xsltproc and Docbooks xslt skripts. * Creation of fo files using xsltproc and Docbooks xslt skripts. * Creation of pdf files using fop. * The conversions needs less than 10 minutes on a Intel i5 processor. This is a very first raw round-trip with one output file per sgml file and output type. Not supported: entities (__gt__ as a surrogate), <[CDATA and similar SGML constructs, PostgreSQL specific style sheets, Makefile, additional errors occur, .... . I append one file of every new format for the chapter "Advanced Features": xml (the new source), html, fo, pdf. Any ideas or suggestions? Shall we go further on this way? Has anybody more experiences in SGML-->XML conversions or Docbook 4.x --> 5.x conversions? Kind regards Jürgen Purtz --------------090303060901050508020706 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 8bit Hi,
actually we use DocBook V4.2 for the PostgreSQL manuals. I suggest an upgrade to DocBook 5.x. This sounds simple, but it will be a long process with many sub-tasks.

Rationale:
  • Sooner or later we MUST migrate as the 4.x series is outdated: V4.2 dates back to 2002. The 4.x series is no longer actively developed since 2006. See: http://www.docbook.org/tdg5/en/html/ch01.html "In October 2006, the DocBook Technical Committee released DocBook V4.5, the last release planned in the 4.x series."
  • V5.0 is available since 2009. See: http://www.docbook.org/tdg5/en/html/ch01.html: "DocBook V5.0 became an official Committee Specification in June 2009 and became an official OASIS Standard in October 2009."
  • Actually the technical committee has the third Candidate Release for V5.1.

PROs:
  • The formal part of the migration is supported by existing tools: http://docbook.org/docs/howto/#convert4to5 (nevertheless some scripts written by ourself will be necessary).
  • The normative schema for Docbook 5.x is written in RELAX NG. Additionally the technical committee converts this normative schema to a XSD schema and to DTD, which are not normative but very near to RELAX NG and will fit for most applications. Hence, we have the choice between three schema syntaxes and everybody can use his favourite one.
  • Our source file format will switch from SGML to XML. This implies that we have access to all XML features like XLink, XPath, XSLT, XSL-FO, SVG, MathML, namespaces, ... .
CONs:
  • The migration from 4.x to 5.x implies major changes at 3 different levels.
    • DocBook structure: Previously it was defined in SGML syntax (DTD). Now it is defined in RELAX NG schema language plus Schematron rules.
    • DocBook files: Previously we used SGML syntax for our files. We must convert them to a valid XML syntax, eg: tag omission.
    • Tools and style sheets: All tools which operate at the native SGML-level (editors, conversions, ...) must be replaced by XML conforming tools. As valid XML implicitly conforms to a valid SGML syntax this step may be accomplished by reconfiguring some of the tools, eg.: .emacs.
What I have done so far is:
  • Conversion of sgml files to valid xml syntax with a perl skript. I failed to use 'osx' or 'spam'.
  • Conversion of these xml files to Docbook5.x format using xsltproc and Docbooks xslt-migration skripts.
  • Creation of html files using xsltproc and Docbooks xslt skripts.
  • Creation of fo files using xsltproc and Docbooks xslt skripts.
  • Creation of pdf files using fop.
  • The conversions needs less than 10 minutes on a Intel i5 processor.
This is a very first raw round-trip with one output file per sgml file and output type. Not supported: entities (__gt__ as a surrogate), <[CDATA and similar SGML constructs, PostgreSQL specific style sheets, Makefile, additional errors occur, .... .  I append one file of every new format for the chapter "Advanced Features": xml (the new source), html, fo, pdf.

Any ideas or suggestions? Shall we go further on this way? Has anybody more experiences in SGML-->XML conversions or Docbook 4.x --> 5.x conversions?

Kind regards
Jürgen Purtz

--------------090303060901050508020706-- --------------090201030506000100060508 Content-Type: text/xml; name="advanced.xml" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="advanced.xml" Advanced Features
Introduction In the previous chapter we have covered the basics of using SQL to store and access your data in PostgreSQL. We will now discuss some more advanced features of SQL that simplify management and prevent loss or corruption of your data. Finally, we will look at some PostgreSQL extensions. This chapter will on occasion refer to examples found in to change or improve them, so it will be useful to have read that chapter. Some examples from this chapter can also be found in advanced.sql in the tutorial directory. This file also contains some sample data to load, which is not repeated here. (Refer to for how to use the file.)
Views view Refer back to the queries in . Suppose the combined listing of weather records and city location is of particular interest to your application, but you do not want to type the query each time you need it. You can create a view over the query, which gives a name to the query that you can refer to like an ordinary table: CREATE VIEW myview AS SELECT city, temp_lo, temp_hi, prcp, date, location FROM weather, cities WHERE city = name; SELECT * FROM myview; Making liberal use of views is a key aspect of good SQL database design. Views allow you to encapsulate the details of the structure of your tables, which might change as your application evolves, behind consistent interfaces. Views can be used in almost any place a real table can be used. Building views upon other views is not uncommon.
Foreign Keys foreign key referential integrity Recall the weather and cities tables from . Consider the following problem: You want to make sure that no one can insert rows in the weather table that do not have a matching entry in the cities table. This is called maintaining the referential integrity of your data. In simplistic database systems this would be implemented (if at all) by first looking at the cities table to check if a matching record exists, and then inserting or rejecting the new weather records. This approach has a number of problems and is very inconvenient, so PostgreSQL can do this for you. The new declaration of the tables would look like this: CREATE TABLE cities ( city varchar(80) primary key, location point ); CREATE TABLE weather ( city varchar(80) references cities(city), temp_lo int, temp_hi int, prcp real, date date ); Now try inserting an invalid record: INSERT INTO weather VALUES ('Berkeley', 45, 53, 0.0, '1994-11-28'); ERROR: insert or update on table "weather" violates foreign key constraint "weather_city_fkey" DETAIL: Key (city)=(Berkeley) is not present in table "cities". The behavior of foreign keys can be finely tuned to your application. We will not go beyond this simple example in this tutorial, but just refer you to for more information. Making correct use of foreign keys will definitely improve the quality of your database applications, so you are strongly encouraged to learn about them.
Transactions transaction Transactions are a fundamental concept of all database systems. The essential point of a transaction is that it bundles multiple steps into a single, all-or-nothing operation. The intermediate states between the steps are not visible to other concurrent transactions, and if some failure occurs that prevents the transaction from completing, then none of the steps affect the database at all. For example, consider a bank database that contains balances for various customer accounts, as well as total deposit balances for branches. Suppose that we want to record a payment of $100.00 from Alice's account to Bob's account. Simplifying outrageously, the SQL commands for this might look like: UPDATE accounts SET balance = balance - 100.00 WHERE name = 'Alice'; UPDATE branches SET balance = balance - 100.00 WHERE name = (SELECT branch_name FROM accounts WHERE name = 'Alice'); UPDATE accounts SET balance = balance + 100.00 WHERE name = 'Bob'; UPDATE branches SET balance = balance + 100.00 WHERE name = (SELECT branch_name FROM accounts WHERE name = 'Bob'); The details of these commands are not important here; the important point is that there are several separate updates involved to accomplish this rather simple operation. Our bank's officers will want to be assured that either all these updates happen, or none of them happen. It would certainly not do for a system failure to result in Bob receiving $100.00 that was not debited from Alice. Nor would Alice long remain a happy customer if she was debited without Bob being credited. We need a guarantee that if something goes wrong partway through the operation, none of the steps executed so far will take effect. Grouping the updates into a transaction gives us this guarantee. A transaction is said to be atomic: from the point of view of other transactions, it either happens completely or not at all. We also want a guarantee that once a transaction is completed and acknowledged by the database system, it has indeed been permanently recorded and won't be lost even if a crash ensues shortly thereafter. For example, if we are recording a cash withdrawal by Bob, we do not want any chance that the debit to his account will disappear in a crash just after he walks out the bank door. A transactional database guarantees that all the updates made by a transaction are logged in permanent storage (i.e., on disk) before the transaction is reported complete. Another important property of transactional databases is closely related to the notion of atomic updates: when multiple transactions are running concurrently, each one should not be able to see the incomplete changes made by others. For example, if one transaction is busy totalling all the branch balances, it would not do for it to include the debit from Alice's branch but not the credit to Bob's branch, nor vice versa. So transactions must be all-or-nothing not only in terms of their permanent effect on the database, but also in terms of their visibility as they happen. The updates made so far by an open transaction are invisible to other transactions until the transaction completes, whereupon all the updates become visible simultaneously. In PostgreSQL, a transaction is set up by surrounding the SQL commands of the transaction with BEGIN and COMMIT commands. So our banking transaction would actually look like: BEGIN; UPDATE accounts SET balance = balance - 100.00 WHERE name = 'Alice'; -- etc etc COMMIT; If, partway through the transaction, we decide we do not want to commit (perhaps we just noticed that Alice's balance went negative), we can issue the command ROLLBACK instead of COMMIT, and all our updates so far will be canceled. PostgreSQL actually treats every SQL statement as being executed within a transaction. If you do not issue a BEGIN command, then each individual statement has an implicit BEGIN and (if successful) COMMIT wrapped around it. A group of statements surrounded by BEGIN and COMMIT is sometimes called a transaction block. Some client libraries issue BEGIN and COMMIT commands automatically, so that you might get the effect of transaction blocks without asking. Check the documentation for the interface you are using. It's possible to control the statements in a transaction in a more granular fashion through the use of savepoints. Savepoints allow you to selectively discard parts of the transaction, while committing the rest. After defining a savepoint with SAVEPOINT, you can if needed roll back to the savepoint with ROLLBACK TO. All the transaction's database changes between defining the savepoint and rolling back to it are discarded, but changes earlier than the savepoint are kept. After rolling back to a savepoint, it continues to be defined, so you can roll back to it several times. Conversely, if you are sure you won't need to roll back to a particular savepoint again, it can be released, so the system can free some resources. Keep in mind that either releasing or rolling back to a savepoint will automatically release all savepoints that were defined after it. All this is happening within the transaction block, so none of it is visible to other database sessions. When and if you commit the transaction block, the committed actions become visible as a unit to other sessions, while the rolled-back actions never become visible at all. Remembering the bank database, suppose we debit $100.00 from Alice's account, and credit Bob's account, only to find later that we should have credited Wally's account. We could do it using savepoints like this: BEGIN; UPDATE accounts SET balance = balance - 100.00 WHERE name = 'Alice'; SAVEPOINT my_savepoint; UPDATE accounts SET balance = balance + 100.00 WHERE name = 'Bob'; -- oops ... forget that and use Wally's account ROLLBACK TO my_savepoint; UPDATE accounts SET balance = balance + 100.00 WHERE name = 'Wally'; COMMIT; This example is, of course, oversimplified, but there's a lot of control possible in a transaction block through the use of savepoints. Moreover, ROLLBACK TO is the only way to regain control of a transaction block that was put in aborted state by the system due to an error, short of rolling it back completely and starting again.
Window Functions window function A window function performs a calculation across a set of table rows that are somehow related to the current row. This is comparable to the type of calculation that can be done with an aggregate function. But unlike regular aggregate functions, use of a window function does not cause rows to become grouped into a single output row __mdash__ the rows retain their separate identities. Behind the scenes, the window function is able to access more than just the current row of the query result. Here is an example that shows how to compare each employee's salary with the average salary in his or her department: SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary; depname | empno | salary | avg -----------+-------+--------+----------------------- develop | 11 | 5200 | 5020.0000000000000000 develop | 7 | 4200 | 5020.0000000000000000 develop | 9 | 4500 | 5020.0000000000000000 develop | 8 | 6000 | 5020.0000000000000000 develop | 10 | 5200 | 5020.0000000000000000 personnel | 5 | 3500 | 3700.0000000000000000 personnel | 2 | 3900 | 3700.0000000000000000 sales | 3 | 4800 | 4866.6666666666666667 sales | 1 | 5000 | 4866.6666666666666667 sales | 4 | 4800 | 4866.6666666666666667 (10 rows) The first three output columns come directly from the table empsalary, and there is one output row for each row in the table. The fourth column represents an average taken across all the table rows that have the same depname value as the current row. (This actually is the same function as the regular avg aggregate function, but the OVER clause causes it to be treated as a window function and computed across an appropriate set of rows.) A window function call always contains an OVER clause directly following the window function's name and argument(s). This is what syntactically distinguishes it from a regular function or aggregate function. The OVER clause determines exactly how the rows of the query are split up for processing by the window function. The PARTITION BY list within OVER specifies dividing the rows into groups, or partitions, that share the same values of the PARTITION BY expression(s). For each row, the window function is computed across the rows that fall into the same partition as the current row. You can also control the order in which rows are processed by window functions using ORDER BY within OVER. (The window ORDER BY does not even have to match the order in which the rows are output.) Here is an example: SELECT depname, empno, salary, rank() OVER (PARTITION BY depname ORDER BY salary DESC) FROM empsalary; depname | empno | salary | rank -----------+-------+--------+------ develop | 8 | 6000 | 1 develop | 10 | 5200 | 2 develop | 11 | 5200 | 2 develop | 9 | 4500 | 4 develop | 7 | 4200 | 5 personnel | 2 | 3900 | 1 personnel | 5 | 3500 | 2 sales | 1 | 5000 | 1 sales | 4 | 4800 | 2 sales | 3 | 4800 | 2 (10 rows) As shown here, the rank function produces a numerical rank within the current row's partition for each distinct ORDER BY value, in the order defined by the ORDER BY clause. rank needs no explicit parameter, because its behavior is entirely determined by the OVER clause. The rows considered by a window function are those of the virtual table produced by the query's FROM clause as filtered by its WHERE, GROUP BY, and HAVING clauses if any. For example, a row removed because it does not meet the WHERE condition is not seen by any window function. A query can contain multiple window functions that slice up the data in different ways by means of different OVER clauses, but they all act on the same collection of rows defined by this virtual table. We already saw that ORDER BY can be omitted if the ordering of rows is not important. It is also possible to omit PARTITION BY, in which case there is just one partition containing all the rows. There is another important concept associated with window functions: for each row, there is a set of rows within its partition called its window frame. Many (but not all) window functions act only on the rows of the window frame, rather than of the whole partition. By default, if ORDER BY is supplied then the frame consists of all rows from the start of the partition up through the current row, plus any following rows that are equal to the current row according to the ORDER BY clause. When ORDER BY is omitted the default frame consists of all rows in the partition. There are options to define the window frame in other ways, but this tutorial does not cover them. See for details. Here is an example using sum: SELECT salary, sum(salary) OVER () FROM empsalary; salary | sum --------+------- 5200 | 47100 5000 | 47100 3500 | 47100 4800 | 47100 3900 | 47100 4200 | 47100 4500 | 47100 4800 | 47100 6000 | 47100 5200 | 47100 (10 rows) Above, since there is no ORDER BY in the OVER clause, the window frame is the same as the partition, which for lack of PARTITION BY is the whole table; in other words each sum is taken over the whole table and so we get the same result for each output row. But if we add an ORDER BY clause, we get very different results: SELECT salary, sum(salary) OVER (ORDER BY salary) FROM empsalary; salary | sum --------+------- 3500 | 3500 3900 | 7400 4200 | 11600 4500 | 16100 4800 | 25700 4800 | 25700 5000 | 30700 5200 | 41100 5200 | 41100 6000 | 47100 (10 rows) Here the sum is taken from the first (lowest) salary up through the current one, including any duplicates of the current one (notice the results for the duplicated salaries). Window functions are permitted only in the SELECT list and the ORDER BY clause of the query. They are forbidden elsewhere, such as in GROUP BY, HAVING and WHERE clauses. This is because they logically execute after the processing of those clauses. Also, window functions execute after regular aggregate functions. This means it is valid to include an aggregate function call in the arguments of a window function, but not vice versa. If there is a need to filter or group rows after the window calculations are performed, you can use a sub-select. For example: SELECT depname, empno, salary, enroll_date FROM (SELECT depname, empno, salary, enroll_date, rank() OVER (PARTITION BY depname ORDER BY salary DESC, empno) AS pos FROM empsalary ) AS ss WHERE pos __lt__ 3; The above query only shows the rows from the inner query having rank less than 3. When a query involves multiple window functions, it is possible to write out each one with a separate OVER clause, but this is duplicative and error-prone if the same windowing behavior is wanted for several functions. Instead, each windowing behavior can be named in a WINDOW clause and then referenced in OVER. For example: SELECT sum(salary) OVER w, avg(salary) OVER w FROM empsalary WINDOW w AS (PARTITION BY depname ORDER BY salary DESC); More details about window functions can be found in , , , and the reference page.
Inheritance inheritance Inheritance is a concept from object-oriented databases. It opens up interesting new possibilities of database design. Let's create two tables: A table cities and a table capitals. Naturally, capitals are also cities, so you want some way to show the capitals implicitly when you list all cities. If you're really clever you might invent some scheme like this: CREATE TABLE capitals ( name text, population real, altitude int, -- (in ft) state char(2) ); CREATE TABLE non_capitals ( name text, population real, altitude int -- (in ft) ); CREATE VIEW cities AS SELECT name, population, altitude FROM capitals UNION SELECT name, population, altitude FROM non_capitals; This works OK as far as querying goes, but it gets ugly when you need to update several rows, for one thing. A better solution is this: CREATE TABLE cities ( name text, population real, altitude int -- (in ft) ); CREATE TABLE capitals ( state char(2) ) INHERITS (cities); In this case, a row of capitals inherits all columns (name, population, and altitude) from its parent, cities. The type of the column name is text, a native PostgreSQL type for variable length character strings. State capitals have an extra column, state, that shows their state. In PostgreSQL, a table can inherit from zero or more other tables. For example, the following query finds the names of all cities, including state capitals, that are located at an altitude over 500 feet: SELECT name, altitude FROM cities WHERE altitude __gt__ 500; which returns: name | altitude -----------+---------- Las Vegas | 2174 Mariposa | 1953 Madison | 845 (3 rows) On the other hand, the following query finds all the cities that are not state capitals and are situated at an altitude over 500 feet: SELECT name, altitude FROM ONLY cities WHERE altitude __gt__ 500; name | altitude -----------+---------- Las Vegas | 2174 Mariposa | 1953 (2 rows) Here the ONLY before cities indicates that the query should be run over only the cities table, and not tables below cities in the inheritance hierarchy. Many of the commands that we have already discussed __mdash__ SELECT, UPDATE, and DELETE __mdash__ support this ONLY notation. Although inheritance is frequently useful, it has not been integrated with unique constraints or foreign keys, which limits its usefulness. See for more detail.
Conclusion PostgreSQL has many features not touched upon in this tutorial introduction, which has been oriented toward newer users of SQL. These features are discussed in more detail in the remainder of this book. If you feel you need more introductory material, please visit the PostgreSQL web site for links to more resources.
--------------090201030506000100060508 Content-Type: text/html; name="advanced.html" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="advanced.html" PGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBj b250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+PHRpdGxl PkNoYXB0ZXKgMS6gQWR2YW5jZWQgRmVhdHVyZXM8L3RpdGxlPjxtZXRhIG5h bWU9ImdlbmVyYXRvciIgY29udGVudD0iRG9jQm9vayBYU0wgU3R5bGVzaGVl dHMgVjEuNzkuMSI+PC9oZWFkPjxib2R5IGJnY29sb3I9IndoaXRlIiB0ZXh0 PSJibGFjayIgbGluaz0iIzAwMDBGRiIgdmxpbms9IiM4NDAwODQiIGFsaW5r PSIjMDAwMEZGIj48ZGl2IGNsYXNzPSJjaGFwdGVyIj48ZGl2IGNsYXNzPSJ0 aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDIgY2xhc3M9InRpdGxlIj48YSBuYW1l PSJ0dXRvcmlhbC1hZHZhbmNlZCI+PC9hPkNoYXB0ZXKgMS6gQWR2YW5jZWQg RmVhdHVyZXM8L2gyPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InRv YyI+PHA+PGI+VGFibGUgb2YgQ29udGVudHM8L2I+PC9wPjxkbCBjbGFzcz0i dG9jIj48ZHQ+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IiN0dXRv cmlhbC1hZHZhbmNlZC1pbnRybyI+SW50cm9kdWN0aW9uPC9hPjwvc3Bhbj48 L2R0PjxkdD48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iI3R1dG9y aWFsLXZpZXdzIj5WaWV3czwvYT48L3NwYW4+PC9kdD48ZHQ+PHNwYW4gY2xh c3M9InNlY3Rpb24iPjxhIGhyZWY9IiN0dXRvcmlhbC1mayI+Rm9yZWlnbiBL ZXlzPC9hPjwvc3Bhbj48L2R0PjxkdD48c3BhbiBjbGFzcz0ic2VjdGlvbiI+ PGEgaHJlZj0iI3R1dG9yaWFsLXRyYW5zYWN0aW9ucyI+VHJhbnNhY3Rpb25z PC9hPjwvc3Bhbj48L2R0PjxkdD48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEg aHJlZj0iI3R1dG9yaWFsLXdpbmRvdyI+V2luZG93IEZ1bmN0aW9uczwvYT48 L3NwYW4+PC9kdD48ZHQ+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9 IiN0dXRvcmlhbC1pbmhlcml0YW5jZSI+SW5oZXJpdGFuY2U8L2E+PC9zcGFu PjwvZHQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSIjdHV0 b3JpYWwtY29uY2x1c2lvbiI+Q29uY2x1c2lvbjwvYT48L3NwYW4+PC9kdD48 L2RsPjwvZGl2PjxkaXYgY2xhc3M9InNlY3Rpb24iPjxkaXYgY2xhc3M9InRp dGxlcGFnZSI+PGRpdj48ZGl2PjxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJj bGVhcjogYm90aCI+PGEgbmFtZT0idHV0b3JpYWwtYWR2YW5jZWQtaW50cm8i PjwvYT5JbnRyb2R1Y3Rpb248L2gyPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgog ICAgSW4gdGhlIHByZXZpb3VzIGNoYXB0ZXIgd2UgaGF2ZSBjb3ZlcmVkIHRo ZSBiYXNpY3Mgb2YgdXNpbmcKICAgIDxhY3JvbnltIGNsYXNzPSJhY3Jvbnlt Ij5TUUw8L2Fjcm9ueW0+IHRvIHN0b3JlIGFuZCBhY2Nlc3MgeW91ciBkYXRh IGluCiAgICA8c3BhbiBjbGFzcz0icHJvZHVjdG5hbWUiPlBvc3RncmVTUUw8 L3NwYW4+LiAgV2Ugd2lsbCBub3cgZGlzY3VzcyBzb21lCiAgICBtb3JlIGFk dmFuY2VkIGZlYXR1cmVzIG9mIDxhY3JvbnltIGNsYXNzPSJhY3JvbnltIj5T UUw8L2Fjcm9ueW0+IHRoYXQgc2ltcGxpZnkKICAgIG1hbmFnZW1lbnQgYW5k IHByZXZlbnQgbG9zcyBvciBjb3JydXB0aW9uIG9mIHlvdXIgZGF0YS4gIEZp bmFsbHksCiAgICB3ZSB3aWxsIGxvb2sgYXQgc29tZSA8c3BhbiBjbGFzcz0i cHJvZHVjdG5hbWUiPlBvc3RncmVTUUw8L3NwYW4+CiAgICBleHRlbnNpb25z LgogICA8L3A+PHA+CiAgICBUaGlzIGNoYXB0ZXIgd2lsbCBvbiBvY2Nhc2lv biByZWZlciB0byBleGFtcGxlcyBmb3VuZCBpbiA8YSBjbGFzcz0ieHJlZiIg aHJlZj0iIyI+Pz8/PC9hPiB0byBjaGFuZ2Ugb3IgaW1wcm92ZSB0aGVtLCBz byBpdCB3aWxsIGJlCiAgICB1c2VmdWwgdG8gaGF2ZSByZWFkIHRoYXQgY2hh cHRlci4gIFNvbWUgZXhhbXBsZXMgZnJvbQogICAgdGhpcyBjaGFwdGVyIGNh biBhbHNvIGJlIGZvdW5kIGluCiAgICA8Y29kZSBjbGFzcz0iZmlsZW5hbWUi PmFkdmFuY2VkLnNxbDwvY29kZT4gaW4gdGhlIHR1dG9yaWFsIGRpcmVjdG9y eS4gIFRoaXMKICAgIGZpbGUgYWxzbyBjb250YWlucyBzb21lIHNhbXBsZSBk YXRhIHRvIGxvYWQsIHdoaWNoIGlzIG5vdAogICAgcmVwZWF0ZWQgaGVyZS4g IChSZWZlciB0byA8YSBjbGFzcz0ieHJlZiIgaHJlZj0iIyI+Pz8/PC9hPiBm b3IKICAgIGhvdyB0byB1c2UgdGhlIGZpbGUuKQogICA8L3A+PC9kaXY+PGRp diBjbGFzcz0ic2VjdGlvbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2 PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj48 YSBuYW1lPSJ0dXRvcmlhbC12aWV3cyI+PC9hPlZpZXdzPC9oMj48L2Rpdj48 L2Rpdj48L2Rpdj48YSBjbGFzcz0iaW5kZXh0ZXJtIiBuYW1lPSJpZG00NjA0 NTE0NDM3OTA1NiI+PC9hPjxwPgogICAgUmVmZXIgYmFjayB0byB0aGUgcXVl cmllcyBpbiA8YSBjbGFzcz0ieHJlZiIgaHJlZj0iIyI+Pz8/PC9hPi4KICAg IFN1cHBvc2UgdGhlIGNvbWJpbmVkIGxpc3Rpbmcgb2Ygd2VhdGhlciByZWNv cmRzIGFuZCBjaXR5IGxvY2F0aW9uCiAgICBpcyBvZiBwYXJ0aWN1bGFyIGlu dGVyZXN0IHRvIHlvdXIgYXBwbGljYXRpb24sIGJ1dCB5b3UgZG8gbm90IHdh bnQKICAgIHRvIHR5cGUgdGhlIHF1ZXJ5IGVhY2ggdGltZSB5b3UgbmVlZCBp dC4gIFlvdSBjYW4gY3JlYXRlIGEKICAgIDxlbSBjbGFzcz0iZmlyc3R0ZXJt Ij52aWV3PC9lbT4gb3ZlciB0aGUgcXVlcnksIHdoaWNoIGdpdmVzIGEgbmFt ZSB0bwogICAgdGhlIHF1ZXJ5IHRoYXQgeW91IGNhbiByZWZlciB0byBsaWtl IGFuIG9yZGluYXJ5IHRhYmxlOgoKPC9wPjxwcmUgY2xhc3M9InByb2dyYW1s aXN0aW5nIj4KQ1JFQVRFIFZJRVcgbXl2aWV3IEFTCiAgICBTRUxFQ1QgY2l0 eSwgdGVtcF9sbywgdGVtcF9oaSwgcHJjcCwgZGF0ZSwgbG9jYXRpb24KICAg ICAgICBGUk9NIHdlYXRoZXIsIGNpdGllcwogICAgICAgIFdIRVJFIGNpdHkg PSBuYW1lOwoKU0VMRUNUICogRlJPTSBteXZpZXc7CjwvcHJlPjxwPgogICA8 L3A+PHA+CiAgICBNYWtpbmcgbGliZXJhbCB1c2Ugb2Ygdmlld3MgaXMgYSBr ZXkgYXNwZWN0IG9mIGdvb2QgU1FMIGRhdGFiYXNlCiAgICBkZXNpZ24uICBW aWV3cyBhbGxvdyB5b3UgdG8gZW5jYXBzdWxhdGUgdGhlIGRldGFpbHMgb2Yg dGhlCiAgICBzdHJ1Y3R1cmUgb2YgeW91ciB0YWJsZXMsIHdoaWNoIG1pZ2h0 IGNoYW5nZSBhcyB5b3VyIGFwcGxpY2F0aW9uCiAgICBldm9sdmVzLCBiZWhp bmQgY29uc2lzdGVudCBpbnRlcmZhY2VzLgogICA8L3A+PHA+CiAgICBWaWV3 cyBjYW4gYmUgdXNlZCBpbiBhbG1vc3QgYW55IHBsYWNlIGEgcmVhbCB0YWJs ZSBjYW4gYmUgdXNlZC4KICAgIEJ1aWxkaW5nIHZpZXdzIHVwb24gb3RoZXIg dmlld3MgaXMgbm90IHVuY29tbW9uLgogICA8L3A+PC9kaXY+PGRpdiBjbGFz cz0ic2VjdGlvbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+ PGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj48YSBuYW1l PSJ0dXRvcmlhbC1mayI+PC9hPkZvcmVpZ24gS2V5czwvaDI+PC9kaXY+PC9k aXY+PC9kaXY+PGEgY2xhc3M9ImluZGV4dGVybSIgbmFtZT0iaWRtNDYwNDUx NDQwMTIxMTIiPjwvYT48YSBjbGFzcz0iaW5kZXh0ZXJtIiBuYW1lPSJpZG00 NjA0NTE0NDAxMDgwMCI+PC9hPjxwPgogICAgUmVjYWxsIHRoZSA8Y29kZSBj bGFzcz0iY2xhc3NuYW1lIj53ZWF0aGVyPC9jb2RlPiBhbmQKICAgIDxjb2Rl IGNsYXNzPSJjbGFzc25hbWUiPmNpdGllczwvY29kZT4gdGFibGVzIGZyb20g PGEgY2xhc3M9InhyZWYiIGhyZWY9IiMiPj8/PzwvYT4uICBDb25zaWRlciB0 aGUgZm9sbG93aW5nIHByb2JsZW06ICBZb3UKICAgIHdhbnQgdG8gbWFrZSBz dXJlIHRoYXQgbm8gb25lIGNhbiBpbnNlcnQgcm93cyBpbiB0aGUKICAgIDxj b2RlIGNsYXNzPSJjbGFzc25hbWUiPndlYXRoZXI8L2NvZGU+IHRhYmxlIHRo YXQgZG8gbm90IGhhdmUgYSBtYXRjaGluZwogICAgZW50cnkgaW4gdGhlIDxj b2RlIGNsYXNzPSJjbGFzc25hbWUiPmNpdGllczwvY29kZT4gdGFibGUuICBU aGlzIGlzIGNhbGxlZAogICAgbWFpbnRhaW5pbmcgdGhlIDxlbSBjbGFzcz0i Zmlyc3R0ZXJtIj5yZWZlcmVudGlhbCBpbnRlZ3JpdHk8L2VtPiBvZgogICAg eW91ciBkYXRhLiAgSW4gc2ltcGxpc3RpYyBkYXRhYmFzZSBzeXN0ZW1zIHRo aXMgd291bGQgYmUKICAgIGltcGxlbWVudGVkIChpZiBhdCBhbGwpIGJ5IGZp cnN0IGxvb2tpbmcgYXQgdGhlCiAgICA8Y29kZSBjbGFzcz0iY2xhc3NuYW1l Ij5jaXRpZXM8L2NvZGU+IHRhYmxlIHRvIGNoZWNrIGlmIGEgbWF0Y2hpbmcg cmVjb3JkCiAgICBleGlzdHMsIGFuZCB0aGVuIGluc2VydGluZyBvciByZWpl Y3RpbmcgdGhlIG5ldwogICAgPGNvZGUgY2xhc3M9ImNsYXNzbmFtZSI+d2Vh dGhlcjwvY29kZT4gcmVjb3Jkcy4gIFRoaXMgYXBwcm9hY2ggaGFzIGEKICAg IG51bWJlciBvZiBwcm9ibGVtcyBhbmQgaXMgdmVyeSBpbmNvbnZlbmllbnQs IHNvCiAgICA8c3BhbiBjbGFzcz0icHJvZHVjdG5hbWUiPlBvc3RncmVTUUw8 L3NwYW4+IGNhbiBkbyB0aGlzIGZvciB5b3UuCiAgIDwvcD48cD4KICAgIFRo ZSBuZXcgZGVjbGFyYXRpb24gb2YgdGhlIHRhYmxlcyB3b3VsZCBsb29rIGxp a2UgdGhpczoKCjwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CkNS RUFURSBUQUJMRSBjaXRpZXMgKAogICAgICAgIGNpdHkgICAgIHZhcmNoYXIo ODApIHByaW1hcnkga2V5LAogICAgICAgIGxvY2F0aW9uIHBvaW50Cik7CgpD UkVBVEUgVEFCTEUgd2VhdGhlciAoCiAgICAgICAgY2l0eSAgICAgIHZhcmNo YXIoODApIHJlZmVyZW5jZXMgY2l0aWVzKGNpdHkpLAogICAgICAgIHRlbXBf bG8gICBpbnQsCiAgICAgICAgdGVtcF9oaSAgIGludCwKICAgICAgICBwcmNw ICAgICAgcmVhbCwKICAgICAgICBkYXRlICAgICAgZGF0ZQopOwo8L3ByZT48 cD4KCiAgICBOb3cgdHJ5IGluc2VydGluZyBhbiBpbnZhbGlkIHJlY29yZDoK CjwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CklOU0VSVCBJTlRP IHdlYXRoZXIgVkFMVUVTICgnQmVya2VsZXknLCA0NSwgNTMsIDAuMCwgJzE5 OTQtMTEtMjgnKTsKPC9wcmU+PHA+Cgo8L3A+PHByZSBjbGFzcz0ic2NyZWVu Ij4KRVJST1I6ICBpbnNlcnQgb3IgdXBkYXRlIG9uIHRhYmxlICJ3ZWF0aGVy IiB2aW9sYXRlcyBmb3JlaWduIGtleSBjb25zdHJhaW50ICJ3ZWF0aGVyX2Np dHlfZmtleSIKREVUQUlMOiAgS2V5IChjaXR5KT0oQmVya2VsZXkpIGlzIG5v dCBwcmVzZW50IGluIHRhYmxlICJjaXRpZXMiLgo8L3ByZT48cD4KICAgPC9w PjxwPgogICAgVGhlIGJlaGF2aW9yIG9mIGZvcmVpZ24ga2V5cyBjYW4gYmUg ZmluZWx5IHR1bmVkIHRvIHlvdXIKICAgIGFwcGxpY2F0aW9uLiAgV2Ugd2ls bCBub3QgZ28gYmV5b25kIHRoaXMgc2ltcGxlIGV4YW1wbGUgaW4gdGhpcwog ICAgdHV0b3JpYWwsIGJ1dCBqdXN0IHJlZmVyIHlvdSB0byA8YSBjbGFzcz0i eHJlZiIgaHJlZj0iIyI+Pz8/PC9hPgogICAgZm9yIG1vcmUgaW5mb3JtYXRp b24uICBNYWtpbmcgY29ycmVjdCB1c2Ugb2YKICAgIGZvcmVpZ24ga2V5cyB3 aWxsIGRlZmluaXRlbHkgaW1wcm92ZSB0aGUgcXVhbGl0eSBvZiB5b3VyIGRh dGFiYXNlCiAgICBhcHBsaWNhdGlvbnMsIHNvIHlvdSBhcmUgc3Ryb25nbHkg ZW5jb3VyYWdlZCB0byBsZWFybiBhYm91dCB0aGVtLgogICA8L3A+PC9kaXY+ PGRpdiBjbGFzcz0ic2VjdGlvbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48 ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3Ro Ij48YSBuYW1lPSJ0dXRvcmlhbC10cmFuc2FjdGlvbnMiPjwvYT5UcmFuc2Fj dGlvbnM8L2gyPjwvZGl2PjwvZGl2PjwvZGl2PjxhIGNsYXNzPSJpbmRleHRl cm0iIG5hbWU9ImlkbTQ2MDQ1MTQzOTk5MjAwIj48L2E+PHA+CiAgICA8ZW0g Y2xhc3M9ImZpcnN0dGVybSI+VHJhbnNhY3Rpb25zPC9lbT4gYXJlIGEgZnVu ZGFtZW50YWwgY29uY2VwdCBvZiBhbGwgZGF0YWJhc2UKICAgIHN5c3RlbXMu ICBUaGUgZXNzZW50aWFsIHBvaW50IG9mIGEgdHJhbnNhY3Rpb24gaXMgdGhh dCBpdCBidW5kbGVzCiAgICBtdWx0aXBsZSBzdGVwcyBpbnRvIGEgc2luZ2xl LCBhbGwtb3Itbm90aGluZyBvcGVyYXRpb24uICBUaGUgaW50ZXJtZWRpYXRl CiAgICBzdGF0ZXMgYmV0d2VlbiB0aGUgc3RlcHMgYXJlIG5vdCB2aXNpYmxl IHRvIG90aGVyIGNvbmN1cnJlbnQgdHJhbnNhY3Rpb25zLAogICAgYW5kIGlm IHNvbWUgZmFpbHVyZSBvY2N1cnMgdGhhdCBwcmV2ZW50cyB0aGUgdHJhbnNh Y3Rpb24gZnJvbSBjb21wbGV0aW5nLAogICAgdGhlbiBub25lIG9mIHRoZSBz dGVwcyBhZmZlY3QgdGhlIGRhdGFiYXNlIGF0IGFsbC4KICAgPC9wPjxwPgog ICAgRm9yIGV4YW1wbGUsIGNvbnNpZGVyIGEgYmFuayBkYXRhYmFzZSB0aGF0 IGNvbnRhaW5zIGJhbGFuY2VzIGZvciB2YXJpb3VzCiAgICBjdXN0b21lciBh Y2NvdW50cywgYXMgd2VsbCBhcyB0b3RhbCBkZXBvc2l0IGJhbGFuY2VzIGZv ciBicmFuY2hlcy4KICAgIFN1cHBvc2UgdGhhdCB3ZSB3YW50IHRvIHJlY29y ZCBhIHBheW1lbnQgb2YgJDEwMC4wMCBmcm9tIEFsaWNlJ3MgYWNjb3VudAog ICAgdG8gQm9iJ3MgYWNjb3VudC4gIFNpbXBsaWZ5aW5nIG91dHJhZ2VvdXNs eSwgdGhlIFNRTCBjb21tYW5kcyBmb3IgdGhpcwogICAgbWlnaHQgbG9vayBs aWtlOgoKPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KVVBEQVRF IGFjY291bnRzIFNFVCBiYWxhbmNlID0gYmFsYW5jZSAtIDEwMC4wMAogICAg V0hFUkUgbmFtZSA9ICdBbGljZSc7ClVQREFURSBicmFuY2hlcyBTRVQgYmFs YW5jZSA9IGJhbGFuY2UgLSAxMDAuMDAKICAgIFdIRVJFIG5hbWUgPSAoU0VM RUNUIGJyYW5jaF9uYW1lIEZST00gYWNjb3VudHMgV0hFUkUgbmFtZSA9ICdB bGljZScpOwpVUERBVEUgYWNjb3VudHMgU0VUIGJhbGFuY2UgPSBiYWxhbmNl ICsgMTAwLjAwCiAgICBXSEVSRSBuYW1lID0gJ0JvYic7ClVQREFURSBicmFu Y2hlcyBTRVQgYmFsYW5jZSA9IGJhbGFuY2UgKyAxMDAuMDAKICAgIFdIRVJF IG5hbWUgPSAoU0VMRUNUIGJyYW5jaF9uYW1lIEZST00gYWNjb3VudHMgV0hF UkUgbmFtZSA9ICdCb2InKTsKPC9wcmU+PHA+CiAgIDwvcD48cD4KICAgIFRo ZSBkZXRhaWxzIG9mIHRoZXNlIGNvbW1hbmRzIGFyZSBub3QgaW1wb3J0YW50 IGhlcmU7IHRoZSBpbXBvcnRhbnQKICAgIHBvaW50IGlzIHRoYXQgdGhlcmUg YXJlIHNldmVyYWwgc2VwYXJhdGUgdXBkYXRlcyBpbnZvbHZlZCB0byBhY2Nv bXBsaXNoCiAgICB0aGlzIHJhdGhlciBzaW1wbGUgb3BlcmF0aW9uLiAgT3Vy IGJhbmsncyBvZmZpY2VycyB3aWxsIHdhbnQgdG8gYmUKICAgIGFzc3VyZWQg dGhhdCBlaXRoZXIgYWxsIHRoZXNlIHVwZGF0ZXMgaGFwcGVuLCBvciBub25l IG9mIHRoZW0gaGFwcGVuLgogICAgSXQgd291bGQgY2VydGFpbmx5IG5vdCBk byBmb3IgYSBzeXN0ZW0gZmFpbHVyZSB0byByZXN1bHQgaW4gQm9iCiAgICBy ZWNlaXZpbmcgJDEwMC4wMCB0aGF0IHdhcyBub3QgZGViaXRlZCBmcm9tIEFs aWNlLiAgTm9yIHdvdWxkIEFsaWNlIGxvbmcKICAgIHJlbWFpbiBhIGhhcHB5 IGN1c3RvbWVyIGlmIHNoZSB3YXMgZGViaXRlZCB3aXRob3V0IEJvYiBiZWlu ZyBjcmVkaXRlZC4KICAgIFdlIG5lZWQgYSBndWFyYW50ZWUgdGhhdCBpZiBz b21ldGhpbmcgZ29lcyB3cm9uZyBwYXJ0d2F5IHRocm91Z2ggdGhlCiAgICBv cGVyYXRpb24sIG5vbmUgb2YgdGhlIHN0ZXBzIGV4ZWN1dGVkIHNvIGZhciB3 aWxsIHRha2UgZWZmZWN0LiAgR3JvdXBpbmcKICAgIHRoZSB1cGRhdGVzIGlu dG8gYSA8ZW0gY2xhc3M9ImZpcnN0dGVybSI+dHJhbnNhY3Rpb248L2VtPiBn aXZlcyB1cyB0aGlzIGd1YXJhbnRlZS4KICAgIEEgdHJhbnNhY3Rpb24gaXMg c2FpZCB0byBiZSA8ZW0gY2xhc3M9ImZpcnN0dGVybSI+YXRvbWljPC9lbT46 IGZyb20gdGhlIHBvaW50IG9mCiAgICB2aWV3IG9mIG90aGVyIHRyYW5zYWN0 aW9ucywgaXQgZWl0aGVyIGhhcHBlbnMgY29tcGxldGVseSBvciBub3QgYXQg YWxsLgogICA8L3A+PHA+CiAgICBXZSBhbHNvIHdhbnQgYQogICAgZ3VhcmFu dGVlIHRoYXQgb25jZSBhIHRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlZCBhbmQg YWNrbm93bGVkZ2VkIGJ5CiAgICB0aGUgZGF0YWJhc2Ugc3lzdGVtLCBpdCBo YXMgaW5kZWVkIGJlZW4gcGVybWFuZW50bHkgcmVjb3JkZWQKICAgIGFuZCB3 b24ndCBiZSBsb3N0IGV2ZW4gaWYgYSBjcmFzaCBlbnN1ZXMgc2hvcnRseSB0 aGVyZWFmdGVyLgogICAgRm9yIGV4YW1wbGUsIGlmIHdlIGFyZSByZWNvcmRp bmcgYSBjYXNoIHdpdGhkcmF3YWwgYnkgQm9iLAogICAgd2UgZG8gbm90IHdh bnQgYW55IGNoYW5jZSB0aGF0IHRoZSBkZWJpdCB0byBoaXMgYWNjb3VudCB3 aWxsCiAgICBkaXNhcHBlYXIgaW4gYSBjcmFzaCBqdXN0IGFmdGVyIGhlIHdh bGtzIG91dCB0aGUgYmFuayBkb29yLgogICAgQSB0cmFuc2FjdGlvbmFsIGRh dGFiYXNlIGd1YXJhbnRlZXMgdGhhdCBhbGwgdGhlIHVwZGF0ZXMgbWFkZSBi eQogICAgYSB0cmFuc2FjdGlvbiBhcmUgbG9nZ2VkIGluIHBlcm1hbmVudCBz dG9yYWdlIChpLmUuLCBvbiBkaXNrKSBiZWZvcmUKICAgIHRoZSB0cmFuc2Fj dGlvbiBpcyByZXBvcnRlZCBjb21wbGV0ZS4KICAgPC9wPjxwPgogICAgQW5v dGhlciBpbXBvcnRhbnQgcHJvcGVydHkgb2YgdHJhbnNhY3Rpb25hbCBkYXRh YmFzZXMgaXMgY2xvc2VseQogICAgcmVsYXRlZCB0byB0aGUgbm90aW9uIG9m IGF0b21pYyB1cGRhdGVzOiB3aGVuIG11bHRpcGxlIHRyYW5zYWN0aW9ucwog ICAgYXJlIHJ1bm5pbmcgY29uY3VycmVudGx5LCBlYWNoIG9uZSBzaG91bGQg bm90IGJlIGFibGUgdG8gc2VlIHRoZQogICAgaW5jb21wbGV0ZSBjaGFuZ2Vz IG1hZGUgYnkgb3RoZXJzLiAgRm9yIGV4YW1wbGUsIGlmIG9uZSB0cmFuc2Fj dGlvbgogICAgaXMgYnVzeSB0b3RhbGxpbmcgYWxsIHRoZSBicmFuY2ggYmFs YW5jZXMsIGl0IHdvdWxkIG5vdCBkbyBmb3IgaXQKICAgIHRvIGluY2x1ZGUg dGhlIGRlYml0IGZyb20gQWxpY2UncyBicmFuY2ggYnV0IG5vdCB0aGUgY3Jl ZGl0IHRvCiAgICBCb2IncyBicmFuY2gsIG5vciB2aWNlIHZlcnNhLiAgU28g dHJhbnNhY3Rpb25zIG11c3QgYmUgYWxsLW9yLW5vdGhpbmcKICAgIG5vdCBv bmx5IGluIHRlcm1zIG9mIHRoZWlyIHBlcm1hbmVudCBlZmZlY3Qgb24gdGhl IGRhdGFiYXNlLCBidXQKICAgIGFsc28gaW4gdGVybXMgb2YgdGhlaXIgdmlz aWJpbGl0eSBhcyB0aGV5IGhhcHBlbi4gIFRoZSB1cGRhdGVzIG1hZGUKICAg IHNvIGZhciBieSBhbiBvcGVuIHRyYW5zYWN0aW9uIGFyZSBpbnZpc2libGUg dG8gb3RoZXIgdHJhbnNhY3Rpb25zCiAgICB1bnRpbCB0aGUgdHJhbnNhY3Rp b24gY29tcGxldGVzLCB3aGVyZXVwb24gYWxsIHRoZSB1cGRhdGVzIGJlY29t ZQogICAgdmlzaWJsZSBzaW11bHRhbmVvdXNseS4KICAgPC9wPjxwPgogICAg SW4gPHNwYW4gY2xhc3M9InByb2R1Y3RuYW1lIj5Qb3N0Z3JlU1FMPC9zcGFu PiwgYSB0cmFuc2FjdGlvbiBpcyBzZXQgdXAgYnkgc3Vycm91bmRpbmcKICAg IHRoZSBTUUwgY29tbWFuZHMgb2YgdGhlIHRyYW5zYWN0aW9uIHdpdGgKICAg IDxzcGFuIGNsYXNzPSJjb21tYW5kIj48c3Ryb25nPkJFR0lOPC9zdHJvbmc+ PC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9ImNvbW1hbmQiPjxzdHJvbmc+Q09N TUlUPC9zdHJvbmc+PC9zcGFuPiBjb21tYW5kcy4gIFNvIG91ciBiYW5raW5n CiAgICB0cmFuc2FjdGlvbiB3b3VsZCBhY3R1YWxseSBsb29rIGxpa2U6Cgo8 L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgpCRUdJTjsKVVBEQVRF IGFjY291bnRzIFNFVCBiYWxhbmNlID0gYmFsYW5jZSAtIDEwMC4wMAogICAg V0hFUkUgbmFtZSA9ICdBbGljZSc7Ci0tIGV0YyBldGMKQ09NTUlUOwo8L3By ZT48cD4KICAgPC9wPjxwPgogICAgSWYsIHBhcnR3YXkgdGhyb3VnaCB0aGUg dHJhbnNhY3Rpb24sIHdlIGRlY2lkZSB3ZSBkbyBub3Qgd2FudCB0bwogICAg Y29tbWl0IChwZXJoYXBzIHdlIGp1c3Qgbm90aWNlZCB0aGF0IEFsaWNlJ3Mg YmFsYW5jZSB3ZW50IG5lZ2F0aXZlKSwKICAgIHdlIGNhbiBpc3N1ZSB0aGUg Y29tbWFuZCA8c3BhbiBjbGFzcz0iY29tbWFuZCI+PHN0cm9uZz5ST0xMQkFD Szwvc3Ryb25nPjwvc3Bhbj4gaW5zdGVhZCBvZgogICAgPHNwYW4gY2xhc3M9 ImNvbW1hbmQiPjxzdHJvbmc+Q09NTUlUPC9zdHJvbmc+PC9zcGFuPiwgYW5k IGFsbCBvdXIgdXBkYXRlcyBzbyBmYXIgd2lsbCBiZSBjYW5jZWxlZC4KICAg PC9wPjxwPgogICAgPHNwYW4gY2xhc3M9InByb2R1Y3RuYW1lIj5Qb3N0Z3Jl U1FMPC9zcGFuPiBhY3R1YWxseSB0cmVhdHMgZXZlcnkgU1FMIHN0YXRlbWVu dCBhcyBiZWluZwogICAgZXhlY3V0ZWQgd2l0aGluIGEgdHJhbnNhY3Rpb24u ICBJZiB5b3UgZG8gbm90IGlzc3VlIGEgPHNwYW4gY2xhc3M9ImNvbW1hbmQi PjxzdHJvbmc+QkVHSU48L3N0cm9uZz48L3NwYW4+CiAgICBjb21tYW5kLAog ICAgdGhlbiBlYWNoIGluZGl2aWR1YWwgc3RhdGVtZW50IGhhcyBhbiBpbXBs aWNpdCA8c3BhbiBjbGFzcz0iY29tbWFuZCI+PHN0cm9uZz5CRUdJTjwvc3Ry b25nPjwvc3Bhbj4gYW5kCiAgICAoaWYgc3VjY2Vzc2Z1bCkgPHNwYW4gY2xh c3M9ImNvbW1hbmQiPjxzdHJvbmc+Q09NTUlUPC9zdHJvbmc+PC9zcGFuPiB3 cmFwcGVkIGFyb3VuZCBpdC4gIEEgZ3JvdXAgb2YKICAgIHN0YXRlbWVudHMg c3Vycm91bmRlZCBieSA8c3BhbiBjbGFzcz0iY29tbWFuZCI+PHN0cm9uZz5C RUdJTjwvc3Ryb25nPjwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJjb21tYW5k Ij48c3Ryb25nPkNPTU1JVDwvc3Ryb25nPjwvc3Bhbj4KICAgIGlzIHNvbWV0 aW1lcyBjYWxsZWQgYSA8ZW0gY2xhc3M9ImZpcnN0dGVybSI+dHJhbnNhY3Rp b24gYmxvY2s8L2VtPi4KICAgPC9wPjxkaXYgY2xhc3M9Im5vdGUiIHN0eWxl PSJtYXJnaW4tbGVmdDogMC41aW47IG1hcmdpbi1yaWdodDogMC41aW47Ij48 aDMgY2xhc3M9InRpdGxlIj5Ob3RlPC9oMz48cD4KICAgICBTb21lIGNsaWVu dCBsaWJyYXJpZXMgaXNzdWUgPHNwYW4gY2xhc3M9ImNvbW1hbmQiPjxzdHJv bmc+QkVHSU48L3N0cm9uZz48L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0iY29t bWFuZCI+PHN0cm9uZz5DT01NSVQ8L3N0cm9uZz48L3NwYW4+CiAgICAgY29t bWFuZHMgYXV0b21hdGljYWxseSwgc28gdGhhdCB5b3UgbWlnaHQgZ2V0IHRo ZSBlZmZlY3Qgb2YgdHJhbnNhY3Rpb24KICAgICBibG9ja3Mgd2l0aG91dCBh c2tpbmcuICBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGludGVy ZmFjZQogICAgIHlvdSBhcmUgdXNpbmcuCiAgICA8L3A+PC9kaXY+PHA+CiAg ICBJdCdzIHBvc3NpYmxlIHRvIGNvbnRyb2wgdGhlIHN0YXRlbWVudHMgaW4g YSB0cmFuc2FjdGlvbiBpbiBhIG1vcmUKICAgIGdyYW51bGFyIGZhc2hpb24g dGhyb3VnaCB0aGUgdXNlIG9mIDxlbSBjbGFzcz0iZmlyc3R0ZXJtIj5zYXZl cG9pbnRzPC9lbT4uICBTYXZlcG9pbnRzCiAgICBhbGxvdyB5b3UgdG8gc2Vs ZWN0aXZlbHkgZGlzY2FyZCBwYXJ0cyBvZiB0aGUgdHJhbnNhY3Rpb24sIHdo aWxlCiAgICBjb21taXR0aW5nIHRoZSByZXN0LiAgQWZ0ZXIgZGVmaW5pbmcg YSBzYXZlcG9pbnQgd2l0aAogICAgPHNwYW4gY2xhc3M9ImNvbW1hbmQiPjxz dHJvbmc+U0FWRVBPSU5UPC9zdHJvbmc+PC9zcGFuPiwgeW91IGNhbiBpZiBu ZWVkZWQgcm9sbCBiYWNrIHRvIHRoZSBzYXZlcG9pbnQKICAgIHdpdGggPHNw YW4gY2xhc3M9ImNvbW1hbmQiPjxzdHJvbmc+Uk9MTEJBQ0sgVE88L3N0cm9u Zz48L3NwYW4+LiAgQWxsIHRoZSB0cmFuc2FjdGlvbidzIGRhdGFiYXNlIGNo YW5nZXMKICAgIGJldHdlZW4gZGVmaW5pbmcgdGhlIHNhdmVwb2ludCBhbmQg cm9sbGluZyBiYWNrIHRvIGl0IGFyZSBkaXNjYXJkZWQsIGJ1dAogICAgY2hh bmdlcyBlYXJsaWVyIHRoYW4gdGhlIHNhdmVwb2ludCBhcmUga2VwdC4KICAg PC9wPjxwPgogICAgQWZ0ZXIgcm9sbGluZyBiYWNrIHRvIGEgc2F2ZXBvaW50 LCBpdCBjb250aW51ZXMgdG8gYmUgZGVmaW5lZCwgc28geW91IGNhbgogICAg cm9sbCBiYWNrIHRvIGl0IHNldmVyYWwgdGltZXMuICBDb252ZXJzZWx5LCBp ZiB5b3UgYXJlIHN1cmUgeW91IHdvbid0IG5lZWQKICAgIHRvIHJvbGwgYmFj ayB0byBhIHBhcnRpY3VsYXIgc2F2ZXBvaW50IGFnYWluLCBpdCBjYW4gYmUg cmVsZWFzZWQsIHNvIHRoZQogICAgc3lzdGVtIGNhbiBmcmVlIHNvbWUgcmVz b3VyY2VzLiAgS2VlcCBpbiBtaW5kIHRoYXQgZWl0aGVyIHJlbGVhc2luZyBv cgogICAgcm9sbGluZyBiYWNrIHRvIGEgc2F2ZXBvaW50CiAgICB3aWxsIGF1 dG9tYXRpY2FsbHkgcmVsZWFzZSBhbGwgc2F2ZXBvaW50cyB0aGF0IHdlcmUg ZGVmaW5lZCBhZnRlciBpdC4KICAgPC9wPjxwPgogICAgQWxsIHRoaXMgaXMg aGFwcGVuaW5nIHdpdGhpbiB0aGUgdHJhbnNhY3Rpb24gYmxvY2ssIHNvIG5v bmUgb2YgaXQKICAgIGlzIHZpc2libGUgdG8gb3RoZXIgZGF0YWJhc2Ugc2Vz c2lvbnMuICBXaGVuIGFuZCBpZiB5b3UgY29tbWl0IHRoZQogICAgdHJhbnNh Y3Rpb24gYmxvY2ssIHRoZSBjb21taXR0ZWQgYWN0aW9ucyBiZWNvbWUgdmlz aWJsZSBhcyBhIHVuaXQKICAgIHRvIG90aGVyIHNlc3Npb25zLCB3aGlsZSB0 aGUgcm9sbGVkLWJhY2sgYWN0aW9ucyBuZXZlciBiZWNvbWUgdmlzaWJsZQog ICAgYXQgYWxsLgogICA8L3A+PHA+CiAgICBSZW1lbWJlcmluZyB0aGUgYmFu ayBkYXRhYmFzZSwgc3VwcG9zZSB3ZSBkZWJpdCAkMTAwLjAwIGZyb20gQWxp Y2UncwogICAgYWNjb3VudCwgYW5kIGNyZWRpdCBCb2IncyBhY2NvdW50LCBv bmx5IHRvIGZpbmQgbGF0ZXIgdGhhdCB3ZSBzaG91bGQKICAgIGhhdmUgY3Jl ZGl0ZWQgV2FsbHkncyBhY2NvdW50LiAgV2UgY291bGQgZG8gaXQgdXNpbmcg c2F2ZXBvaW50cyBsaWtlCiAgICB0aGlzOgoKPC9wPjxwcmUgY2xhc3M9InBy b2dyYW1saXN0aW5nIj4KQkVHSU47ClVQREFURSBhY2NvdW50cyBTRVQgYmFs YW5jZSA9IGJhbGFuY2UgLSAxMDAuMDAKICAgIFdIRVJFIG5hbWUgPSAnQWxp Y2UnOwpTQVZFUE9JTlQgbXlfc2F2ZXBvaW50OwpVUERBVEUgYWNjb3VudHMg U0VUIGJhbGFuY2UgPSBiYWxhbmNlICsgMTAwLjAwCiAgICBXSEVSRSBuYW1l ID0gJ0JvYic7Ci0tIG9vcHMgLi4uIGZvcmdldCB0aGF0IGFuZCB1c2UgV2Fs bHkncyBhY2NvdW50ClJPTExCQUNLIFRPIG15X3NhdmVwb2ludDsKVVBEQVRF IGFjY291bnRzIFNFVCBiYWxhbmNlID0gYmFsYW5jZSArIDEwMC4wMAogICAg V0hFUkUgbmFtZSA9ICdXYWxseSc7CkNPTU1JVDsKPC9wcmU+PHA+CiAgIDwv cD48cD4KICAgIFRoaXMgZXhhbXBsZSBpcywgb2YgY291cnNlLCBvdmVyc2lt cGxpZmllZCwgYnV0IHRoZXJlJ3MgYSBsb3Qgb2YgY29udHJvbAogICAgcG9z c2libGUgaW4gYSB0cmFuc2FjdGlvbiBibG9jayB0aHJvdWdoIHRoZSB1c2Ug b2Ygc2F2ZXBvaW50cy4KICAgIE1vcmVvdmVyLCA8c3BhbiBjbGFzcz0iY29t bWFuZCI+PHN0cm9uZz5ST0xMQkFDSyBUTzwvc3Ryb25nPjwvc3Bhbj4gaXMg dGhlIG9ubHkgd2F5IHRvIHJlZ2FpbiBjb250cm9sIG9mIGEKICAgIHRyYW5z YWN0aW9uIGJsb2NrIHRoYXQgd2FzIHB1dCBpbiBhYm9ydGVkIHN0YXRlIGJ5 IHRoZQogICAgc3lzdGVtIGR1ZSB0byBhbiBlcnJvciwgc2hvcnQgb2Ygcm9s bGluZyBpdCBiYWNrIGNvbXBsZXRlbHkgYW5kIHN0YXJ0aW5nCiAgICBhZ2Fp bi4KICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3Rpb24iPjxkaXYgY2xh c3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMiBjbGFzcz0idGl0bGUiIHN0 eWxlPSJjbGVhcjogYm90aCI+PGEgbmFtZT0idHV0b3JpYWwtd2luZG93Ij48 L2E+V2luZG93IEZ1bmN0aW9uczwvaDI+PC9kaXY+PC9kaXY+PC9kaXY+PGEg Y2xhc3M9ImluZGV4dGVybSIgbmFtZT0iaWRtNDYwNDUxNDM5NDE4MDgiPjwv YT48cD4KICAgIEEgPGVtIGNsYXNzPSJmaXJzdHRlcm0iPndpbmRvdyBmdW5j dGlvbjwvZW0+IHBlcmZvcm1zIGEgY2FsY3VsYXRpb24gYWNyb3NzIGEgc2V0 IG9mCiAgICB0YWJsZSByb3dzIHRoYXQgYXJlIHNvbWVob3cgcmVsYXRlZCB0 byB0aGUgY3VycmVudCByb3cuICBUaGlzIGlzIGNvbXBhcmFibGUKICAgIHRv IHRoZSB0eXBlIG9mIGNhbGN1bGF0aW9uIHRoYXQgY2FuIGJlIGRvbmUgd2l0 aCBhbiBhZ2dyZWdhdGUgZnVuY3Rpb24uCiAgICBCdXQgdW5saWtlIHJlZ3Vs YXIgYWdncmVnYXRlIGZ1bmN0aW9ucywgdXNlIG9mIGEgd2luZG93IGZ1bmN0 aW9uIGRvZXMgbm90CiAgICBjYXVzZSByb3dzIHRvIGJlY29tZSBncm91cGVk IGludG8gYSBzaW5nbGUgb3V0cHV0IHJvdyBfX21kYXNoX18gdGhlCiAgICBy b3dzIHJldGFpbiB0aGVpciBzZXBhcmF0ZSBpZGVudGl0aWVzLiAgQmVoaW5k IHRoZSBzY2VuZXMsIHRoZSB3aW5kb3cKICAgIGZ1bmN0aW9uIGlzIGFibGUg dG8gYWNjZXNzIG1vcmUgdGhhbiBqdXN0IHRoZSBjdXJyZW50IHJvdyBvZiB0 aGUgcXVlcnkKICAgIHJlc3VsdC4KICAgPC9wPjxwPgogICAgSGVyZSBpcyBh biBleGFtcGxlIHRoYXQgc2hvd3MgaG93IHRvIGNvbXBhcmUgZWFjaCBlbXBs b3llZSdzIHNhbGFyeQogICAgd2l0aCB0aGUgYXZlcmFnZSBzYWxhcnkgaW4g aGlzIG9yIGhlciBkZXBhcnRtZW50OgoKPC9wPjxwcmUgY2xhc3M9InByb2dy YW1saXN0aW5nIj4KU0VMRUNUIGRlcG5hbWUsIGVtcG5vLCBzYWxhcnksIGF2 ZyhzYWxhcnkpIE9WRVIgKFBBUlRJVElPTiBCWSBkZXBuYW1lKSBGUk9NIGVt cHNhbGFyeTsKPC9wcmU+PHA+Cgo8L3A+PHByZSBjbGFzcz0ic2NyZWVuIj4K ICBkZXBuYW1lICB8IGVtcG5vIHwgc2FsYXJ5IHwgICAgICAgICAgYXZnICAg ICAgICAgIAotLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCiBkZXZlbG9wICAgfCAgICAxMSB8ICAgNTIwMCB8 IDUwMjAuMDAwMDAwMDAwMDAwMDAwMAogZGV2ZWxvcCAgIHwgICAgIDcgfCAg IDQyMDAgfCA1MDIwLjAwMDAwMDAwMDAwMDAwMDAKIGRldmVsb3AgICB8ICAg ICA5IHwgICA0NTAwIHwgNTAyMC4wMDAwMDAwMDAwMDAwMDAwCiBkZXZlbG9w ICAgfCAgICAgOCB8ICAgNjAwMCB8IDUwMjAuMDAwMDAwMDAwMDAwMDAwMAog ZGV2ZWxvcCAgIHwgICAgMTAgfCAgIDUyMDAgfCA1MDIwLjAwMDAwMDAwMDAw MDAwMDAKIHBlcnNvbm5lbCB8ICAgICA1IHwgICAzNTAwIHwgMzcwMC4wMDAw MDAwMDAwMDAwMDAwCiBwZXJzb25uZWwgfCAgICAgMiB8ICAgMzkwMCB8IDM3 MDAuMDAwMDAwMDAwMDAwMDAwMAogc2FsZXMgICAgIHwgICAgIDMgfCAgIDQ4 MDAgfCA0ODY2LjY2NjY2NjY2NjY2NjY2NjcKIHNhbGVzICAgICB8ICAgICAx IHwgICA1MDAwIHwgNDg2Ni42NjY2NjY2NjY2NjY2NjY3CiBzYWxlcyAgICAg fCAgICAgNCB8ICAgNDgwMCB8IDQ4NjYuNjY2NjY2NjY2NjY2NjY2NwooMTAg cm93cykKPC9wcmU+PHA+CgogICAgVGhlIGZpcnN0IHRocmVlIG91dHB1dCBj b2x1bW5zIGNvbWUgZGlyZWN0bHkgZnJvbSB0aGUgdGFibGUKICAgIDxjb2Rl IGNsYXNzPSJ2YXJuYW1lIj5lbXBzYWxhcnk8L2NvZGU+LCBhbmQgdGhlcmUg aXMgb25lIG91dHB1dCByb3cgZm9yIGVhY2ggcm93IGluIHRoZQogICAgdGFi bGUuICBUaGUgZm91cnRoIGNvbHVtbiByZXByZXNlbnRzIGFuIGF2ZXJhZ2Ug dGFrZW4gYWNyb3NzIGFsbCB0aGUgdGFibGUKICAgIHJvd3MgdGhhdCBoYXZl IHRoZSBzYW1lIDxjb2RlIGNsYXNzPSJ2YXJuYW1lIj5kZXBuYW1lPC9jb2Rl PiB2YWx1ZSBhcyB0aGUgY3VycmVudCByb3cuCiAgICAoVGhpcyBhY3R1YWxs eSBpcyB0aGUgc2FtZSBmdW5jdGlvbiBhcyB0aGUgcmVndWxhciA8Y29kZSBj bGFzcz0iZnVuY3Rpb24iPmF2ZzwvY29kZT4KICAgIGFnZ3JlZ2F0ZSBmdW5j dGlvbiwgYnV0IHRoZSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+T1ZFUjwvY29k ZT4gY2xhdXNlIGNhdXNlcyBpdCB0byBiZQogICAgdHJlYXRlZCBhcyBhIHdp bmRvdyBmdW5jdGlvbiBhbmQgY29tcHV0ZWQgYWNyb3NzIGFuIGFwcHJvcHJp YXRlIHNldCBvZgogICAgcm93cy4pCiAgIDwvcD48cD4KICAgIEEgd2luZG93 IGZ1bmN0aW9uIGNhbGwgYWx3YXlzIGNvbnRhaW5zIGFuIDxjb2RlIGNsYXNz PSJsaXRlcmFsIj5PVkVSPC9jb2RlPiBjbGF1c2UKICAgIGRpcmVjdGx5IGZv bGxvd2luZyB0aGUgd2luZG93IGZ1bmN0aW9uJ3MgbmFtZSBhbmQgYXJndW1l bnQocykuICBUaGlzIGlzIHdoYXQKICAgIHN5bnRhY3RpY2FsbHkgZGlzdGlu Z3Vpc2hlcyBpdCBmcm9tIGEgcmVndWxhciBmdW5jdGlvbiBvciBhZ2dyZWdh dGUKICAgIGZ1bmN0aW9uLiAgVGhlIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5P VkVSPC9jb2RlPiBjbGF1c2UgZGV0ZXJtaW5lcyBleGFjdGx5IGhvdyB0aGUK ICAgIHJvd3Mgb2YgdGhlIHF1ZXJ5IGFyZSBzcGxpdCB1cCBmb3IgcHJvY2Vz c2luZyBieSB0aGUgd2luZG93IGZ1bmN0aW9uLgogICAgVGhlIDxjb2RlIGNs YXNzPSJsaXRlcmFsIj5QQVJUSVRJT04gQlk8L2NvZGU+IGxpc3Qgd2l0aGlu IDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5PVkVSPC9jb2RlPiBzcGVjaWZpZXMK ICAgIGRpdmlkaW5nIHRoZSByb3dzIGludG8gZ3JvdXBzLCBvciBwYXJ0aXRp b25zLCB0aGF0IHNoYXJlIHRoZSBzYW1lCiAgICB2YWx1ZXMgb2YgdGhlIDxj b2RlIGNsYXNzPSJsaXRlcmFsIj5QQVJUSVRJT04gQlk8L2NvZGU+IGV4cHJl c3Npb24ocykuICBGb3IgZWFjaCByb3csCiAgICB0aGUgd2luZG93IGZ1bmN0 aW9uIGlzIGNvbXB1dGVkIGFjcm9zcyB0aGUgcm93cyB0aGF0IGZhbGwgaW50 byB0aGUKICAgIHNhbWUgcGFydGl0aW9uIGFzIHRoZSBjdXJyZW50IHJvdy4K ICAgPC9wPjxwPgogICAgWW91IGNhbiBhbHNvIGNvbnRyb2wgdGhlIG9yZGVy IGluIHdoaWNoIHJvd3MgYXJlIHByb2Nlc3NlZCBieQogICAgd2luZG93IGZ1 bmN0aW9ucyB1c2luZyA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+T1JERVIgQlk8 L2NvZGU+IHdpdGhpbiA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+T1ZFUjwvY29k ZT4uCiAgICAoVGhlIHdpbmRvdyA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+T1JE RVIgQlk8L2NvZGU+IGRvZXMgbm90IGV2ZW4gaGF2ZSB0byBtYXRjaCB0aGUK ICAgIG9yZGVyIGluIHdoaWNoIHRoZSByb3dzIGFyZSBvdXRwdXQuKSAgSGVy ZSBpcyBhbiBleGFtcGxlOgoKPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0 aW5nIj4KU0VMRUNUIGRlcG5hbWUsIGVtcG5vLCBzYWxhcnksCiAgICAgICBy YW5rKCkgT1ZFUiAoUEFSVElUSU9OIEJZIGRlcG5hbWUgT1JERVIgQlkgc2Fs YXJ5IERFU0MpCkZST00gZW1wc2FsYXJ5Owo8L3ByZT48cD4KCjwvcD48cHJl IGNsYXNzPSJzY3JlZW4iPgogIGRlcG5hbWUgIHwgZW1wbm8gfCBzYWxhcnkg fCByYW5rIAotLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tKy0tLS0tLQog ZGV2ZWxvcCAgIHwgICAgIDggfCAgIDYwMDAgfCAgICAxCiBkZXZlbG9wICAg fCAgICAxMCB8ICAgNTIwMCB8ICAgIDIKIGRldmVsb3AgICB8ICAgIDExIHwg ICA1MjAwIHwgICAgMgogZGV2ZWxvcCAgIHwgICAgIDkgfCAgIDQ1MDAgfCAg ICA0CiBkZXZlbG9wICAgfCAgICAgNyB8ICAgNDIwMCB8ICAgIDUKIHBlcnNv bm5lbCB8ICAgICAyIHwgICAzOTAwIHwgICAgMQogcGVyc29ubmVsIHwgICAg IDUgfCAgIDM1MDAgfCAgICAyCiBzYWxlcyAgICAgfCAgICAgMSB8ICAgNTAw MCB8ICAgIDEKIHNhbGVzICAgICB8ICAgICA0IHwgICA0ODAwIHwgICAgMgog c2FsZXMgICAgIHwgICAgIDMgfCAgIDQ4MDAgfCAgICAyCigxMCByb3dzKQo8 L3ByZT48cD4KCiAgICBBcyBzaG93biBoZXJlLCB0aGUgPGNvZGUgY2xhc3M9 ImZ1bmN0aW9uIj5yYW5rPC9jb2RlPiBmdW5jdGlvbiBwcm9kdWNlcyBhIG51 bWVyaWNhbCByYW5rCiAgICB3aXRoaW4gdGhlIGN1cnJlbnQgcm93J3MgcGFy dGl0aW9uIGZvciBlYWNoIGRpc3RpbmN0IDxjb2RlIGNsYXNzPSJsaXRlcmFs Ij5PUkRFUiBCWTwvY29kZT4KICAgIHZhbHVlLCBpbiB0aGUgb3JkZXIgZGVm aW5lZCBieSB0aGUgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPk9SREVSIEJZPC9j b2RlPiBjbGF1c2UuCiAgICA8Y29kZSBjbGFzcz0iZnVuY3Rpb24iPnJhbms8 L2NvZGU+IG5lZWRzIG5vIGV4cGxpY2l0IHBhcmFtZXRlciwgYmVjYXVzZSBp dHMgYmVoYXZpb3IKICAgIGlzIGVudGlyZWx5IGRldGVybWluZWQgYnkgdGhl IDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5PVkVSPC9jb2RlPiBjbGF1c2UuCiAg IDwvcD48cD4KICAgIFRoZSByb3dzIGNvbnNpZGVyZWQgYnkgYSB3aW5kb3cg ZnVuY3Rpb24gYXJlIHRob3NlIG9mIHRoZSA8c3BhbiBjbGFzcz0icXVvdGUi PiYjODIyMDs8c3BhbiBjbGFzcz0icXVvdGUiPnZpcnR1YWwKICAgIHRhYmxl PC9zcGFuPiYjODIyMTs8L3NwYW4+IHByb2R1Y2VkIGJ5IHRoZSBxdWVyeSdz IDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5GUk9NPC9jb2RlPiBjbGF1c2UgYXMg ZmlsdGVyZWQgYnkgaXRzCiAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+V0hF UkU8L2NvZGU+LCA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+R1JPVVAgQlk8L2Nv ZGU+LCBhbmQgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkhBVklORzwvY29kZT4g Y2xhdXNlcwogICAgaWYgYW55LiAgRm9yIGV4YW1wbGUsIGEgcm93IHJlbW92 ZWQgYmVjYXVzZSBpdCBkb2VzIG5vdCBtZWV0IHRoZQogICAgPGNvZGUgY2xh c3M9ImxpdGVyYWwiPldIRVJFPC9jb2RlPiBjb25kaXRpb24gaXMgbm90IHNl ZW4gYnkgYW55IHdpbmRvdyBmdW5jdGlvbi4KICAgIEEgcXVlcnkgY2FuIGNv bnRhaW4gbXVsdGlwbGUgd2luZG93IGZ1bmN0aW9ucyB0aGF0IHNsaWNlIHVw IHRoZSBkYXRhCiAgICBpbiBkaWZmZXJlbnQgd2F5cyBieSBtZWFucyBvZiBk aWZmZXJlbnQgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPk9WRVI8L2NvZGU+IGNs YXVzZXMsIGJ1dAogICAgdGhleSBhbGwgYWN0IG9uIHRoZSBzYW1lIGNvbGxl Y3Rpb24gb2Ygcm93cyBkZWZpbmVkIGJ5IHRoaXMgdmlydHVhbCB0YWJsZS4K ICAgPC9wPjxwPgogICAgV2UgYWxyZWFkeSBzYXcgdGhhdCA8Y29kZSBjbGFz cz0ibGl0ZXJhbCI+T1JERVIgQlk8L2NvZGU+IGNhbiBiZSBvbWl0dGVkIGlm IHRoZSBvcmRlcmluZwogICAgb2Ygcm93cyBpcyBub3QgaW1wb3J0YW50LiAg SXQgaXMgYWxzbyBwb3NzaWJsZSB0byBvbWl0IDxjb2RlIGNsYXNzPSJsaXRl cmFsIj5QQVJUSVRJT04KICAgIEJZPC9jb2RlPiwgaW4gd2hpY2ggY2FzZSB0 aGVyZSBpcyBqdXN0IG9uZSBwYXJ0aXRpb24gY29udGFpbmluZyBhbGwgdGhl IHJvd3MuCiAgIDwvcD48cD4KICAgIFRoZXJlIGlzIGFub3RoZXIgaW1wb3J0 YW50IGNvbmNlcHQgYXNzb2NpYXRlZCB3aXRoIHdpbmRvdyBmdW5jdGlvbnM6 CiAgICBmb3IgZWFjaCByb3csIHRoZXJlIGlzIGEgc2V0IG9mIHJvd3Mgd2l0 aGluIGl0cyBwYXJ0aXRpb24gY2FsbGVkIGl0cwogICAgPGVtIGNsYXNzPSJm aXJzdHRlcm0iPndpbmRvdyBmcmFtZTwvZW0+LiAgTWFueSAoYnV0IG5vdCBh bGwpIHdpbmRvdyBmdW5jdGlvbnMgYWN0IG9ubHkKICAgIG9uIHRoZSByb3dz IG9mIHRoZSB3aW5kb3cgZnJhbWUsIHJhdGhlciB0aGFuIG9mIHRoZSB3aG9s ZSBwYXJ0aXRpb24uCiAgICBCeSBkZWZhdWx0LCBpZiA8Y29kZSBjbGFzcz0i bGl0ZXJhbCI+T1JERVIgQlk8L2NvZGU+IGlzIHN1cHBsaWVkIHRoZW4gdGhl IGZyYW1lIGNvbnNpc3RzIG9mCiAgICBhbGwgcm93cyBmcm9tIHRoZSBzdGFy dCBvZiB0aGUgcGFydGl0aW9uIHVwIHRocm91Z2ggdGhlIGN1cnJlbnQgcm93 LCBwbHVzCiAgICBhbnkgZm9sbG93aW5nIHJvd3MgdGhhdCBhcmUgZXF1YWwg dG8gdGhlIGN1cnJlbnQgcm93IGFjY29yZGluZyB0byB0aGUKICAgIDxjb2Rl IGNsYXNzPSJsaXRlcmFsIj5PUkRFUiBCWTwvY29kZT4gY2xhdXNlLiAgV2hl biA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+T1JERVIgQlk8L2NvZGU+IGlzIG9t aXR0ZWQgdGhlCiAgICBkZWZhdWx0IGZyYW1lIGNvbnNpc3RzIG9mIGFsbCBy b3dzIGluIHRoZSBwYXJ0aXRpb24uCiAgICAgPGEgaHJlZj0iI2Z0bi5pZG00 NjA0NTE0MzkxOTQ1NiIgY2xhc3M9ImZvb3Rub3RlIiBuYW1lPSJpZG00NjA0 NTE0MzkxOTQ1NiI+PHN1cCBjbGFzcz0iZm9vdG5vdGUiPlsxXTwvc3VwPjwv YT4KICAgIEhlcmUgaXMgYW4gZXhhbXBsZSB1c2luZyA8Y29kZSBjbGFzcz0i ZnVuY3Rpb24iPnN1bTwvY29kZT46CiAgIDwvcD48cHJlIGNsYXNzPSJwcm9n cmFtbGlzdGluZyI+ClNFTEVDVCBzYWxhcnksIHN1bShzYWxhcnkpIE9WRVIg KCkgRlJPTSBlbXBzYWxhcnk7CjwvcHJlPjxwcmUgY2xhc3M9InNjcmVlbiI+ CiBzYWxhcnkgfCAgc3VtICAKLS0tLS0tLS0rLS0tLS0tLQogICA1MjAwIHwg NDcxMDAKICAgNTAwMCB8IDQ3MTAwCiAgIDM1MDAgfCA0NzEwMAogICA0ODAw IHwgNDcxMDAKICAgMzkwMCB8IDQ3MTAwCiAgIDQyMDAgfCA0NzEwMAogICA0 NTAwIHwgNDcxMDAKICAgNDgwMCB8IDQ3MTAwCiAgIDYwMDAgfCA0NzEwMAog ICA1MjAwIHwgNDcxMDAKKDEwIHJvd3MpCjwvcHJlPjxwPgogICAgQWJvdmUs IHNpbmNlIHRoZXJlIGlzIG5vIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5PUkRF UiBCWTwvY29kZT4gaW4gdGhlIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5PVkVS PC9jb2RlPgogICAgY2xhdXNlLCB0aGUgd2luZG93IGZyYW1lIGlzIHRoZSBz YW1lIGFzIHRoZSBwYXJ0aXRpb24sIHdoaWNoIGZvciBsYWNrIG9mCiAgICA8 Y29kZSBjbGFzcz0ibGl0ZXJhbCI+UEFSVElUSU9OIEJZPC9jb2RlPiBpcyB0 aGUgd2hvbGUgdGFibGU7IGluIG90aGVyIHdvcmRzIGVhY2ggc3VtIGlzCiAg ICB0YWtlbiBvdmVyIHRoZSB3aG9sZSB0YWJsZSBhbmQgc28gd2UgZ2V0IHRo ZSBzYW1lIHJlc3VsdCBmb3IgZWFjaCBvdXRwdXQKICAgIHJvdy4gIEJ1dCBp ZiB3ZSBhZGQgYW4gPGNvZGUgY2xhc3M9ImxpdGVyYWwiPk9SREVSIEJZPC9j b2RlPiBjbGF1c2UsIHdlIGdldCB2ZXJ5IGRpZmZlcmVudAogICAgcmVzdWx0 czoKICAgPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KU0VMRUNU IHNhbGFyeSwgc3VtKHNhbGFyeSkgT1ZFUiAoT1JERVIgQlkgc2FsYXJ5KSBG Uk9NIGVtcHNhbGFyeTsKPC9wcmU+PHByZSBjbGFzcz0ic2NyZWVuIj4KIHNh bGFyeSB8ICBzdW0gIAotLS0tLS0tLSstLS0tLS0tCiAgIDM1MDAgfCAgMzUw MAogICAzOTAwIHwgIDc0MDAKICAgNDIwMCB8IDExNjAwCiAgIDQ1MDAgfCAx NjEwMAogICA0ODAwIHwgMjU3MDAKICAgNDgwMCB8IDI1NzAwCiAgIDUwMDAg fCAzMDcwMAogICA1MjAwIHwgNDExMDAKICAgNTIwMCB8IDQxMTAwCiAgIDYw MDAgfCA0NzEwMAooMTAgcm93cykKPC9wcmU+PHA+CiAgICBIZXJlIHRoZSBz dW0gaXMgdGFrZW4gZnJvbSB0aGUgZmlyc3QgKGxvd2VzdCkgc2FsYXJ5IHVw IHRocm91Z2ggdGhlCiAgICBjdXJyZW50IG9uZSwgaW5jbHVkaW5nIGFueSBk dXBsaWNhdGVzIG9mIHRoZSBjdXJyZW50IG9uZSAobm90aWNlIHRoZQogICAg cmVzdWx0cyBmb3IgdGhlIGR1cGxpY2F0ZWQgc2FsYXJpZXMpLgogICA8L3A+ PHA+CiAgICBXaW5kb3cgZnVuY3Rpb25zIGFyZSBwZXJtaXR0ZWQgb25seSBp biB0aGUgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPlNFTEVDVDwvY29kZT4gbGlz dAogICAgYW5kIHRoZSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+T1JERVIgQlk8 L2NvZGU+IGNsYXVzZSBvZiB0aGUgcXVlcnkuIFRoZXkgYXJlIGZvcmJpZGRl bgogICAgZWxzZXdoZXJlLCBzdWNoIGFzIGluIDxjb2RlIGNsYXNzPSJsaXRl cmFsIj5HUk9VUCBCWTwvY29kZT4sIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5I QVZJTkc8L2NvZGU+CiAgICBhbmQgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPldI RVJFPC9jb2RlPiBjbGF1c2VzLiAgVGhpcyBpcyBiZWNhdXNlIHRoZXkgbG9n aWNhbGx5CiAgICBleGVjdXRlIGFmdGVyIHRoZSBwcm9jZXNzaW5nIG9mIHRo b3NlIGNsYXVzZXMuICBBbHNvLCB3aW5kb3cgZnVuY3Rpb25zCiAgICBleGVj dXRlIGFmdGVyIHJlZ3VsYXIgYWdncmVnYXRlIGZ1bmN0aW9ucy4gIFRoaXMg bWVhbnMgaXQgaXMgdmFsaWQgdG8KICAgIGluY2x1ZGUgYW4gYWdncmVnYXRl IGZ1bmN0aW9uIGNhbGwgaW4gdGhlIGFyZ3VtZW50cyBvZiBhIHdpbmRvdyBm dW5jdGlvbiwKICAgIGJ1dCBub3QgdmljZSB2ZXJzYS4KICAgPC9wPjxwPgog ICAgSWYgdGhlcmUgaXMgYSBuZWVkIHRvIGZpbHRlciBvciBncm91cCByb3dz IGFmdGVyIHRoZSB3aW5kb3cgY2FsY3VsYXRpb25zCiAgICBhcmUgcGVyZm9y bWVkLCB5b3UgY2FuIHVzZSBhIHN1Yi1zZWxlY3QuICBGb3IgZXhhbXBsZToK CjwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+ClNFTEVDVCBkZXBu YW1lLCBlbXBubywgc2FsYXJ5LCBlbnJvbGxfZGF0ZQpGUk9NCiAgKFNFTEVD VCBkZXBuYW1lLCBlbXBubywgc2FsYXJ5LCBlbnJvbGxfZGF0ZSwKICAgICAg ICAgIHJhbmsoKSBPVkVSIChQQVJUSVRJT04gQlkgZGVwbmFtZSBPUkRFUiBC WSBzYWxhcnkgREVTQywgZW1wbm8pIEFTIHBvcwogICAgIEZST00gZW1wc2Fs YXJ5CiAgKSBBUyBzcwpXSEVSRSBwb3MgX19sdF9fIDM7CjwvcHJlPjxwPgoK ICAgIFRoZSBhYm92ZSBxdWVyeSBvbmx5IHNob3dzIHRoZSByb3dzIGZyb20g dGhlIGlubmVyIHF1ZXJ5IGhhdmluZwogICAgPGNvZGUgY2xhc3M9ImxpdGVy YWwiPnJhbms8L2NvZGU+IGxlc3MgdGhhbiAzLgogICA8L3A+PHA+CiAgICBX aGVuIGEgcXVlcnkgaW52b2x2ZXMgbXVsdGlwbGUgd2luZG93IGZ1bmN0aW9u cywgaXQgaXMgcG9zc2libGUgdG8gd3JpdGUKICAgIG91dCBlYWNoIG9uZSB3 aXRoIGEgc2VwYXJhdGUgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPk9WRVI8L2Nv ZGU+IGNsYXVzZSwgYnV0IHRoaXMgaXMKICAgIGR1cGxpY2F0aXZlIGFuZCBl cnJvci1wcm9uZSBpZiB0aGUgc2FtZSB3aW5kb3dpbmcgYmVoYXZpb3IgaXMg d2FudGVkCiAgICBmb3Igc2V2ZXJhbCBmdW5jdGlvbnMuICBJbnN0ZWFkLCBl YWNoIHdpbmRvd2luZyBiZWhhdmlvciBjYW4gYmUgbmFtZWQKICAgIGluIGEg PGNvZGUgY2xhc3M9ImxpdGVyYWwiPldJTkRPVzwvY29kZT4gY2xhdXNlIGFu ZCB0aGVuIHJlZmVyZW5jZWQgaW4gPGNvZGUgY2xhc3M9ImxpdGVyYWwiPk9W RVI8L2NvZGU+LgogICAgRm9yIGV4YW1wbGU6Cgo8L3A+PHByZSBjbGFzcz0i cHJvZ3JhbWxpc3RpbmciPgpTRUxFQ1Qgc3VtKHNhbGFyeSkgT1ZFUiB3LCBh dmcoc2FsYXJ5KSBPVkVSIHcKICBGUk9NIGVtcHNhbGFyeQogIFdJTkRPVyB3 IEFTIChQQVJUSVRJT04gQlkgZGVwbmFtZSBPUkRFUiBCWSBzYWxhcnkgREVT Qyk7CjwvcHJlPjxwPgogICA8L3A+PHA+CiAgICBNb3JlIGRldGFpbHMgYWJv dXQgd2luZG93IGZ1bmN0aW9ucyBjYW4gYmUgZm91bmQgaW4KICAgIDxhIGNs YXNzPSJ4cmVmIiBocmVmPSIjIj4/Pz88L2E+LAogICAgPGEgY2xhc3M9Inhy ZWYiIGhyZWY9IiMiPj8/PzwvYT4sCiAgICA8YSBjbGFzcz0ieHJlZiIgaHJl Zj0iIyI+Pz8/PC9hPiwgYW5kIHRoZQogICAgPGEgY2xhc3M9InhyZWYiIGhy ZWY9IiMiPj8/PzwvYT4gcmVmZXJlbmNlIHBhZ2UuCiAgIDwvcD48L2Rpdj48 ZGl2IGNsYXNzPSJzZWN0aW9uIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxk aXY+PGRpdj48aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xlYXI6IGJvdGgi PjxhIG5hbWU9InR1dG9yaWFsLWluaGVyaXRhbmNlIj48L2E+SW5oZXJpdGFu Y2U8L2gyPjwvZGl2PjwvZGl2PjwvZGl2PjxhIGNsYXNzPSJpbmRleHRlcm0i IG5hbWU9ImlkbTQ2MDQ1MTQzOTAyNjQwIj48L2E+PHA+CiAgICBJbmhlcml0 YW5jZSBpcyBhIGNvbmNlcHQgZnJvbSBvYmplY3Qtb3JpZW50ZWQgZGF0YWJh c2VzLiAgSXQgb3BlbnMKICAgIHVwIGludGVyZXN0aW5nIG5ldyBwb3NzaWJp bGl0aWVzIG9mIGRhdGFiYXNlIGRlc2lnbi4KICAgPC9wPjxwPgogICAgTGV0 J3MgY3JlYXRlIHR3byB0YWJsZXM6ICBBIHRhYmxlIDxjb2RlIGNsYXNzPSJj bGFzc25hbWUiPmNpdGllczwvY29kZT4KICAgIGFuZCBhIHRhYmxlIDxjb2Rl IGNsYXNzPSJjbGFzc25hbWUiPmNhcGl0YWxzPC9jb2RlPi4gIE5hdHVyYWxs eSwgY2FwaXRhbHMKICAgIGFyZSBhbHNvIGNpdGllcywgc28geW91IHdhbnQg c29tZSB3YXkgdG8gc2hvdyB0aGUgY2FwaXRhbHMKICAgIGltcGxpY2l0bHkg d2hlbiB5b3UgbGlzdCBhbGwgY2l0aWVzLiAgSWYgeW91J3JlIHJlYWxseSBj bGV2ZXIgeW91CiAgICBtaWdodCBpbnZlbnQgc29tZSBzY2hlbWUgbGlrZSB0 aGlzOgoKPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KQ1JFQVRF IFRBQkxFIGNhcGl0YWxzICgKICBuYW1lICAgICAgIHRleHQsCiAgcG9wdWxh dGlvbiByZWFsLAogIGFsdGl0dWRlICAgaW50LCAgICAtLSAoaW4gZnQpCiAg c3RhdGUgICAgICBjaGFyKDIpCik7CgpDUkVBVEUgVEFCTEUgbm9uX2NhcGl0 YWxzICgKICBuYW1lICAgICAgIHRleHQsCiAgcG9wdWxhdGlvbiByZWFsLAog IGFsdGl0dWRlICAgaW50ICAgICAtLSAoaW4gZnQpCik7CgpDUkVBVEUgVklF VyBjaXRpZXMgQVMKICBTRUxFQ1QgbmFtZSwgcG9wdWxhdGlvbiwgYWx0aXR1 ZGUgRlJPTSBjYXBpdGFscwogICAgVU5JT04KICBTRUxFQ1QgbmFtZSwgcG9w dWxhdGlvbiwgYWx0aXR1ZGUgRlJPTSBub25fY2FwaXRhbHM7CjwvcHJlPjxw PgoKICAgIFRoaXMgd29ya3MgT0sgYXMgZmFyIGFzIHF1ZXJ5aW5nIGdvZXMs IGJ1dCBpdCBnZXRzIHVnbHkgd2hlbiB5b3UKICAgIG5lZWQgdG8gdXBkYXRl IHNldmVyYWwgcm93cywgZm9yIG9uZSB0aGluZy4KICAgPC9wPjxwPgogICAg QSBiZXR0ZXIgc29sdXRpb24gaXMgdGhpczoKCjwvcD48cHJlIGNsYXNzPSJw cm9ncmFtbGlzdGluZyI+CkNSRUFURSBUQUJMRSBjaXRpZXMgKAogIG5hbWUg ICAgICAgdGV4dCwKICBwb3B1bGF0aW9uIHJlYWwsCiAgYWx0aXR1ZGUgICBp bnQgICAgIC0tIChpbiBmdCkKKTsKCkNSRUFURSBUQUJMRSBjYXBpdGFscyAo CiAgc3RhdGUgICAgICBjaGFyKDIpCikgSU5IRVJJVFMgKGNpdGllcyk7Cjwv cHJlPjxwPgogICA8L3A+PHA+CiAgICBJbiB0aGlzIGNhc2UsIGEgcm93IG9m IDxjb2RlIGNsYXNzPSJjbGFzc25hbWUiPmNhcGl0YWxzPC9jb2RlPgogICAg PGVtIGNsYXNzPSJmaXJzdHRlcm0iPmluaGVyaXRzPC9lbT4gYWxsIGNvbHVt bnMgKDxjb2RlIGNsYXNzPSJ2YXJuYW1lIj5uYW1lPC9jb2RlPiwKICAgIDxj b2RlIGNsYXNzPSJ2YXJuYW1lIj5wb3B1bGF0aW9uPC9jb2RlPiwgYW5kIDxj b2RlIGNsYXNzPSJ2YXJuYW1lIj5hbHRpdHVkZTwvY29kZT4pIGZyb20gaXRz CiAgICA8ZW0gY2xhc3M9ImZpcnN0dGVybSI+cGFyZW50PC9lbT4sIDxjb2Rl IGNsYXNzPSJjbGFzc25hbWUiPmNpdGllczwvY29kZT4uICBUaGUKICAgIHR5 cGUgb2YgdGhlIGNvbHVtbiA8Y29kZSBjbGFzcz0idmFybmFtZSI+bmFtZTwv Y29kZT4gaXMKICAgIDxzcGFuIGNsYXNzPSJ0eXBlIj50ZXh0PC9zcGFuPiwg YSBuYXRpdmUgPHNwYW4gY2xhc3M9InByb2R1Y3RuYW1lIj5Qb3N0Z3JlU1FM PC9zcGFuPgogICAgdHlwZSBmb3IgdmFyaWFibGUgbGVuZ3RoIGNoYXJhY3Rl ciBzdHJpbmdzLiAgU3RhdGUgY2FwaXRhbHMgaGF2ZQogICAgYW4gZXh0cmEg Y29sdW1uLCA8Y29kZSBjbGFzcz0idmFybmFtZSI+c3RhdGU8L2NvZGU+LCB0 aGF0IHNob3dzIHRoZWlyIHN0YXRlLiAgSW4KICAgIDxzcGFuIGNsYXNzPSJw cm9kdWN0bmFtZSI+UG9zdGdyZVNRTDwvc3Bhbj4sIGEgdGFibGUgY2FuIGlu aGVyaXQgZnJvbQogICAgemVybyBvciBtb3JlIG90aGVyIHRhYmxlcy4KICAg PC9wPjxwPgogICAgRm9yIGV4YW1wbGUsIHRoZSAgZm9sbG93aW5nICBxdWVy eSBmaW5kcyB0aGUgIG5hbWVzICBvZiAgYWxsICBjaXRpZXMsCiAgICBpbmNs dWRpbmcgIHN0YXRlIGNhcGl0YWxzLCB0aGF0IGFyZSBsb2NhdGVkIGF0IGFu IGFsdGl0dWRlCiAgICBvdmVyIDUwMCBmZWV0OgoKPC9wPjxwcmUgY2xhc3M9 InByb2dyYW1saXN0aW5nIj4KU0VMRUNUIG5hbWUsIGFsdGl0dWRlCiAgRlJP TSBjaXRpZXMKICBXSEVSRSBhbHRpdHVkZSBfX2d0X18gNTAwOwo8L3ByZT48 cD4KCiAgICB3aGljaCByZXR1cm5zOgoKPC9wPjxwcmUgY2xhc3M9InNjcmVl biI+CiAgIG5hbWUgICAgfCBhbHRpdHVkZQotLS0tLS0tLS0tLSstLS0tLS0t LS0tCiBMYXMgVmVnYXMgfCAgICAgMjE3NAogTWFyaXBvc2EgIHwgICAgIDE5 NTMKIE1hZGlzb24gICB8ICAgICAgODQ1CigzIHJvd3MpCjwvcHJlPjxwPgog ICA8L3A+PHA+CiAgICBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlICBmb2xsb3dp bmcgIHF1ZXJ5ICBmaW5kcwogICAgYWxsICB0aGUgY2l0aWVzIHRoYXQgYXJl IG5vdCBzdGF0ZSBjYXBpdGFscyBhbmQKICAgIGFyZSBzaXR1YXRlZCBhdCBh biBhbHRpdHVkZSBvdmVyIDUwMCBmZWV0OgoKPC9wPjxwcmUgY2xhc3M9InBy b2dyYW1saXN0aW5nIj4KU0VMRUNUIG5hbWUsIGFsdGl0dWRlCiAgICBGUk9N IE9OTFkgY2l0aWVzCiAgICBXSEVSRSBhbHRpdHVkZSBfX2d0X18gNTAwOwo8 L3ByZT48cD4KCjwvcD48cHJlIGNsYXNzPSJzY3JlZW4iPgogICBuYW1lICAg IHwgYWx0aXR1ZGUKLS0tLS0tLS0tLS0rLS0tLS0tLS0tLQogTGFzIFZlZ2Fz IHwgICAgIDIxNzQKIE1hcmlwb3NhICB8ICAgICAxOTUzCigyIHJvd3MpCjwv cHJlPjxwPgogICA8L3A+PHA+CiAgICBIZXJlIHRoZSA8Y29kZSBjbGFzcz0i bGl0ZXJhbCI+T05MWTwvY29kZT4gYmVmb3JlIDxjb2RlIGNsYXNzPSJsaXRl cmFsIj5jaXRpZXM8L2NvZGU+CiAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgcXVl cnkgc2hvdWxkIGJlIHJ1biBvdmVyIG9ubHkgdGhlCiAgICA8Y29kZSBjbGFz cz0iY2xhc3NuYW1lIj5jaXRpZXM8L2NvZGU+IHRhYmxlLCBhbmQgbm90IHRh YmxlcyBiZWxvdwogICAgPGNvZGUgY2xhc3M9ImNsYXNzbmFtZSI+Y2l0aWVz PC9jb2RlPiBpbiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5LiAgTWFueQog ICAgb2YgdGhlIGNvbW1hbmRzIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IGRpc2N1 c3NlZCBfX21kYXNoX18KICAgIDxzcGFuIGNsYXNzPSJjb21tYW5kIj48c3Ry b25nPlNFTEVDVDwvc3Ryb25nPjwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJjb21t YW5kIj48c3Ryb25nPlVQREFURTwvc3Ryb25nPjwvc3Bhbj4sIGFuZAogICAg PHNwYW4gY2xhc3M9ImNvbW1hbmQiPjxzdHJvbmc+REVMRVRFPC9zdHJvbmc+ PC9zcGFuPiBfX21kYXNoX18gc3VwcG9ydCB0aGlzIDxjb2RlIGNsYXNzPSJs aXRlcmFsIj5PTkxZPC9jb2RlPgogICAgbm90YXRpb24uCiAgIDwvcD48ZGl2 IGNsYXNzPSJub3RlIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDAuNWluOyBtYXJn aW4tcmlnaHQ6IDAuNWluOyI+PGgzIGNsYXNzPSJ0aXRsZSI+Tm90ZTwvaDM+ PHA+CiAgICAgQWx0aG91Z2ggaW5oZXJpdGFuY2UgaXMgZnJlcXVlbnRseSB1 c2VmdWwsIGl0IGhhcyBub3QgYmVlbiBpbnRlZ3JhdGVkCiAgICAgd2l0aCB1 bmlxdWUgY29uc3RyYWludHMgb3IgZm9yZWlnbiBrZXlzLCB3aGljaCBsaW1p dHMgaXRzIHVzZWZ1bG5lc3MuCiAgICAgU2VlIDxhIGNsYXNzPSJ4cmVmIiBo cmVmPSIjIj4/Pz88L2E+IGZvciBtb3JlIGRldGFpbC4KICAgIDwvcD48L2Rp dj48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0aW9uIj48ZGl2IGNsYXNzPSJ0aXRs ZXBhZ2UiPjxkaXY+PGRpdj48aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xl YXI6IGJvdGgiPjxhIG5hbWU9InR1dG9yaWFsLWNvbmNsdXNpb24iPjwvYT5D b25jbHVzaW9uPC9oMj48L2Rpdj48L2Rpdj48L2Rpdj48cD4KICAgIDxzcGFu IGNsYXNzPSJwcm9kdWN0bmFtZSI+UG9zdGdyZVNRTDwvc3Bhbj4gaGFzIG1h bnkgZmVhdHVyZXMgbm90CiAgICB0b3VjaGVkIHVwb24gaW4gdGhpcyB0dXRv cmlhbCBpbnRyb2R1Y3Rpb24sIHdoaWNoIGhhcyBiZWVuCiAgICBvcmllbnRl ZCB0b3dhcmQgbmV3ZXIgdXNlcnMgb2YgPGFjcm9ueW0gY2xhc3M9ImFjcm9u eW0iPlNRTDwvYWNyb255bT4uICBUaGVzZQogICAgZmVhdHVyZXMgYXJlIGRp c2N1c3NlZCBpbiBtb3JlIGRldGFpbCBpbiB0aGUgcmVtYWluZGVyIG9mIHRo aXMKICAgIGJvb2suCiAgIDwvcD48cD4KICAgIElmIHlvdSBmZWVsIHlvdSBu ZWVkIG1vcmUgaW50cm9kdWN0b3J5IG1hdGVyaWFsLCBwbGVhc2UgdmlzaXQg dGhlIFBvc3RncmVTUUwKICAgIDxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0 cDovL3d3dy5wb3N0Z3Jlc3FsLm9yZyIgdGFyZ2V0PSJfdG9wIj53ZWIgc2l0 ZTwvYT4KICAgIGZvciBsaW5rcyB0byBtb3JlIHJlc291cmNlcy4KICAgPC9w PjwvZGl2PjxkaXYgY2xhc3M9ImZvb3Rub3RlcyI+PGJyPjxociBzdHlsZT0i d2lkdGg6MTAwOyB0ZXh0LWFsaWduOmxlZnQ7bWFyZ2luLWxlZnQ6IDAiPjxk aXYgaWQ9ImZ0bi5pZG00NjA0NTE0MzkxOTQ1NiIgY2xhc3M9ImZvb3Rub3Rl Ij48cD48YSBocmVmPSIjaWRtNDYwNDUxNDM5MTk0NTYiIGNsYXNzPSJwYXJh Ij48c3VwIGNsYXNzPSJwYXJhIj5bMV0gPC9zdXA+PC9hPgogICAgICAgVGhl cmUgYXJlIG9wdGlvbnMgdG8gZGVmaW5lIHRoZSB3aW5kb3cgZnJhbWUgaW4g b3RoZXIgd2F5cywgYnV0CiAgICAgICB0aGlzIHR1dG9yaWFsIGRvZXMgbm90 IGNvdmVyIHRoZW0uICBTZWUKICAgICAgIDxhIGNsYXNzPSJ4cmVmIiBocmVm PSIjIj4/Pz88L2E+IGZvciBkZXRhaWxzLgogICAgICA8L3A+PC9kaXY+PC9k aXY+PC9kaXY+PC9ib2R5PjwvaHRtbD4K --------------090201030506000100060508 Content-Type: text/x-xslfo; name="advanced.fo" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="advanced.fo" = = Advanced Featur= es= = Advanced Features<= fo:block>= = = <= fo:table-column column-number=3D"3" column-width=3D"proportional-column-wid= th(1)"/>Chapter=C2=A01.=C2=A0Advanced FeaturesTable of ContentsIntroductionViews<= /fo:inline>Foreign KeysTransactionsWindow FunctionsInheritanceConclusion<= fo:marker marker-class-name=3D"section.head.marker">IntroductionIntroduction In the previous chapter we have covered the basics of using SQL to store and access your data in PostgreSQL. We will now discuss some more advanced features of SQL that simplify management and prevent loss or corruption of your data. Finally, we will look at some PostgreSQL extensions. This chapter will on occasion refer to examples found in ???= to change or improve them, so it will be useful to have read that chapter. Some examples from this chapter can also be found in advanced.sql in the tu= torial directory. This file also contains some sample data to load, which is not repeated here. (Refer to ??? for how to use the file.) Views= Views Refer back to the queries in ???. Suppose the combined listing of weather records and city location is of particular interest to your application, but you do not want to type the query each time you need it. You can create a view over the query, which= gives a name to the query that you can refer to like an ordinary table: CREATE VIEW myview AS SELECT city, temp_lo, temp_hi, prcp, date, location FROM weather, cities WHERE city =3D name; SELECT * FROM myview; Making liberal use of views is a key aspect of good SQL database design. Views allow you to encapsulate the details of the structure of your tables, which might change as your application evolves, behind consistent interfaces. Views can be used in almost any place a real table can be used. Building views upon other views is not uncommon. <= fo:block margin-left=3D"0pt" font-family=3D"sans-serif,Symbol,ZapfDingbats"= keep-together.within-column=3D"always">Foreign KeysForeign Keys<= fo:wrapper id=3D"idm45796159878016"> Recall the weather and cities tables from ???. Consider the following problem: You want to make sure that no one can insert rows in the weather table that do = not have a matching entry in the cities ta= ble. This is called maintaining the referential integrity<= /fo:inline> of your data. In simplistic database systems this would be implemented (if at all) by first looking at the cities table to check = if a matching record exists, and then inserting or rejecting the new weather records. This= approach has a number of problems and is very inconvenient, so PostgreSQL can do this for you. The new declaration of the tables would look like this: CREATE TABLE cities ( city varchar(80) primary key, location point ); CREATE TABLE weather ( city varchar(80) references cities(city), temp_lo int, temp_hi int, prcp real, date date ); Now try inserting an invalid record: INSERT INTO weather VALUES ('Berkeley', 45, 53, 0.0, '1994-11-28'); ERROR: insert or update on table "weather" violates foreign key constraint= "weather_city_fkey" DETAIL: Key (city)=3D(Berkeley) is not present in table "cities". The behavior of foreign keys can be finely tuned to your application. We will not go beyond this simple example in this tutorial, but just refer you to ??? for more information. Making correct use of foreign keys will definitely improve the quality of your database applications, so you are strongly encouraged to learn about them. <= fo:block>TransactionsTransactions Transactions are a fundame= ntal concept of all database systems. The essential point of a transaction is that it bundles multiple steps into a single, all-or-nothing operation. The intermedia= te states between the steps are not visible to other concurrent transactio= ns, and if some failure occurs that prevents the transaction from completin= g, then none of the steps affect the database at all. For example, consider a bank database that contains balances for various customer accounts, as well as total deposit balances for branches. Suppose that we want to record a payment of $100.00 from Alice's account to Bob's account. Simplifying outrageously, the SQL commands for this might look like: UPDATE accounts SET balance =3D balance - 100.00 WHERE name =3D 'Alice'; UPDATE branches SET balance =3D balance - 100.00 WHERE name =3D (SELECT branch_name FROM accounts WHERE name =3D 'Alice'= ); UPDATE accounts SET balance =3D balance + 100.00 WHERE name =3D 'Bob'; UPDATE branches SET balance =3D balance + 100.00 WHERE name =3D (SELECT branch_name FROM accounts WHERE name =3D 'Bob'); The details of these commands are not important here; the important point is that there are several separate updates involved to accomplish this rather simple operation. Our bank's officers will want to be assured that either all these updates happen, or none of them happen. It would certainly not do for a system failure to result in Bob receiving $100.00 that was not debited from Alice. Nor would Alice long remain a happy customer if she was debited without Bob being credited. We need a guarantee that if something goes wrong partway through the operation, none of the steps executed so far will take effect. Grouping the updates into a transaction gives us this guarantee. A transaction is said to be atomic: from the point of view of other transactions, it either happens completely or not at all. We also want a guarantee that once a transaction is completed and acknowledged by the database system, it has indeed been permanently recorded and won't be lost even if a crash ensues shortly thereafter. For example, if we are recording a cash withdrawal by Bob, we do not want any chance that the debit to his account will disappear in a crash just after he walks out the bank door. A transactional database guarantees that all the updates made by a transaction are logged in permanent storage (i.e., on disk) before the transaction is reported complete. Another important property of transactional databases is closely related to the notion of atomic updates: when multiple transactions are running concurrently, each one should not be able to see the incomplete changes made by others. For example, if one transaction is busy totalling all the branch balances, it would not do for it to include the debit from Alice's branch but not the credit to Bob's branch, nor vice versa. So transactions must be all-or-nothing not only in terms of their permanent effect on the database, but also in terms of their visibility as they happen. The updates made so far by an open transaction are invisible to other transactions until the transaction completes, whereupon all the updates become visible simultaneously. In PostgreSQL, a transaction is set up by surrounding the SQL commands of the transaction with BEGIN and COMMIT commands. So our banking transaction would actually look like: BEGIN; UPDATE accounts SET balance =3D balance - 100.00 WHERE name =3D 'Alice'; -- etc etc COMMIT; If, partway through the transaction, we decide we do not want to commit (perhaps we just noticed that Alice's balance went negative), we can issue the command ROLLBACK instead of COMMIT, and all our updates= so far will be canceled. PostgreSQL actually treats every SQL statement as being executed within a transaction. If you do not issue a BEGIN command, then each individual statement has an implicit BEGIN and (if successful) COMMIT wrap= ped around it. A group of statements surrounded by BEGIN and COMMIT is sometimes called a transaction bloc= k. Not= e Some client libraries issue BEGIN and COMMIT commands automatically, so that you might get the effect of transaction blocks without asking. Check the documentation for the interface you are using. It's possible to control the statements in a transaction in a more granular fashion through the use of sa= vepoints. Savepoints allow you to selectively discard parts of the transaction, while committing the rest. After defining a savepoint with SAVEPOINT, you can if neede= d roll back to the savepoint with ROLLBACK TO. All the = transaction's database changes between defining the savepoint and rolling back to it are discarded, but changes earlier than the savepoint are kept. After rolling back to a savepoint, it continues to be defined, so you c= an roll back to it several times. Conversely, if you are sure you won't n= eed to roll back to a particular savepoint again, it can be released, so the system can free some resources. Keep in mind that either releasing or rolling back to a savepoint will automatically release all savepoints that were defined after it. All this is happening within the transaction block, so none of it is visible to other database sessions. When and if you commit the transaction block, the committed actions become visible as a unit to other sessions, while the rolled-back actions never become visible at all. Remembering the bank database, suppose we debit $100.00 from Alice's account, and credit Bob's account, only to find later that we should have credited Wally's account. We could do it using savepoints like this: BEGIN; UPDATE accounts SET balance =3D balance - 100.00 WHERE name =3D 'Alice'; SAVEPOINT my_savepoint; UPDATE accounts SET balance =3D balance + 100.00 WHERE name =3D 'Bob'; -- oops ... forget that and use Wally's account ROLLBACK TO my_savepoint; UPDATE accounts SET balance =3D balance + 100.00 WHERE name =3D 'Wally'; COMMIT; This example is, of course, oversimplified, but there's a lot of control possible in a transaction block through the use of savepoints. Moreover, ROLLBACK TO is th= e only way to regain control of a transaction block that was put in aborted state by the system due to an error, short of rolling it back completely and starting again. Window FunctionsWindow Functions Inheritance is a concept from object-oriented databases. It opens up interesting new possibilities of database design. Let's create two tables: A table = cities and a table capitals. = Naturally, capitals are also cities, so you want some way to show the capitals implicitly when you list all cities. If you're really clever you might invent some scheme like this: CREATE TABLE capitals ( name text, population real, altitude int, -- (in ft) state char(2) ); CREATE TABLE non_capitals ( name text, population real, altitude int -- (in ft) ); CREATE VIEW cities AS SELECT name, population, altitude FROM capitals UNION SELECT name, population, altitude FROM non_capitals; This works OK as far as querying goes, but it gets ugly when you need to update several rows, for one thing. A better solution is this: CREATE TABLE cities ( name text, population real, altitude int -- (in ft) ); CREATE TABLE capitals ( state char(2) ) INHERITS (cities); In this case, a row of capitals inherits all columns (name, population, and altitude) from its parent, cities. The type of the column name is text, a native PostgreSQL type for variable length character strings. State capitals have an extra column, state= , that shows their state. In PostgreSQL, a table can inherit from zero or more other tables. For example, the following query finds the names of all cities, including state capitals, that are located at an altitude over 500 feet: SELECT name, altitude FROM cities WHERE altitude __gt__ 500; which returns: name | altitude -----------+---------- Las Vegas | 2174 Mariposa | 1953 Madison | 845 (3 rows) On the other hand, the following query finds all the cities that are not state capitals and are situated at an altitude over 500 feet: SELECT name, altitude FROM ONLY cities WHERE altitude __gt__ 500; name | altitude -----------+---------- Las Vegas | 2174 Mariposa | 1953 (2 rows) Here the ONLY before <= fo:inline font-family=3D"monospace">cities indicates that the query should be run over only the cities table, and not = tables below cities in the inherita= nce hierarchy. Many of the commands that we have already discussed __mdash__ SELECT, UPDATE, and DELETE __mdash__ support th= is ONLY notation. Not= e Although inheritance is frequently useful, it has not been integrated with unique constraints or foreign keys, which limits its usefulness. See ??? for more detail. <= fo:marker marker-class-name=3D"section.head.marker">Conclusion<= fo:block font-size=3D"20.736pt">Conclusion= PostgreSQL has many features not touched upon in this tutorial introduction, which has been oriented toward newer users of SQL. These features are discussed in more detail in the remainder of this book. If you feel you need more introductory material, please visit the Postg= reSQL = web site [http://www.postgresql.= org] for links to more resources. = --------------090201030506000100060508 Content-Type: application/pdf; name="advanced.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="advanced.pdf" JVBERi0xLjQKJaqrrK0KNCAwIG9iago8PAovQ3JlYXRvciAoQXBhY2hlIEZP UCBWZXJzaW9uIDEuMSkKL1Byb2R1Y2VyIChBcGFjaGUgRk9QIFZlcnNpb24g MS4xKQovQ3JlYXRpb25EYXRlIChEOjIwMTYwNDIwMTI0NTE2KzAyJzAwJykK Pj4KZW5kb2JqCjUgMCBvYmoKPDwKICAvTiAzCiAgL0xlbmd0aCAxMSAwIFIK ICAvRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeJztmWdQVFkWgO97 r3OgobtpMjQ5SZTQgOScJEgWFehuMi00OZiQwREYQUQkKYKIAg44OgQZRUUU A6KggHkaGQSUcXAUUVFZwB+zVbu1W1u1tX+2z4/3vjrn1jvnvrpV76t6AMiQ 4tkJybA+AAm8FL6vsx0zKDiEib0PcIAMSIAKMOHs5ERbb28PsBwra8E/xPtR AK3c7+n88/q/DBIngccBAKIvcyyHm8xe5p3LHM1J4Kzkp1c4PSUxBQDYe5np /OUBl5mzwhHfOGOFo75x0eoaP1/7ZT4KAI4UtcqEUyscscrUrhVmR/MTAJDu W16vwk7kLz9feqWX4rcZVkN0ZT/MKC6Pyw9P4XKY/+HW/n38XS908vLL/683 +B/3WTk73+it5eqZgBgVf+W2lgHAeg0AUvJXTuUwAJTdAHT0/JWLOA5AZwkA ks/Yqfy0bznU6uyAACiADqSAPFAGGkAHGAJTYAFsgCNwA17ADwSDzYANokEC 4IN0kAN2gXxQCErAQVAFakEDaAKt4AzoBOfBZXAN3AJ3wQh4DARgErwCc+A9 WIQgCAuRIRokBSlAqpA2ZAixICvIEfKAfKFgKAyKgnhQKpQD7YYKoVKoCqqD mqCfoHPQZegGNAQ9hMahGehP6BOMwCSYDsvBarAezIJtYXfYD94ER8FJcBac B++DK+B6+BTcAV+Gb8EjsAB+Bc8jACEiDEQR0UFYiD3ihYQgkQgf2Y4UIOVI PdKKdCP9yD1EgMwiH1EYFA3FROmgLFAuKH8UG5WE2o4qQlWhTqI6UH2oe6hx 1BzqK5qMlkVro83RruggdBQ6HZ2PLkc3otvRV9Ej6En0ewwGw8CoY0wxLphg TCwmG1OEOYxpw1zCDGEmMPNYLFYKq421xHphw7Ep2HxsJfYU9iJ2GDuJ/YAj 4hRwhjgnXAiOh8vFleOacT24YdwUbhEvilfFm+O98Bx8Jr4Y34Dvxt/BT+IX CWIEdYIlwY8QS9hFqCC0Eq4SnhDeEolEJaIZ0YcYQ9xJrCCeJl4njhM/kqgk LZI9KZSUStpHOkG6RHpIeksmk9XINuQQcgp5H7mJfIX8jPxBhCaiK+IqwhHZ IVIt0iEyLPKagqeoUmwpmylZlHLKWcodyqwoXlRN1F40XHS7aLXoOdEx0Xkx mpiBmJdYgliRWLPYDbFpKpaqRnWkcqh51GPUK9QJGkJTptnT2LTdtAbaVdok HUNXp7vSY+mF9B/pg/Q5caq4kXiAeIZ4tfgFcQEDYagxXBnxjGLGGcYo45OE nIStBFdir0SrxLDEgqSMpI0kV7JAsk1yRPKTFFPKUSpOar9Up9RTaZS0lrSP dLr0Eemr0rMydBkLGbZMgcwZmUeysKyWrK9stuwx2QHZeTl5OWe5RLlKuSty s/IMeRv5WPky+R75GQWagpVCjEKZwkWFl0xxpi0znlnB7GPOKcoquiimKtYp DiouKqkr+SvlKrUpPVUmKLOUI5XLlHuV51QUVDxVclRaVB6p4lVZqtGqh1T7 VRfU1NUC1faodapNq0uqu6pnqbeoP9Ega1hrJGnUa9zXxGiyNOM0D2ve1YK1 jLWitaq17mjD2ibaMdqHtYfWoNeYreGtqV8zpkPSsdVJ02nRGddl6Hro5up2 6r7WU9EL0duv16/3Vd9YP16/Qf+xAdXAzSDXoNvgT0MtQ7ZhteH9teS1Tmt3 rO1a+8ZI24hrdMTogTHN2NN4j3Gv8RcTUxO+SavJjKmKaZhpjekYi87yZhWx rpuhzezMdpidN/tobmKeYn7G/A8LHYs4i2aL6XXq67jrGtZNWCpZhlvWWQqs mFZhVketBNaK1uHW9dbPbZRtODaNNlO2mraxtqdsX9vp2/Ht2u0W7M3tt9lf ckAcnB0KHAYdqY7+jlWOz5yUnKKcWpzmnI2ds50vuaBd3F32u4y5yrmyXZtc 59xM3ba59bmT3De4V7k/99Dy4Ht0e8Kebp4HPJ+sV13PW9/pBbxcvQ54PfVW 907y/sUH4+PtU+3zwtfAN8e3fwNtw5YNzRve+9n5Ffs99tfwT/XvDaAEhAY0 BSwEOgSWBgqC9IK2Bd0Klg6OCe4KwYYEhDSGzG903Hhw42SocWh+6Ogm9U0Z m25slt4cv/nCFsqW8C1nw9BhgWHNYZ/DvcLrw+cjXCNqIubY9uxD7FccG04Z Z4ZryS3lTkVaRpZGTkdZRh2Imom2ji6Pno2xj6mKeRPrElsbuxDnFXcibik+ ML4tAZcQlnCOR+XF8fq2ym/N2DqUqJ2YnyhIMk86mDTHd+c3JkPJm5K7UujL H+mBVI3U71LH06zSqtM+pAekn80Qy+BlDGRqZe7NnMpyyjqejcpmZ/fmKObs yhnfZrutbju0PWJ77w7lHXk7Jnc67zy5i7ArbtftXP3c0tx3uwN3d+fJ5e3M m/jO+buWfJF8fv7YHos9td+jvo/5fnDv2r2Ve78WcApuFuoXlhd+LmIX3fzB 4IeKH5b2Re4bLDYpPlKCKeGVjO633n+yVKw0q3TigOeBjjJmWUHZu4NbDt4o NyqvPUQ4lHpIUOFR0VWpUllS+bkqumqk2q66rUa2Zm/NwmHO4eEjNkdaa+Vq C2s/HY05+qDOua6jXq2+/BjmWNqxFw0BDf3HWcebGqUbCxu/nOCdEJz0PdnX ZNrU1CzbXNwCt6S2zJwKPXX3R4cfu1p1WuvaGG2Fp8Hp1NMvfwr7afSM+5ne s6yzrT+r/lzTTmsv6IA6MjvmOqM7BV3BXUPn3M71dlt0t/+i+8uJ84rnqy+I XyjuIfTk9SxdzLo4fynx0uzlqMsTvVt6H18JunK/z6dv8Kr71evXnK5d6bft v3jd8vr5G+Y3zt1k3ey8ZXKrY8B4oP228e32QZPBjjumd7rumt3tHlo31DNs PXz5nsO9a/dd798aWT8yNOo/+mAsdEzwgPNg+mH8wzeP0h4tPt75BP2k4Kno 0/Jnss/qf9X8tU1gIrgw7jA+8HzD88cT7IlXvyX/9nky7wX5RfmUwlTTtOH0 +RmnmbsvN76cfJX4anE2/3ex32tea7z++Q+bPwbmguYm3/DfLP1Z9Fbq7Yl3 Ru96573nn71PeL+4UPBB6sPJj6yP/Z8CP00tpn/Gfq74ovml+6v71ydLCUtL QhcQuoDQBYQuIHQBoQsIXUDoAkIXELqA0AWELiB0AaELCF3g/9gFVv/jLAey cjk2BoBfNgAetwGorAJALRIASmgKNyNlpcrbymRvTczkx0RFp6xhpiZzmZF8 Ljc+c6X2N/sCCggKZW5kc3RyZWFtCmVuZG9iago2IDAgb2JqClsvSUNDQmFz ZWQgNSAwIFJdCmVuZG9iago3IDAgb2JqCjw8CiAgL1R5cGUgL01ldGFkYXRh CiAgL1N1YnR5cGUgL1hNTAogIC9MZW5ndGggMTIgMCBSCj4+CnN0cmVhbQo8 P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6 a2M5ZCI/Pjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iPgo8 cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIv MjItcmRmLXN5bnRheC1ucyMiPgo8cmRmOkRlc2NyaXB0aW9uIHhtbG5zOmRj PSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgcmRmOmFib3V0 PSIiPgo8ZGM6bGFuZ3VhZ2U+ZW48L2RjOmxhbmd1YWdlPgo8ZGM6Zm9ybWF0 PmFwcGxpY2F0aW9uL3BkZjwvZGM6Zm9ybWF0Pgo8ZGM6ZGF0ZT4yMDE2LTA0 LTIwVDEyOjQ1OjE2KzAyOjAwPC9kYzpkYXRlPgo8L3JkZjpEZXNjcmlwdGlv bj4KPHJkZjpEZXNjcmlwdGlvbiB4bWxuczpwZGY9Imh0dHA6Ly9ucy5hZG9i ZS5jb20vcGRmLzEuMy8iIHJkZjphYm91dD0iIj4KPHBkZjpQREZWZXJzaW9u PjEuNDwvcGRmOlBERlZlcnNpb24+CjxwZGY6UHJvZHVjZXI+QXBhY2hlIEZP UCBWZXJzaW9uIDEuMTwvcGRmOlByb2R1Y2VyPgo8L3JkZjpEZXNjcmlwdGlv bj4KPHJkZjpEZXNjcmlwdGlvbiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9i ZS5jb20veGFwLzEuMC8iIHJkZjphYm91dD0iIj4KPHhtcDpDcmVhdGVEYXRl PjIwMTYtMDQtMjBUMTI6NDU6MTYrMDI6MDA8L3htcDpDcmVhdGVEYXRlPgo8 eG1wOkNyZWF0b3JUb29sPkFwYWNoZSBGT1AgVmVyc2lvbiAxLjE8L3htcDpD cmVhdG9yVG9vbD4KPHhtcDpNZXRhZGF0YURhdGU+MjAxNi0wNC0yMFQxMjo0 NToxNiswMjowMDwveG1wOk1ldGFkYXRhRGF0ZT4KPC9yZGY6RGVzY3JpcHRp b24+CjwvcmRmOlJERj4KPC94OnhtcG1ldGE+PD94cGFja2V0IGVuZD0iciI/ PgoKZW5kc3RyZWFtCmVuZG9iagoxMCAwIG9iago8PCAvTGVuZ3RoIDEzIDAg UiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJzFGGtv2zbwu38F UQxIgjma3rI2DEW6OVu3rF0Tb/0wDwUt0zYXSXQlOa7//Y4PkdTDGbYPndvA d0fe8d48+uPEQy78u+ZfSeqjrJh8VDQPJT4KYkWKYuSFjh+hAik4QjnfZQF+ C8GX3ATADr2flBMX/TD5409YXCMXGI4Tty9OMD9M3lnn8xX3s5/vou3k1WLy 1W2EPBctNsZFQepEoQsfcNTMCfyUf3y0KNAflzfrJ1xmZI1uCW4OFamv/kSL nybzRceiwPP/B4veCR2ECSLOPvxPHBHszgIY112xEkHTDVUcGEgaUOTZfClX kVPfUhEJSnvk91k7XGOGa1vRzYzPevj5pEgih9OcWScd/LPh/8w+G4SRn33e mnA2yOwGr3LioCtYjp0EXS52tDaYDWc4z6ECNF5gWjbwR8utITY7YhDppa9u 474eXgr5m8SgxFChimxIRcqG4lxJmoEeZUO2FW1OrciBaX4SOG4Ugph4KNMI YhsDn9ihMtgaN9gx6OvSwDUt9jmtG5p1t69wTaxdp7ohRW0IDbhS6msHwHd7 yh3ZIedu9UFrdLkiGuSnkgJcQczy8pJuNIIbA+b58soIOWlwQ6vabMsZe5Tx GkiQkZNw6+V04OU4cjxokl4YR0NLMtrQtjWONVjXe4bZKMIz0mBMg9mOZI/G O5YfNFTgJtvZBlYkY5VxH/kEYaynw6gEvhME0Pu9WSDVwaVIdeiLqfBNaTBa 1qRqVNpLEqsMXJG/SNZdVlUhkZIcDXLe027sBF7kun4YDrU7wjW0I9X5aghn z3DbunL31I6htPUvMbzfVwxnO0PZYXvZsupQrIjlBVloEgYZENLCZizXwxiE YU9P0OSJVCdEy4yVT6SkUAtTVDP0K6ubbUUe3t2hDJdozRCvNbSBMEBRO0PR ceK4oQeyg0SKXkBEeCDWJMtxhRvKSgQq80CJ/KuRLEteMCinj0Sc8PXZcMEZ HqR3MvPSNIEOJA757n5+s5ijxc2ruzmSxYGWl0PtPC/ocSL1AaaTAJ5wle1w tbycuVDn+4oWGBzzSE4juez50RlxOcukqXsGHXWEM0h6nMurb0a2xc9aqpJz 3NTkH03t2arugwx8J1245H3mtLwas3x2znLozPsPOQMIDB/jTPuWdzh39Cyn 76ZnOPdVtpdQRXA+xur3/diywu1CDDTCGfTdqAM1fu37UeyEMXRgXxXAG3ZE jaittplBIdHyCed0jWRbeDbb/dRzfDd0oag8KfH1m4f5/QK9frN4q1Pg95u7 3+YPkAkXr0j1SHJyupiiMJqiKJjCJONO0QUYEV573rU/uxhNtgCyOeWtbBaF 8qD5/f3b+6+RUh1B0R/2wmGQ2PLyeKHOf4GeKMthSfQGQrclLxkE3aRuKj6+ 6J0feE592MDqixEVoCy6Knw/X9y8vgMdfgZxbUJ+u7xsrYS8hX5UsgaSgNTQ tkDZVjeZxS+c58IVxDD5pTGcGJh+xbtn4IR8RthhMKwyFNVtBdxaqglgVG0w 3jAtSRYfLUl+MnhzKOW4p1Bm4HZykhhcEjmVjcUx1PeW6CPNc4Nxt2hky2xt Tqy0j2zvIoGJKWykFoLE7/qKfMJ8J7/0Yczk97UGlUSFHBpWwZg51ZTVodHw X4faIKIJaQzMN0KYBnuq+UCNU8iaJPCHSr58+bK/P5g5MBvBRBSkw/36lA0z ihQQastMWCp0GCTxF9zOewKFsobaNnYdasMvckifoVJI4jyDRhw/C7s6tmEO HQ8GZAIJRRuVUoIEAazYE9G4GosE/PEAnacxe2VGC7DNNinWmrsFwcq+eqqp NbPZzebKMEILYOXWUg8uGTgJb2XWSw2NmJzgqhxxQhp3nYBXDLIITCt0hQd8 2k2CuFPlLgphJk08YA1CNQMvKlzWOBO2nH088Ukpjp2Ut143nZ3nHDQWYHB8 PmEFoMtQBpgKdOUjAanvzaFcY/4QEU8yToEOmpF9ozARK8GQtxusMHFUvY0c hcpuxiFS1/qtx3ExmAzEqu/GGKkooprF0g6PzDNhMuvZSIVw/jhdgVF8zlNo ccgbKruGwEHfvV4EnVgLY70DCisnU03P82tWXUNzUw8QQWV7UumSDOQDm1hi SVWQNeWXlz5XXFetkqQ5EvH2CMzr2ug3YnHq9ixWKZ+4YkqXrVciT7Sm8qml CDLbJczE/a1RHvBDxd/l1nYr56aGrF5OEhGvNAXXrLAO22CaH2zdWAYn1Jb4 HbYOg3sUXgBNZ52M6jJ0SuT6PadsKlbAGMCvCT77TJF44ZWsJO0rQMYfbza8 XXKCzmjQCmI98siIYFKJPZhn0kiNRLfyjo5C+fYU19LUUPgcQtfE2oMNuMLl o8HsticprXu0KP5bTG3z51hMzZqysbWBIZuyg7WawX0HAbKVyaAfgsstjbHF cCSy27crIw6BuanrkIbJHnIdzRzeJcie1bQxhI7SgtIqLZchytmOyPeqJD0c 9iCDGIL2i8CO1soRl9aKTHYJ618JFI4NuMength88mKS8Be8o7qupS3PK43d wMVELsYcE6Y9xyhfI9DqFVtdQOZJgoMexI9PmxNvKnCz8PsJ4pafRM4i8QRm RQFFJ9+/YsIp6HbXmLfrs4N8BLd4EAWunwRquP3t1+/5Y64NP3qYL5AKDPpW Q9dIGj9iHVyJXYn8IfP+x/n9HJVwj4CQC+makXE/dmfj6rSx/9fqxPynpufV WV4+zO/m3y3UIR8E+fb+7S/GCWPqj75XYv5zy3/w55fnDQj7ERr6kyfNN9av 0u8mfwM33U3lCmVuZHN0cmVhbQplbmRvYmoKOCAwIG9iago8PAogIC9SZXNv dXJjZXMgMyAwIFIKICAvVHlwZSAvUGFnZQogIC9NZWRpYUJveCBbMCAwIDYx MiA3OTJdCiAgL0Nyb3BCb3ggWzAgMCA2MTIgNzkyXQogIC9CbGVlZEJveCBb MCAwIDYxMiA3OTJdCiAgL1RyaW1Cb3ggWzAgMCA2MTIgNzkyXQogIC9QYXJl bnQgMSAwIFIKICAvQ29udGVudHMgMTAgMCBSCj4+CgplbmRvYmoKMTEgMCBv YmoKMjQ1MwplbmRvYmoKMTIgMCBvYmoKODU4CmVuZG9iagoxMyAwIG9iagoy MDkxCmVuZG9iagoxNSAwIG9iago8PCAvTGVuZ3RoIDE2IDAgUiAvRmlsdGVy IC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJzFGsty5Lbxrq/gIVWrrUgM3w+7 ctButI6S9a7XUuKD15XCcDAziDjEmCA11t+ngcaLHI5UycHZxKXuJtDdaDT6 AcyvF3EQwf+u5Z+yToJmf/GrpsVBmQRpoUl5EcRZmOTBPtBwHrRylAckBoI/ OAiAXfDTRXcRBd9d/PwLfFwHEUw4XkRzdmry/cUXT778Ev3u8qNge/Hu4eJP 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 LW8eX3hQKsMy0Tdgp4xCz07ZtPSE6JHLX5uUEA0i3YB84uYSZEGUnFFmoXys ieqyxBn3stGAZSaxujVvmc7ZiLcMuumeoWWQZBMzomf3MQZRRZaCT6XlgtyX fSqJirAqYbLcxZO5Trp2qVdUSZIiLDOdy0/ZveJSCRTLcQWz83TJgJ7xXHdj 1BsHvoeiR3oT3pQhHd9OETaXwohhKtLInm138yJMbiJkgakOW9WlXVdJaC8B NGLvCTSOIUQPnF4YI1F5q3C4ey/XBCJkDxI6wvsdbR7PiF/zZpRBikyF4L3S 0gTWDbTfkGaea+Wy62q2bGks2cSPQmq08OsS+esn6URlpC//7gYsWONYdpEH LkzPrylYTyPc8G7oeet93Hkjp/EXaXifjjDx5k3t/OLYvb4zR2wLM8cWn0mQ siFiN+HjNSELWo7CQ3DvET4fzjI4efIXaFBmntpPkCe68PBRpMlsoHrTFWfP VJlAypA/c4M65nSycq5atSH3IBB5ORocJn50qD4ytdcQISyghG1kx4E38khc M9GQfu0Isq3zmKORar+fqxf7OaQed6z1BmEPNujb8gUuPRXDkqdm2cwGN+aV S/0OZ8PMDbz+2Yz8K4xtNK5vSK5f6j5i+YvJSqabKl2Qen/zz9sfPt99eiEa QnquY9i6Ki4XGFxpBUwcs11dYp5FE/zxDCZX+Ysgju9gqoHEQJKYfXSN3/+4 3Cwt1E+FqyJf0lZ2gdfej0W/XPwHU+7ehAplbmRzdHJlYW0KZW5kb2JqCjE0 IDAgb2JqCjw8CiAgL1Jlc291cmNlcyAzIDAgUgogIC9UeXBlIC9QYWdlCiAg L01lZGlhQm94IFswIDAgNjEyIDc5Ml0KICAvQ3JvcEJveCBbMCAwIDYxMiA3 OTJdCiAgL0JsZWVkQm94IFswIDAgNjEyIDc5Ml0KICAvVHJpbUJveCBbMCAw IDYxMiA3OTJdCiAgL1BhcmVudCAxIDAgUgogIC9Db250ZW50cyAxNSAwIFIK Pj4KCmVuZG9iagoxNiAwIG9iagozNDIxCmVuZG9iagoxOCAwIG9iago8PCAv TGVuZ3RoIDE5IDAgUiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0K eJzFGWtv2zjyu38FPxzQFuto9Za1i/uQ9Nzd3LZNm/o2OGwXAS3Rtq56uHrE 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 rpdQRo00tfQqtpF9qeHIHg6SI642X5laz1LqeR9azrm8cicuN0OPRe0idIVm Bd7fVzntDvf3iqCeI1xtIMKsp/IFAScVrUI6xhOl12xFDhlY9IV6iwDSFTuo F4exii5jNRORno7o0ApsvJVHvqb+xFdIYZG2EC7onOAuRyo4MPGJ8B9D14vb mtwohIcClpWTPg+s5U8L3VDOvRdEcDlMeTfkprLS/czw1SqIxVNmZ2B8tUHY 9DySoJ5bEINSf7I4ca+rmY2BcT9aYhjNDhYGOppHxp5ZsjpoENtHg8v9pc2w hFH+4rdnT/MWlkcH29WmnQmVH09Cxa/XOc+TvoKof/FeFMEpHYe+669Wsu/8 sH69frnh/LxpXRLwtW6WBE1cEvqw/yjt/fiC3Py6viUfn7+7vN1cb65v3pKr vytOGH11e/OG8+P0ma43SmMniALXTwJ1Cih2Qv5A1fCV4fmD6B9YYZCZJ0B3 NZF7YX7fTb4GmPxm5PLX8rG9OXtgZXMkBM3zPPGN4NQEIHJ9flcY/2bEBv5X xJJEfMP/TCycsV8Rm6LY6GtixX8OvV/8CyZJHccKZW5kc3RyZWFtCmVuZG9i agoxNyAwIG9iago8PAogIC9SZXNvdXJjZXMgMyAwIFIKICAvVHlwZSAvUGFn ZQogIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCiAgL0Nyb3BCb3ggWzAgMCA2 MTIgNzkyXQogIC9CbGVlZEJveCBbMCAwIDYxMiA3OTJdCiAgL1RyaW1Cb3gg WzAgMCA2MTIgNzkyXQogIC9QYXJlbnQgMSAwIFIKICAvQ29udGVudHMgMTgg MCBSCj4+CgplbmRvYmoKMTkgMCBvYmoKMjI3OQplbmRvYmoKMjEgMCBvYmoK PDwgL0xlbmd0aCAyMiAwIFIgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3Ry ZWFtCnicxRrbkpy49b2/Qm8eV3oIAsQlebJ3x5dUsl6PJ7vl2tkH3KinqaWh DfTMTpU/Pkc6EhIgGDupctquQkdIR+emc2M+byjx4d+leCRZQHbHzWc1R0kS kDBWUywmNPICRo5EjRmpxCprEOgRPHARDA7k10298cnrzW+/w8uC+LDhYeNP 0cnNHzbvrfPFG/+7n++Tu83Lm81fXzFCfXKzNyIKM49FPvxAUKkXBpn4BeTm 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 c31RCCZsYOG8wwOi1TQk9T2aUd+naeZANARblnjZeqwVKSUEbT+CMmiOyFAi k/OtgZWAIpPEKWCImggWfA+1bWEmPj0ubFyupWIwm8TPRH77PzEb0thL2Cqb WJx7X0FVKMs0mqVRGjtQrlpzmIRre83pNedFZ4GNGUPdUZW70jIWMMHcEcRY Ek3wH0XLYUs+cdltJGXfwRhypBJMFhIOMPGy5dUjGVoTBQGtSWUt6ki008FN +ymLHCeuZqSQTK/tJUonDs6y2IO0x6dBQO0GD7OKXTmGqqMrwSylHcoZaYVy lOvBkOlKyHIluKwdMPeHphsAWaQyU2oz0xYwwkkTzxethjRxEX0bBOF92Yru +4BLfLOA+WnsDSF8Zz4E1dSPHZj0duX3HNxaRMrO0LNuTLMrt4TSEhyN7ye+ i3qR0q2Fk9hPJztMEzQaPh2I0b6seqUjCaOniGQbfFi0HFwi+ScT8+N+fXN1 fbXSB1rYtn36RMg84lioFSqeOYLX1+/+/bOseMC+1yueALxwnCRQvScuTAMp 6vPgKlUBlBoRA1wBc7H15sUvb396vUwJmGrEIK9IUurYrU9HFQ5KKfeGwkdP j1X/QwxVAWMY0QP1pVEO+bG554XjI7n464MRGdpzCdcXio63coNyrKtChFRV iMCRcwvS0Sdc/SZA48gLU0jwKcscpDxhXdnqZnM8eKjCpA/I0xIXHefWMhVP Q/zIYQFWIym0vxR4ZuqFGeo+saYnr0fEia8pDs2Iv+AYcXQ8V315wu+tLJw0 EEK7X9+ZKd0wRKiDsGbtl43pYaH1osj73ECqOsc35X7PdaamqFCfhxBCmeH4 yHObFmw6LuJZ9pI+FLmifqdR7JDLagCMwnBtrzldXTtHCR+Lv3oZ35FzL0L2 IxGtvhySSrCtodm3a6qKY3xTn+iITtRkpAfb0xEJv/Jbfw/1fvMfx048sgpl bmRzdHJlYW0KZW5kb2JqCjIwIDAgb2JqCjw8CiAgL1Jlc291cmNlcyAzIDAg UgogIC9UeXBlIC9QYWdlCiAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KICAv Q3JvcEJveCBbMCAwIDYxMiA3OTJdCiAgL0JsZWVkQm94IFswIDAgNjEyIDc5 Ml0KICAvVHJpbUJveCBbMCAwIDYxMiA3OTJdCiAgL1BhcmVudCAxIDAgUgog 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 Wdpvz3gap14S6jH/GZLIY75qvELsJ4k95uu2gPhtSTzmP0OSeszf7lfibGn+ C5sPCECQwi4noe7Of9LdRW7fBBSi62punhX0KlNXc/l40J5XWByrrh8s+ngD d+uyH+TjkpIit4fBxe3e8NLXex9ze29WA22jjnipcVPUo7o8qyH1+iWRw3ip q4INpecxMKF04Sc4bblwLZM/tD7yN7OqKOXDqiw/iFdxjhvuB1kAqhJCE5jP E1+mHxOI+JSQhNCE8v4Knfn3AovKbwrqw0EyCylQQd2OEuhDc5o4l8ZsXpxh cRzgJMIUEkilmnzo5e8V7UW+6g0tgmtw1Ui7VG8kWyI4oeXBfGVP/R3iz4fD CTJjGIe2q1iNDm3ZI/6SWIjDFtaeA/ShLJdVj1/8zbXP1erVq1dLAn4/SWEf hST1mcHdfigHVtW9dTL/DPM/iFmodQplbmRzdHJlYW0KZW5kb2JqCjIzIDAg b2JqCjw8CiAgL1Jlc291cmNlcyAzIDAgUgogIC9UeXBlIC9QYWdlCiAgL01l ZGlhQm94IFswIDAgNjEyIDc5Ml0KICAvQ3JvcEJveCBbMCAwIDYxMiA3OTJd CiAgL0JsZWVkQm94IFswIDAgNjEyIDc5Ml0KICAvVHJpbUJveCBbMCAwIDYx MiA3OTJdCiAgL1BhcmVudCAxIDAgUgogIC9Db250ZW50cyAyNCAwIFIKPj4K CmVuZG9iagoyNSAwIG9iagoyMDI5CmVuZG9iagoyNyAwIG9iago8PCAvTGVu Z3RoIDI4IDAgUiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJzF GV1z2zbyXb8Cb5VnZBYE+Nl7yDiJnPomjRtHV0+n6nggCZJ4pUiFhKT439/i QwREUrLzklMyQ+wC+73ALuCvAx9h+HctP3FK0Hwz+GpwPooJopFBhRHyA4+E aIPMOES5XOUMyHEEH70IBmv0OCgGGH0Y/PU3TC4QBoLDALfZKeIvg8+OfDmD f7h8jFaDt5PBz7ch8jGaLK2LaOqFAYYfOCrxKEnlj6DJBv01vFnsWTHnC3TL mdhVvL76G03+PRhPTiyiPvk/WPRZ6aBMUHEm8D/2VLBPJsC40xknERq8xSqB VOMAo2XLqdxEzny1Inqo7dHfs3ZgawZ2rTjNjB8q/HxSxKEncV5ykg7x2fD/ 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 Sxm33dS0CCfL0rZtJ94syuLpokcj3LXyZY9GpGvWyx6NaNuktkfRyx6NgnYK NH5Rfz36PPgftAbimwplbmRzdHJlYW0KZW5kb2JqCjI2IDAgb2JqCjw8CiAg L1Jlc291cmNlcyAzIDAgUgogIC9UeXBlIC9QYWdlCiAgL01lZGlhQm94IFsw IDAgNjEyIDc5Ml0KICAvQ3JvcEJveCBbMCAwIDYxMiA3OTJdCiAgL0JsZWVk Qm94IFswIDAgNjEyIDc5Ml0KICAvVHJpbUJveCBbMCAwIDYxMiA3OTJdCiAg L1BhcmVudCAxIDAgUgogIC9Db250ZW50cyAyNyAwIFIKPj4KCmVuZG9iagoy OCAwIG9iagoyMTMxCmVuZG9iagozMCAwIG9iago8PCAvTGVuZ3RoIDMxIDAg UiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJzFWFtznDYUft9f oUd7uqaSQICaJyezbt06dh1vk+lkMx6yK+8yZWEDWrvu5Mf3gAQIENSTh5Rk jG7fuR+dw36ZEYTh31n5CjhF6/3si14jKKDI9fUS8xHxHMrQHukxQ0l5yhjQ egQvdQgGO/Rhls4w+nn28RNsbhAGwNMM98lV4LvZrcG/3MHfnT9G29nr5ezH C4YIRsuH1kQud5iH4QFDhY5LeflQtNyjjyfnm8coXYsNuhCRPOaiOP2Elr/O FsuORi6h/4NGt5UMlQqVnyn8D5zK2Z0NUK67YwRCs96uVgxdtQYrine5lWjP 6bcSRA2VPuo9qgdu1cCmFt3I+K7Mx4MiYE655oSdcAhH3f+dbTZwY8m70Yb3 tfFCRLHj+mWU+0Tp8ubd4ny5QO8vFx/QOpaxKND5ndLPxLm0h0PobnG1eLNE abQXc3TIDsckknGWzlGUyFgeNwJdvLt5i9bRIZZRUgxpet6AJkJ/XF/eXA/P Mv9b+adZel/L8EoRtjgaWAShQzyOMcWhYrHcxQU6RQFBJ09Z/lc9vvlND6J6 5SHK+0tfjiJ/jtOtnm4zUcz1+PNR6lFcD7ZC1sDjNnmume5EqofP2VGPUgHX kBrKrMYcNpEUelKIR5FHiZ7l2VPD+CGrxczS+rTcgZDO0N6cO9wPwRhufQWi z0JKkaMiS46lnREYB9DFT7VNbeFGXNcJSYAxcb1OvC3PX18t6oBbnQwFIB7r IVHlaqQeKf6WcwuKBQNUGxooF1FiQ/l8gGqCCKE4lRXPszOQNE7Rg1ydWoiE pEdkdfpqeIzivl5di+hItdqEkqF2hSxdXz3rXZSvTqhNOEr7Gq5O0eX1L4t3 l8s74KUc0QhsTxDKiONjyEIa6iS8LOPzjGDieFUoFcZ0HRVibswjYwxRacyy B2MyGk0ECnTIGcYeDSyidK8ZiwIkDKbwFhH8AQkO+zjk3Gc2a8TpTuSxHBeB UlJmFecelPpJEaIkMU0JKbdPTeOuxu1EA+4ELuZhwJiFSZlDowK62J3Czl/i J4A7gedxzqAeDmm02TguhT9JoRNU6eZFMnHQi7iYWF1fp/p47HtkAg6Z1Irw kGd7S/r5LoCYsquKlerCP4OyGk4EnA/VPgig8QhtNA5RLlI5KnUIJTOEKxx7 3AKeD9kPzMZLtUFV16MWCurOGM836Ckn0E7Lf7kT7UQ+H4yZuhr0jnlMpcQL dKAuNFEYbMigcxiKMZkOlHlT2JZ7bDizqkztNGqHKYT9o6HD71kht7m4u70a U19VbD15jPI4+pwY24lIt3JnCTdoW3u+gtIQrcvyDWBQBCK1kDmU/sJpV+6k 6iL0tClFzcouejT2o7Qdg855ZEAr78zbhYnbCkLcoxCkLrfIXVW3ietqEmzw l7tIGqrvoCsyN0XcMQzwNMxyaejZuswgHlk8AMWmK4ysXLcGo+kygcqrAv0j 8gyBl/dZLlAGkuSoOllYerLyZvWoB0QDroheqPjww9ID0f6QqIrrt9niV1GU JNmTakarhao5bXbjdFNYUGVmNOsqD8uRrkzlUF0ADcc4XSfHjcGmaOIpbKPJ EFC7pCSaN+eSbA2oje0LhPS0BzyYs2nUMuh7EdR39CCEnOxKXcbgXnV56Ie6 u+18S3TrQQfoBz0g0h85xl3YAUAx7gM+QNe1aMW+v9/K+/tS8Mnmy4P6gn0K lYDqz5OnXbzeQUsrj3k63YV7rudwQsB0bvOhVffSXyfU9Ty/iztrnx/aoQXI wh7DK/gyei+28Pdr1atCK+tZcHAbdHFv4dI7ZEWENI5w5lpwIR3gNnEBHX+N Q6HHLDjeM8zqxEXlJ1PdQ9t9wYjvQC8NvggChbtRjbBZp9REpXQz3UHDMh85 2klTtdQkqj5Rp6qa1k3ikJT+rjI2Va5pXG4cTTNjp8lYTcaoABqq+60hnQJi qExcY9tkmVo+6WnYs+I3pDLzqcOgVWxvhRemMgu8HrCMkiqZb66v/hzNaAZt 1RD3XzltUvCr32A4JmHTSLwsHf3qRxgT+NJ89KufWjosxxOy+lnrdvYvrh0Q bAplbmRzdHJlYW0KZW5kb2JqCjI5IDAgb2JqCjw8CiAgL1Jlc291cmNlcyAz IDAgUgogIC9UeXBlIC9QYWdlCiAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0K ICAvQ3JvcEJveCBbMCAwIDYxMiA3OTJdCiAgL0JsZWVkQm94IFswIDAgNjEy IDc5Ml0KICAvVHJpbUJveCBbMCAwIDYxMiA3OTJdCiAgL1BhcmVudCAxIDAg UgogIC9Db250ZW50cyAzMCAwIFIKPj4KCmVuZG9iagozMSAwIG9iagoxNTQz CmVuZG9iagozMyAwIG9iago8PCAvVVJJIChodHRwOi8vd3d3LnBvc3RncmVz cWwub3JnKQovUyAvVVJJID4+CmVuZG9iagozNCAwIG9iago8PCAvVHlwZSAv QW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA0NzAuMzQ4IDQ5OS44MTcg NTA2LjgzMyA1MDguODE3IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAg MCBdCi9BIDMzIDAgUgovSCAvSQoKPj4KZW5kb2JqCjM2IDAgb2JqCjw8IC9U eXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUxNi4wOTggNDk5 LjgxNyA1MzkuOTk4IDUwOC44MTcgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBb IDAgMCAwIF0KL0EgMzMgMCBSCi9IIC9JCgo+PgplbmRvYmoKMzcgMCBvYmoK PDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTIwLjAg NDg3LjgxNyAyMDEuMSA0OTYuODE3IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIg WyAwIDAgMCBdCi9BIDMzIDAgUgovSCAvSQoKPj4KZW5kb2JqCjM4IDAgb2Jq Cjw8IC9MZW5ndGggMzkgMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0 cmVhbQp4nMVX227bOBB991fwMQEcRhR13Zeg26Z7QdttEC8WizQIFImOhMii Q1IxDPTjdyjKEq2Ld/uSdWKIM+KZ4ZkZDumXBUEO/F3oRxi7KN0sXlodQaGL aNCq/AARD7s+2qB27KNSz7IG7mEEDzMJBjn6a1EtHPTL4u4eXmbIAcBu4QzN NeDbxY3lX79x3ty/g54WP68Wlx99RBy0WvchojH2PQc+EKgIUzfWHxetNuju 7F32mlQpy9BHlqhaMHl+j1a/L65XR4wocf8HRjfNGhoKTZ5d+A9xk+yjF0Du +I1VCJ2+1zYOqdGBxvjWr8o2c+3TLMQMDR/znOXh9DQcm8VxZbyp8/miCH2s dTg6Kod4Nv1vHLNRGrXvjk08ZONFurJ9zSQIDBX0ORHFlssEoe9If0jsU0PP hrkOpoHeHAExuG9nLhJ8J7+dm8kTsQOY52JKAUUiamC/MsHQOfIDTNCZyvvx wcpozRHFvhvCiqMJc398+fT3rH/ihCegnedHtubiPyyE0ADHng4e8cfm0kIV h7YwtZbQPQHunBdVVqSJYtKKUaImA/ZSM7HvJJnzuswsTt1Q1FU35q9M9EJV 7n8sFTQMsePSOAoi94cj4BF6AtwvJHks2bITk6onVXE1LkzfG1hqDOj4edRE ouS7TpqlFsc4dqBUQkLHJv8tt9QHcOQ4XhiMwZ3vouqGJtoHdc5EofTx0uny golEpPked6rPSbXvBL6eNJXyzQYCJq2XTfEYYWfZT157ISkFS7LeeFbItJaS ZeNgB8GA3MPDJktk/vCADtEJR5ENcEDazjHC315/un6/OhHZADshAELqjsHL eafEIyeAf3798G51Pe81cjHRbcMNJigvUVOTc55dx8OEANgnE54/AN8Tnl3P w0EMABiMwaiPtqy3Wy4UUnkh0fx+9Xx9WIwMneyaNIgnQQi2X6IKXmGLu3cE hTMlJkAggI7bHi9fuGKzrmA+IT4m+mwNwae5apUKetlTDvV4Afs+HO6Qg1L2 47Vg0A0r1fSzVldLtq7LpQVQ/ThPLDTw6oVHxirbs2JPAvpx1ut2hbLWVlcF uO7llFdSiQSAlgcuBltJE4cb1zFxfQoVTxV6Znu5RLu8SHNUFpsCLOmvIVQx KTG6ZQwNTLpehD1dOr4XTxi/uroaAgKCI0fP8adWg2A5aKMPxoyppCi7rFN9 Fwjhl4OdSbh/+BH2KSyAeG3q3/MqLWsJFXPqhkAiDztEVxqsu8F95VI9CXZ7 80lHMIJbeZcwI2xMK2yldXsj7zVtQo2geJ3mJn9GUW951UuFNTabqZNqxUWR lPZcJXhWp3oTLHu1ydT0Ug/lZCSwB1U61VgJdMnjKCi+S0SGKraDIxtyLySC rg9BwWiVM8lQxzvROTr0bASErKxpUZ8Qgm2gJjMwBUYano+cP+OJex6JBgv5 TZ81FxTOBmCw57UlrRkrZ19WzES9FTfmjnUQu1jy5hLTzYK9poO+tHTbkiXS xr4W0mzmVjZH4EE6Lp9WOSAKtxBMPWjxJPYmKO/Yo4UFZ2wYKOrhSLfHMCIT eAt8N0RCh3fiWc+5UtufLi8n8kKd4SJ3O7w1XOVLibl4GqBgP+PDwTuG3w9n Uxd7bnvojac37aAsqmeJFDcVBn55LVImsfVr6GbxDzI4wQcKZW5kc3RyZWFt CmVuZG9iagozNSAwIG9iagpbCjM0IDAgUgozNiAwIFIKMzcgMCBSCl0KZW5k b2JqCjMyIDAgb2JqCjw8CiAgL1Jlc291cmNlcyAzIDAgUgogIC9UeXBlIC9Q YWdlCiAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KICAvQ3JvcEJveCBbMCAw IDYxMiA3OTJdCiAgL0JsZWVkQm94IFswIDAgNjEyIDc5Ml0KICAvVHJpbUJv eCBbMCAwIDYxMiA3OTJdCiAgL1BhcmVudCAxIDAgUgogIC9Bbm5vdHMgMzUg MCBSCiAgL0NvbnRlbnRzIDM4IDAgUgo+PgoKZW5kb2JqCjM5IDAgb2JqCjEy NDUKZW5kb2JqCjQxIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8K L0QgWzQwIDAgUiAvWFlaIDcyLjAgNTUzLjE5OSBudWxsXQo+PgplbmRvYmoK NDIgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDAgMCBS IC9YWVogNzIuMCA0MTUuOTQ4IG51bGxdCj4+CmVuZG9iago0MyAwIG9iago8 PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0MCAwIFIgL1hZWiA3Mi4w IDE1MS43ODUgbnVsbF0KPj4KZW5kb2JqCjQ0IDAgb2JqCjw8IC9UeXBlIC9B bm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEyMC4wIDYyNi42OTkgMTY5 LjQ0IDYzNS42OTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0K L0EgNDEgMCBSCi9IIC9JCgo+PgplbmRvYmoKNDYgMCBvYmoKPDwgL1R5cGUg L0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTM0Ljk5OSA2MjYuNjk5 IDUzOS45OTkgNjM1LjY5OSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAw IDAgXQovQSA0MSAwIFIKL0ggL0kKCj4+CmVuZG9iago0NyAwIG9iago8PCAv VHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMjAuMCA2MTQu Njk5IDE0NS41NSA2MjMuNjk5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAw IDAgMCBdCi9BIDQyIDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ4IDAgb2JqCjw8 IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzNS4wIDYx NC42OTkgNTQwLjAgNjIzLjY5OSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsg MCAwIDAgXQovQSA0MiAwIFIKL0ggL0kKCj4+CmVuZG9iago0OSAwIG9iago8 PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMjAuMCA2 MDIuNjk5IDE3NS4yOTEgNjExLjY5OSBdCi9DIFsgMCAwIDAgXQovQm9yZGVy IFsgMCAwIDAgXQovQSA0MyAwIFIKL0ggL0kKCj4+CmVuZG9iago1MCAwIG9i ago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzQu OTk4IDYwMi42OTkgNTM5Ljk5OCA2MTEuNjk5IF0KL0MgWyAwIDAgMCBdCi9C b3JkZXIgWyAwIDAgMCBdCi9BIDQzIDAgUgovSCAvSQoKPj4KZW5kb2JqCjUx IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzggMCBSIC9Y WVogNzIuMCAzMTkuNzM0IG51bGxdCj4+CmVuZG9iago1MiAwIG9iago8PCAv VHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMjAuMCA1OTAu Njk5IDE3MS4xIDU5OS42OTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAg MCAwIF0KL0EgNTEgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTMgMCBvYmoKPDwg L1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTM0Ljk5OSA1 OTAuNjk5IDUzOS45OTkgNTk5LjY5OSBdCi9DIFsgMCAwIDAgXQovQm9yZGVy IFsgMCAwIDAgXQovQSA1MSAwIFIKL0ggL0kKCj4+CmVuZG9iago1NCAwIG9i ago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFsxNyAwIFIgL1hZWiA3 Mi4wIDM0Mi40NDUgbnVsbF0KPj4KZW5kb2JqCjU1IDAgb2JqCjw8IC9UeXBl IC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEyMC4wIDU3OC42OTkg MTk3LjQ0OSA1ODcuNjk5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAg MCBdCi9BIDU0IDAgUgovSCAvSQoKPj4KZW5kb2JqCjU2IDAgb2JqCjw8IC9U eXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzNC45OTggNTc4 LjY5OSA1MzkuOTk4IDU4Ny42OTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBb IDAgMCAwIF0KL0EgNTQgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTcgMCBvYmoK PDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMjYgMCBSIC9YWVogNzIu MCAzNjIuOTI4IG51bGxdCj4+CmVuZG9iago1OCAwIG9iago8PCAvVHlwZSAv QW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMjAuMCA1NjYuNjk5IDE2 NC45OCA1NzUuNjk5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBd Ci9BIDU3IDAgUgovSCAvSQoKPj4KZW5kb2JqCjU5IDAgb2JqCjw8IC9UeXBl IC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzNC45OTkgNTY2LjY5 OSA1MzkuOTk5IDU3NS42OTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAg MCAwIF0KL0EgNTcgMCBSCi9IIC9JCgo+PgplbmRvYmoKNjAgMCBvYmoKPDwg L1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMzIgMCBSIC9YWVogNzIuMCA1 ODkuMiBudWxsXQo+PgplbmRvYmoKNjEgMCBvYmoKPDwgL1R5cGUgL0Fubm90 Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTIwLjAgNTU0LjY5OSAxNjUuNTYg NTYzLjY5OSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA2 MCAwIFIKL0ggL0kKCj4+CmVuZG9iago2MiAwIG9iago8PCAvVHlwZSAvQW5u b3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzUuMCA1NTQuNjk5IDU0MC4w IDU2My42OTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0Eg NjAgMCBSCi9IIC9JCgo+PgplbmRvYmoKNjMgMCBvYmoKPDwgL0xlbmd0aCA2 NCAwIFIgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCnicxd1bb9tI msbxe38KXqYXbg1Z9dZpBotGT5Ds9uwMZrpjdLCYGSwYibaJyKJbB2f87beK JYmURKf934vedANh0Q9P9ROL5GtF+uWqKsr437fpLxdUMX+4+mU/ryqcKrTd zzK2qGSmTPFQ7KdNsUyp0YQ6TMW/cihO3Bcfr1ZXZfEfV3//Z/zhoijjAl+u yvPV9Qt/uPpxtP30k/I33/54D3Sl/l/2IO1Dr9K7qPi/m/U4Jz8wUp7+ZAR3 nD/M7Teo87w4J287/Wi57+n933lH8mQ+nvz3i8dRDodRTvfj/gh/u42Xxd3V H2+ufvfeFFVZ3NwOr3NnZmnezKuQ/qji5qH4+5vqm38WN3+6endzwf8b99kF Y9r28Wh0oWTm+10/OaiyUNVMeVeWpbX5iN7e14/bZl1Us+L7xVO9mjeL4n1T b3frZpMPNq2uiq8SH5eqzlZn/UyV/Q98Xt1N/WnZFN1t8bZbbZvV9riOiw4W X4RqVukyBOvywj+stutusZtv226Vlzumq7KcicQNKZGL5WYXYU3CloQDCFeK hA0JexCO5iAsJOxAWBNBTQQ1EdREUIigEEEhgoYIGiJoiKAlgpYIWiJoiaAj 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 kvYVSgtKI8uALAOyDMgyEMtUFyZpYpnqwiBdEctUFyZpYpnqwiRNLFNdmKSR pUaWGllqZCnIUpClIEuDLA2yNMjSIEuLLC2ytMjSIUuHLB2y9MjSI0uPLD2y DMgyIMtALKUkllISSymJpVTEUipiKRWxlIpYiiKWoohlqguDtEaWGllqZCnI UpClIEtBlgZZGmR58jbS87SbqAvbsw9Kfdut5svdpu1W55Xe9F0Z8YnEGXu5 1EVZOIBw1X/tyevTBqU9Sfdfe/L6tKC0I+n+a09en9YoTSgrhSw1stTIUiNL QZaCLAVZGmRpkKVBlgZZWmRpkaVFlg5ZOmTpkKVHlh5ZemTpkWVAlgFZBmKZ PgeApIll+iQAkK6IZfosAJImlunTAEBaEcv0eQAkjSw1stTIUiNLQZaCLAVZ CrI0yNIgS4MsLbK0yNIiS4csHbJ0yNIhS48sPbL0yDIgy4AsA7HUJbHUJbHU JbHUJbHUFbHUFbHUFbHUilhqRSy1QpYaWWpkqZGlRpaCLAVZCrI0yNIgS4Ms LbK0yNIiS4ssHbJ0yNIhS48sPbL0yDIgy4AsUdlHo7qPoLqPoLqPoLqPoLqP oLqPoLqPoLqPoLqPoLqPoLqPoLqPoLqPoLqPoLqPoLqPoLqPoLqPoLqPoLpP /5VY56GQQ797r+Nz88xpW9zcDouU/Xe2xHRZKpUX+GG1XXeLXf+hAodl0zfz niwnPr/JScWdE+8OS6bPJYgXP1u82d43Q+Nx3Ty13W4zzJnf14/bZj3M+DKK 39dPo9a8e2rWzeKFVX+qN+18tOLudpjebdrV3dD88OOfRyvphunNtluPVlmv Rhur5/NmM1r/c7cb7fWi3tZDqx0d/9+6zfbby0J8/w6rk067Wzdxx2ZxyfSP dYo3H5vj5Jd2uTw2Vv2nPuTpRbuZ7/q9yu1N9zAs9ZAPJjfqxVN67/fiOOO2 qbe7dTMs23dYnswdlKe39/V2WH/78Lhsb5+HbdSr+q55aFZDJvdank7e8WcT h5/eqHVy+MsuHke3Lubder17TK+5Iu5R38upc2fF+3ZVL5fP10V8hfQdsuy6 z0Xcuf6gUzfnHiyaf22bVfqNxubivPD9g2y8lAfvjc4bvrlvUyfE09GPX465 ve/53OhWw+R8XqdNHGesm9vRYv2LKk82/6pjnzXDJm67Xd9DudUOq5h4LM5f 1WLtxG5/9913F8+MMosvq/yro8sFpnYuHu7qrhmOajiCCL3unoYfxXPt4frY 2gyraLfTnfVpWHa3aW53ywmL+HB+uo/5ZKxmbjj3+8a6qRfHxv4VmRt7sNlx xod8CuTGqPPzjNt19zBaUbs5X9HQrlfH6Xq5GXbs07D6A2VutcMCh+EynA+X 6esHgpU4zmqZOP7DWTrb/LJ8echN587L65jan6g30f3en3f/Lg6AbZ0Qv423 Az4NMOtmHmc+z4Z5+xNm37ptl83QOvRUbs271bZuV6P0foA6tHqd0db2o2hu bUdrWnb14npofrlv5/dDc7w/q247NNbNYxzm8jUjz7mPl5DRsfzjzU/7E/e4 0cuOSkWNXzv5bDXTVbw+Bxsm8sVtPLXu48AdjymeDUW6cqWOm/3jm1+5Kvff giKuLIPyeV0/t82Xzdeux+mNN5WLi1TB5EWGY7T5Ujn/PLT23WxHV9Tc+GXX rNt87uQZ+QWVpyd+d6RN/vCjy+1fdlf60jxrY3f5yk0sMBs29GH3+Nhtmhf2 cd49fGpXe+B+zrLdbPdX+zwj3wjk6S/x1XA/7or46u7Wi9Ex7q/5+7W32+fR mrt5vc1j/qFDNuPNTLxw0sdHnxzYY73etvPdsk77ICGfpnHYaTbb44weJE/u bzJyo36M1968C9fHmZ9223H6OL0YVpLPiDz9pV5Nbmj7/NgMjfthOr0Ino+t pu5Pu32sfWgmt71qepD94W1nx+n/HoXi+DrRYemzq086bL5OJ3ARh4X9K96e v+Ljc3m6ze3vjC+Xf4pny4snS3x8tTqdtDpMLFqk+83+VO07Id549KPOXfsU T4q6WNXx8GMXHgNFf2FKHZGuHfmGIP582X6O+x/vZtaLeAeTYvWnZfP7Fy8R sRvSG3qsVfHuSO9P+rc/vfv+5l3x8w/vPhYPz+mgiu8/XPZfekfN6YJF/PPh 3Z/fvb0p0qv5utg2D4//s+z2E/ftdfG4nj9ep5us5ro4vMYnVh3ZLled/rz/ 6a9/KfZn1nXaShw0JpaPI+T08h//891P7/q9K/6979U/TCztz3tkf1D/ljef ++QPXxsWTelmpffBB2XzKv5Sf96PFPH5NF1k2k/NOl/98oxdHndyI48jeTpt bDM029F0PUx+bp5H8zeP8Uo6vbq7rlsMrf3jSW6kS2J8tBntx6LZtHer2TDj 59OdiTfJ+XPhcjOfmPtGHuvzdLOa14+b3cSzianCWU8t0zkYl3R6po8jcG4s mniJX26GGfnAJpKb7To+TO7WzXT28EC1XzKdJJvrYcbxkp+bD+3d/XZoHm9k 9+1689KKR6PoMLN56pZPJ5v71Ny3q8VE38Tr8WnfxJucTbzmpEegfii/reOD 4sSTh0m/+otnkVehGl3J0ybTLzOPd5y5ke8y83R8GS6GVjtK1cuHrr9yHNqr 56HxuIx7MvrZMBnH1OXQ6rv6lbsxG5p/3LXLxf78yXOeTo9n99iN1tQdLryT 2XY0Ha9XE72XfgF50nu7Vbz4P3Sr2a/cQZn0CQjxAuF0JXnJwxd/D1/3PT1i WB1vaqQslfX2cCM1r5f59tjnh+NmaLw4ood4hdI+3hr6MLHO/cj54o6k77jW OpSlGDWx+LD9w63L13cmvd9Iiy9LN7W28eg9tS8+fGXhUb/0Z+/QPjx2jfft 5Hf54lS8eaym1jrxoBsPwYW4gBMzscBs2NLbdG4u9jd8l2K3XRorD3eLPlcs urjrD78f5uSbln1jf/90WFk3TD/UnyeesazI2d5t9gNg+n7I0bNs31p1w3S3 GsUOD6N9Iz5QNevRUusun0mHn47XPlrHi6+I9E8x4317fH2KndjhX3t9pn9F 95XFR3tzGGemDn3Rjbth9INjHaBv1cPkQ72d3+/t8pw4BPf3qv/nnujf7Hx4 O+3loYxPjnc3Vz/G//4XaRlPEQplbmRzdHJlYW0KZW5kb2JqCjQ1IDAgb2Jq ClsKNDQgMCBSCjQ2IDAgUgo0NyAwIFIKNDggMCBSCjQ5IDAgUgo1MCAwIFIK NTIgMCBSCjUzIDAgUgo1NSAwIFIKNTYgMCBSCjU4IDAgUgo1OSAwIFIKNjEg MCBSCjYyIDAgUgpdCmVuZG9iago0MCAwIG9iago8PAogIC9SZXNvdXJjZXMg MyAwIFIKICAvVHlwZSAvUGFnZQogIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJd CiAgL0Nyb3BCb3ggWzAgMCA2MTIgNzkyXQogIC9CbGVlZEJveCBbMCAwIDYx MiA3OTJdCiAgL1RyaW1Cb3ggWzAgMCA2MTIgNzkyXQogIC9QYXJlbnQgMSAw IFIKICAvQW5ub3RzIDQ1IDAgUgogIC9Db250ZW50cyA2MyAwIFIKPj4KCmVu ZG9iago2NCAwIG9iago0NjE3CmVuZG9iago2NSAwIG9iago8PAogIC9UeXBl IC9Gb250CiAgL1N1YnR5cGUgL1R5cGUxCiAgL0Jhc2VGb250IC9UaW1lcy1S b21hbgogIC9FbmNvZGluZyAvV2luQW5zaUVuY29kaW5nCj4+CgplbmRvYmoK NjYgMCBvYmoKPDwKICAvVHlwZSAvRm9udAogIC9TdWJ0eXBlIC9UeXBlMQog IC9CYXNlRm9udCAvSGVsdmV0aWNhLUJvbGQKICAvRW5jb2RpbmcgL1dpbkFu c2lFbmNvZGluZwo+PgoKZW5kb2JqCjY3IDAgb2JqCjw8CiAgL1R5cGUgL0Zv bnQKICAvU3VidHlwZSAvVHlwZTEKICAvQmFzZUZvbnQgL0NvdXJpZXIKICAv RW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZwo+PgoKZW5kb2JqCjY4IDAgb2Jq Cjw8CiAgL1R5cGUgL0ZvbnQKICAvU3VidHlwZSAvVHlwZTEKICAvQmFzZUZv bnQgL1RpbWVzLUl0YWxpYwogIC9FbmNvZGluZyAvV2luQW5zaUVuY29kaW5n Cj4+CgplbmRvYmoKNjkgMCBvYmoKPDwKICAvVHlwZSAvRm9udAogIC9TdWJ0 eXBlIC9UeXBlMQogIC9CYXNlRm9udCAvVGltZXMtQm9sZAogIC9FbmNvZGlu ZyAvV2luQW5zaUVuY29kaW5nCj4+CgplbmRvYmoKMSAwIG9iago8PCAvVHlw ZSAvUGFnZXMKL0NvdW50IDkKL0tpZHMgWzQwIDAgUiA4IDAgUiAxNCAwIFIg MTcgMCBSIDIwIDAgUiAyMyAwIFIgMjYgMCBSIDI5IDAgUiAzMiAwIFIgXSA+ PgplbmRvYmoKMiAwIG9iago8PAogIC9UeXBlIC9DYXRhbG9nCiAgL1BhZ2Vz IDEgMCBSCiAgL0xhbmcgKGVuKQogIC9NZXRhZGF0YSA3IDAgUgogIC9QYWdl TGFiZWxzIDkgMCBSCj4+CgplbmRvYmoKMyAwIG9iago8PAogIC9Gb250IDw8 CiAgL0Y1IDY1IDAgUgogIC9GMyA2NiAwIFIKICAvRjkgNjcgMCBSCiAgL0Y2 IDY4IDAgUgogIC9GNyA2OSAwIFIKPj4KCiAgL1Byb2NTZXQgWy9QREYgL0lt YWdlQiAvSW1hZ2VDIC9UZXh0XQogIC9Db2xvclNwYWNlIDw8IC9EZWZhdWx0 UkdCIDYgMCBSID4+Cgo+PgoKZW5kb2JqCjkgMCBvYmoKPDwgL051bXMgWzAg PDwgL1AgKDEpID4+CiAxIDw8IC9QICgyKSA+PgogMiA8PCAvUCAoMykgPj4K IDMgPDwgL1AgKDQpID4+CiA0IDw8IC9QICg1KSA+PgogNSA8PCAvUCAoNikg Pj4KIDYgPDwgL1AgKDcpID4+CiA3IDw8IC9QICg4KSA+PgogOCA8PCAvUCAo OSkgPj4KXSA+PgoKZW5kb2JqCnhyZWYKMCA3MAowMDAwMDAwMDAwIDY1NTM1 IGYgCjAwMDAwMzIwNzAgMDAwMDAgbiAKMDAwMDAzMjE4NCAwMDAwMCBuIAow MDAwMDMyMjg5IDAwMDAwIG4gCjAwMDAwMDAwMTUgMDAwMDAgbiAKMDAwMDAw MDE0NSAwMDAwMCBuIAowMDAwMDAyNjg0IDAwMDAwIG4gCjAwMDAwMDI3MTcg MDAwMDAgbiAKMDAwMDAwNTgzMiAwMDAwMCBuIAowMDAwMDMyNDcwIDAwMDAw IG4gCjAwMDAwMDM2NjUgMDAwMDAgbiAKMDAwMDAwNjAyNCAwMDAwMCBuIAow MDAwMDA2MDQ1IDAwMDAwIG4gCjAwMDAwMDYwNjUgMDAwMDAgbiAKMDAwMDAw OTU4MyAwMDAwMCBuIAowMDAwMDA2MDg2IDAwMDAwIG4gCjAwMDAwMDk3NzYg MDAwMDAgbiAKMDAwMDAxMjE1MiAwMDAwMCBuIAowMDAwMDA5Nzk3IDAwMDAw IG4gCjAwMDAwMTIzNDUgMDAwMDAgbiAKMDAwMDAxNTEzNiAwMDAwMCBuIAow MDAwMDEyMzY2IDAwMDAwIG4gCjAwMDAwMTUzMjkgMDAwMDAgbiAKMDAwMDAx NzQ1NSAwMDAwMCBuIAowMDAwMDE1MzUwIDAwMDAwIG4gCjAwMDAwMTc2NDgg MDAwMDAgbiAKMDAwMDAxOTg3NiAwMDAwMCBuIAowMDAwMDE3NjY5IDAwMDAw IG4gCjAwMDAwMjAwNjkgMDAwMDAgbiAKMDAwMDAyMTcwOSAwMDAwMCBuIAow MDAwMDIwMDkwIDAwMDAwIG4gCjAwMDAwMjE5MDIgMDAwMDAgbiAKMDAwMDAy Mzc2NCAwMDAwMCBuIAowMDAwMDIxOTIzIDAwMDAwIG4gCjAwMDAwMjE5ODYg MDAwMDAgbiAKMDAwMDAyMzcyMyAwMDAwMCBuIAowMDAwMDIyMTI2IDAwMDAw IG4gCjAwMDAwMjIyNjYgMDAwMDAgbiAKMDAwMDAyMjQwMiAwMDAwMCBuIAow MDAwMDIzOTc0IDAwMDAwIG4gCjAwMDAwMzEyOTUgMDAwMDAgbiAKMDAwMDAy Mzk5NSAwMDAwMCBuIAowMDAwMDI0MDc1IDAwMDAwIG4gCjAwMDAwMjQxNTUg MDAwMDAgbiAKMDAwMDAyNDIzNSAwMDAwMCBuIAowMDAwMDMxMTc3IDAwMDAw IG4gCjAwMDAwMjQzNzIgMDAwMDAgbiAKMDAwMDAyNDUxMiAwMDAwMCBuIAow MDAwMDI0NjQ5IDAwMDAwIG4gCjAwMDAwMjQ3ODUgMDAwMDAgbiAKMDAwMDAy NDkyMyAwMDAwMCBuIAowMDAwMDI1MDYzIDAwMDAwIG4gCjAwMDAwMjUxNDIg MDAwMDAgbiAKMDAwMDAyNTI3OCAwMDAwMCBuIAowMDAwMDI1NDE4IDAwMDAw IG4gCjAwMDAwMjU0OTggMDAwMDAgbiAKMDAwMDAyNTYzNiAwMDAwMCBuIAow MDAwMDI1Nzc2IDAwMDAwIG4gCjAwMDAwMjU4NTYgMDAwMDAgbiAKMDAwMDAy NTk5MyAwMDAwMCBuIAowMDAwMDI2MTMzIDAwMDAwIG4gCjAwMDAwMjYyMTEg MDAwMDAgbiAKMDAwMDAyNjM0OCAwMDAwMCBuIAowMDAwMDI2NDg0IDAwMDAw IG4gCjAwMDAwMzE1MDUgMDAwMDAgbiAKMDAwMDAzMTUyNiAwMDAwMCBuIAow MDAwMDMxNjM1IDAwMDAwIG4gCjAwMDAwMzE3NDcgMDAwMDAgbiAKMDAwMDAz MTg1MiAwMDAwMCBuIAowMDAwMDMxOTYyIDAwMDAwIG4gCnRyYWlsZXIKPDwK ICAvUm9vdCAyIDAgUgogIC9JbmZvIDQgMCBSCiAgL0lEIFs8OTFENUY2NUFF Mjk3MDdFOTEyNThCNUNBRkY2MTJBNUE+IDw5MUQ1RjY1QUUyOTcwN0U5MTI1 OEI1Q0FGRjYxMkE1QT5dCiAgL1NpemUgNzAKPj4Kc3RhcnR4cmVmCjMyNjQ0 CiUlRU9GCg== --------------090201030506000100060508 Content-Type: text/plain Content-Disposition: inline Content-Transfer-Encoding: 8bit MIME-Version: 1.0 -- Sent via pgsql-docs mailing list (pgsql-docs@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-docs --------------090201030506000100060508--