[open-ils-commits] [GIT] Evergreen ILS branch tags/rel_3_0_beta1 created. 76323c4e57714a927fb1f4aa91dfada26c55bc12

Evergreen Git git at git.evergreen-ils.org
Thu Sep 7 09:27:32 EDT 2017


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Evergreen ILS".

The branch, tags/rel_3_0_beta1 has been created
        at  76323c4e57714a927fb1f4aa91dfada26c55bc12 (commit)

- Log -----------------------------------------------------------------
commit 76323c4e57714a927fb1f4aa91dfada26c55bc12
Author: Dan Wells <dbw2 at calvin.edu>
Date:   Wed Sep 6 15:56:02 2017 -0400

    Bumping version numbers and adding Changelog
    
    Signed-off-by: Dan Wells <dbw2 at calvin.edu>

diff --git a/ChangeLog b/ChangeLog
index 1f72b2c..c240a6f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9549 @@
-Evergreen doesn't keep a GNU-style ChangeLog except in release tarballs.
-Those seeking a change log are encouraged to run 'git log -v', or read
-it online at: http://git.evergreen-ils.org/?p=Evergreen.git;a=log
+commit 56d044aa49f33e64a1748033ea854a38144d7625
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Mon Feb 24 12:09:57 2014 -0500
+
+    Bump OpenILS.pm version
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS.pm
+
+commit a8b6d7da24730d1fb0877cb991db20610522f91b
+Author: Jane Sandberg <sandbej at linnbenton.edu>
+Date:   Tue Sep 5 23:04:55 2017 -0700
+
+    Docs: copy-editing 3.0 release notes
+    
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+
+61	52	docs/RELEASE_NOTES_3.0.adoc
+
+commit 50b6c3da4e16012c0ff0fa092f7074b7cab0adfd
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Tue Sep 5 14:08:12 2017 -0400
+
+    add organizations who sponsored develpoment written by Equinox
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+8	1	docs/RELEASE_NOTES_3.0.adoc
+
+commit 3b3fe232a90f1eab5785d5b00b71dbfbf5eb0ae3
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Tue Sep 5 13:04:29 2017 -0400
+
+    start work on 3.0 release notes
+    
+    Generated from release note stubs; also includes note about
+    minimum PostgreSQL client and XUL deprecation.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1253	0	docs/RELEASE_NOTES_3.0.adoc
+ create mode 100644 docs/RELEASE_NOTES_3.0.adoc
+
+commit b045032fa1d9f5625bf22e33a8ee82b3a89c72c1
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Sep 5 15:53:08 2017 -0400
+
+    Incorporate view update from LP#1714589
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+34	3	Open-ILS/src/sql/Pg/version-upgrade/2.12.5-3.0-beta1-upgrade-db.sql
+
+commit 829a0f240f82b183401234af56f5572e210fa1c6
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Sep 5 14:33:30 2017 -0400
+
+    Proposed 2.12.5-3.0 upgrade SQL
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+6895	0	Open-ILS/src/sql/Pg/version-upgrade/2.12.5-3.0-beta1-upgrade-db.sql
+ create mode 100644 Open-ILS/src/sql/Pg/version-upgrade/2.12.5-3.0-beta1-upgrade-db.sql
+
+commit fbda8c2064916da3fdd83ffdb2b5f99afa8642d0
+Author: Jason Boyer <JBoyer at library.in.gov>
+Date:   Fri Sep 1 17:09:36 2017 -0400
+
+    LP1714589: Use Explicit Definition for aacs
+    
+    Spell out the expected fields in the expected order
+    for the aacs view because databases that have undergone
+    upgrades may drift when using * in a UNION.
+    
+    Signed-off-by:  <JBoyer at library.in.gov>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+34	1	Open-ILS/src/sql/Pg/upgrade/1051.schema.all-circs-slim.sql
+
+commit 154a152af9fa15bbd67c828419b1aaf3ad857757
+Author: Ben Shum <ben at evergreener.net>
+Date:   Mon Sep 4 00:17:22 2017 -0400
+
+    Translation updates - po files
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+2	2	build/i18n/po/AutoFieldWidget.js/ar-JO.po
+2	2	build/i18n/po/AutoFieldWidget.js/cs-CZ.po
+2	2	build/i18n/po/AutoFieldWidget.js/de-DE.po
+2	2	build/i18n/po/AutoFieldWidget.js/en-CA.po
+2	2	build/i18n/po/AutoFieldWidget.js/en-GB.po
+2	2	build/i18n/po/AutoFieldWidget.js/es-ES.po
+2	2	build/i18n/po/AutoFieldWidget.js/fi-FI.po
+2	2	build/i18n/po/AutoFieldWidget.js/fr-CA.po
+62	5	build/i18n/po/AutoFieldWidget.js/he-IL.po
+62	5	build/i18n/po/AutoFieldWidget.js/hu-HU.po
+2	2	build/i18n/po/AutoFieldWidget.js/hy-AM.po
+2	2	build/i18n/po/AutoFieldWidget.js/oc-FR.po
+2	2	build/i18n/po/AutoFieldWidget.js/pt-BR.po
+2	2	build/i18n/po/AutoFieldWidget.js/ru-RU.po
+62	5	build/i18n/po/AutoFieldWidget.js/sv-SE.po
+2	2	build/i18n/po/AutoFieldWidget.js/tr-TR.po
+3	3	build/i18n/po/FlattenerGrid.js/ar-JO.po
+2	2	build/i18n/po/FlattenerGrid.js/cs-CZ.po
+2	2	build/i18n/po/FlattenerGrid.js/de-DE.po
+2	2	build/i18n/po/FlattenerGrid.js/en-CA.po
+2	2	build/i18n/po/FlattenerGrid.js/es-ES.po
+5	4	build/i18n/po/FlattenerGrid.js/fi-FI.po
+2	2	build/i18n/po/FlattenerGrid.js/fr-CA.po
+34	0	build/i18n/po/FlattenerGrid.js/hy-AM.po
+2	2	build/i18n/po/PCrudFilterPane.js/ar-JO.po
+2	2	build/i18n/po/PCrudFilterPane.js/cs-CZ.po
+2	2	build/i18n/po/PCrudFilterPane.js/de-DE.po
+2	2	build/i18n/po/PCrudFilterPane.js/es-ES.po
+8	5	build/i18n/po/PCrudFilterPane.js/fi-FI.po
+125	0	build/i18n/po/PCrudFilterPane.js/hy-AM.po
+2	2	build/i18n/po/Searcher.js/ar-JO.po
+2	2	build/i18n/po/Searcher.js/cs-CZ.po
+2	2	build/i18n/po/Searcher.js/de-DE.po
+2	2	build/i18n/po/Searcher.js/en-CA.po
+2	2	build/i18n/po/Searcher.js/en-GB.po
+2	2	build/i18n/po/Searcher.js/es-ES.po
+2	2	build/i18n/po/Searcher.js/fi-FI.po
+2	2	build/i18n/po/Searcher.js/fr-CA.po
+2	2	build/i18n/po/Searcher.js/hy-AM.po
+2	2	build/i18n/po/Searcher.js/oc-FR.po
+2	2	build/i18n/po/Searcher.js/pt-BR.po
+2	2	build/i18n/po/Searcher.js/ru-RU.po
+2	2	build/i18n/po/TranslatorPopup.js/ar-JO.po
+2	2	build/i18n/po/TranslatorPopup.js/cs-CZ.po
+2	2	build/i18n/po/TranslatorPopup.js/de-DE.po
+2	2	build/i18n/po/TranslatorPopup.js/en-CA.po
+2	2	build/i18n/po/TranslatorPopup.js/en-GB.po
+2	2	build/i18n/po/TranslatorPopup.js/es-ES.po
+2	2	build/i18n/po/TranslatorPopup.js/fi-FI.po
+2	2	build/i18n/po/TranslatorPopup.js/fr-CA.po
+4	3	build/i18n/po/TranslatorPopup.js/he-IL.po
+4	3	build/i18n/po/TranslatorPopup.js/hu-HU.po
+2	2	build/i18n/po/TranslatorPopup.js/hy-AM.po
+2	2	build/i18n/po/TranslatorPopup.js/oc-FR.po
+2	2	build/i18n/po/TranslatorPopup.js/pt-BR.po
+2	2	build/i18n/po/TranslatorPopup.js/ru-RU.po
+4	3	build/i18n/po/TranslatorPopup.js/sv-SE.po
+2	2	build/i18n/po/TranslatorPopup.js/tr-TR.po
+2	2	build/i18n/po/URLVerify.js/ar-JO.po
+2	2	build/i18n/po/URLVerify.js/cs-CZ.po
+2	2	build/i18n/po/URLVerify.js/de-DE.po
+2	2	build/i18n/po/URLVerify.js/en-GB.po
+2	2	build/i18n/po/URLVerify.js/es-ES.po
+2	2	build/i18n/po/URLVerify.js/hy-AM.po
+2	2	build/i18n/po/URLVerify.js/pt-BR.po
+2	2	build/i18n/po/User.js/ar-JO.po
+2	2	build/i18n/po/User.js/cs-CZ.po
+2	2	build/i18n/po/User.js/de-DE.po
+2	2	build/i18n/po/User.js/en-CA.po
+2	2	build/i18n/po/User.js/en-GB.po
+2	2	build/i18n/po/User.js/es-ES.po
+2	2	build/i18n/po/User.js/fi-FI.po
+2	2	build/i18n/po/User.js/fr-CA.po
+4	3	build/i18n/po/User.js/he-IL.po
+4	3	build/i18n/po/User.js/hu-HU.po
+2	2	build/i18n/po/User.js/hy-AM.po
+2	2	build/i18n/po/User.js/oc-FR.po
+2	2	build/i18n/po/User.js/pt-BR.po
+2	2	build/i18n/po/User.js/ru-RU.po
+4	3	build/i18n/po/User.js/sv-SE.po
+2	2	build/i18n/po/User.js/tr-TR.po
+2	2	build/i18n/po/XULTermLoader.js/ar-JO.po
+2	2	build/i18n/po/XULTermLoader.js/cs-CZ.po
+2	2	build/i18n/po/XULTermLoader.js/de-DE.po
+2	2	build/i18n/po/XULTermLoader.js/en-CA.po
+2	2	build/i18n/po/XULTermLoader.js/en-GB.po
+2	2	build/i18n/po/XULTermLoader.js/es-ES.po
+2	2	build/i18n/po/XULTermLoader.js/fi-FI.po
+2	2	build/i18n/po/XULTermLoader.js/fr-CA.po
+7	4	build/i18n/po/XULTermLoader.js/he-IL.po
+7	4	build/i18n/po/XULTermLoader.js/hu-HU.po
+2	2	build/i18n/po/XULTermLoader.js/hy-AM.po
+2	2	build/i18n/po/XULTermLoader.js/oc-FR.po
+2	2	build/i18n/po/XULTermLoader.js/pt-BR.po
+2	2	build/i18n/po/XULTermLoader.js/ru-RU.po
+7	4	build/i18n/po/XULTermLoader.js/sv-SE.po
+2	2	build/i18n/po/XULTermLoader.js/tr-TR.po
+2	2	build/i18n/po/acq.js/ar-JO.po
+2	2	build/i18n/po/acq.js/cs-CZ.po
+2	2	build/i18n/po/acq.js/de-DE.po
+2	2	build/i18n/po/acq.js/en-CA.po
+2	2	build/i18n/po/acq.js/en-GB.po
+2	2	build/i18n/po/acq.js/es-ES.po
+2	2	build/i18n/po/acq.js/fi-FI.po
+2	2	build/i18n/po/acq.js/fr-CA.po
+365	171	build/i18n/po/acq.js/he-IL.po
+365	171	build/i18n/po/acq.js/hu-HU.po
+39	20	build/i18n/po/acq.js/hy-AM.po
+2	2	build/i18n/po/acq.js/oc-FR.po
+2	2	build/i18n/po/acq.js/pt-BR.po
+2	2	build/i18n/po/acq.js/ru-RU.po
+365	171	build/i18n/po/acq.js/sv-SE.po
+2	2	build/i18n/po/acq.js/tr-TR.po
+5	5	build/i18n/po/acq/ar-JO.po
+3	3	build/i18n/po/acq/cs-CZ.po
+3	3	build/i18n/po/acq/de-DE.po
+4	4	build/i18n/po/acq/es-ES.po
+1871	0	build/i18n/po/acq/hy-AM.po
+1853	0	build/i18n/po/acq/ru-RU.po
+3	3	build/i18n/po/actor/ar-JO.po
+3	3	build/i18n/po/actor/cs-CZ.po
+19	19	build/i18n/po/actor/de-DE.po
+3	3	build/i18n/po/actor/es-ES.po
+198	0	build/i18n/po/actor/hy-AM.po
+2	2	build/i18n/po/admin.properties/ar-JO.po
+2	2	build/i18n/po/admin.properties/cs-CZ.po
+2	2	build/i18n/po/admin.properties/de-DE.po
+2	2	build/i18n/po/admin.properties/en-CA.po
+2	2	build/i18n/po/admin.properties/en-GB.po
+2	2	build/i18n/po/admin.properties/es-ES.po
+2	2	build/i18n/po/admin.properties/fi-FI.po
+2	2	build/i18n/po/admin.properties/fr-CA.po
+38	4	build/i18n/po/admin.properties/he-IL.po
+38	4	build/i18n/po/admin.properties/hu-HU.po
+2	2	build/i18n/po/admin.properties/hy-AM.po
+2	2	build/i18n/po/admin.properties/oc-FR.po
+2	2	build/i18n/po/admin.properties/pt-BR.po
+2	2	build/i18n/po/admin.properties/ru-RU.po
+38	4	build/i18n/po/admin.properties/sv-SE.po
+2	2	build/i18n/po/admin.properties/tr-TR.po
+2	2	build/i18n/po/auth.properties/ar-JO.po
+2	2	build/i18n/po/auth.properties/cs-CZ.po
+2	2	build/i18n/po/auth.properties/de-DE.po
+2	2	build/i18n/po/auth.properties/en-CA.po
+2	2	build/i18n/po/auth.properties/en-GB.po
+2	2	build/i18n/po/auth.properties/es-ES.po
+2	2	build/i18n/po/auth.properties/fi-FI.po
+2	2	build/i18n/po/auth.properties/fr-CA.po
+4	4	build/i18n/po/auth.properties/he-IL.po
+4	4	build/i18n/po/auth.properties/hu-HU.po
+2	2	build/i18n/po/auth.properties/hy-AM.po
+2	2	build/i18n/po/auth.properties/oc-FR.po
+2	2	build/i18n/po/auth.properties/pt-BR.po
+2	2	build/i18n/po/auth.properties/ru-RU.po
+4	4	build/i18n/po/auth.properties/sv-SE.po
+2	2	build/i18n/po/auth.properties/tr-TR.po
+2	2	build/i18n/po/authority.js/ar-JO.po
+2	2	build/i18n/po/authority.js/cs-CZ.po
+2	2	build/i18n/po/authority.js/de-DE.po
+2	2	build/i18n/po/authority.js/en-CA.po
+2	2	build/i18n/po/authority.js/en-GB.po
+2	2	build/i18n/po/authority.js/es-ES.po
+2	2	build/i18n/po/authority.js/fi-FI.po
+2	2	build/i18n/po/authority.js/fr-CA.po
+2	2	build/i18n/po/authority.js/hy-AM.po
+2	2	build/i18n/po/authority.js/oc-FR.po
+2	2	build/i18n/po/authority.js/pt-BR.po
+2	2	build/i18n/po/authority.js/ru-RU.po
+2	2	build/i18n/po/authority.js/tr-TR.po
+3	3	build/i18n/po/booking/ar-JO.po
+3	3	build/i18n/po/booking/cs-CZ.po
+3	3	build/i18n/po/booking/de-DE.po
+3	3	build/i18n/po/booking/en-CA.po
+3	3	build/i18n/po/booking/en-GB.po
+3	3	build/i18n/po/booking/es-ES.po
+54	0	build/i18n/po/booking/hy-AM.po
+2	2	build/i18n/po/capture.js/ar-JO.po
+2	2	build/i18n/po/capture.js/cs-CZ.po
+2	2	build/i18n/po/capture.js/de-DE.po
+2	2	build/i18n/po/capture.js/en-CA.po
+2	2	build/i18n/po/capture.js/en-GB.po
+2	2	build/i18n/po/capture.js/es-ES.po
+2	2	build/i18n/po/capture.js/fi-FI.po
+2	2	build/i18n/po/capture.js/fr-CA.po
+84	29	build/i18n/po/capture.js/he-IL.po
+84	29	build/i18n/po/capture.js/hu-HU.po
+2	2	build/i18n/po/capture.js/hy-AM.po
+2	2	build/i18n/po/capture.js/oc-FR.po
+2	2	build/i18n/po/capture.js/pt-BR.po
+2	2	build/i18n/po/capture.js/ru-RU.po
+84	29	build/i18n/po/capture.js/sv-SE.po
+84	29	build/i18n/po/capture.js/tr-TR.po
+14	5	build/i18n/po/cat.properties/ar-JO.po
+17	6	build/i18n/po/cat.properties/cs-CZ.po
+10	4	build/i18n/po/cat.properties/de-DE.po
+14	5	build/i18n/po/cat.properties/en-CA.po
+14	5	build/i18n/po/cat.properties/en-GB.po
+14	5	build/i18n/po/cat.properties/es-ES.po
+14	5	build/i18n/po/cat.properties/fi-FI.po
+14	5	build/i18n/po/cat.properties/fr-CA.po
+317	66	build/i18n/po/cat.properties/he-IL.po
+317	66	build/i18n/po/cat.properties/hu-HU.po
+17	7	build/i18n/po/cat.properties/hy-AM.po
+10	4	build/i18n/po/cat.properties/oc-FR.po
+14	5	build/i18n/po/cat.properties/pt-BR.po
+10	4	build/i18n/po/cat.properties/ru-RU.po
+317	66	build/i18n/po/cat.properties/sv-SE.po
+10	4	build/i18n/po/cat.properties/tr-TR.po
+3	3	build/i18n/po/cat/ar-JO.po
+3	3	build/i18n/po/cat/cs-CZ.po
+3	3	build/i18n/po/cat/de-DE.po
+3	3	build/i18n/po/cat/en-CA.po
+3	3	build/i18n/po/cat/en-GB.po
+3	3	build/i18n/po/cat/es-ES.po
+3	3	build/i18n/po/cat/fr-CA.po
+58	0	build/i18n/po/cat/hy-AM.po
+3	3	build/i18n/po/cat/pt-BR.po
+3	3	build/i18n/po/cat/ru-RU.po
+39	14	build/i18n/po/circ.properties/ar-JO.po
+44	17	build/i18n/po/circ.properties/cs-CZ.po
+17	9	build/i18n/po/circ.properties/de-DE.po
+40	15	build/i18n/po/circ.properties/en-CA.po
+40	15	build/i18n/po/circ.properties/en-GB.po
+40	15	build/i18n/po/circ.properties/es-ES.po
+40	15	build/i18n/po/circ.properties/fi-FI.po
+41	16	build/i18n/po/circ.properties/fr-CA.po
+254	56	build/i18n/po/circ.properties/he-IL.po
+254	56	build/i18n/po/circ.properties/hu-HU.po
+54	21	build/i18n/po/circ.properties/hy-AM.po
+17	9	build/i18n/po/circ.properties/oc-FR.po
+40	15	build/i18n/po/circ.properties/pt-BR.po
+40	15	build/i18n/po/circ.properties/ru-RU.po
+254	56	build/i18n/po/circ.properties/sv-SE.po
+17	9	build/i18n/po/circ.properties/tr-TR.po
+3	3	build/i18n/po/circ/ar-JO.po
+3	3	build/i18n/po/circ/cs-CZ.po
+3	3	build/i18n/po/circ/de-DE.po
+3	3	build/i18n/po/circ/es-ES.po
+335	0	build/i18n/po/circ/hy-AM.po
+3	3	build/i18n/po/circ/ru-RU.po
+3	3	build/i18n/po/common.properties/ar-JO.po
+3	3	build/i18n/po/common.properties/cs-CZ.po
+3	3	build/i18n/po/common.properties/de-DE.po
+3	3	build/i18n/po/common.properties/en-CA.po
+3	3	build/i18n/po/common.properties/en-GB.po
+3	3	build/i18n/po/common.properties/es-ES.po
+3	3	build/i18n/po/common.properties/fi-FI.po
+3	3	build/i18n/po/common.properties/fr-CA.po
+63	22	build/i18n/po/common.properties/he-IL.po
+63	22	build/i18n/po/common.properties/hu-HU.po
+6	6	build/i18n/po/common.properties/hy-AM.po
+3	3	build/i18n/po/common.properties/oc-FR.po
+3	3	build/i18n/po/common.properties/pt-BR.po
+3	3	build/i18n/po/common.properties/ru-RU.po
+63	22	build/i18n/po/common.properties/sv-SE.po
+63	22	build/i18n/po/common.properties/tr-TR.po
+2	2	build/i18n/po/conify.dtd/ar-JO.po
+2	2	build/i18n/po/conify.dtd/cs-CZ.po
+2	2	build/i18n/po/conify.dtd/de-DE.po
+2	2	build/i18n/po/conify.dtd/en-CA.po
+2	2	build/i18n/po/conify.dtd/en-GB.po
+2	2	build/i18n/po/conify.dtd/es-ES.po
+2	2	build/i18n/po/conify.dtd/fi-FI.po
+2	2	build/i18n/po/conify.dtd/fr-CA.po
+13	5	build/i18n/po/conify.dtd/he-IL.po
+13	5	build/i18n/po/conify.dtd/hu-HU.po
+2	2	build/i18n/po/conify.dtd/hy-AM.po
+2	2	build/i18n/po/conify.dtd/oc-FR.po
+2	2	build/i18n/po/conify.dtd/pt-BR.po
+2	2	build/i18n/po/conify.dtd/ru-RU.po
+13	5	build/i18n/po/conify.dtd/sv-SE.po
+13	5	build/i18n/po/conify.dtd/tr-TR.po
+2	2	build/i18n/po/conify.js/ar-JO.po
+2	2	build/i18n/po/conify.js/cs-CZ.po
+2	2	build/i18n/po/conify.js/de-DE.po
+2	2	build/i18n/po/conify.js/en-CA.po
+2	2	build/i18n/po/conify.js/en-GB.po
+2	2	build/i18n/po/conify.js/es-ES.po
+2	2	build/i18n/po/conify.js/fi-FI.po
+2	2	build/i18n/po/conify.js/fr-CA.po
+220	165	build/i18n/po/conify.js/he-IL.po
+220	165	build/i18n/po/conify.js/hu-HU.po
+7	4	build/i18n/po/conify.js/hy-AM.po
+2	2	build/i18n/po/conify.js/oc-FR.po
+2	2	build/i18n/po/conify.js/pt-BR.po
+2	2	build/i18n/po/conify.js/ru-RU.po
+220	165	build/i18n/po/conify.js/sv-SE.po
+2	2	build/i18n/po/conify.js/tr-TR.po
+3	3	build/i18n/po/conify/ar-JO.po
+3	3	build/i18n/po/conify/cs-CZ.po
+3	3	build/i18n/po/conify/es-ES.po
+1654	0	build/i18n/po/conify/hy-AM.po
+1371	1121	build/i18n/po/db.seed/ar-JO.po
+319	62	build/i18n/po/db.seed/cs-CZ.po
+1344	1113	build/i18n/po/db.seed/de-DE.po
+1345	1114	build/i18n/po/db.seed/en-CA.po
+1346	1115	build/i18n/po/db.seed/en-GB.po
+1378	1128	build/i18n/po/db.seed/es-ES.po
+1357	1120	build/i18n/po/db.seed/fi-FI.po
+1347	1116	build/i18n/po/db.seed/fr-CA.po
+11259	3386	build/i18n/po/db.seed/he-IL.po
+11259	3386	build/i18n/po/db.seed/hu-HU.po
+2274	1402	build/i18n/po/db.seed/hy-AM.po
+1344	1113	build/i18n/po/db.seed/oc-FR.po
+1346	1115	build/i18n/po/db.seed/pt-BR.po
+1345	1114	build/i18n/po/db.seed/ru-RU.po
+11259	3386	build/i18n/po/db.seed/sv-SE.po
+1343	1112	build/i18n/po/db.seed/tr-TR.po
+2683	2594	build/i18n/po/fm_IDL.dtd/ar-JO.po
+2684	2595	build/i18n/po/fm_IDL.dtd/cs-CZ.po
+2680	2591	build/i18n/po/fm_IDL.dtd/de-DE.po
+2682	2593	build/i18n/po/fm_IDL.dtd/en-CA.po
+2682	2593	build/i18n/po/fm_IDL.dtd/en-GB.po
+2682	2593	build/i18n/po/fm_IDL.dtd/es-ES.po
+2682	2593	build/i18n/po/fm_IDL.dtd/fi-FI.po
+2680	2591	build/i18n/po/fm_IDL.dtd/fr-CA.po
+4553	2131	build/i18n/po/fm_IDL.dtd/he-IL.po
+4553	2131	build/i18n/po/fm_IDL.dtd/hu-HU.po
+2775	2685	build/i18n/po/fm_IDL.dtd/hy-AM.po
+2680	2591	build/i18n/po/fm_IDL.dtd/oc-FR.po
+2682	2593	build/i18n/po/fm_IDL.dtd/pt-BR.po
+2682	2593	build/i18n/po/fm_IDL.dtd/ru-RU.po
+4553	2131	build/i18n/po/fm_IDL.dtd/sv-SE.po
+2680	2591	build/i18n/po/fm_IDL.dtd/tr-TR.po
+16	12	build/i18n/po/ils_events.xml/ar-JO.po
+18	13	build/i18n/po/ils_events.xml/cs-CZ.po
+10	10	build/i18n/po/ils_events.xml/de-DE.po
+15	11	build/i18n/po/ils_events.xml/en-CA.po
+15	11	build/i18n/po/ils_events.xml/en-GB.po
+17	13	build/i18n/po/ils_events.xml/es-ES.po
+15	11	build/i18n/po/ils_events.xml/fi-FI.po
+16	12	build/i18n/po/ils_events.xml/fr-CA.po
+575	420	build/i18n/po/ils_events.xml/he-IL.po
+575	420	build/i18n/po/ils_events.xml/hu-HU.po
+29	19	build/i18n/po/ils_events.xml/hy-AM.po
+575	420	build/i18n/po/ils_events.xml/oc-FR.po
+15	11	build/i18n/po/ils_events.xml/pt-BR.po
+15	11	build/i18n/po/ils_events.xml/ru-RU.po
+575	420	build/i18n/po/ils_events.xml/sv-SE.po
+575	420	build/i18n/po/ils_events.xml/tr-TR.po
+3	3	build/i18n/po/kpac/ar-JO.po
+3	3	build/i18n/po/kpac/cs-CZ.po
+3	3	build/i18n/po/kpac/de-DE.po
+3	3	build/i18n/po/kpac/es-ES.po
+383	0	build/i18n/po/kpac/hy-AM.po
+84	56	build/i18n/po/lang.dtd/ar-JO.po
+84	44	build/i18n/po/lang.dtd/cs-CZ.po
+37	30	build/i18n/po/lang.dtd/de-DE.po
+86	46	build/i18n/po/lang.dtd/en-CA.po
+86	46	build/i18n/po/lang.dtd/en-GB.po
+91	66	build/i18n/po/lang.dtd/es-ES.po
+87	47	build/i18n/po/lang.dtd/fi-FI.po
+57	34	build/i18n/po/lang.dtd/fr-CA.po
+6254	4142	build/i18n/po/lang.dtd/he-IL.po
+6254	4142	build/i18n/po/lang.dtd/hu-HU.po
+119	56	build/i18n/po/lang.dtd/hy-AM.po
+37	30	build/i18n/po/lang.dtd/oc-FR.po
+57	34	build/i18n/po/lang.dtd/pt-BR.po
+57	34	build/i18n/po/lang.dtd/ru-RU.po
+6254	4142	build/i18n/po/lang.dtd/sv-SE.po
+37	30	build/i18n/po/lang.dtd/tr-TR.po
+2	2	build/i18n/po/match_set.js/ar-JO.po
+2	2	build/i18n/po/match_set.js/cs-CZ.po
+2	2	build/i18n/po/match_set.js/en-GB.po
+2	2	build/i18n/po/match_set.js/es-ES.po
+2	2	build/i18n/po/match_set.js/fr-CA.po
+4	4	build/i18n/po/match_set.js/hy-AM.po
+120	3	build/i18n/po/multiclass_search_help.html/he-IL.po
+120	3	build/i18n/po/multiclass_search_help.html/sv-SE.po
+2	2	build/i18n/po/offline.properties/ar-JO.po
+2	2	build/i18n/po/offline.properties/cs-CZ.po
+2	2	build/i18n/po/offline.properties/de-DE.po
+2	2	build/i18n/po/offline.properties/en-CA.po
+2	2	build/i18n/po/offline.properties/en-GB.po
+2	2	build/i18n/po/offline.properties/es-ES.po
+2	2	build/i18n/po/offline.properties/fi-FI.po
+2	2	build/i18n/po/offline.properties/fr-CA.po
+324	50	build/i18n/po/offline.properties/he-IL.po
+324	50	build/i18n/po/offline.properties/hu-HU.po
+2	2	build/i18n/po/offline.properties/hy-AM.po
+2	2	build/i18n/po/offline.properties/oc-FR.po
+2	2	build/i18n/po/offline.properties/pt-BR.po
+2	2	build/i18n/po/offline.properties/ru-RU.po
+324	50	build/i18n/po/offline.properties/sv-SE.po
+2	2	build/i18n/po/offline.properties/tr-TR.po
+2	2	build/i18n/po/opac.dtd/ar-JO.po
+2	2	build/i18n/po/opac.dtd/cs-CZ.po
+2	2	build/i18n/po/opac.dtd/de-DE.po
+2	2	build/i18n/po/opac.dtd/en-CA.po
+2	2	build/i18n/po/opac.dtd/en-GB.po
+2	2	build/i18n/po/opac.dtd/es-ES.po
+2	2	build/i18n/po/opac.dtd/fi-FI.po
+2	2	build/i18n/po/opac.dtd/fr-CA.po
+2	2	build/i18n/po/opac.dtd/he-IL.po
+185	15	build/i18n/po/opac.dtd/hu-HU.po
+2	2	build/i18n/po/opac.dtd/hy-AM.po
+2	2	build/i18n/po/opac.dtd/oc-FR.po
+2	2	build/i18n/po/opac.dtd/pt-BR.po
+2	2	build/i18n/po/opac.dtd/ru-RU.po
+185	15	build/i18n/po/opac.dtd/sv-SE.po
+2	2	build/i18n/po/opac.dtd/tr-TR.po
+2	2	build/i18n/po/opac.js/ar-JO.po
+2	2	build/i18n/po/opac.js/cs-CZ.po
+3	3	build/i18n/po/opac.js/de-DE.po
+2	2	build/i18n/po/opac.js/en-CA.po
+2	2	build/i18n/po/opac.js/en-GB.po
+2	2	build/i18n/po/opac.js/es-ES.po
+2	2	build/i18n/po/opac.js/fi-FI.po
+2	2	build/i18n/po/opac.js/fr-CA.po
+70	22	build/i18n/po/opac.js/he-IL.po
+70	22	build/i18n/po/opac.js/hu-HU.po
+2	2	build/i18n/po/opac.js/hy-AM.po
+2	2	build/i18n/po/opac.js/oc-FR.po
+2	2	build/i18n/po/opac.js/pt-BR.po
+2	2	build/i18n/po/opac.js/ru-RU.po
+2	2	build/i18n/po/opac.js/sv-SE.po
+2	2	build/i18n/po/opac.js/tr-TR.po
+8	4	build/i18n/po/patron.properties/ar-JO.po
+8	4	build/i18n/po/patron.properties/cs-CZ.po
+7	3	build/i18n/po/patron.properties/de-DE.po
+7	3	build/i18n/po/patron.properties/en-CA.po
+7	3	build/i18n/po/patron.properties/en-GB.po
+7	3	build/i18n/po/patron.properties/es-ES.po
+7	3	build/i18n/po/patron.properties/fi-FI.po
+7	3	build/i18n/po/patron.properties/fr-CA.po
+320	54	build/i18n/po/patron.properties/he-IL.po
+320	54	build/i18n/po/patron.properties/hu-HU.po
+20	14	build/i18n/po/patron.properties/hy-AM.po
+7	3	build/i18n/po/patron.properties/oc-FR.po
+7	3	build/i18n/po/patron.properties/pt-BR.po
+7	3	build/i18n/po/patron.properties/ru-RU.po
+320	54	build/i18n/po/patron.properties/sv-SE.po
+7	3	build/i18n/po/patron.properties/tr-TR.po
+2	2	build/i18n/po/pickup_and_return.js/ar-JO.po
+2	2	build/i18n/po/pickup_and_return.js/cs-CZ.po
+2	2	build/i18n/po/pickup_and_return.js/de-DE.po
+2	2	build/i18n/po/pickup_and_return.js/en-CA.po
+2	2	build/i18n/po/pickup_and_return.js/en-GB.po
+2	2	build/i18n/po/pickup_and_return.js/es-ES.po
+2	2	build/i18n/po/pickup_and_return.js/fi-FI.po
+2	2	build/i18n/po/pickup_and_return.js/fr-CA.po
+24	8	build/i18n/po/pickup_and_return.js/he-IL.po
+24	8	build/i18n/po/pickup_and_return.js/hu-HU.po
+2	2	build/i18n/po/pickup_and_return.js/hy-AM.po
+2	2	build/i18n/po/pickup_and_return.js/oc-FR.po
+2	2	build/i18n/po/pickup_and_return.js/pt-BR.po
+2	2	build/i18n/po/pickup_and_return.js/ru-RU.po
+24	8	build/i18n/po/pickup_and_return.js/sv-SE.po
+24	8	build/i18n/po/pickup_and_return.js/tr-TR.po
+2	2	build/i18n/po/pull_list.js/ar-JO.po
+2	2	build/i18n/po/pull_list.js/cs-CZ.po
+2	2	build/i18n/po/pull_list.js/de-DE.po
+2	2	build/i18n/po/pull_list.js/en-CA.po
+2	2	build/i18n/po/pull_list.js/en-GB.po
+2	2	build/i18n/po/pull_list.js/es-ES.po
+2	2	build/i18n/po/pull_list.js/fi-FI.po
+2	2	build/i18n/po/pull_list.js/fr-CA.po
+18	9	build/i18n/po/pull_list.js/he-IL.po
+18	9	build/i18n/po/pull_list.js/hu-HU.po
+2	2	build/i18n/po/pull_list.js/hy-AM.po
+2	2	build/i18n/po/pull_list.js/oc-FR.po
+2	2	build/i18n/po/pull_list.js/pt-BR.po
+2	2	build/i18n/po/pull_list.js/ru-RU.po
+18	9	build/i18n/po/pull_list.js/sv-SE.po
+2	2	build/i18n/po/pull_list.js/tr-TR.po
+2	2	build/i18n/po/register.js/ar-JO.po
+2	2	build/i18n/po/register.js/cs-CZ.po
+3	3	build/i18n/po/register.js/de-DE.po
+2	2	build/i18n/po/register.js/en-CA.po
+2	2	build/i18n/po/register.js/en-GB.po
+2	2	build/i18n/po/register.js/es-ES.po
+2	2	build/i18n/po/register.js/fi-FI.po
+2	2	build/i18n/po/register.js/fr-CA.po
+180	7	build/i18n/po/register.js/he-IL.po
+180	7	build/i18n/po/register.js/hu-HU.po
+10	10	build/i18n/po/register.js/hy-AM.po
+2	2	build/i18n/po/register.js/oc-FR.po
+2	2	build/i18n/po/register.js/pt-BR.po
+2	2	build/i18n/po/register.js/ru-RU.po
+180	7	build/i18n/po/register.js/sv-SE.po
+2	2	build/i18n/po/register.js/tr-TR.po
+2	2	build/i18n/po/reports.dtd/ar-JO.po
+2	2	build/i18n/po/reports.dtd/cs-CZ.po
+2	2	build/i18n/po/reports.dtd/de-DE.po
+2	2	build/i18n/po/reports.dtd/en-CA.po
+2	2	build/i18n/po/reports.dtd/en-GB.po
+2	2	build/i18n/po/reports.dtd/es-ES.po
+2	2	build/i18n/po/reports.dtd/fi-FI.po
+2	2	build/i18n/po/reports.dtd/fr-CA.po
+56	8	build/i18n/po/reports.dtd/he-IL.po
+56	8	build/i18n/po/reports.dtd/hu-HU.po
+21	14	build/i18n/po/reports.dtd/hy-AM.po
+56	8	build/i18n/po/reports.dtd/oc-FR.po
+2	2	build/i18n/po/reports.dtd/pt-BR.po
+2	2	build/i18n/po/reports.dtd/ru-RU.po
+56	8	build/i18n/po/reports.dtd/sv-SE.po
+2	2	build/i18n/po/reports.dtd/tr-TR.po
+2	2	build/i18n/po/reports.js/ar-JO.po
+2	2	build/i18n/po/reports.js/cs-CZ.po
+2	2	build/i18n/po/reports.js/de-DE.po
+2	2	build/i18n/po/reports.js/en-CA.po
+2	2	build/i18n/po/reports.js/en-GB.po
+2	2	build/i18n/po/reports.js/es-ES.po
+2	2	build/i18n/po/reports.js/fi-FI.po
+2	2	build/i18n/po/reports.js/fr-CA.po
+22	12	build/i18n/po/reports.js/he-IL.po
+2	2	build/i18n/po/reports.js/hu-HU.po
+5	5	build/i18n/po/reports.js/hy-AM.po
+2	2	build/i18n/po/reports.js/oc-FR.po
+2	2	build/i18n/po/reports.js/pt-BR.po
+2	2	build/i18n/po/reports.js/ru-RU.po
+22	12	build/i18n/po/reports.js/sv-SE.po
+2	2	build/i18n/po/reports.js/tr-TR.po
+2	2	build/i18n/po/reservation.js/ar-JO.po
+2	2	build/i18n/po/reservation.js/cs-CZ.po
+2	2	build/i18n/po/reservation.js/de-DE.po
+2	2	build/i18n/po/reservation.js/en-CA.po
+2	2	build/i18n/po/reservation.js/en-GB.po
+2	2	build/i18n/po/reservation.js/es-ES.po
+2	2	build/i18n/po/reservation.js/fi-FI.po
+2	2	build/i18n/po/reservation.js/fr-CA.po
+64	36	build/i18n/po/reservation.js/he-IL.po
+64	36	build/i18n/po/reservation.js/hu-HU.po
+2	2	build/i18n/po/reservation.js/hy-AM.po
+2	2	build/i18n/po/reservation.js/oc-FR.po
+2	2	build/i18n/po/reservation.js/pt-BR.po
+2	2	build/i18n/po/reservation.js/ru-RU.po
+64	36	build/i18n/po/reservation.js/sv-SE.po
+64	36	build/i18n/po/reservation.js/tr-TR.po
+2	2	build/i18n/po/selfcheck.js/ar-JO.po
+2	2	build/i18n/po/selfcheck.js/cs-CZ.po
+2	2	build/i18n/po/selfcheck.js/de-DE.po
+2	2	build/i18n/po/selfcheck.js/en-CA.po
+2	2	build/i18n/po/selfcheck.js/en-GB.po
+2	2	build/i18n/po/selfcheck.js/es-ES.po
+2	2	build/i18n/po/selfcheck.js/fi-FI.po
+2	2	build/i18n/po/selfcheck.js/fr-CA.po
+144	37	build/i18n/po/selfcheck.js/he-IL.po
+144	37	build/i18n/po/selfcheck.js/hu-HU.po
+2	2	build/i18n/po/selfcheck.js/hy-AM.po
+2	2	build/i18n/po/selfcheck.js/oc-FR.po
+2	2	build/i18n/po/selfcheck.js/pt-BR.po
+2	2	build/i18n/po/selfcheck.js/ru-RU.po
+144	37	build/i18n/po/selfcheck.js/sv-SE.po
+144	37	build/i18n/po/selfcheck.js/tr-TR.po
+2	2	build/i18n/po/serial.js/ar-JO.po
+2	2	build/i18n/po/serial.js/cs-CZ.po
+2	2	build/i18n/po/serial.js/de-DE.po
+2	2	build/i18n/po/serial.js/en-GB.po
+2	2	build/i18n/po/serial.js/es-ES.po
+2	2	build/i18n/po/serial.js/hy-AM.po
+2	2	build/i18n/po/serial.properties/ar-JO.po
+2	2	build/i18n/po/serial.properties/cs-CZ.po
+2	2	build/i18n/po/serial.properties/de-DE.po
+2	2	build/i18n/po/serial.properties/en-CA.po
+2	2	build/i18n/po/serial.properties/en-GB.po
+2	2	build/i18n/po/serial.properties/es-ES.po
+2	2	build/i18n/po/serial.properties/fi-FI.po
+2	2	build/i18n/po/serial.properties/fr-CA.po
+4	4	build/i18n/po/serial.properties/hy-AM.po
+2	2	build/i18n/po/serial.properties/oc-FR.po
+2	2	build/i18n/po/serial.properties/pt-BR.po
+2	2	build/i18n/po/serial.properties/tr-TR.po
+3	3	build/i18n/po/serial/ar-JO.po
+3	3	build/i18n/po/serial/cs-CZ.po
+3	3	build/i18n/po/serial/es-ES.po
+419	0	build/i18n/po/serial/hy-AM.po
+303	240	build/i18n/po/tpac/ar-JO.po
+241	176	build/i18n/po/tpac/cs-CZ.po
+301	238	build/i18n/po/tpac/de-DE.po
+301	238	build/i18n/po/tpac/en-CA.po
+301	238	build/i18n/po/tpac/en-GB.po
+302	239	build/i18n/po/tpac/es-ES.po
+301	238	build/i18n/po/tpac/fi-FI.po
+301	238	build/i18n/po/tpac/fr-CA.po
+3633	993	build/i18n/po/tpac/he-IL.po
+3633	993	build/i18n/po/tpac/hu-HU.po
+582	499	build/i18n/po/tpac/hy-AM.po
+301	238	build/i18n/po/tpac/oc-FR.po
+301	238	build/i18n/po/tpac/pt-BR.po
+228	165	build/i18n/po/tpac/ru-RU.po
+3633	993	build/i18n/po/tpac/sv-SE.po
+301	238	build/i18n/po/tpac/tr-TR.po
+3	3	build/i18n/po/urlverify/ar-JO.po
+3	3	build/i18n/po/urlverify/cs-CZ.po
+3	3	build/i18n/po/urlverify/de-DE.po
+3	3	build/i18n/po/urlverify/es-ES.po
+146	0	build/i18n/po/urlverify/hy-AM.po
+4	10	build/i18n/po/vandelay.dtd/en-GB.po
+4	10	build/i18n/po/vandelay.dtd/fr-CA.po
+3	9	build/i18n/po/vandelay.dtd/hy-AM.po
+4	10	build/i18n/po/vandelay.dtd/pt-BR.po
+2	2	build/i18n/po/vandelay.js/ar-JO.po
+2	2	build/i18n/po/vandelay.js/cs-CZ.po
+2	2	build/i18n/po/vandelay.js/en-CA.po
+2	2	build/i18n/po/vandelay.js/en-GB.po
+2	2	build/i18n/po/vandelay.js/es-ES.po
+2	2	build/i18n/po/vandelay.js/hy-AM.po
+2	2	build/i18n/po/vandelay.js/pt-BR.po
+3	3	build/i18n/po/vandelay/ar-JO.po
+3	3	build/i18n/po/vandelay/cs-CZ.po
+3	3	build/i18n/po/vandelay/de-DE.po
+3	3	build/i18n/po/vandelay/es-ES.po
+626	0	build/i18n/po/vandelay/hy-AM.po
+1009	640	build/i18n/po/webstaff/ar-JO.po
+739	344	build/i18n/po/webstaff/cs-CZ.po
+1011	642	build/i18n/po/webstaff/es-ES.po
+972	636	build/i18n/po/webstaff/ru-RU.po
+ create mode 100644 build/i18n/po/FlattenerGrid.js/hy-AM.po
+ create mode 100644 build/i18n/po/PCrudFilterPane.js/hy-AM.po
+ create mode 100644 build/i18n/po/acq/hy-AM.po
+ create mode 100644 build/i18n/po/acq/ru-RU.po
+ create mode 100644 build/i18n/po/actor/hy-AM.po
+ create mode 100644 build/i18n/po/booking/hy-AM.po
+ create mode 100644 build/i18n/po/cat/hy-AM.po
+ create mode 100644 build/i18n/po/circ/hy-AM.po
+ create mode 100644 build/i18n/po/conify/hy-AM.po
+ create mode 100644 build/i18n/po/kpac/hy-AM.po
+ create mode 100644 build/i18n/po/serial/hy-AM.po
+ create mode 100644 build/i18n/po/urlverify/hy-AM.po
+ create mode 100644 build/i18n/po/vandelay/hy-AM.po
+
+commit 6751df5dbf6c98e998b300840dc3ffcbf03e1488
+Author: Ben Shum <ben at evergreener.net>
+Date:   Sun Sep 3 23:34:24 2017 -0400
+
+    Translation updates - newpot
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+3535	3409	build/i18n/po/db.seed/db.seed.pot
+2505	2301	build/i18n/po/fm_IDL.dtd/fm_IDL.dtd.pot
+13	1	build/i18n/po/ils_events.xml/ils_events.xml.pot
+41	1	build/i18n/po/reports.dtd/reports.dtd.pot
+308	212	build/i18n/po/tpac/tpac.pot
+2512	430	build/i18n/po/webstaff/webstaff.pot
+
+commit d5fe1cc24af2fa56cb1f5cc196441b7fa3681f50
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Sat Sep 2 11:38:32 2017 -0400
+
+    LP#1251394: fix typo in seed data caugh by t/24-sql-gettext-unique.t
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+1	1	Open-ILS/src/sql/Pg/upgrade/1074.data.metabib-display-field.sql
+
+commit 0bef0c27c2e9f4eea85ef34e1a302aa847e785ba
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Sep 1 17:33:50 2017 -0400
+
+    LP#1714594: fix lp1629108_metarecord_constituent_result_reroute.pg
+    
+    This patch accounts for the fact that the IDs returned in source_list
+    do not have a set order. It also no longer recreates unapi.mmr_mra()
+    within the test case, meaning that it can now serve as a true regression
+    test.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+2	99	Open-ILS/src/sql/Pg/t/regress/lp1629108_metarecord_constituent_result_reroute.pg
+
+commit f70f6f6c26342e35c8514b2660588144b6b8001d
+Author: Jason Boyer <jboyer at library.in.gov>
+Date:   Fri Sep 1 09:49:36 2017 -0400
+
+    LP1714512: Patron Edit Barcode Validation
+    
+    There are 2 barcode related regular expression OUS
+    but the web user editor is using the wrong one.
+    This branch corrects that.
+    
+    Signed-off-by: Jason Boyer <jboyer at library.in.gov>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+2	2	Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
+
+commit b930174c8c3cf75309993e9f90d9fb8d816e4d23
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri Sep 1 17:17:16 2017 -0400
+
+    Stamping upgrade scripts for Display Fields and Vandelay regression
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+554	0	Open-ILS/src/sql/Pg/upgrade/1073.schema.metabib-display-field.sql
+38	0	Open-ILS/src/sql/Pg/upgrade/1074.data.metabib-display-field.sql
+21	0	Open-ILS/src/sql/Pg/upgrade/1075.schema.fix_vii_fake_fkey.sql
+0	19	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.fix_vii_fake_fkey.sql
+0	552	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.metabib-display-field.sql
+0	36	Open-ILS/src/sql/Pg/upgrade/YYYY.data.metabib-display-field.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1073.schema.metabib-display-field.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1074.data.metabib-display-field.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1075.schema.fix_vii_fake_fkey.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.fix_vii_fake_fkey.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.metabib-display-field.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.data.metabib-display-field.sql
+
+commit 0161aef74694648a57307915157469246947e9d1
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Sep 1 17:26:32 2017 -0400
+
+    LP#1152753: upgrade script
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+19	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.fix_vii_fake_fkey.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.fix_vii_fake_fkey.sql
+
+commit 4d96474c8f085392c2c5dc21d0ba40a5a8e7c814
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Sep 1 17:22:42 2017 -0400
+
+    LP#1152753: fix fake FK trigger on vandelay.import_item
+    
+    Fixes a regression caught by live_t/0824.item_import_defaults.pg
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+3	0	Open-ILS/src/sql/Pg/800.fkeys.sql
+
+commit d74649d498fd83f1651a1b39f474d530e822eba3
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri Aug 25 12:58:00 2017 -0400
+
+    LP#1251394 Display fields release notes
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+55	0	docs/RELEASE_NOTES_NEXT/Administration/display-fields.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Administration/display-fields.adoc
+
+commit c095a3adb3649c575bcfcb846040c16b79757661
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri Aug 25 12:40:20 2017 -0400
+
+    LP#1251394 Author display field xpath
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+5	0	Open-ILS/src/sql/Pg/upgrade/YYYY.data.metabib-display-field.sql
+
+commit 0403f71a2e5458c73ed4ad9ce26e15608fbd3990
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri Aug 25 12:28:10 2017 -0400
+
+    LP#1251394 More representative field cleanup
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+0	2	Open-ILS/examples/fm_IDL.xml
+
+commit eee9c17df8e49ed5661b1cb56918a85bc041863f
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri Aug 25 12:15:28 2017 -0400
+
+    LP#1251394 Display field CDBI thinko repair
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/config.pm
+
+commit 6e86943b5ae02217330ec71ef30ecf68abe0f9ff
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri Aug 25 11:50:27 2017 -0400
+
+    LP#1251394 egBibDisplay service examples
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+41	0	Open-ILS/web/js/ui/default/staff/cat/services/record.js
+
+commit 436345ea4808152bdeee1f737a4073f15b73f2df
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri Aug 25 10:50:44 2017 -0400
+
+    LP#1251394 Display field schema sync'ing
+    
+    Copy flat/compressed/wide display entry views into base schema.
+    Synchronize a few remaining seed data bits.
+    
+    Replace references to 'topic_subject' in wide display views with the new
+    'creators' field.
+    
+    Remove ZZZZ.UNDO testing SQL file.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/examples/fm_IDL.xml
+8	0	Open-ILS/src/sql/Pg/002.schema.config.sql
+57	0	Open-ILS/src/sql/Pg/030.schema.metabib.sql
+3	3	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.metabib-display-field.sql
+5	2	Open-ILS/src/sql/Pg/upgrade/YYYY.data.metabib-display-field.sql
+0	308	Open-ILS/src/sql/Pg/upgrade/ZZZZ.UNDO.metabib-display-field.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/ZZZZ.UNDO.metabib-display-field.sql
+
+commit 2ce54127d256e0087abcf2be8a1e0258b22ffee8
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri Aug 18 17:18:29 2017 -0400
+
+    LP#1251394: Seed data changes
+    
+    Removing the topic_subject map, since it ends up with single terms rather than
+    the more useful "--"-separated full subjects.  Also added an "all creators"
+    mapping so that if the default "author" is empty for a record, the display
+    logic can do its best to find an appropriate value.
+    
+    Gone, again, is the representative_field structure from the baseline (and from
+    my upgrade changes).
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+0	20	Open-ILS/src/sql/Pg/002.schema.config.sql
+20	8	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+0	20	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.metabib-display-field.sql
+8	6	Open-ILS/src/sql/Pg/upgrade/YYYY.data.metabib-display-field.sql
+
+commit 4d9df04f07e77f91f7c2d4830ff16b8d67f633e5
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri Aug 18 16:34:04 2017 -0400
+
+    LP#1251394: Minor fixes
+    
+     * Fix function names in drop statements for upgrade
+     * Adjust array concat syntax in plpgsql
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+4	4	Open-ILS/src/sql/Pg/030.schema.metabib.sql
+6	6	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.metabib-display-field.sql
+
+commit c7598ec8d3d4cf442ed2c3cb153b00ec4cf58ce4
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri Aug 18 15:32:34 2017 -0400
+
+    LP#1251394: Reingest streamlining, schema realigning, rebasing
+    
+    I've rebased this to master and undertake some work to allow streamlined
+    reingest of specific index definitions.  The API remains essentially backwards
+    compatable, but is reingest_metabib_field_entries() is extended to accept a
+    list of index definition IDs to which it should restrict its work.  If that
+    optional parameter is not passed, all index definitions are processed.
+    
+    This has the benefit of skipping XML transformation for index definitions
+    which won't produce output useful to the requested reingest process, which
+    should provide a significant speed boost for some situations.
+    
+    The upgrade schema has now been realigned with some missing bits from the
+    baseline, but the baseline may still be lacking some from the upgrade.
+    
+    The data upgrade script has been made to use the existing index definitions
+    where they match the needs of the new ones, and to use the new reindexing
+    options.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+36	22	Open-ILS/src/sql/Pg/030.schema.metabib.sql
+135	9	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.metabib-display-field.sql
+10	35	Open-ILS/src/sql/Pg/upgrade/YYYY.data.metabib-display-field.sql
+
+commit 1ffccff52c4a003c7d56c5e67477d173b6d3256f
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed May 17 16:34:43 2017 -0400
+
+    LP#1251394 Webstaff Display fields utility functions
+    
+    Adds functions for translating bib record display field data into a
+    variety of useful formats and structures.  Some are best suited for
+    grids, others for lists of values, etc.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+67	0	Open-ILS/web/js/ui/default/staff/cat/services/record.js
+
+commit 2b9e0ff2b769f58cdda42022fda0c7e2fd45131a
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu May 11 17:54:58 2017 -0400
+
+    LP#1251394 Compressed and wide display entry VIEWs
+    
+    flat_display_entry is one row per entry with all of the relevent info.
+    compressed_display_entry sits atop flat_display_entry and compresses the
+    values into JSON scalars and arrays depending on the 'multi' value.
+    
+    Wide display entry is a tabular view of the well-known fields a la
+    reporter.simple_record.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+58	2	Open-ILS/examples/fm_IDL.xml
+54	14	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.metabib-display-field.sql
+7	2	Open-ILS/src/sql/Pg/upgrade/YYYY.data.metabib-display-field.sql
+2	0	Open-ILS/src/sql/Pg/upgrade/ZZZZ.UNDO.metabib-display-field.sql
+
+commit a473001c669604d9085d3bda6484b320d3bcd754
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu May 11 17:37:32 2017 -0400
+
+    LP#1251394 display map perms; links; formatting
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+12	7	Open-ILS/examples/fm_IDL.xml
+
+commit 071ca406ba4806b9be9abf3565b685e6c17efbc1
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu May 11 12:14:10 2017 -0400
+
+    LP#1251394 flat_display_entry gets 'field' col
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+3	1	Open-ILS/examples/fm_IDL.xml
+2	1	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.metabib-display-field.sql
+
+commit 4196a3a4c181debd68be410dc18897bfdc4841e2
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu May 11 11:56:32 2017 -0400
+
+    LP#1251394 config.display_field_map / flat json display
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+27	21	Open-ILS/examples/fm_IDL.xml
+22	84	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.metabib-display-field.sql
+46	0	Open-ILS/src/sql/Pg/upgrade/YYYY.data.metabib-display-field.sql
+306	0	Open-ILS/src/sql/Pg/upgrade/ZZZZ.UNDO.metabib-display-field.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.data.metabib-display-field.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/ZZZZ.UNDO.metabib-display-field.sql
+
+commit 0773c439935f172ed571186d45f41bef1a1b8e0e
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Apr 26 17:19:06 2017 -0400
+
+    LP#1251394 Display fields schema rebase
+    
+    Rebase modified SQL functions to match their current production verions,
+    plus changes required for this branch.
+    
+    Specifically metabib.reingest_metabib_field_entries and
+    biblio.extract_metabib_field_entry
+    
+    Remove duplicate config.metabib_representative_field_is_valid
+    function declaration from 002.schema.config.sql.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+0	10	Open-ILS/src/sql/Pg/002.schema.config.sql
+9	18	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.metabib-display-field.sql
+
+commit 11507993c4befcbdbe8d2c46c2f9e5ab40920c31
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Fri Feb 20 14:37:51 2015 -0500
+
+    LP#1251394 Fix DB order of operations
+    
+    'representative_field' (and its check function) create circular
+    references between metabib_class and metabib_field.  The most
+    straightforward fix is to deal with those fields separate from the
+    initial table creation and field insertion.
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+20	6	Open-ILS/src/sql/Pg/002.schema.config.sql
+4	2	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+
+commit 054027e6340baf5d2f7e58287ed6e1253cab4382
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Thu Nov 14 16:58:54 2013 -0500
+
+    LP#1251394 Display fields schema/IDL continued
+    
+    * Upgrade SQL repairs
+    * make display fields field-safe
+    * Representative fields
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+15	8	Open-ILS/examples/fm_IDL.xml
+16	0	Open-ILS/src/sql/Pg/002.schema.config.sql
+2	2	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+80	18	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.metabib-display-field.sql
+
+commit 9d57def5f515dc7aa9ef11a02f016e6fe8a33b17
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Nov 14 16:43:31 2013 -0500
+
+    LP#1251394 un-squash repeated fields; some minor schema re-alignment
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+3	2	Open-ILS/examples/fm_IDL.xml
+1	0	Open-ILS/src/sql/Pg/002.schema.config.sql
+19	13	Open-ILS/src/sql/Pg/030.schema.metabib.sql
+22	13	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.metabib-display-field.sql
+
+commit 0f98fc18012ac949e1b299a7339bbea9639648bf
+Author: Bill Erickson <berick at esilibrary.com>
+Date:   Thu Nov 14 14:15:28 2013 -0500
+
+    LP#1251394 Display Fields DB schema continued
+    
+    * Schema chnange continued
+    * mde IDL entry
+    * flat display IDL view
+    * IDL links from bre to mde/mfde
+    
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+56	0	Open-ILS/examples/fm_IDL.xml
+95	2	Open-ILS/src/sql/Pg/030.schema.metabib.sql
+405	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.metabib-display-field.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.metabib-display-field.sql
+
+commit 537efb752bb1508f885edba22e65af26716ec303
+Author: Dan Scott <dan at coffeecode.net>
+Date:   Mon Jun 27 16:53:55 2011 -0400
+
+    LP#1251394 Add display_field column to config.metabib_field
+    
+    The idea is to pull the XPath definitions and i18nized labels for
+    config.metabib_field entries into other contexts, to avoid duplicate /
+    conflicting defintions in different layers of the code. If display_field
+    is TRUE, then it is a signal that it could be usefully exposed to users.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Bill Erickson <berick at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	0	Open-ILS/examples/fm_IDL.xml
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/config.pm
+2	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+4	4	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+
+commit 3a14a5078160139d6e724dba0f6c295e6ba1f86c
+Author: Cesar Velez <cesar.velez at equinoxinitiative.org>
+Date:   Fri Aug 11 17:52:13 2017 -0400
+
+    LP#1599894 - OPAC disable Add to MyList when doing metabib search
+    
+    Since adding a result to MyList yields to a random title
+    (due to bad id) being added to temp. lists, disable MyList if
+    metabib search is on, i.e "Group formats and editions"
+    checkbox is checked.
+    
+    Signed-off by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    
+    Conflicts:
+    	Open-ILS/src/templates/opac/parts/result/table.tt2
+
+1	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Search.pm
+2	0	Open-ILS/src/templates/opac/parts/result/table.tt2
+
+commit a3f854db8c407ccec37ac5728779544c4cd8feca
+Author: Jeff Davis <jdavis at sitka.bclibraries.ca>
+Date:   Fri Sep 1 10:36:26 2017 -0700
+
+    LP#1673870: release notes for ebook transactions
+    
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+36	0	docs/opac/ebook_transactions.adoc
+ create mode 100644 docs/opac/ebook_transactions.adoc
+
+commit 0cbe5b5a064d99c726d4e6137b28a321bbc72381
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Aug 31 12:59:40 2017 -0400
+
+    LP#1673870: avoid e-session cookie weirdness
+    
+    This patch is a bit of hackery to work around an intermittent
+    (but frequent) situation where the vendor session cookie got
+    cleared right before invoking the cancel hold method, leading
+    to its failure.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+18	14	Open-ILS/web/js/ui/default/opac/ebook_api/loggedin.js
+
+commit e6b541bea9302ec004e28c88cda005efa0380527
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Aug 31 12:17:12 2017 -0400
+
+    LP#1673870: some tidying up of JavaScript
+    
+    - test for ebook_spinner div before attempting to set a class
+    - eject a couple Perlisms
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+3	3	Open-ILS/web/js/ui/default/opac/ebook_api/loggedin.js
+
+commit c8a0199542897b0cbc46bf7499d3c7975014556c
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Aug 31 11:49:08 2017 -0400
+
+    LP#1673870: add support for cache-busting
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/templates/opac/myopac/ebook_checkout.tt2
+1	1	Open-ILS/src/templates/opac/myopac/ebook_circs.tt2
+1	1	Open-ILS/src/templates/opac/myopac/ebook_holds.tt2
+1	1	Open-ILS/src/templates/opac/myopac/ebook_holds_ready.tt2
+1	1	Open-ILS/src/templates/opac/myopac/ebook_place_hold.tt2
+1	1	Open-ILS/src/templates/opac/parts/ebook_api/base_js.tt2
+2	2	Open-ILS/src/templates/opac/parts/record/summary.tt2
+2	2	Open-ILS/src/templates/opac/parts/result/table.tt2
+
+commit 9710a3bd15bb9d61927b310546d76a590d2fc3e0
+Author: Jeff Davis <jdavis at sitka.bclibraries.ca>
+Date:   Wed Aug 16 11:30:54 2017 -0700
+
+    LP#1673870: fix OneClickdigital handler to reflect how their API actually works, documentation notwithstanding
+    
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+10	8	Open-ILS/src/perlmods/lib/OpenILS/Application/EbookAPI/OneClickdigital.pm
+
+commit 1004dda5626abf095b966fb7bc2ac317bfe71505
+Author: Jeff Davis <jdavis at sitka.bclibraries.ca>
+Date:   Mon Aug 14 14:03:59 2017 -0700
+
+    LP#1673870: display ebook availability when detailed holdings info is unavailable
+    
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+2	0	Open-ILS/web/js/ui/default/opac/ebook_api/avail.js
+
+commit 210317af1ee75577ae5b355d568288d637ce456d
+Author: Jeff Davis <jdavis at sitka.bclibraries.ca>
+Date:   Wed Jul 12 12:35:43 2017 -0700
+
+    LP#1673870: indicate suspended holds for OverDrive
+    
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	0	Open-ILS/src/perlmods/lib/OpenILS/Application/EbookAPI/OverDrive.pm
+
+commit 07d942af5cff7a861b6b1f1809cae5a8374e430c
+Author: Jeff Davis <jdavis at sitka.bclibraries.ca>
+Date:   Tue Jul 11 15:45:48 2017 -0700
+
+    LP#1673870: move ebook availability JS to standard location
+    
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+0	54	Open-ILS/src/templates/opac/parts/ebook_api/avail_js.tt2
+4	0	Open-ILS/src/templates/opac/parts/ebook_api/base_js.tt2
+0	1	Open-ILS/src/templates/opac/parts/js.tt2
+52	0	Open-ILS/web/js/ui/default/opac/ebook_api/avail.js
+ delete mode 100644 Open-ILS/src/templates/opac/parts/ebook_api/avail_js.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/opac/ebook_api/avail.js
+
+commit b4b649509cf28581b28a13071707f6555301b066
+Author: Jeff Davis <jdavis at sitka.bclibraries.ca>
+Date:   Fri Aug 18 13:35:09 2017 -0700
+
+    LP#1673870: show spinner in My Account while loading from ebook API
+    
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	0	Open-ILS/src/templates/opac/myopac/ebook_checkout.tt2
+1	0	Open-ILS/src/templates/opac/myopac/ebook_circs.tt2
+1	0	Open-ILS/src/templates/opac/myopac/ebook_holds.tt2
+1	0	Open-ILS/src/templates/opac/myopac/ebook_holds_ready.tt2
+1	0	Open-ILS/src/templates/opac/myopac/ebook_place_hold.tt2
+1	0	Open-ILS/web/js/ui/default/opac/ebook_api/loggedin.js
+
+commit 904875cd9cfceeb8681c4d2befa878b61ed65a06
+Author: Jeff Davis <jdavis at sitka.bclibraries.ca>
+Date:   Tue Jul 4 16:20:11 2017 -0700
+
+    LP#1673870: Handle OverDrive ebook checkout and download
+    
+    The workflow for checking out and downloading a title via the OverDrive
+    API is relatively complex:
+    
+    1. Check out a title.
+    
+    2. Lock in a specific format for the checked-out title.  Once you lock
+    in a format, you can only download the title in that format -- except
+    that the browser-based OverDrive Read and OverDrive Listen formats are
+    always available (if supported for that title), even if you've locked in
+    another format.
+    
+    3. Request a link for downloading the title in the specified format.
+    Download links are dynamically generated and only work for 60 seconds
+    from the time of your request.
+    
+    To simplify the process, we require the user to lock in a format during
+    checkout.  Then, when the user clicks the Download button, we request a
+    download link; OverDrive responds with a URL, and we immediately
+    redirect the current browser tab/window to that URL.
+    
+    A new API call, open-ils.ebook_api.title.get_download_link, has been
+    added for requesting the download link.  Since API calls are not
+    vendor-specific, we also add support for the new method in the test
+    module, complete with unit test.
+    
+    Supplementary fixes:
+    
+    - show spinner in My Account while loading from ebook API
+    - ensure session ID is available to ebook object during transactions
+    - fix display of ebook formats
+    
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+43	4	Open-ILS/src/perlmods/lib/OpenILS/Application/EbookAPI.pm
+79	7	Open-ILS/src/perlmods/lib/OpenILS/Application/EbookAPI/OverDrive.pm
+23	0	Open-ILS/src/perlmods/lib/OpenILS/Application/EbookAPI/Test.pm
+9	1	Open-ILS/src/perlmods/live_t/20-lp1541559-ebook-api.t
+1	1	Open-ILS/src/templates/opac/parts/ebook_api/avail_js.tt2
+56	8	Open-ILS/web/js/ui/default/opac/ebook_api/ebook.js
+91	20	Open-ILS/web/js/ui/default/opac/ebook_api/loggedin.js
+
+commit 8a9ba80dd1533138773762a5d3ee4c030b2c92bc
+Author: Jeff Davis <jdavis at sitka.bclibraries.ca>
+Date:   Wed Jun 28 13:49:37 2017 -0700
+
+    LP#1673870: fix bug that prevented more than one ebook transaction from appearing in list in My Account
+    
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+2	2	Open-ILS/web/js/ui/default/opac/ebook_api/loggedin.js
+
+commit 2efd93f58bee719e8d8f85a25dd45b2b6e552a6a
+Author: Jeff Davis <jdavis at sitka.bclibraries.ca>
+Date:   Wed Jun 28 13:36:24 2017 -0700
+
+    LP#1673870: Support placing and canceling OverDrive holds
+    
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+8	2	Open-ILS/src/perlmods/lib/OpenILS/Application/EbookAPI.pm
+53	0	Open-ILS/src/perlmods/lib/OpenILS/Application/EbookAPI/OverDrive.pm
+3	0	Open-ILS/src/perlmods/lib/OpenILS/Application/EbookAPI/Test.pm
+5	0	Open-ILS/src/templates/opac/parts/ebook_api/base_js.tt2
+1	1	Open-ILS/web/js/ui/default/opac/ebook_api/ebook.js
+
+commit 4f9df515878d90c031c75c9d4fb5ebf486a87d4c
+Author: Jeff Davis <jdavis at sitka.bclibraries.ca>
+Date:   Mon Jun 26 16:23:54 2017 -0700
+
+    LP#1673870: Use separate templates for ebook checkouts and holds
+    
+    Previously we used the same TT2 template for listing checkouts and
+    performing a checkout, and for listing holds and placing a hold.  This
+    leads to problems; in particular, URL parameters required for checkout
+    and hold actions were "sticky," so viewing your holds after placing a
+    hold would show the "Place Hold" UI instead of a list of holds.  This
+    commit introduces separate templates for ebook actions as a workaround.
+    
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+33	0	Open-ILS/src/templates/opac/myopac/ebook_checkout.tt2
+2	9	Open-ILS/src/templates/opac/myopac/ebook_circs.tt2
+2	11	Open-ILS/src/templates/opac/myopac/ebook_holds.tt2
+35	0	Open-ILS/src/templates/opac/myopac/ebook_place_hold.tt2
+2	2	Open-ILS/src/templates/opac/parts/record/summary.tt2
+2	2	Open-ILS/src/templates/opac/parts/result/table.tt2
+5	11	Open-ILS/web/js/ui/default/opac/ebook_api/loggedin.js
+ create mode 100644 Open-ILS/src/templates/opac/myopac/ebook_checkout.tt2
+ create mode 100644 Open-ILS/src/templates/opac/myopac/ebook_place_hold.tt2
+
+commit 34b67a5e983b92c9deeb1da5cfabb14f5bf7557c
+Author: Jeff Davis <jdavis at sitka.bclibraries.ca>
+Date:   Fri Jul 14 11:56:54 2017 -0700
+
+    LP#1673870: remove separate JS function for ready-only holds
+    
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+10	41	Open-ILS/web/js/ui/default/opac/ebook_api/loggedin.js
+
+commit 1f8471c342ee4e3f2c800257bb12dd208ea99480
+Author: Jeff Davis <jdavis at sitka.bclibraries.ca>
+Date:   Fri Jun 23 15:57:49 2017 -0700
+
+    LP#1673870: Add ebook API cancel hold functionality to OPAC
+    
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+17	0	Open-ILS/web/js/ui/default/opac/ebook_api/ebook.js
+39	6	Open-ILS/web/js/ui/default/opac/ebook_api/loggedin.js
+
+commit 2bafbbd2aee289e5bb4fc810aeb369cc9ffe00a6
+Author: Jeff Davis <jdavis at sitka.bclibraries.ca>
+Date:   Fri Jun 23 13:43:03 2017 -0700
+
+    LP#1673870: Link ebook transaction objects to vendor in JS
+    
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+4	0	Open-ILS/web/js/ui/default/opac/ebook_api/relation.js
+
+commit e80fd44bf73f770758bb8706b474ddb401e043c1
+Author: Jeff Davis <jdavis at sitka.bclibraries.ca>
+Date:   Wed Jun 21 12:05:11 2017 -0700
+
+    LP#1673870: Add ebook transaction links to search results and record details
+    
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+5	0	Open-ILS/src/templates/opac/parts/ebook_api/avail_js.tt2
+18	0	Open-ILS/src/templates/opac/parts/record/summary.tt2
+22	0	Open-ILS/src/templates/opac/parts/result/table.tt2
+
+commit 2cc4477c4c657ed9a29eb57c58b5b995a35ed59a
+Author: Jeff Davis <jdavis at sitka.bclibraries.ca>
+Date:   Wed Mar 22 13:00:47 2017 -0700
+
+    LP#1673870: Add ebook API place hold functionality to OPAC
+    
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+13	2	Open-ILS/src/templates/opac/myopac/ebook_holds.tt2
+2	0	Open-ILS/src/templates/opac/parts/ebook_api/base_js.tt2
+17	0	Open-ILS/web/js/ui/default/opac/ebook_api/ebook.js
+73	9	Open-ILS/web/js/ui/default/opac/ebook_api/loggedin.js
+
+commit da17a15eb931f82a9b38f2d579c0fed1215a0962
+Author: Jeff Davis <jdavis at sitka.bclibraries.ca>
+Date:   Tue Mar 21 15:32:48 2017 -0700
+
+    LP#1673870: Checkout/renew/checkin methods for OverDrive API
+    
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+91	0	Open-ILS/src/perlmods/lib/OpenILS/Application/EbookAPI/OverDrive.pm
+
+commit 61f4a26d0396fa6ff3fa0293c5f439cdb8d403d7
+Author: Jeff Davis <jdavis at sitka.bclibraries.ca>
+Date:   Fri Mar 17 15:22:32 2017 -0700
+
+    LP#1673870: Add ebook API checkout functionality to OPAC
+    
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+12	4	Open-ILS/src/templates/opac/myopac/ebook_circs.tt2
+13	0	Open-ILS/src/templates/opac/parts/ebook_api/base_js.tt2
+40	0	Open-ILS/web/js/ui/default/opac/ebook_api/ebook.js
+66	1	Open-ILS/web/js/ui/default/opac/ebook_api/loggedin.js
+
+commit bddaee3a63eb5a3e3d1345899dbc5f9c30d52241
+Author: Jeff Davis <jdavis at sitka.bclibraries.ca>
+Date:   Fri Mar 17 13:04:09 2017 -0700
+
+    LP#1673870: Add basic ebook API title lookup
+    
+    Adds an API method to obtain the title and author (and, eventually,
+    cover image URL) for a given ebook via the open-ils.ebook_api service.
+    
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+31	0	Open-ILS/src/perlmods/lib/OpenILS/Application/EbookAPI.pm
+23	0	Open-ILS/src/perlmods/lib/OpenILS/Application/EbookAPI/OneClickdigital.pm
+38	0	Open-ILS/src/perlmods/lib/OpenILS/Application/EbookAPI/Test.pm
+13	1	Open-ILS/src/perlmods/live_t/20-lp1541559-ebook-api.t
+
+commit 346994bd5daaa3c6060431dd41b335f022372b39
+Author: Jeff Davis <jdavis at sitka.bclibraries.ca>
+Date:   Fri Jul 14 11:48:49 2017 -0700
+
+    LP#1673870: process ebook variable in misc_util.tt2
+    
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+4	12	Open-ILS/src/templates/opac/parts/ebook_api/avail.tt2
+11	0	Open-ILS/src/templates/opac/parts/misc_util.tt2
+
+commit b5e13c8060288681fb6760da97d65928253fa957
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Fri Sep 1 16:05:08 2017 -0400
+
+    LP#1638299: Stamping upgrade scripts for authority infrastructure work
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+1630	0	Open-ILS/src/sql/Pg/upgrade/1068.data.MADS21-xsl.sql
+505	0	Open-ILS/src/sql/Pg/upgrade/1069.schema.authority.sql
+489	0	Open-ILS/src/sql/Pg/upgrade/1070.schema.thesauri.sql
+341	0	Open-ILS/src/sql/Pg/upgrade/1071.schema.browse_uses_ahf.sql
+16	0	Open-ILS/src/sql/Pg/upgrade/1072.data.add_seealso_cgf.sql
+0	1628	Open-ILS/src/sql/Pg/upgrade/XXX1.data.MADS21-xsl.sql
+0	503	Open-ILS/src/sql/Pg/upgrade/XXX2.schema.authority.sql
+0	487	Open-ILS/src/sql/Pg/upgrade/XXX3.schema.thesauri.sql
+0	339	Open-ILS/src/sql/Pg/upgrade/XXX4.schema.browse_uses_ahf.sql
+0	14	Open-ILS/src/sql/Pg/upgrade/XXX5.data.add_seealso_cgf.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1068.data.MADS21-xsl.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1069.schema.authority.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1070.schema.thesauri.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1071.schema.browse_uses_ahf.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1072.data.add_seealso_cgf.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXX1.data.MADS21-xsl.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXX2.schema.authority.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXX3.schema.thesauri.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXX4.schema.browse_uses_ahf.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXX5.data.add_seealso_cgf.sql
+
+commit 647a99d37b809574ce798311ce55a81394c0426d
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Fri Sep 1 15:48:27 2017 -0400
+
+    LP#1638299: Fix label for narrower terms
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/src/templates/opac/browse.tt2
+
+commit bf15cab4d69f7d7110780457c3b426c890d0182b
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Sep 1 15:01:29 2017 -0400
+
+    LP#1638299: fix typo
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/src/sql/Pg/300.schema.staged_search.sql
+
+commit b95bd687c34cb4dc4a7c66fa5b3d2fea4ac13a85
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Aug 31 22:42:41 2017 -0400
+
+    LP#1638299: rename schema update scripts to clarify their proper order
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+0	14	Open-ILS/src/sql/Pg/upgrade/WWWW.cgf.sql
+1628	0	Open-ILS/src/sql/Pg/upgrade/XXX1.data.MADS21-xsl.sql
+503	0	Open-ILS/src/sql/Pg/upgrade/XXX2.schema.authority.sql
+487	0	Open-ILS/src/sql/Pg/upgrade/XXX3.schema.thesauri.sql
+339	0	Open-ILS/src/sql/Pg/upgrade/XXX4.schema.browse_uses_ahf.sql
+14	0	Open-ILS/src/sql/Pg/upgrade/XXX5.data.add_seealso_cgf.sql
+0	1628	Open-ILS/src/sql/Pg/upgrade/XXXX.data.MADS21-xsl.sql
+0	503	Open-ILS/src/sql/Pg/upgrade/YYYY.schema.authority.sql
+0	487	Open-ILS/src/sql/Pg/upgrade/YYYY.schema.thesauri.sql
+0	339	Open-ILS/src/sql/Pg/upgrade/ZZZZ.schema.browse_uses_ahf.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/WWWW.cgf.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXX1.data.MADS21-xsl.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXX2.schema.authority.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXX3.schema.thesauri.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXX4.schema.browse_uses_ahf.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXX5.data.add_seealso_cgf.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.MADS21-xsl.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.schema.authority.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.schema.thesauri.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/ZZZZ.schema.browse_uses_ahf.sql
+
+commit 8198c0cea76b7eae98bca48b6eba36039a425ab6
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Aug 31 22:37:01 2017 -0400
+
+    LP#1638299: add release notes
+    
+    Also, here is a basic testing plan:
+    
+    - Upon applying the patch, verify that browse in the public
+      catalog uses See, broader or narrower term, and see also
+      as labels.
+    - Verify that scope notes now only display under the main
+      heading in the browse list.
+    - Verify that turning off the Display related headings (see-also) in browse
+      global flag disables display of see-also (related headings)
+      in the public headings browse. Note that it may be necessary to
+      clear memcached caching of cgf.
+    - Verify that see references are consistently shown.
+    - Verify that Server Administration | Authority Headings Fields works
+    - Verify that Server Administration | Thesauri now includes fields for
+      short code and URI.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+24	0	docs/RELEASE_NOTES_NEXT/Cataloging/Authority_and_Browse_Improvements.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/Authority_and_Browse_Improvements.adoc
+
+commit cbc7c3aa952b10a78bdc3a243b0a31af2e430502
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Aug 31 22:30:02 2017 -0400
+
+    LP#1638299: add new authority.thesaurus columns to IDL
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+2	0	Open-ILS/examples/fm_IDL.xml
+
+commit 916337c23877ec1f75ee44088ff1666dd8c43d04
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Aug 31 22:12:48 2017 -0400
+
+    LP#1638299: fix display of joiners for related and variant headings
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Browse.pm
+
+commit f6f69bfc2f62a1c5c4dfa2837307950d414a98e6
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Aug 31 18:30:14 2017 -0400
+
+    LP#1638299: reify schema and seed data for new databases
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+224	1	Open-ILS/src/sql/Pg/011.schema.authority.sql
+186	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+3	2	Open-ILS/src/sql/Pg/955.data.MADS21-xsl.sql
+1	0	Open-ILS/src/sql/Pg/sql_file_manifest
+
+commit dfdf183e68aaaa29f577dde20d41db5ea002637e
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Aug 31 17:22:36 2017 -0400
+
+    LP#1638299: adjust staff-side authority browse
+    
+    Now that the primary key of the authority.thesarus table
+    has changed from the single-character code to the LC-assigned
+    authority code, a bit of additional translation is required.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+18	5	Open-ILS/web/js/ui/default/cat/authority/list.js
+
+commit 665c8af4df73817d4f4139fb6f71fcf86533177b
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Jul 27 22:31:47 2017 +0000
+
+    LP#1638299: improve display of related headings in browse
+    
+    This patch adds a new global flag to control whether see
+    alsos are displayed at all; it also allows better labels based
+    on the heading purpose.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+19	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Browse.pm
+11	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+14	0	Open-ILS/src/sql/Pg/upgrade/WWWW.cgf.sql
+18	4	Open-ILS/src/templates/opac/browse.tt2
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/WWWW.cgf.sql
+
+commit eebd7b1a96ca771e743f5f1179e683e9689dbd25
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Jul 27 20:51:25 2017 +0000
+
+    LP#1638299: improve display of scope notes in headings browse
+    
+    Scope notes are now displayed only under uses of a heading as a main
+    heading.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+6	12	Open-ILS/src/templates/opac/browse.tt2
+
+commit 8142f7c60c65cd063ee8a7f83fe639f0479ff95f
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Aug 31 16:26:27 2017 -0400
+
+    LP#1358392: use ahf to determine whether headings fields are variant
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+22	3	Open-ILS/src/sql/Pg/300.schema.staged_search.sql
+0	211	Open-ILS/src/sql/Pg/upgrade/XXXX.function.metabib.staged_browse.sql
+339	0	Open-ILS/src/sql/Pg/upgrade/ZZZZ.schema.browse_uses_ahf.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.metabib.staged_browse.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/ZZZZ.schema.browse_uses_ahf.sql
+
+commit cd2b70d9d594c56c467f87851ae9ca5954d206b7
+Author: Srey Seng <sreyseng at gmail.com>
+Date:   Fri Sep 5 14:28:07 2014 -0700
+
+    LP#1358392: See references not always displaying on browse search
+    
+    When browsing for an unauthorized heading, See references are not always
+    displaying on browse search. Those that do display surface due to the
+    existence of cross-reference(s).
+    
+    Desired behaviour is that unauthorized headings should also surface in browse
+    results, even without the existence of cross-reference(s), as long as the
+    authority record containing the unauthorized heading controls at least one bib.
+    There are many authority records that do not have cross-references but do contain
+    unauthorized headings, so browse results that would otherwise be hidden would now
+    be exposed.
+    
+    This fix adds an additional logic to check if the browse term is an
+    unauthorized term and if so, perform a slightly modified procedure
+    but otherwise, perform the usual procedure so as not to break any existing
+    functionality.
+    
+    Signed-off-by: Srey Seng <sreyseng at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    
+    Conflicts:
+    	Open-ILS/src/sql/Pg/030.schema.metabib.sql
+    
+    Rebased to account for eliminated staged search work.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+37	13	Open-ILS/src/sql/Pg/300.schema.staged_search.sql
+211	0	Open-ILS/src/sql/Pg/upgrade/XXXX.function.metabib.staged_browse.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.metabib.staged_browse.sql
+
+commit 1f3fd685901655019dd98e3d9dddb79345ce6cac
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Feb 7 16:40:47 2017 -0500
+
+    LP#1638299: add list of thesauruses
+    
+    This patch gets a full list of subject thesuaruses from LC
+    and uses them in control set mapping.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    
+    Conflicts:
+    	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    
+    Conflicts:
+    	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+
+51	0	Open-ILS/src/extras/convert_LoCSchemas_to_thesauri.pl
+50	0	Open-ILS/src/extras/genreFormSchemes.tsv
+200	0	Open-ILS/src/extras/genreFormSchemes.utf8.json
+345	0	Open-ILS/src/extras/subjectSchemes.tsv
+1176	0	Open-ILS/src/extras/subjectSchemes.utf8.json
+12	1	Open-ILS/src/sql/Pg/011.schema.authority.sql
+433	14	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+2	2	Open-ILS/src/sql/Pg/999.functions.global.sql
+487	0	Open-ILS/src/sql/Pg/upgrade/YYYY.schema.thesauri.sql
+ create mode 100755 Open-ILS/src/extras/convert_LoCSchemas_to_thesauri.pl
+ create mode 100644 Open-ILS/src/extras/genreFormSchemes.tsv
+ create mode 100644 Open-ILS/src/extras/genreFormSchemes.utf8.json
+ create mode 100644 Open-ILS/src/extras/subjectSchemes.tsv
+ create mode 100644 Open-ILS/src/extras/subjectSchemes.utf8.json
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.schema.thesauri.sql
+
+commit de5995d62fa85b03173570c0e21fac80efe1ccd1
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Fri Jan 6 17:43:34 2017 -0500
+
+    LP#1638299: improve extraction of headings from authority records
+    
+    This patch sets up configuration tables, seed data,
+    and functions for extracting headings from authority records based on
+    (usually) the MARCXML to MADS XSLT.
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+27	0	Open-ILS/examples/fm_IDL.xml
+4	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.MADS21-xsl.sql
+503	0	Open-ILS/src/sql/Pg/upgrade/YYYY.schema.authority.sql
+40	0	Open-ILS/src/templates/staff/admin/server/authority/heading_field.tt2
+1	0	Open-ILS/src/templates/staff/admin/server/t_splash.tt2
+196	0	Open-ILS/tests/datasets/sql/auth_lc.sql
+79	0	Open-ILS/web/js/ui/default/staff/admin/server/authority/heading_field.js
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.schema.authority.sql
+ create mode 100644 Open-ILS/src/templates/staff/admin/server/authority/heading_field.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/staff/admin/server/authority/heading_field.js
+
+commit 902b3e342b842e7422be728d7d89d6786fd434f9
+Author: Galen Charlton <gmc at esilibrary.com>
+Date:   Fri Jan 6 14:49:16 2017 -0500
+
+    LP#1638299: sample LC and MeSH authority records
+    
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1076	0	Open-ILS/tests/datasets/sql/auth_lc.sql
+284	0	Open-ILS/tests/datasets/sql/auth_mesh.sql
+6	0	Open-ILS/tests/datasets/sql/load_all.sql
+ create mode 100644 Open-ILS/tests/datasets/sql/auth_lc.sql
+ create mode 100644 Open-ILS/tests/datasets/sql/auth_mesh.sql
+
+commit 30a9bf834d65578087e632e18a29ab5da230fd5d
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Dec 6 16:49:15 2016 -0500
+
+    LP#1638299: MADS 2.1 stylesheet
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1624	0	Open-ILS/src/sql/Pg/955.data.MADS21-xsl.sql
+1624	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.MADS21-xsl.sql
+1451	0	Open-ILS/xsl/MARC21slim2MADS.xsl
+ create mode 100644 Open-ILS/src/sql/Pg/955.data.MADS21-xsl.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.MADS21-xsl.sql
+ create mode 100644 Open-ILS/xsl/MARC21slim2MADS.xsl
+
+commit df79b43c6c1985211c77420406bfa45d0bb57b8e
+Author: Ben Shum <ben at evergreener.net>
+Date:   Tue Aug 15 18:43:09 2017 -0400
+
+    LP#1710991: Do not translate username and workstation in webclient navbar
+    
+    In the web client's navbar, do not translate username and workstation. This
+    causes errors with rendering the menus if other locales translate the
+    variables.
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/templates/staff/navbar.tt2
+
+commit 6e64e975f22feb7594d2b32e63f1c53579e14ab0
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Sep 1 15:24:29 2017 -0400
+
+    LP#1582354: put release notes entry in proper directory and fix typo
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+25	0	docs/RELEASE_NOTES_NEXT/Reports/last_deleted_copy_source.adoc
+0	25	docs/lp1582354_report_able_to_show_bibs_where_the_last_copy_was_deleted_cancels.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Reports/last_deleted_copy_source.adoc
+ delete mode 100644 docs/lp1582354_report_able_to_show_bibs_where_the_last_copy_was_deleted_cancels.adoc
+
+commit 9ede1f1de3eab288cad0dac34e02232b6b79cfdb
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Sep 1 15:23:38 2017 -0400
+
+    LP#1688398: add release notes
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+12	0	docs/RELEASE_NOTES_NEXT/OPAC/Bill_payment_screen.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/Bill_payment_screen.adoc
+
+commit 0efd7b63b425c3f9e4dced248c2db5e97184b69e
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Sep 1 14:35:52 2017 -0400
+
+    LP#1688398: some tidying
+    
+    - add a target for the View Charges button
+    - remove some comments
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+5	5	Open-ILS/src/templates/opac/myopac/main.tt2
+
+commit d2c886e5f83b9efd728a5ef305f7c1d55bd7e9d9
+Author: Cesar Velez <cesar.velez at equinoxinitiative.org>
+Date:   Wed Aug 30 17:14:05 2017 -0400
+
+    LP#1688398 - fix hardcoded logo url in payment email trigger template
+    
+    Remove hardcoded logo so this can go out for 3.0
+    
+    Signed-off by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+0	1	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+
+commit 7a09d8aa23f56fc1c56fcd70c5a4dcd01ded95f4
+Author: Suzanne Paterno <paterno at noblenet.org>
+Date:   Thu Aug 10 13:15:39 2017 -0400
+
+    LP#1688398: revamp public catalog bill payment page
+    
+    - Changed table layout of the credit card charges on the Account screen.
+      Moved checkbox to left of screen, added a column for Billing Type.
+    - Add button to Pay Selected vs All Charges.
+    - Include image of credit cards accepted (need to update with one with
+      AmEx)
+    - Reformatted page for inputting credit card
+    - Updated confirmation screen to bold amount, and list the titles as
+      the ones the user is paying for.
+    - Changed Print reciept template in seed data to look more readable and
+      like other itemized reciepts.
+    
+    Signed-off-by: Suzanne Paterno <paterno at noblenet.org>
+    Signed-off-by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+40	48	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+90	8	Open-ILS/src/templates/opac/css/style.css.tt2
+103	81	Open-ILS/src/templates/opac/myopac/main.tt2
+6	4	Open-ILS/src/templates/opac/myopac/main_pay.tt2
+112	85	Open-ILS/src/templates/opac/myopac/main_payment_form.tt2
+10	4	Open-ILS/src/templates/opac/parts/myopac/main_base.tt2
+-	-	Open-ILS/web/images/credit_card_logo.png
+ create mode 100644 Open-ILS/web/images/credit_card_logo.png
+
+commit a263fbc19b7402c9eb0e32b06152794924619c3f
+Author: Suzanne Paterno <paterno at noblenet.org>
+Date:   Thu Aug 10 11:38:53 2017 -0400
+
+    LP#1688398: change wording on OPAC bill payment pages
+    
+    On the credit card screens replaced the word "Fines" with "Charges"
+    since not all charges are fines. Can be cost of replacement materials,
+    as well as other non-circulation fees.
+    
+    Signed-off-by: Suzanne Paterno <paterno at noblenet.org>
+    Signed-off-by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+8	8	Open-ILS/src/templates/opac/myopac/main.tt2
+1	1	Open-ILS/src/templates/opac/myopac/main_payment_form.tt2
+5	5	Open-ILS/src/templates/opac/parts/myopac/main_base.tt2
+1	1	Open-ILS/src/templates/opac/parts/topnav.tt2
+
+commit 2d5002c76cf31369d3c3745019ca5904831a07f7
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri Sep 1 13:26:05 2017 -0400
+
+    Stamp upgrade scripts for native EDI support
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+32	0	Open-ILS/src/sql/Pg/upgrade/1062.schema.edi_attr_set.sql
+46	0	Open-ILS/src/sql/Pg/upgrade/1063.schema.inheritance-constraint-trigger.sql
+20	0	Open-ILS/src/sql/Pg/upgrade/1064.schema.issuance_scap_fkey.sql
+25	0	Open-ILS/src/sql/Pg/upgrade/1065.schema.serial_pattern_templates.sql
+24	0	Open-ILS/src/sql/Pg/upgrade/1066.data.spt_perms.sql
+171	0	Open-ILS/src/sql/Pg/upgrade/1067.data.edi_attr_set.sql
+0	32	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.edi_attr_set.sql
+0	44	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.inheritance-constraint-trigger.sql
+0	25	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.serial_pattern_templates.sql
+0	171	Open-ILS/src/sql/Pg/upgrade/YYYY.data.edi_attr_set.sql
+0	24	Open-ILS/src/sql/Pg/upgrade/YYYY.data.spt_perms.sql
+0	18	Open-ILS/src/sql/Pg/upgrade/ZZZZ.schema.issuance_scap_fkey.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1062.schema.edi_attr_set.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1063.schema.inheritance-constraint-trigger.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1064.schema.issuance_scap_fkey.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1065.schema.serial_pattern_templates.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1066.data.spt_perms.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1067.data.edi_attr_set.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.edi_attr_set.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.inheritance-constraint-trigger.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.serial_pattern_templates.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.data.edi_attr_set.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.data.spt_perms.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/ZZZZ.schema.issuance_scap_fkey.sql
+
+commit 216bfe515ab8ecdce1aea21cd9da7458b8c59813
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Aug 23 13:07:33 2017 -0400
+
+    LP#1373690 EDI attribute set clone operation
+    
+    Support cloning existing attribute sets via a new 'Clone "<existing set
+    name>"' action in the EDI attr set editor.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+4	0	Open-ILS/src/templates/staff/admin/acq/t_edi_attr_set.tt2
+19	0	Open-ILS/web/js/ui/default/staff/admin/acq/app.js
+
+commit b460000b490b7b80bbef798c7405a2e5394a0360
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Tue Aug 22 16:13:54 2017 -0400
+
+    LP#1373690: add USE_ID_FOR_OWNING_LIB EDI attribute
+    
+    This attribute specifies that the copy owning library
+    should have its ID emitted rather than its shortname, which can
+    be used for Baker & Taylor, which imposes a five-character limit
+    on certain fields. This takes effect only when the INCLUDE_OWNING_LIB
+    EDI attribute is also in effect.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+5	1	Open-ILS/src/perlmods/lib/OpenILS/Utils/EDIWriter.pm
+3	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+3	0	Open-ILS/src/sql/Pg/upgrade/YYYY.data.edi_attr_set.sql
+
+commit a016beac0d5f5d4db3064dde674c0f38c08770d6
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Tue Aug 22 16:03:24 2017 -0400
+
+    LP#1373690: fix typos
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+2	2	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+2	2	Open-ILS/src/sql/Pg/upgrade/YYYY.data.edi_attr_set.sql
+
+commit e4b050edc3a6d9ca8202f9747f673b00004483db
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Tue Aug 22 16:00:47 2017 -0400
+
+    LP#1373690: normalize IMD values better
+    
+    The EDItEUR book ORDERS message allows two 35-character
+    item description data elements in IMD segments; this patch
+    accounts for that. It also, for IMD fields, uses the EDIFACT
+    release character to escape certain characters, better matching
+    how the Ruby EDI translator did it.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+52	8	Open-ILS/src/perlmods/lib/OpenILS/Utils/EDIWriter.pm
+
+commit 7a8ee4c4bef0a3067eb08fcad2785fee21303595
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri Aug 18 11:51:39 2017 -0400
+
+    LP#1373690 EDI 'use_attrs' configuration option
+    
+    Adds a new configuration option for EDI accounts specifying wether
+    purchase orders delivered via a given account should be constructed
+    using the new EDI Attributes in lieu of the traditional JEDI A/T
+    template.
+    
+    The PurchaseOrderEDIRequired A/T validator now bypasses orders with
+    use_attrs=true accounts.  The new edi_order_pusher.pl script only
+    process providers whose default EDI accounts have use_attrs=true (except
+    when a specific PO ID is provided).
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	0	Open-ILS/examples/fm_IDL.xml
+5	5	Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger/Validator/Acq/PurchaseOrderEDIRequired.pm
+2	1	Open-ILS/src/sql/Pg/200.schema.acq.sql
+3	2	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.edi_attr_set.sql
+11	2	Open-ILS/src/support-scripts/edi_order_pusher.pl
+12	0	docs/RELEASE_NOTES_NEXT/Administration/acq-edi-attrs.adoc
+
+commit 1f9855413fbe4306ffdf3f64f079c35b6095371e
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Jun 22 14:49:14 2017 -0400
+
+    LP#1373690 Midwest Library Service EDI attrs
+    
+    Adds a new default collection of EDI attributes for Midwest Library
+    Service.  This includes 2 new attributes to support their EDI format:
+    
+    1. BUYER_ID_ONLY_VENDCODE -- similar to BUYER_ID_INCLUDE_VENDCODE,
+       except the buyer SAN is excluded from the NAD+BY segement.
+    
+    2. INCLUDE_EMPTY_IMD_VALUES -- Render IMD+ fields (title, author,
+       edition, etc.) as if they contain values even when they don't.  Empty
+       values are included as single-space strings.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+18	6	Open-ILS/src/perlmods/lib/OpenILS/Utils/EDIWriter.pm
+15	1	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+14	1	Open-ILS/src/sql/Pg/upgrade/YYYY.data.edi_attr_set.sql
+
+commit 4e49744a13272b949759b249dcf169c3b2e13db4
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Nov 3 11:19:36 2016 -0400
+
+    LP#1373690 EDI attributes release notes
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+38	0	docs/RELEASE_NOTES_NEXT/Administration/acq-edi-attrs.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Administration/acq-edi-attrs.adoc
+
+commit 1fb2f3ff63434e43e40652a4b5734f92057755f5
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Mar 8 12:47:55 2017 -0500
+
+    LP#1373690 EDI attribute sets admin UI
+    
+    1. Create new attribute sets
+    2. Rename attribute Sets.
+    3. Enable / Disable attributes for each attributes set.
+    
+    Found under Admin -> Acquisitions -> EDI Attribute Sets.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+8	0	Open-ILS/src/templates/staff/admin/acq/index.tt2
+67	0	Open-ILS/src/templates/staff/admin/acq/t_edi_attr_set.tt2
+1	0	Open-ILS/src/templates/staff/admin/acq/t_splash.tt2
+7	0	Open-ILS/src/templates/staff/css/style.css.tt2
+192	0	Open-ILS/web/js/ui/default/staff/admin/acq/app.js
+7	3	Open-ILS/web/js/ui/default/staff/services/pcrud.js
+1	0	Open-ILS/web/js/ui/default/staff/services/ui.js
+ create mode 100644 Open-ILS/src/templates/staff/admin/acq/t_edi_attr_set.tt2
+
+commit 74a7ff8148687fb942244d719139c98a689f9fbd
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri May 27 15:46:27 2016 -0400
+
+    LP#1373690 EDI ORDERS generator script
+    
+    Adds a new edi_order_pusher.pl script for generating EDI ORDERS from
+    purchase orders via EDIWriter.pm.  This is a replacement for
+    edi_pusher.pl, but edi_pusher.pl remains for backwards compat.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+225	0	Open-ILS/src/support-scripts/edi_order_pusher.pl
+ create mode 100755 Open-ILS/src/support-scripts/edi_order_pusher.pl
+
+commit 20d7df2b54f3d7e9539da73a625b0dbaae705e0c
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed May 25 17:40:17 2016 -0400
+
+    LP#1373690 Attribute-based EDI generator
+    
+    New Perl module Utils::EDIWriter for buliding EDI ORDERS messages.
+    
+    Vendor-specific toggles live in new database tables (acq.edi_attr,
+    acq.edi_attr_set, acq.edi_attr_set_map).
+    
+    The combination of these 2 replaces the current JEDI Action/Trigger
+    template with toggle embedded in the template.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+61	0	Open-ILS/examples/fm_IDL.xml
+587	0	Open-ILS/src/perlmods/lib/OpenILS/Utils/EDIWriter.pm
+21	1	Open-ILS/src/sql/Pg/200.schema.acq.sql
+147	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+31	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.edi_attr_set.sql
+155	0	Open-ILS/src/sql/Pg/upgrade/YYYY.data.edi_attr_set.sql
+25	0	Open-ILS/src/support-scripts/test-scripts/edi_writer.pl
+ create mode 100644 Open-ILS/src/perlmods/lib/OpenILS/Utils/EDIWriter.pm
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.edi_attr_set.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.data.edi_attr_set.sql
+ create mode 100755 Open-ILS/src/support-scripts/test-scripts/edi_writer.pl
+
+commit cd22fa01980e6c9343012353bd9c43cf61f9838d
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Sep 1 12:31:41 2017 -0400
+
+    LP#1710949: add tests for blocking after failed attempts
+    
+    Enhance the live tests to verify that attempts to log in
+    get blocked after too many failed ones; this assumes
+    a stock value for block_count.
+    
+    General testing plan:
+    
+    [1] Use srfsh to test, e.g.,
+    
+    srfsh# request open-ils.auth open-ils.auth.login {"identifier":"99999389406","password":"12345","type":"opac","org":1}
+    
+    [2] Try various scenarios:
+    
+        - wrong password
+        - type = staff but user doesn't have STAFF_LOGIN
+        - repeated failed attempts
+        - barcode is inactive
+        - using "identifier" in conjunction with opac.barcode_regex set
+        - using "username" or "barcode"
+        - supplying a workstation name that exists
+        - ... or does not
+        - user is inactive
+        - user is marked barrred
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+27	1	Open-ILS/src/perlmods/live_t/24-lp1710949-login-api.t
+
+commit f1f6489e89f7e40b5ba69b5c36367d17a376c82a
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Aug 16 10:55:26 2017 -0400
+
+    LP#1710949 Release notes for auth.login
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+38	0	docs/RELEASE_NOTES_NEXT/API/auth-login-api.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/API/auth-login-api.adoc
+
+commit d067a0027241720bb90058fa5d4751b08e3f05bf
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Tue Aug 15 17:45:19 2017 -0400
+
+    LP#1710949 Redact open-ils.auth.login params
+    
+    Add open-ils.auth.login to the list of API calls whose parameters should
+    not be logged.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	0	Open-ILS/examples/opensrf_core.xml.example
+
+commit 3bc96cf97f88aa07b6373dbd2c8bf6714b255dd8
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Tue Aug 15 15:21:01 2017 -0400
+
+    LP#1710949 auth.login Perl live test script
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+69	0	Open-ILS/src/perlmods/live_t/24-lp1710949-login-api.t
+ create mode 100644 Open-ILS/src/perlmods/live_t/24-lp1710949-login-api.t
+
+commit 18b313d5c933a43dc02ced2ab035197797ea36b3
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Tue Aug 15 13:13:03 2017 -0400
+
+    LP#1710949 open-ils.auth.login API
+    
+    Adds a new open-ils.auth API call 'open-ils.auth.login' which performs
+    the combined steps of open-ils.auth.authenticate.init and
+    open-ils.auth.authenticate.complete so the caller only need call one API
+    to login.
+    
+    API params are consistent with open-ils.auth.authenticate.complete with
+    2 notable excpetions.  The API uses the bare password instead of the
+    hashed password, so the caller also need not perform the extra hashing
+    steps.  Also, no 'nonce' parameter is used as it's no longer needed,
+    because there is no intermediate authentication cache object as with
+    .init.
+    
+    Response data is consistent with open-ils.auth.authenticate.complete.
+    
+    Example:
+    
+    srfsh# request open-ils.auth open-ils.auth.login {"username":"admin","password":"fakepassword"}
+    
+    Other changes in the new code:
+    
+    1. Using the generic "identifier" parameter in combination with the
+       "org" parameter allows the API to reliably determine if a value
+       is a username or barcode.
+    
+    2. Once a caller has reached the configured maximum number of login
+       failures, no further attempts to track failures occurs, based on the
+       idea that no additional cpu/network cycles should be used on a lost
+       cause.
+    
+    3. A failure count object is only added to memcache when failures
+       occur, unlike open-ils.auth.authenticate.init which creates a
+       failure tracking object for every login.
+    
+    4. The code avoids use of the jsonParseFmt() and va_list_to_string()
+       functions as these functions require extra data cleansing.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+287	7	Open-ILS/src/c-apps/oils_auth.c
+
+commit b437f50243e90b63dd3ba6f9532448df8c601a5f
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Tue Aug 29 16:11:13 2017 -0400
+
+    LP#1708291: tweak to subscription selector
+    
+    When entering the Manage Predictions or Manage Issues tab
+    and only one subscription is present in the current OU
+    scope, automatically select it rather than making the operator
+    have to select it manually.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+3	0	Open-ILS/web/js/ui/default/staff/serials/directives/sub_selector.js
+
+commit 1f81ff654fdc42554246a9dc8e1d715b18b5a38a
+Author: Jason Etheridge <jason at EquinoxInitiative.org>
+Date:   Fri Aug 4 13:51:36 2017 -0400
+
+    LP#1708291: remove initials field for serial notes
+    
+    This was a carry-over from the copy notes modal that doesn't
+    apply to serial notes.
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+0	2	Open-ILS/src/templates/staff/serials/t_notes.tt2
+0	7	Open-ILS/web/js/ui/default/staff/serials/directives/subscription_manager.js
+0	7	Open-ILS/web/js/ui/default/staff/serials/directives/view-items-grid.js
+
+commit 55b5bb124b5c4eefb64ef5703952aec70191f139
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Aug 4 14:02:59 2017 -0400
+
+    LP#1708291: add release notes
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+26	0	docs/RELEASE_NOTES_NEXT/Serials/Webstaff_Serials.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Serials/Webstaff_Serials.adoc
+
+commit cf77f78a83e0a3690c0dca1d206577f486441f74
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Apr 13 12:03:52 2017 -0400
+
+    LP#1708291: web staff client serials module
+    
+    This patch adds a serials module to the web staff client, implementing
+    a unified serials interface allowing for the following actions supported
+    by the XUL staff client:
+    
+    - creating subscriptions, distributions, and streams
+    - creating and editing prediction patterns
+    - receiving serial issues, with or without barcodes (units)
+    - batch and quick receiving
+    
+    This module also implements some new features, including
+    
+    - the ability to save prediction pattern codes as templates
+      that can be shared and reused within an Evergreen database
+    - a more streamlined interface for managing subscriptions,
+      distributions, and streams
+    - it is no longer necessary to create a starting issue in
+      order to predict a run of issues; the dialog box for
+      generating a set of predicted issues now lets you specify
+      the starting point directly.
+    - the ability to more directly edit MFHDs
+    
+    The new serials interfaces can be accessed from the record
+    details page via a Serials drop-down button that links to
+    a subscription management page, a quick-receive action, and
+    a MFHD management page. There is also a new Serials Administration
+    page where prediction pattern and serial copy templates can
+    be managed.
+    
+    To test
+    -------
+    * Create, edit, and delete subscriptions, distribution streams,
+      and routing lists.
+    * Use the prediction pattern wizard to create patterns.
+    * Save prediction pattern templates and use them to apply
+      a pattern to new subscriptions.
+    * Verify that sets of issues can be predicted and received.
+    * Create and apply serial copy templates and verify that
+      they are applied when receiving barcoded issues.
+    
+    This patch represents a group coding effort by Galen Charlton,
+    Jason Etheridge, and Mike Rylander.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    
+    Conflicts:
+    	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+    	Open-ILS/web/js/ui/default/staff/cat/catalog/app.js
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+63	5	Open-ILS/examples/fm_IDL.xml
+3	0	Open-ILS/src/extras/ils_events.xml
+301	22	Open-ILS/src/perlmods/lib/OpenILS/Application/Serial.pm
+4	1	Open-ILS/src/perlmods/lib/OpenILS/Utils/MFHD.pm
+22	0	Open-ILS/src/sql/Pg/210.schema.serials.sql
+4	1	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+48	0	Open-ILS/src/sql/Pg/live_t/spt-visibility.pg
+25	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.serial_pattern_templates.sql
+24	0	Open-ILS/src/sql/Pg/upgrade/YYYY.data.spt_perms.sql
+18	0	Open-ILS/src/sql/Pg/upgrade/ZZZZ.schema.issuance_scap_fkey.sql
+0	1	Open-ILS/src/templates/staff/admin/local/t_splash.tt2
+33	0	Open-ILS/src/templates/staff/admin/serials/index.tt2
+44	0	Open-ILS/src/templates/staff/admin/serials/pattern_template.tt2
+338	0	Open-ILS/src/templates/staff/admin/serials/t_attr_edit.tt2
+38	0	Open-ILS/src/templates/staff/admin/serials/t_splash.tt2
+54	0	Open-ILS/src/templates/staff/admin/serials/t_template_list.tt2
+20	0	Open-ILS/src/templates/staff/admin/serials/t_templates.tt2
+11	0	Open-ILS/src/templates/staff/cat/catalog/index.tt2
+16	0	Open-ILS/src/templates/staff/cat/catalog/t_catalog.tt2
+6	0	Open-ILS/src/templates/staff/navbar.tt2
+76	0	Open-ILS/src/templates/staff/serials/index.tt2
+27	0	Open-ILS/src/templates/staff/serials/share/serials_strings.tt2
+55	0	Open-ILS/src/templates/staff/serials/t_apply_binding_template.tt2
+183	0	Open-ILS/src/templates/staff/serials/t_batch_receive.tt2
+5	0	Open-ILS/src/templates/staff/serials/t_chron_selector.tt2
+57	0	Open-ILS/src/templates/staff/serials/t_clone_subscription.tt2
+9	0	Open-ILS/src/templates/staff/serials/t_day_of_week_selector.tt2
+100	0	Open-ILS/src/templates/staff/serials/t_holding_code_dialog.tt2
+7	0	Open-ILS/src/templates/staff/serials/t_item_manager.tt2
+35	0	Open-ILS/src/templates/staff/serials/t_link_mfhd.tt2
+32	0	Open-ILS/src/templates/staff/serials/t_manage.tt2
+26	0	Open-ILS/src/templates/staff/serials/t_mfhd_manager.tt2
+77	0	Open-ILS/src/templates/staff/serials/t_mfhd_tooltip.tt2
+17	0	Open-ILS/src/templates/staff/serials/t_month_day_selector.tt2
+14	0	Open-ILS/src/templates/staff/serials/t_month_selector.tt2
+103	0	Open-ILS/src/templates/staff/serials/t_notes.tt2
+15	0	Open-ILS/src/templates/staff/serials/t_pattern_editor_dialog.tt2
+48	0	Open-ILS/src/templates/staff/serials/t_pattern_summary.tt2
+73	0	Open-ILS/src/templates/staff/serials/t_prediction_manager.tt2
+461	0	Open-ILS/src/templates/staff/serials/t_prediction_wizard.tt2
+15	0	Open-ILS/src/templates/staff/serials/t_print_routing_list.tt2
+76	0	Open-ILS/src/templates/staff/serials/t_receive_alerts.tt2
+118	0	Open-ILS/src/templates/staff/serials/t_routing_list.tt2
+6	0	Open-ILS/src/templates/staff/serials/t_season_selector.tt2
+32	0	Open-ILS/src/templates/staff/serials/t_select_pattern_dialog.tt2
+17	0	Open-ILS/src/templates/staff/serials/t_sub_selector.tt2
+157	0	Open-ILS/src/templates/staff/serials/t_subscription_manager.tt2
+117	0	Open-ILS/src/templates/staff/serials/t_view_items_grid.tt2
+11	0	Open-ILS/src/templates/staff/serials/t_week_in_month_selector.tt2
+14	0	Open-ILS/src/templates/staff/share/t_edit_mfhd.tt2
+25	0	Open-ILS/src/templates/staff/share/t_mfhd_create_dialog.tt2
+22	0	Open-ILS/src/templates/staff/share/t_org_select_dialog.tt2
+22	0	Open-ILS/src/templates/staff/share/t_subscription_select_dialog.tt2
+7	9	Open-ILS/web/js/ui/default/serial/print_routing_list_users.js
+592	0	Open-ILS/web/js/ui/default/staff/admin/serials/app.js
+135	0	Open-ILS/web/js/ui/default/staff/admin/serials/pattern_template.js
+60	3	Open-ILS/web/js/ui/default/staff/cat/catalog/app.js
+69	0	Open-ILS/web/js/ui/default/staff/serials/app.js
+20	0	Open-ILS/web/js/ui/default/staff/serials/directives/item_manager.js
+97	0	Open-ILS/web/js/ui/default/staff/serials/directives/mfhd_manager.js
+203	0	Open-ILS/web/js/ui/default/staff/serials/directives/prediction_manager.js
+711	0	Open-ILS/web/js/ui/default/staff/serials/directives/prediction_wizard.js
+31	0	Open-ILS/web/js/ui/default/staff/serials/directives/sub_selector.js
+943	0	Open-ILS/web/js/ui/default/staff/serials/directives/subscription_manager.js
+545	0	Open-ILS/web/js/ui/default/staff/serials/directives/view-items-grid.js
+1217	0	Open-ILS/web/js/ui/default/staff/serials/services/core.js
+41	0	Open-ILS/web/js/ui/default/staff/services/mfhd.js
+18	6	Open-ILS/web/js/ui/default/staff/services/ui.js
+ create mode 100644 Open-ILS/src/sql/Pg/live_t/spt-visibility.pg
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.serial_pattern_templates.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.data.spt_perms.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/ZZZZ.schema.issuance_scap_fkey.sql
+ create mode 100644 Open-ILS/src/templates/staff/admin/serials/index.tt2
+ create mode 100644 Open-ILS/src/templates/staff/admin/serials/pattern_template.tt2
+ create mode 100644 Open-ILS/src/templates/staff/admin/serials/t_attr_edit.tt2
+ create mode 100644 Open-ILS/src/templates/staff/admin/serials/t_splash.tt2
+ create mode 100644 Open-ILS/src/templates/staff/admin/serials/t_template_list.tt2
+ create mode 100644 Open-ILS/src/templates/staff/admin/serials/t_templates.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/index.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/share/serials_strings.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_apply_binding_template.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_batch_receive.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_chron_selector.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_clone_subscription.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_day_of_week_selector.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_holding_code_dialog.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_item_manager.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_link_mfhd.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_manage.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_mfhd_manager.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_mfhd_tooltip.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_month_day_selector.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_month_selector.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_notes.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_pattern_editor_dialog.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_pattern_summary.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_prediction_manager.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_prediction_wizard.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_print_routing_list.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_receive_alerts.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_routing_list.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_season_selector.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_select_pattern_dialog.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_sub_selector.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_subscription_manager.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_view_items_grid.tt2
+ create mode 100644 Open-ILS/src/templates/staff/serials/t_week_in_month_selector.tt2
+ create mode 100644 Open-ILS/src/templates/staff/share/t_edit_mfhd.tt2
+ create mode 100644 Open-ILS/src/templates/staff/share/t_mfhd_create_dialog.tt2
+ create mode 100644 Open-ILS/src/templates/staff/share/t_org_select_dialog.tt2
+ create mode 100644 Open-ILS/src/templates/staff/share/t_subscription_select_dialog.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/staff/admin/serials/app.js
+ create mode 100644 Open-ILS/web/js/ui/default/staff/admin/serials/pattern_template.js
+ create mode 100644 Open-ILS/web/js/ui/default/staff/serials/app.js
+ create mode 100644 Open-ILS/web/js/ui/default/staff/serials/directives/item_manager.js
+ create mode 100644 Open-ILS/web/js/ui/default/staff/serials/directives/mfhd_manager.js
+ create mode 100644 Open-ILS/web/js/ui/default/staff/serials/directives/prediction_manager.js
+ create mode 100644 Open-ILS/web/js/ui/default/staff/serials/directives/prediction_wizard.js
+ create mode 100644 Open-ILS/web/js/ui/default/staff/serials/directives/sub_selector.js
+ create mode 100644 Open-ILS/web/js/ui/default/staff/serials/directives/subscription_manager.js
+ create mode 100644 Open-ILS/web/js/ui/default/staff/serials/directives/view-items-grid.js
+ create mode 100644 Open-ILS/web/js/ui/default/staff/serials/services/core.js
+ create mode 100644 Open-ILS/web/js/ui/default/staff/services/mfhd.js
+
+commit 9d4ce86fff2b2c1d3ace88d5379e68de06b71d1a
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Jun 29 17:09:54 2017 -0400
+
+    LP#1708291: introduce egI18N
+    
+    egI18N is a module that will serve as a grab-bag of functions
+    related to I18N and L10N. The initial function it provides
+    takes a acpl IDL object and returns a formatted name qualified
+    by the org unit, with the underlying template accessible
+    to the translation subsystem.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    
+    Conflicts:
+    	Open-ILS/src/templates/staff/base_js.tt2
+    	Open-ILS/web/js/ui/default/staff/Gruntfile.js
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+2	0	Open-ILS/src/templates/staff/base_js.tt2
+2	1	Open-ILS/web/js/ui/default/staff/Gruntfile.js
+4	3	Open-ILS/web/js/ui/default/staff/services/coresvc.js
+22	0	Open-ILS/web/js/ui/default/staff/services/i18n.js
+1	0	Open-ILS/web/js/ui/default/staff/test/karma.conf.js
+ create mode 100644 Open-ILS/web/js/ui/default/staff/services/i18n.js
+
+commit e9e5e9a7f4d9f85da84f01a8bc3867ed83856cbb
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Jul 6 17:14:15 2017 -0400
+
+    LP#1708291: teach egBasicComboBox and egDatePicker to accept focusMe
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    
+    Conflicts:
+    	Open-ILS/web/js/ui/default/staff/services/ui.js
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	0	Open-ILS/src/templates/staff/share/t_datetime.tt2
+4	2	Open-ILS/web/js/ui/default/staff/services/ui.js
+
+commit f1fe22bc80f200157fe4a2f89d957a95e570282b
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Mon Apr 24 12:40:37 2017 -0400
+
+    LP#1152753: make it possible for serial units to be added to copy buckets
+    
+    This patch replaces the baseline asset.copy.id fkey constraints with ones
+    that understand inheritance, and change all existing contstraints to do the
+    same via upgrade script.
+    
+    To test
+    -------
+    Create some serial units and verify that they can be added to a copy
+    bucket.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+18	6	Open-ILS/src/sql/Pg/070.schema.container.sql
+32	2	Open-ILS/src/sql/Pg/800.fkeys.sql
+44	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.inheritance-constraint-trigger.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.inheritance-constraint-trigger.sql
+
+commit bad8ab7907b9f32e0c91b027da8258df49880b9f
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Tue Jun 20 18:10:46 2017 -0400
+
+    LP#1708291: add an egHelpPopover directive
+    
+    This directive allows adding help text accessible by clicking
+    on a question mark icon.  Example usage:
+    
+    <eg-help-popover help-text="Use the Force, Leia!">
+    
+    to create simple popover or
+    
+    <eg-help-popover help-text="Learn MARC21"
+                     help-link="https://www.loc.gov/marc"
+    >
+    
+    to have the help text hyperlinked.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+10	0	Open-ILS/src/templates/staff/share/t_help_popover.tt2
+23	0	Open-ILS/web/js/ui/default/staff/services/ui.js
+ create mode 100644 Open-ILS/src/templates/staff/share/t_help_popover.tt2
+
+commit e0a0375f09ee27835faa7967364447b8695d7d77
+Author: Jason Etheridge <jason at equinoxinitiative.org>
+Date:   Tue May 30 11:51:51 2017 -0400
+
+    LP#1708291: add a join filter for angular templates
+    
+    Signed-off-by: Jason Etheridge <jason at equinoxinitiative.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+12	0	Open-ILS/web/js/ui/default/staff/services/ui.js
+
+commit b854319e3b3fa55204ba050ebe45c694053cde25
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed May 24 20:37:17 2017 -0400
+
+    LP#1708291: teach egEmbedFrame about an afterload function
+    
+    The 'afterload' attribute added by this patch allows specifying
+    the name of a function (to be supplied by the embedded content)
+    to run after the frame has been loaded.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+7	1	Open-ILS/web/js/ui/default/staff/services/eframe.js
+
+commit 04f882160973f3a696201d27ca55885abc894e02
+Author: Jason Etheridge <jason at equinoxinitiative.org>
+Date:   Mon May 22 17:28:17 2017 -0400
+
+    LP#1708291: add API for safe deleting various serial records
+    
+    This adds routines for safely deleting subscriptions,
+    distributions and streams.
+    
+    open-ils.serial.subscription.safe_delete
+    open-ils.serial.distribution.safe_delete
+    open-ils.serial.stream.safe_delete
+    open-ils.serial.subscription.safe_delete.dry_run
+    open-ils.serial.distribution.safe_delete.dry_run
+    open-ils.serial.stream.safe_delete.dry_run
+    
+    Won't delete if there are attached serial.item records with a status other
+    than Expected, or if there are any attached non-deleted serial.unit
+    records.
+    
+    The dry_run variants behave exactly the same except they don't actually
+    delete anything.
+    
+    Signed-off-by: Jason Etheridge <jason at equinoxinitiative.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+6	0	Open-ILS/src/extras/ils_events.xml
+158	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Serial.pm
+
+commit 5311a1755f5d33262de1b0ae0571561050799e71
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Tue May 23 17:59:18 2017 -0400
+
+    LP#1708291: teach MARC editor that it can edit MFHDs/SREs
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+21	9	Open-ILS/web/js/ui/default/staff/cat/services/marcedit.js
+
+commit 9e22667fc434193028c826e95d1ec09baa90a1cd
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu May 18 19:24:45 2017 -0400
+
+    LP#1708291: teach egGrid to always show checkbox menu items
+    
+    This patch also tweaks some styles.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+7	2	Open-ILS/src/templates/staff/share/t_autogrid.tt2
+
+commit 407554e93dbe2facfaddfb641e04d927961cc9f0
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Wed May 10 17:36:44 2017 -0400
+
+    LP#1708291: improvements to egEditFmRecord
+    
+    egEditFmRecord now knows how to specify that a custom Angular template
+    be used to supply the input widget for a given field; the initial use
+    of this will be allowing the prediction pattern template editor to be
+    used to set the pattern in a pattern template. The customFieldTemplates
+    attribute is used for this purpose.
+    
+    This patch also teaches egEditFmRecord when to allow an org unit
+    selector to default to the workstation OU. The orgDefaultAllowed
+    attribute is used for this purpose.
+    
+    Finally, a fixes a bug that ensures that the Save button is active
+    only when the entire form is valid.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+53	44	Open-ILS/src/templates/staff/share/t_fm_record_editor.tt2
+41	0	Open-ILS/web/js/ui/default/staff/services/fm_record_editor.js
+
+commit 2690328d76a972208b77ba3ad50c67fce9b436b0
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Tue May 9 14:56:04 2017 -0400
+
+    LP#1708291: add a egShareDepthSelector directive
+    
+    This directive implements a selector for OU-sharing depths; depths
+    and names come from the actor.org_unit_type table. If there are
+    multiple types defined for a given depth, the display value in
+    the selector is the concatenation of their names.
+    
+    The initial use of this directive is for specifying how broadly
+    prediction pattern templates should be seen.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+4	0	Open-ILS/src/templates/staff/share/t_share_depth_selector.tt2
+36	0	Open-ILS/web/js/ui/default/staff/services/ui.js
+ create mode 100644 Open-ILS/src/templates/staff/share/t_share_depth_selector.tt2
+
+commit 973f032feb02c24cf201fdb26ec0ac78b18aaa42
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Apr 21 12:05:45 2017 -0400
+
+    LP#1708291: teach egIDL a new fieldmapper object representation
+    
+    This patch teaches egIDL how to represent fieldmapper objects
+    as objects with attributes rather than getter/setters. This
+    allows FM objects to be more easily bound to common to Angular
+    input widgets, avoiding the verbosity of getterSetter ng-options
+    and the fact that some widgets like uib-datepicker-popup don't
+    support getterSetter in the first place.
+    
+    Usage is:
+    
+      hash = obj.toTypedHash()
+    
+    and
+    
+      obj = new egCore.idl.fromTypedHash(hash);
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+101	0	Open-ILS/web/js/ui/default/staff/services/idl.js
+
+commit 1660b0db5004ae6032c78dcc347305e08ac23347
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Apr 13 15:33:06 2017 -0400
+
+    LP#1682609: upgrade to angular-ui-bootstrap 1.3.3
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+1	1	Open-ILS/web/js/ui/default/staff/package.json
+
+commit fc886e1d96a6bf5f78da305d94a0b4271ca2dbe4
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Aug 31 21:14:32 2017 -0400
+
+    LP#1709521 Apply recent patrons from checkout
+    
+    Load the max recent patrons setting directly in the patron service
+    instead of requring the calling UI to apply it.  This fixes an issue
+    where recent patrons are not set from the checkout-by-barcode
+    interface.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+12	6	Open-ILS/web/js/ui/default/staff/services/patron_search.js
+
+commit baf337b63d09b24a516881a91366da714e472c92
+Author: blake <blake at mobiusconsortium.org>
+Date:   Thu Aug 31 20:33:17 2017 +0000
+
+    LP1655158 Patron Search by Date of Birth
+    
+    Adds three UI boxes to the WBSC "Show Extra" patron search. One for the year, month and day.
+    The javascript on the page is altered to deliver group "4" to the backend. Local javascript
+    strips out non-numeric user entered data. The backend is updated to handle the new group.
+    SQL is genereated using the DATE_PART postgres function.
+    
+    1. Open the web based staff client and browse to the patron search UI.
+    2. Click the show more down arrow button. Notice the lack of birth date field.
+    3. Apply the patch, repeat step one. Notice the addition of birth date boxes.
+    4. Type 1975 into the birth year box and press enter. Notice search results.
+    5. Try searching for partial names and partial birthdates.
+    6. Try entering non-numeric data into the birth date boxes.
+    7. Try searching for patrons without including the dob. Try with only the dob. Try a mix.
+    
+    Signed-off-by: blake <blake at mobiusconsortium.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+20	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/actor.pm
+14	0	Open-ILS/src/templates/staff/share/t_patron_search_form.tt2
+12	0	Open-ILS/web/js/ui/default/staff/services/patron_search.js
+8	0	docs/RELEASE_NOTES_NEXT/Circulation/lp1655158_search_by_dob_NOTES.adoc
+ create mode 100755 docs/RELEASE_NOTES_NEXT/Circulation/lp1655158_search_by_dob_NOTES.adoc
+
+commit edc503b788fd587b014932b0b2fbaf44b295d170
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri Jul 21 14:50:17 2017 -0400
+
+    LP#1695029 Patron reg. supports bool opt-in defaults
+    
+    Support default values for boolean user opt-in settings during patron
+    registration.  A default value of True, true, T, or t (or really
+    anything starting with a 't') is treated as true.  Any other value
+    (including null) means false.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Josh Stompro <stomproj at larl.org>
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+8	2	Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
+
+commit 688e8e1a2df9b45099799d31c90b245147758e4c
+Author: Cesar Velez <cesar.velez at equinoxinitiative.org>
+Date:   Tue Jun 27 15:06:48 2017 -0400
+
+    LP#1695029-Webstaff Fix Patron Registration page never loading
+    
+    It looks like there was a variable mistype causing the page
+    to not load, but the setting that the lp bug mentions wasn't being
+    properly bound and needed to be wrapped to a boolean.
+    
+    Signed-off by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    Signed-off-by: Josh Stompro <stomproj at larl.org>
+    Signed-off-by: Rogan Hamby <rogan.hamby at gmail.com>
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+2	2	Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
+
+commit 5fdb9b0b78f22accebd9760fff5771582bb4179d
+Author: Jason Etheridge <jason at EquinoxInitiative.org>
+Date:   Wed Aug 30 23:48:24 2017 -0400
+
+    lp1709521 stamping schema upgrade
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+26	0	Open-ILS/src/sql/Pg/upgrade/1061.data.recent-patrons.sql
+0	26	Open-ILS/src/sql/Pg/upgrade/XXXX.data.recent-patrons.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1061.data.recent-patrons.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.recent-patrons.sql
+
+commit 930104e2a53619ba797de2925abcd7000af2d4a6
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Tue Aug 29 10:29:16 2017 -0400
+
+    LP#1709521: Tweak description for new OU setting
+    
+    Update the description for the new Number of Retrievable Recent Patrons OU
+    Setting to identify the default value if left unset.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+1	1	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+1	1	Open-ILS/src/sql/Pg/upgrade/XXXX.data.recent-patrons.sql
+
+commit e86fdc7d8ae1ed96a6125778b71b3d116643c6c3
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Sat Aug 12 11:52:26 2017 -0400
+
+    LP#1709521 Release notes for show recent patrons
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+14	0	docs/RELEASE_NOTES_NEXT/Circulation/recent-patrons.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/recent-patrons.adoc
+
+commit 4962d99be33190e5287c6e875bdee7a5ac0e5b02
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Sat Aug 12 11:52:40 2017 -0400
+
+    LP#1709521 Webstaff show recent patrons
+    
+    Adds a new library setting 'ui.staff.max_recent_patrons' which
+    specifices the number of recently accessed patrons staff may quickly
+    refetch from the browser client interface.  If no value is set, it
+    defaults to 1 for backwards compatibility.
+    
+    If the value is 0 or less, no recent patrons may be retrieved and the
+    'Retrieve Last Patron' action is hidden.  If the value is > 1 a new
+    'Retrieve Recent Patrons' menu item appears.  When clicked, the list
+    of recent patrons is displayed in the patron search interface, most
+    recently accessed patrons sorted to the top.
+    
+    For privacy, the recent patrons list expires from the browser when the
+    authenticion token expires.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+23	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+26	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.recent-patrons.sql
+8	1	Open-ILS/src/templates/staff/navbar.tt2
+3	2	Open-ILS/web/js/ui/default/staff/circ/patron/app.js
+7	0	Open-ILS/web/js/ui/default/staff/services/navbar.js
+77	4	Open-ILS/web/js/ui/default/staff/services/patron_search.js
+7	2	Open-ILS/web/js/ui/default/staff/services/startup.js
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.recent-patrons.sql
+
+commit 4fc789e90bc31f98cd3adb3898ee2d5e23bca3b8
+Author: Cesar Velez <cesar.velez at equinoxinitiative.org>
+Date:   Wed Aug 16 17:39:30 2017 -0400
+
+    LP#1683575 - Webstaff fix silent fail of bad barcodes in ItemStatus
+    
+    This address the current issue in master, that causes bad barcodes
+    to fail silently.
+    
+    To test
+    -------
+    [1] In the web staff client, go to Item Status and enter an item
+        barcode that is not present in the database. Note that no
+        warning message displayed.
+    [2] Apply the patch and repeat step 1. This tie, an 'Item Not Found'
+        message is displayed.
+    
+    Signed-off by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+5	0	Open-ILS/web/js/ui/default/staff/circ/services/item.js
+
+commit 18d1064ed6df5dee42f0987ec71040fc9f5dd7bd
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Aug 30 17:03:31 2017 -0400
+
+    LP#1642086: Relase note for jQuery support
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+6	0	docs/RELEASE_NOTES_NEXT/OPAC/jquery_for_opac.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/jquery_for_opac.adoc
+
+commit 74e1fba0f5f6a0fd61db86216107b57a36f209a5
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Aug 30 16:54:59 2017 -0400
+
+    LP#1642086: Adjust offline resources for jquery support
+    
+    Offline needs to know about all the resources and their correct locations.
+    Since we're moving jquery.min.js, tell it about that.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/templates/staff/base_js.tt2
+
+commit 5120189a1b973495608131634fab376daa075dff
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Aug 30 11:53:40 2017 -0400
+
+    LP#1642086 TPAC Jquery path repair, .gitignore, karma
+    
+    * Repair JS path in TPAC jquery import.
+    
+    * Tell git to ignore Open-ILS/web/js/ui/default/common/build/ since it
+      only contains generated files.
+    
+    * Add jquery to Karma unit test dependencies.  This is not strictly
+      required, since angular includes a slim jquery shim, but having the
+      unit tests load the same base JS as the UI is probably best.
+      Confirmed tests still pass.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	0	.gitignore
+1	1	Open-ILS/src/templates/opac/parts/js.tt2
+1	0	Open-ILS/web/js/ui/default/staff/test/karma.conf.js
+
+commit 92dce936ac9dec063c52c1878ef647a284110312
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Aug 15 12:51:16 2017 -0400
+
+    LP#1642086: Smallest possible JQuery patch that could work...
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+7	0	Open-ILS/src/templates/opac/parts/config.tt2
+5	0	Open-ILS/src/templates/opac/parts/js.tt2
+1	1	Open-ILS/src/templates/staff/base_js.tt2
+10	2	Open-ILS/web/js/ui/default/staff/Gruntfile.js
+
+commit f1e2631e2cf586d906cf9fe0f971274045b8d243
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Aug 29 15:03:51 2017 -0400
+
+    The ngToast maintainers decided to trick us with a new directory name. Thanks.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+2	2	Open-ILS/web/js/ui/default/staff/Gruntfile.js
+
+commit 23886b41105ee0e901a29fd113684a24ffd02852
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Aug 29 14:42:03 2017 -0400
+
+    Fix the "404 asset" test
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+3	2	Open-ILS/src/perlmods/live_t/24-offline-all-assets.t
+
+commit 346cba8d8f4606a3fdbc356194d5b511869cebb7
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Aug 29 14:15:06 2017 -0400
+
+    Reorder the tabs and adjust the default based on logged-in-ness
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+177	177	Open-ILS/src/templates/staff/offline-interface.tt2
+12	4	Open-ILS/web/js/ui/default/staff/offline.js
+
+commit b77f4cb27f98bf0a673f0a7e9c286b2dd2362d4a
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Aug 29 14:14:34 2017 -0400
+
+    Remove confusing "session" tab from the offline menu entry -- the code will figure out the correct default tab
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/src/templates/staff/navbar.tt2
+
+commit 40079db66be4ab3450182362b1ff5ac684a449cf
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Aug 29 14:13:48 2017 -0400
+
+    Add moment.js to the offline asset list
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+2	0	Open-ILS/src/templates/staff/base_js.tt2
+
+commit 2b843e55d59b31068197eb248294395af8b33602
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Aug 8 13:25:39 2017 -0400
+
+    offline: Load Lovefield wrapper in addition to the Lovefield framework
+    
+    Spotted by Bill Erickson.  Thanks, Bill.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    
+    Conflicts:
+    	Open-ILS/web/js/ui/default/staff/test/karma.conf.js
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	0	Open-ILS/web/js/ui/default/staff/test/karma.conf.js
+
+commit 185fbc402af561165439ddf04e82cf0dab804da7
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Mon Aug 7 11:12:53 2017 -0400
+
+    offline: add live-test for offline assets
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+7	0	Open-ILS/src/perlmods/live_t/24-offline-all-assets.t
+ create mode 100644 Open-ILS/src/perlmods/live_t/24-offline-all-assets.t
+
+commit cb523260f300377b9977b98d1bb9010e0419581d
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Mon Aug 7 10:05:05 2017 -0400
+
+    offline: Remove reference to nonexistent file
+    
+    When the status bar was removed back in commit 7814064, the reference to its
+    backing JS file was removed from base_js.tt2.  It looks like that slipped
+    back in at some point in the combined serials/offline branch.  This removes
+    that references, which causes offline failure.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+0	1	Open-ILS/src/templates/staff/base_js.tt2
+
+commit 5305b78a3c63b85a770f873139aec4701077ae38
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri Aug 4 11:16:17 2017 -0400
+
+    offline: Load lovefield in the testing framework
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	0	Open-ILS/web/js/ui/default/staff/test/karma.conf.js
+
+commit 09854bc35b46dc887e49ee307d71fa6ceab9813b
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Jul 27 12:59:43 2017 -0400
+
+    offline: Prefer user-supplied param to browser-supplied cookie in the authen proxy
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+2	2	Open-ILS/src/perlmods/lib/OpenILS/WWW/Proxy/Authen.pm
+
+commit 83dbb0001134b4323acb7e50b79c67d779aff1f5
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Tue Jul 25 17:10:48 2017 -0400
+
+    offline: Make sure the the field_doc structure exists before writing to it
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+2	0	Open-ILS/web/js/ui/default/staff/offline.js
+
+commit d94719306d63457ed25c03deb2d4ce07d01e8315
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed May 31 11:29:36 2017 -0400
+
+    webstaff: IDL Clone
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+15	45	Open-ILS/web/js/ui/default/staff/services/idl.js
+
+commit 7c3cdbbd140865e07d08952422c82605ac8c5676
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Mon Mar 20 16:38:15 2017 -0400
+
+    LP#1706107: Offline mode
+    
+    Here is implemented an offline mode interface for the web staff client.
+    
+    It is made available during both network and server outages by using the
+    UpUp[1] service worker wrapper.
+    
+    We leverage Lovefield[2] for local storage of library settings, configuration
+    data, offline transactions, and the standalone offline block list.
+    
+    In order to make use of the offline interface, users should first log into
+    the web staff client and navigate to the "Search -> Search for Patrons"
+    interface, perform a search, select a user from the results, and open the
+    Patron Editor interface.  This will allow the offline interface to collect
+    all the relevant configuration information for the workstation.  In addition,
+    the offline interface available from the Circulation menu provides a "Download
+    block list" button when accessed while logged in.
+    
+    [1]https://www.talater.com/upup/
+    [2]https://google.github.io/lovefield/
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    
+    Conflicts:
+    	Open-ILS/src/templates/staff/base_js.tt2
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+36	7	Open-ILS/src/offline/offline.pl
+4	0	Open-ILS/src/templates/staff/admin/workstation/t_print_templates.tt2
+91	0	Open-ILS/src/templates/staff/base_js.tt2
+1	1	Open-ILS/src/templates/staff/circ/patron/reg_actions.tt2
+10	4	Open-ILS/src/templates/staff/circ/patron/t_edit.tt2
+2	2	Open-ILS/src/templates/staff/config.tt2
+1	0	Open-ILS/src/templates/staff/index.tt2
+52	5	Open-ILS/src/templates/staff/navbar.tt2
+632	0	Open-ILS/src/templates/staff/offline-interface.tt2
+25	0	Open-ILS/src/templates/staff/share/print_templates/t_offline_checkin.tt2
+26	0	Open-ILS/src/templates/staff/share/print_templates/t_offline_checkout.tt2
+24	0	Open-ILS/src/templates/staff/share/print_templates/t_offline_in_house_use.tt2
+24	0	Open-ILS/src/templates/staff/share/print_templates/t_offline_renew.tt2
+6	0	Open-ILS/src/templates/staff/share/t_datetime.tt2
+6	0	Open-ILS/src/templates/staff/t_login.tt2
+21	0	Open-ILS/web/LICENSE.UpUp
+11	7	Open-ILS/web/js/ui/default/staff/Gruntfile.js
+6	2	Open-ILS/web/js/ui/default/staff/app.js
+24	7	Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
+2109	0	Open-ILS/web/js/ui/default/staff/offline.js
+1	0	Open-ILS/web/js/ui/default/staff/package.json
+27	17	Open-ILS/web/js/ui/default/staff/services/auth.js
+66	31	Open-ILS/web/js/ui/default/staff/services/env.js
+56	2	Open-ILS/web/js/ui/default/staff/services/file.js
+36	0	Open-ILS/web/js/ui/default/staff/services/hatch.js
+0	2	Open-ILS/web/js/ui/default/staff/services/idl.js
+406	0	Open-ILS/web/js/ui/default/staff/services/lovefield.js
+22	29	Open-ILS/web/js/ui/default/staff/services/navbar.js
+27	8	Open-ILS/web/js/ui/default/staff/services/org.js
+6	3	Open-ILS/web/js/ui/default/staff/services/print.js
+2	0	Open-ILS/web/js/ui/default/staff/services/startup.js
+70	26	Open-ILS/web/js/ui/default/staff/services/ui.js
+7	0	Open-ILS/web/upup.min.js
+7	0	Open-ILS/web/upup.sw.min.js
+ create mode 100644 Open-ILS/src/templates/staff/offline-interface.tt2
+ create mode 100644 Open-ILS/src/templates/staff/share/print_templates/t_offline_checkin.tt2
+ create mode 100644 Open-ILS/src/templates/staff/share/print_templates/t_offline_checkout.tt2
+ create mode 100644 Open-ILS/src/templates/staff/share/print_templates/t_offline_in_house_use.tt2
+ create mode 100644 Open-ILS/src/templates/staff/share/print_templates/t_offline_renew.tt2
+ create mode 100644 Open-ILS/web/LICENSE.UpUp
+ create mode 100644 Open-ILS/web/js/ui/default/staff/offline.js
+ create mode 100644 Open-ILS/web/js/ui/default/staff/services/lovefield.js
+ create mode 100644 Open-ILS/web/upup.min.js
+ create mode 100644 Open-ILS/web/upup.sw.min.js
+
+commit 4bea26e2721cd0cb52f2a4a6f7b570e98a83b720
+Author: Cesar Velez <cesar.velez at equinoxinitiative.org>
+Date:   Thu Aug 24 17:17:11 2017 -0400
+
+    LP#1710512 - OPAC js strings need to be i18n-izable
+    
+    Adds a way to translate displayed string messages, in OPAC
+    JS source code alerts and other outputs. This is done by having
+    js.tt2 include i18n-strings.tt2 which contains an explosed/global
+    JS blob variable called eg_opac_i18n. This is intended to work
+    in similar fashion as base_js.tt2 in the webstaff ng client.
+    
+    Signed-off by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+9	0	Open-ILS/src/templates/opac/i18n_strings.tt2
+1	1	Open-ILS/src/templates/opac/parts/js.tt2
+1	1	Open-ILS/web/js/ui/default/opac/holds-validation.js
+ create mode 100644 Open-ILS/src/templates/opac/i18n_strings.tt2
+
+commit 4b462fb7dd61713d69c89d3b02c4ad77217b441d
+Author: Jason Etheridge <jason at EquinoxInitiative.org>
+Date:   Tue Aug 29 17:44:26 2017 -0400
+
+    lp1582354 stamping schema upgrade
+    
+    and some other tweaks:
+    
+    1) removing permacrud stanza from IDL entry
+    2) changing a tab to spaces
+    3) making the upgrade script match the extend-reporter.sql change
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+0	5	Open-ILS/examples/fm_IDL.xml
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+1	1	Open-ILS/src/sql/Pg/extend-reporter.sql
+31	0	Open-ILS/src/sql/Pg/upgrade/1060.LP1582354_report_able_to_show_bibs_where_the_last_copy_was_deleted_cancels.sql
+0	30	Open-ILS/src/sql/Pg/upgrade/XXXX.LP1582354_report_able_to_show_bibs_where_the_last_copy_was_deleted_cancels.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1060.LP1582354_report_able_to_show_bibs_where_the_last_copy_was_deleted_cancels.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.LP1582354_report_able_to_show_bibs_where_the_last_copy_was_deleted_cancels.sql
+
+commit 4ec0f29df944193ea668f67380c7d2a487bffb4f
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Thu Sep 29 13:08:15 2016 -0400
+
+    LP#1582354 - Add owning_lib to available links.
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+3	1	Open-ILS/examples/fm_IDL.xml
+2	1	Open-ILS/src/sql/Pg/extend-reporter.sql
+
+commit 0325d0a5fcee2c6747064bdedee5d4c3462ea3f0
+Author: blake <blake at mobiusconsortium.org>
+Date:   Tue May 17 16:27:00 2016 -0500
+
+    LP1582354 report able to show bibs where the last copy was deleted cancels
+    
+    Created a view for ease of reporting. This source table allows you to construct
+    a clever aggregate report template which will report bibliographic ID's where a
+    library or a group of libraries no longer have a copy attached but had* a copy
+    attached. This is especially useful when a holdings sync is required with an
+    external vendor.
+    
+    Signed-off-by: blake <blake at mobiusconsortium.org>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+20	0	Open-ILS/examples/fm_IDL.xml
+22	2	Open-ILS/src/sql/Pg/extend-reporter.sql
+27	0	Open-ILS/src/sql/Pg/t/lp1582354_report_able_to_show_bibs_where_the_last_copy_was_deleted_cancels.pg
+30	0	Open-ILS/src/sql/Pg/upgrade/XXXX.LP1582354_report_able_to_show_bibs_where_the_last_copy_was_deleted_cancels.sql
+25	0	docs/lp1582354_report_able_to_show_bibs_where_the_last_copy_was_deleted_cancels.adoc
+ create mode 100644 Open-ILS/src/sql/Pg/t/lp1582354_report_able_to_show_bibs_where_the_last_copy_was_deleted_cancels.pg
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.LP1582354_report_able_to_show_bibs_where_the_last_copy_was_deleted_cancels.sql
+ create mode 100644 docs/lp1582354_report_able_to_show_bibs_where_the_last_copy_was_deleted_cancels.adoc
+
+commit 9e60f478f574f546bd40a019f75cb4119130ae8f
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Tue Aug 29 11:27:30 2017 -0400
+
+    LP#1048822: Release notes entry for fuller simplified pull list title
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+6	0	docs/RELEASE_NOTES_NEXT/Circulation/simplified_pull_list_fuller_title.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/simplified_pull_list_fuller_title.adoc
+
+commit 75c7e2c0081583c4bb32e5a483baa9c30601b1c2
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Tue Aug 29 11:10:12 2017 -0400
+
+    LP#1048822: Stamping upgrade script for simplified pull list fuller title
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+51	0	Open-ILS/src/sql/Pg/upgrade/1059.lp1048822_fuller_title_super_simple.sql
+0	48	Open-ILS/src/sql/Pg/upgrade/XXXX.lp1048822_fuller_title_super_simple.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1059.lp1048822_fuller_title_super_simple.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.lp1048822_fuller_title_super_simple.sql
+
+commit 1bb10d44996351c362ac837dc8f9a0a641903e05
+Author: Josh Stompro <stomproj at larl.org>
+Date:   Fri Jul 1 13:54:54 2016 -0500
+
+    LP#1048822 - Fuller Title for reporter.super_simple_record
+    
+    The simplified pull list uses reporter.super_simple_record for
+    title information.  reporter.super_simple_record currently only
+    pulls the first 245a value for the title.  For titles that
+    use 245(n|p) to fully identify the title this leaves out information
+    that staff need to find the item.
+    
+    This patch adds all of the 245(n|p) to the 245a in the title.  I've found
+    this covers most cases where staff need a fuller title.  The order of
+    the 245(n|p) also matters, so steps are taken to keep the marc ordering
+    of those fields.
+    
+    Testing:
+    
+    Before Patch - find a title that uses a 245(n|p) field to fully identify the
+    title.  Place a hold on the title.  Use the simplified pull list to view the
+    location that has that item on the shelf.  Observe that only the 245a is in
+    the title field.
+    
+    After Patch - Look at the simplified pull list again and see that the title now
+    includes more information.
+    
+    Signed-off-by: Josh Stompro <stomproj at larl.org>
+    Signed-off-by: Dan Pearl <dpearl at cwmars.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+12	1	Open-ILS/src/sql/Pg/reporter-schema.sql
+48	0	Open-ILS/src/sql/Pg/upgrade/XXXX.lp1048822_fuller_title_super_simple.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.lp1048822_fuller_title_super_simple.sql
+
+commit 8c7bdaa944117eb29cce47d5d23a842db1586596
+Author: Skye Howard <showard at catalyte.io>
+Date:   Thu Aug 17 21:52:08 2017 +0000
+
+    LP#1629298: Web Client Checkout Fails For Barcodes With Spaces
+    
+    Web Client checkout trims spaces from patron barcodes differently than xul client checkout
+    The web client was not removing the whitespaces before checking barcode searches
+    this commit includes a step where the whitespaces are removed.
+    
+    Signed off by Skye Howard <showard at catalyte.io>
+    Signed off by Cesar Velez <cesar.velez at equinoxinitiative.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/web/js/ui/default/staff/circ/patron/app.js
+
+commit 47fa55c97cdd8eee851595be20667fad4c1dd6ec
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Mon Aug 28 13:14:13 2017 -0400
+
+    LP#1668734: stamp DB update
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+42	0	Open-ILS/src/sql/Pg/upgrade/1058.data.action-trigger.event_definition.sms_preminder.sql
+0	42	Open-ILS/src/sql/Pg/upgrade/XXXX.data.action-trigger.event_definition.sms_preminder.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1058.data.action-trigger.event_definition.sms_preminder.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.action-trigger.event_definition.sms_preminder.sql
+
+commit fc9be0650aa7d801c6d3fe72461993e45ab1e619
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Mon Aug 28 13:11:29 2017 -0400
+
+    LP#1668734: set max_delay, similar to stock courtesy email notice
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+2	2	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+2	2	Open-ILS/src/sql/Pg/upgrade/XXXX.data.action-trigger.event_definition.sms_preminder.sql
+
+commit e888f2db7c9e9d8e975900ab08828afe413f8fea
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Mon Aug 28 12:55:50 2017 -0400
+
+    LP#1668734: pin ID of new A/T definition
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+5	5	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+5	5	Open-ILS/src/sql/Pg/upgrade/XXXX.data.action-trigger.event_definition.sms_preminder.sql
+
+commit 6e019d8d159701100cad43fdff336d28259297d5
+Author: McCanna <tmccanna at georgialibraries.org>
+Date:   Thu Jul 20 15:44:28 2017 -0400
+
+    LP#1668734 Action Trigger for SMS Preminder
+    
+    New optional SMS text notification to be sent 3 days prior to the due
+    date of any circulating item for patrons who have an SMS text number
+    and carrier stored in their accounts. This action trigger is disabled
+    by default and can be enabled in Admin > Local Administration >
+    Notifications / Action Triggers.
+    
+    Signed-off-by: McCanna <tmccanna at georgialibraries.org>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+33	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+42	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.action-trigger.event_definition.sms_preminder.sql
+10	0	docs/RELEASE_NOTES_NEXT/Administration/action_trigger_preminder.adoc
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.action-trigger.event_definition.sms_preminder.sql
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Administration/action_trigger_preminder.adoc
+
+commit f21505025bfed5e7b6ac94e0c9440d027f327cf9
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Mon Aug 28 11:21:16 2017 -0400
+
+    LP#1698206: Stamping upgrade script for copy_vis_attr_cache
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+1214	0	Open-ILS/src/sql/Pg/upgrade/1057.schema.copy_vis_attr_cache.sql
+0	1212	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.copy_vis_attr_cache.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1057.schema.copy_vis_attr_cache.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.copy_vis_attr_cache.sql
+
+commit 24cd717e04d3fb4f96d8989c2883d3605f380a79
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Aug 17 18:22:37 2017 -0400
+
+    LP#1698206: basic release notes entry
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+4	0	docs/RELEASE_NOTES_NEXT/Architecture/pure_sql_searching.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Architecture/pure_sql_searching.adoc
+
+commit 58fe62d8a43aac350830e17f35f80d6d781ce8a0
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Aug 17 18:16:39 2017 -0400
+
+    LP#1698206: remove now-superfluous include of List::MoreUtils
+    
+    I've verified during rebasing that the rework introduced by the
+    eliminate staged search branch happen to include an independent
+    fix of LP#1624443.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+0	1	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Util.pm
+
+commit c3a96ff241ee9cb6573cb8d0848992491bad595a
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Aug 17 12:35:03 2017 -0400
+
+    LP#1698206: fix sequence error in schema update script
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+196	196	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.copy_vis_attr_cache.sql
+
+commit aaf0056d49bd36518fff992fbbb2d3469c2e1d62
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Aug 9 14:14:42 2017 -0400
+
+    LP#1698206: Remove remaining SQL uses of the old copy visibility cache
+    
+    There were two remaining uses of the old copy vis cache in SQL functions used
+    to render OPAC pages.  This commit gets rid of those.
+    
+    There is still one reference to the asset.opac_visible_copies table in the old
+    staged-search function, but that is not used anywhere in the code now, so no
+    need to change that.  Instead, we should start pruning old code.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+20	14	Open-ILS/src/sql/Pg/990.schema.unapi.sql
+196	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.copy_vis_attr_cache.sql
+
+commit 3af40daa339a695f11cbeddd2c6e0aeb4ed2ede7
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri Aug 4 13:22:24 2017 -0400
+
+    LP#1698206: Remove remaining uses of the old copy visibility cache
+    
+    Some Perl was still using the old cache table, so this teaches them the new
+    style.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+11	4	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/action.pm
+2	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/metabib.pm
+7	1	Open-ILS/src/support-scripts/sitemap_generator
+
+commit 95e6be5c2710f47bd60a9e6cda45796a5b83e65e
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Fri Aug 4 12:52:05 2017 -0400
+
+    LP#1698206: Copy counts generated from new vis cache data
+    
+    The unAPI, erm, API was depending on old copy visibility caching tables.  Here
+    we teach it to use the new style.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+39	20	Open-ILS/src/sql/Pg/040.schema.asset.sql
+145	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.copy_vis_attr_cache.sql
+
+commit 19953de64b9e24aaef8f815c356f34b9407d713d
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Mon Jul 31 11:40:07 2017 -0400
+
+    LP#1698206: Reify baseline schema
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	0	Open-ILS/src/sql/Pg/010.schema.biblio.sql
+2	489	Open-ILS/src/sql/Pg/030.schema.metabib.sql
+9	0	Open-ILS/src/sql/Pg/040.schema.asset.sql
+797	18	Open-ILS/src/sql/Pg/300.schema.staged_search.sql
+0	267	Open-ILS/src/sql/Pg/999.functions.global.sql
+1	1	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.copy_vis_attr_cache.sql
+
+commit 7319e93ca989f2abccd15b1aff70ab5904aa3cab
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Jul 19 14:07:39 2017 -0400
+
+    LP#1698206: Make use of current search library in autosuggest
+    
+    Here we teach autosuggest how to check the opac search scope.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+16	5	Open-ILS/src/sql/Pg/030.schema.metabib.sql
+14	2	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.copy_vis_attr_cache.sql
+
+commit abdf6f8ebc385996be871594af8985a2fc07b4a2
+Author: Mike Rylander <miker at esilibrary.com>
+Date:   Mon Jul 10 10:35:07 2017 -0400
+
+    LP#1698206: Indicate broad searches and heavy facets
+    
+    There is a configurable, pagable limit on hits, defined by the superpage
+    size and max superpages.  When the hit count equals this (by default,
+    100000) we add a '+' to the hit count to show that there are even more hits.
+    
+    Facets are calculated per superpage, and if the facet use count equals the
+    number of superpages seen so far multiplied by the superpage size, we
+    likewise add '+' to indicate that there are likely more records matching the
+    facet.
+    
+    For facets, a user can page far enough to increase the visible number, if
+    they cross superpage boundaries.
+    
+    Signed-off-by: Mike Rylander <miker at esilibrary.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm
+3	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Search.pm
+1	1	Open-ILS/src/templates/opac/parts/result/facets.tt2
+1	0	Open-ILS/src/templates/opac/parts/result/paginate.tt2
+
+commit ec22696f691b30a085e6f6e4d0ed95de7e63d42e
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Jun 28 18:13:30 2017 -0400
+
+    LP#1698206: Add TechRef documentation from commit message
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+197	0	docs/TechRef/PureSQLSearch.adoc
+ create mode 100644 docs/TechRef/PureSQLSearch.adoc
+
+commit 688c2a26d0921ba06dd633835348bdda3989591b
+Author: Mike Rylander <miker at esilibrary.com>
+Date:   Wed Jun 28 18:07:21 2017 -0400
+
+    LP#1698206: Remove hit estimation cruft
+    
+    The old code needed to refine the estimated hit count as each superpage was
+    read, but we don't need any of that anymore.  Also, it was causing hit count
+    display issues on superpages after the first.  So, we do away with all that.
+    
+    Signed-off-by: Mike Rylander <miker at esilibrary.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+6	52	Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm
+1	9	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/metabib.pm
+
+commit d9fa69dee18b43d5a2efc460411c45f4064ae7cc
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Jun 15 15:54:40 2017 -0400
+
+    LP#1698206: Eliminate Staged Search
+    
+    === Background
+    Evergreen stores all data, including that useful for patron and staff search,
+    in a normalized schema that is time and space efficient for transactional use
+    cases, and provides guarantees on data integrity.  In addition, development is
+    made simpler than would be the case otherwise and arbitrary reporting is made
+    possible.
+    
+    However, this structure is not effective for direct, SQL-only search
+    functionality in a hierarchical, consortial dataset.  This is a problem that
+    is relatively unique to Evergreen, as it is most often employed to host and
+    serve large consortia with overlapping bibliographic datasets and
+    non-overlapping item and location datasets.  Other search engines, including
+    those built into other ILSs, do not generally have to account for
+    hierarchically organized location visibility concerns as a primary use case.
+    In other words, because it provides functionality that requires a hierarchical
+    view of non-bibliographic data, a problem space for Evergreen is essentially
+    nonexistent in competing products.
+    
+    Evergreen's search infrastructure has evolved over the years.  In its current
+    form, the software first performs a full text search against extracted
+    bibliographic data and limits this initial internal result set to a
+    configurable size.  It then investigates the visibility of each result on
+    several non-bibliographic axes.  These visibility tests take up the
+    preponderance of CPU time spent in search, with full text search of the
+    bibliographic data generally completing within milliseconds. The main reason
+    this multi-stage mechanism is used is that there are many visibility axes and
+    attempting to join all required data sources together in a single query will
+    cause the search use case to perform very poorly.  A previous attempt to
+    create a pure SQL search mechanism failed for this reason.
+    
+    A significant drawback of the current approach is that the costs imposed by
+    visibility filtering search results using normalized non-bibliographic data,
+    either in-query or separated from the main full-text query as it is today,
+    make it necessary to place limits on the number of database rows matched by
+    full-text query constructs.  This in turn can cause searches to omit results
+    in certain situations, such as a large consortium consisting of a few large
+    libraries and many small libraries.
+    
+    However, it has been shown possible to overcome this performance issue by
+    providing an extensible way to collect all visibility related information
+    together into a small number of novel data structures with a compact in-memory
+    representation and very fast comparison functions.  In this way, we are able
+    to use pure SQL search strategies and therefore avoid result visibility
+    problems while also benefiting from improvements to the core PostgreSQL
+    database engine.  Further, this will open the door to indexing improvements,
+    such as removal of the need for duplicate data storage, or the use of non-XML
+    data storage schemes, which could reduce resource requirements and have a
+    direct, positive effect on patron and staff search experience.
+    
+    === Overview of existing search logic
+    
+    . Construct core bibliographic search query
+    . Collect non-bibliographic filtering criteria
+    . Pass query and filters to a database function
+    . Calculate hierarchical location information for visibility testing
+    . Open cursor over core query, limited to *superpage_size * max_superpages* records
+    . Core query implements bib-level sorting
+    . For each result
+    .. NEXT if not on requested superpage
+    .. Check deleted flag, based on search type
+    .. Check transcendence
+    ... Return result if true
+    .. Check for direct Located URI in scope
+    ... Return result if exists
+    .. Check copy status + (circ lib | owning lib) based on modifier
+    .. Check peer bib copy status + (circ lib | owning lib) based on modifier
+    .. Check copy location based on filter
+    .. Check peer bib copy location based on filter
+    .. General copy visibility checks
+    ... If NOT staff
+    .... Check for OPAC visible copies (trigger-maintained materialization)
+    .... Check for peer bib OPAC visible copies
+    ... If staff
+    .... Confirm no copies here
+    .... Confirm no peer bib map
+    .... Confirm no copies anywhere
+    .... Confirm no Located URIs elsewhere
+    .. Return result if not excluded
+    . Calculate summary row
+    
+    === Overview of new mechanism
+    Record and copy information (everything checked in *(7)* above) is collected
+    into a novel data structure that allows all visibility-indicating criteria to
+    be flattened to integer arrays.  This is facilitated by a database trigger in
+    much the same way that basic OPAC copy visibility is collected for copies
+    today.
+    
+    Most identifiers in Evergreen are stored as signed integers of either 32 or 64
+    bits.  The smaller 32 bit space allows for approximately two billion positive
+    entries, but all identifiers for table rows that are used as visibility axes
+    fall into a range of between one and one million for all applicable use cases,
+    and all identifiers of interest are positive.  Therefore, we can make use of
+    the most significant bits in an integer value to create a per-axis namespacing
+    mask.  When applied to the idenfitifer for a visibility axis identifier, this
+    mask allows two values that are identical across axis to be identified as
+    unique within a combined set of all values.
+    
+    Sepcifically, we retain the four most significant bits of the integer space
+    and create from that 16 potential bitmasks for per-axis segregation of
+    identifiers.  Further, we separate copy-centered axes and bibliographic
+    record-centered attributes into two separate columns for storage purposes,
+    which means we can use the same four bits for different purposes within each
+    copy or bib set.
+    
+    In order to implement existing visibility tests with this infrastructure, six
+    copy axes and two record axes are used from the possible 16 from each set.
+    See the search.calculate_visibility_attribute() for details.  By using 32 bit
+    integers we can collect all of the bitmasked values of each type (copy or bib)
+    into a single integer array and leverage the Postgres intarray extension to
+    test all axes at once.
+    
+    At search time, required and user-requested visibility restrictions are
+    converted to *query_int* values. Results are directly filtered based on these
+    calculated *query_int* values.  This works in a way analogous to record
+    attribute filtering, avoiding the need to test statuses, circ and owning
+    library visibility, copy locations and location groups, copy OPAC visibility,
+    peer bibliographic record, Located URIs, or bibliographic record sources
+    directly.
+    
+    === Minimum Postgres version requirement
+    Due to features, particularly functions, available only in 9.4 and newer that
+    are key to the performance of the new method, Postgres 9.4 will need to be the
+    new lowest supported version for use with Evergreen.  While some of the new
+    features and functions could be implemented as user-defined functions in
+    PL/PGSQL, they would not be fast enough to make this pure-SQL search viable.
+    
+    Among the important improvements that Postgres 9.4 and newer versions bring to
+    Evergreen are:
+    
+    * Version 9.4 improved GIN indexes in ways that directly benefit Evergreen, as well as how anti-joins are planned which matters for some Evergreen searches.
+    * Version 9.5 introduced many general performance improvements, especially for joins and sorting, and brought planner improvements that impact complex queries such as those generated by this code.
+    * Version 9.6 delivered more general performance improvements, particularly for large servers such as those that Evergreen databases tend to live on, as well as more improvements to GIN indexes, executor changes that can avoid unnecessary work in search queries, new built-in full-text phrase searching, and initial parallel query execution.
+    
+    === Performance
+    The cost of the non-bibliographic filter value caching maintenance process is
+    10-40% faster than existing partial caching logic which it would replace.
+    
+    The new code achieves up to 10% faster search times than the old, suboptimal
+    mechanism time for broad searches.  The new code is faster for more selective
+    searches, often by up to 90% faster.  In both broad and narrow search cases
+    the new mechanism performs with complete accuracy and does not miss
+    small-collection hits in large consortia as the existing code does.
+    
+    Unsurprisingly, and in addition to the above improvements, performance is
+    improved marginally as each successive Postgres version at and beyond 9.4.
+    
+    === Page rendering changes
+    Previously, Evergreen would request the record details for a user-visible page
+    of results in parallel, and then, serially, request the facet data for the
+    result set.  Now, the facet data is requested asyncronously in the background
+    and then a single feed containing all records on a result page is requested
+    syncronously.  By parallelizing the result and facet metadata, page rendering
+    time is cut down significantly.  Concurrent requests of the same bibliographic
+    record are shared between apache backends to reduce result request time, and by
+    making one request instead of ten simultaineously, database load is reduced.  A
+    performance improvement of up to 20% in post-search page rendering time is seen
+    from this change.
+    
+    Additionally, cross-apache caching of ancillary data, such as the coded value
+    map and other data, via memcache significantly reduces the average page
+    rendering time not just for result pages, but most pages generated by
+    Evergreen.  An additional performance improvement of up to 50% in post-search
+    page rendering time is seen from this change.
+    
+    While these changes are not directly related to the removal staged search, they
+    touch areas impacted by core search changes and provided enough improvement
+    that implementing them concurrently with the elimination of staged search
+    seemed optimal.
+    
+    === User visible configuration changes
+    The stock configuration now provides an increased value for *max_superpages*
+    in opensrf.xml.  The default is now 100, and the *superpage_size* remains
+    1000, for a total limit of 100,000 hits per search.  This is not a limit on
+    visibility per se, as all records are visibility tested and ranked before
+    limiting, but simply a limit on the number of pages a user could click through
+    before reaching the end of the presented result list.
+    
+    === Tuning sensitivity
+    User-level timeouts are still possible with both the old and new code, given a
+    large enough dataset, a broad enough query, and a cold cache.  However, the
+    *gin_fuzzy_search_limit* GUC can be used to set a time cap on the new
+    mechanism. See https://www.postgresql.org/docs/9.6/static/gin-tips.html for
+    background, though the suggested values in the documentation are significantly
+    lower than would be readily useful for a large Evergreen instance.
+    
+    Because it uses a more complex query structure, the new mechanism is somewhat
+    more sensitive to Postgres tuning in general.  In particular, lowering
+    *random_page_cost* from the default of *4.0* to a more reasonable *2.0* is
+    important for proper query planning.  For Evergreen use cases where the search
+    indexes and relevant tables are kept in RAM or SSDs are used for storage, this
+    value is acceptable and useful in general.
+    
+    === Funding and development
+    This project was funded by MassLNC and developed by Equinox Open Library
+    Initiative.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    
+    Conflicts:
+    	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Util.pm
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/examples/opensrf.xml.example
+18	0	Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm
+202	30	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm
+47	20	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/metabib.pm
+102	116	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Util.pm
+61	0	Open-ILS/src/sql/Pg/990.schema.unapi.sql
+859	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.copy_vis_attr_cache.sql
+1	1	Open-ILS/src/templates/opac/parts/result/paginate.tt2
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.copy_vis_attr_cache.sql
+
+commit e3fd9e6693dd3beec3711c9dcdd1685a91151cdb
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Mon Aug 28 11:08:22 2017 -0400
+
+    LP#1689608: stamp schema update
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+230	0	Open-ILS/src/sql/Pg/upgrade/1056.schema.patron_batch_update.sql
+0	228	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron_batch_update.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1056.schema.patron_batch_update.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron_batch_update.sql
+
+commit 076836d90591496b7c97b9da8d5c19fc84e4c701
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Mon Aug 28 11:02:20 2017 -0400
+
+    LP#1689608: add release notes
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+86	0	docs/RELEASE_NOTES_NEXT/Circulation/Batch_User_Editing.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/Batch_User_Editing.adoc
+
+commit 2b92656852cee200277366614b5706d36851fde1
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Fri Jul 21 12:33:03 2017 -0400
+
+    LP#1689608: Minor fixes
+    
+    Fixe a typo in the seed data:
+    TEXT not NEXT
+    
+    Also, add the user bucket service to karma test so that our tests are happy.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/sql/Pg/090.schema.action.sql
+1	0	Open-ILS/web/js/ui/default/staff/test/karma.conf.js
+
+commit b3e2b84ec99c8c6fafdc6e2e2051679725c10734
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Feb 2 15:29:46 2017 -0500
+
+    LP#1689608: Batch user editing
+    
+    Summary
+    -------
+    
+    Currently, editing and deleting of users must be performed on a user-by-user
+    basis. There are workflows that would benefit from the ability to act on a
+    set of users, where the changes to all users in the set are the same.
+    
+    This commit provides a new interface analogous to the Copy Bucket interface
+    to record the selection and grouping of a set of users into a User Bucket.
+    The addition of users to a User Bucket is possible from the Patron Search
+    interface by the use of a new grid Action, and directly on the User Bucket
+    interface by user barcode. It is also possible to add users by uploading
+    a text file that contains a list of user barcodes.
+    
+    From this interface it is possible to perform a set of specific batch update
+    operations against users generally.
+    
+    Editing users
+    -------------
+    
+    In order to facilitate the update of user data fields, specifically:
+    
+     * Active flag
+     * Primary Permission Group (group application permissions consulted)
+     * Juvenile flag
+     * Home Library (UPDATE_USER checked against both old and new value)
+     * Privilege Expiration Date
+     * Barred flag (BAR_PATRON permission consulted)
+     * Internet Access Level
+    
+    This commit contains a new set of business logic allowing staff to supply new
+    values for these fields. Creation and immediate processing of a change set
+    will be made available through a grid Menu item. If the staff user does not
+    have the UPDATE_USER permission, this option will be disabled.
+    
+    Each change set requires a name. Buckets may have multiple change sets. All
+    users in the Bucket at the time of processing will be updated when the change
+    set is processed, and change sets are processed immediately upon successful
+    creation. The interface will deliver progress information regarding the
+    processing stage and percent of completion.
+    
+    While processing the users, the original value for each field edited will be
+    recorded for potential future rollback. Users can examine the success and
+    failure of applied change sets.
+    
+    The user will be able to rollback the entire change set, but not parts thereof.
+    The rollback will affect only those users that were successfully updated by the
+    original change set and may be different from the current set of users in the
+    Bucket. Users can manually discard change sets, removing them from the
+    interface but preventing future rollback.
+    
+    As a batch process, rather than a direct edit, this mechanism explicitly skips
+    processing of Action/Trigger event definitions for user update.
+    
+    Deleting users
+    --------------
+    
+    In order to facilitate the batch deletion of users, this commit creates a new
+    set of business logic allowing staff to set the Deleted flag on users.
+    Creation and immediate processing of a batch delete is made available through
+    a grid Menu item. If the staff user does not have both the UPDATE_USER and
+    DELETE_USER permission, this option is disabled. Because of the potential for
+    damage and the additional required permission, this field change is
+    specifically segregated from the general Editing functionally described above.
+    
+    Each delete set requires a name. Buckets may have multiple delete sets. All
+    users in the Bucket at the time of processing will be marked as deleted when
+    the delete set is processed. The interface will deliver progress information
+    regarding the processing stage and percent of completion.
+    
+    While processing the users, the original value for the "deleted" field will be
+    recorded for potential future rollback. Users will be able to examine the
+    success and failure of applied delete sets in the same interface used for the
+    above described change sets.
+    
+    As a batch process, rather than a direct edit, this mechanism explicitly skips
+    processing of Action/Trigger event definitions for user deletion.
+    
+    This mechanism does not use the Purge User functionality, but instead simply
+    marks the users as deleted. Future enhancement could add such functionality.
+    
+    Editing Statistical Category Entries
+    ------------------------------------
+    
+    In order to facilitate the batch editing, addition, and removal of
+    Statistical Category Entries for users, this commit creates a new set of
+    business logic allowing staff to either remove or add & update Entries for
+    Statistical Categories to which the staff member has access. Processing of
+    Statistical Category Entry modifications will are available through a grid
+    Menu item.
+    
+    All users in the bucket will have their Statistical Category Entries
+    modified. Unlike user data field updates, modification of Statistical
+    Category Entries is permanent and cannot be rolled back. No named change
+    sets are required. The interface will deliver progress information regarding
+    the processing stage and percent of completion.
+    
+    As a batch process, rather than a direct edit, this mechanism explicitly skips
+    processing of Action/Trigger event definitions for user update.
+    
+    New service requirement
+    -----------------------
+    
+    This new functionality makes use of the QStore service, which was previously
+    unused in production.  If this service has been removed from the configuration
+    of a live Evergreen instances, it will need to be added back in order for
+    batch user editing to succeed.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Scott Thomas <scott.thomas at sparkpa.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    
+    Conflicts:
+    	Open-ILS/src/templates/staff/circ/patron/index.tt2
+    	Open-ILS/web/js/ui/default/staff/circ/patron/app.js
+
+133	10	Open-ILS/examples/fm_IDL.xml
+500	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Actor/Container.pm
+23	0	Open-ILS/src/sql/Pg/008.schema.query.sql
+4	0	Open-ILS/src/sql/Pg/070.schema.container.sql
+177	103	Open-ILS/src/sql/Pg/090.schema.action.sql
+4	1	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+228	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron_batch_update.sql
+79	0	Open-ILS/src/templates/staff/circ/patron/bucket/index.tt2
+35	0	Open-ILS/src/templates/staff/circ/patron/bucket/t_bucket_create.tt2
+16	0	Open-ILS/src/templates/staff/circ/patron/bucket/t_bucket_delete.tt2
+34	0	Open-ILS/src/templates/staff/circ/patron/bucket/t_bucket_edit.tt2
+16	0	Open-ILS/src/templates/staff/circ/patron/bucket/t_bucket_info.tt2
+27	0	Open-ILS/src/templates/staff/circ/patron/bucket/t_bucket_selector.tt2
+41	0	Open-ILS/src/templates/staff/circ/patron/bucket/t_changesets.tt2
+43	0	Open-ILS/src/templates/staff/circ/patron/bucket/t_delete_all.tt2
+20	0	Open-ILS/src/templates/staff/circ/patron/bucket/t_grid_menu.tt2
+25	0	Open-ILS/src/templates/staff/circ/patron/bucket/t_load_shared.tt2
+60	0	Open-ILS/src/templates/staff/circ/patron/bucket/t_pending.tt2
+48	0	Open-ILS/src/templates/staff/circ/patron/bucket/t_rollback.tt2
+145	0	Open-ILS/src/templates/staff/circ/patron/bucket/t_update_all.tt2
+54	0	Open-ILS/src/templates/staff/circ/patron/bucket/t_update_statcats.tt2
+49	0	Open-ILS/src/templates/staff/circ/patron/bucket/t_view.tt2
+5	0	Open-ILS/src/templates/staff/circ/patron/index.tt2
+11	1	Open-ILS/src/templates/staff/circ/patron/t_search_results.tt2
+6	0	Open-ILS/src/templates/staff/navbar.tt2
+70	8	Open-ILS/web/js/ui/default/staff/circ/patron/app.js
+789	0	Open-ILS/web/js/ui/default/staff/circ/patron/bucket/app.js
+156	0	Open-ILS/web/js/ui/default/staff/services/user-bucket.js
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron_batch_update.sql
+ create mode 100644 Open-ILS/src/templates/staff/circ/patron/bucket/index.tt2
+ create mode 100644 Open-ILS/src/templates/staff/circ/patron/bucket/t_bucket_create.tt2
+ create mode 100644 Open-ILS/src/templates/staff/circ/patron/bucket/t_bucket_delete.tt2
+ create mode 100644 Open-ILS/src/templates/staff/circ/patron/bucket/t_bucket_edit.tt2
+ create mode 100644 Open-ILS/src/templates/staff/circ/patron/bucket/t_bucket_info.tt2
+ create mode 100644 Open-ILS/src/templates/staff/circ/patron/bucket/t_bucket_selector.tt2
+ create mode 100644 Open-ILS/src/templates/staff/circ/patron/bucket/t_changesets.tt2
+ create mode 100644 Open-ILS/src/templates/staff/circ/patron/bucket/t_delete_all.tt2
+ create mode 100644 Open-ILS/src/templates/staff/circ/patron/bucket/t_grid_menu.tt2
+ create mode 100644 Open-ILS/src/templates/staff/circ/patron/bucket/t_load_shared.tt2
+ create mode 100644 Open-ILS/src/templates/staff/circ/patron/bucket/t_pending.tt2
+ create mode 100644 Open-ILS/src/templates/staff/circ/patron/bucket/t_rollback.tt2
+ create mode 100644 Open-ILS/src/templates/staff/circ/patron/bucket/t_update_all.tt2
+ create mode 100644 Open-ILS/src/templates/staff/circ/patron/bucket/t_update_statcats.tt2
+ create mode 100644 Open-ILS/src/templates/staff/circ/patron/bucket/t_view.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/staff/circ/patron/bucket/app.js
+ create mode 100644 Open-ILS/web/js/ui/default/staff/services/user-bucket.js
+
+commit c3abc07f7c0a14ec3dc7e1b3006d9af0969bb6a7
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Aug 25 10:29:43 2017 -0400
+
+    LP#1712840: extend fix to circ and holds history tabs
+    
+    This patch fixes the remaining two instances of a
+    bare 'IF ebook_api.enabled' test.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+1	1	Open-ILS/src/templates/opac/myopac/circ_history.tt2
+1	1	Open-ILS/src/templates/opac/myopac/hold_history.tt2
+
+commit 5adb8d1c97256bda5a66690f0a9b9052fc20cd3a
+Author: McCanna <tmccanna at georgialibraries.org>
+Date:   Fri Aug 25 09:53:14 2017 -0400
+
+    LP#1712840 Ebook tabs always visible in My Account
+    
+    Corrects a problem in My Account where the ebook tabs
+    on the checkouts and holds pages were always visible
+    regardless of whether the ebook_api.enabled value was
+    set to true or false.
+    
+    Signed-off-by: McCanna <tmccanna at georgialibraries.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+1	1	Open-ILS/src/templates/opac/myopac/circs.tt2
+1	1	Open-ILS/src/templates/opac/myopac/holds.tt2
+
+commit ebf932e1444d8c56fc66a78a12042050534ebc9d
+Author: Ben Shum <ben at evergreener.net>
+Date:   Sat Aug 26 18:39:03 2017 -0400
+
+    LP#1712657: stamping schema update (fixup)
+    
+    Originally committed with the wrong upgrade stamp number. Move that file,
+    and also update the baseline schema upgrade version.
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+324	0	Open-ILS/src/sql/Pg/upgrade/1055.schema.user-merge-circ-history.sql
+0	324	Open-ILS/src/sql/Pg/upgrade/1065.schema.user-merge-circ-history.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1055.schema.user-merge-circ-history.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/1065.schema.user-merge-circ-history.sql
+
+commit a95db71be053cf97b1b710c5f8ecee576673fbee
+Author: Jason Etheridge <jason at EquinoxInitiative.org>
+Date:   Fri Aug 25 17:40:44 2017 -0400
+
+    LP#1712657: stamping schema update
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+324	0	Open-ILS/src/sql/Pg/upgrade/1065.schema.user-merge-circ-history.sql
+0	324	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.user-merge-circ-history.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1065.schema.user-merge-circ-history.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.user-merge-circ-history.sql
+
+commit 9254b702d8b31ea42afe2b5696d7f7e878a9a427
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Aug 23 15:39:16 2017 -0400
+
+    LP#1712657 Merge patron checkout history
+    
+    Transfer checkout history rows to the destination user during patron
+    merge.
+    
+    To Test:
+    
+    1. Enable circ history tracking for 2 users, ideally 2 with same
+       last name for easy searching.
+    2. Check out items to both patrons.
+    3. Load the 2 patrons in the patron search UI and merge one into the other.
+    4. action.usr_circ_history rows previously linked to the deleted patron
+       will now be linked to the active/lead patron.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+1	0	Open-ILS/src/sql/Pg/999.functions.global.sql
+324	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.user-merge-circ-history.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.user-merge-circ-history.sql
+
+commit 0d0e404f3bd0a357e1def316d1ab48fa4358b130
+Author: Jason Boyer <jboyer at library.in.gov>
+Date:   Fri Aug 25 11:13:22 2017 -0400
+
+    LP1713064: String / Float Value ACP Editor Fix
+    
+    Add an Angular directive to the vol/copy editor
+    to convert and format numbers stored as strings
+    in acp objects.
+    
+    Signed-off-by: Jason Boyer <jboyer at library.in.gov>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+3	3	Open-ILS/src/templates/staff/cat/volcopy/t_attr_edit.tt2
+28	0	Open-ILS/web/js/ui/default/staff/cat/volcopy/app.js
+
+commit 7b41b6654f124da9c6d3f3ce39c0f351c714c35d
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Aug 25 15:51:44 2017 -0400
+
+    LP#1685929: (follow-up) fix passing copy when opening volume/copy editor
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+4	2	Open-ILS/web/js/ui/default/staff/circ/checkin/app.js
+
+commit 5ec2a27f0aa2645f3e63ac11c5f9a8ea08154fca
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Aug 25 15:17:25 2017 -0400
+
+    LP#1685929: adjust egItem.print_spine_labels()
+    
+    Make egItem.print_spine_labels() accept a list of copy
+    IDs and make the caller responsible for putting that list together.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+5	1	Open-ILS/web/js/ui/default/staff/circ/checkin/app.js
+2	2	Open-ILS/web/js/ui/default/staff/circ/services/item.js
+
+commit a45608038328700ea54d52582096abf22704eda0
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Aug 25 11:49:31 2017 -0400
+
+    LP#1685929: (follow-up) fix rebase error
+    
+    Intentionally not putting two actions in the Show group.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+0	2	Open-ILS/src/templates/staff/circ/checkin/t_checkin_table.tt2
+
+commit 91771c5f535892f909ab0bf30bd4a15fe1338f6f
+Author: Cesar Velez <Cesar.Velez at equinoxinitiative.org>
+Date:   Tue Aug 1 22:42:00 2017 +0100
+
+    LP#1685929: add implementation print spine labels to checkin grid
+    
+    Signed-off by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+4	0	Open-ILS/web/js/ui/default/staff/circ/checkin/app.js
+17	0	Open-ILS/web/js/ui/default/staff/circ/services/item.js
+
+commit 85852d50014b7527d7775d874ae257e4fb14eeaf
+Author: Cesar Velez <Cesar.Velez at equinoxinitiative.org>
+Date:   Fri Aug 11 16:11:45 2017 +0100
+
+    LP#1685929 - Extract itemSvc from item module to core
+    
+    Refactored Missing Pieces module and CheckIn to use
+    shared functionally of itemSvc, which is now it's own
+    separate file.
+    
+    Signed-off by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    
+    Conflicts:
+    	Open-ILS/web/js/ui/default/staff/cat/item/app.js
+
+1	0	Open-ILS/src/templates/staff/cat/item/index.tt2
+1	0	Open-ILS/src/templates/staff/cat/item/missing_pieces.tt2
+1	1	Open-ILS/src/templates/staff/circ/checkin/index.tt2
+3	890	Open-ILS/web/js/ui/default/staff/cat/item/app.js
+3	53	Open-ILS/web/js/ui/default/staff/cat/item/missing_pieces.js
+2	2	Open-ILS/web/js/ui/default/staff/circ/checkin/app.js
+891	0	Open-ILS/web/js/ui/default/staff/circ/services/item.js
+ create mode 100644 Open-ILS/web/js/ui/default/staff/circ/services/item.js
+
+commit 85f6c2b8715a29d6c92c29132d2b05469de66e64
+Author: Cesar Velez <Cesar.Velez at equinoxinitiative.org>
+Date:   Fri Aug 11 16:00:29 2017 +0100
+
+    LP#1685929-Adds more XUL parity to Webstaff checkIn
+    
+    Checkin Grid context actions like Add Items to Bucket, Show Holds on Bib, Show
+    Last Few Circulations, Edit Item Attributes, Mark Item Missing Pieces,
+    Print Spine Label, were missing from CheckIn in webstaff.
+    
+    Signed-off by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    
+    Conflicts:
+    	Open-ILS/web/js/ui/default/staff/cat/item/app.js
+
+11	0	Open-ILS/src/templates/staff/circ/checkin/index.tt2
+25	2	Open-ILS/src/templates/staff/circ/checkin/t_checkin_table.tt2
+57	2	Open-ILS/web/js/ui/default/staff/cat/item/app.js
+51	3	Open-ILS/web/js/ui/default/staff/circ/checkin/app.js
+
+commit 42528f5dd56f63ab4d143c3f05872f96a1c3132a
+Author: Jeff Davis <jdavis at sitka.bclibraries.ca>
+Date:   Mon Aug 21 16:12:46 2017 -0700
+
+    LP#1684988: add opt-in check to patron service
+    
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+3	0	Open-ILS/src/templates/staff/base_js.tt2
+0	2	Open-ILS/src/templates/staff/circ/patron/index.tt2
+76	8	Open-ILS/web/js/ui/default/staff/services/patron_search.js
+
+commit f10de92a70e1f9ec99130399a964722ac0c7843f
+Author: Jason Boyer <jboyer at library.in.gov>
+Date:   Thu Aug 24 17:34:02 2017 -0400
+
+    LP1712922: Exclude Deleted ACPL in Vol/Copy Editor
+    
+    Just what it says on the tin. When loading the list of ACPL
+    in the editor only retrieve the non-deleted locations.
+    
+    Tester's note: there's no database contraint that strictly
+    prevents a copy from linking to a deleted location, so for
+    items like that, the copy location selector will be blank. This
+    is an uncommon situation, but Evergreen admins can identify
+    such items by running the following query:
+    
+    select acp.id, acp.barcode, acpl.name
+    from asset.copy acp
+    join asset.copy_location acpl on (acpl.id = acp.location)
+    where not acp.deleted
+    and acpl.deleted
+    order by acp.id;
+    
+    Signed-off-by: Jason Boyer <jboyer at library.in.gov>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/web/js/ui/default/staff/cat/volcopy/app.js
+
+commit c77c6690b13fc28e2f5cbc542e4c858ae86c8ad6
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Aug 24 18:29:13 2017 -0400
+
+    forward-port 2.12.4-2.12.5 DB update
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+5	0	Open-ILS/src/sql/Pg/version-upgrade/2.12.4-2.12.5-upgrade-db.sql
+ create mode 100644 Open-ILS/src/sql/Pg/version-upgrade/2.12.4-2.12.5-upgrade-db.sql
+
+commit 546428a27a9ea1cfae9142183dcc2c411a54db3e
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Thu Aug 24 17:54:38 2017 -0400
+
+    Forward-port 2.11.8 upgrade script
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+5	0	Open-ILS/src/sql/Pg/version-upgrade/2.11.7-2.11.8-upgrade-db.sql
+ create mode 100644 Open-ILS/src/sql/Pg/version-upgrade/2.11.7-2.11.8-upgrade-db.sql
+
+commit b5a9d112692bef30da88cea2d52c76c4d775aa5a
+Author: Jeff Davis <jdavis at sitka.bclibraries.ca>
+Date:   Wed Jul 12 13:38:13 2017 -0700
+
+    LP#1699566: item barcode completion in web client
+    
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+22	0	Open-ILS/src/templates/staff/circ/share/t_barcode_choice_dialog.tt2
+9	3	Open-ILS/web/js/ui/default/staff/cat/item/app.js
+149	64	Open-ILS/web/js/ui/default/staff/circ/services/circ.js
+ create mode 100644 Open-ILS/src/templates/staff/circ/share/t_barcode_choice_dialog.tt2
+
+commit 71871c25088e592848b90b8deba70bc6d7347d30
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Wed Aug 23 12:08:12 2017 -0400
+
+    LP#1694577: exclude empheral search results folder from selector
+    
+    Otherwise, the folder selector for the move or clone template
+    actions includes a blank entry.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+1	0	Open-ILS/web/reports/oils_rpt_folders.js
+
+commit 3fa270582a1d6a11604092da8fcb3883a756d829
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Wed Aug 23 11:54:32 2017 -0400
+
+    LP#1694577: tweak searching for words in report templates
+    
+    Use \m to recognize beginning-of-word boundaries; this fixes
+    an issue where you couldn't use "clone" to retrieve templates
+    whose name was of the form "foo (clone)".
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+2	2	Open-ILS/src/perlmods/lib/OpenILS/Application/Reporter.pm
+1	0	docs/RELEASE_NOTES_NEXT/Reports/template-search.adoc
+
+commit 40f80bda176375653a8835dbad0a6311e02e66f2
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Sat Aug 12 11:25:16 2017 -0400
+
+    LP#1694577 Release notes for report template search
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+32	0	docs/RELEASE_NOTES_NEXT/Reports/template-search.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Reports/template-search.adoc
+
+commit 3380dacfcd88ea8168e84caccf0c4e41ccd8df33
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Sat Aug 12 11:12:17 2017 -0400
+
+    LP#1694577 Reports template searching and paging
+    
+    Adds a new template search from along the top of the reports interface.
+    Templates may be searched name and/or description.
+    
+    Adds paging support to the template, reports, and output interfaces.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+10	0	Open-ILS/web/opac/locale/en-US/reports.dtd
+12	0	Open-ILS/web/reports/oils_rpt.css
+9	0	Open-ILS/web/reports/oils_rpt.js
+34	9	Open-ILS/web/reports/oils_rpt.xhtml
+74	4	Open-ILS/web/reports/oils_rpt_folder_window.js
+5	2	Open-ILS/web/reports/oils_rpt_folder_window.xhtml
+58	5	Open-ILS/web/reports/oils_rpt_folders.js
+1	0	Open-ILS/web/reports/oils_rpt_vars.js
+
+commit 675fd78e952c3b339a9e4ea42d40e19176476d67
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Sat Aug 12 11:08:30 2017 -0400
+
+    LP#1694577 Report templates search API & paging
+    
+    Adds new API call open-ils.reporter.search.templates allowing search of
+    reporter template names and/or descriptions.  Searching is
+    case-insensitive, any order, with left-anchored words.  Searching can be
+    for specific folders or all folders visible to the calling user.
+    
+    Adds paging support (limit / offset) for retriving templates, reports,
+    and outputs.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+107	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Reporter.pm
+
+commit 6a144c779e4fa5b02ffd92e309eaa79f0891eb46
+Author: Dan Scott <dan at coffeecode.net>
+Date:   Wed Jul 12 10:07:23 2017 -0400
+
+    LP#1703678 Display foreign item location and status
+    
+    We were using copy_info instead of the foreign item's data to try to display
+    location and status of foreign items. As copy_info had not been initialized,
+    it displayed nothing. Use the foreign item data instead for location and
+    status.
+    
+    Signed-off-by: Dan Scott <dan at coffeecode.net>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+2	2	Open-ILS/src/templates/opac/parts/record/copy_table.tt2
+
+commit 8cdeb16aa522f46fcc84a82c70bed23846bc032c
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Tue May 31 15:51:47 2016 -0400
+
+    LP#1703678 Show foreign copies even if only one
+    
+    If a record has no copies of its own, but it does have a foreign copy
+    on a peer bib, show that copy info (and the link to the other record).
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/templates/opac/parts/record/copy_table.tt2
+
+commit b17fad6b7a21bf86ef04fa45e000f01a7dc1e809
+Author: Ben Shum <ben at evergreener.net>
+Date:   Tue Aug 15 16:45:58 2017 -0400
+
+    Translation updates - newpot
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+8	2	build/i18n/po/cat.properties/cat.properties.pot
+17	8	build/i18n/po/circ.properties/circ.properties.pot
+1431	1151	build/i18n/po/db.seed/db.seed.pot
+2528	2461	build/i18n/po/fm_IDL.dtd/fm_IDL.dtd.pot
+8	8	build/i18n/po/ils_events.xml/ils_events.xml.pot
+13	5	build/i18n/po/lang.dtd/lang.dtd.pot
+195	134	build/i18n/po/tpac/tpac.pot
+716	516	build/i18n/po/webstaff/webstaff.pot
+
+commit 0a4960fd54bfdacde0e933119b6464b4ee44f512
+Author: Angela Kilsdonk <akilsdonk at esilibrary.com>
+Date:   Mon Aug 14 16:21:34 2017 -0700
+
+    Docs: Asciidoc fix
+    Asciidoc fix for report data type icons.
+    
+    Signed-off-by: Angela Kilsdonk <akilsdonk at equinoxinitiative.org>
+
+9	9	docs/reports/reporter_template_terminology.adoc
+
+commit c5838c87c0f20f1ba01ce525d30c1637751d85e2
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Mon Jul 31 16:57:06 2017 -0400
+
+    LP#1701001: add release notes
+    
+    Here is the test plan for the feature:
+    
+    [1] In the web staff client, perform a catalog search. From search
+        results, choose Place Hold.
+    [2] In the form that displays, click the 'Patron Search' button.
+    [3] Verify that a modal with a patron search form is displayed.
+    [4] Search for a patron, then select one and click the 'Select'
+        button.
+    [5] Verify that the patron's barcode is inserted into the patron
+        barcode input.
+    [6] Verify that submitting the form successfully places the hold.
+    [7] Verify that the feature works from a bib record details page.
+    [8] Verify that the Patron Search button does not show up when
+        using the place hold form in the public catalog.
+    [9] Verify that normal patron search, retrieval, and registration
+        functionality continues to work, as this patch series does some
+        refactoring to create a reusable Angular patron search service
+        and templates.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+10	0	docs/RELEASE_NOTES_NEXT/Circulation/Patron_Search_from_Place_Hold.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/Patron_Search_from_Place_Hold.adoc
+
+commit a489dc120b5df242db1d13edaea629ba6b7d020d
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Jul 28 16:54:55 2017 -0400
+
+    LP#1701001: add "patron search" button to OPAC place hold form
+    
+    This button is displayed only when the public catalog is embedded
+    in the web staff client and the iframe's controller explicitly
+    unhides the button.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+5	1	Open-ILS/src/templates/opac/parts/place_hold.tt2
+
+commit 9c6a92f8dc9d5d2965b75e7ce74b7d6ba34bc783
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Jul 28 16:55:22 2017 -0400
+
+    LP#1701001: add search-to-hold to catalog app
+    
+    This patch teaches the web staff client's catalog app how
+    to activate the patron search button in the embedded catalog's
+    place hold form. It also adds a handler for the button action
+    to display a modal to allow the staff member to search
+    for and select a patron, then injects the patron's barcode
+    into the form.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+1	0	Open-ILS/src/templates/staff/cat/catalog/index.tt2
+43	1	Open-ILS/web/js/ui/default/staff/cat/catalog/app.js
+
+commit 2e0ea0eac16390a10d1ec727a5fbd43744b0fed7
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Jul 28 16:55:37 2017 -0400
+
+    LP#1701001: split patron search form into separate templates
+    
+    This patch breaks up the patron search form and results into
+    separate templates and adds a template for a patron selector
+    modal.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+1	151	Open-ILS/src/templates/staff/circ/patron/t_search.tt2
+150	0	Open-ILS/src/templates/staff/share/t_patron_search_form.tt2
+35	0	Open-ILS/src/templates/staff/share/t_patron_search_results.tt2
+27	0	Open-ILS/src/templates/staff/share/t_patron_selector.tt2
+ create mode 100644 Open-ILS/src/templates/staff/share/t_patron_search_form.tt2
+ create mode 100644 Open-ILS/src/templates/staff/share/t_patron_search_results.tt2
+ create mode 100644 Open-ILS/src/templates/staff/share/t_patron_selector.tt2
+
+commit fcd4229f895e98de2164012c1730f2479da40096
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri May 26 20:41:38 2017 +0000
+
+    LP#1701001: carve out a reusable patron search service
+    
+    This patch moves the patron search service and the base
+    patron search controller into a separate, reusable
+    file.  The core patron search service is available for
+    injection as patronSvc from the new egPatronSearchMod, while
+    BasePatronSearchCtrl now exists as a base controller for the
+    patron search form that can be extended as needed by doing
+    something like this:
+    
+    module.controller('DerivedPatronSearchCtrl', [
+                 '$scope', '$controller',
+        function ($scope, $controller) {
+        // Initialize the super class and extend it.
+        angular.extend(this, $controller('BasePatronSearchCtrl', {$scope: $scope}));
+    ...
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+1	0	Open-ILS/src/templates/staff/circ/patron/index.tt2
+1	0	Open-ILS/src/templates/staff/circ/renew/index.tt2
+5	658	Open-ILS/web/js/ui/default/staff/circ/patron/app.js
+685	0	Open-ILS/web/js/ui/default/staff/services/patron_search.js
+1	0	Open-ILS/web/js/ui/default/staff/test/karma.conf.js
+ create mode 100644 Open-ILS/web/js/ui/default/staff/services/patron_search.js
+
+commit 2015799e80e18d4259b7149986fec175e9238aad
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Aug 10 16:41:03 2017 -0400
+
+    LP#1710010: Fix item status file upload
+    
+    The item service currently living inside the item status app does not know how
+    to fetch multiple barcodes at once.  So, we'll loop over them and refresh the
+    grid when they're all retrieved.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+13	6	Open-ILS/web/js/ui/default/staff/cat/item/app.js
+
+commit 46b52535165051a030404fe3e2be641e9e3dd6e9
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Aug 11 15:35:38 2017 -0400
+
+    LP#1705524: fix a quoting issue in the DB update scripts
+    
+    ... toss enough quotes at the problem, and eventually one
+    will make it to the end.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+2	2	Open-ILS/src/sql/Pg/upgrade/1054.data.tz_org_setting.sql
+
+commit e052cad09214b8f79618e9ddd66b1159a4a2e5cf
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri Aug 11 14:25:24 2017 -0400
+
+    LP#1705524 Stamping org timezones SQL
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+79	0	Open-ILS/src/sql/Pg/upgrade/1054.data.tz_org_setting.sql
+0	77	Open-ILS/src/sql/Pg/upgrade/XXXX.data.tz_org_setting.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1054.data.tz_org_setting.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.tz_org_setting.sql
+
+commit 0f0203bb230fce6b44137e8203b999a5de326b46
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Aug 3 14:18:30 2017 -0400
+
+    LP#1705524: Minor cleanup in prep for committing
+    
+    1. Provide an admin-friendly summary of changes at the top of the release notes.
+    2. Change quoting of optional post-upgrade SQL echoing in the upgrade script.
+    3. Fix preexisting issue with variable interpolation inside an alert modal.
+    4. Protect against null or empty date fields when formatting.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    
+    5. Added if (date == 'now') check.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+21	21	Open-ILS/src/sql/Pg/upgrade/XXXX.data.tz_org_setting.sql
+2	2	Open-ILS/src/templates/staff/circ/share/t_circ_exists_dialog.tt2
+5	0	Open-ILS/web/js/ui/default/staff/services/ui.js
+48	0	docs/RELEASE_NOTES_NEXT/Circulation/due_date_timezones.adoc
+
+commit 6cf766a634e123f0b89eece2a0096a7b6d01fb7a
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Aug 3 11:43:56 2017 -0400
+
+    LP#1705524 Grid value filter defaults to null
+    
+    Avoid use of Perl undef in JS.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/web/js/ui/default/staff/services/grid.js
+
+commit d012c91ef7693f94e4bc836ad408f5bf6e5bf32a
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Aug 3 11:35:31 2017 -0400
+
+    LP#1705524 Closed dates editor handles no timezones
+    
+    Fix issue in closed dates editor where it failed creating new closed
+    dates when an org unit had no value applied for the lib.timezone org
+    unit setting.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+5	1	Open-ILS/xul/staff_client/server/admin/closed_dates.js
+
+commit 0ac027598e4d80960b8090bc45242bc2ad95cb67
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Aug 3 11:25:56 2017 -0400
+
+    LP#1705524 Load workstation org timezone in startup
+    
+    Piggy-back on the batch org setting call made during page startup to
+    load / pre-cache the timezone setting for the workstation org unit.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+2	1	Open-ILS/web/js/ui/default/staff/services/startup.js
+
+commit e6c7aa0980416931b03d163a39d8c40274bcce38
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Aug 2 16:56:20 2017 -0400
+
+    LP#1705524: Override angular date filter
+    
+    Here we'll use moment.js to format all dates that want to use the angular date
+    filter, for consistency and standards compliance.  The primary benefit is the
+    ability to use a proper timezone (region) rather than just a simple GMT offset.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+34	29	Open-ILS/web/js/ui/default/staff/services/ui.js
+
+commit 51c0123d2cd43b8a64479df0527ef648aa62ced4
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Mon Jul 24 10:27:09 2017 -0400
+
+    LP#1705524 Adding timezone release note
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Tina Ji <tji at sitka.bclibraries.ca>
+
+55	0	docs/RELEASE_NOTES_NEXT/Circulation/due_date_timezones.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/due_date_timezones.adoc
+
+commit 3c320f1a2a439329a0f2933af53a8170c12017bf
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Mon Jul 24 10:13:31 2017 -0400
+
+    LP#1705524: Adjust day-granular due date pushing
+    
+    Now that due dates are globally stored in the configured timezone of the
+    circulating library, the automatic adjustment to day-granular due dates needs
+    to take those timezones into account.
+    
+    An optional SQL command is provided by the upgrade script to retroactively
+    adjust existing due dates after library configuration is complete.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Tina Ji <tji at sitka.bclibraries.ca>
+
+13	2	Open-ILS/src/sql/Pg/090.schema.action.sql
+50	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.tz_org_setting.sql
+
+commit f33efdc0a21ec4e0533e2cc380d94c63ed4bea6d
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Jul 20 17:52:38 2017 -0400
+
+    LP#1705524: Use the new grid configuration for date format in the bills list
+    
+    The bills list in the patron interface predated any grid date formatting, so
+    we bring it into the modern world.
+    
+    This also enhances the grid autoformatting for dates to support both flattened
+    and dot-pathed item layout.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Tina Ji <tji at sitka.bclibraries.ca>
+
+1	3	Open-ILS/src/templates/staff/circ/patron/t_bills_list.tt2
+15	0	Open-ILS/web/js/ui/default/staff/services/grid.js
+
+commit da6075828f9bba157b6b0fd850d4d87e9b91cd06
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Jun 21 14:03:29 2017 -0400
+
+    LP#1705524: Honor timezone of the acting library where appropriate
+    
+    This is a followup to the work done in bug 1485374, where we added the ability
+    for the client to specify a timezone in which timestamps should be interpreted
+    in business logic and the database.
+    
+    Most specifically, this work focuses on circulation due dates and the closed
+    date editor. Due dates, where displayed using stock templates (including
+    receipt templates) and used for fine calculation, are now manipulated in the
+    library's configured timezone. This is controlled by the new 'lib.timezone'
+    YAOUS, loaded from the server when required. Additionally, closings are
+    recorded in the library's timezone so that so that due date calculation is more
+    accurate. The closed date editor is also taught how to display closings in the
+    closed library's timezone. Closed date entries also explicitly record if they
+    are a full day closing, or a multi-day closing. This significantly simplifies
+    the editor, and may be useful in other contexts.
+    
+    To accomplish this, we use the moment.js library and the moment-timezone addon.
+    This is necessary because the stock AngularJS date filter does not understand
+    locale-aware timezone values, which are required to support DST. A simple
+    mapper translates the differences in format values from AngularJS date to
+    moment.js.
+    
+    Of special note are a set of new filters used for formatting timestamps under
+    certain circumstances. The new egOrgDateInContext, egOrgDate, and egDueDate
+    filters provide the functionality, and autogrid is enhanced to make use of
+    these where applicable. egGrid and egGridField are also taught to accept
+    default and field-specific options for applying date filters. These filters may
+    be useful in other or related contexts.
+    
+    The egDueDate filter, used for all existing displays of due date via Angular
+    code, intentionally interprets timestamps in two different ways WRT timezone,
+    based on the circulation duration. If the duration is day-granular (that is,
+    the number of seconds in the duration is divisible by 86,400, or 24 hours worth
+    of seconds) then the date is interpreted as being in the circulation library's
+    timezone. If it is an hourly loan (any duration that does not meet the
+    day-granular criterium) then it is instead displayed in the client's timezone,
+    just as all other timestamps currently are, because of the work in 1485374.
+    
+    The OPAC is adjusted to always display the due date in the circulating
+    library's timezone. Because the OPAC displays only the date portion of the due
+    date field, this difference is currently considered acceptable. If this proves
+    to be a problem in the future, a minor adjustment can be made to match the
+    egDueDate filter logic.
+    
+    This work, as with 1485374 was funded by SITKA, and we thank them for their
+    partnership in making this happen!
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Tina Ji <tji at sitka.bclibraries.ca>
+
+2	0	Open-ILS/examples/fm_IDL.xml
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm
+5	2	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/CircCommon.pm
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/actor.pm
+6	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Util.pm
+2	0	Open-ILS/src/sql/Pg/005.schema.actors.sql
+12	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+27	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.tz_org_setting.sql
+1	1	Open-ILS/src/templates/opac/myopac/circ_history.tt2
+1	1	Open-ILS/src/templates/opac/myopac/circs.tt2
+2	1	Open-ILS/src/templates/opac/myopac/main.tt2
+2	2	Open-ILS/src/templates/opac/parts/record/copy_table.tt2
+2	0	Open-ILS/src/templates/staff/base_js.tt2
+1	1	Open-ILS/src/templates/staff/cat/item/t_circ_list_pane.tt2
+1	1	Open-ILS/src/templates/staff/cat/item/t_list.tt2
+1	1	Open-ILS/src/templates/staff/cat/item/t_summary_pane.tt2
+1	1	Open-ILS/src/templates/staff/circ/checkin/t_checkin_table.tt2
+5	0	Open-ILS/src/templates/staff/circ/patron/t_bills_list.tt2
+1	1	Open-ILS/src/templates/staff/circ/patron/t_checkout.tt2
+2	2	Open-ILS/src/templates/staff/circ/patron/t_items_out.tt2
+1	1	Open-ILS/src/templates/staff/circ/patron/t_xact_details.tt2
+1	1	Open-ILS/src/templates/staff/circ/renew/t_renew.tt2
+1	1	Open-ILS/src/templates/staff/share/print_templates/t_checkout.tt2
+1	1	Open-ILS/src/templates/staff/share/print_templates/t_items_out.tt2
+1	1	Open-ILS/src/templates/staff/share/print_templates/t_renew.tt2
+1	1	Open-ILS/src/templates/staff/share/t_autogrid.tt2
+5	1	Open-ILS/web/js/ui/default/staff/Gruntfile.js
+4	0	Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
+2	0	Open-ILS/web/js/ui/default/staff/cat/item/app.js
+3	0	Open-ILS/web/js/ui/default/staff/circ/services/circ.js
+2	0	Open-ILS/web/js/ui/default/staff/package.json
+52	17	Open-ILS/web/js/ui/default/staff/services/grid.js
+129	0	Open-ILS/web/js/ui/default/staff/services/ui.js
+121	57	Open-ILS/xul/staff_client/server/admin/closed_dates.js
+5	0	Open-ILS/xul/staff_client/server/admin/closed_dates.xhtml
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.tz_org_setting.sql
+
+commit b45f7d99938f02f39a37ebecbed5099dcb4c84b5
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Aug 11 12:23:01 2017 -0400
+
+    LP#1659928: fix regression introduce by previous patches
+    
+    A couple other places that use the standing_penalty list needed to
+    be adjusted to account for the non-de-fleshing.
+    
+    Kudos to Jason Etheridge for noting the live_t test failure. Also,
+    unit tests FTW.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+2	2	Open-ILS/src/perlmods/lib/OpenILS/SIP/Patron.pm
+
+commit 01aa516be0861619b8d73af542b51d22fdc18b0d
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Sat Jan 7 19:49:12 2017 -0500
+
+    LP 1542495: Release Notes and Sample Config Change.
+    
+    In addition to adding the release note file, we alter the location of
+    the encoding element in oils_sip.xml.example to the new, recommended
+    location.
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Martha Driscoll <driscoll at noblenet.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+11	11	Open-ILS/examples/oils_sip.xml.example
+34	0	docs/RELEASE_NOTES_NEXT/SIP/LP1542495-Requires-SIPServer-Upgrade.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/SIP/LP1542495-Requires-SIPServer-Upgrade.adoc
+
+commit 93f18ff0062954a199bee88aea56975472cf456d
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Mon Jan 2 10:51:48 2017 -0500
+
+    LP 1542495: Remove OpenILS::SIP::clean_text.
+    
+    This commit removes the OpenILS::SIP::clean_text utility function and
+    all references to it in the OpenILS::SIP modules.  Its job is now done
+    in SIPServer's write_msg routine.
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Martha Driscoll <driscoll at noblenet.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+0	44	Open-ILS/src/perlmods/lib/OpenILS/SIP.pm
+6	6	Open-ILS/src/perlmods/lib/OpenILS/SIP/Item.pm
+25	27	Open-ILS/src/perlmods/lib/OpenILS/SIP/Patron.pm
+
+commit f92c526708a82dd410139320f1cc6cd763e7cc36
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Aug 10 17:26:24 2017 -0400
+
+    LP#1160347: (follow-up) fix a couple field class entries
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+2	2	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+
+commit 6309bd9290cc64ed93cc99d959bc975d1227b1d6
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Wed Aug 9 08:42:29 2017 -0400
+
+    LP#1160347 - Fixing missing closing parens in INSERT statement
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+
+commit 5cda01f62d276393f75e071ab99d9b784f2ae965
+Author: Ben Shum <ben at evergreener.net>
+Date:   Wed Apr 19 09:10:33 2017 -0400
+
+    LP#1160347: i18n fixes for db.seed
+    
+    Some strings were not marked for translation. Also, there were strings
+    with incorrect IDs, or mismatched entries.
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+54	44	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+
+commit 89cb470e38b7cc4c0adf4f51810bf63c8b821461
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Aug 10 12:45:58 2017 -0400
+
+    LP#1709932: recognize more strings from oils_i18n_gettext()
+    
+    This patch makes db-seed-i18n.py more flexible about
+    where commas between strings in invocations of oils_i18n_gettext()
+    can appear, reduces the chances that strings fail to be grabbed
+    for translation. It also improves the error message shown
+    when parsing errors occur.
+    
+    To test
+    -------
+    [1] Apply patch and run
+    
+        cd build/i18n && make sql2pot
+    
+    [2] Verify that no error messages are produced during
+        this step.
+    [3] Inspect the changes to po/db.seed/db.seed.pot and
+        verify that additional strings are added, including
+        "Item Print Label Font Family".
+    [4] (optional) Deliberately remove a comma from an
+        oils_i18n_gettext invocation in 950.data.seed-values.sql
+        and run make sql2pot again. The error message shoudl
+        now include the failing chunk of text.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+
+3	3	build/i18n/scripts/db-seed-i18n.py
+
+commit f32b455a1b0a99333e77044358d2d082bd5a222f
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Aug 10 16:43:36 2017 -0400
+
+    LP#1659928: (follow-up) the flesh stays on...
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS/SIP/Patron.pm
+
+commit 7307537bb0c1c5bcd702313547f5521781ad5a7b
+Author: blake <blake at mobiusconsortium.org>
+Date:   Thu Jun 15 13:39:08 2017 -0500
+
+    LP1659928 SIP is not respecting standing penalties for charge ok and hold ok
+    
+    This will include the block_list data in the blessed user object. This allows
+    charge_ok, renew_ok and hold_ok to determine if any of the respective blocks are
+    present in any of the applied penalties.
+    
+    To test
+    -------
+    [1] Using a SIP emulator, issue a 63 message to fetch information
+        about a patron that has nothing preventing it from doing loans,
+        renewals, or hold requests, e.g.,
+    
+        6300020060329    201700Y         AOevergreen|AA99999384262||
+    
+    [2] Verify that the first six positions of the response are
+        '64  Y '
+    [3] Apply a standing penalty that blocks circulation and repeat
+        step 1. This time, the response should start with '64Y Y '
+    [4] Apply other standing penalties that block holds or renewals
+        and repeate step 1, verifying that the various privileges
+        denied positions in the 64 response have expected values.
+    [5] Archive all of the penalties used during testing, then
+        verify that the response returns to '64  Y ...'
+    
+    Signed-off-by: blake <blake at mobiusconsortium.org>
+    Signed-off-by: Dan Pearl <dpearl at cwmars.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+29	40	Open-ILS/src/perlmods/lib/OpenILS/SIP/Patron.pm
+
+commit a903911387ca31e49f115f5eb2aa4605b7600aaf
+Author: Angela Kilsdonk <akilsdonk at esilibrary.com>
+Date:   Thu Aug 10 12:08:34 2017 -0700
+
+    Docs: Web Client Data Types
+    
+    Updated chart of data type icons in web client.
+    
+    Signed-off-by: Angela Kilsdonk <akilsdonk at equinoxinitiative.org>
+
+-	-	docs/media/datatypes_bool.png
+-	-	docs/media/datatypes_id.png
+-	-	docs/media/datatypes_int.png
+-	-	docs/media/datatypes_interval.png
+-	-	docs/media/datatypes_link.png
+-	-	docs/media/datatypes_money.png
+-	-	docs/media/datatypes_orgunit.png
+-	-	docs/media/datatypes_text.png
+-	-	docs/media/datatypes_timestamp.png
+14	29	docs/reports/reporter_template_terminology.adoc
+ create mode 100644 docs/media/datatypes_bool.png
+ create mode 100644 docs/media/datatypes_id.png
+ create mode 100644 docs/media/datatypes_int.png
+ create mode 100644 docs/media/datatypes_interval.png
+ create mode 100644 docs/media/datatypes_link.png
+ create mode 100644 docs/media/datatypes_money.png
+ create mode 100644 docs/media/datatypes_orgunit.png
+ create mode 100644 docs/media/datatypes_text.png
+ create mode 100644 docs/media/datatypes_timestamp.png
+
+commit 84e7b2415a46460e160da2200c4b9ef3379ac767
+Author: Jason Etheridge <jason at EquinoxInitiative.org>
+Date:   Thu Aug 10 14:06:08 2017 -0400
+
+    syntax: end-quote for stored procedure
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+1	0	Open-ILS/src/sql/Pg/220.schema.rating.sql
+
+commit 2e847e361dd8f013f273c436bf0aeaa68dc4fcb9
+Author: Jason Etheridge <jason at EquinoxInitiative.org>
+Date:   Thu Aug 10 14:01:52 2017 -0400
+
+    syntax error in schema script
+    
+    incidentally, I'm a huge fan of comma-first style, I18N-breakage aside :)
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+
+1	1	Open-ILS/src/sql/Pg/220.schema.rating.sql
+
+commit b051ae99087ebcc4adac220c91f7981c5e1280ae
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Aug 10 11:16:13 2017 -0400
+
+    Stamping populariy parameter upgrade scripts
+    
+    Also, the org-count parameter function is adjusted to consistently find
+    and count copies by circ lib.  Because this parameter is about counting
+    copies on the shelves of libraries, this makes more sense than owing
+    library.  Changed in consultation with Kathy Lussier.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+2	2	Open-ILS/src/sql/Pg/220.schema.rating.sql
+63	0	Open-ILS/src/sql/Pg/upgrade/1052.data-inhouse-use-badge.sql
+37	0	Open-ILS/src/sql/Pg/upgrade/1053.data.org-unit-count-badge.sql
+0	63	Open-ILS/src/sql/Pg/upgrade/xxxx.data-inhouse-use-badge.sql
+0	37	Open-ILS/src/sql/Pg/upgrade/yyyy.data.org-unit-count-badge.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1052.data-inhouse-use-badge.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1053.data.org-unit-count-badge.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/xxxx.data-inhouse-use-badge.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/yyyy.data.org-unit-count-badge.sql
+
+commit 9c4e9660a6ec10687504966a84ed4259fced6610
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Mon Jul 31 13:43:38 2017 -0400
+
+    LP#1688099: Popularity parameter for the number of OUs that own a title
+    
+    Creates a new badge that calculates a score based on a count of libraries
+    that own a copy of a title. The badge is based on libraries that are the copy's
+    circulation library. The intent of the badge is to measure the breadth of
+    ownership within a particular consortium with the hope that it doesn't
+    generate as many 'false hits' that are seen with the similar Total Copy Counts
+    badge.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+28	1	Open-ILS/src/sql/Pg/220.schema.rating.sql
+37	0	Open-ILS/src/sql/Pg/upgrade/yyyy.data.org-unit-count-badge.sql
+8	3	docs/RELEASE_NOTES_NEXT/OPAC/new-activity-metric-badge.adoc
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/yyyy.data.org-unit-count-badge.sql
+
+commit 2f8bf6c328c2caa7ded0cfe7debe3b7423fb8f70
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Mon Jul 31 16:36:50 2017 -0400
+
+    LP#1688096: Popularity parameter for in-house use
+    
+    Adds a new popularity parameter based on in-house use over time. The parameter
+    can be used for creating a statistically-generated popularity badge for titles.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+57	1	Open-ILS/src/sql/Pg/220.schema.rating.sql
+63	0	Open-ILS/src/sql/Pg/upgrade/xxxx.data-inhouse-use-badge.sql
+6	0	docs/RELEASE_NOTES_NEXT/OPAC/new-activity-metric-badge.adoc
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/xxxx.data-inhouse-use-badge.sql
+ create mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/new-activity-metric-badge.adoc
+
+commit dcf52caab8f188d250ac82fd9e6b95fa07a1f320
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Aug 9 16:41:53 2017 -0400
+
+    LP#1709476 Copy summary aged circ display repair
+    
+    Always check active and aged circs (via "aacs" class) for circs to
+    display for a given copy in the item status Quick Summary and Recent
+    Circ History tabs.  When a aged circ is encountered, display the '<Aged
+    Circulation>' tag in lieu of the patron's name.
+    
+    To test:
+    [1] Checkout and checkin a copy.
+    [2] Checkout and checkin the same copy to a different patron
+    [3] Manually delete the 2nd circulation in the database.
+    [4] Load the Item Status interface for the copy.
+    [5] Confirm chekout time, etc. for the 2nd show in the Quick Summary
+        circulation data.
+    [6] Confirm the patron displayed under the 'Recent Circ History' tab
+        shows '<Aged Circulation>'
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+5	2	Open-ILS/src/templates/staff/cat/item/t_circs_pane.tt2
+3	3	Open-ILS/web/js/ui/default/staff/cat/item/app.js
+
+commit fc2dcdadb96da9d5b051703e9b65290025bac6f7
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Aug 9 15:37:05 2017 -0400
+
+    Stamping upgrade script for slim all-circs view
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+193	0	Open-ILS/src/sql/Pg/upgrade/1051.schema.all-circs-slim.sql
+0	193	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.all-circs-slim.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1051.schema.all-circs-slim.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.all-circs-slim.sql
+
+commit 4105f8d3d4bc214104efa997bb5bd84bd13a6fb8
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Jun 1 16:11:11 2017 -0400
+
+    LP#1695007 Webstafff circ group summary display fix
+    
+    Repair display of the Total Circs, Last Renewed On, and Renewal
+    Workstation fields in the web staff item summary Recent Circ History tab
+    Most Recent Circ Group Display.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/web/js/ui/default/staff/cat/item/app.js
+
+commit 4a244416e1d5cc01104fb583c58b6a8d816cec95
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Jun 1 10:56:11 2017 -0400
+
+    LP#1695007 All-circulations slim DB VIEW
+    
+    Adds a new view action.all_circulation_slim which collects all
+    action.circulation and action.aged_circulation rows into a single set,
+    without the added joins for copy and patron data imposed by the existing
+    action.aged_circulation view.
+    
+    The new leaner view is now used by various other views and APIs in place
+    of the all_circulation view:
+    
+    DB:  action.all_circ_chain()
+    DB:  action.summarize_all_circ_chain()
+    DB:  rating.percent_time_circulating()
+    API: open-ils.circ.retrieve
+    API: open-ils.circ.copy_checkout_history.retrieve
+    API: open-ils.circ.copy_details.retrieve
+    API: open-ils.circ.renewal_chain.retrieve_by_circ[.summary]
+    API: open-ils.circ.prev_renewal_chain.retrieve_by_circ[.summary]
+    
+    To Test (webstaff style):
+    
+    [1] Open a copy in the web staff Item Status / Detail View interface
+        that has live and aged circulations.
+    [2] Open the Recent Circ History tab
+    [3] Confirm relevent fields for both types of circs display as expected
+        and that the Patron field for the aged circulation shows a value of
+        <Aged Circulation>
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+74	0	Open-ILS/examples/fm_IDL.xml
+12	12	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ.pm
+50	10	Open-ILS/src/sql/Pg/090.schema.action.sql
+1	1	Open-ILS/src/sql/Pg/220.schema.rating.sql
+193	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.all-circs-slim.sql
+5	5	Open-ILS/web/js/ui/default/staff/cat/item/app.js
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.all-circs-slim.sql
+
+commit 2621af6377970470e347559d67f0da5de47aaa9f
+Author: Cesar Velez <cesar.velez at equinoxinitiative.org>
+Date:   Tue May 23 16:36:44 2017 -0400
+
+    LP#1098685: Require OPAC patron holds w/ phone/SMS notification to enter that info
+    
+    This provides some plain vanilla JS form validation, and error feedback
+    using a yellow background color on the culprit input field.
+    
+    Signed-off by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+7	24	Open-ILS/src/templates/opac/parts/js.tt2
+4	4	Open-ILS/src/templates/opac/parts/place_hold.tt2
+76	0	Open-ILS/web/js/ui/default/opac/holds-validation.js
+ create mode 100644 Open-ILS/web/js/ui/default/opac/holds-validation.js
+
+commit db7b67abd0c52a1ae92f35a7b4f28f441a9af8ad
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Tue Aug 8 17:28:43 2017 -0400
+
+    LP#1480432: stamp DB update
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+27	0	Open-ILS/src/sql/Pg/upgrade/1050.function.permission.user_perms.sql
+0	27	Open-ILS/src/sql/Pg/upgrade/XXXX.function.permission.user_perms.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1050.function.permission.user_perms.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.permission.user_perms.sql
+
+commit 2790b6e8a1d375134ff654d098eeccafea2f27f7
+Author: Michele Morgan <mmorgan at noblenet.org>
+Date:   Thu Sep 29 16:35:20 2016 -0400
+
+    LP#1480432: choose broadest depth if staff has same perm multiple times
+    
+    Fixes a staff user permission depth issue that can exist when multiple
+    permission groups are assigned. In particular, this patch clarifies
+    that if a given permission is assigned to a staff member multiple times,
+    e.g., via mutiple profiles or by individual permission mapping, whatever
+    permission depth is the broadest will apply.
+    
+    To test
+    -------
+    [1] Run the t/lp1480432_test_func.permissions.usr_perms_depth_sort.pg
+        pgTAP test.
+    [2] Set up a staff user that has the same permission at multiple
+        depths, and verify that its scope of applicability applies
+        at the broadest depth. For example, if you give SET_CIRC_CLAIMS_RETURNED
+        at system and consortial depth, verify that the staff user can
+        mark any loan as claims returned regardless of system.
+    
+    Signed-off-by: Michele Morgan <mmorgan at noblenet.org>
+    Signed-off-by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/sql/Pg/006.schema.permissions.sql
+27	0	Open-ILS/src/sql/Pg/upgrade/XXXX.function.permission.user_perms.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.permission.user_perms.sql
+
+commit 1f027999be137ebf3454d5a2259e40c1afb3a4b0
+Author: Cesar Velez <cesar.velez at equinoxinitiative.org>
+Date:   Fri Jun 2 10:36:30 2017 -0400
+
+    LP#1480432 - Added tests for permission.usr_perms() change
+    
+    Making sure that returned permissions are depth sorted ascending.
+    Tests and verifies mmorgan's patch for said lp bug.
+    
+    Signed-off by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+71	0	Open-ILS/src/sql/Pg/t/lp1480432_test_func.permissions.usr_perms_depth_sort.pg
+ create mode 100644 Open-ILS/src/sql/Pg/t/lp1480432_test_func.permissions.usr_perms_depth_sort.pg
+
+commit 96b1d32ccec2c01631ea8a39b72e89b6f1880aac
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Mon Aug 7 16:52:04 2017 -0400
+
+    LP#1681095: (follow-up) fix a template syntax error
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/templates/opac/parts/ebook_api/base_js.tt2
+
+commit 3ad807fd108a5975d8462cceaac24710109d1ef5
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Mon Aug 7 16:49:17 2017 -0400
+
+    LP#1075401: add release notes entry
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+5	0	docs/RELEASE_NOTES_NEXT/Administration/misc.adoc
+
+commit ad9f052688f3be18dd0b8829ab449cac5d810ee9
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Mon Aug 7 16:44:32 2017 -0400
+
+    LP#1075401: stamp DB update
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+35	0	Open-ILS/src/sql/Pg/upgrade/1049.data.nullify_invalid_act.age_protect_act.circ_as_type.sql
+0	35	Open-ILS/src/sql/Pg/upgrade/XXXX.data.nullify_invalid_act.age_protect_act.circ_as_type.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1049.data.nullify_invalid_act.age_protect_act.circ_as_type.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.nullify_invalid_act.age_protect_act.circ_as_type.sql
+
+commit 838f30e150dd1c589ed9a2cb7dc8494b467c63de
+Author: Michele Morgan <mmorgan at noblenet.org>
+Date:   Mon Jul 3 14:49:42 2017 -0400
+
+    LP 1075401 - Upgrade script to nullify existing bad data
+    
+    Sets to NULL any entries in asset.copy_template.age_protect and
+    asset.copy_template.circ_as_type that are not valid values.
+    
+    Signed-off-by: Michele Morgan <mmorgan at noblenet.org>
+    Signed-off-by: Josh Stompro <stomproj at larl.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+35	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.nullify_invalid_act.age_protect_act.circ_as_type.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.nullify_invalid_act.age_protect_act.circ_as_type.sql
+
+commit 27cec68fcf4f93090e75b97630f8ff204a89f8fc
+Author: Michele Morgan <mmorgan at noblenet.org>
+Date:   Tue Apr 18 12:11:01 2017 -0400
+
+    LP#1075401: adjust two fields in the legacy Serials Copy Template editor
+    
+    This commit changes the Age Protection and Circ as Type fields to links in
+    the fm_IDL.xml to allow the template to read the data in the fields. It also
+    changes the owning_lib reporter type to org_unit so the org unit shortname
+    is displayed in the grid view, along with fixing the config.floating_group cfg
+    FM settings so that the name is displayed instead of the ID.
+    
+    [Note from Galen: the forthcoming web staff serials module's serial
+     copy template editor already provided drop-downs for those two fields,
+     but the IDL changes remain beneficial.]
+    
+    Signed-off-by: Michele Morgan <mmorgan at noblenet.org>
+    Signed-off-by: Josh Stompro <stomproj at larl.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+7	5	Open-ILS/examples/fm_IDL.xml
+
+commit 98fc4aff6296411de4f1365ef21ea44d635ccf62
+Author: Jeff Davis <jdavis at sitka.bclibraries.ca>
+Date:   Fri May 26 10:05:02 2017 -0700
+
+    LP#1693851: Fix hardcoded paths in srfsh support scripts
+    
+    Signed-off-by: Jeff Davis <jdavis at sitka.bclibraries.ca>
+    Signed-off-by: Josh Stompro <stomproj at larl.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+4	0	Open-ILS/src/Makefile.am
+1	1	Open-ILS/src/support-scripts/clear_expired_circ_history.srfsh
+1	1	Open-ILS/src/support-scripts/purge_at_events.srfsh
+1	1	Open-ILS/src/support-scripts/purge_circulations.srfsh
+1	1	Open-ILS/src/support-scripts/purge_holds.srfsh
+1	1	Open-ILS/src/support-scripts/purge_pending_users.srfsh
+1	1	Open-ILS/src/support-scripts/update_hard_due_dates.srfsh
+
+commit 95f46e11a7513e6392b483985b45c71449048712
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Mon Aug 7 14:39:14 2017 -0400
+
+    LP#1704873 Stamping SQL upgrade for print labels
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+252	0	Open-ILS/src/sql/Pg/upgrade/1048.data.webstaff_print_label_ou_settings.sql
+0	252	Open-ILS/src/sql/Pg/upgrade/XXXX.data.webstaff_print_label_ou_settings.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1048.data.webstaff_print_label_ou_settings.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.webstaff_print_label_ou_settings.sql
+
+commit 308c2321a32f4b5fb9f746382be7c77870ca7b44
+Author: Jason Etheridge <jason at EquinoxInitiative.org>
+Date:   Fri Aug 4 17:47:12 2017 -0400
+
+    LP#1704873 webstaff: item label setting stickiness
+    
+    Save last template applied as default.
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+17	4	Open-ILS/web/js/ui/default/staff/cat/printlabels/app.js
+
+commit 69220697852976ecddc304124b4e06d6237bb189
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Sun Mar 5 16:07:17 2017 -0500
+
+    LP#1704873 webstaff: label printing
+    
+    ...initial hook
+    ...better stock template for labels, and a | wrap filter
+    ...pull in some Library Settings for Print Labels
+    ...Reset to Default button for templates for both receipt and item print labels
+    ...toward tabs for Print Label interface
+    ...template management for print labels
+    ...bundle the Call Number Template in with saved templates
+    ...manual editing of cn's for print labels
+    ...And affixes in the stock CN template.
+    ...Settings tab for print labels
+    ...add Print Labels action to Copy Buckets
+    ...and some other cosmetic tweaks to the Actions menu
+    ...add Print Labels to Holdings View
+    ...provide MVR's for use with Print Labels
+    ...better than super simple record, but Display Fields will be better yet later on
+    ...new org unit settings for print labels
+    ...and fix to stock call number template for affixes
+    ...and cn_wrap filter for call numbers
+    ...handle null location affixes
+    ...implement Print Item Labels on Save & Exit in vol/copy editor
+    
+    Signed-off-by: Jason Etheridge <jason at EquinoxInitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+7	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Cat.pm
+201	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+252	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.webstaff_print_label_ou_settings.sql
+1	0	Open-ILS/src/templates/staff/admin/workstation/t_print_templates.tt2
+8	6	Open-ILS/src/templates/staff/cat/bucket/copy/t_view.tt2
+2	0	Open-ILS/src/templates/staff/cat/catalog/t_holdings.tt2
+2	0	Open-ILS/src/templates/staff/cat/item/t_list.tt2
+30	0	Open-ILS/src/templates/staff/cat/printlabels/index.tt2
+161	0	Open-ILS/src/templates/staff/cat/printlabels/t_view.tt2
+1	1	Open-ILS/src/templates/staff/cat/volcopy/t_attr_edit.tt2
+2	2	Open-ILS/src/templates/staff/cat/volcopy/t_defaults.tt2
+285	0	Open-ILS/src/templates/staff/share/print_templates/t_item_label.tt2
+10	0	Open-ILS/src/templates/staff/share/print_templates/t_item_label_cn.tt2
+10	0	Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
+22	0	Open-ILS/web/js/ui/default/staff/cat/bucket/copy/app.js
+17	0	Open-ILS/web/js/ui/default/staff/cat/catalog/app.js
+17	0	Open-ILS/web/js/ui/default/staff/cat/item/app.js
+633	0	Open-ILS/web/js/ui/default/staff/cat/printlabels/app.js
+22	3	Open-ILS/web/js/ui/default/staff/cat/volcopy/app.js
+7	0	Open-ILS/web/js/ui/default/staff/services/print.js
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.webstaff_print_label_ou_settings.sql
+ create mode 100644 Open-ILS/src/templates/staff/cat/printlabels/index.tt2
+ create mode 100644 Open-ILS/src/templates/staff/cat/printlabels/t_view.tt2
+ create mode 100644 Open-ILS/src/templates/staff/share/print_templates/t_item_label.tt2
+ create mode 100644 Open-ILS/src/templates/staff/share/print_templates/t_item_label_cn.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/staff/cat/printlabels/app.js
+
+commit 8474754f6ad39d01b5ca8f4636dc6a418793e936
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Mon Aug 7 14:43:55 2017 -0400
+
+    LP#1681095: add release notes
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+9	0	docs/RELEASE_NOTES_NEXT/Administration/Public_catalog_asset_caching.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Administration/Public_catalog_asset_caching.adoc
+
+commit 9392f2adcab6b8ecd1dc36c250885d7652a0c994
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Mon Aug 7 14:35:38 2017 -0400
+
+    LP#1681095: fix TT syntax error
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/templates/kpac/record.tt2
+
+commit b4d40fc34ed0d78a7fc9fa314cf18bae80253e2b
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Mon Aug 7 14:22:02 2017 -0400
+
+    LP#1681095: add cache-busting to a couple more links
+    
+    This covers a couple more resources added since the last
+    time that the branch for this bug was rebased.
+    
+    The following command can help find other places where the
+    cache-busting key should be added:
+    
+      git grep -P '\.(gif|png|jpg|js|css)' Open-ILS/src/templates/{opac,kpac}|grep -v cache_key|grep -v eg_cache_hash
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/templates/opac/parts/js.tt2
+1	1	Open-ILS/src/templates/opac/parts/place_hold.tt2
+
+commit 647a0d21022aa8d61c8de6894d3b02bfd3a08c40
+Author: Dan Scott <dan at coffeecode.net>
+Date:   Sat Apr 8 09:26:42 2017 -0400
+
+    LP#1681095 Browser cache-busting key for longer expires
+    
+    Extend the support for cache-busting that we added with autogen's generation of
+    ctx.eg_cache_hash for core JavaScript assets to other assets such as images,
+    stylesheets, and additional JavaScript. This will enable us to set very long
+    cache times for our assets, which can then be controlled explicitly by setting
+    eg.cache_key in config.tt2, or by default any time you run autogen.
+    
+    Addresses TPAC and KPAC
+    
+    Signed-off-by: Dan Scott <dan at coffeecode.net>
+    Signed-off-by: Josh Stompro <stomproj at larl.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+2	2	Open-ILS/src/templates/kpac/category.tt2
+6	6	Open-ILS/src/templates/kpac/getit.tt2
+2	2	Open-ILS/src/templates/kpac/getit_results.tt2
+1	1	Open-ILS/src/templates/kpac/home.tt2
+2	2	Open-ILS/src/templates/kpac/parts/base.tt2
+1	1	Open-ILS/src/templates/kpac/parts/breadcrumb.tt2
+3	3	Open-ILS/src/templates/kpac/parts/header.tt2
+1	1	Open-ILS/src/templates/kpac/parts/help_popups.tt2
+3	3	Open-ILS/src/templates/kpac/parts/paginate.tt2
+3	3	Open-ILS/src/templates/kpac/parts/record_row.tt2
+1	1	Open-ILS/src/templates/kpac/parts/searchbox.tt2
+1	1	Open-ILS/src/templates/kpac/parts/util.tt2
+4	4	Open-ILS/src/templates/kpac/record.tt2
+2	2	Open-ILS/src/templates/opac/browse.tt2
+1	1	Open-ILS/src/templates/opac/myopac/circ_history.tt2
+1	1	Open-ILS/src/templates/opac/myopac/circs.tt2
+1	1	Open-ILS/src/templates/opac/myopac/hold_history.tt2
+2	2	Open-ILS/src/templates/opac/myopac/holds.tt2
+2	2	Open-ILS/src/templates/opac/myopac/lists.tt2
+1	1	Open-ILS/src/templates/opac/myopac/messages/list.tt2
+2	2	Open-ILS/src/templates/opac/myopac/prefs_my_lists.tt2
+1	1	Open-ILS/src/templates/opac/myopac/prefs_settings.tt2
+1	1	Open-ILS/src/templates/opac/parts/advanced/expert.tt2
+1	1	Open-ILS/src/templates/opac/parts/advanced/global_row.tt2
+1	1	Open-ILS/src/templates/opac/parts/advanced/search.tt2
+4	4	Open-ILS/src/templates/opac/parts/base.tt2
+1	1	Open-ILS/src/templates/opac/parts/bookbag_actions.tt2
+13	0	Open-ILS/src/templates/opac/parts/config.tt2
+5	5	Open-ILS/src/templates/opac/parts/ebook_api/base_js.tt2
+2	2	Open-ILS/src/templates/opac/parts/footer.tt2
+9	0	Open-ILS/src/templates/opac/parts/header.tt2
+1	1	Open-ILS/src/templates/opac/parts/homesearch.tt2
+3	3	Open-ILS/src/templates/opac/parts/js.tt2
+1	1	Open-ILS/src/templates/opac/parts/misc_util.tt2
+2	2	Open-ILS/src/templates/opac/parts/record/copy_table.tt2
+1	1	Open-ILS/src/templates/opac/parts/record/refworks.tt2
+6	6	Open-ILS/src/templates/opac/parts/record/summary.tt2
+4	4	Open-ILS/src/templates/opac/parts/result/table.tt2
+1	1	Open-ILS/src/templates/opac/parts/searchbar.tt2
+2	2	Open-ILS/src/templates/opac/parts/staff_saved_searches.tt2
+1	1	Open-ILS/src/templates/opac/parts/topnav_logo.tt2
+
+commit 1cb0d8c63c445979e272f4ad72ea912afcabf7e2
+Author: Dan Scott <dan at coffeecode.net>
+Date:   Sat Apr 8 11:02:02 2017 -0400
+
+    LP#1681095 Set aggressive default cache expires timelines
+    
+    Now that we have a broad cache-busting mechanism, set the default cache expires
+    timelines for non-HTML types far in the future.
+    
+    Signed-off-by: Dan Scott <dan at coffeecode.net>
+    Signed-off-by: Josh Stompro <stomproj at larl.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+8	6	Open-ILS/examples/apache/eg.conf.in
+8	6	Open-ILS/examples/apache_24/eg.conf.in
+
+commit 0e9f29730a5777630e11fcffee752c75c215533f
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Tue Jul 25 10:23:20 2017 -0400
+
+    LP#1706365: cursor for record menu items should be a pointer
+    
+    When using the Mark For or Other Actions menus on the bib record page, the
+    cursor becomes an i-beam while hovering over the menu items instead of the
+    expected pointer. This commit adds an empty href attribute to the a tag for menu
+    items so that a pointer displays instead.
+    
+    Test plan:
+    Log into the web client and retrieve a record. Click the 'Mark For' menu on the
+    record page. Pre-patch, as you scroll through the menu items, the cursor will
+    turn into an i-beam, indicating that text can be selected. Post-patch, the
+    cursor will be the expected pointer that typically displays for links.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+7	7	Open-ILS/src/templates/staff/cat/catalog/t_catalog.tt2
+
+commit b9add5846c0faf392cdccc470efd19452843672e
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Mon Aug 7 11:15:57 2017 -0400
+
+    LP#1694529: tweak wording of collision alert message
+    
+    And here's a test plan for the patch series as a whole:
+    
+    [1] In the web staff client, retrieve a patron that has some
+        loans. In a separate window, open the patron editor
+        for that same patron.
+    [2] In the first window, mark one of the patron's loans
+        as either claims returned or claims never checked out.
+    [3] In the second window, make a change and attempt to save
+        the record. You should see a alert dialog saying that
+        the record could not be saved.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/templates/staff/circ/patron/index.tt2
+
+commit a2f33fedb3efb8a91775541084a963141f6b8cda
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Jun 29 17:53:56 2017 -0400
+
+    LP#1694529 Patron editor friendly xact ID collision alert
+    
+    Display a friendly alert dialog message to staff when attempting to save
+    a patron record that has been externally modified during editing.  This
+    is an improvement over the existing debug alert with JSON data.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	0	Open-ILS/src/templates/staff/circ/patron/index.tt2
+8	0	Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
+
+commit de82391aa8379f95352a4e6f565f85bd1463a63b
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Mon Jul 24 12:17:51 2017 -0400
+
+    LP#1684126: copy images used by staff portal outside of /xul/
+    
+    This patch ensures that various images used by the web
+    staff client will remain available whenever the last bits
+    of the XUL client are removed.
+    
+    To test:
+    
+    [1] Apply patch
+    [2] Verify that all of the images on the web staff client's
+        splash page are displayed.
+    [3] Retrieve a patron that has an alertable condition (e.g.,
+        the patron record is expired. Verify that the stop sign
+        image is displayed.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+1	2	Open-ILS/src/templates/staff/circ/patron/t_alerts.tt2
+9	9	Open-ILS/src/templates/staff/t_splash.tt2
+70	0	Open-ILS/web/images/portal/LICENSE
+-	-	Open-ILS/web/images/portal/back.png
+-	-	Open-ILS/web/images/portal/background.png
+-	-	Open-ILS/web/images/portal/batchimport.png
+-	-	Open-ILS/web/images/portal/book.png
+-	-	Open-ILS/web/images/portal/bucket.png
+-	-	Open-ILS/web/images/portal/eg_tiny_logo.jpg
+-	-	Open-ILS/web/images/portal/forward.png
+-	-	Open-ILS/web/images/portal/helpdesk.png
+-	-	Open-ILS/web/images/portal/holds.png
+-	-	Open-ILS/web/images/portal/logo.png
+-	-	Open-ILS/web/images/portal/map.PNG
+-	-	Open-ILS/web/images/portal/newtab2.PNG
+-	-	Open-ILS/web/images/portal/receipt_editor.png
+-	-	Open-ILS/web/images/portal/registerpatron.png
+-	-	Open-ILS/web/images/portal/reports.png
+-	-	Open-ILS/web/images/portal/retreivepatron.png
+-	-	Open-ILS/web/images/portal/z3950.png
+-	-	Open-ILS/web/images/stop_sign.png
+ create mode 100644 Open-ILS/web/images/portal/LICENSE
+ create mode 100644 Open-ILS/web/images/portal/back.png
+ create mode 100644 Open-ILS/web/images/portal/background.png
+ create mode 100644 Open-ILS/web/images/portal/batchimport.png
+ create mode 100644 Open-ILS/web/images/portal/book.png
+ create mode 100644 Open-ILS/web/images/portal/bucket.png
+ create mode 100644 Open-ILS/web/images/portal/eg_tiny_logo.jpg
+ create mode 100644 Open-ILS/web/images/portal/forward.png
+ create mode 100644 Open-ILS/web/images/portal/helpdesk.png
+ create mode 100644 Open-ILS/web/images/portal/holds.png
+ create mode 100644 Open-ILS/web/images/portal/logo.png
+ create mode 100644 Open-ILS/web/images/portal/map.PNG
+ create mode 100644 Open-ILS/web/images/portal/newtab2.PNG
+ create mode 100644 Open-ILS/web/images/portal/receipt_editor.png
+ create mode 100644 Open-ILS/web/images/portal/registerpatron.png
+ create mode 100644 Open-ILS/web/images/portal/reports.png
+ create mode 100644 Open-ILS/web/images/portal/retreivepatron.png
+ create mode 100644 Open-ILS/web/images/portal/z3950.png
+ create mode 100644 Open-ILS/web/images/stop_sign.png
+
+commit aa139defa54c613444af14bc083b45803abbba2a
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Aug 3 15:43:52 2017 -0400
+
+    LP#1708510 Postgres 9.6 full text search config
+    
+    Avoid DB warnings about missing full-text search configs on PG 9.6 by
+    symlinking to original full text config.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	0	Open-ILS/src/sql/Pg/000.english.pg96.fts-config.sql
+ create mode 120000 Open-ILS/src/sql/Pg/000.english.pg96.fts-config.sql
+
+commit 6273f1ddae68d48322144d11d06b1034580e153e
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Wed May 17 11:22:25 2017 -0400
+
+    LP#1411699: ensure that Dojo remains available for added content tab
+    
+    This patch is meant to avoid a (very minor) silent regression
+    introduced by the previous patch; ultimately, though, the
+    functionality of tweaking the visibility of added content types
+    in the added content tab should be rewritten to drop any
+    requirement of Dojo.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+6	0	Open-ILS/src/templates/opac/parts/header.tt2
+
+commit 9619a1b583e20051054914fc18fb2a1997c58cb5
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Sun Apr 2 10:45:00 2017 -0400
+
+    LP#1411699: Make Dojo conditional for advanced search
+    
+    While the copy locations filter is a core feature, it surfaces only in the
+    advanced search page. The current behaviour forces Dojo and all of its
+    dependencies to be loaded for every catalogue page.
+    
+    By making it conditional on the advanced search page, we save approximately
+    600ms to first meaningful paint on the rest of the catalogue pages.
+    
+    To test:
+    
+    [1] Apply the two-patch series
+    [2] After applying the patch, verify that the copy location filter
+        on the advance search page functions. Also verify that
+        the JavaScript on the record details page that tweaks
+        the visiblity of sub-tabs in the added content tab
+        continue to work.
+    [3] Verify that other components that currently depend on Dojo,
+        such as the ebook API, continue to work.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+4	3	Open-ILS/src/templates/opac/parts/header.tt2
+
+commit f0f88695d5fe6184a9bfb94fdee4c8a9c53dd3ec
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Wed Aug 2 14:45:49 2017 -0400
+
+    LP#1705478: add release notes
+    
+    These release notes also refer to the enhancement
+    made in bug 1692106.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+7	0	docs/RELEASE_NOTES_NEXT/Cataloging/Export_Call_Number_Affixes.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/Export_Call_Number_Affixes.adoc
+
+commit 41f9a3b8caaf901d2cbe05cfb60461114ffe8e3d
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Wed Aug 2 14:39:23 2017 -0400
+
+    LP#1705478: (follow-up) emit prefix subfield before call number
+    
+    This patch reorders the subfields so that the prefix (if present)
+    is emitted in 852$k /before/ the call number subfield ($j); that way,
+    MARC parsers return subfields in their order in the field (and
+    humans) will see the components of the call number in their
+    expected order.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/support-scripts/marc_export.in
+
+commit 9720422e9d46e656f0d0d944babadad74e18478d
+Author: Martha Driscoll <driscoll at noblenet.org>
+Date:   Thu Jul 20 14:19:56 2017 -0400
+
+    LP#1705478: Marc_export should include call number prefix and suffix
+    
+    This commit adds the call number prefix and suffix, when present,
+    to the 852 $k and $m respectively when the --items option is used
+    in marc_export.
+    
+    Signed-off-by: Martha Driscoll <driscoll at noblenet.org>
+    Signed-off-by: Dan Pearl <dpearl at cwmars.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+54	0	Open-ILS/src/support-scripts/marc_export.in
+
+commit ccb7382c52346f513c4a14d8b15d3506f042531a
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Wed Aug 2 11:55:12 2017 -0400
+
+    LP#1189989: (follow-up) normalize capitalization of "onclick"
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/templates/opac/parts/place_hold.tt2
+
+commit 64008ef2f43d4d7c964e9b1f49639713a16e322f
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Wed Aug 2 11:49:08 2017 -0400
+
+    LP#1189989: (follow-up) ignore invalid thaw date
+    
+    This patch ensures that the specified thaw date is valid,
+    as otherwise specifying a thaw date of "13/08/2017" (when,
+    at present, only dates of the form mm/dd/yyyy are accepted)
+    would result in an Apache internal server error.
+    
+    If an invalid date is supplied, the thaw date is ignored, meaning
+    that the hold request will be placed as suspended but will not
+    automatically reactivate.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+8	1	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm
+
+commit 901bb58e5b0bd4dcd365207fdbb2dd59b108f532
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Tue Aug 1 16:48:19 2017 -0400
+
+    LP#1189989: Release notes entry for suspend option when placing hold
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+9	0	docs/RELEASE_NOTES_NEXT/OPAC/suspended_holds.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/suspended_holds.adoc
+
+commit fcdcab1d2904f46d2d9ff0e15087fad81efa90a1
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Fri Jul 21 12:47:14 2017 -0400
+
+    LP 1189989: Add suspend option when placing hold
+    
+    This commit adds some bells and whistles to the basic functionality:
+    
+    1. Adds two new styles in style.css.tt2 for toggled blocks and inline
+    text.  These styles allow text with id attributes beginnging with
+    certain strings to be normally hidden and then shown when they are the
+    target of an active anchor.  Only the block form is currently used,
+    but the inline text version may prove useful in the near future.
+    
+    2. Moves the "Suspend this hold?" language above the checkbox and adds
+    a variant to make it clear that all of the holds will be suspended
+    when multiple holds are placed.
+    
+    3. Adds the question mark graphic with mouseover help text indicating
+    that a suspended hold will not be fulfilled until it has been
+    activated.
+    
+    4. Adds a "Set activation date" anchor to toggle the appearance of the
+    text input for the optional thaw date.
+    
+    5. Adds a script block with a JavaScript function to toggle the
+    appearance of the text input for the optional thaw date and to check
+    the suspend hold check box when first toggled.  This function returns
+    false to prohibit the href of the anchor from firing and toggling the
+    appearance via CSS.  If JavaScript is disabled, the input's appearance
+    will be toggled via CSS, but the checkbox will not be checked
+    automatically.
+    
+    6. Adds language to the place hold results page to indicate if the
+    hold is suspended and adds the reactive date if supplied.
+    
+    7. Modifies the backend holds code to not set the expire time on a
+    hold if it is suspended.  This is a logical extension of code added
+    for Lp bug #1076399: Activating an expired hold cancels the hold.
+    
+    PLEASE NOTE: I would very much like to keep this branch in three
+    commits because the first commit is Bill Ott's initial implementation
+    from 2013.  The second commit is a fix to Bill's work required to make
+    it work with modern ttopac.  This third commit overs the expansion of
+    the functionality to meet MassLNC requirements.  I think it would
+    behoove us to keep these three pieces of work in distinct commits.
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm
+3	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm
+16	0	Open-ILS/src/templates/opac/css/style.css.tt2
+38	6	Open-ILS/src/templates/opac/parts/place_hold.tt2
+10	0	Open-ILS/src/templates/opac/parts/place_hold_result.tt2
+
+commit 1c88f4cefa9a7945b3520b7249f7134d26f8fa4b
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Sun Apr 23 15:54:12 2017 -0400
+
+    LP 1189989: Add suspend option when placing hold
+    
+    Fix the Apache Internal Server error caused by the previous patch.
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+9	6	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm
+
+commit b3d4bb5f364cca24d02b64ace7de884290f21992
+Author: Bill Ott <bott at grpl.org>
+Date:   Tue Aug 20 11:19:27 2013 -0400
+
+    LP 1189989: Add suspend option when placing hold
+    
+    Return of an option from JSPAC, the ability to immediately suspend a
+    hold when it's placed.
+    
+    TODO: As noted in the code for editing a hold, a calendar selection
+    would be preferred to requiring users to enter a valid date manually.
+    
+    This commit was a patch submitted by Bill Ott to Launchpad in August
+    2013.  Jason Stephenson applied the patch on April 22, 2017 and
+    resolved conflicts caused by the addition of a metarecords hold
+    feature in the TPAC.  The revised patch was committed with the
+    original author and commit timestamp.
+    
+    Signed-off-by: Bill Ott <bott at grpl.org>
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+8	1	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm
+8	0	Open-ILS/src/templates/opac/parts/place_hold.tt2
+
+commit a54b18e01f98ac74dfa9ab9e886c344e045e92d7
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Mon Jul 31 15:15:57 2017 -0400
+
+    Revert "LP#1635737 Use new OpenSRF interval_to_seconds() context"
+    
+    This reverts commit 04a101312b0a42d34108c8d78997a3960241363a.
+
+5	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/NonCat.pm
+
+commit 04a101312b0a42d34108c8d78997a3960241363a
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Fri Jul 21 14:28:16 2017 -0400
+
+    LP#1635737 Use new OpenSRF interval_to_seconds() context
+    
+    Use the optional context for interval_to_seconds() to account for the
+    variable length of duration components.  For example, "1 day" may be
+    shorter or longer than 24 hours during a time change event, "1 month"
+    may be shorter or longer depending on which month it is currently, etc.
+    
+    Also, remove some timestamp munging, as that happens within
+    interval_to_seconds() already.
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	5	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/NonCat.pm
+
+commit df5b68d92f75cdc5b339395240f7fbc45890f18d
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Thu Jul 27 17:20:52 2017 -0400
+
+    Forward port 2.11.7 upgrade script
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+5	0	Open-ILS/src/sql/Pg/version-upgrade/2.11.6-2.11.7-upgrade-db.sql
+ create mode 100644 Open-ILS/src/sql/Pg/version-upgrade/2.11.6-2.11.7-upgrade-db.sql
+
+commit bb05739a8d277d7cab1d99fc6027d549f26caa8c
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Mon Jul 24 18:11:41 2017 -0400
+
+    LP#1670448: Rearrange space for bib record action buttons
+    
+    The addition of the view/place order button pushed other action buttons to a
+    2nd row. We also need to make room for the forthcoming serials button. This
+    commit 1) changes the div classes for the navigation buttons and action buttons
+    so that it is now a 50/50 split of screen space and 2) moves some action items
+    into a 'Other Actions' menu.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+21	8	Open-ILS/src/templates/staff/cat/catalog/t_catalog.tt2
+
+commit ae0e16afa8867140bd2dd386111994fa1af96f71
+Author: Christine Morgan <cmorgan at noblenet.org>
+Date:   Mon Jul 3 16:08:11 2017 -0400
+
+    LP1670448 - Move View/Place Orders to Record Summary
+    
+    Removes View/Place Orders option from menu in Holdings View and adds a View/Place Orders button to Record Summary
+    
+    Signed-off-by: Christine Morgan <cmorgan at noblenet.org>
+    Signed-off-by: Josh Stompro <stomproj at larl.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+3	0	Open-ILS/src/templates/staff/cat/catalog/t_catalog.tt2
+0	2	Open-ILS/src/templates/staff/cat/catalog/t_holdings.tt2
+
+commit 2fb49f840683d10e1d7c84722d0d5d49e46b17c6
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Mon Jul 24 14:12:26 2017 -0400
+
+    LP#1691860: Release notes entry for nosound audio file
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+11	0	docs/RELEASE_NOTES_NEXT/Client/no_sound_audio_file.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Client/no_sound_audio_file.adoc
+
+commit fc9af0e90530c034f4ae0545e286cc44964fce6d
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Mon Jul 24 11:32:10 2017 -0400
+
+    LP#1673857: stamp schema update
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+98	0	Open-ILS/src/sql/Pg/upgrade/1047.schema.copy_tags.sql
+0	96	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.copy_tags.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1047.schema.copy_tags.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.copy_tags.sql
+
+commit 4e23a6a10199eeb289c9b4dbe476683ea455f4d7
+Author: Josh Stompro <stomproj at larl.org>
+Date:   Mon Jul 17 11:35:24 2017 -0500
+
+    LP#1673857: Disable browser autocomplete for tag entry
+    
+    Adds an autocomplete="off" to the input field to stop browsers
+    from trying to fill in values.  When the browser fills in values
+    for tags it can prevent the typeahead feature from being used
+    easily.
+    
+    Signed-off-by: Josh Stompro <stomproj at larl.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/templates/staff/cat/bucket/copy/t_apply_tags.tt2
+1	1	Open-ILS/src/templates/staff/cat/volcopy/t_copy_tags.tt2
+
+commit 3709094d3c2ec6ce38d022c6c6054737ba5e09a4
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu May 11 12:46:38 2017 -0400
+
+    LP#1673857: release notes
+    
+    Overall test plan
+    -----------------
+    [1] In Server Admnistration -> Copy Tag Types, test creating
+        and modifying copy tag types.
+    [2] In Server Admnistration -> Copy Tags, test creating
+        and modifying copy tags.
+    [3] In the volume/copy editor, test use of the 'Copy Tags'
+        button to link or unlink tags from copies.
+    [4] In the volume/copy editor, test use of the 'Copy Tags'
+        button to create and link new tags on the fly.
+    [5] In the copy buckets interface, test use of the 'Apply Tags'
+        grid action to link tags to copies.
+    [6] In the catalog, test the copy_tag(type, search) and
+        copy_tag(*, search) filters. Verify that tag visiblity
+        (as controlled by the "public" flag on a copy tag) is
+        respected.
+    [7] In the catalog, test the display of copy tags in
+        the copy table on the record summary page.
+    [8] Test the opac.search.enable_bookplate_search library setting
+        and verify that it causes a 'Digital Bookplates' search option
+        to be added.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Josh Stompro <stomproj at larl.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+51	0	docs/RELEASE_NOTES_NEXT/Cataloging/Copy_tags.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/Copy_tags.adoc
+
+commit 75513a28b49f65c6b40e0345e56aa0ef7eab243f
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu May 11 13:03:16 2017 -0400
+
+    LP#1673857: some test cases
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Josh Stompro <stomproj at larl.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+2	1	Open-ILS/src/perlmods/t/21-QueryParser.t
+55	0	Open-ILS/src/sql/Pg/t/copy_tags.pg
+ create mode 100644 Open-ILS/src/sql/Pg/t/copy_tags.pg
+
+commit e2f42eca432eb1d3317eab11d2d5869b2105931b
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Mar 31 18:31:52 2017 -0400
+
+    LP#1673857: interface for applying tags from copy buckets
+    
+    The copy buckets interface now includes an 'Apply Tags'
+    action that can be used to map tags to a set of selected
+    copies. Note that interface cannot be used to remove
+    tag mappings; the volume/copy editor is needed to do that.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Josh Stompro <stomproj at larl.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+39	0	Open-ILS/src/templates/staff/cat/bucket/copy/t_apply_tags.tt2
+2	0	Open-ILS/src/templates/staff/cat/bucket/copy/t_view.tt2
+78	0	Open-ILS/web/js/ui/default/staff/cat/bucket/copy/app.js
+ create mode 100644 Open-ILS/src/templates/staff/cat/bucket/copy/t_apply_tags.tt2
+
+commit 2f4111d29af1f1372f7ddf5ea21644955dce897c
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu May 11 11:29:25 2017 -0400
+
+    LP#1673857: add ability to set copy tags in volume/copy editor
+    
+    The copy editor now has a 'Copy Tags' button that can be used
+    to assign or remove tags from a copy. A typeahead widget is
+    used to allow the user to select an existing tag, but users can
+    also use this interface to create an entirely new tag on the fly.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Josh Stompro <stomproj at larl.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+51	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Cat/AssetCommon.pm
+9	0	Open-ILS/src/templates/staff/cat/volcopy/t_attr_edit.tt2
+39	0	Open-ILS/src/templates/staff/cat/volcopy/t_copy_tags.tt2
+6	0	Open-ILS/src/templates/staff/cat/volcopy/t_defaults.tt2
+124	2	Open-ILS/web/js/ui/default/staff/cat/volcopy/app.js
+ create mode 100644 Open-ILS/src/templates/staff/cat/volcopy/t_copy_tags.tt2
+
+commit 8f6e436a78efc5aa11164dadb5c868f34b0f2d19
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Mar 30 17:08:19 2017 -0400
+
+    LP#1673857: admin interfaces for copy tag types and copy tags
+    
+    This patch adds standard administration interfaces to manage
+    copy tag types (Server Administration) and copy tags (Local
+    Administration)
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Josh Stompro <stomproj at larl.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+50	0	Open-ILS/src/templates/staff/admin/local/asset/copy_tag.tt2
+1	0	Open-ILS/src/templates/staff/admin/local/t_splash.tt2
+38	0	Open-ILS/src/templates/staff/admin/server/config/copy_tag_type.tt2
+1	0	Open-ILS/src/templates/staff/admin/server/t_splash.tt2
+90	0	Open-ILS/web/js/ui/default/staff/admin/local/asset/copy_tag.js
+73	0	Open-ILS/web/js/ui/default/staff/admin/server/config/copy_tag_type.js
+ create mode 100644 Open-ILS/src/templates/staff/admin/local/asset/copy_tag.tt2
+ create mode 100644 Open-ILS/src/templates/staff/admin/server/config/copy_tag_type.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/staff/admin/local/asset/copy_tag.js
+ create mode 100644 Open-ILS/web/js/ui/default/staff/admin/server/config/copy_tag_type.js
+
+commit 0b08d83e6f05ff863ef85c63cb86f5b7f39b5c23
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Mon Apr 10 18:33:34 2017 +0000
+
+    LP#1673857: teach egFmRecordEditor how to create non-sequence-controlled ID values
+    
+    Since config.copy_tag_type uses a natural key, the egFmRecordEditor
+    dialog needs to allow the user to set it when creating a new
+    type.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Josh Stompro <stomproj at larl.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+7	1	Open-ILS/src/templates/staff/share/t_fm_record_editor.tt2
+4	0	Open-ILS/web/js/ui/default/staff/services/fm_record_editor.js
+
+commit 12894c4f76f1ee6e8f2a58ddabe27c39e281a8be
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Wed Mar 29 16:15:31 2017 -0400
+
+    LP#1673857: teach catalog how to search and display copy tags
+    
+    When the opac.search.enable_bookplate_search library setting is
+    set to true, the catalog will display a "Digital Bookplates" search
+    field in the drop-downs on both the search bar and the advanced search
+    page. Using this will add a "copy_tag(*, search_terms)" filter
+    to the search, i.e., all visible copy tags will be searched regardless
+    of type.  Users can also use the copy_tag() search filter directly.
+    
+    Visible copy tags are displayed in the copy table in the record
+    summary page. Note that copy tags are displayed regardless of whether
+    or not opac.search.enable_bookplate_search is on or off.
+    
+    Mike Rylander also contributed to this patch.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Josh Stompro <stomproj at larl.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+14	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Record.pm
+20	2	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Search.pm
+9	0	Open-ILS/src/templates/opac/css/style.css.tt2
+7	1	Open-ILS/src/templates/opac/parts/qtype_selector.tt2
+11	0	Open-ILS/src/templates/opac/parts/record/copy_table.tt2
+
+commit 1bf0a255cac45c82d909bacb214d2649bb63edda
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Wed Mar 29 15:46:54 2017 -0400
+
+    LP#1673857: add open-ils.circ.copy_tags.retrieve[.staff]
+    
+    These are methods to retrieve the set of copy tags associated
+    with a copy, scoped to an OU and its descendents at a
+    optional depth. The .staff version includes both
+    public and non-public notes (and requires STAFF_LOGIN
+    permission).
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Josh Stompro <stomproj at larl.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+68	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ.pm
+
+commit e02f34dbe844d1cd2193486593f832af3193ecd7
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Mar 17 17:46:59 2017 -0400
+
+    LP#1673857: add search filter for copy_tags
+    
+    Copy tags can be used as a search filter in the catalog. Two
+    variations are supported:
+    
+    * copy_tag(type_code, search_terms)
+    
+      Search for records that have copies that are linked to tags
+      whose value matches the search terms and whose type's
+      config.copy_tag_type.code matches the specified
+      type_code. E.g., "copy_tag(bookplate, donated by jane smith)"
+    
+    * copy_tag(*, search_terms)
+    
+      Search for records that have copies that are linked to tags
+      whose value matches the search terms, regardless of type.
+    
+    The copy_tag() search filter takes the OPAC-visiblity (as determined
+    by asset.copy_tag.pub) of the tag into account.
+    
+    Mike Rylander also contributed to this patch.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Josh Stompro <stomproj at larl.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+49	0	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm
+
+commit 0da6edee161f256f3d167d489bc7e9922e030548
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Mar 17 17:46:37 2017 -0400
+
+    LP#1673857: schema, IDL, library settings & perms for copy tags
+    
+    Three new tables are added to store copy tags:
+    
+    * config.copy_tag_type
+    
+      Defines types that can be used for distinguishing between
+      classes of copy tags when searching the catalog. The
+      seed data includes a 'bookplate' type by default. The new
+      permission ADMIN_COPY_TAG_TYPES controls C/U/D access to this
+      table.
+    
+    * asset.copy_tag
+    
+      The actual copy tag values. Copy tags have both labels and values,
+      and since at least one interface allows creating copy tags
+      on the fly, a trigger will set the value of a new tag
+      to its label if the value is null. asset.copy_tag also has a flag
+      for setting whether given tag should be searchable (and visible)
+      in the public catalog or not. The new permission ADMIN_COPY_TAG
+      controls C/U/D access to this table.
+    
+    * asset.copy_tag_copy_map
+    
+      This stores the link between copies and their tags. Only the
+      UPDATE_COPY permission is required in order to set tag mappings.
+    
+    The new library setting is opac.search.enable_bookplate_search, which
+    controls whether or not to display a "Digital Bookplate" entry in the
+    catalog search fields dropdowns.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Josh Stompro <stomproj at larl.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    
+    Conflicts:
+    	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+68	0	Open-ILS/examples/fm_IDL.xml
+9	0	Open-ILS/src/sql/Pg/002.schema.config.sql
+55	0	Open-ILS/src/sql/Pg/040.schema.asset.sql
+2	0	Open-ILS/src/sql/Pg/800.fkeys.sql
+27	1	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+96	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.copy_tags.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.copy_tags.sql
+
+commit f430c423482c51e5392118379d4a8b55b494d9b9
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Wed Jul 19 11:41:15 2017 -0400
+
+    LP#1700773: move release notes entry to client section
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+6	0	docs/RELEASE_NOTES_NEXT/Client/circ_modifier_staff.adoc
+0	6	docs/RELEASE_NOTES_NEXT/OPAC/circ_modifier_staff.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Client/circ_modifier_staff.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/circ_modifier_staff.adoc
+
+commit f04e795180df6d4bca740dcc68711a762cbea94b
+Author: Jason Boyer <jboyer at library.in.gov>
+Date:   Mon Jul 17 10:48:02 2017 -0400
+
+    LP1700773: Add Circ Mod to Staff TPAC
+    
+    Add the Circ Modifier to the Record Detail page
+    in the staff opac so users don't have to go back
+    and forth between Holdings Maintenance as often.
+    
+    Signed-off-by: Jason Boyer <jboyer at library.in.gov>
+    Signed-off-by: Josh Stompro <stomproj at larl.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm
+2	0	Open-ILS/src/templates/opac/parts/record/copy_table.tt2
+6	0	docs/RELEASE_NOTES_NEXT/OPAC/circ_modifier_staff.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/circ_modifier_staff.adoc
+
+commit c3be47804ad1a2c51452a3de6aca9179b9c4c689
+Author: Rogan Hamby <rogan.hamby at gmail.com>
+Date:   Fri Jun 9 14:44:12 2017 -0400
+
+    LP#1697066: changing copy location search box from 3 to 4
+    
+    This patch makes the number of options displayed in the
+    shelving location selector on the public catalog advanced
+    search page 4, matching the other selectors.
+    
+    Signed-off-by: Rogan Hamby <rogan.hamby at gmail.com>
+    Signed-off-by: Terran McCanna <tmccanna at georgialibraries.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/templates/opac/parts/advanced/search.tt2
+
+commit 95aa127869d23452bb6675ea0185e88008e132cc
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Sat May 20 09:36:06 2017 -0400
+
+    LP#1691560: start open-ils.qstore service by default
+    
+    To test
+    -------
+    [1] Apply patch, then restart all services.
+    [2] Verify that open-ils.qstore is running.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	0	Open-ILS/examples/opensrf.xml.example
+
+commit e8a19adfbbd80c1beb57d777fa1770bc1694c6e8
+Author: Martha Driscoll <driscoll at noblenet.org>
+Date:   Thu May 25 14:39:30 2017 -0400
+
+    LP#1692106: Z39.50 server includes prefix and suffix in 852
+    
+    Add the call number prefix and suffix to the 852 $k and $m when copy
+    information is returned by the Z39.50 server.
+    
+    Signed-off-by: Martha Driscoll <driscoll at noblenet.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+6	0	Open-ILS/src/perlmods/lib/OpenILS/WWW/SuperCat.pm
+
+commit a15dc23daacd6855ad2095c82d63bb52252885fe
+Author: Jason Boyer <jboyer at library.in.gov>
+Date:   Fri Jul 14 15:01:09 2017 -0400
+
+    LP1704463: Item Status Fields Correction
+    
+    The Loan Duration and Fine Level fields were
+    being incorrectly pulled from unrelated fields
+    on the most recent circ rather than the item.
+    
+    Signed-off-by: Jason Boyer <jboyer at library.in.gov>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+10	2	Open-ILS/src/templates/staff/cat/item/t_summary_pane.tt2
+
+commit ef5f78b01a38978986ee8d631ca2b78e1971fff3
+Author: Jason Etheridge <jason at equinoxinitiative.org>
+Date:   Wed Jul 5 17:02:43 2017 -0400
+
+    lp1702568 Copy Location fix for Hold Detail View
+    
+    hold.current_copy.location is better fleshed than copy.location in this case
+    
+    Signed-off-by: Jason Etheridge <jason at equinoxinitiative.org>
+    Signed-off-by: Andrea Neiman <abneiman at equinoxinitiative.org>
+
+1	1	Open-ILS/src/templates/staff/circ/share/t_hold_details.tt2
+
+commit 972202ac8e627ca370989dc2408aa41cf794203e
+Author: Jason Etheridge <jason at equinoxinitiative.org>
+Date:   Mon Jul 3 13:47:25 2017 -0400
+
+    lp1661685 fix circ lib in patron holds list
+    
+    and make it and the circ modifier column hidden by default
+    
+    Signed-off-by: Jason Etheridge <jason at equinoxinitiative.org>
+    Signed-off-by: Andrea Neiman <abneiman at equinoxinitiative.org>
+
+2	4	Open-ILS/src/templates/staff/circ/patron/t_holds_list.tt2
+
+commit f6a1851c7ba9d4897e4579055e67d82a5399752b
+Author: Jason Etheridge <jason at equinoxinitiative.org>
+Date:   Fri Jun 30 16:45:30 2017 -0400
+
+    lp1661685 webstaff: Circ Lib column for Items Out
+    
+    Signed-off-by: Jason Etheridge <jason at equinoxinitiative.org>
+    Signed-off-by: Andrea Neiman <abneiman at equinoxinitiative.org>
+
+2	1	Open-ILS/src/templates/staff/circ/patron/t_items_out.tt2
+1	1	Open-ILS/web/js/ui/default/staff/circ/patron/items_out.js
+
+commit dada0a559f26746a32cb9d219576dcd64182a5bb
+Author: Jason Etheridge <jason at equinoxinitiative.org>
+Date:   Wed Jun 28 14:58:37 2017 -0400
+
+    lp1661685 webstaff: Fix Owning Lib in Item Status
+    
+    Detail View
+    
+    Signed-off-by: Jason Etheridge <jason at equinoxinitiative.org>
+    Signed-off-by: Andrea Neiman <abneiman at equinoxinitiative.org>
+
+1	1	Open-ILS/src/templates/staff/cat/item/t_summary_pane.tt2
+
+commit 5a42920f57775bf7c7059457c3e9ad3deddbe335
+Author: Jason Etheridge <jason at equinoxinitiative.org>
+Date:   Wed Jun 28 14:41:53 2017 -0400
+
+    lp1661685 fieldmapper label change for circ
+    
+    Change "Circulation Library" to "Checkout / Renewal Library"
+    
+    Signed-off-by: Jason Etheridge <jason at equinoxinitiative.org>
+    Signed-off-by: Andrea Neiman <abneiman at equinoxinitiative.org>
+
+1	1	Open-ILS/examples/fm_IDL.xml
+
+commit 36308204b8c311602173fa6a606ac7275c53c47f
+Author: Jason Etheridge <jason at equinoxinitiative.org>
+Date:   Wed Jun 28 14:40:02 2017 -0400
+
+    lp1661685 webstaff: add money.grocery to pcrud
+    
+    and add a single column called Location to the Bills interface which shows
+    either the circ.circ_lib or the grocery.billing_location for a given xact
+    
+    and the specific columns for both xact types
+    
+    Signed-off-by: Jason Etheridge <jason at equinoxinitiative.org>
+    Signed-off-by: Andrea Neiman <abneiman at equinoxinitiative.org>
+
+6	1	Open-ILS/examples/fm_IDL.xml
+11	2	Open-ILS/src/templates/staff/circ/patron/t_bills_list.tt2
+
+commit 1fecb8a6d71da23a319382cdbcd47a2a13aefa2c
+Author: Cesar Velez <cesar.velez at equinoxinitiative.org>
+Date:   Thu Jun 15 11:30:48 2017 -0400
+
+    LP#1685933 - Add Owning Library column to grids in ItemsOut and checkout views
+    
+    Added necessary fleshing in egCirc service and items out to get acn.owning_lib.shortname
+    
+    Signed-off by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    
+    Signed-off-by: Jason Etheridge <jason at equinoxinitiative.org>
+
+1	0	Open-ILS/src/templates/staff/circ/patron/t_checkout.tt2
+1	0	Open-ILS/src/templates/staff/circ/patron/t_items_out.tt2
+1	1	Open-ILS/web/js/ui/default/staff/circ/patron/items_out.js
+7	1	Open-ILS/web/js/ui/default/staff/circ/services/circ.js
+
+commit 16f2447321c3c28fe2a8f8206467c6740dcb3359
+Author: Cesar Velez <cesar.velez at equinoxinitiative.org>
+Date:   Wed Jun 14 17:14:14 2017 -0400
+
+    LP#1661685 - Adds circ library column to staff webclient grids
+    
+    Circulation Library was missing as an option from several grids
+    Added also function to flesh out circ_lib.shortname to display name.
+    
+    Signed-off by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    
+    Signed-off-by: Jason Etheridge <jason at equinoxinitiative.org>
+
+1	0	Open-ILS/src/templates/staff/circ/checkin/t_checkin_table.tt2
+5	0	Open-ILS/src/templates/staff/circ/patron/t_bills_list.tt2
+1	0	Open-ILS/src/templates/staff/circ/patron/t_checkout.tt2
+2	0	Open-ILS/src/templates/staff/circ/patron/t_holds_list.tt2
+1	0	Open-ILS/web/js/ui/default/staff/circ/patron/holds.js
+7	1	Open-ILS/web/js/ui/default/staff/circ/services/circ.js
+
+commit bebc5dc53a89d342b621216b4cc66d8c3e77e76d
+Author: Cesar Velez <cesar.velez at equinoxinitiative.org>
+Date:   Fri Jun 9 17:36:16 2017 -0400
+
+    LP#1661685 - Adds missing Circulation Modifier column to several grids
+    
+    Some views like the Checkout,CheckIn, Holds, And Bills
+     did not display the copy's circ_modifier field.
+     Also added egCirc.flesh_copy_circ_modifier()
+    
+    Signed-off by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    
+    Signed-off-by: Jason Etheridge <jason at equinoxinitiative.org>
+
+1	0	Open-ILS/src/templates/staff/circ/checkin/t_checkin_table.tt2
+3	0	Open-ILS/src/templates/staff/circ/patron/t_bills_list.tt2
+1	1	Open-ILS/src/templates/staff/circ/patron/t_checkout.tt2
+2	0	Open-ILS/src/templates/staff/circ/patron/t_holds_list.tt2
+14	0	Open-ILS/web/js/ui/default/staff/circ/services/circ.js
+
+commit 62e4bb2d85d40d410d0a9b34664dcc8723286f2c
+Author: Cesar Velez <Cesar.Velez at equinoxinitiative.org>
+Date:   Fri Jun 23 17:45:15 2017 +0100
+
+    LP#1697754 - WebStaff make receipt on payment sticky
+    
+        Add circ.bills.receiptonpay local storage setting.
+    
+    Signed-off by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    
+    Signed-off-by: Jason Etheridge <jason at equinoxinitiative.org>
+
+1	1	Open-ILS/src/templates/staff/circ/patron/t_bills.tt2
+10	0	Open-ILS/web/js/ui/default/staff/circ/patron/bills.js
+
+commit ed5127eb4c7e5836253c3c81e0223b218d2f3024
+Author: Cesar Velez <cesar.velez at equinoxinitiative.org>
+Date:   Thu Jun 8 11:33:31 2017 -0400
+
+    LP#1677000 - webstaff Adds a 'has-notes visual indicator' for patrons with notes.
+    
+    Made the indicator be clickable and route to Other->Notes.
+    Other ways to address this not mentioned in LP would be
+    using a glyphicon instead, or moving the Notes submenu item out of Others tab.
+    Or even making the entire tab/menu be resposive, and collapsing into an Others submenu
+    only when needed.
+    
+    Signed-off by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    
+    Signed-off-by: Jason Etheridge <jason at equinoxinitiative.org>
+
+2	0	Open-ILS/src/templates/staff/circ/patron/index.tt2
+1	0	Open-ILS/src/templates/staff/css/circ.css.tt2
+2	1	Open-ILS/web/js/ui/default/staff/services/user.js
+
+commit 00faa720a8dd94c781c50d508189d719f7f7f0d0
+Author: Cesar Velez <cesar.velez at equinoxinitiative.org>
+Date:   Wed Jun 21 17:02:24 2017 -0400
+
+    LP#1672421-Fix for Catalog record Holds view grid not refreshing
+    
+    Holds view grid was not refreshing upon paging using next/prev
+    Added call to egHolds service to fix that.
+    
+    Signed-off by: Cesar Velez <cesar.velez at equinoxinitiative.org>
+    
+    Signed-off-by: Jason Etheridge <jason at equinoxinitiative.org>
+
+1	0	Open-ILS/web/js/ui/default/staff/cat/catalog/app.js
+
+commit e3470259fc793f008e24019692924ce4ca8b9416
+Author: Jason Etheridge <jason at equinoxinitiative.org>
+Date:   Thu Jun 15 12:58:19 2017 -0400
+
+    lp1517595 webstaff: purge patron account action
+    
+    TODO: disable the menu entry based on permissions
+    
+    Signed-off-by: Jason Etheridge <jason at equinoxinitiative.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+11	0	Open-ILS/src/templates/staff/circ/patron/index.tt2
+68	2	Open-ILS/web/js/ui/default/staff/circ/patron/app.js
+
+commit 4bc2104dd27a02bb27f35dd2363277ced845159e
+Author: Jason Etheridge <jason at equinoxinitiative.org>
+Date:   Thu Jun 15 11:29:59 2017 -0400
+
+    webstaff: CSS for disabled anchor <a> elements
+    
+    Don't let bootstrap override the grey color (for example, when using dropdown-menu)
+    
+    Signed-off-by: Jason Etheridge <jason at equinoxinitiative.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	1	Open-ILS/src/templates/staff/css/style.css.tt2
+
+commit 5cbcf40d1c5f9d3fe3eeff0cbce9bb8c34b847c5
+Author: Pasi Kallinen <pasi.kallinen at pttk.fi>
+Date:   Thu Aug 1 11:21:17 2013 +0300
+
+    LP#1205190: quiet some CSS Mozilla extensions warnings.
+    
+    * -moz-dialog-text is actually -moz-dialogtext
+    * -moz-outline is deprecated, use outline
+    * -moz-border-radius has been removed, use border-radius
+    * -moz-border-radius-topleft (etc) are now border-top-left-radius
+    * Fix some other CSS errors.
+    
+    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    
+    Conflicts:
+    	Open-ILS/src/templates/opac/css/style.css.tt2
+    	Open-ILS/web/css/skin/default/register.css
+    	Open-ILS/web/opac/skin/default/xml/home/homesearch.xml
+    	Open-ILS/web/reports/oils_rpt.css
+    	Open-ILS/xul/staff_client/server/admin/org_unit_settings.xhtml
+    	Open-ILS/xul/staff_client/server/serial/notes.xul
+    	Open-ILS/xul/staff_client/server/skin/circ.css
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+0	3	Open-ILS/src/templates/opac/css/style.css.tt2
+0	1	Open-ILS/web/css/skin/default/selfcheck.css
+1	1	Open-ILS/web/opac/extras/slimpac/advanced.html
+1	1	Open-ILS/web/opac/extras/slimpac/start.html
+3	3	Open-ILS/web/opac/skin/default/css/layout.css
+1	1	Open-ILS/web/reports/oils_rpt.css
+19	19	Open-ILS/xul/staff_client/chrome/skin/browser.css
+1	1	Open-ILS/xul/staff_client/server/admin/org_unit_settings.xhtml
+8	8	Open-ILS/xul/staff_client/server/skin/circ.css
+
+commit f0a523932954579685cd95505c3d064b4450aa0a
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Jun 29 14:51:40 2017 -0400
+
+    LP#1697954 Items out fetch grids only when needed
+    
+    Avoid forcing a refresh of Items Out grids in cases where the grids will
+    automatically refresh as a new grid is instantiated.  This prevents the
+    code from calling redundant data collection APIs, resulting in local
+    cache's with duplicate data sets.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+2	2	Open-ILS/src/templates/staff/circ/patron/t_items_out.tt2
+12	6	Open-ILS/web/js/ui/default/staff/circ/patron/items_out.js
+
+commit c0989e28005e21ecf6cfa6a70750c385ad52f070
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Jun 29 11:55:26 2017 -0400
+
+    LP#1697954 Items out pre-fetch renders selected range
+    
+    Items out and noncat items out grids now only render the selected range
+    of transactions, instead of the full set collected for client-side grid
+    sorting.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+24	6	Open-ILS/web/js/ui/default/staff/circ/patron/items_out.js
+
+commit 85a648005c0948a641b79a64d9b9029bdfc02ecf
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Jun 22 12:09:26 2017 -0400
+
+    LP#1697954 Notify correct page of patron holds
+    
+    Instead of notifying the grid on all holds, just notify when we're inside
+    the current page of results.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+9	1	Open-ILS/web/js/ui/default/staff/circ/patron/holds.js
+
+commit 07425b0cc1737a515af877d66fdd5f349514a2e8
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Jun 21 12:09:37 2017 -0400
+
+    LP#1697954 Hold details API additional fleshing
+    
+    * Support new flesh options in hold details retrieval API:
+    
+    include_current_copy
+    include_usr
+    include_cancel_cause
+    include_requestor
+    
+    * Teach browser client code to use the new flesh options.  This reduces
+      the number of API calls significantly for rendering holds grids.
+    
+    * Add debug logging to existing local-flesh calls to indicate when/if
+      additional API fleshing may be needed.
+    
+    * Remove TODO comment about batching holds to avoid cstore exhaustion,
+      which was fixed with LP#1653001.  However, leave the batching in place
+      since it noticeably improves UI responsiveness, at the cost of a few
+      extra API calls.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+13	12	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm
+25	11	Open-ILS/web/js/ui/default/staff/circ/services/holds.js
+
+commit 63cebb9dcdb960d754322a4aad810d351e1f4a84
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Jun 21 11:35:15 2017 -0400
+
+    LP#1697954 TODO comments for client sort all-fetching
+    
+    Add additional code comments further clarifying why some grids pre-fetch
+    all rows (for client-side sorting) instead of fetching in pages.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+6	1	Open-ILS/web/js/ui/default/staff/circ/patron/holds.js
+6	0	Open-ILS/web/js/ui/default/staff/circ/patron/items_out.js
+
+commit dc038b64a9d32ac0d2c631cda8aa6b2926660c42
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Jun 14 11:53:11 2017 -0400
+
+    LP#1697954: Enable clientsort for user items out lists
+    
+    These will generally be small, so we'll fetch all the data to support client-
+    side sorting.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Andrea Neiman <abneiman at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+3	3	Open-ILS/src/templates/staff/circ/patron/t_items_out.tt2
+4	4	Open-ILS/web/js/ui/default/staff/circ/patron/items_out.js
+
+commit 23483d848a9869284b6584e37136fb0c5e7ca757
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Jun 14 11:51:53 2017 -0400
+
+    LP#1697954: Enable clientsort for user holds lists
+    
+    These will generally be small, so we'll fetch all the data to support client-
+    side sorting.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Andrea Neiman <abneiman at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+3	3	Open-ILS/src/templates/staff/circ/patron/t_holds_list.tt2
+2	2	Open-ILS/web/js/ui/default/staff/circ/patron/holds.js
+
+commit f9cac2940e4f5c6fec9506119017e8e8c332d1e6
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Jun 14 11:51:24 2017 -0400
+
+    LP#1697954: Enable clientsort for checkout
+    
+    This list is filled by the user, so it's safe to use client-side sorting.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Andrea Neiman <abneiman at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/templates/staff/circ/patron/t_checkout.tt2
+
+commit c5c5f878d3f15b04475ce5f76a844b78953ce1a5
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Jun 14 12:07:52 2017 -0400
+
+    LP#1697954: Provide custom comparator for sorting money on renew
+    
+    mbts.balance_owed often arrives as a string, so we provide here a custom
+    comparator function that runs the values through parseFloat() before comparing
+    them.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Andrea Neiman <abneiman at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/templates/staff/circ/renew/t_renew.tt2
+8	0	Open-ILS/web/js/ui/default/staff/circ/renew/app.js
+
+commit 1e0ff6f2b91293e80588cb4843b0911a5c85953f
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Jun 14 11:50:52 2017 -0400
+
+    LP#1697954: Enable clientsort for renew
+    
+    This list is filled by the user, so it's safe to use client-side sorting.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Andrea Neiman <abneiman at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+2	2	Open-ILS/src/templates/staff/circ/renew/t_renew.tt2
+
+commit 70e126cd0121c1de2246bf6f51be7c772d8a7e06
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Jun 14 11:50:08 2017 -0400
+
+    LP#1697954: Enable clientsort for pending patrons
+    
+    This list always retreives all data, so it's safe to use client-side sorting.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Andrea Neiman <abneiman at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/templates/staff/circ/patron/t_pending_list.tt2
+
+commit dac1016c777c821b455f9be34e093a1441a52326
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Jun 14 12:11:27 2017 -0400
+
+    LP#1697954: Provide custom comparator for sorting money on checkin
+    
+    mbts.balance_owed often arrives as a string, so we provide here a custom
+    comparator function that runs the values through parseFloat() before comparing
+    them.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Andrea Neiman <abneiman at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/templates/staff/circ/checkin/t_checkin_table.tt2
+8	0	Open-ILS/web/js/ui/default/staff/circ/checkin/app.js
+
+commit 26352c64f78e45ee7be09439f40e03a31bbc67f9
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Jun 14 11:49:12 2017 -0400
+
+    LP#1697954: Enable clientsort for checkin
+    
+    This list is filled by the user, so it's safe to use client-side sorting.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Andrea Neiman <abneiman at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+2	2	Open-ILS/src/templates/staff/circ/checkin/t_checkin_table.tt2
+
+commit c1f3bd316785d9f68a20f49943129649ee113928
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Jun 14 11:47:48 2017 -0400
+
+    LP#1697954: Enable clientsort for item status list
+    
+    This list is filled by the user, so it's safe to use client-side sorting.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Andrea Neiman <abneiman at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/templates/staff/cat/item/t_list.tt2
+
+commit 520215937726cba99ab6aeb8c16e689b2c3e0dd5
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Wed Jun 14 11:32:36 2017 -0400
+
+    LP#1697954: Provide client-side sorting for grids that can use it
+    
+    There are several grids (items out, checkin, checkout, item status, etc) that
+    could benefit from the ability to sort their items, but either the data
+    provider uses a complex data structure or an API call that doesn't offer
+    sorting, or the item list is populated by user input rather than a call to the
+    server.  In those cases, sorting is not available.  However, if we know that
+    all the data in the grid is in client memory, it would be reasonable to offer
+    a client-side sort option.
+    
+    This commit does that by teaching the grid to accept a "clientsort" feature
+    and teaching arrayNotifier how to sort the items currently stored.  The sort
+    works over any mix of IDL objects, hashes, and flattened fields, supports
+    multisort, and pushes "nulls" to the end of the list.
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    Signed-off-by: Andrea Neiman <abneiman at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+81	0	Open-ILS/web/js/ui/default/staff/services/grid.js
+
+commit ba4ee40134658d19f1f453bc5ffe6972788db3ea
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Jun 29 12:03:53 2017 -0400
+
+    LP#1687125: add release notes
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+3	0	docs/RELEASE_NOTES_NEXT/Reports/link_provider_and_note.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Reports/link_provider_and_note.adoc
+
+commit 6fd2bdc0354e8aa0b16f6b76a2b159a64ca0fdfa
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu Jun 29 10:14:17 2017 -0400
+
+    LP#1687125: adjust relationship between acqpro and acqpron
+    
+    A provider can have many notes, and "provider_notes" is effectively
+    virtual.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+2	2	Open-ILS/examples/fm_IDL.xml
+
+commit 57c636c4e0e9356822107c8e1fddfa046c355505
+Author: Rogan Hamby <rogan.hamby at gmail.com>
+Date:   Fri Apr 28 19:08:50 2017 -0400
+
+    LP#1687125: adding provider note to provider note in fm_IDL
+    
+    This patch makes provider notes available to the reporter.
+    
+    To test
+    -------
+    [1] Add a note to a provider record (note that at present,
+        this can only be done directly in the database).
+    [2] In the report editor, verify that the reporting
+        source for providers now includes a link to notes.
+    [3] Create and run a report that includes the provider
+        note.
+    
+    Signed-off-by: Rogan Hamby <rogan.hamby at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+3	1	Open-ILS/examples/fm_IDL.xml
+
+commit 518023bd388dccf84bb48a2b34d91a1e9813d5d2
+Author: Jason Etheridge <jason at equinoxinitiative.org>
+Date:   Thu Jun 15 17:18:16 2017 -0400
+
+    lp1653998 webstaff redirect to login page
+    
+    on invalid/non-existent authtoken in all or most interfaces (hopefully)
+    
+    Signed-off-by: Jason Etheridge <jason at equinoxinitiative.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+6	0	Open-ILS/web/js/ui/default/staff/services/startup.js
+
+commit 0a5cbf34954169db7f5eda477b0ae3fe04ea24ca
+Author: Dan Wells <dbw2 at calvin.edu>
+Date:   Wed Jun 21 17:52:36 2017 -0400
+
+    Forward-port 2.11.6 upgrade script
+    
+    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
+
+5	0	Open-ILS/src/sql/Pg/version-upgrade/2.11.5-2.11.6-upgrade-db.sql
+ create mode 100644 Open-ILS/src/sql/Pg/version-upgrade/2.11.5-2.11.6-upgrade-db.sql
+
+commit c99bf5d4e773d551baefc8e89d4b14c796a1858c
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Wed Jun 21 13:13:46 2017 -0400
+
+    Docs: 2.11.6 Release Notes
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+28	0	docs/RELEASE_NOTES_2_11.adoc
+
+commit 876660f25b3778f2bae7933c1ac6eed6df6050fb
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Tue Jun 20 12:34:06 2017 -0400
+
+    LP#1244547: add release notes
+    
+    Since this feature is tiny, I'm starting a miscellaneous
+    section for any other further tiny enhancements in the
+    'Administration' section.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+6	0	docs/RELEASE_NOTES_NEXT/Administration/misc.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Administration/misc.adoc
+
+commit 2f3fce507a4717ce970fc493c3d88ae0f2358b60
+Author: Remington Steed <rjs7 at calvin.edu>
+Date:   Wed Jun 14 12:43:39 2017 -0400
+
+    LP#1244547 Fix reference to new isFiltered variable
+    
+    This commit completes the intention of the previous commit, which
+    accidentally checked the isFiltered object instead of its value.
+    
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/xul/staff_client/server/admin/org_unit_settings.js
+
+commit b45d350c1edd21a7819e5f323337c7e3867a58f5
+Author: Adam Bowling <abowling at emeralddata.net>
+Date:   Thu Jan 22 11:20:28 2015 -0500
+
+    LP#1244547 Maintain Filter Settings on Library Settings Editor
+    
+    After applying a filter to the rows on the Library Settings
+    Editor, and then selecting a different OU, the filter settings
+    are not considered unless the user clicks the "Filter" button
+    once again.
+    
+    This patch maintains the filter settings on the edior until
+    the user clicks the "Clear Filter" button.
+    
+    Signed-off-by: Adam Bowling <abowling at emeralddata.net>
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+8	2	Open-ILS/xul/staff_client/server/admin/org_unit_settings.js
+1	0	Open-ILS/xul/staff_client/server/admin/org_unit_settings.xhtml
+
+commit f91286ead8f0ad15343747192211af7bd84ee075
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Mon Jun 19 17:11:40 2017 -0400
+
+    Remove testrunner-breaking trailing JS comma
+    
+    Remove unnecessary comma that causes JS tests to fail, while allowing
+    the code to run fine in the browser.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/web/js/ui/default/staff/services/startup.js
+
+commit 8054e9ebbd317fe0262a5d9fd37e789bfd46cbcb
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Mon Jun 19 12:18:19 2017 -0400
+
+    LP#1691237: stamp schema update
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+53	0	Open-ILS/src/sql/Pg/upgrade/1046.data.webstaff_date_format_ou_settings.sql
+0	68	Open-ILS/src/sql/Pg/upgrade/XXXX.data.webstaff_date_format_ou_settings.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1046.data.webstaff_date_format_ou_settings.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.webstaff_date_format_ou_settings.sql
+
+commit 1792f4c8e688e68616f27649b747f3a4a4c9e590
+Author: Jason Etheridge <jason at equinoxinitiative.org>
+Date:   Mon Jun 12 15:05:56 2017 -0400
+
+    lp1691237 release notes for new date fmt settings
+    
+    Signed-off-by: Jason Etheridge <jason at equinoxinitiative.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+26	0	docs/RELEASE_NOTES_NEXT/Client/new_webstaff_date_format_settings.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Client/new_webstaff_date_format_settings.adoc
+
+commit 50f6df42441175c614c57151202f5309d2aae8a2
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri Jun 9 16:01:14 2017 -0400
+
+    LP#1691237 Date settings retrieval via egEnv
+    
+    Avoid multiple .resolve() calls on the main egStartup promise by asking
+    egEnv to fetch the new date/time org unit settings.  Related, make the
+    pathway for adding new universally-loaded data functions more obvious
+    and consistent in egStartup by putting them right up at the top.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+19	13	Open-ILS/web/js/ui/default/staff/services/startup.js
+
+commit b6a1cf9fe868c46f84b1f20b6e9869c9ab71228b
+Author: Jason Etheridge <jason at equinoxinitiative.org>
+Date:   Mon Jun 5 17:32:55 2017 -0400
+
+    lp1691237 webstaff: fix Format Dates and Format Times
+    
+    This change deprecates the existing Format Dates and Format Times settings
+    and adds two settings for use with the webstaff client:
+    
+        Format Dates with this pattern
+        Format Date+Time with this pattern
+    
+    These settings use format strings as documented here:
+    
+    https://docs.angularjs.org/api/ng/filter/date
+    
+    There is overlap with how the Dojo formats worked, but also some differences.
+    
+    The original Format Dates and Format Times settings worked together, but the
+    new settings work independently.  Certain field elements will use one, and
+    certain field elements will use the other.  These distinctions are hard-coded
+    in the various UI templates, with the idea being that timestamp fields in
+    which the date component alone is sufficient information (for example, DOB)
+    will use the Format Dates setting.  Fields where the time component is
+    important (for example, Checkout Time) will use the Format Date+Time setting.
+    
+    When the settings Format Dates and Format Date+Time are unset, we will default
+    to "shortDate" (M/d/yy) and "short" (M/d/yy h:mm a), respectively.
+    
+    Signed-off-by: Jason Etheridge <jason at equinoxinitiative.org>
+    Signed-off-by: Andrea Neiman <abneiman at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+40	0	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+68	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.webstaff_date_format_ou_settings.sql
+3	2	Open-ILS/src/templates/staff/admin/local/circ/neg_balance_users.tt2
+2	1	Open-ILS/src/templates/staff/admin/local/rating/badge.tt2
+2	1	Open-ILS/src/templates/staff/admin/server/config/marc_field.tt2
+4	4	Open-ILS/src/templates/staff/admin/workstation/t_log.tt2
+5	4	Open-ILS/src/templates/staff/cat/catalog/t_holds.tt2
+4	4	Open-ILS/src/templates/staff/cat/item/t_circ_list_pane.tt2
+10	10	Open-ILS/src/templates/staff/cat/item/t_circs_pane.tt2
+7	7	Open-ILS/src/templates/staff/cat/item/t_holds_pane.tt2
+14	34	Open-ILS/src/templates/staff/cat/item/t_list.tt2
+7	7	Open-ILS/src/templates/staff/cat/item/t_summary_pane.tt2
+1	1	Open-ILS/src/templates/staff/cat/share/t_record_summary.tt2
+7	5	Open-ILS/src/templates/staff/cat/volcopy/t_edit.tt2
+2	2	Open-ILS/src/templates/staff/cat/z3950/t_list.tt2
+1	1	Open-ILS/src/templates/staff/circ/checkin/t_checkin.tt2
+5	4	Open-ILS/src/templates/staff/circ/checkin/t_checkin_table.tt2
+3	2	Open-ILS/src/templates/staff/circ/holds/t_pull_list.tt2
+5	4	Open-ILS/src/templates/staff/circ/holds/t_shelf_list.tt2
+1	1	Open-ILS/src/templates/staff/circ/patron/t_alerts.tt2
+3	2	Open-ILS/src/templates/staff/circ/patron/t_bill_history_payments.tt2
+5	4	Open-ILS/src/templates/staff/circ/patron/t_bill_history_xacts.tt2
+3	2	Open-ILS/src/templates/staff/circ/patron/t_bills_list.tt2
+3	2	Open-ILS/src/templates/staff/circ/patron/t_checkout.tt2
+4	3	Open-ILS/src/templates/staff/circ/patron/t_group.tt2
+5	4	Open-ILS/src/templates/staff/circ/patron/t_holds_list.tt2
+7	5	Open-ILS/src/templates/staff/circ/patron/t_items_out.tt2
+6	4	Open-ILS/src/templates/staff/circ/patron/t_messages.tt2
+1	1	Open-ILS/src/templates/staff/circ/patron/t_notes.tt2
+2	1	Open-ILS/src/templates/staff/circ/patron/t_pending_list.tt2
+4	3	Open-ILS/src/templates/staff/circ/patron/t_search_results.tt2
+6	6	Open-ILS/src/templates/staff/circ/patron/t_summary.tt2
+12	9	Open-ILS/src/templates/staff/circ/patron/t_xact_details.tt2
+3	2	Open-ILS/src/templates/staff/circ/renew/t_renew.tt2
+2	2	Open-ILS/src/templates/staff/circ/share/t_bill_patron_dialog.tt2
+2	2	Open-ILS/src/templates/staff/circ/share/t_circ_exists_dialog.tt2
+1	1	Open-ILS/src/templates/staff/circ/share/t_copy_in_transit_dialog.tt2
+5	5	Open-ILS/src/templates/staff/circ/share/t_hold_details.tt2
+2	2	Open-ILS/src/templates/staff/circ/share/t_hold_shelf_dialog.tt2
+2	2	Open-ILS/src/templates/staff/circ/share/t_transit_dialog.tt2
+5	5	Open-ILS/src/templates/staff/circ/transits/t_list.tt2
+1	1	Open-ILS/src/templates/staff/share/print_templates/t_bill_payment.tt2
+3	3	Open-ILS/src/templates/staff/share/print_templates/t_bills_current.tt2
+3	3	Open-ILS/src/templates/staff/share/print_templates/t_bills_historical.tt2
+1	1	Open-ILS/src/templates/staff/share/print_templates/t_checkin.tt2
+2	2	Open-ILS/src/templates/staff/share/print_templates/t_checkout.tt2
+2	2	Open-ILS/src/templates/staff/share/print_templates/t_hold_shelf_slip.tt2
+2	2	Open-ILS/src/templates/staff/share/print_templates/t_hold_transit_slip.tt2
+2	2	Open-ILS/src/templates/staff/share/print_templates/t_holds_for_bib.tt2
+1	1	Open-ILS/src/templates/staff/share/print_templates/t_holds_for_patron.tt2
+1	1	Open-ILS/src/templates/staff/share/print_templates/t_in_house_use_list.tt2
+1	1	Open-ILS/src/templates/staff/share/print_templates/t_item_status.tt2
+2	2	Open-ILS/src/templates/staff/share/print_templates/t_items_out.tt2
+1	1	Open-ILS/src/templates/staff/share/print_templates/t_patron_note.tt2
+2	2	Open-ILS/src/templates/staff/share/print_templates/t_renew.tt2
+2	2	Open-ILS/src/templates/staff/share/print_templates/t_transit_list.tt2
+1	1	Open-ILS/src/templates/staff/share/print_templates/t_transit_slip.tt2
+9	1	Open-ILS/web/js/ui/default/staff/services/grid.js
+15	2	Open-ILS/web/js/ui/default/staff/services/startup.js
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.webstaff_date_format_ou_settings.sql
+
+commit 87ac04ae7241c52e17eec8d224dd74ffeb64d8fe
+Author: Jason Etheridge <jason at equinoxinitiative.org>
+Date:   Mon Jun 12 11:07:59 2017 -0400
+
+    lp1671603 webstaff: add confirm step for voiding billings
+    
+    This patch adds a confirmation step for  both Void All Bills
+    in the main billing UI, and Void Billings in the Full Details UI
+    
+    Signed-off-by: Jason Etheridge <jason at equinoxinitiative.org>
+    Signed-off-by: Andrea Neiman <abneiman at equinoxinitiative.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+2	0	Open-ILS/src/templates/staff/circ/patron/index.tt2
+57	32	Open-ILS/web/js/ui/default/staff/circ/patron/bills.js
+
+commit 69f14123ea9ba3f3a0fa10f3c77e9538a37b866f
+Author: Jason Etheridge <jason at equinoxinitiative.org>
+Date:   Tue Jun 6 16:59:02 2017 -0400
+
+    LP#1671596 webstaff: add Adjust to Zero option to Bill UI
+    
+    To test
+    -------
+    1. Apply patch.
+    2. Go to a patron record that has one or more active billings.
+    3. Note that in the billing grid, there is now an "Adjust to Zero"
+       action.
+    4. Select one or more billings and apply the action.
+    5. Verify that the billings are adjusted to zero and that
+       the adjustments show up as "payments".
+    
+    Signed-off-by: Jason Etheridge <jason at equinoxinitiative.org>
+    Signed-off-by: Andrea Neiman <abneiman at equinoxinitiative.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+2	0	Open-ILS/src/templates/staff/circ/patron/index.tt2
+3	0	Open-ILS/src/templates/staff/circ/patron/t_bills_list.tt2
+31	0	Open-ILS/web/js/ui/default/staff/circ/patron/bills.js
+
+commit c1ecb3515503eef49debfe6e30e5df2548cb254a
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Jun 9 15:29:34 2017 -0400
+
+    LP#1533326: follow-up to remove extra logging statement
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+0	1	Open-ILS/web/js/ui/default/staff/cat/item/app.js
+
+commit 1654eb8fd3ad6b6f0144848dd6b360f52bed461f
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri Jun 9 14:30:50 2017 -0400
+
+    LP#1533326 Item status actions menu styling
+    
+    Webstaff Item Status Details => Actions menu is now scrollabled for
+    consistency with the matching Actions menu in the List grid.  Menu is
+    also classed with "dropdown-menu-right" so menu entries pull left,
+    avoiding scroll / overflow funkiness when the menu expands.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/templates/staff/cat/item/index.tt2
+
+commit e8b62d4be009332ff9c5432aa5998c0b862afc67
+Author: Jason Etheridge <jason at equinoxinitiative.org>
+Date:   Fri Jun 9 10:11:21 2017 -0400
+
+    webstaff: Item Status bugs with Transfer Items...
+    
+    ...to Previously Marked Volume
+    
+    Now it throws up the override dialog only if an ils event is returned,
+    and it doesn't prematurely refresh the screen or re-scan a barcode
+    while the dialog is open.
+    
+    Signed-off-by: Jason Etheridge <jason at equinoxinitiative.org>
+    Signed-off-by: Andrea Neiman <abneiman at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+23	17	Open-ILS/web/js/ui/default/staff/cat/item/app.js
+
+commit ad952a97cab3aa3886e8a3f459d1473a8530375c
+Author: Jason Etheridge <jason at equinoxinitiative.org>
+Date:   Fri Jun 9 09:38:02 2017 -0400
+
+    lp1533326 webstaff: Actions for Item Status Detail View
+    
+    This patch makes the actions available to the item status
+    grid view also available in the detail view.  It also adds an
+    indicator to the Detail View for when an item is deleted.
+    
+    Signed-off-by: Jason Etheridge <jason at equinoxinitiative.org>
+    Signed-off-by: Andrea Neiman <abneiman at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+34	9	Open-ILS/src/templates/staff/cat/item/index.tt2
+4	0	Open-ILS/src/templates/staff/cat/item/t_summary_pane.tt2
+583	296	Open-ILS/web/js/ui/default/staff/cat/item/app.js
+
+commit 8b34a4f5fd916e057fc127350bfc4c34c859d097
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Jun 9 11:39:42 2017 -0400
+
+    LP#1612752: apply terminology change to web staff
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+4	4	Open-ILS/src/templates/staff/circ/share/t_abort_transit_dialog.tt2
+1	1	Open-ILS/src/templates/staff/circ/transits/t_list.tt2
+
+commit fe44ac279bed352c3a49a8a2c69e84c5a8e2ee43
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Jun 9 11:31:48 2017 -0400
+
+    LP#1612752: stamp schema update
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+25	0	Open-ILS/src/sql/Pg/upgrade/1045.schema.create-transit-cancel-time-column.sql
+0	25	Open-ILS/src/sql/Pg/upgrade/XXXX-create-transit-cancel-time-column.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1045.schema.create-transit-cancel-time-column.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX-create-transit-cancel-time-column.sql
+
+commit 96c30ebbd617c6ab3ab03dcb77294cb9f4c321cf
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Tue May 16 12:06:37 2017 -0400
+
+    LP#1612752 No canceled transits in webstaff transit list
+    
+    Avoid displaying canceled (previously aborted/deleted) transits in the
+    web staff Transit List interface.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+2	1	Open-ILS/web/js/ui/default/staff/circ/transits/list.js
+
+commit 0584c40feb01c666e82e0ff3ac178a3cbeea5991
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Tue Feb 21 07:23:42 2017 -0500
+
+    LP#1612752 - Do not clobber local perm description changes.
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+17	6	Open-ILS/src/sql/Pg/upgrade/XXXX-create-transit-cancel-time-column.sql
+
+commit 2e7dfb9cca26c73ea3f6e87637fed03de902e5ca
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Sat Feb 11 18:39:05 2017 -0500
+
+    LP#1612752 - Adding release notes for Transit Cancel time and terminology change.
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+26	0	docs/RELEASE_NOTES_NEXT/Circulation/Transit_Cancel_Time.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/Transit_Cancel_Time.adoc
+
+commit 3992d368ac9d08aef664c55876ad155cc396a2a5
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Mon Aug 15 10:41:52 2016 -0400
+
+    LP#1612752 - s/abort/cancel/ in user interfaces.
+    
+    Replacing the technical term "abort" with the more
+    end-user-understandable "cancel". In client-visible
+    language.  The underlying code has retained "abort".
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/extras/ils_events.xml
+4	4	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+6	0	Open-ILS/src/sql/Pg/upgrade/XXXX-create-transit-cancel-time-column.sql
+1	1	Open-ILS/src/templates/staff/circ/checkin/t_checkin_table.tt2
+1	1	Open-ILS/src/templates/staff/circ/renew/t_renew.tt2
+1	1	Open-ILS/src/templates/staff/circ/share/circ_strings.tt2
+1	1	Open-ILS/src/templates/staff/circ/share/t_copy_in_transit_dialog.tt2
+4	4	Open-ILS/web/opac/locale/en-US/lang.dtd
+5	5	Open-ILS/xul/staff_client/server/locale/en-US/circ.properties
+
+commit 1cedb423902810e9df5355ab18c7ca7e18d5391d
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Fri Aug 12 13:41:25 2016 -0400
+
+    LP#1612752 - Add cancel_time to action.transit_copy and friends.
+    
+    It is useful to have keep action.transit_copy rows intact when
+    doing forensics on what happens after a staff member cancels a
+    transit.
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+4	0	Open-ILS/examples/fm_IDL.xml
+2	2	Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Booking.pm
+4	3	Open-ILS/src/perlmods/lib/OpenILS/Application/Cat/AssetCommon.pm
+1	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ.pm
+3	3	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
+6	5	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm
+8	5	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Transit.pm
+3	3	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/action.pm
+3	1	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/action.pm
+2	1	Open-ILS/src/perlmods/lib/OpenILS/SIP/Item.pm
+2	1	Open-ILS/src/sql/Pg/090.schema.action.sql
+8	0	Open-ILS/src/sql/Pg/upgrade/XXXX-create-transit-cancel-time-column.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX-create-transit-cancel-time-column.sql
+
+commit 510d4febcbb666a6ca944470969e94e800f9de00
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Fri May 26 12:09:49 2017 -0400
+
+    LP#1672775 Stamping A/T purge SQL upgrade
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+105	0	Open-ILS/src/sql/Pg/upgrade/1043.schema.action-trigger-purge-events.sql
+22	0	Open-ILS/src/sql/Pg/upgrade/1044.data.action-trigger-purge-events.sql
+0	105	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.action-trigger-purge-events.sql
+0	22	Open-ILS/src/sql/Pg/upgrade/YYYY.data.action-trigger-purge-events.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1043.schema.action-trigger-purge-events.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1044.data.action-trigger-purge-events.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.action-trigger-purge-events.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.data.action-trigger-purge-events.sql
+
+commit 6ded4c35f463af9004651c9f73ac7f0036423f79
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri May 26 10:24:53 2017 -0400
+
+    LP#1672775: add purge_at_events.srfsh to example crontab
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+3	0	Open-ILS/examples/crontab.example
+
+commit 36567bb7696e33f03ee1ab575d3ef6a78345ee0c
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Mar 16 12:33:55 2017 -0400
+
+    LP#1672775 Action/Trigger retention interval release notes
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+63	0	docs/RELEASE_NOTES_NEXT/Administration/purge-at-events.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Administration/purge-at-events.adoc
+
+commit ea536c71dedfaf9b97067e2da60e63a80be103fb
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Mar 16 11:46:06 2017 -0400
+
+    LP#1672775 Action/Trigger CRON-able purge script
+    
+    Installs a new purge_at_events.sh script into the Evergreen bin
+    directory.  Invoked at regular intervals to remove expired events.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	0	Open-ILS/src/Makefile.am
+7	0	Open-ILS/src/support-scripts/purge_at_events.srfsh
+ create mode 100755 Open-ILS/src/support-scripts/purge_at_events.srfsh
+
+commit 71817cb89fdc1cc782857293e7b87b3ea65e3378
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Mar 16 10:53:43 2017 -0400
+
+    LP#1672775 Action/Trigger purge PGTAP tests
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+90	0	Open-ILS/src/sql/Pg/live_t/purge-at-events.pg
+ create mode 100644 Open-ILS/src/sql/Pg/live_t/purge-at-events.pg
+
+commit 6214235b7ee8d041d1a4f06fd562281b30663db9
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Wed Mar 15 15:39:55 2017 -0400
+
+    LP#1672775 Action/Trigger retention interval SQL/IDL
+    
+    Adds a new 'retention_interval' column for Action/Trigger Event
+    Definitions and an action_trigger.purge_events() function for deleting
+    events that have exceeded their configured retention time, including any
+    outputs linked to those events.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	0	Open-ILS/examples/fm_IDL.xml
+86	2	Open-ILS/src/sql/Pg/400.schema.action_trigger.sql
+20	32	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+105	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.action-trigger-purge-events.sql
+22	0	Open-ILS/src/sql/Pg/upgrade/YYYY.data.action-trigger-purge-events.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.action-trigger-purge-events.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.data.action-trigger-purge-events.sql
+
+commit cccfa3598073765d84d4924c6f3adbc831fc8b37
+Author: Jason Etheridge <jason at esilibrary.com>
+Date:   Fri Nov 9 16:47:36 2012 -0500
+
+    LP#1077212: add qstore to eg_db_config.pl --update-config list
+    
+    To test
+    -------
+    [1] After applying the patch, run eg_db_config --update-config --service all
+        as per the upgrade instructions.
+    [2] Verify that the <open-ils.qstore> section of opensrf.xml contains
+        the correct database credentials.
+    
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/support-scripts/eg_db_config.in
+
+commit b985c79a170c2ea06feffd87444d0a441b1f270d
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu May 25 09:31:27 2017 -0400
+
+    LP#1687971: stamp DB update
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+8	0	Open-ILS/src/sql/Pg/upgrade/1042.schema.asset.copy_location.url.sql
+0	6	Open-ILS/src/sql/Pg/upgrade/XXXX.asset.copy_location.url.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1042.schema.asset.copy_location.url.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.asset.copy_location.url.sql
+
+commit 6886dc463ab97db49c2ad23a712c26ff98613969
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu May 18 21:11:20 2017 -0400
+
+    LP#1687971: follow-up fix to copy location editor
+    
+    This fixes an issue where URLs of existing copy locations
+    could not be edited.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	0	Open-ILS/xul/staff_client/server/admin/copy_locations.xhtml
+
+commit d1fc46a0d731524846987c480b06d535f8d6c8b6
+Author: Michele Morgan <mmorgan at noblenet.org>
+Date:   Mon May 8 15:08:11 2017 -0400
+
+    LP#1687971 - Make copy locations in the OPAC clickable.
+    
+    Adds a url field to asset.copy_location. The presence of a url in the
+    field will cause the copy location to display as a link in the OPAC. Urls
+    can be edited in the Copy Locations Editor.
+    
+    Additional contributors: Martha Driscoll, Christine Morgan, Suzanne
+    Paterno.
+    
+    Signed-off-by: Michele Morgan <mmorgan at noblenet.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	0	Open-ILS/examples/fm_IDL.xml
+2	1	Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm
+2	1	Open-ILS/src/sql/Pg/040.schema.asset.sql
+6	0	Open-ILS/src/sql/Pg/upgrade/XXXX.asset.copy_location.url.sql
+14	0	Open-ILS/src/templates/opac/parts/location_name_link.tt2
+1	1	Open-ILS/src/templates/opac/parts/record/copy_table.tt2
+2	0	Open-ILS/web/opac/locale/en-US/lang.dtd
+11	0	Open-ILS/xul/staff_client/server/admin/copy_locations.js
+6	2	Open-ILS/xul/staff_client/server/admin/copy_locations.xhtml
+4	0	docs/RELEASE_NOTES_NEXT/OPAC/clickable_copy_locations.adoc
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.asset.copy_location.url.sql
+ create mode 100644 Open-ILS/src/templates/opac/parts/location_name_link.tt2
+ create mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/clickable_copy_locations.adoc
+
+commit 6d94067f076785499a1ffaf60dce193aa57f0a41
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu May 25 09:24:24 2017 -0400
+
+    LP#1498155: stamp DB update
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+16	0	Open-ILS/src/sql/Pg/upgrade/1041.data.remove_SET_CIRC_MISSING.sql
+0	14	Open-ILS/src/sql/Pg/upgrade/XXXX.remove_SET_CIRC_MISSING.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1041.data.remove_SET_CIRC_MISSING.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.remove_SET_CIRC_MISSING.sql
+
+commit 5f8238c26c7dadf848c946103f80126f3edec49e
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Sat Aug 20 14:25:07 2016 -0400
+
+    LP#1498155 - Also remove user-assigned SET_CIRC_MISSING perm.
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+4	0	Open-ILS/src/sql/Pg/upgrade/XXXX.remove_SET_CIRC_MISSING.sql
+
+commit adda813e888222a4f4ec5575901594970df5f6c7
+Author: Josh Stompro <stomproj at larl.org>
+Date:   Thu Nov 12 21:53:36 2015 -0600
+
+    LP1498155 - Remove SET_CIRC_MISSING permission.
+    
+    SET_CIRC_MISSING isn't used anywhere, remove it to avoid
+    confusing it with MARK_ITEM_MISSING permission.
+    
+    Signed-off-by: Josh Stompro <stomproj at larl.org>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+0	4	Open-ILS/src/sql/Pg/950.data.seed-values.sql
+10	0	Open-ILS/src/sql/Pg/upgrade/XXXX.remove_SET_CIRC_MISSING.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.remove_SET_CIRC_MISSING.sql
+
+commit 52b09a619b1cd8475e88bab16bd1efa5917a33ea
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu May 18 22:38:33 2017 -0400
+
+    LP1574141: add release notes
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+15	0	docs/RELEASE_NOTES_NEXT/API/Batch_contact_invalidation.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/API/Batch_contact_invalidation.adoc
+
+commit 1c6b0d4895d817542e4d5193b1ca36372d8cd4f4
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu May 18 22:28:49 2017 -0400
+
+    LP1574141: minor code tweaks
+    
+    - return the BAD_PARAMS event if client provides neither patron ID
+      nor contact value
+    - more precisely identify missing parameters
+    - standardize indentation
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+5	6	Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
+
+commit c1ac4845ba1bdebad903b650791d691694dd6c6d
+Author: Josh Stompro <stomproj at larl.org>
+Date:   Fri Jul 1 15:29:42 2016 -0500
+
+    LP1574141 - Allow invalidate for all patrons with the same contact.
+    
+    Teach the open-ils.actor.invalidate.* methods to allow invalidating
+    by the contact value, so all patrons with that contact value can have
+    it invalidated with one call.
+    
+    This adds a new parameter for the contact value (email address, phone
+    number).  Then all customers with that value have it invalidated from
+    their account.
+    
+    This somewhat simplifies writing a cli script for invalidating email
+    addresses since the script doesn't have to look up the user first.
+    
+    The ability to invalidate all with the same contact value was already
+    there, it just wasn't exposed.
+    
+    Testing:
+    
+    1. Make sure the normal staff client invalidate buttons still work.
+    2. Use srfsh to try the call with a contact value.
+      request open-ils.actor open-ils.actor.invalidate.email "<authkey>" "" "" "" "test at email.com"
+    
+    Signed-off-by: Josh Stompro <stomproj at larl.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+30	15	Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
+
+commit 58579e840f471109abae23b28aa85a7c35ff992b
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu May 18 15:17:51 2017 -0400
+
+    LP#1691801 Webstaff grid column move controls
+    
+    Add options to grid "Configure Columns" interface for moving a column
+    left or right by one, all the way left, and all the way right.
+    
+    Most recently modified column is styled so it's easier for users to track
+    the movement of a column.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+4	0	Open-ILS/src/templates/staff/css/style.css.tt2
+30	1	Open-ILS/src/templates/staff/share/t_autogrid.tt2
+32	0	Open-ILS/web/js/ui/default/staff/services/grid.js
+
+commit 4f578bef368ab0623ec8c87ccc328b426c445d5e
+Author: Ben Shum <ben at evergreener.net>
+Date:   Thu May 25 00:24:38 2017 -0400
+
+    Translation updates - po files
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+5	5	build/i18n/po/XULTermLoader.js/de-DE.po
+83	32	build/i18n/po/db.seed/ar-JO.po
+30	31	build/i18n/po/fm_IDL.dtd/ar-JO.po
+5	6	build/i18n/po/fm_IDL.dtd/cs-CZ.po
+2	6	build/i18n/po/fm_IDL.dtd/de-DE.po
+5	6	build/i18n/po/fm_IDL.dtd/en-CA.po
+5	6	build/i18n/po/fm_IDL.dtd/en-GB.po
+5	6	build/i18n/po/fm_IDL.dtd/es-ES.po
+5	6	build/i18n/po/fm_IDL.dtd/fi-FI.po
+2	6	build/i18n/po/fm_IDL.dtd/fr-CA.po
+5	6	build/i18n/po/fm_IDL.dtd/hy-AM.po
+2	6	build/i18n/po/fm_IDL.dtd/oc-FR.po
+5	6	build/i18n/po/fm_IDL.dtd/pt-BR.po
+5	6	build/i18n/po/fm_IDL.dtd/ru-RU.po
+2	6	build/i18n/po/fm_IDL.dtd/tr-TR.po
+4	4	build/i18n/po/lang.dtd/es-ES.po
+12	4	build/i18n/po/tpac/ar-JO.po
+12	4	build/i18n/po/tpac/cs-CZ.po
+11	3	build/i18n/po/tpac/de-DE.po
+11	3	build/i18n/po/tpac/en-CA.po
+11	3	build/i18n/po/tpac/en-GB.po
+50	39	build/i18n/po/tpac/es-ES.po
+11	3	build/i18n/po/tpac/fi-FI.po
+11	3	build/i18n/po/tpac/fr-CA.po
+11	3	build/i18n/po/tpac/hy-AM.po
+11	3	build/i18n/po/tpac/oc-FR.po
+11	3	build/i18n/po/tpac/pt-BR.po
+11	3	build/i18n/po/tpac/ru-RU.po
+11	3	build/i18n/po/tpac/tr-TR.po
+6	6	build/i18n/po/webstaff/es-ES.po
+
+commit 1fb27b3f3ffe16cef7bb7adc349ca78909551d81
+Author: Ben Shum <ben at evergreener.net>
+Date:   Thu May 25 00:16:56 2017 -0400
+
+    Translation updates - newpot
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+3	3	build/i18n/po/cat.properties/cat.properties.pot
+3	3	build/i18n/po/common.properties/common.properties.pot
+199	199	build/i18n/po/db.seed/db.seed.pot
+2693	2671	build/i18n/po/fm_IDL.dtd/fm_IDL.dtd.pot
+24	25	build/i18n/po/lang.dtd/lang.dtd.pot
+7	2	build/i18n/po/patron.properties/patron.properties.pot
+146	142	build/i18n/po/tpac/tpac.pot
+350	233	build/i18n/po/webstaff/webstaff.pot
+
+commit b298bc47bf8b09db5c0f2a748b8d1c03e873441b
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Wed May 24 12:33:45 2017 -0400
+
+    release notes for 2.10.12
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+26	0	docs/RELEASE_NOTES_2_10.adoc
+
+commit 1bbe3fb5f5e4cfcf5e6325ee9335b9924cd71bc7
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Wed May 24 12:29:57 2017 -0400
+
+    update 2.11.5 release notes
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+18	3	docs/RELEASE_NOTES_2_11.adoc
+
+commit 391d7edf68bc7a67b69620ef74db36b7a79a9747
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Tue May 2 10:57:23 2017 -0400
+
+    LP#1678638: use new preferred extension for AsciiDoc files
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+390	0	docs/TechRef/qstore/qstore.adoc
+0	390	docs/TechRef/qstore/qstore.txt
+856	0	docs/TechRef/qstore/query_schema.adoc
+0	856	docs/TechRef/qstore/query_schema.txt
+ create mode 100644 docs/TechRef/qstore/qstore.adoc
+ delete mode 100644 docs/TechRef/qstore/qstore.txt
+ create mode 100644 docs/TechRef/qstore/query_schema.adoc
+ delete mode 100644 docs/TechRef/qstore/query_schema.txt
+
+commit 2d338c37ba685cde824f79432978f3a7524378be
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Sun Apr 2 15:15:56 2017 -0400
+
+    LP#1678638: add text versions the qstore and query_schema docs
+    
+    qstore.txt includes some AsciiDoc markup, while query_schema.txt
+    is just the results of passing query_schema.odt through unoconv
+    and pandoc.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+390	0	docs/TechRef/qstore/qstore.txt
+856	0	docs/TechRef/qstore/query_schema.txt
+ create mode 100644 docs/TechRef/qstore/qstore.txt
+ create mode 100644 docs/TechRef/qstore/query_schema.txt
+
+commit f87c94c4116dda099b85d3c67e34a7465ec524e5
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Sun Apr 2 14:59:00 2017 -0400
+
+    LP#1678638: technical documentation for qstore
+    
+    Technical documentation and sample stored queries for
+    the open-ils.qstore service, written by Scott McKellar
+    and copyright 2010 by the Equinox Open Library Initiative.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+60	0	docs/TechRef/qstore/README
+-	-	docs/TechRef/qstore/qstore.odt
+9	0	docs/TechRef/qstore/query_dump.sh
+393	0	docs/TechRef/qstore/query_dump.sql
+-	-	docs/TechRef/qstore/query_schema.odt
+316	0	docs/TechRef/qstore/stored_queries.txt
+48	0	docs/TechRef/qstore/test_qstore.txt
+ create mode 100644 docs/TechRef/qstore/README
+ create mode 100644 docs/TechRef/qstore/qstore.odt
+ create mode 100755 docs/TechRef/qstore/query_dump.sh
+ create mode 100644 docs/TechRef/qstore/query_dump.sql
+ create mode 100644 docs/TechRef/qstore/query_schema.odt
+ create mode 100644 docs/TechRef/qstore/stored_queries.txt
+ create mode 100644 docs/TechRef/qstore/test_qstore.txt
+
+commit 7609099190455ce8662c8950e426c00552390a98
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri May 19 09:37:49 2017 -0400
+
+    LP#1564508: disable selecting Hatch status menu item
+    
+    Add the "disabled" class to the <li> for the navbar menu
+    item that displays Hatch's status, to avoid making users
+    think that there's an action available to them by selecting
+    that menu item.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+1	1	Open-ILS/src/templates/staff/navbar.tt2
+
+commit 7814064a1a4c21094017f4b553e91c879c5e100d
+Author: Bill Erickson <berickxx at gmail.com>
+Date:   Thu Nov 17 15:33:02 2016 -0500
+
+    LP#1564508 Hatch status in hamburger, remove statusbar
+    
+    * Move the Hatch connectivity status indicator into the upper-right
+      hamburger menu.
+    
+    * Removes the long-hidden hatch/websockets statusbar.
+    
+    * Since the Hamburger forces a re-digest of the interface when opened,
+      the code no longer attempts to force the page to re-$apply() when
+      the Hatch connection opens or closes.  It's no longer necesssary
+      (and was buggy).
+    
+    * The WebSockets connectivity status is not added to the hamburger.  The
+      websockets connection will go up and down regularly as connections
+      expire and reset.  Having the indicator flash could lead to
+      unneccesary panic.  Plus, if websockets are down, staff can't log in
+      anyway.
+    
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+0	3	Open-ILS/src/templates/staff/base.tt2
+0	1	Open-ILS/src/templates/staff/base_js.tt2
+2	25	Open-ILS/src/templates/staff/css/style.css.tt2
+11	0	Open-ILS/src/templates/staff/navbar.tt2
+0	41	Open-ILS/src/templates/staff/statusbar.tt2
+0	1	Open-ILS/web/js/ui/default/staff/Gruntfile.js
+5	0	Open-ILS/web/js/ui/default/staff/services/navbar.js
+0	61	Open-ILS/web/js/ui/default/staff/services/statusbar.js
+0	1	Open-ILS/web/js/ui/default/staff/test/karma.conf.js
+ delete mode 100644 Open-ILS/src/templates/staff/statusbar.tt2
+ delete mode 100644 Open-ILS/web/js/ui/default/staff/services/statusbar.js
+
+commit 1c83704e0ed0ddca391f8324689751f5adc0c80b
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Sat Apr 22 08:17:53 2017 -0400
+
+    LP 1672519: Make marc_export descendants aware.
+    
+    Add a --descendants option to marc_export to get records for an
+    org. unit and its descendants.
+    
+    To test
+    -------
+    [1] Run marc_export with -i --library FOO. Verify that the resulting
+        records have 852 fields only from FOO.
+    [2] Run marc_export with -i --descendants FOO. Verify that the resulting
+        records have 852 fields from FOO *and* all descendants of FOO.
+    [3] Run marc_export using various combinations of --library and --descendants;
+        verify that items from the expected libraries show up as 852 fields.
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Rogan Hamby <rogan.hamby at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+21	1	Open-ILS/src/support-scripts/marc_export.in
+16	0	docs/RELEASE_NOTES_NEXT/Administration/marc_export-descendants-option.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Administration/marc_export-descendants-option.adoc
+
+commit 75e65606a3151c6229b1197ab31d2cf0bd922b7c
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Thu May 18 22:55:42 2017 -0400
+
+    doc: fix location of a release note stub
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+6	0	docs/RELEASE_NOTES_NEXT/Circulation/hard_due_date_value_fixes.adoc
+0	6	docs/RELEASE_NOTES_NEXT/circulation/hard_due_date_value_fixes.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/hard_due_date_value_fixes.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/circulation/hard_due_date_value_fixes.adoc
+
+commit 04ba0cb4b666ecca4fa53c08ea42ed7a9e2b7771
+Author: Jason Boyer <jboyer at library.in.gov>
+Date:   Tue Feb 21 16:31:31 2017 -0500
+
+    LP1274999: Next Link Appears at "End" of Copy List
+    
+    The total number of copies wasn't checked against the
+    copy_limit and copy_offset, so anytime that the
+    number of copies per page mod copy_limit == 0 the
+    Next link would appear, even if there were only
+    copy_limit copies total. Now the offset and limit are
+    compared to the total number of copies available at
+    the current depth to determine if the Next link
+    should appear.
+    
+    Signed-off-by: Jason Boyer <jboyer at library.in.gov>
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+7	3	Open-ILS/src/templates/opac/parts/record/copy_table.tt2
+
+commit a11aca1282575bb13b9b904a1d8898c5109ac1dd
+Author: blake <blake at mobiusconsortium.org>
+Date:   Fri Jul 1 12:01:04 2016 -0500
+
+    LP1244354 Unnecessary user refresh after deletion can cause permission error
+    
+    obj.refresh_all() was being called no matter what. It needs to be called only when
+    there is an issue deleting the patron. On success, this patch will simply present an
+    informational message to the user.
+    
+    Signed-off-by: blake <blake at mobiusconsortium.org>
+    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
+
+1	0	Open-ILS/xul/staff_client/server/locale/en-US/patron.properties
+4	1	Open-ILS/xul/staff_client/server/patron/display.js
+
+commit bfa994b3f9d0f39d03852316ed2ee6d7269ae25a
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Sat May 6 14:16:57 2017 -0400
+
+    LP#1378829 Stamp Upgrade Script & Add Release Note
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+101	0	Open-ILS/src/sql/Pg/upgrade/1037.data.fix_long_overdue_perm.sql
+0	101	Open-ILS/src/sql/Pg/upgrade/XXXX.data.fix_long_overdue_perm.sql
+7	0	docs/RELEASE_NOTES_NEXT/Administration/fix_copy_status_long_overdue_override_permission_typo.adoc
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1037.data.fix_long_overdue_perm.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.fix_long_overdue_perm.sql
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Administration/fix_copy_status_long_overdue_override_permission_typo.adoc
+
+commit 33351bae24fd680d06aa0a4e9265de2ec74870af
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue May 2 23:02:17 2017 -0400
+
+    LP#1685840 Release notes for Google Books Preview rewrite
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+20	0	docs/RELEASE_NOTES_NEXT/OPAC/google_books_preview_no_dojo.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/google_books_preview_no_dojo.adoc
+
+commit 437bc8289464b8bf184e70fbee7fe21ce9c5b72c
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue May 2 00:37:17 2017 -0400
+
+    LP#1685840 Activate Google Preview "extras" bar on load
+    
+    Thanks to Ben Shum for pointing out that users might expect the Google Preview
+    extras bar near the bottom of the screen to trigger loading the preview as
+    well. Another event listener handles this accordingly.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+13	4	Open-ILS/web/js/ui/default/opac/ac_google_books.js
+
+commit 55aa6265712b38eb746aa69c5ea93702d1b6950c
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Mon Apr 24 12:18:12 2017 -0400
+
+    LP#1685840: Dojoless Google Books Preview as external script
+    
+    Rather than including the JavaScript inline in each page, load the
+    JavaScript as a regular external JavaScript file so that browsers
+    can take advantage of caching, reduce network bandwidth, and reduce the
+    amount of TT2 processing required. Every little bit helps.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+0	164	Open-ILS/src/templates/opac/parts/ac_google_books.tt2
+3	1	Open-ILS/src/templates/opac/parts/js.tt2
+162	0	Open-ILS/web/js/ui/default/opac/ac_google_books.js
+ delete mode 100644 Open-ILS/src/templates/opac/parts/ac_google_books.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/opac/ac_google_books.js
+
+commit e16178021742b7aa83b83152c874c62f769b006c
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Mon Apr 24 11:53:24 2017 -0400
+
+    LP#1685840: Dojoless Google Books Preview: remove TT2 dependency
+    
+    Rather than process the template with TT2 to specify the language in
+    which the Google Books Preview should be displayed, use the @lang
+    attribute on the <html> element--and fall back to 'en' if for some
+    reason that attribute has been removed from the template.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+4	1	Open-ILS/src/templates/opac/parts/ac_google_books.tt2
+
+commit b6e3ad033f98bf75a0d03021907103ed313ab475
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Mon Apr 24 11:29:37 2017 -0400
+
+    LP#1685840: Google Books Preview: responsive sizing
+    
+    Use the viewport's actual height and width to display the book preview,
+    rather than hard-coding 600px x 800px. On a very wide screen, the book
+    will be centred; on a small screen such as a mobile device, the book
+    will not scroll indiscriminately off to the side, but instead stays
+    within the bounds of the viewport.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+2	2	Open-ILS/src/templates/opac/parts/ac_google_books.tt2
+
+commit 07466251f2c0d60a5c6aaebb23c87d5cf26c7f02
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Mon Apr 17 18:42:11 2017 -0400
+
+    LP#1685840: Dojoless Google Books Preview does not need want_dojo
+    
+    Now that Dojo is no longer needed for Google Books Preview, we can load
+    the associated JavaScript without having to enable want_dojo.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+0	4	Open-ILS/src/templates/opac/parts/header.tt2
+1	1	Open-ILS/src/templates/opac/parts/js.tt2
+
+commit a968d72e91e40adfe42c28462f4c257c3d1688d5
+Author: Dan Scott <dan at coffeecode.net>
+Date:   Sun Apr 16 22:27:52 2017 -0400
+
+    LP#1685840: Dojoless Google Books Preview
+    
+    Avoid polluting the global namespace by wrapping the code in (function() {})().
+    
+    Add event listeners to the DOM elements rather than the crufty
+    href=javascript:function approach.
+    
+    Optimization: do not load the Google Books JSAPI unless there is a matching
+    embedded ISBN.
+    
+    Use display style directly, rather than munging class names with hide_me
+    
+    Supports IE 10/11, which does not handle responseType = 'json', through
+    the fallback to XHR responseText.
+    
+    IE9 for now; it seems the new Google Books Loader wipes out the DOM in
+    IE9 instead of loading nicely in the <head>. Could go back to the old
+    Google JS loader, which still works, but is deprecated, so could
+    disappear at any point.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+4	0	Open-ILS/src/templates/opac/css/style.css.tt2
+135	106	Open-ILS/src/templates/opac/parts/ac_google_books.tt2
+4	5	Open-ILS/src/templates/opac/parts/record/extras.tt2
+
+commit 825f4aaf8e407a42ddd30ce558303696aa7ecd47
+Author: Ben Shum <ben at evergreener.net>
+Date:   Tue May 2 21:51:13 2017 -0400
+
+    LP#1427392: Stamping upgrade script for hard due date value fix
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+31	0	Open-ILS/src/sql/Pg/upgrade/1036.function.config_update_hard_due_dates_ceiling_date_fix.sql
+0	29	Open-ILS/src/sql/Pg/upgrade/xxxx.function.config_update_hard_due_dates_ceiling_date_fix.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1036.function.config_update_hard_due_dates_ceiling_date_fix.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/xxxx.function.config_update_hard_due_dates_ceiling_date_fix.sql
+
+commit 1d80a0b790bfb573a5b78bd0ab6d98dc4e5dd5c4
+Author: Michele Morgan <mmorgan at noblenet.org>
+Date:   Tue May 2 09:17:55 2017 -0400
+
+    LP#1427392: Add release note for hard due date values fix
+    
+    Signed-off-by: Michele Morgan <mmorgan at noblenet.org>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+6	0	docs/RELEASE_NOTES_NEXT/circulation/hard_due_date_value_fixes.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/circulation/hard_due_date_value_fixes.adoc
+
+commit 8228c2165fab8d06a8585723952d470d5b096e19
+Author: Michele Morgan <mmorgan at noblenet.org>
+Date:   Wed Mar 15 16:31:06 2017 -0400
+
+    LP#1427392 - Allow deletion of Hard Due Date Values.
+    
+    Also, don't update hard due dates to ceiling dates that have passed.
+    
+    Fixes two related issues with hard due dates.
+    
+    - Exposes the selector in the Hard Due Date Values interface so past
+      entries that are no longer valid can be deleted via the client.
+    - Prevents the current ceiling date from being updated to a past date
+      based on an old hard due date value.
+    
+    Testing plan:
+    
+    To reproduce the issue:
+    
+    - Create a Hard Due Date with a Current Ceiling Date in the future
+    - Create an associated Hard Due Date Value with an active date earlier
+      than the current date and a ceiling date earlier than the current date.
+    - Run the hard due date updater
+    
+    Note that:
+    
+    - The Current Ceiling Date is updated to an earlier date based on
+      the Hard Due Date Value entry.
+    - It is not possible to select and delete the Hard Due Date Value
+      entry.
+    
+    Apply the patch and retest
+    
+    Note that:
+    
+    - The Current Ceiling Date has not been updated to the past date.
+    - Past Hard Due Date Values can now be selected and deleted.
+    
+    Signed-off-by: Michele Morgan <mmorgan at noblenet.org>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+2	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+29	0	Open-ILS/src/sql/Pg/upgrade/xxxx.function.config_update_hard_due_dates_ceiling_date_fix.sql
+1	1	Open-ILS/src/templates/conify/global/config/hard_due_date_values.tt2
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/xxxx.function.config_update_hard_due_dates_ceiling_date_fix.sql
+
+commit 8278aab39dbac66daa28c6fc181bbef01b9e435d
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Mon May 1 15:16:32 2017 -0400
+
+    LP#1230301: add release notes
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+5	0	docs/RELEASE_NOTES_NEXT/Reports/Link_User_and_Working_Location_Sources.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Reports/Link_User_and_Working_Location_Sources.adoc
+
+commit 1ce24362d08ecc595430f3784574ab7d940c47c8
+Author: Chris Sharp <csharp at georgialibraries.org>
+Date:   Tue Feb 9 19:12:11 2016 -0500
+
+    LP#1230301 - Add User/Working Location Map Link to the ILS User reports source.
+    
+    For certain reports it is desirable to display or filter on staff Working Location.
+    This adds a link to the permission.usr_work_ou_map table/source in fm_IDL.xml.
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+5	3	Open-ILS/examples/fm_IDL.xml
+
+commit 06b170f908764312b59414ffce340c955fa94dfc
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Mon May 1 15:04:56 2017 -0400
+
+    LP#1684984: stamp DB update
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+13	0	Open-ILS/src/sql/Pg/upgrade/1035.data.remove_ingest.disable_metabib_field_entry.sql
+0	13	Open-ILS/src/sql/Pg/upgrade/XXXX.data.remove_ingest.disable_metabib_field_entry.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1035.data.remove_ingest.disable_metabib_field_entry.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.remove_ingest.disable_metabib_field_entry.sql
+
+commit 86f73e85f182701f4839a6afc2999eab0e727a9a
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Sat Apr 22 08:28:34 2017 -0400
+
+    LP#1684984: Remove obsolete ingest.disable_metabib_field_entry flag.
+    
+    Add release note.
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+7	0	docs/RELEASE_NOTES_NEXT/Administration/obsolete_internal_flag_removed.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Administration/obsolete_internal_flag_removed.adoc
+
+commit 170acf44e558b659bb9c19e5be4a4b54e4eb66ca
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Fri Apr 21 20:42:49 2017 -0400
+
+    LP#1684984: Remove obsolete ingest.disable_metabib_field_entry flag.
+    
+    Per discussion in IRC, the ingest.disable_metabib_field_entry internal
+    flag was obsoleted by the addition of the ingest.skip_browse_indexing,
+    ingest.skip_search_indexing, and ingest.skip_facet_indexing
+    flags. Since ingest.disable_metabib_field_entry is not used anywhere
+    in the database, this branch removes it.
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+0	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+13	0	Open-ILS/src/sql/Pg/t/lp1684984-remove-ingest.disable_metabib_field_entry.pg
+13	0	Open-ILS/src/sql/Pg/upgrade/XXXX.data.remove_ingest.disable_metabib_field_entry.sql
+ create mode 100644 Open-ILS/src/sql/Pg/t/lp1684984-remove-ingest.disable_metabib_field_entry.pg
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.remove_ingest.disable_metabib_field_entry.sql
+
+commit 3c35e94bc037fa8ebb08b302d8e79f53b5ac004b
+Author: Josh Stompro <stomproj at larl.org>
+Date:   Sun Aug 28 21:23:01 2016 -0500
+
+    LP#1616220 Fixes for css errors that show up in the xul staff client console.
+    
+    To test
+    -------
+    [1] In the XUL client, try various interfaces including acquisitions,
+        the patron editor, the reporter, the library settings editor,
+        serials management and patron surveys. Using the error console,
+        verify that applying this patch slightly reduces the number of
+        CSS warnings reported.
+    [2] Repeat step 1 using the web staff client, in particular while
+        looking at the embedded acquisitions interfaces.
+    
+    Signed-off-by: Josh Stompro <stomproj at larl.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/templates/acq/lineitem/findbib.tt2
+1	1	Open-ILS/web/css/skin/default.css
+3	3	Open-ILS/web/css/skin/default/acq.css
+5	5	Open-ILS/web/css/skin/default/register.css
+1	1	Open-ILS/web/reports/oils_rpt.css
+2	6	Open-ILS/xul/staff_client/server/admin/org_unit_settings.xhtml
+4	4	Open-ILS/xul/staff_client/server/cat/copy_editor.xul
+1	1	Open-ILS/xul/staff_client/server/cat/copy_notes.xul
+2	2	Open-ILS/xul/staff_client/server/circ/alternate_copy_summary.xul
+2	2	Open-ILS/xul/staff_client/server/patron/hold_details.xul
+1	1	Open-ILS/xul/staff_client/server/patron/info_notes.xul
+1	1	Open-ILS/xul/staff_client/server/patron/info_stat_cats.xul
+1	1	Open-ILS/xul/staff_client/server/patron/info_surveys.xul
+1	1	Open-ILS/xul/staff_client/server/serial/notes.xul
+1	1	Open-ILS/xul/staff_client/server/serial/sitem_editor.xul
+4	4	Open-ILS/xul/staff_client/server/skin/global.css
+
+commit 99880cb01a283051b3cb2479578c5d886baadcb8
+Author: Jane Sandberg <sandbej at linnbenton.edu>
+Date:   Sun Apr 30 18:20:56 2017 -0700
+
+    Docs: fixing broken link
+    
+    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>
+
+1	1	docs/installation/server_upgrade.adoc
+
+commit b0ad408924fdc616be8c871d87bf9b7d3d96983b
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Wed Apr 5 17:25:49 2017 -0400
+
+    LP#1680142: Fix responsive design issue with ebook display
+    
+    Fixes the following responsive design issues:
+    * Removes the e-book dashboard display when the screen size is reduced.
+    * Changes the table display for e-items currently checked out, e-items on hold,
+    and e-iterms ready for checkout interfaces to mimic the responsive behavior of
+    other My Account screens.
+    * Fixes a couple of Holds History CSS problems discovered while I was here.
+    
+    Test Plan:
+    Enable ebook services. Log into your account and resize the screen to the size
+    of a mobile device. The ebook dashboard will display while the main account
+    dashboard disappears. Go into My Account, click Items checked out and then
+    click E-Items Currently Checked Out. The table has not reformatted itself for
+    responsive design view.
+    
+    Post-patch: When you log in and resize the screen, the e-items dashboard
+    display will disappear along with the main account dashboard. When you access
+    the E-Items Currently Checked Out interface, the table will reformat itself
+    with column headers along the left side.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    
+    Conflicts:
+    	Open-ILS/src/templates/opac/css/style.css.tt2
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+22	8	Open-ILS/src/templates/opac/css/style.css.tt2
+
+commit 4ce5d7954035a1ed1bf654adcc830ae1c41f50f1
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Apr 28 10:39:55 2017 -0400
+
+    LP#1691009: add release notes
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+14	0	docs/RELEASE_NOTES_NEXT/Administration/Merge_RTL_and_RTL_stylesheets.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Administration/Merge_RTL_and_RTL_stylesheets.adoc
+
+commit 7d4809e1e5c79e3034dc14d18b6124012ff3dfc9
+Author: Ben Shum <ben at evergreener.net>
+Date:   Thu Apr 27 11:43:55 2017 -0400
+
+    LP#1681009 Merge the RTL style with the LTR style (part2)
+    
+    Finishing up the rest of the file and removing the RTL specific one
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+0	46	Open-ILS/src/templates/opac/css/style-rtl.css.tt2
+225	24	Open-ILS/src/templates/opac/css/style.css.tt2
+0	1	Open-ILS/src/templates/opac/parts/base.tt2
+ delete mode 100644 Open-ILS/src/templates/opac/css/style-rtl.css.tt2
+
+commit 5957d7c5848514dc1f07f63997f5b65ef96d5eab
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Wed Apr 26 09:59:07 2017 -0400
+
+    LP#1621178: fix fleshing of copy status for available items
+    
+    Since copy status 0 means 'Available', test for null
+    explicitly.
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+2	1	Open-ILS/web/js/ui/default/staff/circ/services/holds.js
+
+commit 3945de1f0c08bfebdc5903f20aeb89ed44b60a62
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Fri Mar 3 07:33:37 2017 -0500
+
+    LP#1621178: Tweaks to item status column picker option
+    
+    This commit:
+    * Removes the copy status column from the Checkout page. The expectation is
+    that items will not appear in this grid unless they have a Checked out status.
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+0	1	Open-ILS/src/templates/staff/circ/patron/t_checkout.tt2
+
+commit d57d767456ae29ef8aabbbd9a5d440f6ae5f7220
+Author: Kyle Huckins <khuckins at catalystdevworks.com>
+Date:   Tue Oct 25 10:12:56 2016 -0700
+
+    LP#1621178 Copy Status Picker
+    
+    Add copy status field to patron items out, patron
+    checkout, patron hold, item holds pane, holds shelf, and item status grids.
+    
+    Signed-off-by: Kyle Huckins <khuckins at catalystdevworks.com>
+    Signed-off-by: Dawn Dale <ddale at georgialibraries.org>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    
+    Conflicts:
+    	Open-ILS/src/templates/staff/cat/item/t_list.tt2
+
+2	0	Open-ILS/src/templates/staff/cat/catalog/t_holds.tt2
+1	1	Open-ILS/src/templates/staff/cat/item/t_list.tt2
+2	0	Open-ILS/src/templates/staff/circ/holds/t_shelf_list.tt2
+1	0	Open-ILS/src/templates/staff/circ/patron/t_checkout.tt2
+2	0	Open-ILS/src/templates/staff/circ/patron/t_holds_list.tt2
+1	0	Open-ILS/src/templates/staff/circ/patron/t_items_out.tt2
+1	1	Open-ILS/web/js/ui/default/staff/circ/patron/items_out.js
+7	1	Open-ILS/web/js/ui/default/staff/circ/services/holds.js
+
+commit 8e763e316ffb2ff9d1db05f683b6c7aa447f66e6
+Author: Jason Stephenson <jason at sigio.com>
+Date:   Tue Apr 25 13:33:08 2017 -0400
+
+    LP#1545115: Stamping upgrade script for description field in matrix tables
+    
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+11	0	Open-ILS/src/sql/Pg/upgrade/1034.schema.policy_matrix_description_field.sql
+0	11	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.policy_matrix_description_field.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1034.schema.policy_matrix_description_field.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.policy_matrix_description_field.sql
+
+commit 539fb4d13f02b5176bf9ce75edf87500efbb563b
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Tue Apr 25 12:36:27 2017 -0400
+
+    LP#1545115: add release notes entry
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+
+5	0	docs/RELEASE_NOTES_NEXT/Administration/add_description_field_to_policy_matrices.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Administration/add_description_field_to_policy_matrices.adoc
+
+commit 53aacfabcc9a3cafe47acafb7096bd2e4944c97a
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Tue Apr 25 09:55:00 2017 -0400
+
+    LP#1545115: consolidate schema update scripts into one
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+
+11	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.policy_matrix_description_field.sql
+0	6	Open-ILS/src/sql/Pg/upgrade/xxxx.schema.add_description_circ_matrix.sql
+0	6	Open-ILS/src/sql/Pg/upgrade/xxxx.schema.add_description_hold_matrix.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.policy_matrix_description_field.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/xxxx.schema.add_description_circ_matrix.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/xxxx.schema.add_description_hold_matrix.sql
+
+commit 16b99833988e0fc833352fe0a7d02e27592cd373
+Author: Rogan Hamby <rogan.hamby at gmail.com>
+Date:   Mon Apr 25 12:59:12 2016 -0400
+
+    LP#1545115: add description field for policy matrix tables
+    
+    This patch adds description column for the
+    config.hold_matrix_matchpoint and circ_matrix_matchpoint tables
+    and pgTAP tests for them.
+    
+    Signed-off-by: Rogan Hamby <rogan.hamby at gmail.com>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Jason Stephenson <jason at sigio.com>
+
+2	0	Open-ILS/examples/fm_IDL.xml
+2	1	Open-ILS/src/sql/Pg/100.circ_matrix.sql
+2	1	Open-ILS/src/sql/Pg/110.hold_matrix.sql
+17	0	Open-ILS/src/sql/Pg/t/lp1545115-circ-and-hold-matrix-get-notes.pg
+6	0	Open-ILS/src/sql/Pg/upgrade/xxxx.schema.add_description_circ_matrix.sql
+6	0	Open-ILS/src/sql/Pg/upgrade/xxxx.schema.add_description_hold_matrix.sql
+1	1	Open-ILS/src/templates/conify/global/config/circ_matrix_matchpoint.tt2
+1	1	Open-ILS/src/templates/conify/global/config/hold_matrix_matchpoint.tt2
+ create mode 100644 Open-ILS/src/sql/Pg/t/lp1545115-circ-and-hold-matrix-get-notes.pg
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/xxxx.schema.add_description_circ_matrix.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/xxxx.schema.add_description_hold_matrix.sql
+
+commit 2ed1a8b95354a399f6a5574bb839d0b3f5065627
+Author: Remington Steed <rjs7 at calvin.edu>
+Date:   Fri Apr 7 14:15:54 2017 -0400
+
+    Change all docs filenames to .adoc
+    
+    This commit renames all AsciiDoc files to have the ".adoc" extension.
+    Also, this commit updates all "include::" references in the root.adoc
+    file.
+    
+    RATIONALE: Some editing tools, including GitHub, will auto-generate an
+    HTML preview for AsciiDoc files if they have the filename extension
+    ".adoc" or ".asciidoc". The community agreed to this change in 2015 (see
+    http://markmail.org/thread/z2s7xnxavpjzirwx).
+    
+    NOTE: The docs build script will need to change the reference from
+    "root.txt" to "root.adoc".
+    
+    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
+
+47	0	docs/QueryParser_Changes.adoc
+0	47	docs/QueryParser_Changes.txt
+611	0	docs/RELEASE_NOTES_2_2.adoc
+0	611	docs/RELEASE_NOTES_2_2.txt
+72	0	docs/RELEASE_NOTES_2_2_1.adoc
+0	72	docs/RELEASE_NOTES_2_2_1.txt
+597	0	docs/RELEASE_NOTES_2_3.adoc
+0	597	docs/RELEASE_NOTES_2_3.txt
+557	0	docs/RELEASE_NOTES_2_4.adoc
+0	557	docs/RELEASE_NOTES_2_4.txt
+1126	0	docs/RELEASE_NOTES_2_5.adoc
+0	1126	docs/RELEASE_NOTES_2_5.txt
+603	0	docs/RELEASE_NOTES_2_6.adoc
+0	603	docs/RELEASE_NOTES_2_6.txt
+508	0	docs/RELEASE_NOTES_2_7.adoc
+0	508	docs/RELEASE_NOTES_2_7.txt
+872	0	docs/RELEASE_NOTES_2_8.adoc
+0	872	docs/RELEASE_NOTES_2_8.txt
+1130	0	docs/RELEASE_NOTES_2_9.adoc
+0	1130	docs/RELEASE_NOTES_2_9.txt
+46	0	docs/TechRef/Circ/calculated-proximity-adjustments.adoc
+0	46	docs/TechRef/Circ/calculated-proximity-adjustments.txt
+247	0	docs/TechRef/Circ/custom-best-hold-selection.adoc
+0	247	docs/TechRef/Circ/custom-best-hold-selection.txt
+93	0	docs/TechRef/Circ/holds-go-home.adoc
+0	93	docs/TechRef/Circ/holds-go-home.txt
+124	0	docs/TechRef/Flattener/design.adoc
+0	124	docs/TechRef/Flattener/design.txt
+138	0	docs/TechRef/KidsOPAC.adoc
+0	138	docs/TechRef/KidsOPAC.txt
+113	0	docs/TechRef/LinkChecker.adoc
+0	113	docs/TechRef/LinkChecker.txt
+657	0	docs/TechRef/Telephony/telephony-setup-guide.adoc
+0	657	docs/TechRef/Telephony/telephony-setup-guide.txt
+67	0	docs/TechRef/alternate_graphic_fields.adoc
+0	67	docs/TechRef/alternate_graphic_fields.txt
+78	0	docs/TechRef/notify_csv.adoc
+0	78	docs/TechRef/notify_csv.txt
+101	0	docs/TechRef/popularity-rating.adoc
+0	101	docs/TechRef/popularity-rating.txt
+25	0	docs/acquisitions/introduction.adoc
+0	25	docs/acquisitions/introduction.txt
+268	0	docs/acquisitions/invoices.adoc
+0	268	docs/acquisitions/invoices.txt
+53	0	docs/acquisitions/purchase_requests_management.adoc
+0	53	docs/acquisitions/purchase_requests_management.txt
+29	0	docs/acquisitions/purchase_requests_patron_view.adoc
+0	29	docs/acquisitions/purchase_requests_patron_view.txt
+73	0	docs/acquisitions/receive_items_from_invoice.adoc
+0	73	docs/acquisitions/receive_items_from_invoice.txt
+292	0	docs/acquisitions/selection_lists_po.adoc
+0	292	docs/acquisitions/selection_lists_po.txt
+216	0	docs/acquisitions/vandelay_acquisitions_integration.adoc
+0	216	docs/acquisitions/vandelay_acquisitions_integration.txt
+60	0	docs/admin/Best_Hold_Selection_Sort_Order.adoc
+0	60	docs/admin/Best_Hold_Selection_Sort_Order.txt
+57	0	docs/admin/MARC_Import_Remove_Fields.adoc
+0	57	docs/admin/MARC_Import_Remove_Fields.txt
+199	0	docs/admin/MARC_RAD_MVF_CRA.adoc
+0	199	docs/admin/MARC_RAD_MVF_CRA.txt
+44	0	docs/admin/Org_Unit_Proximity_Adjustments.adoc
+0	44	docs/admin/Org_Unit_Proximity_Adjustments.txt
+127	0	docs/admin/SMS_messaging.adoc
+0	127	docs/admin/SMS_messaging.txt
+1014	0	docs/admin/acquisitions_admin.adoc
+0	1014	docs/admin/acquisitions_admin.txt
+252	0	docs/admin/actiontriggers.adoc
+0	252	docs/admin/actiontriggers.txt
+23	0	docs/admin/age_hold_protection.adoc
+0	23	docs/admin/age_hold_protection.txt
+141	0	docs/admin/apache_access_handler.adoc
+0	141	docs/admin/apache_access_handler.txt
+148	0	docs/admin/apache_rewrite_tricks.adoc
+0	148	docs/admin/apache_rewrite_tricks.txt
+55	0	docs/admin/authentication_proxy.adoc
+0	55	docs/admin/authentication_proxy.txt
+151	0	docs/admin/authorities.adoc
+0	151	docs/admin/authorities.txt
+32	0	docs/admin/auto_suggest_search.adoc
+0	32	docs/admin/auto_suggest_search.txt
+199	0	docs/admin/booking-admin.adoc
+0	199	docs/admin/booking-admin.txt
+47	0	docs/admin/circulation_limit_groups.adoc
+0	47	docs/admin/circulation_limit_groups.txt
+46	0	docs/admin/cn_prefixes_and_suffixes.adoc
+0	46	docs/admin/cn_prefixes_and_suffixes.txt
+87	0	docs/admin/copy_statuses.adoc
+0	87	docs/admin/copy_statuses.txt
+60	0	docs/admin/customize_staff_client.adoc
+0	60	docs/admin/customize_staff_client.txt
+120	0	docs/admin/floating_groups.adoc
+0	120	docs/admin/floating_groups.txt
+53	0	docs/admin/hold_driven_recalls.adoc
+0	53	docs/admin/hold_driven_recalls.txt
+138	0	docs/admin/lsa-address_alert.adoc
+0	138	docs/admin/lsa-address_alert.txt
+254	0	docs/admin/lsa-barcode_completion.adoc
+0	254	docs/admin/lsa-barcode_completion.txt
+25	0	docs/admin/lsa-standing_penalties.adoc
+0	25	docs/admin/lsa-standing_penalties.txt
+79	0	docs/admin/lsa-statcat.adoc
+0	79	docs/admin/lsa-statcat.txt
+25	0	docs/admin/lsa-work_log.adoc
+0	25	docs/admin/lsa-work_log.txt
+169	0	docs/admin/patron_address_by_zip_code.adoc
+0	169	docs/admin/patron_address_by_zip_code.txt
+88	0	docs/admin/permissions.adoc
+0	88	docs/admin/permissions.txt
+192	0	docs/admin/phonelist.adoc
+0	192	docs/admin/phonelist.txt
+49	0	docs/admin/recent_staff_searches.adoc
+0	49	docs/admin/recent_staff_searches.txt
+71	0	docs/admin/restrict_Z39.50_sources_by_perm_group.adoc
+0	71	docs/admin/restrict_Z39.50_sources_by_perm_group.txt
+671	0	docs/admin/sip_server.adoc
+0	671	docs/admin/sip_server.txt
+36	0	docs/admin/staff_client-button_bar_toolbar.adoc
+0	36	docs/admin/staff_client-button_bar_toolbar.txt
+28	0	docs/admin/staff_client-column_picker.adoc
+0	28	docs/admin/staff_client-column_picker.txt
+23	0	docs/admin/staff_client-double_clicking.adoc
+0	23	docs/admin/staff_client-double_clicking.txt
+178	0	docs/admin/staff_client-login.adoc
+0	178	docs/admin/staff_client-login.txt
+22	0	docs/admin/staff_client-patron_border.adoc
+0	22	docs/admin/staff_client-patron_border.txt
+42	0	docs/admin/staff_client-recent_searches.adoc
+0	42	docs/admin/staff_client-recent_searches.txt
+6	0	docs/admin/staff_client-return_to_results_from_marc.adoc
+0	6	docs/admin/staff_client-return_to_results_from_marc.txt
+59	0	docs/admin/staff_client-sorting_columns.adoc
+0	59	docs/admin/staff_client-sorting_columns.txt
+17	0	docs/admin/staff_client-sticky_settings.adoc
+0	17	docs/admin/staff_client-sticky_settings.txt
+6	0	docs/admin/staff_client-tab_buttons.adoc
+0	6	docs/admin/staff_client-tab_buttons.txt
+294	0	docs/admin/template_toolkit.adoc
+0	294	docs/admin/template_toolkit.txt
+32	0	docs/admin/user_activity_type.adoc
+0	32	docs/admin/user_activity_type.txt
+23	0	docs/admin/web_client-browser-tab-shortcuts.adoc
+0	23	docs/admin/web_client-browser-tab-shortcuts.txt
+53	0	docs/admin/web_client-login.adoc
+0	53	docs/admin/web_client-login.txt
+135	0	docs/admin/workstation_admin.adoc
+0	135	docs/admin/workstation_admin.txt
+60	0	docs/admin/workstation_admin_customizable_toolbar.adoc
+0	60	docs/admin/workstation_admin_customizable_toolbar.txt
+628	0	docs/admin/workstation_admin_receipt_template_editor.adoc
+0	628	docs/admin/workstation_admin_receipt_template_editor.txt
+251	0	docs/admin_initial_setup/borrowing_items.adoc
+0	251	docs/admin_initial_setup/borrowing_items.txt
+142	0	docs/admin_initial_setup/describing_your_organization.adoc
+0	142	docs/admin_initial_setup/describing_your_organization.txt
+379	0	docs/admin_initial_setup/describing_your_people.adoc
+0	379	docs/admin_initial_setup/describing_your_people.txt
+866	0	docs/admin_initial_setup/designing_your_catalog.adoc
+0	866	docs/admin_initial_setup/designing_your_catalog.txt
+31	0	docs/admin_initial_setup/hard_due_dates.adoc
+0	31	docs/admin_initial_setup/hard_due_dates.txt
+195	0	docs/admin_initial_setup/importing_via_staff_client.adoc
+0	195	docs/admin_initial_setup/importing_via_staff_client.txt
+228	0	docs/admin_initial_setup/migrating_patron_data.adoc
+0	228	docs/admin_initial_setup/migrating_patron_data.txt
+350	0	docs/admin_initial_setup/migrating_your_data.adoc
+0	350	docs/admin_initial_setup/migrating_your_data.txt
+239	0	docs/admin_initial_setup/ordering_materials.adoc
+0	239	docs/admin_initial_setup/ordering_materials.txt
+51	0	docs/attributions.adoc
+0	51	docs/attributions.txt
+94	0	docs/cataloging/MARC_Editor.adoc
+0	94	docs/cataloging/MARC_Editor.txt
+48	0	docs/cataloging/MARC_batch_edit.adoc
+0	48	docs/cataloging/MARC_batch_edit.txt
+134	0	docs/cataloging/authorities.adoc
+0	134	docs/cataloging/authorities.txt
+405	0	docs/cataloging/batch_importing_MARC.adoc
+0	405	docs/cataloging/batch_importing_MARC.txt
+158	0	docs/cataloging/cataloging_electronic_resources.adoc
+0	158	docs/cataloging/cataloging_electronic_resources.txt
+29	0	docs/cataloging/cataloging_web_client.adoc
+0	29	docs/cataloging/cataloging_web_client.txt
+95	0	docs/cataloging/conjoined_items.adoc
+0	95	docs/cataloging/conjoined_items.txt
+298	0	docs/cataloging/copy-buckets_web_client.adoc
+0	298	docs/cataloging/copy-buckets_web_client.txt
+84	0	docs/cataloging/link_checker.adoc
+0	84	docs/cataloging/link_checker.txt
+76	0	docs/cataloging/monograph_parts.adoc
+0	76	docs/cataloging/monograph_parts.txt
+55	0	docs/cataloging/overlay_record_3950_import.adoc
+0	55	docs/cataloging/overlay_record_3950_import.txt
+86	0	docs/cataloging/physical_char_wizard.adoc
+0	86	docs/cataloging/physical_char_wizard.txt
+17	0	docs/cataloging/tpac_copy_edit_links.adoc
+0	17	docs/cataloging/tpac_copy_edit_links.txt
+102	0	docs/cataloging/z39.50_search_enhancements.adoc
+0	102	docs/cataloging/z39.50_search_enhancements.txt
+138	0	docs/circ_limits.adoc
+0	138	docs/circ_limits.txt
+272	0	docs/circulation/booking.adoc
+0	272	docs/circulation/booking.txt
+563	0	docs/circulation/circulating_items.adoc
+0	563	docs/circulation/circulating_items.txt
+397	0	docs/circulation/circulating_items_web_client.adoc
+0	397	docs/circulation/circulating_items_web_client.txt
+1073	0	docs/circulation/circulation_patron_records.adoc
+0	1073	docs/circulation/circulation_patron_records.txt
+494	0	docs/circulation/circulation_patron_records_web_client.adoc
+0	494	docs/circulation/circulation_patron_records_web_client.txt
+492	0	docs/circulation/holds.adoc
+0	492	docs/circulation/holds.txt
+265	0	docs/circulation/offline_mode.adoc
+0	265	docs/circulation/offline_mode.txt
+73	0	docs/circulation/rfid_product_integration.adoc
+0	73	docs/circulation/rfid_product_integration.txt
+137	0	docs/circulation/self_check.adoc
+0	137	docs/circulation/self_check.txt
+72	0	docs/circulation/triggered_events.adoc
+0	72	docs/circulation/triggered_events.txt
+246	0	docs/development/data_supercat.adoc
+0	246	docs/development/data_supercat.txt
+67	0	docs/development/data_unapi.adoc
+0	67	docs/development/data_unapi.txt
+1359	0	docs/development/intro_opensrf.adoc
+0	1359	docs/development/intro_opensrf.txt
+39	0	docs/development/pgtap.adoc
+0	39	docs/development/pgtap.txt
+179	0	docs/development/support_scripts.adoc
+0	179	docs/development/support_scripts.txt
+54	0	docs/development/updating_translations_launchpad.adoc
+0	54	docs/development/updating_translations_launchpad.txt
+212	0	docs/installation/edi_setup.adoc
+0	212	docs/installation/edi_setup.txt
+681	0	docs/installation/server_installation.adoc
+0	681	docs/installation/server_installation.txt
+355	0	docs/installation/server_upgrade.adoc
+0	355	docs/installation/server_upgrade.txt
+161	0	docs/installation/staff_client_installation.adoc
+0	161	docs/installation/staff_client_installation.txt
+38	0	docs/installation/system_requirements.adoc
+0	38	docs/installation/system_requirements.txt
+12	0	docs/licensing.adoc
+0	12	docs/licensing.txt
+98	0	docs/opac/advanced_features.adoc
+0	98	docs/opac/advanced_features.txt
+31	0	docs/opac/catalog_browse.adoc
+0	31	docs/opac/catalog_browse.txt
+197	0	docs/opac/kids_opac.adoc
+0	197	docs/opac/kids_opac.txt
+44	0	docs/opac/linked_libraries.adoc
+0	44	docs/opac/linked_libraries.txt
+78	0	docs/opac/my_lists.adoc
+0	78	docs/opac/my_lists.txt
+106	0	docs/opac/new_skin_customizations.adoc
+0	106	docs/opac/new_skin_customizations.txt
+32	0	docs/opac/opensearch.adoc
+0	32	docs/opac/opensearch.txt
+95	0	docs/opac/search_form.adoc
+0	95	docs/opac/search_form.txt
+68	0	docs/opac/tpac_meta_record_holds.adoc
+0	68	docs/opac/tpac_meta_record_holds.txt
+655	0	docs/opac/using_the_public_access_catalog.adoc
+0	655	docs/opac/using_the_public_access_catalog.txt
+263	0	docs/reports/reporter_add_data_source.adoc
+0	263	docs/reports/reporter_add_data_source.txt
+42	0	docs/reports/reporter_cloning_shared_templates.adoc
+0	42	docs/reports/reporter_cloning_shared_templates.txt
+291	0	docs/reports/reporter_create_templates.adoc
+0	291	docs/reports/reporter_create_templates.txt
+64	0	docs/reports/reporter_daemon.adoc
+0	64	docs/reports/reporter_daemon.txt
+56	0	docs/reports/reporter_export_usingpgAdmin.adoc
+0	56	docs/reports/reporter_export_usingpgAdmin.txt
+76	0	docs/reports/reporter_folder.adoc
+0	76	docs/reports/reporter_folder.txt
+109	0	docs/reports/reporter_generating_reports.adoc
+0	109	docs/reports/reporter_generating_reports.txt
+42	0	docs/reports/reporter_running_recurring_reports.adoc
+0	42	docs/reports/reporter_running_recurring_reports.txt
+32	0	docs/reports/reporter_template_enhancements.adoc
+0	32	docs/reports/reporter_template_enhancements.txt
+106	0	docs/reports/reporter_template_terminology.adoc
+0	106	docs/reports/reporter_template_terminology.txt
+41	0	docs/reports/reporter_view_output.adoc
+0	41	docs/reports/reporter_view_output.txt
+529	0	docs/root.adoc
+0	529	docs/root.txt
+37	0	docs/serials/A-intro.adoc
+0	37	docs/serials/A-intro.txt
+41	0	docs/serials/B-copy_template.adoc
+0	41	docs/serials/B-copy_template.txt
+218	0	docs/serials/C-subscription-SCV.adoc
+0	218	docs/serials/C-subscription-SCV.txt
+216	0	docs/serials/D-subscription-ASCV.adoc
+0	216	docs/serials/D-subscription-ASCV.txt
+19	0	docs/serials/E-edit_subscriptions.adoc
+0	19	docs/serials/E-edit_subscriptions.txt
+102	0	docs/serials/F-Receiving.adoc
+0	102	docs/serials/F-Receiving.txt
+9	0	docs/serials/G-Special_issue.adoc
+0	9	docs/serials/G-Special_issue.txt
+51	0	docs/serials/Group_Serials_Issues_in_the_OPAC_2.2.adoc
+0	51	docs/serials/Group_Serials_Issues_in_the_OPAC_2.2.txt
+35	0	docs/serials/H-holdings_statements.adoc
+0	35	docs/serials/H-holdings_statements.txt
+ create mode 100644 docs/QueryParser_Changes.adoc
+ delete mode 100644 docs/QueryParser_Changes.txt
+ create mode 100644 docs/RELEASE_NOTES_2_2.adoc
+ delete mode 100644 docs/RELEASE_NOTES_2_2.txt
+ create mode 100644 docs/RELEASE_NOTES_2_2_1.adoc
+ delete mode 100644 docs/RELEASE_NOTES_2_2_1.txt
+ create mode 100644 docs/RELEASE_NOTES_2_3.adoc
+ delete mode 100644 docs/RELEASE_NOTES_2_3.txt
+ create mode 100644 docs/RELEASE_NOTES_2_4.adoc
+ delete mode 100644 docs/RELEASE_NOTES_2_4.txt
+ create mode 100644 docs/RELEASE_NOTES_2_5.adoc
+ delete mode 100644 docs/RELEASE_NOTES_2_5.txt
+ create mode 100644 docs/RELEASE_NOTES_2_6.adoc
+ delete mode 100644 docs/RELEASE_NOTES_2_6.txt
+ create mode 100644 docs/RELEASE_NOTES_2_7.adoc
+ delete mode 100644 docs/RELEASE_NOTES_2_7.txt
+ create mode 100644 docs/RELEASE_NOTES_2_8.adoc
+ delete mode 100644 docs/RELEASE_NOTES_2_8.txt
+ create mode 100644 docs/RELEASE_NOTES_2_9.adoc
+ delete mode 100644 docs/RELEASE_NOTES_2_9.txt
+ create mode 100644 docs/TechRef/Circ/calculated-proximity-adjustments.adoc
+ delete mode 100644 docs/TechRef/Circ/calculated-proximity-adjustments.txt
+ create mode 100644 docs/TechRef/Circ/custom-best-hold-selection.adoc
+ delete mode 100644 docs/TechRef/Circ/custom-best-hold-selection.txt
+ create mode 100644 docs/TechRef/Circ/holds-go-home.adoc
+ delete mode 100644 docs/TechRef/Circ/holds-go-home.txt
+ create mode 100644 docs/TechRef/Flattener/design.adoc
+ delete mode 100644 docs/TechRef/Flattener/design.txt
+ create mode 100644 docs/TechRef/KidsOPAC.adoc
+ delete mode 100644 docs/TechRef/KidsOPAC.txt
+ create mode 100644 docs/TechRef/LinkChecker.adoc
+ delete mode 100644 docs/TechRef/LinkChecker.txt
+ create mode 100644 docs/TechRef/Telephony/telephony-setup-guide.adoc
+ delete mode 100644 docs/TechRef/Telephony/telephony-setup-guide.txt
+ create mode 100644 docs/TechRef/alternate_graphic_fields.adoc
+ delete mode 100644 docs/TechRef/alternate_graphic_fields.txt
+ create mode 100644 docs/TechRef/notify_csv.adoc
+ delete mode 100644 docs/TechRef/notify_csv.txt
+ create mode 100644 docs/TechRef/popularity-rating.adoc
+ delete mode 100644 docs/TechRef/popularity-rating.txt
+ create mode 100644 docs/acquisitions/introduction.adoc
+ delete mode 100644 docs/acquisitions/introduction.txt
+ create mode 100644 docs/acquisitions/invoices.adoc
+ delete mode 100644 docs/acquisitions/invoices.txt
+ create mode 100644 docs/acquisitions/purchase_requests_management.adoc
+ delete mode 100644 docs/acquisitions/purchase_requests_management.txt
+ create mode 100644 docs/acquisitions/purchase_requests_patron_view.adoc
+ delete mode 100644 docs/acquisitions/purchase_requests_patron_view.txt
+ create mode 100644 docs/acquisitions/receive_items_from_invoice.adoc
+ delete mode 100644 docs/acquisitions/receive_items_from_invoice.txt
+ create mode 100644 docs/acquisitions/selection_lists_po.adoc
+ delete mode 100644 docs/acquisitions/selection_lists_po.txt
+ create mode 100644 docs/acquisitions/vandelay_acquisitions_integration.adoc
+ delete mode 100644 docs/acquisitions/vandelay_acquisitions_integration.txt
+ create mode 100644 docs/admin/Best_Hold_Selection_Sort_Order.adoc
+ delete mode 100644 docs/admin/Best_Hold_Selection_Sort_Order.txt
+ create mode 100644 docs/admin/MARC_Import_Remove_Fields.adoc
+ delete mode 100644 docs/admin/MARC_Import_Remove_Fields.txt
+ create mode 100644 docs/admin/MARC_RAD_MVF_CRA.adoc
+ delete mode 100644 docs/admin/MARC_RAD_MVF_CRA.txt
+ create mode 100644 docs/admin/Org_Unit_Proximity_Adjustments.adoc
+ delete mode 100644 docs/admin/Org_Unit_Proximity_Adjustments.txt
+ create mode 100644 docs/admin/SMS_messaging.adoc
+ delete mode 100644 docs/admin/SMS_messaging.txt
+ create mode 100644 docs/admin/acquisitions_admin.adoc
+ delete mode 100644 docs/admin/acquisitions_admin.txt
+ create mode 100644 docs/admin/actiontriggers.adoc
+ delete mode 100644 docs/admin/actiontriggers.txt
+ create mode 100644 docs/admin/age_hold_protection.adoc
+ delete mode 100644 docs/admin/age_hold_protection.txt
+ create mode 100644 docs/admin/apache_access_handler.adoc
+ delete mode 100644 docs/admin/apache_access_handler.txt
+ create mode 100644 docs/admin/apache_rewrite_tricks.adoc
+ delete mode 100644 docs/admin/apache_rewrite_tricks.txt
+ create mode 100644 docs/admin/authentication_proxy.adoc
+ delete mode 100644 docs/admin/authentication_proxy.txt
+ create mode 100644 docs/admin/authorities.adoc
+ delete mode 100644 docs/admin/authorities.txt
+ create mode 100644 docs/admin/auto_suggest_search.adoc
+ delete mode 100644 docs/admin/auto_suggest_search.txt
+ create mode 100644 docs/admin/booking-admin.adoc
+ delete mode 100644 docs/admin/booking-admin.txt
+ create mode 100644 docs/admin/circulation_limit_groups.adoc
+ delete mode 100644 docs/admin/circulation_limit_groups.txt
+ create mode 100644 docs/admin/cn_prefixes_and_suffixes.adoc
+ delete mode 100644 docs/admin/cn_prefixes_and_suffixes.txt
+ create mode 100644 docs/admin/copy_statuses.adoc
+ delete mode 100644 docs/admin/copy_statuses.txt
+ create mode 100644 docs/admin/customize_staff_client.adoc
+ delete mode 100644 docs/admin/customize_staff_client.txt
+ create mode 100644 docs/admin/floating_groups.adoc
+ delete mode 100644 docs/admin/floating_groups.txt
+ create mode 100644 docs/admin/hold_driven_recalls.adoc
+ delete mode 100644 docs/admin/hold_driven_recalls.txt
+ create mode 100644 docs/admin/lsa-address_alert.adoc
+ delete mode 100644 docs/admin/lsa-address_alert.txt
+ create mode 100644 docs/admin/lsa-barcode_completion.adoc
+ delete mode 100644 docs/admin/lsa-barcode_completion.txt
+ create mode 100644 docs/admin/lsa-standing_penalties.adoc
+ delete mode 100644 docs/admin/lsa-standing_penalties.txt
+ create mode 100644 docs/admin/lsa-statcat.adoc
+ delete mode 100644 docs/admin/lsa-statcat.txt
+ create mode 100644 docs/admin/lsa-work_log.adoc
+ delete mode 100644 docs/admin/lsa-work_log.txt
+ create mode 100644 docs/admin/patron_address_by_zip_code.adoc
+ delete mode 100644 docs/admin/patron_address_by_zip_code.txt
+ create mode 100644 docs/admin/permissions.adoc
+ delete mode 100644 docs/admin/permissions.txt
+ create mode 100644 docs/admin/phonelist.adoc
+ delete mode 100644 docs/admin/phonelist.txt
+ create mode 100644 docs/admin/recent_staff_searches.adoc
+ delete mode 100644 docs/admin/recent_staff_searches.txt
+ create mode 100644 docs/admin/restrict_Z39.50_sources_by_perm_group.adoc
+ delete mode 100644 docs/admin/restrict_Z39.50_sources_by_perm_group.txt
+ create mode 100644 docs/admin/sip_server.adoc
+ delete mode 100644 docs/admin/sip_server.txt
+ create mode 100644 docs/admin/staff_client-button_bar_toolbar.adoc
+ delete mode 100644 docs/admin/staff_client-button_bar_toolbar.txt
+ create mode 100644 docs/admin/staff_client-column_picker.adoc
+ delete mode 100644 docs/admin/staff_client-column_picker.txt
+ create mode 100644 docs/admin/staff_client-double_clicking.adoc
+ delete mode 100644 docs/admin/staff_client-double_clicking.txt
+ create mode 100644 docs/admin/staff_client-login.adoc
+ delete mode 100644 docs/admin/staff_client-login.txt
+ create mode 100644 docs/admin/staff_client-patron_border.adoc
+ delete mode 100644 docs/admin/staff_client-patron_border.txt
+ create mode 100644 docs/admin/staff_client-recent_searches.adoc
+ delete mode 100644 docs/admin/staff_client-recent_searches.txt
+ create mode 100644 docs/admin/staff_client-return_to_results_from_marc.adoc
+ delete mode 100644 docs/admin/staff_client-return_to_results_from_marc.txt
+ create mode 100644 docs/admin/staff_client-sorting_columns.adoc
+ delete mode 100644 docs/admin/staff_client-sorting_columns.txt
+ create mode 100644 docs/admin/staff_client-sticky_settings.adoc
+ delete mode 100644 docs/admin/staff_client-sticky_settings.txt
+ create mode 100644 docs/admin/staff_client-tab_buttons.adoc
+ delete mode 100644 docs/admin/staff_client-tab_buttons.txt
+ create mode 100644 docs/admin/template_toolkit.adoc
+ delete mode 100644 docs/admin/template_toolkit.txt
+ create mode 100644 docs/admin/user_activity_type.adoc
+ delete mode 100644 docs/admin/user_activity_type.txt
+ create mode 100644 docs/admin/web_client-browser-tab-shortcuts.adoc
+ delete mode 100644 docs/admin/web_client-browser-tab-shortcuts.txt
+ create mode 100644 docs/admin/web_client-login.adoc
+ delete mode 100644 docs/admin/web_client-login.txt
+ create mode 100644 docs/admin/workstation_admin.adoc
+ delete mode 100644 docs/admin/workstation_admin.txt
+ create mode 100644 docs/admin/workstation_admin_customizable_toolbar.adoc
+ delete mode 100644 docs/admin/workstation_admin_customizable_toolbar.txt
+ create mode 100644 docs/admin/workstation_admin_receipt_template_editor.adoc
+ delete mode 100644 docs/admin/workstation_admin_receipt_template_editor.txt
+ create mode 100644 docs/admin_initial_setup/borrowing_items.adoc
+ delete mode 100644 docs/admin_initial_setup/borrowing_items.txt
+ create mode 100644 docs/admin_initial_setup/describing_your_organization.adoc
+ delete mode 100644 docs/admin_initial_setup/describing_your_organization.txt
+ create mode 100644 docs/admin_initial_setup/describing_your_people.adoc
+ delete mode 100644 docs/admin_initial_setup/describing_your_people.txt
+ create mode 100644 docs/admin_initial_setup/designing_your_catalog.adoc
+ delete mode 100644 docs/admin_initial_setup/designing_your_catalog.txt
+ create mode 100644 docs/admin_initial_setup/hard_due_dates.adoc
+ delete mode 100644 docs/admin_initial_setup/hard_due_dates.txt
+ create mode 100644 docs/admin_initial_setup/importing_via_staff_client.adoc
+ delete mode 100644 docs/admin_initial_setup/importing_via_staff_client.txt
+ create mode 100644 docs/admin_initial_setup/migrating_patron_data.adoc
+ delete mode 100644 docs/admin_initial_setup/migrating_patron_data.txt
+ create mode 100644 docs/admin_initial_setup/migrating_your_data.adoc
+ delete mode 100644 docs/admin_initial_setup/migrating_your_data.txt
+ create mode 100644 docs/admin_initial_setup/ordering_materials.adoc
+ delete mode 100644 docs/admin_initial_setup/ordering_materials.txt
+ create mode 100644 docs/attributions.adoc
+ delete mode 100644 docs/attributions.txt
+ create mode 100644 docs/cataloging/MARC_Editor.adoc
+ delete mode 100644 docs/cataloging/MARC_Editor.txt
+ create mode 100644 docs/cataloging/MARC_batch_edit.adoc
+ delete mode 100644 docs/cataloging/MARC_batch_edit.txt
+ create mode 100644 docs/cataloging/authorities.adoc
+ delete mode 100644 docs/cataloging/authorities.txt
+ create mode 100644 docs/cataloging/batch_importing_MARC.adoc
+ delete mode 100644 docs/cataloging/batch_importing_MARC.txt
+ create mode 100644 docs/cataloging/cataloging_electronic_resources.adoc
+ delete mode 100644 docs/cataloging/cataloging_electronic_resources.txt
+ create mode 100644 docs/cataloging/cataloging_web_client.adoc
+ delete mode 100644 docs/cataloging/cataloging_web_client.txt
+ create mode 100644 docs/cataloging/conjoined_items.adoc
+ delete mode 100644 docs/cataloging/conjoined_items.txt
+ create mode 100755 docs/cataloging/copy-buckets_web_client.adoc
+ delete mode 100755 docs/cataloging/copy-buckets_web_client.txt
+ create mode 100644 docs/cataloging/link_checker.adoc
+ delete mode 100644 docs/cataloging/link_checker.txt
+ create mode 100644 docs/cataloging/monograph_parts.adoc
+ delete mode 100644 docs/cataloging/monograph_parts.txt
+ create mode 100644 docs/cataloging/overlay_record_3950_import.adoc
+ delete mode 100644 docs/cataloging/overlay_record_3950_import.txt
+ create mode 100644 docs/cataloging/physical_char_wizard.adoc
+ delete mode 100644 docs/cataloging/physical_char_wizard.txt
+ create mode 100644 docs/cataloging/tpac_copy_edit_links.adoc
+ delete mode 100644 docs/cataloging/tpac_copy_edit_links.txt
+ create mode 100644 docs/cataloging/z39.50_search_enhancements.adoc
+ delete mode 100644 docs/cataloging/z39.50_search_enhancements.txt
+ create mode 100644 docs/circ_limits.adoc
+ delete mode 100644 docs/circ_limits.txt
+ create mode 100644 docs/circulation/booking.adoc
+ delete mode 100644 docs/circulation/booking.txt
+ create mode 100644 docs/circulation/circulating_items.adoc
+ delete mode 100644 docs/circulation/circulating_items.txt
+ create mode 100644 docs/circulation/circulating_items_web_client.adoc
+ delete mode 100644 docs/circulation/circulating_items_web_client.txt
+ create mode 100644 docs/circulation/circulation_patron_records.adoc
+ delete mode 100644 docs/circulation/circulation_patron_records.txt
+ create mode 100644 docs/circulation/circulation_patron_records_web_client.adoc
+ delete mode 100644 docs/circulation/circulation_patron_records_web_client.txt
+ create mode 100644 docs/circulation/holds.adoc
+ delete mode 100644 docs/circulation/holds.txt
+ create mode 100644 docs/circulation/offline_mode.adoc
+ delete mode 100644 docs/circulation/offline_mode.txt
+ create mode 100644 docs/circulation/rfid_product_integration.adoc
+ delete mode 100644 docs/circulation/rfid_product_integration.txt
+ create mode 100644 docs/circulation/self_check.adoc
+ delete mode 100644 docs/circulation/self_check.txt
+ create mode 100644 docs/circulation/triggered_events.adoc
+ delete mode 100644 docs/circulation/triggered_events.txt
+ create mode 100644 docs/development/data_supercat.adoc
+ delete mode 100644 docs/development/data_supercat.txt
+ create mode 100644 docs/development/data_unapi.adoc
+ delete mode 100644 docs/development/data_unapi.txt
+ create mode 100644 docs/development/intro_opensrf.adoc
+ delete mode 100644 docs/development/intro_opensrf.txt
+ create mode 100644 docs/development/pgtap.adoc
+ delete mode 100644 docs/development/pgtap.txt
+ create mode 100644 docs/development/support_scripts.adoc
+ delete mode 100644 docs/development/support_scripts.txt
+ create mode 100644 docs/development/updating_translations_launchpad.adoc
+ delete mode 100644 docs/development/updating_translations_launchpad.txt
+ create mode 100644 docs/installation/edi_setup.adoc
+ delete mode 100644 docs/installation/edi_setup.txt
+ create mode 100644 docs/installation/server_installation.adoc
+ delete mode 100644 docs/installation/server_installation.txt
+ create mode 100644 docs/installation/server_upgrade.adoc
+ delete mode 100644 docs/installation/server_upgrade.txt
+ create mode 100644 docs/installation/staff_client_installation.adoc
+ delete mode 100644 docs/installation/staff_client_installation.txt
+ create mode 100644 docs/installation/system_requirements.adoc
+ delete mode 100644 docs/installation/system_requirements.txt
+ create mode 100644 docs/licensing.adoc
+ delete mode 100644 docs/licensing.txt
+ create mode 100644 docs/opac/advanced_features.adoc
+ delete mode 100644 docs/opac/advanced_features.txt
+ create mode 100644 docs/opac/catalog_browse.adoc
+ delete mode 100644 docs/opac/catalog_browse.txt
+ create mode 100644 docs/opac/kids_opac.adoc
+ delete mode 100644 docs/opac/kids_opac.txt
+ create mode 100644 docs/opac/linked_libraries.adoc
+ delete mode 100644 docs/opac/linked_libraries.txt
+ create mode 100644 docs/opac/my_lists.adoc
+ delete mode 100644 docs/opac/my_lists.txt
+ create mode 100644 docs/opac/new_skin_customizations.adoc
+ delete mode 100644 docs/opac/new_skin_customizations.txt
+ create mode 100644 docs/opac/opensearch.adoc
+ delete mode 100644 docs/opac/opensearch.txt
+ create mode 100644 docs/opac/search_form.adoc
+ delete mode 100644 docs/opac/search_form.txt
+ create mode 100644 docs/opac/tpac_meta_record_holds.adoc
+ delete mode 100644 docs/opac/tpac_meta_record_holds.txt
+ create mode 100644 docs/opac/using_the_public_access_catalog.adoc
+ delete mode 100644 docs/opac/using_the_public_access_catalog.txt
+ create mode 100644 docs/reports/reporter_add_data_source.adoc
+ delete mode 100644 docs/reports/reporter_add_data_source.txt
+ create mode 100644 docs/reports/reporter_cloning_shared_templates.adoc
+ delete mode 100644 docs/reports/reporter_cloning_shared_templates.txt
+ create mode 100644 docs/reports/reporter_create_templates.adoc
+ delete mode 100644 docs/reports/reporter_create_templates.txt
+ create mode 100644 docs/reports/reporter_daemon.adoc
+ delete mode 100644 docs/reports/reporter_daemon.txt
+ create mode 100644 docs/reports/reporter_export_usingpgAdmin.adoc
+ delete mode 100644 docs/reports/reporter_export_usingpgAdmin.txt
+ create mode 100644 docs/reports/reporter_folder.adoc
+ delete mode 100644 docs/reports/reporter_folder.txt
+ create mode 100644 docs/reports/reporter_generating_reports.adoc
+ delete mode 100644 docs/reports/reporter_generating_reports.txt
+ create mode 100644 docs/reports/reporter_running_recurring_reports.adoc
+ delete mode 100644 docs/reports/reporter_running_recurring_reports.txt
+ create mode 100644 docs/reports/reporter_template_enhancements.adoc
+ delete mode 100644 docs/reports/reporter_template_enhancements.txt
+ create mode 100644 docs/reports/reporter_template_terminology.adoc
+ delete mode 100644 docs/reports/reporter_template_terminology.txt
+ create mode 100644 docs/reports/reporter_view_output.adoc
+ delete mode 100644 docs/reports/reporter_view_output.txt
+ create mode 100644 docs/root.adoc
+ delete mode 100644 docs/root.txt
+ create mode 100644 docs/serials/A-intro.adoc
+ delete mode 100644 docs/serials/A-intro.txt
+ create mode 100644 docs/serials/B-copy_template.adoc
+ delete mode 100644 docs/serials/B-copy_template.txt
+ create mode 100644 docs/serials/C-subscription-SCV.adoc
+ delete mode 100644 docs/serials/C-subscription-SCV.txt
+ create mode 100644 docs/serials/D-subscription-ASCV.adoc
+ delete mode 100644 docs/serials/D-subscription-ASCV.txt
+ create mode 100644 docs/serials/E-edit_subscriptions.adoc
+ delete mode 100644 docs/serials/E-edit_subscriptions.txt
+ create mode 100644 docs/serials/F-Receiving.adoc
+ delete mode 100644 docs/serials/F-Receiving.txt
+ create mode 100644 docs/serials/G-Special_issue.adoc
+ delete mode 100644 docs/serials/G-Special_issue.txt
+ create mode 100644 docs/serials/Group_Serials_Issues_in_the_OPAC_2.2.adoc
+ delete mode 100644 docs/serials/Group_Serials_Issues_in_the_OPAC_2.2.txt
+ create mode 100644 docs/serials/H-holdings_statements.adoc
+ delete mode 100644 docs/serials/H-holdings_statements.txt
+
+commit 8817b7536c97fe624cf8a243791360ee728e8c87
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Fri Apr 21 10:06:17 2017 -0400
+
+    LP#1685232: fix egCore.pcrud.apply()
+    
+    This patch fixes egCore.pcrud.apply() method so that it
+    behaves as intended (i.e., process an array of fieldmapper
+    objects and either creates, updates, or deletes them based
+    on the value of the isnew(), ischanged(), and isdeleted()
+    flags).
+    
+    To test
+    -------
+    Currently no code uses this method (but some will soon), but
+    it can be tested by writing some code like this:
+    
+       var notes = [];
+       var n1 = new egCore.idl.aun();
+       n1.usr(userid); // etc.
+       n1.isnew(true);
+       notes.push(n1);
+       var n2 = new egCore.idl.aun();
+       n2.usr(userid); // etc.
+       n2.isnew(true);
+       notes.push(n1);
+    
+       egCore.pcrud.apply(notes).then(...
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+
+2	2	Open-ILS/web/js/ui/default/staff/services/pcrud.js
+
+commit 499f9a073d9e305b206f54bc3d3f442976081e09
+Author: Kathy Lussier <klussier at masslnc.org>
+Date:   Wed Apr 19 13:00:10 2017 -0400
+
+    LP#1680554: Stamping upgrade script for fix browse definition ids
+    
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+75	0	Open-ILS/src/sql/Pg/upgrade/1033.data.fix_subject_browse_mappings.sql
+0	75	Open-ILS/src/sql/Pg/upgrade/XXXX.data.fix_subject_browse_mappings.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1033.data.fix_subject_browse_mappings.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.fix_subject_browse_mappings.sql
+
+commit 406fe9fcf38278a26858ac4242a848b51bdd75f2
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Mar 30 14:15:34 2017 -0400
+
+    webstaff: install and include Lovefield in prep for offline mode
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+    
+    Conflicts:
+    	Open-ILS/web/js/ui/default/staff/Gruntfile.js
+    	Open-ILS/web/js/ui/default/staff/bower.json
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+1	0	Open-ILS/src/templates/staff/base_js.tt2
+5	1	Open-ILS/web/js/ui/default/staff/Gruntfile.js
+1	0	Open-ILS/web/js/ui/default/staff/package.json
+
+commit c6ce82716cf965424925ac6d6a978975cae32410
+Author: Mike Rylander <mrylander at gmail.com>
+Date:   Thu Mar 23 10:51:59 2017 -0400
+
+    LP#1528924: Use localizable date filter format
+    
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+11	11	Open-ILS/src/templates/staff/cat/item/t_list.tt2
+
+commit 39bac20cb3869c787e49c6c472d3018a09efdf57
+Author: Kyle Huckins <khuckins at catalystdevworks.com>
+Date:   Tue Jan 24 15:41:45 2017 -0800
+
+    LP#1528924 Item Status List Columns
+    
+    Add several new columns to Item Status List.
+    
+    Refactor of ItemSvc to properly grab circ-related information.
+    
+    Signed-off-by: Kyle Huckins <khuckins at catalystdevworks.com>
+     Changes to be committed:
+    	modified:   Open-ILS/src/templates/staff/cat/item/t_list.tt2
+    	modified:   Open-ILS/web/js/ui/default/staff/cat/item/app.js
+    
+    Signed-off-by: Kyle Huckins <khuckins at catalystdevworks.com>
+    Signed-off-by: Mike Rylander <mrylander at gmail.com>
+
+82	4	Open-ILS/src/templates/staff/cat/item/t_list.tt2
+120	36	Open-ILS/web/js/ui/default/staff/cat/item/app.js
+
+commit 495b2539b26195235dc62ba4e388d522784ead92
+Author: Ben Shum <ben at evergreener.net>
+Date:   Fri Apr 14 18:51:01 2017 -0400
+
+    LP#1683388: Docs: README change for nodejs installation
+    
+    Now that we have Makefile developer support for Wheezy too, we can
+    skip the extra steps if we use the developer make target for any
+    supported distribution.
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+1	2	docs/installation/server_installation.txt
+
+commit 098dc59699a224127e0540e24e0ff75de666a04b
+Author: Ben Shum <ben at evergreener.net>
+Date:   Fri Apr 14 18:33:31 2017 -0400
+
+    LP#1683388:Install newer NodeJS binary for Ubuntu Trusty and Debian Wheezy
+    
+    We need newer stuff!
+    
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
+
+6	3	Open-ILS/src/extras/Makefile.install
+3	5	Open-ILS/src/extras/install/Makefile.common
+2	5	Open-ILS/src/extras/install/Makefile.ubuntu-trusty
+
+commit 54270c3d93319f8aeecd670e1116c53b4936d925
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Wed Apr 12 16:06:09 2017 -0400
+
+    LP#1665933: describe the new -x option when running -h
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+1	0	build/tools/make_release
+
+commit c66d6328d61083db136bd9213a44696073c62914
+Author: Dan Scott <dscott at laurentian.ca>
+Date:   Tue Apr 11 20:21:56 2017 -0400
+
+    LP#1680624 Remove bower packaging bits
+    
+    We no longer need to install bower as part of the Makefile.install
+    targets or worry about the bower_components cache directory when
+    generating a release. Rip out those references.
+    
+    Signed-off-by: Dan Scott <dscott at laurentian.ca>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+0	1	Open-ILS/src/extras/install/Makefile.common
+2	3	Open-ILS/src/extras/install/Makefile.debian-jessie
+2	3	Open-ILS/src/extras/install/Makefile.ubuntu-trusty
+2	3	Open-ILS/src/extras/install/Makefile.ubuntu-xenial
+3	4	build/tools/make_release
+
+commit 4a068d036adeb0fff2343f7bc9c7c27bc50c1ee2
+Author: Dan Scott <dan at coffeecode.net>
+Date:   Thu Apr 6 16:28:31 2017 -0400
+
+    LP#1680624 angular-ui-bootstrap stopped shipping minified files
+    
+    Per https://github.com/angular-ui/bootstrap/issues/5522 upstream
+    feels users should minimize the files themselves.
+    
+    Signed-off-by: Dan Scott <dan at coffeecode.net>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+16	5	Open-ILS/web/js/ui/default/staff/Gruntfile.js
+1	1	Open-ILS/web/js/ui/default/staff/test/karma.conf.js
+
+commit 8c7000a1a54b18f6bec919f6c6b3e563d4fd4725
+Author: Dan Scott <dan at coffeecode.net>
+Date:   Thu Apr 6 00:26:50 2017 -0400
+
+    LP#1680624 Consolidate package dependencies into package.json
+    
+    npm already enables us to designate dependencies in package.json,
+    and projects have increasingly consolidated what bower used to be
+    used for in package.json. We can do this with an npm-compatible version of
+    angular-order-object-by from github.
+    
+    There are a few other tweaks to npm vs bower file locations, such as
+    ng-toast instead of ngtoast for ngToast.
+    
+    Pin to AngularJS 1.5.x for now
+    
+    Signed-off-by: Dan Scott <dan at coffeecode.net>
+    Signed-off-by: Bill Erickson <berickxx at gmail.com>
+    Signed-off-by: Ben Shum <ben at evergreener.net>
+
+43	43	Open-ILS/web/js/ui/default/staff/Gruntfile.js
+0	40	Open-ILS/web/js/ui/default/staff/bower.json
+17	3	Open-ILS/web/js/ui/default/staff/package.json
+4	4	Open-ILS/web/js/ui/default/staff/test/karma.conf.js
+1	9	docs/installation/server_installation.txt
+ delete mode 100644 Open-ILS/web/js/ui/default/staff/bower.json
+
+commit 1937f3f57995a375e7c41505779a30c0c926712e
+Author: Galen Charlton <gmc at equinoxinitiative.org>
+Date:   Tue Apr 4 10:32:58 2017 -0400
+
+    LP#1599634: stamp schema update
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/src/sql/Pg/002.schema.config.sql
+61	0	Open-ILS/src/sql/Pg/upgrade/1032.schema.all_circulation_combined_types_view.sql
+0	61	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.all_circulation_combined_types_view.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1032.schema.all_circulation_combined_types_view.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.all_circulation_combined_types_view.sql
+
+commit 5f26da6220906be586d43158449d76c19559323f
+Author: blake <blake at mobiusconsortium.org>
+Date:   Thu Nov 10 17:06:39 2016 -0600
+
+    LP1599634: follow-ups
+    
+    Squashed patch containing follows-ups written by Chris Sharp
+    and Galen Charlton:
+    
+    *  When running the upgrade script, the DROP VIEW statement resulted in an
+    error since the view did not already exist.  You could add IF EXISTS, but
+    CREATE OR REPLACE VIEW is sufficient.
+    
+    * Changes the ID column to just pass through
+    the ID from the source tables, promoted to BIGINT in
+    some cases.  This has the effect of:
+    
+    - removing a redundancy, as circ_type already specifies the source table
+    - making it easier to join this view against the circulation tables when
+      writing SQL queries
+    
+    * Renames the schema upgrade script to better
+    match conventions.
+    
+    * Move release notes entry so that it will get picked up
+    
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: blake <blake at mobiusconsortium.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+1	1	Open-ILS/examples/fm_IDL.xml
+5	5	Open-ILS/src/sql/Pg/090.schema.action.sql
+0	63	Open-ILS/src/sql/Pg/upgrade/XXXX.LP1599634_Circulation_report_source_to_include_in-house_and_non_cat_circ
+61	0	Open-ILS/src/sql/Pg/upgrade/XXXX.schema.all_circulation_combined_types_view.sql
+12	0	docs/RELEASE_NOTES_NEXT/Reports/lp1599634_Circulation_report_source_to_include_in-house_and_non_cat_circ.adoc
+0	12	docs/lp1599634_Circulation_report_source_to_include_in-house_and_non_cat_circ.adoc
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.LP1599634_Circulation_report_source_to_include_in-house_and_non_cat_circ
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.all_circulation_combined_types_view.sql
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Reports/lp1599634_Circulation_report_source_to_include_in-house_and_non_cat_circ.adoc
+ delete mode 100644 docs/lp1599634_Circulation_report_source_to_include_in-house_and_non_cat_circ.adoc
+
+commit 4e64cbbc4cdda08a60d3e9c45a90f2e9ca0309f5
+Author: blake <blake at mobiusconsortium.org>
+Date:   Thu Jul 7 15:01:36 2016 -0500
+
+    LP1599634 Circulation report source to include in-house(non cat), and non cat circ
+    
+    Added a simple view and supporting IDL. This will allow all the circulation
+    data to output in the same report.
+    
+    Signed-off-by: blake <blake at mobiusconsortium.org>
+    Signed-off-by: Chris Sharp <csharp at georgialibraries.org>
+    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
+    Signed-off-by: blake <blake at mobiusconsortium.org>
+    
+    Conflicts:
+    	Open-ILS/examples/fm_IDL.xml
+    
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+20	0	Open-ILS/examples/fm_IDL.xml
+56	0	Open-ILS/src/sql/Pg/090.schema.action.sql
+27	0	Open-ILS/src/sql/Pg/t/lp1599634_Circulation_report_source_to_include_in-house_and_non_cat_circ.pg
+63	0	Open-ILS/src/sql/Pg/upgrade/XXXX.LP1599634_Circulation_report_source_to_include_in-house_and_non_cat_circ
+12	0	docs/lp1599634_Circulation_report_source_to_include_in-house_and_non_cat_circ.adoc
+ create mode 100644 Open-ILS/src/sql/Pg/t/lp1599634_Circulation_report_source_to_include_in-house_and_non_cat_circ.pg
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.LP1599634_Circulation_report_source_to_include_in-house_and_non_cat_circ
+ create mode 100644 docs/lp1599634_Circulation_report_source_to_include_in-house_and_non_cat_circ.adoc
+
+commit 7ef6bba14250b373f783f38f1818263a48a33270
+Author: Jeanette Lundgren <jlundgren at cwmars.org>
+Date:   Wed Jan 18 13:51:38 2017 -0500
+
+    lp1453205 replaced Target_Pickup_Lib1.jpg
+    
+    Signed-off-by: Jeanette Lundgren <jlundgren at cwmars.org>
+    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>
+
+-	-	docs/media/Target_Pickup_Lib1.jpg
diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application.pm
index d750216..15bbf90 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application.pm
@@ -7,7 +7,7 @@ use OpenILS::Utils::Fieldmapper;
 sub ils_version {
     # version format is "x-y-z", for example "2-0-0" for Evergreen 2.0.0
     # For branches, format is "x-y"
-    return "HEAD";
+    return "3-0-beta1";
 }
 
 __PACKAGE__->register_method(
diff --git a/Open-ILS/src/sql/Pg/002.schema.config.sql b/Open-ILS/src/sql/Pg/002.schema.config.sql
index 06c7836..736bdc2 100644
--- a/Open-ILS/src/sql/Pg/002.schema.config.sql
+++ b/Open-ILS/src/sql/Pg/002.schema.config.sql
@@ -93,6 +93,7 @@ CREATE TRIGGER no_overlapping_deps
     FOR EACH ROW EXECUTE PROCEDURE evergreen.array_overlap_check ('deprecates');
 
 INSERT INTO config.upgrade_log (version, applied_to) VALUES ('1075', :eg_version); -- gmcharlt/miker
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('3.0.beta1', :eg_version);
 
 CREATE TABLE config.bib_source (
 	id		SERIAL	PRIMARY KEY,
diff --git a/Open-ILS/xul/staff_client/chrome/content/main/about.html b/Open-ILS/xul/staff_client/chrome/content/main/about.html
index b2b87b6..ab9f36e 100644
--- a/Open-ILS/xul/staff_client/chrome/content/main/about.html
+++ b/Open-ILS/xul/staff_client/chrome/content/main/about.html
@@ -1,7 +1,7 @@
 <html><head><script></script></head><body onload="var x = document.getElementById('version'); var version ='/xul/server/'.split(/\//)[2]; if (version == 'server') { version = 'versionless debug build'; } x.appendChild(document.createTextNode(version));">
 <h1 style="text-decoration: underline">Evergreen</h1>
 <p>Target Server ID: <span id="version"></span></p>
-<p>$HeadURL$</p>
+<p>http://git.evergreen-ils.org/?p=Evergreen.git;a=shortlog;h=refs/heads/tags/rel_3_0_beta</p>
 <h2>What is Evergreen?</h2>
 <blockquote>
 <p>
diff --git a/Open-ILS/xul/staff_client/defaults/preferences/prefs.js b/Open-ILS/xul/staff_client/defaults/preferences/prefs.js
index 0613a13..b1f55df 100644
--- a/Open-ILS/xul/staff_client/defaults/preferences/prefs.js
+++ b/Open-ILS/xul/staff_client/defaults/preferences/prefs.js
@@ -11,7 +11,7 @@ pref("toolkit.singletonWindowType", "eg_main");
 pref("open-ils.enable_join_tabs", true);
 
 // We'll use this one to help brand some build information into the client, and rely on subversion keywords
-pref("open-ils.repository.headURL","$HeadURL$");
+pref("open-ils.repository.headURL","http://git.evergreen-ils.org/?p=Evergreen.git;a=shortlog;h=refs/heads/tags/rel_3_0_beta");
 pref("open-ils.repository.author","$Author$");
 pref("open-ils.repository.revision","$Revision$");
 pref("open-ils.repository.date","$Date$");
diff --git a/Open-ILS/xul/staff_client/windowssetup.nsi b/Open-ILS/xul/staff_client/windowssetup.nsi
index a954357..93eb47a 100644
--- a/Open-ILS/xul/staff_client/windowssetup.nsi
+++ b/Open-ILS/xul/staff_client/windowssetup.nsi
@@ -3,7 +3,7 @@
 ; HM NIS Edit Wizard helper defines
 ; Old versions of makensis don't like this, moved to Makefile
 ;!define /file PRODUCT_VERSION "client/VERSION"
-!define PRODUCT_TAG "Master"
+!define PRODUCT_TAG "3.0"
 !define PRODUCT_INSTALL_TAG "${PRODUCT_TAG}"
 !define UI_IMAGESET "beta"
 ;!define UI_IMAGESET "release"
diff --git a/README b/README
deleted file mode 120000
index 1ee2103..0000000
--- a/README
+++ /dev/null
@@ -1 +0,0 @@
-docs/installation/server_installation.adoc
\ No newline at end of file
diff --git a/README b/README
new file mode 100644
index 0000000..b999a4e
--- /dev/null
+++ b/README
@@ -0,0 +1,681 @@
+Installing the Evergreen server
+===============================
+:toc:
+:numbered:
+
+Preamble: referenced user accounts
+----------------------------------
+
+In subsequent sections, we will refer to a number of different accounts, as
+follows:
+
+  * Linux user accounts:
+    ** The *user* Linux account is the account that you use to log onto the
+       Linux system as a regular user.
+    ** The *root* Linux account is an account that has system administrator
+       privileges. On Debian you can switch to this account from
+       your *user* account by issuing the `su -` command and entering the
+       password for the *root* account when prompted. On Ubuntu you can switch
+       to this account from your *user* account using the `sudo su -` command
+       and entering the password for your *user* account when prompted.
+    ** The *opensrf* Linux account is an account that you create when installing
+       OpenSRF. You can switch to this account from the *root* account by
+       issuing the `su - opensrf` command.
+    ** The *postgres* Linux account is created automatically when you install
+       the PostgreSQL database server. You can switch to this account from the
+       *root* account by issuing the `su - postgres` command.
+  * PostgreSQL user accounts:
+    ** The *evergreen* PostgreSQL account is a superuser account that you will
+       create to connect to the PostgreSQL database server.
+  * Evergreen administrator account:
+    ** The *egadmin* Evergreen account is an administrator account for
+       Evergreen that you will use to test connectivity and configure your
+       Evergreen instance.
+
+Preamble: developer instructions
+--------------------------------
+
+[NOTE]
+Skip this section if you are using an official release tarball downloaded
+from http://evergreen-ils.org/egdownloads
+
+Developers working directly with the source code from the Git repository,
+rather than an official release tarball, must perform one step before they 
+can proceed with the `./configure` step.
+
+As the *user* Linux account, issue the following command in the Evergreen
+source directory to generate the configure script and Makefiles:
+
+[source, bash]
+------------------------------------------------------------------------------
+autoreconf -i
+------------------------------------------------------------------------------
+
+Installing prerequisites
+------------------------
+
+  * **PostgreSQL**: Version 9.4 is recommended. 
+    The minimum supported version is 9.3.
+  * **Linux**: Evergreen 3.0 has been tested on Debian Jessie (8.0), 
+    Debian Wheezy (7.0), Ubuntu Xenial Xerus (16.04), 
+    and Ubuntu Trusty Tahr (14.04).
+    If you are running an older version of these distributions, you may want 
+    to upgrade before upgrading Evergreen. For instructions on upgrading these
+    distributions, visit the Debian or Ubuntu websites.
+  * **OpenSRF**: The minimum supported version of OpenSRF is 2.5.1.
+
+
+Evergreen has a number of prerequisite packages that must be installed
+before you can successfully configure, compile, and install Evergreen.
+
+1. Begin by installing the most recent version of OpenSRF (2.5.1 or later).
+   You can download OpenSRF releases from http://evergreen-ils.org/opensrf-downloads/
+2. On some distributions, it is necessary to install PostgreSQL 9.4+ from external
+   repositories.
++
+  * Debian (Wheezy) and Ubuntu (Trusty) comes with older versions of 
+    PostgreSQL, so steps are taken to automatically utilize the 
+    PostgreSQL community's apt sources. 
+    (For complete details, see: https://wiki.postgresql.org/wiki/Apt)
+  * Debian (Jessie) and Ubuntu (Xenial) comes with PostgreSQL 9.4+,
+    so no additional steps are required.
++
+3. Issue the following commands as the *root* Linux account to install
+   prerequisites using the `Makefile.install` prerequisite installer,
+   substituting `debian-jessie`, `debian-wheezy`,
+   `ubuntu-xenial`, or `ubuntu-trusty` for <osname> below:
++
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install <osname>
+------------------------------------------------------------------------------
++
+4. Add the libdbi-libdbd libraries to the system dynamic library path by
+   issuing the following commands as the *root* Linux account:
++
+[NOTE]
+You should skip this step if installing on Ubuntu Trusty, Ubuntu Xenial or Debian Jessie. The Ubuntu
+and Debian Jessie targets use libdbd-pgsql from packages.
++
+.Debian Wheezy
+[source, bash]
+------------------------------------------------------------------------------
+echo "/usr/local/lib/dbd" > /etc/ld.so.conf.d/eg.conf
+ldconfig
+------------------------------------------------------------------------------
+
+5. OPTIONAL: Developer additions
++
+To perform certain developer tasks from a Git source code checkout, 
+additional packages may be required.  As the *root* Linux account:
++
+ * To install packages needed for retrieving and managing web dependencies,
+   use the <osname>-developer Makefile.install target.  Currently, 
+   this is only needed for building and installing the (preview) browser 
+   staff client.
++
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install <osname>-developer
+------------------------------------------------------------------------------
++
+ * To install packages required for building Evergreen translations, use
+   the <osname>-translator Makefile.install target.
++
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install <osname>-translator
+------------------------------------------------------------------------------
++
+ * To install packages required for building Evergreen release bundles, use
+   the <osname>-packager Makefile.install target.
++
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install <osname>-packager
+------------------------------------------------------------------------------
+
+Optional: Extra steps for web staff client
+------------------------------------------
+
+[NOTE]
+Skip this entire section if you are using an official release tarball downloaded
+from http://evergreen-ils.org/downloads
+
+Install dependencies for web staff client
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+[NOTE]
+You may skip this section if you have installed the previously described
+'Optional: Developer Additions'.  You will still need to do the following
+steps in <<install_files_for_web_staff_client,Install files for web staff client>>.
+
+1. Install the long-term stability (LTS) release of
+https://nodejs.org[Node.js]. Add the Node.js `/bin` directory to your
+environment variable `PATH`.
++
+2. Install Grunt CLI
++
+[source,sh]
+------------------------------------------------------------------------------
+% sudo npm install -g grunt-cli
+------------------------------------------------------------------------------
+
+[[install_files_for_web_staff_client]]
+Install files for web staff client
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+1. Building, Testing, Minification: The remaining steps all take place within
+   the staff JS web root:
++
+[source,sh]
+------------------------------------------------------------------------------
+cd $EVERGREEN_ROOT/Open-ILS/web/js/ui/default/staff/
+------------------------------------------------------------------------------
++
+2. Install Project-local Dependencies. npm inspects the 'package.json' file
+   for dependencies and fetches them from the Node package network.
++
+[source,sh]
+------------------------------------------------------------------------------
+npm install   # fetch JS dependencies
+------------------------------------------------------------------------------
++
+3. Run the build script.
++
+[source,sh]
+------------------------------------------------------------------------------
+# build, run tests, concat+minify
+grunt all
+------------------------------------------------------------------------------
+
+
+Configuration and compilation instructions
+------------------------------------------
+
+For the time being, we are still installing everything in the `/openils/`
+directory. From the Evergreen source directory, issue the following commands as
+the *user* Linux account to configure and build Evergreen:
+
+[source, bash]
+------------------------------------------------------------------------------
+PATH=/openils/bin:$PATH ./configure --prefix=/openils --sysconfdir=/openils/conf
+make
+------------------------------------------------------------------------------
+
+These instructions assume that you have also installed OpenSRF under `/openils/`.
+If not, please adjust PATH as needed so that the Evergreen `configure` script
+can find `osrf_config`.
+
+Installation instructions
+-------------------------
+
+1. Once you have configured and compiled Evergreen, issue the following
+   command as the *root* Linux account to install Evergreen, build the server
+   portion of the staff client, and copy example configuration files to
+   `/openils/conf`.
+   Change the value of the `STAFF_CLIENT_STAMP_ID` variable to match the version
+   of the staff client that you will use to connect to the Evergreen server.
++
+[source, bash]
+------------------------------------------------------------------------------
+make STAFF_CLIENT_STAMP_ID=rel_3_0_beta1 install
+------------------------------------------------------------------------------
++
+2. The server portion of the staff client expects `http://hostname/xul/server`
+   to resolve. Issue the following commands as the *root* Linux account to
+   create a symbolic link pointing to the `server` subdirectory of the server
+   portion of the staff client that we just built using the staff client ID
+   'rel_name':
++
+[source, bash]
+------------------------------------------------------------------------------
+cd /openils/var/web/xul
+ln -sf rel_name/server server
+------------------------------------------------------------------------------
+
+Change ownership of the Evergreen files
+---------------------------------------
+
+All files in the `/openils/` directory and subdirectories must be owned by the
+`opensrf` user. Issue the following command as the *root* Linux account to
+change the ownership on the files:
+
+[source, bash]
+------------------------------------------------------------------------------
+chown -R opensrf:opensrf /openils
+------------------------------------------------------------------------------
+
+Additional Instructions for Developers
+--------------------------------------
+
+[NOTE]
+Skip this section if you are using an official release tarball downloaded
+from http://evergreen-ils.org/egdownloads
+
+Developers working directly with the source code from the Git repository,
+rather than an official release tarball, need to install the Dojo Toolkit
+set of JavaScript libraries. The appropriate version of Dojo is included in
+Evergreen release tarballs. Developers should install the Dojo 1.3.3 version
+of Dojo by issuing the following commands as the *opensrf* Linux account:
+
+[source, bash]
+------------------------------------------------------------------------------
+wget http://download.dojotoolkit.org/release-1.3.3/dojo-release-1.3.3.tar.gz
+tar -C /openils/var/web/js -xzf dojo-release-1.3.3.tar.gz
+cp -r /openils/var/web/js/dojo-release-1.3.3/* /openils/var/web/js/dojo/.
+------------------------------------------------------------------------------
+
+
+Configure the Apache Web server
+-------------------------------
+
+. Use the example configuration files in `Open-ILS/examples/apache/` (for
+Apache versions below 2.4) or `Open-ILS/examples/apache_24/` (for Apache
+versions 2.4 or greater) to configure your Web server for the Evergreen
+catalog, staff client, Web services, and administration interfaces. Issue the
+following commands as the *root* Linux account:
++
+.Debian Wheezy
+[source,bash]
+------------------------------------------------------------------------------
+cp Open-ILS/examples/apache/eg.conf       /etc/apache2/sites-available/
+cp Open-ILS/examples/apache/eg_vhost.conf /etc/apache2/
+cp Open-ILS/examples/apache/eg_startup    /etc/apache2/
+# Now set up SSL
+mkdir /etc/apache2/ssl
+cd /etc/apache2/ssl
+------------------------------------------------------------------------------
++
+.Ubuntu Trusty, Ubuntu Xenial, and Debian Jessie
+[source,bash]
+------------------------------------------------------------------------------------
+cp Open-ILS/examples/apache_24/eg_24.conf       /etc/apache2/sites-available/eg.conf
+cp Open-ILS/examples/apache_24/eg_vhost_24.conf /etc/apache2/eg_vhost.conf
+cp Open-ILS/examples/apache/eg_startup    	/etc/apache2/
+# Now set up SSL
+mkdir /etc/apache2/ssl
+cd /etc/apache2/ssl
+------------------------------------------------------------------------------------
++
+. The `openssl` command cuts a new SSL key for your Apache server. For a
+production server, you should purchase a signed SSL certificate, but you can
+just use a self-signed certificate and accept the warnings in the staff client
+and browser during testing and development. Create an SSL key for the Apache
+server by issuing the following command as the *root* Linux account:
++
+[source,bash]
+------------------------------------------------------------------------------
+openssl req -new -x509 -days 365 -nodes -out server.crt -keyout server.key
+------------------------------------------------------------------------------
++
+. As the *root* Linux account, edit the `eg.conf` file that you copied into
+place.
+  a. To enable access to the offline upload / execute interface from any
+     workstation on any network, make the following change (and note that
+     you *must* secure this for a production instance):
+     * (Apache 2.2): Replace `Allow from 10.0.0.0/8` with `Allow from all`
+     * (Apache 2.4): Replace `Require host 10.0.0.0/8` with `Require all granted`
+. Change the user for the Apache server.
+  * (Debian and Ubuntu): As the *root* Linux account, edit
+    `/etc/apache2/envvars`.  Change `export APACHE_RUN_USER=www-data` to 
+    `export APACHE_RUN_USER=opensrf`.
+. As the *root* Linux account, configure Apache with KeepAlive settings
+  appropriate for Evergreen. Higher values can improve the performance of a
+  single client by allowing multiple requests to be sent over the same TCP
+  connection, but increase the risk of using up all available Apache child
+  processes and memory.
+  * (Debian and Ubuntu): Edit `/etc/apache2/apache2.conf`.
+    a. Change `KeepAliveTimeout` to `1`.
+    b. Change `MaxKeepAliveRequests` to `100`.
+. As the *root* Linux account, configure the prefork module to start and keep
+  enough Apache servers available to provide quick responses to clients without
+  running out of memory. The following settings are a good starting point for a
+  site that exposes the default Evergreen catalogue to the web:
++
+.Debian Wheezy (`/etc/apache2/apache2.conf`)
+[source,bash]
+------------------------------------------------------------------------------
+<IfModule mpm_prefork_module>
+   StartServers         15
+   MinSpareServers       5
+   MaxSpareServers      15
+   MaxClients           75
+   MaxRequestsPerChild 500
+</IfModule>
+------------------------------------------------------------------------------
++
+.Ubuntu Trusty, Ubuntu Xenial, Debian Jessie (`/etc/apache2/mods-available/mpm_prefork.conf`)
+[source,bash]
+------------------------------------------------------------------------------
+<IfModule mpm_prefork_module>
+   StartServers            15
+   MinSpareServers          5
+   MaxSpareServers         15
+   MaxRequestWorkers       75
+   MaxConnectionsPerChild 500
+</IfModule>
+------------------------------------------------------------------------------
++
+. (Ubuntu Trusty, Ubuntu Xenial, Debian Jessie) As the *root* user,
+    enable the mpm_prefork module:
++
+[source,bash]
+------------------------------------------------------------------------------
+a2dismod mpm_event
+a2enmod mpm_prefork
+------------------------------------------------------------------------------
++
+. (Debian Wheezy): As the *root* Linux account, enable the Evergreen site:
++
+[source,bash]
+------------------------------------------------------------------------------
+a2dissite default  # OPTIONAL: disable the default site (the "It Works" page)
+a2ensite eg.conf
+------------------------------------------------------------------------------
++
+(Ubuntu Trusty, Ubuntu Xenial, Debian Jessie):
++
+[source,bash]
+------------------------------------------------------------------------------
+a2dissite 000-default  # OPTIONAL: disable the default site (the "It Works" page)
+a2ensite eg.conf
+------------------------------------------------------------------------------
++
+. (Debian and Ubuntu): As the *root* Linux account, enable Apache to write
+   to the lock directory; this is currently necessary because Apache
+   is running as the `opensrf` user:
++
+[source,bash]
+------------------------------------------------------------------------------
+chown opensrf /var/lock/apache2
+------------------------------------------------------------------------------
+
+Learn more about additional Apache options in the following sections:
+
+  * <<_apache_rewrite_tricks,Apache Rewrite Tricks>>
+  * <<_apache_access_handler_perl_module,Apache Access Handler Perl Module>>
+
+Configure OpenSRF for the Evergreen application
+-----------------------------------------------
+There are a number of example OpenSRF configuration files in `/openils/conf/`
+that you can use as a template for your Evergreen installation. Issue the
+following commands as the *opensrf* Linux account:
+
+[source, bash]
+------------------------------------------------------------------------------
+cp -b /openils/conf/opensrf_core.xml.example /openils/conf/opensrf_core.xml
+cp -b /openils/conf/opensrf.xml.example /openils/conf/opensrf.xml
+------------------------------------------------------------------------------
+
+When you installed OpenSRF, you created four Jabber users on two
+separate domains and edited the `opensrf_core.xml` file accordingly. Please
+refer back to the OpenSRF README and, as the *opensrf* Linux account, edit the
+Evergreen version of the `opensrf_core.xml` file using the same Jabber users
+and domains as you used while installing and testing OpenSRF.
+
+[NOTE]
+The `-b` flag tells the `cp` command to create a backup version of the
+destination file. The backup version of the destination file has a tilde (`~`)
+appended to the file name, so if you have forgotten the Jabber users and
+domains, you can retrieve the settings from the backup version of the files.
+
+`eg_db_config`, described in <<_creating_the_evergreen_database,Creating the Evergreen
+database>>, sets the database connection information in `opensrf.xml` for you.
+
+Configure action triggers for the Evergreen application
+-------------------------------------------------------
+_Action Triggers_ provide hooks for the system to perform actions when a given
+event occurs; for example, to generate reminder or overdue notices, the
+`checkout.due` hook is processed and events are triggered for potential actions
+if there is no checkin time.
+
+To enable the default set of hooks, issue the following command as the
+*opensrf* Linux account:
+
+[source, bash]
+------------------------------------------------------------------------------
+cp -b /openils/conf/action_trigger_filters.json.example /openils/conf/action_trigger_filters.json
+------------------------------------------------------------------------------
+
+For more information about configuring and using action triggers, see
+<<_notifications_action_triggers,Notifications / Action Triggers>>.
+
+Creating the Evergreen database
+-------------------------------
+
+Setting up the PostgreSQL server
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+For production use, most libraries install the PostgreSQL database server on a
+dedicated machine. Therefore, by default, the `Makefile.install` prerequisite
+installer does *not* install the PostgreSQL 9 database server that is required
+by every Evergreen system. You can install the packages required by Debian or
+Ubuntu on the machine of your choice using the following commands as the
+*root* Linux account:
+
+.(Debian / Ubuntu) Installing PostgreSQL server packages
+
+Each OS build target provides the postgres server installation packages
+required for each operating system.  To install Postgres server packages, 
+use the make target 'postgres-server-<OSTYPE>'.  Choose the most appropriate 
+command below based on your operating system.
+
+[source, bash]
+------------------------------------------------------------------------------
+make -f Open-ILS/src/extras/Makefile.install postgres-server-debian-jessie
+make -f Open-ILS/src/extras/Makefile.install postgres-server-debian-wheezy
+make -f Open-ILS/src/extras/Makefile.install postgres-server-ubuntu-trusty
+make -f Open-ILS/src/extras/Makefile.install postgres-server-ubuntu-xenial
+------------------------------------------------------------------------------
+
+For a standalone PostgreSQL server, install the following Perl modules for your
+distribution as the *root* Linux account:
+
+.(Debian Wheezy, Ubuntu Trusty, and Ubuntu Xenial) 
+No extra modules required for these distributions.
+
+You need to create a PostgreSQL superuser to create and access the database.
+Issue the following command as the *postgres* Linux account to create a new
+PostgreSQL superuser named `evergreen`. When prompted, enter the new user's
+password:
+
+[source, bash]
+------------------------------------------------------------------------------
+createuser -s -P evergreen
+------------------------------------------------------------------------------
+
+.Enabling connections to the PostgreSQL database
+
+Your PostgreSQL database may be configured by default to prevent connections,
+for example, it might reject attempts to connect via TCP/IP or from other
+servers. To enable TCP/IP connections from localhost, check your `pg_hba.conf`
+file, found in the `/etc/postgresql/` directory on Debian and Ubuntu.
+A simple way to enable TCP/IP
+connections from localhost to all databases with password authentication, which
+would be suitable for a test install of Evergreen on a single server, is to
+ensure the file contains the following entries _before_ any "host ... ident"
+entries:
+
+------------------------------------------------------------------------------
+host    all             all             ::1/128                 md5
+host    all             all             127.0.0.1/32            md5
+------------------------------------------------------------------------------
+
+When you change the `pg_hba.conf` file, you will need to reload PostgreSQL to
+make the changes take effect.  For more information on configuring connectivity
+to PostgreSQL, see
+http://www.postgresql.org/docs/devel/static/auth-pg-hba-conf.html
+
+Creating the Evergreen database and schema
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Once you have created the *evergreen* PostgreSQL account, you also need to
+create the database and schema, and configure your configuration files to point
+at the database server. Issue the following command as the *root* Linux account
+from inside the Evergreen source directory, replacing <user>, <password>,
+<hostname>, <port>, and <dbname> with the appropriate values for your
+PostgreSQL database (where <user> and <password> are for the *evergreen*
+PostgreSQL account you just created), and replace <admin-user> and <admin-pass>
+with the values you want for the *egadmin* Evergreen administrator account:
+
+[source, bash]
+------------------------------------------------------------------------------
+perl Open-ILS/src/support-scripts/eg_db_config --update-config \
+       --service all --create-database --create-schema --create-offline \
+       --user <user> --password <password> --hostname <hostname> --port <port> \
+       --database <dbname> --admin-user <admin-user> --admin-pass <admin-pass>
+------------------------------------------------------------------------------
+
+This creates the database and schema and configures all of the services in
+your `/openils/conf/opensrf.xml` configuration file to point to that database.
+It also creates the configuration files required by the Evergreen `cgi-bin`
+administration scripts, and sets the user name and password for the *egadmin*
+Evergreen administrator account to your requested values.
+
+You can get a complete set of options for `eg_db_config` by passing the
+`--help` parameter.
+
+Loading sample data
+~~~~~~~~~~~~~~~~~~~
+If you add the `--load-all-sample` parameter to the `eg_db_config` command,
+a set of authority and bibliographic records, call numbers, copies, staff
+and regular users, and transactions will be loaded into your target
+database. This sample dataset is commonly referred to as the _concerto_
+sample data, and can be useful for testing out Evergreen functionality and
+for creating problem reports that developers can easily recreate with their
+own copy of the _concerto_ sample data.
+
+Creating the database on a remote server
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+In a production instance of Evergreen, your PostgreSQL server should be
+installed on a dedicated server.
+
+PostgreSQL 9.4 and later
+^^^^^^^^^^^^^^^^^^^^^^^^
+To create the database instance on a remote database server running PostgreSQL
+9.4 or later, simply use the `--create-database` flag on `eg_db_config`.
+
+Starting Evergreen
+------------------
+1. As the *root* Linux account, start the `memcached` and `ejabberd` services
+(if they aren't already running):
++
+[source, bash]
+------------------------------------------------------------------------------
+/etc/init.d/ejabberd start
+/etc/init.d/memcached start
+------------------------------------------------------------------------------
++
+2. As the *opensrf* Linux account, start Evergreen. The `-l` flag in the
+following command is only necessary if you want to force Evergreen to treat the
+hostname as `localhost`; if you configured `opensrf.xml` using the real
+hostname of your machine as returned by `perl -ENet::Domain 'print
+Net::Domain::hostfqdn() . "\n";'`, you should not use the `-l` flag.
++
+[source, bash]
+------------------------------------------------------------------------------
+osrf_control -l --start-all
+------------------------------------------------------------------------------
++
+  ** If you receive the error message `bash: osrf_control: command not found`,
+     then your environment variable `PATH` does not include the `/openils/bin`
+     directory; this should have been set in the *opensrf* Linux account's
+     `.bashrc` configuration file. To manually set the `PATH` variable, edit the
+     configuration file `~/.bashrc` as the *opensrf* Linux account and add the
+     following line:
++
+[source, bash]
+------------------------------------------------------------------------------
+export PATH=$PATH:/openils/bin
+------------------------------------------------------------------------------
++
+3. As the *opensrf* Linux account, generate the Web files needed by the staff
+   client and catalogue and update the organization unit proximity (you need to do
+   this the first time you start Evergreen, and after that each time you change the library org unit configuration.
+):
++
+[source, bash]
+------------------------------------------------------------------------------
+autogen.sh
+------------------------------------------------------------------------------
++
+4. As the *root* Linux account, restart the Apache Web server:
++
+[source, bash]
+------------------------------------------------------------------------------
+/etc/init.d/apache2 restart
+------------------------------------------------------------------------------
++
+If the Apache Web server was running when you started the OpenSRF services, you
+might not be able to successfully log in to the OPAC or staff client until the
+Apache Web server is restarted.
+
+Testing connections to Evergreen
+--------------------------------
+
+Once you have installed and started Evergreen, test your connection to
+Evergreen via `srfsh`. As the *opensrf* Linux account, issue the following
+commands to start `srfsh` and try to log onto the Evergreen server using the
+*egadmin* Evergreen administrator user name and password that you set using the
+`eg_db_config` command:
+
+[source, bash]
+------------------------------------------------------------------------------
+/openils/bin/srfsh
+srfsh% login <admin-user> <admin-pass>
+------------------------------------------------------------------------------
+
+You should see a result like:
+
+    Received Data: "250bf1518c7527a03249858687714376"
+    ------------------------------------
+    Request Completed Successfully
+    Request Time in seconds: 0.045286
+    ------------------------------------
+
+    Received Data: {
+       "ilsevent":0,
+       "textcode":"SUCCESS",
+       "desc":" ",
+       "pid":21616,
+       "stacktrace":"oils_auth.c:304",
+       "payload":{
+          "authtoken":"e5f9827cc0f93b503a1cc66bee6bdd1a",
+          "authtime":420
+       }
+
+    }
+
+    ------------------------------------
+    Request Completed Successfully
+    Request Time in seconds: 1.336568
+    ------------------------------------
+[[install-troubleshooting-1]]
+If this does not work, it's time to do some troubleshooting.
+
+  * As the *opensrf* Linux account, run the `settings-tester.pl` script to see
+    if it finds any system configuration problems. The script is found at
+    `Open-ILS/src/support-scripts/settings-tester.pl` in the Evergreen source
+    tree.
+  * Follow the steps in the http://evergreen-ils.org/dokuwiki/doku.php?id=troubleshooting:checking_for_errors[troubleshooting guide].
+  * If you have faithfully followed the entire set of installation steps
+    listed here, you are probably extremely close to a working system.
+    Gather your configuration files and log files and contact the
+    http://evergreen-ils.org/communicate/mailing-lists/[Evergreen development 
+mailing list] for assistance before making any drastic changes to your system
+    configuration.
+
+Getting help
+------------
+
+Need help installing or using Evergreen? Join the mailing lists at
+http://evergreen-ils.org/communicate/mailing-lists/ or contact us on the Freenode
+IRC network on the #evergreen channel.
+
+License
+-------
+This work is licensed under the Creative Commons Attribution-ShareAlike 3.0
+Unported License. To view a copy of this license, visit
+http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to Creative
+Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
diff --git a/configure.ac b/configure.ac
index dacb5a3..d9260d3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -20,8 +20,8 @@
 
 export PATH=${PATH}:/usr/sbin
 AC_PREREQ(2.61)
-AC_INIT(Open-ILS, trunk, open-ils-dev at list.georgialibraries.org)
-AM_INIT_AUTOMAKE([OpenILS], [trunk])
+AC_INIT(Open-ILS, 3.0.beta1, open-ils-dev at list.georgialibraries.org)
+AM_INIT_AUTOMAKE([OpenILS], [3.0.beta1])
 AC_REVISION($Revision: 0.1 $)
 AC_CONFIG_SRCDIR([configure.ac])
 AC_CONFIG_SUBDIRS([Open-ILS/xul/staff_client/external/libmar])
diff --git a/docs/installation/server_installation.adoc b/docs/installation/server_installation.adoc
index 3d2d973..81752622 100644
--- a/docs/installation/server_installation.adoc
+++ b/docs/installation/server_installation.adoc
@@ -56,19 +56,19 @@ Installing prerequisites
 
   * **PostgreSQL**: Version 9.4 is recommended. 
     The minimum supported version is 9.3.
-  * **Linux**: Evergreen 2.8 has been tested on Debian Jessie (8.0), 
+  * **Linux**: Evergreen 3.0 has been tested on Debian Jessie (8.0), 
     Debian Wheezy (7.0), Ubuntu Xenial Xerus (16.04), 
     and Ubuntu Trusty Tahr (14.04).
     If you are running an older version of these distributions, you may want 
     to upgrade before upgrading Evergreen. For instructions on upgrading these
     distributions, visit the Debian or Ubuntu websites.
-  * **OpenSRF**: The minimum supported version of OpenSRF is 2.5.0.
+  * **OpenSRF**: The minimum supported version of OpenSRF is 2.5.1.
 
 
 Evergreen has a number of prerequisite packages that must be installed
 before you can successfully configure, compile, and install Evergreen.
 
-1. Begin by installing the most recent version of OpenSRF (2.5.0 or later).
+1. Begin by installing the most recent version of OpenSRF (2.5.1 or later).
    You can download OpenSRF releases from http://evergreen-ils.org/opensrf-downloads/
 2. On some distributions, it is necessary to install PostgreSQL 9.4+ from external
    repositories.
diff --git a/docs/installation/server_upgrade.adoc b/docs/installation/server_upgrade.adoc
index 52a32fe..9bdba99 100644
--- a/docs/installation/server_upgrade.adoc
+++ b/docs/installation/server_upgrade.adoc
@@ -8,13 +8,13 @@ Software Prerequisites
 
   * **PostgreSQL**: Version 9.4 is recommended.
     The minimum supported version is 9.3.
-  * **Linux**: Evergreen 2.12.0 has been tested on Debian Jessie (8.0),
+  * **Linux**: Evergreen 3.0.beta1 has been tested on Debian Jessie (8.0),
     Debian Wheezy (7.0), Ubuntu Xenial Xerus (16.04),
     and Ubuntu Trusty Tahr (14.04).
     If you are running an older version of these distributions, you may want
     to upgrade before upgrading Evergreen. For instructions on upgrading these
     distributions, visit the Debian or Ubuntu websites.
-  * **OpenSRF**: The minimum supported version of OpenSRF is 2.5.0.
+  * **OpenSRF**: The minimum supported version of OpenSRF is 2.5.1.
 
 
 In the following instructions, you are asked to perform certain steps as either the *root* or *opensrf* user.
@@ -44,12 +44,12 @@ osrf_control --localhost --stop-all
  .. Back up the /openils directory.
 . Upgrade OpenSRF. Download and install the latest version of OpenSRF from
 the https://evergreen-ils.org/opensrf-downloads/[OpenSRF download page].
-. As the *opensrf* user, download and extract Evergreen 2.12.0:
+. As the *opensrf* user, download and extract Evergreen 3.0.beta1:
 +
 [source, bash]
 -----------------------------------------------
-wget https://evergreen-ils.org/downloads/Evergreen-ILS-2.12.0.tar.gz
-tar xzf Evergreen-ILS-2.12.0.tar.gz
+wget https://evergreen-ils.org/downloads/Evergreen-ILS-3.0.beta1.tar.gz
+tar xzf Evergreen-ILS-3.0.beta1.tar.gz
 -----------------------------------------------
 +
 [NOTE]
@@ -59,7 +59,7 @@ For the latest edition of Evergreen, check the https://evergreen-ils.org/egdownl
 +
 [source, bash]
 ---------------------------------------------
-cd /home/opensrf/Evergreen-ILS-2.12.0
+cd /home/opensrf/Evergreen-ILS-3.0.beta1
 ---------------------------------------------
 +
 On the next command, replace `[distribution]` with one of these values for your
@@ -83,7 +83,7 @@ make -f Open-ILS/src/extras/Makefile.install [distribution]
 +
 [source, bash]
 ------------------------------------------------------------
-cd /home/opensrf/Evergreen-ILS-2.12.0
+cd /home/opensrf/Evergreen-ILS-3.0.beta1
 PATH=/openils/bin:$PATH ./configure --prefix=/openils --sysconfdir=/openils/conf
 make
 ------------------------------------------------------------
@@ -94,8 +94,8 @@ These instructions assume that you have also installed OpenSRF under /openils/.
 +
 [source, bash]
 ------------------------------------------------------------
-cd /home/opensrf/Evergreen-ILS-2.12.0
-make STAFF_CLIENT_STAMP_ID=rel_2_12_rc install
+cd /home/opensrf/Evergreen-ILS-3.0.beta1
+make STAFF_CLIENT_STAMP_ID=rel_3_0_beta1 install
 ------------------------------------------------------------
 +
 . As the *root* user, change all files to be owned by the opensrf user and group:
@@ -111,7 +111,7 @@ chown -R opensrf:opensrf /openils
 -----------------------------------------------------------
 cd /openils/var/web/xul/
 rm server
-ln -sf rel_2_12_rc/server server
+ln -sf rel_3_0_beta1/server server
 ----------------------------------------------------------
 +
 . As the *opensrf* user, update opensrf_core.xml and opensrf.xml by copying the
@@ -131,7 +131,7 @@ Copying these configuration files will remove any customizations you have made t
 +
 [source, bash]
 -------------------------------------------------------------------------
-cd /home/opensrf/Evergreen-ILS-2.12.0
+cd /home/opensrf/Evergreen-ILS-3.0.beta1
 perl Open-ILS/src/support-scripts/eg_db_config --update-config --service all \
 --create-offline --database evergreen --host localhost --user evergreen --password evergreen
 -------------------------------------------------------------------------
@@ -155,21 +155,21 @@ The diff command can be used to show the differences between the distribution ve
 +
 [source, bash]
 ----------------------------------------------------------
-cp /home/opensrf/Evergreen-ILS-2.12.0/Open-ILS/examples/apache/eg_startup /etc/apache2/eg_startup
+cp /home/opensrf/Evergreen-ILS-3.0.beta1/Open-ILS/examples/apache/eg_startup /etc/apache2/eg_startup
 ----------------------------------------------------------
 +
 .. Update /etc/apache2/eg_vhost.conf by copying the example from Open-ILS/examples/apache/eg_vhost.conf.
 +
 [source, bash]
 ----------------------------------------------------------
-cp /home/opensrf/Evergreen-ILS-2.12.0/Open-ILS/examples/apache/eg_vhost.conf /etc/apache2/eg_vhost.conf
+cp /home/opensrf/Evergreen-ILS-3.0.beta1/Open-ILS/examples/apache/eg_vhost.conf /etc/apache2/eg_vhost.conf
 ----------------------------------------------------------
 +
 .. Update /etc/apache2/sites-available/eg.conf by copying the example from Open-ILS/examples/apache/eg.conf.
 +
 [source, bash]
 ----------------------------------------------------------
-cp /home/opensrf/Evergreen-ILS-2.12.0/Open-ILS/examples/apache/eg.conf /etc/apache2/sites-available/eg.conf
+cp /home/opensrf/Evergreen-ILS-3.0.beta1/Open-ILS/examples/apache/eg.conf /etc/apache2/sites-available/eg.conf
 ----------------------------------------------------------
 
 Upgrade the Evergreen database schema
@@ -268,8 +268,8 @@ as a user with the ability to connect to the database server.
 
 [source, bash]
 ----------------------------------------------------------
-cd /home/opensrf/Evergreen-ILS-2.12.0/Open-ILS/src/sql/Pg
-psql -U evergreen -h localhost -f version-upgrade/2.11.3-2.12.0-upgrade-db.sql evergreen
+cd /home/opensrf/Evergreen-ILS-3.0.beta1/Open-ILS/src/sql/Pg
+psql -U evergreen -h localhost -f version-upgrade/2.12.5-3.0.beta1-upgrade-db.sql evergreen
 ----------------------------------------------------------
 
 [TIP]

commit 56d044aa49f33e64a1748033ea854a38144d7625
Author: Dan Wells <dbw2 at calvin.edu>
Date:   Mon Feb 24 12:09:57 2014 -0500

    Bump OpenILS.pm version
    
    Signed-off-by: Dan Wells <dbw2 at calvin.edu>

diff --git a/Open-ILS/src/perlmods/lib/OpenILS.pm b/Open-ILS/src/perlmods/lib/OpenILS.pm
index d7235ce..10709ae 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS.pm
@@ -6,6 +6,6 @@ OpenILS - Client and server support for the Evergreen open source library system
 
 =cut
 
-our $VERSION = '2.4';
+our $VERSION = '3.0000';
 
 1;

commit a8b6d7da24730d1fb0877cb991db20610522f91b
Author: Jane Sandberg <sandbej at linnbenton.edu>
Date:   Tue Sep 5 23:04:55 2017 -0700

    Docs: copy-editing 3.0 release notes
    
    Signed-off-by: Jane Sandberg <sandbej at linnbenton.edu>

diff --git a/docs/RELEASE_NOTES_3.0.adoc b/docs/RELEASE_NOTES_3.0.adoc
index f069e2d..a52f2a9 100644
--- a/docs/RELEASE_NOTES_3.0.adoc
+++ b/docs/RELEASE_NOTES_3.0.adoc
@@ -5,6 +5,7 @@ Evergreen 3.0 Release Notes
 
 Upgrade notes
 -------------
+
 The minimum version of PostgreSQL required to run Evergreen 3.0 is PostgreSQL 9.4.
 
 Deprecation of XUL staff client
@@ -24,6 +25,7 @@ This policy will continue through the 3.0.x and 3.1.x maintenance
 release cycles, and will become moot upon the release of 3.2.0, when
 the XUL staff client is slated to be entirely removed.
 
+
 New Features
 ------------
 
@@ -55,7 +57,7 @@ attributes.
   ** Link between edi_attr's and edi_attr_set's.
 
 . EDI Attribute Sets are manged via a new (browser client only) configuration
-  interface at Administration -> Acquisistions Administration -> EDI
+  interface at Administration -> Acquisitions Administration -> EDI
   Attribute Sets.
 
 . Each acq.edi_account should be linked to an acq.edi_attr_set.  If a link 
@@ -67,7 +69,7 @@ attributes.
   and/or adding additional edi_att_set's as needed.
 
 . A new edi_order_pusher.pl script is added which replaces the functionality
-  of edi_pusher.pl.  edi_pusher.pl is still avaialable.
+  of edi_pusher.pl.  edi_pusher.pl is still available.
 
 . After moving to edi_order_pusher.pl, the JEDI Action/Trigger event
   definition is no longer required.  It can be disabled.
@@ -155,21 +157,21 @@ The browser client gets a new service 'egBibDisplay' which is capable
 of translating the display field data from various formats into 
 data more suitable for JavaScript usage.
 
-The database gets 3 new VIEWs for representing display data in various
+The database gets 3 new views for representing display data in various
 formats:
 
  * metabib.flat_display_entry
   ** List of all display fields linked to their configuration.
  * metabib.compressed_display_entry
   ** Same as metabib.flat_display_entry except there's one row
-     per display field type, which 'mulit' rows compressed into
+     per display field type, with 'multi' rows compressed into
      JSON arrays.  Non-multi fields are represented as JSON 
      strings/numbers.
  * metabib.wide_display_entry
   ** Tabular view of display field data, one column per well-known
      field.  Values are represented JSON, consistent with 
-     metabib.flat_display_entry.  The view DOE NOT CONTAIN locally
-     configured dispaly fields, as each field must be encoded in
+     metabib.flat_display_entry.  The view does *not* contain locally
+     configured display fields, as each field must be encoded in
      the view and IDL definition.  This is essentially a replacement 
      for reporter.simple_record.
 
@@ -248,7 +250,7 @@ The marc_export script has a new option, --descendants.  This option
 takes one argument of an organizational unit shortname.  It works much
 like the existing --library option except that it is aware of the
 org. tree and will export records with holdings at the specified
-organizational unit and all of its decendants.  This is handy if you
+organizational unit and all of its descendants.  This is handy if you
 want to export the records for all of the branches of a system.  You
 can do that by specifying this option and the system's shortname,
 instead of specifying multiple --library options for each branch.
@@ -266,7 +268,7 @@ RTL and LTR Public Catalog Stylesheets Merged
 The RTL stylesheet for the public catalog,
 `templates/opac/css/style-rtl.css.tt2`, has been merged into the LTR
 one (`templates/opac/css/style.css.tt2`). The combined stylesheet
-template will emit RTL or LTR styles based on the value of
+template will provide RTL or LTR styles based on the value of
 the `rtl` flag of the active locale. An `rtl` variable is also available
 in the template to allow the correct style to be chosen.
 
@@ -283,8 +285,8 @@ Miscellaneous Improvements
 ^^^^^^^^^^^^^^^^^^^^^^^^^^
 
  * If a filter is in effect in the Library Settings Editor,
-   changing the selected library now results in the filter
-   continuing to be applied.
+   the filter will continue to be applied after a user 
+   changes the selected library.
  * Copy templates used for serials now correct link to age
    protection rules and MARC item type values (for the
    "Circ as Type" field). During upgrade, the database update
@@ -352,8 +354,8 @@ Deployment
 ++++++++++
 
 A new purge_at_events.sh script is installed in the bin directory
-(typically /openils/bin) wich should be added to CRON for regular
-maintanence.
+(typically /openils/bin) which should be added to CRON for regular
+maintenance.
 
 NOTE: On large data sets, this script can take a long time to run and
 create higher than normal I/O load as it churns though the event and
@@ -411,7 +413,7 @@ token.  It performs the same steps as the
 open-ils.auth.authenticate.init and .complete APIs in a single call,
 using the bare password.  No intermediate password hashing is required.
 
-The paramters are the same as the .complete call with a few modifications.
+The paramaters are the same as the .complete call with a few modifications.
 
 1. Using the generic "identifier" parameter in combination with the
    "org" parameter allows the API to reliably determine if an identifier
@@ -585,14 +587,14 @@ Circulation
 Batch Editing of Patron Records
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 There is a now a new interface analogous to the Copy Bucket interface
-to record the selection and grouping of a set of users into a User Bucket.
+to select and group of a set of users into a User Bucket.
 The addition of users to a User Bucket is possible from the Patron Search
 interface by the use of a new grid Action, and directly on the User Bucket
-interface by user barcode. It is also possible to add users by uploading
-a text file that contains a list of user barcodes.
+interface by user barcode. It is also possible to add users to a User
+Bucket by uploading a text file that contains a list of user barcodes.
 
 From this interface it is possible to perform a set of specific batch update
-operations against users generally.
+operations against users.
 
 Editing users
 +++++++++++++
@@ -802,7 +804,7 @@ Patron Search by Birth Date
 
 Patron Search from Place Hold
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-Patron Search from Place Hold allows staff members, when placing a
+This feature allows staff members, when placing a
 hold on behalf of a patron in the web staff client, to search for
 patrons by names and other searchable patron information, rather than
 relying on barcode alone. In particular, after performing a catalog
@@ -822,7 +824,7 @@ Adds a new library setting 'Number of Retrievable Recent Patrons'
 retrieved patrons that can be re-fetched from the staff client.
 
 A value of 0 means no recent patrons can be retrieved.
-A value greater than 1 means staff will be able to retrive multiple
+A value greater than 1 means staff will be able to retrieve multiple
 recent patrons via a new Circulation 'Retrieve Recent Patrons' menu entry.
 
 The default value is 1 for backwards compatibility.
@@ -834,8 +836,8 @@ The default value is 1 for backwards compatibility.
 
 Fuller title in XUL client Simplified Pull List
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-The Simplified Pull List in the XUL client will now display subfields n and
-p in the title field. The addition will make it easier for staff to distinguish
+The Simplified Pull List in the XUL client will now display subfields 245$n and
+$p in the title field. The addition will make it easier for staff to distinguish
 between different parts or seasons in a series.
 
 
@@ -879,7 +881,7 @@ Client
 
 Add Circ Modifier to Record Detail Page in Staff TPAC
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-The circ_modifier field is added to the copy table to make
+The circ_modifier field is added to the table of copies to make
 more information available to staff without having to open
 the Holdings Maintenance view.
 
@@ -942,21 +944,22 @@ Improvements to Bill Payment Pages
 The bill payment pages in the public catalog have been revamped
 to
 
- * use "charges" instead of "fees"
+ * use the term "charges" instead of "fees"
  * include images of credit cards accepted
- * make the print receipt template match other itemized receipts;
+ * make the default print receipt template match other itemized receipts;
    note that this change is not automatically applied when upgrading.
  * display billing type
- * add button to pay just selected charges
- * reformat the page for inputting the credit card number
+ * add button to pay only selected charges
+ * reformat the credit card number input page
+
 
 
 
 
 Clickable Copy Locations
 ^^^^^^^^^^^^^^^^^^^^^^^^
-Adds a url field to the copy locations editor. When a url is entered in this field, 
-the associated copy location will display as a link in the opac summary display.
+Adds a URL field to the copy locations editor. When a URL is entered in this field, 
+the associated copy location will display as a link in the OPAC summary display.
 
 
 
@@ -1002,15 +1005,15 @@ rewritten to modernize its style and optimize its performance:
 jQuery for the TPAC
 ^^^^^^^^^^^^^^^^^^^
 This release adds optional support for jQuery in the TPAC.  This support
-enabled by setting the ctx.want_jquery variable to a true value in the
+is enabled by setting the ctx.want_jquery variable to a true value in the
 config.tt2 TPAC template.
 
 
 
 
 
-New Popularity Parameter
-^^^^^^^^^^^^^^^^^^^^^^^^
+New Popularity Parameters
+^^^^^^^^^^^^^^^^^^^^^^^^^
 New popularity parameters for in-house use over time and for count of distinct
 organizational units that own a title are now available. Evergreen sites
 can use these parameters to create new statistical popularity badges for
@@ -1057,25 +1060,26 @@ New report source table allowing report of "last" deleted copy
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 This source table allows you to construct a clever aggregate report template
-which will report bibliographic ID's where a library or a group of libraries 
-no longer have a copy attached but had* a copy attached. This is especially
+which will report bibliographic IDs where a library or a group of libraries 
+no longer have a copy attached but *had* a copy attached. This is especially
 useful when a holdings sync is required with an external vendor.
 
 
-Instructions for creating the report template:
-  * Create a new report template using the "Library Holdings Count with Deleted" as the source
+Instructions for creating a report template with this source:
+
+  * Create a new report template using "Library Holdings Count with Deleted" as the source
   * Add "Has Only Deleted Copies 0/1" (Min) to the Aggregate Filters -> Change Value to "1"
-  * Add "Last Edit Date" (Max) to Aggregate Filters -> Change Operator to "Between"
-  * Add Circulation Library -> "Organizational Unit ID" Raw Data to Base Filters -> Change Operator to "In list"
+  * Add "Last Edit Date" (Max) to Aggregate Filters.  In Aggregate Filters, change the operator to "Between"
+  * Add Circulation Library -> "Organizational Unit ID" to Base Filters, with the Raw Data transform.  In the list of Base Filters, change the operator to "In list"
   * Add "Bib ID" to Displayed Fields
   * Add "Last Edit Date" to Displayed Fields and Change Transform to Max
   * Add "Has Only Deleted Copies 0/1" to Displayed Fields and Change Transform to Min
   * Add "Total copies attached" to Displayed Fields and Change Transform to Sum
 
 
-This template will only output bibliographic ID's where all of the copies for the specified branch(es)
+This template will only output bibliographic IDs where all of the copies for the specified branch(es)
 are deleted. Furthermore, it will only output bibs whose copies were edited (deleted) during the 
-specified date range. Unfortunatly the user will have to manually type the date range without the date
+specified date range. Unfortunately the user will have to manually type the date range without the date
 picker. This view will also allow you to answer questions like "Show me bibs where I have one visible
 copy and more than two deleted copies."
 
@@ -1084,7 +1088,7 @@ copy and more than two deleted copies."
 
 Add Provider to Provider Note link
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-The Provider reporting source now includes a link to Provider Note.
+The Provider reporting source now includes a link to the Provider Note reporting source.
 
 
 
@@ -1102,14 +1106,18 @@ New circulation report source "All Circulation Combined Types"
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 This report source will allow you to create a single report template for all of the following:
-  * In House
-  * In House Non Cat
-  * Circulation (standard)
-  * Non Cat Circulation
 
-These columns are important to display:
-  * Item Type
-  * Circulation Type
+ * In-house uses
+ * In-house uses of non-cataloged items
+ * Circulations
+ * Circulations of non-cataloged items
+
+To distinguish between these different types of library use, it's important to display these columns
+in your report templates:
+
+ * Item Type
+ * Circulation Type
+
 
 
 
@@ -1208,25 +1216,26 @@ SIP Bugfix Changes How Encoding Is Determined in Configuration
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 The combined fix for the above mentioned SIP bugs alters the way that
-the output encoding is looked up in the configuration file (typically
+SIPServer looks up the output encoding in the configuration file (typically
 oils_sip.xml).  SIPServer now looks for the encoding in the following
 places:
 
 1. An +encoding+ attribute on the +account+ element for the currently active SIP account.
-2. The +encoding+ element that is a child of the +insitution+ element of the currently acctive SIP account.
-3. The +encoding+ element that is a child of the +implementation_config+ element that is itself a child of the +insitution+ element of the currently acctive SIP account.
-4. If none of the above exist, then ASCII encoding is used by default.
+2. The +encoding+ element that is a child of the +institution+ element of the currently active SIP account.
+3. The +encoding+ element that is a child of the +implementation_config+ element that is itself a child of the +institution+ element of the currently active SIP account.
+4. If none of the above exist, then the default encoding (ASCII) is used.
 
 Number 3 is provided to ease the transition to the new code.  It is
 the current location of the +encoding+ element in the sample
 configuration file and as such, where it is likely to be found in
 actual files.  It is recommended that you alter your configuration to
 move this element out of the +implementation_config+ element and into
-its parent +institution+ element.  SIPServer should *not* look into
+its parent +institution+ element.  Ideally, SIPServer should *not* look into
 the implementation config, and this check may be removed at some time
 in the future.
 
 
+
 Acknowledgments
 ---------------
 The Evergreen project would like to acknowledge the following

commit 50b6c3da4e16012c0ff0fa092f7074b7cab0adfd
Author: Galen Charlton <gmc at equinoxinitiative.org>
Date:   Tue Sep 5 14:08:12 2017 -0400

    add organizations who sponsored develpoment written by Equinox
    
    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>

diff --git a/docs/RELEASE_NOTES_3.0.adoc b/docs/RELEASE_NOTES_3.0.adoc
index 3b606ce..f069e2d 100644
--- a/docs/RELEASE_NOTES_3.0.adoc
+++ b/docs/RELEASE_NOTES_3.0.adoc
@@ -1233,7 +1233,14 @@ The Evergreen project would like to acknowledge the following
 organizations that commissioned developments in this release of
 Evergreen:
 
-TODO
+* Bibliomation
+* British Columbia Libraries Cooperative (BC Sitka)
+* C/W MARS
+* Georgia Public Library Service
+* King County Library System
+* MassLNC
+* Pennsylvania Integrated Library System
+* Pioneer Library System
 
 We would also like to thank the following individuals who contributed
 code, translations, documentations patches and tests to this release of

commit 3b3fe232a90f1eab5785d5b00b71dbfbf5eb0ae3
Author: Galen Charlton <gmc at equinoxinitiative.org>
Date:   Tue Sep 5 13:04:29 2017 -0400

    start work on 3.0 release notes
    
    Generated from release note stubs; also includes note about
    minimum PostgreSQL client and XUL deprecation.
    
    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>

diff --git a/docs/RELEASE_NOTES_3.0.adoc b/docs/RELEASE_NOTES_3.0.adoc
new file mode 100644
index 0000000..3b606ce
--- /dev/null
+++ b/docs/RELEASE_NOTES_3.0.adoc
@@ -0,0 +1,1253 @@
+Evergreen 3.0 Release Notes
+===========================
+:toc:
+:numbered:
+
+Upgrade notes
+-------------
+The minimum version of PostgreSQL required to run Evergreen 3.0 is PostgreSQL 9.4.
+
+Deprecation of XUL staff client
+-------------------------------
+Starting with the release of 3.0.0, patches that fix XUL bugs will not
+be merged into master or backported unless they meet one or more of
+the following conditions:
+
+a. the bug is a security issue
+b. the bug involves the destruction of data
+c. the bug is a regression of functionality in the XUL staff client
+   introduced by other work done to Evergreen
+
+Under no circumstances will XUL staff client feature enhancements be merged.
+
+This policy will continue through the 3.0.x and 3.1.x maintenance
+release cycles, and will become moot upon the release of 3.2.0, when
+the XUL staff client is slated to be entirely removed.
+
+New Features
+------------
+
+
+
+Administration
+~~~~~~~~~~~~~~
+
+
+
+New EDI Order Generator 
+^^^^^^^^^^^^^^^^^^^^^^^
+
+Configuration
++++++++++++++
+
+. New database tables exist for configuring vendor-specific EDI order 
+attributes.
+
+ * acq.edi_attr 
+  ** List of EDI order generation toggles, e.g. "INCLUDE_COPIES" to add 
+     GIR segments
+ * acq.edi_attr_set
+  ** Collection of edi_attr's.  Each edi_account may be linked to one
+     edi_attr_set.
+  ** One edi_attr_set per known vendor is added to the stock data, matching
+     the stock configuration found in the JEDI template.
+ * acq.edi_attr_set_map
+  ** Link between edi_attr's and edi_attr_set's.
+
+. EDI Attribute Sets are manged via a new (browser client only) configuration
+  interface at Administration -> Acquisistions Administration -> EDI
+  Attribute Sets.
+
+. Each acq.edi_account should be linked to an acq.edi_attr_set.  If a link 
+  is not set, default values will be used.  Links between an EDI account
+  and an attribute set are managed in the EDI Accounts configuration 
+  interface.
+
+. Local modifications to the stock EG JEDI template are managed by modifying
+  and/or adding additional edi_att_set's as needed.
+
+. A new edi_order_pusher.pl script is added which replaces the functionality
+  of edi_pusher.pl.  edi_pusher.pl is still avaialable.
+
+. After moving to edi_order_pusher.pl, the JEDI Action/Trigger event
+  definition is no longer required.  It can be disabled.
+
+Migration
++++++++++
+
+EDI accounts have a new boolean field "Use EDI Attributes" (use_attrs) that 
+specifies whether PO's generated via the account should be built using 
+EDI attributes or fall back to traditional JEDI A/T template generation.
+
+This allows sites to activate EDI attributes on a per-account basis, making 
+it possible to migrate piecemeal to EDI attributes.  For the initial roll
+out of this new features, no accounts will be configured to use EDI 
+attributes by default.  
+
+
+
+
+
+3 Day Courtesy Notice by SMS
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+New optional SMS text notification to be sent out 3 days prior to the due
+date of any circulating item for patrons who have an SMS text number and
+carrier stored in their accounts. This action trigger is disabled by default,
+but can be enabled and modified by going into Admin > Local Administration >
+Notifications / Action Triggers.
+
+You may wish to make use of granularity so that these messages are batched
+and sent at the same time each day.
+
+
+
+
+Add Description Field to Circulation and Hold Configuration Entries
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The circulation and hold policy configuration rules now each have a
+description field. This allows administrators to add comments to
+describe the purpose of each rule.
+
+
+
+
+Apache Internal Port Configuration Option
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Apache configuration now supports a new variable which allows admins to
+specify the port used by Apache to handle HTTP traffic.  The value is
+used for HTTP requests routed from Perl handlers back to the same Apache
+instance, like added content requests.  Use this when running Apache
+with a non-standard port, typical with a proxy setup.  Defaults to "80".
+
+[source,conf]
+-------------------------------------------------------------------
+<Location /eg>
+    ...
+    PerlSetVar OILSWebInternalHTTPPort "7080"
+    ...
+</Location>
+-------------------------------------------------------------------
+
+
+
+
+Configurable Bib Record Display Fields
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Admin -> Server Admin -> 'MARC Search/Facet Fields' have 2 new configuration 
+fields: 'Display Field?' and 'Display XPATH'.
+
+When 'Display Field' is set to true, data from the field will be extracted
+from each record and added to a new table of display data for each bib 
+record.  
+
+If a value is present in the 'Display XPATH' field, this XPATH will be
+applied to the extracted data *after* the base XPATH (from the 'XPath' 
+field) is applied to each field.
+
+This data acts as a replacement for the various and sundry ways bib record 
+data is currently extracted, including inline XPATH in the TPAC, reporter 
+views, real-time 'MVR' compilation from MODS, etc. and will be available
+to the user interface, notification templates, etc. for rendering bib 
+records.  
+
+The browser client gets a new service 'egBibDisplay' which is capable
+of translating the display field data from various formats into 
+data more suitable for JavaScript usage.
+
+The database gets 3 new VIEWs for representing display data in various
+formats:
+
+ * metabib.flat_display_entry
+  ** List of all display fields linked to their configuration.
+ * metabib.compressed_display_entry
+  ** Same as metabib.flat_display_entry except there's one row
+     per display field type, which 'mulit' rows compressed into
+     JSON arrays.  Non-multi fields are represented as JSON 
+     strings/numbers.
+ * metabib.wide_display_entry
+  ** Tabular view of display field data, one column per well-known
+     field.  Values are represented JSON, consistent with 
+     metabib.flat_display_entry.  The view DOE NOT CONTAIN locally
+     configured dispaly fields, as each field must be encoded in
+     the view and IDL definition.  This is essentially a replacement 
+     for reporter.simple_record.
+
+Reingesting
++++++++++++
+
+After making changes to display field configuration, it's possible to 
+reingest only display field data in the database using the following:
+
+[source,sql]
+---------------------------------------------------------------------
+SELECT metabib.reingest_metabib_field_entries(id, TRUE, FALSE, TRUE, TRUE, 
+  (SELECT ARRAY_AGG(id)::INT[] FROM config.metabib_field WHERE display_field))
+  FROM biblio.record_entry WHERE NOT deleted AND id > 0;
+---------------------------------------------------------------------
+
+
+
+
+
+Fix COPY_STATUS_LONGOVERDUE.override Permission Typo
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The existing permission was incorrectly created with a code of
+COPY_STATUS_LONGOVERDUE.override, while the event thrown requires a
+permission with a code of COPY_STATUS_LONG_OVERDUE.override.  This
+update changes the permission code to match what the event requires.
+
+
+
+
+
+Hold Targeter V2 Repairs and Improvements
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+* Make the batch targeter more resilient to a single-hold failure.
+* Additional batch targeter info logging.
+* Set OSRF_LOG_CLIENT in hold_targeter_v2.pl for log tracing
+* Removes the confusingly named --target-all option
+ ** The same behavior can be achieved by using --retarget-interval "0s"
+* Removes --skip-viable (see --soft-retarget-interval below)
+
+New --next-check-interval Option
+++++++++++++++++++++++++++++++++
+Specify how long after the current run time the targeter will retarget
+the currently affected holds. Applying a specific interval is useful
+when the retarget-interval is shorter than the time between targeter
+runs.
+
+For example, if the targeter is run nightly at midnight with a
+--retarget-interval 36h, you would set --next-check-interval to 48hr,
+since the holds won't be processed again until 48 hours later. This
+ensures that the org unit closed date checks are looking at the correct
+date. 
+
+This setting overrides the default behavior of calculating the next 
+retarget time from the retarget-interval.
+
+New --soft-retarget-interval Option
++++++++++++++++++++++++++++++++++++
+This is a replacement for (and rebranding of) the --skip-viable option. 
+The new option allows for time-based soft-targeting instead simple binary 
+on/off soft-targeting.
+
+How soft-targeting works:
+* Update hold copy maps for all affected holds
+* Holds with viable targets (on the pull list) are otherwise left alone.
+* Holds without viable targets are retargeted in the usual manner. 
+
+
+
+
+
+New marc_export --descendants option
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The marc_export script has a new option, --descendants.  This option
+takes one argument of an organizational unit shortname.  It works much
+like the existing --library option except that it is aware of the
+org. tree and will export records with holdings at the specified
+organizational unit and all of its decendants.  This is handy if you
+want to export the records for all of the branches of a system.  You
+can do that by specifying this option and the system's shortname,
+instead of specifying multiple --library options for each branch.
+
+The --descendants option can be repeated, as the --library option can.
+All of the specified org. units and their descendants will be included
+in the output.  It can also be combined with individual --library
+options when necessary.
+
+
+
+
+RTL and LTR Public Catalog Stylesheets Merged
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The RTL stylesheet for the public catalog,
+`templates/opac/css/style-rtl.css.tt2`, has been merged into the LTR
+one (`templates/opac/css/style.css.tt2`). The combined stylesheet
+template will emit RTL or LTR styles based on the value of
+the `rtl` flag of the active locale. An `rtl` variable is also available
+in the template to allow the correct style to be chosen.
+
+Upgrade notes
++++++++++++++
+Administrators of Evergreen who use RTL locales and who have customized
+`style-rtl.css.tt2` should now incorporate their customizations into
+`style.css.tt2`.
+
+
+
+
+Miscellaneous Improvements
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+ * If a filter is in effect in the Library Settings Editor,
+   changing the selected library now results in the filter
+   continuing to be applied.
+ * Copy templates used for serials now correct link to age
+   protection rules and MARC item type values (for the
+   "Circ as Type" field). During upgrade, the database update
+   will set to NULL any age protection and circ as type fields
+   in serial copy templates that do not point to defined values.
+
+
+
+
+Obsolete Internal Flag Removed
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+An obsolete, and unused, ingest.disable_metabib_field_entry internal
+flag was removed from the config.internal_flags table.  It was
+rendered obsolete by the addition of the 3 flags to control the
+browse, search, and facet indexing.
+
+
+
+
+Tweaks to Caching/Expiry of Public Catalog Assets
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The default cache expiration time for static assets (e.g.,
+CSS, image, and JavaScript files) in the public catalog and
+the Kid's PAC has been increased to one year. Links to all
+such assets now have a cache-busting value tacked on as a
+query parameter. This value is refreshed when `autogen.sh` is
+run, but it can also be manually set by adjusting the
+`ctx.cache_key` Template Toolkit variable.
+
+
+
+
+Action/Trigger Events Data Purging
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Action/Trigger event definitions have a new field called "Retention 
+Interval".  When an optional interval value is applied, events and
+template output data linked to the event definition will be deleted
+from the database once they reach the specified age.
+
+Retention Interval Restrictions for Passive Hooks
++++++++++++++++++++++++++++++++++++++++++++++++++
+
+Restrictions are placed on retention interval values for event definitions
+using passive hooks to prevent data from being deleted while it's still
+needed by the system.
+
+The presence of event data is how the system knows not to send duplicate
+events.  As long as a scenario exists where a duplicate event may be
+generated, the events must be retained.
+
+To apply a retention interval value to a passive-hook event definition:
+
+ * The event definition must have a max_delay value.
+ * The retention interval must be larger than the difference between
+   the delay and max_delay values.
+
+For example, if the delay is 7 days and max_delay is 10 days, the retention
+interval must be greater than 3 days to ensure no duplicate events are 
+created between the first event on day 7 and the end of the event validity
+window on day 10.
+
+Deployment
+++++++++++
+
+A new purge_at_events.sh script is installed in the bin directory
+(typically /openils/bin) wich should be added to CRON for regular
+maintanence.
+
+NOTE: On large data sets, this script can take a long time to run and
+create higher than normal I/O load as it churns though the event and
+event_output tables.  You may wish to run the script by hand the first
+time so it can be monitored.  It can be run in psql like so:
+
+[source,sql]
+---------------------------------------------------------------
+SELECT action_trigger.purge_events();
+---------------------------------------------------------------
+
+NOTE: On *very* large data sets (10s to 100s of millions of event and
+event_output rows), it may be advisable to first to repopulate the event
+and event_output tables with only the desired data before starting
+regular purges.  This can be done, for example, using the copy to temp
+table, truncate source table, repopulate source table from temp table
+approach.  This will be much faster than the purge_events() function
+in cases where most of the data will be purged.
+
+Hook Data Cleanup
++++++++++++++++++
+
+A number of action_trigger.hook entries which have always been treated
+as active hooks, though are configured as passive hooks, have been 
+updated to properly reflect the non-passive-ness.  This allows for 
+simpler configuration of their retention interval values.
+
+
+
+
+
+Remove JSPAC Redirects
+^^^^^^^^^^^^^^^^^^^^^^
+Future versions of Evergreen will no longer contain automatic redirects
+from JSPAC URLs to TPAC URLs, with the exception of myopac.xml, given
+that the JSPAC is no longer supported.  Existing sites, however, may
+wish to retain JSPAC redirects in their Apache configuration files since
+JSPAC URLs may still be used in the wild to access their catalogs.
+
+The original JSPAC URL redirects are all retained in the file 
+Open-ILS/examples/jspac_redirects.conf for reference.
+
+
+
+
+API
+~~~
+
+
+
+New open-ils.auth.login API
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The open-ils.auth service has a new API for requesting an authentication
+token.  It performs the same steps as the 
+open-ils.auth.authenticate.init and .complete APIs in a single call,
+using the bare password.  No intermediate password hashing is required.
+
+The paramters are the same as the .complete call with a few modifications.
+
+1. Using the generic "identifier" parameter in combination with the
+   "org" parameter allows the API to reliably determine if an identifier
+   value is a username or barcode.  The caller is no longer required to 
+   make that determination up front.  
+
+2. The 'nonce' parameter is no longer used.
+
+Upgrade Notes
++++++++++++++
+
+The new open-ils.auth.login API must be added to the list of <log_protect>
+API's in the opensrf_core.xml file.
+
+Sample diff:
+
+[code,sh]
+---------------------------------------------------------------------
+--- a/Open-ILS/examples/opensrf_core.xml.example
++++ b/Open-ILS/examples/opensrf_core.xml.example
+@@ -180,6 +180,7 @@ Example OpenSRF bootstrap configuration file for Evergreen
+     <log_protect>
+       <match_string>open-ils.auth.authenticate.verify</match_string>
+       <match_string>open-ils.auth.authenticate.complete</match_string>
++      <match_string>open-ils.auth.login</match_string>
+       <match_string>open-ils.auth_proxy.login</match_string>
+       <match_string>open-ils.actor.patron.password_reset.commit</match_string>
+       <match_string>open-ils.actor.user.password</match_string>
+---------------------------------------------------------------------
+
+
+
+
+
+Batch Patron Contact Invalidation
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The following methods are used to mark patron contact fields
+as invalid by moving the invalid value to a standing penalty:
+
+ * `open-ils.actor.invalidate.email`
+ * `open-ils.actor.invalidate.day_phone`
+ * `open-ils.actor.invalidate.evening_phone`
+ * `open-ils.actor.invalidate.other_phone`
+
+These methods now accept a fifth argument specifying the value
+of the contact field, e.g., a specific phone number or email
+address. If supplied, and if a specific patron ID (the first
+argument) is not supplied, all patrons with that specific contact
+value will have it marked invalid.
+
+
+
+
+Architecture
+~~~~~~~~~~~~
+
+
+
+Pure-SQL catalog searching
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+Public and staff catalog search is now both more accurate and faster
+by redesigning how the visibility of records is calculated.
+
+
+
+
+Cataloging
+~~~~~~~~~~
+
+
+
+Authority Record and Headings Browse Improvements
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Various improvements are made to support for authority records
+and headings browsing:
+
+ * The MARC to MADS XSLT stylesheet is now used as part of parsing
+   headings from authority records. Since the MODS and MADS stylesheets
+   extract headings in similar ways, duplicate browse entries are now
+   much less likely to occur.
+ * A new configuration table, `authority.heading_field`, is now used
+   to specify how headings should be extracted from authority records.
+ * Related headings can now be identified as narrower or broader when
+   browsing in the public catalog.
+ * See references are now more reliably included in the browse list.
+ * Scope (public) notes now display only under the main heading.
+ * There is now a global flag, Display related headings (see-also) in browse,
+   that can be used to control whether related headings (see-alsos) are
+   displayed in the public catalog list.
+ * A complete set of thesauruses are now included in the seed data.  Thesauruses
+   can now be identified using short and long codes.
+ * The labels for see and see-also references in the public catalog are now
+   a bit more patron-friendly, and can now be tweaked via TPAC template
+   customization.
+
+
+
+
+
+Copy Tags and Digital Bookplates
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Copy tags will allow staff to apply custom, pre-defined labels or tags
+to copies.  Copy tags are searchable in both the staff client and public
+catalog.  This feature was designed to be used for Digital Bookplates to
+attach donation or memorial information to copies, but may be used for
+broader purposes to tag items.
+
+Each copy tag can either be publicly-visible or visible only to staff.
+Copy tags also have types that can be used for restricting catalog
+searches on copy tags to particular types.
+
+Copy tags are displayed in the copy table in the record summary page in
+the public catalog, and a new library setting can be used to add
+a "Digital Bookplate" search field.  Copy tags can also be used
+as a search filter, e.g.,
+
+  * `copy_tag(bookplate, jane smith)`: search for records that have a
+    copy tag of type `bookplate` whose value contains `jane smith`.
+  * `copy_tag(*, jane smith)`: search for records that have a
+    copy tag of any type whose value contains `jane smith`.
+
+All staff-side interfaces related to copy tags exist only in the web
+staff client.  There are two new administration interfaces for managing
+copy tags and copy tag types. The copy editor now has a `Copy Tags`
+button for applying copy tags to copies; that interface can also be
+used to create new copy tags on the fly. Furthermore, the copy buckets
+interface now has an `Apply Tags` action for assigning tags to groups
+of copies.
+
+Permissions
++++++++++++
+
+Two new permission are included:
+
+  * `ADMIN_COPY_TAG_TYPES`: required to create a new tag type under
+     Server Administration->Copy Tag Types
+  * `ADMIN_COPY_TAG`: required to create a new tag under
+    Local Administration->Copy Tags
+
+The existing permission `UPDATE_COPY` controls whether or not a user
+can link copies to tags.
+
+Library Settings
+++++++++++++++++
+A new library setting, "Enable Digital Bookplate Search", controls
+whether to display a "Digital Bookplate" field in the search index
+drop-downs in the catalog. A "Digital Bookplate" search will include
+all records that have a copy that matches the tag specified by the user.
+It should be noted that this library settings does not affect the
+display of copy tags on the catalog record summary page.
+
+
+
+
+Include Call Number Prefixes and Suffixes in Export and Z39.50 output
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The call number prefix and suffix, when present, are now included in
+subfields $k and $m of the 852 field when running `marc_export` with
+the `--items` switch. Similarly, when using Evergreen as a Z39.50
+server configured to embed item data in 852 fields, the affixes are now
+included in subfields $k and $m.
+
+
+
+
+Circulation
+~~~~~~~~~~~
+
+
+
+Batch Editing of Patron Records
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+There is a now a new interface analogous to the Copy Bucket interface
+to record the selection and grouping of a set of users into a User Bucket.
+The addition of users to a User Bucket is possible from the Patron Search
+interface by the use of a new grid Action, and directly on the User Bucket
+interface by user barcode. It is also possible to add users by uploading
+a text file that contains a list of user barcodes.
+
+From this interface it is possible to perform a set of specific batch update
+operations against users generally.
+
+Editing users
++++++++++++++
+
+The fields can now be changed in batch via an action on the User Bucket
+grid if the staff user has the UPDATE_USER permission:
+
+ * Active flag
+ * Primary Permission Group (group application permissions consulted)
+ * Juvenile flag
+ * Home Library (UPDATE_USER checked against both old and new value)
+ * Privilege Expiration Date
+ * Barred flag (BAR_PATRON permission consulted)
+ * Internet Access Level
+
+Each change set requires a name. Buckets may have multiple change sets. All
+users in the Bucket at the time of processing are updated when the change
+set is processed, and change sets are processed immediately upon successful
+creation. The interface delivers progress information regarding the
+processing stage and percent of completion.
+
+While processing the users, the original value for each field edited is
+recorded for potential future rollback. Users can examine the success and
+failure of applied change sets.
+
+The user will be able to rollback the entire change set, but not parts thereof.
+The rollback will affect only those users that were successfully updated by the
+original change set and may be different from the current set of users in the
+Bucket. Users can manually discard change sets, removing them from the
+interface but preventing future rollback.
+
+As a batch process, rather than a direct edit, this mechanism explicitly skips
+processing of Action/Trigger event definitions for user update.
+
+Deleting users
+++++++++++++++
+
+The batch edit mechanism also allows for the batch deletion of user.  The staff
+user must have both the UPDATE_USER and DELETE_USER permissions.
+
+Each delete set requires a name. Buckets may have multiple delete sets. All
+users in the Bucket at the time of processing are marked as deleted when
+the delete set is processed. The interface delivers progress information
+regarding the processing stage and percent of completion.
+
+While processing the users, the original value for the "deleted" field will be
+recorded for potential future rollback. Users are able to examine the
+success and failure of applied delete sets in the same interface used for the
+above described change sets.
+
+As a batch process, rather than a direct edit, this mechanism explicitly skips
+processing of Action/Trigger event definitions for user deletion.
+
+This mechanism does not use the Purge User functionality, but instead simply
+marks the users as deleted.
+
+Editing Statistical Category Entries
+++++++++++++++++++++++++++++++++++++
+
+All users in the bucket can have their Statistical Category Entries
+modified. Unlike user data field updates, modification of Statistical
+Category Entries is permanent and cannot be rolled back. No named change
+sets are required. The interface will deliver progress information regarding
+the processing stage and percent of completion.
+
+As a batch process, rather than a direct edit, this mechanism explicitly skips
+processing of Action/Trigger event definitions for user update.
+
+New service requirement
++++++++++++++++++++++++
+
+This new functionality makes use of the QStore service, which was previously
+unused in production.  If this service has been removed from the configuration
+of a live Evergreen instances, it will need to be added back in order for
+batch user editing to succeed.
+
+
+
+
+Honor timezone of the acting library
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Summary
++++++++
+
+* Display day-granular due dates in the circulating library's timezone.
+* Only display the date portion of the due date for day-granular circulations.
+* Display the full timestamp, in the client's timezone rather than the circulation library's, for hourly circulations.
+* Provide infrastructure for more advanced formatting of timestamps.
+* Override the built-in AngularJS date filter with an implementation that uses moment.js, providing consistency and better standards compliance.
+
+Upgrade note
+++++++++++++
+
+The following query will adjust all historical, unaged circulations so
+that if their due date field is pushed to the end of the day, it is done
+in the circulating library's time zone, and not the server time zone.
+
+It is safe to run this after any change to library time zones.
+
+Running this is not required, as no code before this change has
+depended on the time string of '23:59:59'.  It is also not necessary
+if all of your libraries are in the same time zone, and that time zone
+is the same as the database's configured time zone.
+
+[source,sql]
+----
+DO $$
+declare
+    new_tz  text;
+    ou_id   int;
+begin
+    for ou_id in select id from actor.org_unit loop
+        for new_tz in select oils_json_to_text(value) from actor.org_unit_ancestor_setting('lib.timezone',ou_id) loop
+            if new_tz is not null then
+                update  action.circulation
+                  set   due_date = (due_date::timestamp || ' ' || new_tz)::timestamptz
+                  where circ_lib = ou_id
+                        and substring((due_date at time zone new_tz)::time::text from 1 for 8) <> '23:59:59';
+            end if;
+        end loop;
+    end loop;
+end;
+$$;
+----
+
+Details
++++++++
+
+This is a followup to the work done in bug 1485374, where we added the ability
+for the client to specify a timezone in which timestamps should be interpreted
+in business logic and the database.
+
+Most specifically, this work focuses on circulation due dates and the closed
+date editor. Due dates, where displayed using stock templates (including
+receipt templates) and used for fine calculation, are now manipulated in the
+library's configured timezone. This is controlled by the new 'lib.timezone'
+YAOUS, loaded from the server when required. Additionally, closings are
+recorded in the library's timezone so that so that due date calculation is more
+accurate. The closed date editor is also taught how to display closings in the
+closed library's timezone. Closed date entries also explicitly record if they
+are a full day closing, or a multi-day closing. This significantly simplifies
+the editor, and may be useful in other contexts.
+
+To accomplish this, we use the moment.js library and the moment-timezone addon.
+This is necessary because the stock AngularJS date filter does not understand
+locale-aware timezone values, which are required to support DST. A simple
+mapper translates the differences in format values from AngularJS date to
+moment.js.
+
+Of special note are a set of new filters used for formatting timestamps under
+certain circumstances. The new egOrgDateInContext, egOrgDate, and egDueDate
+filters provide the functionality, and autogrid is enhanced to make use of
+these where applicable. egGrid and egGridField are also taught to accept
+default and field-specific options for applying date filters. These filters may
+be useful in other or related contexts.
+
+The egDueDate filter, used for all existing displays of due date via Angular
+code, intentionally interprets timestamps in two different ways WRT timezone,
+based on the circulation duration. If the duration is day-granular (that is,
+the number of seconds in the duration is divisible by 86,400, or 24 hours worth
+of seconds) then the date is interpreted as being in the circulation library's
+timezone. If it is an hourly loan (any duration that does not meet the
+day-granular criterium) then it is instead displayed in the client's timezone,
+just as all other timestamps currently are, because of the work in 1485374.
+
+The OPAC is adjusted to always display the due date in the circulating
+library's timezone. Because the OPAC displays only the date portion of the due
+date field, this difference is currently considered acceptable. If this proves
+to be a problem in the future, a minor adjustment can be made to match the
+egDueDate filter logic.
+
+Now that due dates are globally stored in the configured timezone of the
+circulating library, the automatic adjustment to day-granular due dates needs
+to take those timezones into account.
+
+An optional SQL command is provided by the upgrade script to retroactively
+adjust existing due dates after library configuration is complete.
+
+This work, as with 1485374, was funded by SITKA, and we thank them for their
+partnership in making this happen!
+
+
+
+
+
+Enhancements to Hard Due Date Functionality
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+It will now be possible to delete Hard Due Date Values for dates that have
+passed. Also, the Hard Due Date updater will no longer change Ceiling Dates
+to a past date. This allows editing Ceiling Dates directly in a Hard Due Date
+as well as scheduling Ceiling Date changes via Hard Due Date Values.
+
+
+
+
+Patron Search by Birth Date
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+* Now you can include the patron birth year and/or birth month and/or
+  birth day when searching for patrons using the web based staff client.
+* Day and month values are exact matches.  E.g. month "1" (or "01")
+  matches January, "12" matches December.
+* Year searches are "contains" searches.  E.g. year "15" matches 2015,
+  1915, 1599, etc.  For exact matches use the full 4-digit year.
+
+
+
+Patron Search from Place Hold
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Patron Search from Place Hold allows staff members, when placing a
+hold on behalf of a patron in the web staff client, to search for
+patrons by names and other searchable patron information, rather than
+relying on barcode alone. In particular, after performing a catalog
+search or going to a specific bib record and clicking the 'Place Hold'
+button, the form now includes a 'Patron Search' button. This button
+will open a dialog allowing the staff member search for and select
+a patron record.
+
+
+
+
+Retrieve Recent Patrons 
+^^^^^^^^^^^^^^^^^^^^^^^
+
+Adds a new library setting 'Number of Retrievable Recent Patrons' 
+('ui.staff.max_recent_patrons') that specifies the number of recently
+retrieved patrons that can be re-fetched from the staff client.
+
+A value of 0 means no recent patrons can be retrieved.
+A value greater than 1 means staff will be able to retrive multiple
+recent patrons via a new Circulation 'Retrieve Recent Patrons' menu entry.
+
+The default value is 1 for backwards compatibility.
+
+
+
+
+
+
+Fuller title in XUL client Simplified Pull List
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The Simplified Pull List in the XUL client will now display subfields n and
+p in the title field. The addition will make it easier for staff to distinguish
+between different parts or seasons in a series.
+
+
+
+
+
+Transit Cancel Time and Terminology Change
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Transit Cancel Time
++++++++++++++++++++
+
+Previously, Evergreen deleted canceled (aborted) transits from the database.  Now
+the rows in action.transit_copy, action.hold_transit_copy, and action.reservation_transit_copy
+are preserved in the database, though still not visible to the end user in the staff client.
+This allows for better tracking of when transits are canceled for the purposes of knowing
+which staff member canceled the transit, etc.
+
+NOTE: This change may require the re-creation of transit reports to filter out canceled
+transits from the results.  Cloning the template and adding a Base Filter of Cancel Time 
+Is NULL will suffice.
+
+"Canceled Transit" Terminology Change
++++++++++++++++++++++++++++++++++++++
+
+The term "abort" has been replaced with "cancel" in all of the affected user interfaces.
+For internal continuity, however, the following permission codes have not changed:
+
+ * ABORT_TRANSIT
+ * ABORT_REMOTE_TRANSIT
+ * ABORT_TRANSIT_ON_LOST
+ * ABORT_TRANSIT_ON_MISSING
+
+
+
+
+Client
+~~~~~~
+
+
+
+Add Circ Modifier to Record Detail Page in Staff TPAC
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The circ_modifier field is added to the copy table to make
+more information available to staff without having to open
+the Holdings Maintenance view.
+
+
+
+
+
+Date+Time Format Settings for Web Client
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+This change deprecates the existing Format Dates and Format Times settings
+and adds two settings for use with the webstaff client:
+
+  * Format Dates with this pattern
+  * Format Date+Time with this pattern
+
+These settings use format strings as documented here:
+
+https://docs.angularjs.org/api/ng/filter/date
+
+There is overlap with how the Dojo formats worked, but also some differences.
+
+The original Format Dates and Format Times settings worked together, but the
+new settings work independently.  Certain field elements will use one, and
+certain field elements will use the other.  These distinctions are hard-coded
+in the various UI templates, with the idea being that timestamp fields in
+which the date component alone is sufficient information (for example, DOB)
+will use the Format Dates setting.  Fields where the time component is
+important (for example, Checkout Time) will use the Format Date+Time setting.
+
+When the settings Format Dates and Format Date+Time are unset, we will default
+to "shortDate" (M/d/yy) and "short" (M/d/yy h:mm a), respectively.
+
+
+
+
+
+Global option to remove sound for a specific event
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+A new nosound.wav file has been added to the web client. The file can be used
+to globally disable audio alerts for a specific event on an Evergreen system.
+
+For example, to silence the alert that sounds after a successful patron search:
+
+  * mkdir -p /openils/var/web/audio/notifications/success/patron/
+  * cd /openils/var/web/audio/notifications/success/patron/
+  * ln -s ../../nosound.wav by_search.wav
+
+
+
+
+
+OPAC
+~~~~
+
+
+
+Improvements to Bill Payment Pages
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The bill payment pages in the public catalog have been revamped
+to
+
+ * use "charges" instead of "fees"
+ * include images of credit cards accepted
+ * make the print receipt template match other itemized receipts;
+   note that this change is not automatically applied when upgrading.
+ * display billing type
+ * add button to pay just selected charges
+ * reformat the page for inputting the credit card number
+
+
+
+
+Clickable Copy Locations
+^^^^^^^^^^^^^^^^^^^^^^^^
+Adds a url field to the copy locations editor. When a url is entered in this field, 
+the associated copy location will display as a link in the opac summary display.
+
+
+
+
+Download Checkout History CSV Fixed for Large Number of Circulations
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Downloading checkout history as a CSV from My Account has been fixed
+for users with a large circulation history.  Previously, this would
+time out for patrons with more than 100 or so circulations.
+
+This feature no longer uses the action/trigger mechanism and the OPAC
+now generates the CSV directly.  The old action/trigger code is still
+present in the database and should be removed at some point in the
+near future.
+
+
+
+
+Google Books Preview rewrite
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The Google Books Preview functionality in record detail pages has been
+rewritten to modernize its style and optimize its performance:
+
+* The Dojo JavaScript framework is no longer used, saving approximately
+  150K of JavaScript and CSS and four network requests per page load.
+* The Embedded Viewer is not loaded unless a possible preview is found,
+  saving more network and memory overhead.
+* The Google Books Loader is used to load the Embedded Viewer instead of the
+  https://productforums.google.com/forum/#!topic/books-api/lZrq5cWKrTo;context-place=forum/books-api[deprecated
+  Google Loader].
+* All variables are self-contained and do not pollute the global namespace.
+* Event listeners are registered to handle clicks, rather than attaching
+  `href="javascript:function()"` to <a> elements.
+* Book previews are displayed in a panel sized according to the viewport
+  of the browser, improving its appearance on both mobile and desktop
+  browsers.
+* The rewritten code is now served up directly from
+  `/js/ui/default/opac/ac_google_books.js` rather than as a TT2 template.
+
+
+
+
+jQuery for the TPAC
+^^^^^^^^^^^^^^^^^^^
+This release adds optional support for jQuery in the TPAC.  This support
+enabled by setting the ctx.want_jquery variable to a true value in the
+config.tt2 TPAC template.
+
+
+
+
+
+New Popularity Parameter
+^^^^^^^^^^^^^^^^^^^^^^^^
+New popularity parameters for in-house use over time and for count of distinct
+organizational units that own a title are now available. Evergreen sites
+can use these parameters to create new statistical popularity badges for
+sorting in the catalog by Most Popular or by Popularity-Adjusted Relevance.
+
+The in-house use parameters will apply a badge to titles that have the most
+in-house use activity over time. The organizational unit count parameter
+will apply a badge to titles owned by the most number of libraries in a
+consortium. Ownership is determined by the copy's circulation library.
+
+
+
+
+Option to Suspend Holds at the Time They are Placed
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Users now have the option to suspend a hold at the same time they place the
+hold. The _Place Hold_ screen has a checkbox that can be enabled for users
+who want to suspend a hold at the time it is placed. There is also an option
+to set the activation date at the same time. This option is also available
+when placing holds on a batch of titles from _My List_ and will apply to
+all the titles in the batch.
+
+
+
+
+
+Reports
+~~~~~~~
+
+
+
+Fix to reporter.classic_current_circ view
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The `reporter.classic_current_circ` view, which is part of some
+extra views defined in `Open-ILS/src/sql/Pg/example.reporter-extension.sql`,
+has been fixed to not exclude loans for patrons who do not have a
+billing address set. Users of this view should rerun
+`Open-ILS/src/sql/Pg/example.reporter-extension.sql` during upgrade.
+
+
+
+
+New report source table allowing report of "last" deleted copy
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+This source table allows you to construct a clever aggregate report template
+which will report bibliographic ID's where a library or a group of libraries 
+no longer have a copy attached but had* a copy attached. This is especially
+useful when a holdings sync is required with an external vendor.
+
+
+Instructions for creating the report template:
+  * Create a new report template using the "Library Holdings Count with Deleted" as the source
+  * Add "Has Only Deleted Copies 0/1" (Min) to the Aggregate Filters -> Change Value to "1"
+  * Add "Last Edit Date" (Max) to Aggregate Filters -> Change Operator to "Between"
+  * Add Circulation Library -> "Organizational Unit ID" Raw Data to Base Filters -> Change Operator to "In list"
+  * Add "Bib ID" to Displayed Fields
+  * Add "Last Edit Date" to Displayed Fields and Change Transform to Max
+  * Add "Has Only Deleted Copies 0/1" to Displayed Fields and Change Transform to Min
+  * Add "Total copies attached" to Displayed Fields and Change Transform to Sum
+
+
+This template will only output bibliographic ID's where all of the copies for the specified branch(es)
+are deleted. Furthermore, it will only output bibs whose copies were edited (deleted) during the 
+specified date range. Unfortunatly the user will have to manually type the date range without the date
+picker. This view will also allow you to answer questions like "Show me bibs where I have one visible
+copy and more than two deleted copies."
+
+
+
+
+Add Provider to Provider Note link
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The Provider reporting source now includes a link to Provider Note.
+
+
+
+
+Link ILS User and Working Location Reporting Sources
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The Working Location reporting source now has labels
+and it is now linked to the ILS User reporting source, allowing
+reports to display or filter on staff working location.
+
+
+
+
+New circulation report source "All Circulation Combined Types"
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+This report source will allow you to create a single report template for all of the following:
+  * In House
+  * In House Non Cat
+  * Circulation (standard)
+  * Non Cat Circulation
+
+These columns are important to display:
+  * Item Type
+  * Circulation Type
+
+
+
+
+Reports Template Searching
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+A new form appears along the top of the reports interface for searching
+report templates.  Once found, typical template actions (e.g. create new
+report) are available from within the results interface.
+
+Searches may be performed across selected (visible) folders or all 
+folders visible to the logged in user.
+
+Searches are case-insensitive, any word order, with left-anchored words.  
+All searched words must appear in at least one of the searched fields.
+
+Examples
+++++++++
+
+ * Searching for 'stat cat' matches:
+  ** stat cat
+  ** statistical category
+  ** categories, statistical
+  ** patrons (stat cat)
+ * Searching for 'stat cat' does not match:
+  ** stat 
+   *** both words must be present in the searched field(s)
+  ** stat location
+    *** location contains 'cat' but it's not left-anchored.
+
+Reporter Paging
++++++++++++++++
+
+The templates, reports, and output interfaces now support paging via 
+new 'Next', 'Prev', and 'Start' links next to the output limit selector.
+
+
+
+
+
+
+Serials
+~~~~~~~
+
+
+
+Web Staff Client Serials Module
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The serials module has been ported over to the web staff
+client, implementing a unified serials interface that combines
+ideas from both the serial control view and alternate serials
+control view from the old staff client.
+
+In addition to carrying over functionality that was available
+in the old staff client, several new features are included:
+
+* the ability to save prediction pattern codes as templates
+  that can be shared and reused within an Evergreen database
+* a more streamlined interface for managing subscriptions,
+  distributions, and streams
+* it is no longer necessary to create a starting issue in
+  order to predict a run of issues; the dialog box for
+  generating a set of predicted issues now lets you specify
+  the starting point directly.
+* the ability to more directly edit MFHDs
+    
+The new serials interfaces can be accessed from the record
+details page via a Serials drop-down button that links to
+a subscription management page, a quick-receive action, and
+a MFHD management page. There is also a new Serials Administration
+page where prediction pattern and serial copy templates can
+be managed.
+
+
+
+
+SIP
+~~~
+
+
+
+SIP Bugfix Requires SIPServer Upgrade
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The fix for Launchpad Bug 1542495: "OpenILS::SIP::clean_text() can
+crash" requires that you also upgrade SIPServer with the fix for
+Launchpad Bug 1463943: "Non-ascii Unicode characters in messages cause
+SIP client problems."  This means that if you use SIP2 with Evergreen,
+you must also upgrade SIPServer to the latest commit in the git
+repository.  Conversely, if you upgrade SIPServer to the latest commit
+in git, you must also upgrade Evergreen or, at least, apply the patch
+for Launchpad Bug 1542495.  These two patches are complementary and
+cannot be applied independently of one another.
+
+SIP Bugfix Changes How Encoding Is Determined in Configuration
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The combined fix for the above mentioned SIP bugs alters the way that
+the output encoding is looked up in the configuration file (typically
+oils_sip.xml).  SIPServer now looks for the encoding in the following
+places:
+
+1. An +encoding+ attribute on the +account+ element for the currently active SIP account.
+2. The +encoding+ element that is a child of the +insitution+ element of the currently acctive SIP account.
+3. The +encoding+ element that is a child of the +implementation_config+ element that is itself a child of the +insitution+ element of the currently acctive SIP account.
+4. If none of the above exist, then ASCII encoding is used by default.
+
+Number 3 is provided to ease the transition to the new code.  It is
+the current location of the +encoding+ element in the sample
+configuration file and as such, where it is likely to be found in
+actual files.  It is recommended that you alter your configuration to
+move this element out of the +implementation_config+ element and into
+its parent +institution+ element.  SIPServer should *not* look into
+the implementation config, and this check may be removed at some time
+in the future.
+
+
+Acknowledgments
+---------------
+The Evergreen project would like to acknowledge the following
+organizations that commissioned developments in this release of
+Evergreen:
+
+TODO
+
+We would also like to thank the following individuals who contributed
+code, translations, documentations patches and tests to this release of
+Evergreen:
+
+TODO
+
+
+We also thank the following organizations whose employees contributed
+patches:
+
+TODO
+
+We regret any omissions.  If a contributor has been inadvertently
+missed, please open a bug at http://bugs.launchpad.net/evergreen/
+with a correction.
+

commit b045032fa1d9f5625bf22e33a8ee82b3a89c72c1
Author: Mike Rylander <mrylander at gmail.com>
Date:   Tue Sep 5 15:53:08 2017 -0400

    Incorporate view update from LP#1714589
    
    Signed-off-by: Mike Rylander <mrylander at gmail.com>

diff --git a/Open-ILS/src/sql/Pg/version-upgrade/2.12.5-3.0-beta1-upgrade-db.sql b/Open-ILS/src/sql/Pg/version-upgrade/2.12.5-3.0-beta1-upgrade-db.sql
index 7a84377..0da1859 100644
--- a/Open-ILS/src/sql/Pg/version-upgrade/2.12.5-3.0-beta1-upgrade-db.sql
+++ b/Open-ILS/src/sql/Pg/version-upgrade/2.12.5-3.0-beta1-upgrade-db.sql
@@ -728,12 +728,43 @@ CREATE OR REPLACE FUNCTION permission.usr_perms ( INT ) RETURNS SETOF permission
 	  ORDER BY 2, 3, 4 ASC, 5 DESC ;
 $$ LANGUAGE SQL STABLE ROWS 10;
 
-/* XXX See LP 1714589 for a likely revision to this view definition XXX */
-
 SELECT evergreen.upgrade_deps_block_check('1051', :eg_version);
 
 CREATE OR REPLACE VIEW action.all_circulation_slim AS
-    SELECT * FROM action.circulation
+    SELECT
+        id,
+        usr,
+        xact_start,
+        xact_finish,
+        unrecovered,
+        target_copy,
+        circ_lib,
+        circ_staff,
+        checkin_staff,
+        checkin_lib,
+        renewal_remaining,
+        grace_period,
+        due_date,
+        stop_fines_time,
+        checkin_time,
+        create_time,
+        duration,
+        fine_interval,
+        recurring_fine,
+        max_fine,
+        phone_renewal,
+        desk_renewal,
+        opac_renewal,
+        duration_rule,
+        recurring_fine_rule,
+        max_fine_rule,
+        stop_fines,
+        workstation,
+        checkin_workstation,
+        copy_location,
+        checkin_scan_time,
+        parent_circ
+    FROM action.circulation
 UNION ALL
     SELECT
         id,

commit 829a0f240f82b183401234af56f5572e210fa1c6
Author: Mike Rylander <mrylander at gmail.com>
Date:   Tue Sep 5 14:33:30 2017 -0400

    Proposed 2.12.5-3.0 upgrade SQL
    
    Signed-off-by: Mike Rylander <mrylander at gmail.com>

diff --git a/Open-ILS/src/sql/Pg/version-upgrade/2.12.5-3.0-beta1-upgrade-db.sql b/Open-ILS/src/sql/Pg/version-upgrade/2.12.5-3.0-beta1-upgrade-db.sql
new file mode 100644
index 0000000..7a84377
--- /dev/null
+++ b/Open-ILS/src/sql/Pg/version-upgrade/2.12.5-3.0-beta1-upgrade-db.sql
@@ -0,0 +1,6895 @@
+--Upgrade Script for 2.12.5 to 3.0-beta1
+\set eg_version '''3.0-beta1'''
+BEGIN;
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('3.0-beta1', :eg_version);
+
+SELECT evergreen.upgrade_deps_block_check('1032', :eg_version); -- Bmagic/csharp/gmcharlt
+
+CREATE OR REPLACE VIEW action.all_circulation_combined_types AS 
+ SELECT acirc.id AS id,
+    acirc.xact_start,
+    acirc.circ_lib,
+    acirc.circ_staff,
+    acirc.create_time,
+    ac_acirc.circ_modifier AS item_type,
+    'regular_circ'::text AS circ_type
+   FROM action.circulation acirc,
+    asset.copy ac_acirc
+  WHERE acirc.target_copy = ac_acirc.id
+UNION ALL
+ SELECT ancc.id::BIGINT AS id,
+    ancc.circ_time AS xact_start,
+    ancc.circ_lib,
+    ancc.staff AS circ_staff,
+    ancc.circ_time AS create_time,
+    cnct_ancc.name AS item_type,
+    'non-cat_circ'::text AS circ_type
+   FROM action.non_cataloged_circulation ancc,
+    config.non_cataloged_type cnct_ancc
+  WHERE ancc.item_type = cnct_ancc.id
+UNION ALL
+ SELECT aihu.id::BIGINT AS id,
+    aihu.use_time AS xact_start,
+    aihu.org_unit AS circ_lib,
+    aihu.staff AS circ_staff,
+    aihu.use_time AS create_time,
+    ac_aihu.circ_modifier AS item_type,
+    'in-house_use'::text AS circ_type
+   FROM action.in_house_use aihu,
+    asset.copy ac_aihu
+  WHERE aihu.item = ac_aihu.id
+UNION ALL
+ SELECT ancihu.id::BIGINT AS id,
+    ancihu.use_time AS xact_start,
+    ancihu.org_unit AS circ_lib,
+    ancihu.staff AS circ_staff,
+    ancihu.use_time AS create_time,
+    cnct_ancihu.name AS item_type,
+    'non-cat_circ'::text AS circ_type
+   FROM action.non_cat_in_house_use ancihu,
+    config.non_cataloged_type cnct_ancihu
+  WHERE ancihu.item_type = cnct_ancihu.id
+UNION ALL
+ SELECT aacirc.id AS id,
+    aacirc.xact_start,
+    aacirc.circ_lib,
+    aacirc.circ_staff,
+    aacirc.create_time,
+    ac_aacirc.circ_modifier AS item_type,
+    'aged_circ'::text AS circ_type
+   FROM action.aged_circulation aacirc,
+    asset.copy ac_aacirc
+  WHERE aacirc.target_copy = ac_aacirc.id;
+
+
+SELECT evergreen.upgrade_deps_block_check('1034', :eg_version);
+
+ALTER TABLE config.hold_matrix_matchpoint
+    ADD COLUMN description TEXT;
+
+ALTER TABLE config.circ_matrix_matchpoint
+    ADD COLUMN description TEXT;
+
+
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('1035', :eg_version); -- dyrcona/gmcharlt
+
+-- Per Lp bug 1684984, the config.internal_flag,
+-- ingest.disable_metabib_field_entry, was made obsolete by the
+-- addition of the ingest.skip_browse_indexing,
+-- ingest.skip_search_indexing, and ingest.skip_facet_indexing flags.
+-- Since it is not used in the database, we delete it.
+DELETE FROM config.internal_flag
+WHERE name = 'ingest.disable_metabib_field_entry';
+
+
+SELECT evergreen.upgrade_deps_block_check('1036', :eg_version);
+
+CREATE OR REPLACE FUNCTION config.update_hard_due_dates () RETURNS INT AS $func$
+DECLARE
+    temp_value  config.hard_due_date_values%ROWTYPE;
+    updated     INT := 0;
+BEGIN
+    FOR temp_value IN
+      SELECT  DISTINCT ON (hard_due_date) *
+        FROM  config.hard_due_date_values
+        WHERE active_date <= NOW() -- We've passed (or are at) the rollover time
+        ORDER BY hard_due_date, active_date DESC -- Latest (nearest to us) active time
+   LOOP
+        UPDATE  config.hard_due_date
+          SET   ceiling_date = temp_value.ceiling_date
+          WHERE id = temp_value.hard_due_date
+                AND ceiling_date <> temp_value.ceiling_date -- Time is equal if we've already updated the chdd
+                AND temp_value.ceiling_date >= NOW(); -- Don't update ceiling dates to the past
+
+        IF FOUND THEN
+            updated := updated + 1;
+        END IF;
+    END LOOP;
+
+    RETURN updated;
+END;
+$func$ LANGUAGE plpgsql;
+
+
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('1041', :eg_version); -- stompro/csharp/gmcharlt
+
+--delete all instances from permission.grp_perm_map first
+DELETE FROM permission.grp_perm_map where perm in 
+(select id from permission.perm_list where code='SET_CIRC_MISSING');
+
+--delete all instances from permission.usr_perm_map too
+DELETE FROM permission.usr_perm_map where perm in
+(select id from permission.perm_list where code='SET_CIRC_MISSING');
+
+--delete from permission.perm_list
+DELETE FROM permission.perm_list where code='SET_CIRC_MISSING';
+
+
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('1042', :eg_version); -- mmorgan/gmcharlt
+
+ALTER TABLE asset.copy_location
+          ADD COLUMN url TEXT;
+
+
+SELECT evergreen.upgrade_deps_block_check('1043', :eg_version);
+
+ALTER TABLE action_trigger.event_definition
+    ADD COLUMN retention_interval INTERVAL;
+
+CREATE OR REPLACE FUNCTION action_trigger.check_valid_retention_interval() 
+    RETURNS TRIGGER AS $_$
+BEGIN
+
+    /*
+     * 1. Retention intervals are alwyas allowed on active hooks.
+     * 2. On passive hooks, retention intervals are only allowed
+     *    when the event definition has a max_delay value and the
+     *    retention_interval value is greater than the difference 
+     *    beteween the delay and max_delay values.
+     */ 
+    PERFORM TRUE FROM action_trigger.hook 
+        WHERE key = NEW.hook AND NOT passive;
+
+    IF FOUND THEN
+        RETURN NEW;
+    END IF;
+
+    IF NEW.max_delay IS NOT NULL THEN
+        IF EXTRACT(EPOCH FROM NEW.retention_interval) > 
+            ABS(EXTRACT(EPOCH FROM (NEW.max_delay - NEW.delay))) THEN
+            RETURN NEW; -- all good
+        ELSE
+            RAISE EXCEPTION 'retention_interval is too short';
+        END IF;
+    ELSE
+        RAISE EXCEPTION 'retention_interval requires max_delay';
+    END IF;
+END;
+$_$ LANGUAGE PLPGSQL;
+
+CREATE TRIGGER is_valid_retention_interval 
+    BEFORE INSERT OR UPDATE ON action_trigger.event_definition
+    FOR EACH ROW WHEN (NEW.retention_interval IS NOT NULL)
+    EXECUTE PROCEDURE action_trigger.check_valid_retention_interval();
+
+CREATE OR REPLACE FUNCTION action_trigger.purge_events() RETURNS VOID AS $_$
+/**
+  * Deleting expired events without simultaneously deleting their outputs
+  * creates orphaned outputs.  Deleting their outputs and all of the events 
+  * linking back to them, plus any outputs those events link to is messy and 
+  * inefficient.  It's simpler to handle them in 2 sweeping steps.
+  *
+  * 1. Delete expired events.
+  * 2. Delete orphaned event outputs.
+  *
+  * This has the added benefit of removing outputs that may have been
+  * orphaned by some other process.  Such outputs are not usuable by
+  * the system.
+  *
+  * This does not guarantee that all events within an event group are
+  * purged at the same time.  In such cases, the remaining events will
+  * be purged with the next instance of the purge (or soon thereafter).
+  * This is another nod toward efficiency over completeness of old 
+  * data that's circling the bit bucket anyway.
+  */
+BEGIN
+
+    DELETE FROM action_trigger.event WHERE id IN (
+        SELECT evt.id
+        FROM action_trigger.event evt
+        JOIN action_trigger.event_definition def ON (def.id = evt.event_def)
+        WHERE def.retention_interval IS NOT NULL 
+            AND evt.state <> 'pending'
+            AND evt.update_time < (NOW() - def.retention_interval)
+    );
+
+    WITH linked_outputs AS (
+        SELECT templates.id AS id FROM (
+            SELECT DISTINCT(template_output) AS id
+                FROM action_trigger.event WHERE template_output IS NOT NULL
+            UNION
+            SELECT DISTINCT(error_output) AS id
+                FROM action_trigger.event WHERE error_output IS NOT NULL
+            UNION
+            SELECT DISTINCT(async_output) AS id
+                FROM action_trigger.event WHERE async_output IS NOT NULL
+        ) templates
+    ) DELETE FROM action_trigger.event_output
+        WHERE id NOT IN (SELECT id FROM linked_outputs);
+
+END;
+$_$ LANGUAGE PLPGSQL;
+
+
+/* -- UNDO --
+
+DROP FUNCTION IF EXISTS action_trigger.purge_events();
+DROP TRIGGER IF EXISTS is_valid_retention_interval ON action_trigger.event_definition;
+DROP FUNCTION IF EXISTS action_trigger.check_valid_retention_interval();
+ALTER TABLE action_trigger.event_definition DROP COLUMN retention_interval;
+
+*/
+
+
+
+SELECT evergreen.upgrade_deps_block_check('1044', :eg_version);
+
+UPDATE action_trigger.hook SET passive = FALSE WHERE key IN (
+    'format.po.html',
+    'format.po.pdf',
+    'format.selfcheck.checkout',
+    'format.selfcheck.items_out',
+    'format.selfcheck.holds',
+    'format.selfcheck.fines',
+    'format.acqcle.html',
+    'format.acqinv.html',
+    'format.acqli.html',
+    'aur.ordered',
+    'aur.received',
+    'aur.cancelled',
+    'aur.created',
+    'aur.rejected'
+);
+
+
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('1045', :eg_version); -- csharp/berick/gmcharlt
+
+ALTER TABLE action.transit_copy
+	ADD COLUMN cancel_time TIMESTAMPTZ;
+
+-- change "abort" to "cancel" in stock perm descriptions
+UPDATE permission.perm_list 
+	SET description = 'Allow a user to cancel a copy transit if the user is at the transit destination or source' 
+	WHERE code = 'ABORT_TRANSIT'
+	AND description = 'Allow a user to abort a copy transit if the user is at the transit destination or source';
+UPDATE permission.perm_list 
+	SET description = 'Allow a user to cancel a copy transit if the user is not at the transit source or dest' 
+	WHERE code = 'ABORT_REMOTE_TRANSIT'
+	AND description = 'Allow a user to abort a copy transit if the user is not at the transit source or dest';
+UPDATE permission.perm_list 
+	SET description = 'Allows a user to cancel a transit on a copy with status of LOST' 
+	WHERE code = 'ABORT_TRANSIT_ON_LOST'
+	AND description = 'Allows a user to abort a transit on a copy with status of LOST';
+UPDATE permission.perm_list 
+	SET description = 'Allows a user to cancel a transit on a copy with status of MISSING' 
+	WHERE code = 'ABORT_TRANSIT_ON_MISSING'
+	AND description = 'Allows a user to abort a transit on a copy with status of MISSING';
+
+SELECT evergreen.upgrade_deps_block_check('1046', :eg_version); -- phasefx/berick/gmcharlt
+
+INSERT into config.org_unit_setting_type (
+     name
+    ,grp
+    ,label
+    ,description
+    ,datatype
+) VALUES ( ----------------------------------------
+     'webstaff.format.dates'
+    ,'gui'
+    ,oils_i18n_gettext(
+         'webstaff.format.dates'
+        ,'Format Dates with this pattern'
+        ,'coust'
+        ,'label'
+    )
+    ,oils_i18n_gettext(
+         'webstaff.format.dates'
+        ,'Format Dates with this pattern (examples: "yyyy-MM-dd" for "2010-04-26", "MMM d, yyyy" for "Apr 26, 2010").  This will be used in areas where a date without a timestamp is sufficient, like Date of Birth.'
+        ,'coust'
+        ,'description'
+    )
+    ,'string'
+), ( ----------------------------------------
+     'webstaff.format.date_and_time'
+    ,'gui'
+    ,oils_i18n_gettext(
+         'webstaff.format.date_and_time'
+        ,'Format Date+Time with this pattern'
+        ,'coust'
+        ,'label'
+    )
+    ,oils_i18n_gettext(
+         'webstaff.format.date_and_time'
+        ,'Format Date+Time with this pattern (examples: "yy-MM-dd h:m:s.SSS a" for "16-04-05 2:07:20.666 PM", "yyyy-dd-MMM HH:mm" for "2016-05-Apr 14:07").  This will be used in areas of the client where a date with a timestamp is needed, like Checkout, Due Date, or Record Created.'
+        ,'coust'
+        ,'description'
+    )
+    ,'string'
+);
+
+UPDATE
+    config.org_unit_setting_type
+SET
+    label = 'Deprecated: ' || label -- FIXME: Is this okay?
+WHERE
+    name IN ('format.date','format.time')
+;
+
+
+SELECT evergreen.upgrade_deps_block_check('1047', :eg_version); -- gmcharlt/stompro
+
+CREATE TABLE config.copy_tag_type (
+    code            TEXT NOT NULL PRIMARY KEY,
+    label           TEXT NOT NULL,
+    owner           INTEGER NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED
+);
+
+CREATE INDEX config_copy_tag_type_owner_idx
+    ON config.copy_tag_type (owner);
+
+CREATE TABLE asset.copy_tag (
+    id              SERIAL PRIMARY KEY,
+    tag_type        TEXT REFERENCES config.copy_tag_type (code)
+                    ON UPDATE CASCADE ON DELETE CASCADE,
+    label           TEXT NOT NULL,
+    value           TEXT NOT NULL,
+    index_vector    tsvector NOT NULL,
+    staff_note      TEXT,
+    pub             BOOLEAN DEFAULT TRUE,
+    owner           INTEGER NOT NULL REFERENCES actor.org_unit (id)
+);
+
+CREATE INDEX asset_copy_tag_label_idx
+    ON asset.copy_tag (label);
+CREATE INDEX asset_copy_tag_label_lower_idx
+    ON asset.copy_tag (evergreen.lowercase(label));
+CREATE INDEX asset_copy_tag_index_vector_idx
+    ON asset.copy_tag
+    USING GIN(index_vector);
+CREATE INDEX asset_copy_tag_tag_type_idx
+    ON asset.copy_tag (tag_type);
+CREATE INDEX asset_copy_tag_owner_idx
+    ON asset.copy_tag (owner);
+
+CREATE OR REPLACE FUNCTION asset.set_copy_tag_value () RETURNS TRIGGER AS $$
+BEGIN
+    IF NEW.value IS NULL THEN
+        NEW.value = NEW.label;        
+    END IF;
+
+    RETURN NEW;
+END;
+$$ LANGUAGE 'plpgsql';
+
+-- name of following trigger chosen to ensure it runs first
+CREATE TRIGGER asset_copy_tag_do_value
+    BEFORE INSERT OR UPDATE ON asset.copy_tag
+    FOR EACH ROW EXECUTE PROCEDURE asset.set_copy_tag_value();
+CREATE TRIGGER asset_copy_tag_fti_trigger
+    BEFORE UPDATE OR INSERT ON asset.copy_tag
+    FOR EACH ROW EXECUTE PROCEDURE oils_tsearch2('default');
+
+CREATE TABLE asset.copy_tag_copy_map (
+    id              BIGSERIAL PRIMARY KEY,
+    copy            BIGINT REFERENCES asset.copy (id)
+                    ON UPDATE CASCADE ON DELETE CASCADE,
+    tag             INTEGER REFERENCES asset.copy_tag (id)
+                    ON UPDATE CASCADE ON DELETE CASCADE
+);
+
+CREATE INDEX asset_copy_tag_copy_map_copy_idx
+    ON asset.copy_tag_copy_map (copy);
+CREATE INDEX asset_copy_tag_copy_map_tag_idx
+    ON asset.copy_tag_copy_map (tag);
+
+INSERT INTO config.copy_tag_type (code, label, owner) VALUES ('bookplate', 'Digital Bookplate', 1);
+
+INSERT INTO permission.perm_list ( id, code, description ) VALUES
+ ( 590, 'ADMIN_COPY_TAG_TYPES', oils_i18n_gettext( 590,
+    'Administer copy tag types', 'ppl', 'description' )),
+ ( 591, 'ADMIN_COPY_TAG', oils_i18n_gettext( 591,
+    'Administer copy tag', 'ppl', 'description' ))
+;
+
+INSERT INTO config.org_unit_setting_type
+    (name, label, description, grp, datatype)
+VALUES (
+    'opac.search.enable_bookplate_search',
+    oils_i18n_gettext(
+        'opac.search.enable_bookplate_search',
+        'Enable Digital Bookplate Search',
+        'coust',
+        'label'
+    ),
+    oils_i18n_gettext(
+        'opac.search.enable_bookplate_search',
+        'If enabled, adds a "Digital Bookplate" option to the query type selectors in the public catalog for search on copy tags.',   
+        'coust',
+        'description'
+    ),
+    'opac',
+    'bool'
+);
+
+
+SELECT evergreen.upgrade_deps_block_check('1048', :eg_version);
+
+INSERT into config.org_unit_setting_type (
+     name
+    ,grp
+    ,label
+    ,description
+    ,datatype
+) VALUES ( ----------------------------------------
+     'webstaff.cat.label.font.family'
+    ,'cat'
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.font.family'
+        ,'Item Print Label Font Family'
+        ,'coust'
+        ,'label'
+    )
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.font.family'
+        ,'Set the preferred font family for item print labels. You can specify a list of CSS fonts, separated by commas, in order of preference; the system will use the first font it finds with a matching name. For example, "Arial, Helvetica, serif"'
+        ,'coust'
+        ,'description'
+    )
+    ,'string'
+), ( ----------------------------------------
+     'webstaff.cat.label.font.size'
+    ,'cat'
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.font.size'
+        ,'Item Print Label Font Size'
+        ,'coust'
+        ,'label'
+    )
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.font.size'
+        ,'Set the default font size for item print labels. Please include a unit of measurement that is valid CSS. For example, "12pt" or "16px" or "1em"'
+        ,'coust'
+        ,'description'
+    )
+    ,'string'
+), ( ----------------------------------------
+     'webstaff.cat.label.font.weight'
+    ,'cat'
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.font.weight'
+        ,'Item Print Label Font Weight'
+        ,'coust'
+        ,'label'
+    )
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.font.weight'
+        ,'Set the default font weight for item print labels. Please use the CSS specification for values for font-weight.  For example, "normal", "bold", "bolder", or "lighter"'
+        ,'coust'
+        ,'description'
+    )
+    ,'string'
+), ( ----------------------------------------
+     'webstaff.cat.label.left_label.left_margin'
+    ,'cat'
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.left_label.left_margin'
+        ,'Item Print Label - Left Margin for Left Label'
+        ,'coust'
+        ,'label'
+    )
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.left_label.left_margin'
+        ,'Set the default left margin for the leftmost item print Label. Please include a unit of measurement that is valid CSS. For example, "1in" or "2.5cm"'
+        ,'coust'
+        ,'description'
+    )
+    ,'string'
+), ( ----------------------------------------
+     'webstaff.cat.label.right_label.left_margin'
+    ,'cat'
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.right_label.left_margin'
+        ,'Item Print Label - Left Margin for Right Label'
+        ,'coust'
+        ,'label'
+    )
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.right_label.left_margin'
+        ,'Set the default left margin for the rightmost item print label (or in other words, the desired space between the two labels). Please include a unit of measurement that is valid CSS. For example, "1in" or "2.5cm"'
+        ,'coust'
+        ,'description'
+    )
+    ,'string'
+), ( ----------------------------------------
+     'webstaff.cat.label.left_label.height'
+    ,'cat'
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.left_label.height'
+        ,'Item Print Label - Height for Left Label'
+        ,'coust'
+        ,'label'
+    )
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.left_label.height'
+        ,'Set the default height for the leftmost item print label. Please include a unit of measurement that is valid CSS. For example, "1in" or "2.5cm"'
+        ,'coust'
+        ,'description'
+    )
+    ,'string'
+), ( ----------------------------------------
+     'webstaff.cat.label.left_label.width'
+    ,'cat'
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.left_label.width'
+        ,'Item Print Label - Width for Left Label'
+        ,'coust'
+        ,'label'
+    )
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.left_label.width'
+        ,'Set the default width for the leftmost item print label. Please include a unit of measurement that is valid CSS. For example, "1in" or "2.5cm"'
+        ,'coust'
+        ,'description'
+    )
+    ,'string'
+), ( ----------------------------------------
+     'webstaff.cat.label.right_label.height'
+    ,'cat'
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.right_label.height'
+        ,'Item Print Label - Height for Right Label'
+        ,'coust'
+        ,'label'
+    )
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.right_label.height'
+        ,'Set the default height for the rightmost item print label. Please include a unit of measurement that is valid CSS. For example, "1in" or "2.5cm"'
+        ,'coust'
+        ,'description'
+    )
+    ,'string'
+), ( ----------------------------------------
+     'webstaff.cat.label.right_label.width'
+    ,'cat'
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.right_label.width'
+        ,'Item Print Label - Width for Right Label'
+        ,'coust'
+        ,'label'
+    )
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.right_label.width'
+        ,'Set the default width for the rightmost item print label. Please include a unit of measurement that is valid CSS. For example, "1in" or "2.5cm"'
+        ,'coust'
+        ,'description'
+    )
+    ,'string'
+), (
+     'webstaff.cat.label.inline_css'
+    ,'cat'
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.inline_css'
+        ,'Item Print Label - Inline CSS'
+        ,'coust'
+        ,'label'
+    )
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.inline_css'
+        ,'This setting allows you to inject arbitrary CSS into the item print label template.  For example, ".printlabel { text-transform: uppercase; }"'
+        ,'coust'
+        ,'description'
+    )
+    ,'string'
+), (
+     'webstaff.cat.label.call_number_wrap_filter_height'
+    ,'cat'
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.call_number_wrap_filter_height'
+        ,'Item Print Label - Call Number Wrap Filter Height'
+        ,'coust'
+        ,'label'
+    )
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.call_number_wrap_filter_height'
+        ,'This setting is used to set the default height (in number of lines) to use for call number wrapping in the left print label.'
+        ,'coust'
+        ,'description'
+    )
+    ,'integer'
+), (
+     'webstaff.cat.label.call_number_wrap_filter_width'
+    ,'cat'
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.call_number_wrap_filter_width'
+        ,'Item Print Label - Call Number Wrap Filter Width'
+        ,'coust'
+        ,'label'
+    )
+    ,oils_i18n_gettext(
+         'webstaff.cat.label.call_number_wrap_filter_width'
+        ,'This setting is used to set the default width (in number of characters) to use for call number wrapping in the left print label.'
+        ,'coust'
+        ,'description'
+    )
+    ,'integer'
+
+
+);
+
+-- for testing, setting removal:
+--DELETE FROM actor.org_unit_setting WHERE name IN (
+--     'webstaff.cat.label.font.family'
+--    ,'webstaff.cat.label.font.size'
+--    ,'webstaff.cat.label.font.weight'
+--    ,'webstaff.cat.label.left_label.height'
+--    ,'webstaff.cat.label.left_label.width'
+--    ,'webstaff.cat.label.left_label.left_margin'
+--    ,'webstaff.cat.label.right_label.height'
+--    ,'webstaff.cat.label.right_label.width'
+--    ,'webstaff.cat.label.right_label.left_margin'
+--    ,'webstaff.cat.label.inline_css'
+--    ,'webstaff.cat.label.call_number_wrap_filter_height'
+--    ,'webstaff.cat.label.call_number_wrap_filter_width'
+--);
+--DELETE FROM config.org_unit_setting_type_log WHERE field_name IN (
+--     'webstaff.cat.label.font.family'
+--    ,'webstaff.cat.label.font.size'
+--    ,'webstaff.cat.label.font.weight'
+--    ,'webstaff.cat.label.left_label.height'
+--    ,'webstaff.cat.label.left_label.width'
+--    ,'webstaff.cat.label.left_label.left_margin'
+--    ,'webstaff.cat.label.right_label.height'
+--    ,'webstaff.cat.label.right_label.width'
+--    ,'webstaff.cat.label.right_label.left_margin'
+--    ,'webstaff.cat.label.inline_css'
+--    ,'webstaff.cat.label.call_number_wrap_filter_height'
+--    ,'webstaff.cat.label.call_number_wrap_filter_width'
+--);
+--DELETE FROM config.org_unit_setting_type WHERE name IN (
+--     'webstaff.cat.label.font.family'
+--    ,'webstaff.cat.label.font.size'
+--    ,'webstaff.cat.label.font.weight'
+--    ,'webstaff.cat.label.left_label.height'
+--    ,'webstaff.cat.label.left_label.width'
+--    ,'webstaff.cat.label.left_label.left_margin'
+--    ,'webstaff.cat.label.right_label.height'
+--    ,'webstaff.cat.label.right_label.width'
+--    ,'webstaff.cat.label.right_label.left_margin'
+--    ,'webstaff.cat.label.inline_css'
+--    ,'webstaff.cat.label.call_number_wrap_filter_height'
+--    ,'webstaff.cat.label.call_number_wrap_filter_width'
+--);
+
+
+
+SELECT evergreen.upgrade_deps_block_check('1049', :eg_version); -- mmorgan/stompro/gmcharlt
+
+\echo -----------------------------------------------------------
+\echo Setting invalid age_protect and circ_as_type entries to NULL,
+\echo otherwise they will break the Serial Copy Templates editor.
+\echo Please review any Serial Copy Templates listed below.
+\echo
+UPDATE asset.copy_template act
+SET age_protect = NULL
+FROM actor.org_unit aou
+WHERE aou.id=act.owning_lib
+   AND act.age_protect NOT IN
+   (
+   SELECT id FROM config.rule_age_hold_protect
+   )
+RETURNING act.id "Template ID", act.name "Template Name",
+          aou.shortname "Owning Lib",
+          'Age Protection value reset to null.' "Description";
+
+UPDATE asset.copy_template act
+SET circ_as_type = NULL
+FROM actor.org_unit aou
+WHERE aou.id=act.owning_lib
+   AND act.circ_as_type NOT IN
+   (
+   SELECT code FROM config.item_type_map
+   )
+RETURNING act.id "Template ID", act.name "Template Name",
+          aou.shortname "Owning Lib",
+          'Circ as Type value reset to null.' as "Description";
+
+\echo -----------End Serial Template Fix----------------
+
+SELECT evergreen.upgrade_deps_block_check('1050', :eg_version); -- mmorgan/cesardv/gmcharlt
+
+CREATE OR REPLACE FUNCTION permission.usr_perms ( INT ) RETURNS SETOF permission.usr_perm_map AS $$
+    SELECT	DISTINCT ON (usr,perm) *
+	  FROM	(
+			(SELECT * FROM permission.usr_perm_map WHERE usr = $1)
+            UNION ALL
+			(SELECT	-p.id, $1 AS usr, p.perm, p.depth, p.grantable
+			  FROM	permission.grp_perm_map p
+			  WHERE	p.grp IN (
+      SELECT	(permission.grp_ancestors(
+      (SELECT profile FROM actor.usr WHERE id = $1)
+					)).id
+				)
+			)
+            UNION ALL
+			(SELECT	-p.id, $1 AS usr, p.perm, p.depth, p.grantable
+			  FROM	permission.grp_perm_map p
+			  WHERE	p.grp IN (SELECT (permission.grp_ancestors(m.grp)).id FROM permission.usr_grp_map m WHERE usr = $1))
+		) AS x
+	  ORDER BY 2, 3, 4 ASC, 5 DESC ;
+$$ LANGUAGE SQL STABLE ROWS 10;
+
+/* XXX See LP 1714589 for a likely revision to this view definition XXX */
+
+SELECT evergreen.upgrade_deps_block_check('1051', :eg_version);
+
+CREATE OR REPLACE VIEW action.all_circulation_slim AS
+    SELECT * FROM action.circulation
+UNION ALL
+    SELECT
+        id,
+        NULL AS usr,
+        xact_start,
+        xact_finish,
+        unrecovered,
+        target_copy,
+        circ_lib,
+        circ_staff,
+        checkin_staff,
+        checkin_lib,
+        renewal_remaining,
+        grace_period,
+        due_date,
+        stop_fines_time,
+        checkin_time,
+        create_time,
+        duration,
+        fine_interval,
+        recurring_fine,
+        max_fine,
+        phone_renewal,
+        desk_renewal,
+        opac_renewal,
+        duration_rule,
+        recurring_fine_rule,
+        max_fine_rule,
+        stop_fines,
+        workstation,
+        checkin_workstation,
+        copy_location,
+        checkin_scan_time,
+        parent_circ
+    FROM action.aged_circulation
+;
+
+DROP FUNCTION action.summarize_all_circ_chain(INTEGER);
+DROP FUNCTION action.all_circ_chain(INTEGER);
+
+CREATE OR REPLACE FUNCTION action.all_circ_chain (ctx_circ_id INTEGER) 
+    RETURNS SETOF action.all_circulation_slim AS $$
+DECLARE
+    tmp_circ action.all_circulation_slim%ROWTYPE;
+    circ_0 action.all_circulation_slim%ROWTYPE;
+BEGIN
+
+    SELECT INTO tmp_circ * FROM action.all_circulation_slim WHERE id = ctx_circ_id;
+
+    IF tmp_circ IS NULL THEN
+        RETURN NEXT tmp_circ;
+    END IF;
+    circ_0 := tmp_circ;
+
+    -- find the front of the chain
+    WHILE TRUE LOOP
+        SELECT INTO tmp_circ * FROM action.all_circulation_slim 
+            WHERE id = tmp_circ.parent_circ;
+        IF tmp_circ IS NULL THEN
+            EXIT;
+        END IF;
+        circ_0 := tmp_circ;
+    END LOOP;
+
+    -- now send the circs to the caller, oldest to newest
+    tmp_circ := circ_0;
+    WHILE TRUE LOOP
+        IF tmp_circ IS NULL THEN
+            EXIT;
+        END IF;
+        RETURN NEXT tmp_circ;
+        SELECT INTO tmp_circ * FROM action.all_circulation_slim 
+            WHERE parent_circ = tmp_circ.id;
+    END LOOP;
+
+END;
+$$ LANGUAGE 'plpgsql';
+
+CREATE OR REPLACE FUNCTION action.summarize_all_circ_chain 
+    (ctx_circ_id INTEGER) RETURNS action.circ_chain_summary AS $$
+
+DECLARE
+
+    -- first circ in the chain
+    circ_0 action.all_circulation_slim%ROWTYPE;
+
+    -- last circ in the chain
+    circ_n action.all_circulation_slim%ROWTYPE;
+
+    -- circ chain under construction
+    chain action.circ_chain_summary;
+    tmp_circ action.all_circulation_slim%ROWTYPE;
+
+BEGIN
+    
+    chain.num_circs := 0;
+    FOR tmp_circ IN SELECT * FROM action.all_circ_chain(ctx_circ_id) LOOP
+
+        IF chain.num_circs = 0 THEN
+            circ_0 := tmp_circ;
+        END IF;
+
+        chain.num_circs := chain.num_circs + 1;
+        circ_n := tmp_circ;
+    END LOOP;
+
+    chain.start_time := circ_0.xact_start;
+    chain.last_stop_fines := circ_n.stop_fines;
+    chain.last_stop_fines_time := circ_n.stop_fines_time;
+    chain.last_checkin_time := circ_n.checkin_time;
+    chain.last_checkin_scan_time := circ_n.checkin_scan_time;
+    SELECT INTO chain.checkout_workstation name FROM actor.workstation WHERE id = circ_0.workstation;
+    SELECT INTO chain.last_checkin_workstation name FROM actor.workstation WHERE id = circ_n.checkin_workstation;
+
+    IF chain.num_circs > 1 THEN
+        chain.last_renewal_time := circ_n.xact_start;
+        SELECT INTO chain.last_renewal_workstation name FROM actor.workstation WHERE id = circ_n.workstation;
+    END IF;
+
+    RETURN chain;
+
+END;
+$$ LANGUAGE 'plpgsql';
+
+CREATE OR REPLACE FUNCTION rating.percent_time_circulating(badge_id INT)
+    RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+DECLARE
+    badge   rating.badge_with_orgs%ROWTYPE;
+BEGIN
+
+    SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+    PERFORM rating.precalc_bibs_by_copy(badge_id);
+
+    DELETE FROM precalc_copy_filter_bib_list WHERE id NOT IN (
+        SELECT id FROM precalc_filter_bib_list
+            INTERSECT
+        SELECT id FROM precalc_bibs_by_copy_list
+    );
+
+    ANALYZE precalc_copy_filter_bib_list;
+
+    RETURN QUERY
+     SELECT bib,
+            SUM(COALESCE(circ_time,0))::NUMERIC / SUM(age)::NUMERIC
+      FROM  (SELECT cn.record AS bib,
+                    cp.id,
+                    EXTRACT( EPOCH FROM AGE(cp.active_date) ) + 1 AS age,
+                    SUM(  -- time copy spent circulating
+                        EXTRACT(
+                            EPOCH FROM
+                            AGE(
+                                COALESCE(circ.checkin_time, circ.stop_fines_time, NOW()),
+                                circ.xact_start
+                            )
+                        )
+                    )::NUMERIC AS circ_time
+              FROM  asset.copy cp
+                    JOIN precalc_copy_filter_bib_list c ON (cp.id = c.copy)
+                    JOIN asset.call_number cn ON (cn.id = cp.call_number)
+                    LEFT JOIN action.all_circulation_slim circ ON (
+                        circ.target_copy = cp.id
+                        AND stop_fines NOT IN (
+                            'LOST',
+                            'LONGOVERDUE',
+                            'CLAIMSRETURNED',
+                            'LONGOVERDUE'
+                        )
+                        AND NOT (
+                            checkin_time IS NULL AND
+                            stop_fines = 'MAXFINES'
+                        )
+                    )
+              WHERE cn.owning_lib = ANY (badge.orgs)
+                    AND cp.active_date IS NOT NULL
+                    -- Next line requires that copies with no circs (circ.id IS NULL) also not be deleted
+                    AND ((circ.id IS NULL AND NOT cp.deleted) OR circ.id IS NOT NULL)
+              GROUP BY 1,2,3
+            ) x
+      GROUP BY 1;
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+
+-- ROLLBACK;
+
+
+SELECT evergreen.upgrade_deps_block_check('1052', :eg_version);
+
+CREATE OR REPLACE FUNCTION rating.inhouse_over_time(badge_id INT)
+    RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+DECLARE
+    badge   rating.badge_with_orgs%ROWTYPE;
+    iage    INT     := 1;
+    iint    INT     := NULL;
+    iscale  NUMERIC := NULL;
+BEGIN
+
+    SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+    IF badge.horizon_age IS NULL THEN
+        RAISE EXCEPTION 'Badge "%" with id % requires a horizon age but has none.',
+            badge.name,
+            badge.id;
+    END IF;
+
+    PERFORM rating.precalc_bibs_by_copy(badge_id);
+
+    DELETE FROM precalc_copy_filter_bib_list WHERE id NOT IN (
+        SELECT id FROM precalc_filter_bib_list
+            INTERSECT
+        SELECT id FROM precalc_bibs_by_copy_list
+    );
+
+    ANALYZE precalc_copy_filter_bib_list;
+
+    iint := EXTRACT(EPOCH FROM badge.importance_interval);
+    IF badge.importance_age IS NOT NULL THEN
+        iage := (EXTRACT(EPOCH FROM badge.importance_age) / iint)::INT;
+    END IF;
+
+    -- if iscale is smaller than 1, scaling slope will be shallow ... BEWARE!
+    iscale := COALESCE(badge.importance_scale, 1.0);
+
+    RETURN QUERY
+     SELECT bib,
+            SUM( uses * GREATEST( iscale * (iage - cage), 1.0 ))
+      FROM (
+         SELECT cn.record AS bib,
+                (1 + EXTRACT(EPOCH FROM AGE(u.use_time)) / iint)::INT AS cage,
+                COUNT(u.id)::INT AS uses
+          FROM  action.in_house_use u
+                JOIN precalc_copy_filter_bib_list cf ON (u.item = cf.copy)
+                JOIN asset.copy cp ON (cp.id = u.item)
+                JOIN asset.call_number cn ON (cn.id = cp.call_number)
+          WHERE u.use_time >= NOW() - badge.horizon_age
+                AND cn.owning_lib = ANY (badge.orgs)
+          GROUP BY 1, 2
+      ) x
+      GROUP BY 1;
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+INSERT INTO rating.popularity_parameter (id, name, func, require_horizon,require_percentile) VALUES
+    (18,'In-House Use Over Time', 'rating.inhouse_over_time', TRUE, TRUE);
+
+
+
+SELECT evergreen.upgrade_deps_block_check('1053', :eg_version);
+
+CREATE OR REPLACE FUNCTION rating.org_unit_count(badge_id INT)
+    RETURNS TABLE (record INT, value NUMERIC) AS $f$
+DECLARE
+    badge   rating.badge_with_orgs%ROWTYPE;
+BEGIN
+
+    SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+    PERFORM rating.precalc_bibs_by_copy(badge_id);
+
+    DELETE FROM precalc_copy_filter_bib_list WHERE id NOT IN (
+        SELECT id FROM precalc_filter_bib_list
+            INTERSECT
+        SELECT id FROM precalc_bibs_by_copy_list
+    );
+    ANALYZE precalc_copy_filter_bib_list;
+
+    -- Use circ rather than owning lib here as that means "on the shelf at..."
+    RETURN QUERY
+     SELECT f.id::INT AS bib,
+            COUNT(DISTINCT cp.circ_lib)::NUMERIC
+     FROM asset.copy cp
+          JOIN precalc_copy_filter_bib_list f ON (cp.id = f.copy)
+     WHERE cp.circ_lib = ANY (badge.orgs) GROUP BY 1;
+
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+INSERT INTO rating.popularity_parameter (id, name, func, require_percentile) VALUES
+    (17,'Circulation Library Count', 'rating.org_unit_count', TRUE);
+
+
+
+SELECT evergreen.upgrade_deps_block_check('1054', :eg_version);
+
+INSERT into config.org_unit_setting_type
+( name, grp, label, description, datatype ) VALUES
+
+( 'lib.timezone', 'lib',
+    oils_i18n_gettext('lib.timezone',
+        'Library time zone',
+        'coust', 'label'),
+    oils_i18n_gettext('lib.timezone',
+        'Define the time zone in which a library physically resides',
+        'coust', 'description'),
+    'string');
+
+ALTER TABLE actor.org_unit_closed ADD COLUMN full_day BOOLEAN DEFAULT FALSE;
+ALTER TABLE actor.org_unit_closed ADD COLUMN multi_day BOOLEAN DEFAULT FALSE;
+
+UPDATE actor.org_unit_closed SET multi_day = TRUE
+  WHERE close_start::DATE <> close_end::DATE;
+
+UPDATE actor.org_unit_closed SET full_day = TRUE
+  WHERE close_start::DATE = close_end::DATE
+        AND SUBSTRING(close_start::time::text FROM 1 FOR 8) = '00:00:00'
+        AND SUBSTRING(close_end::time::text FROM 1 FOR 8) = '23:59:59';
+
+CREATE OR REPLACE FUNCTION action.push_circ_due_time () RETURNS TRIGGER AS $$
+DECLARE
+    proper_tz TEXT := COALESCE(
+        oils_json_to_text((
+            SELECT value
+              FROM  actor.org_unit_ancestor_setting('lib.timezone',NEW.circ_lib)
+              LIMIT 1
+        )),
+        CURRENT_SETTING('timezone')
+    );
+BEGIN
+
+    IF (EXTRACT(EPOCH FROM NEW.duration)::INT % EXTRACT(EPOCH FROM '1 day'::INTERVAL)::INT) = 0 -- day-granular duration
+        AND SUBSTRING((NEW.due_date AT TIME ZONE proper_tz)::TIME::TEXT FROM 1 FOR 8) <> '23:59:59' THEN -- has not yet been pushed
+        NEW.due_date = ((NEW.due_date AT TIME ZONE proper_tz)::DATE + '1 day'::INTERVAL - '1 second'::INTERVAL) || ' ' || proper_tz;
+    END IF;
+
+    RETURN NEW;
+END;
+$$ LANGUAGE PLPGSQL;
+
+
+\qecho The following query will adjust all historical, unaged circulations so
+\qecho that if their due date field is pushed to the end of the day, it is done
+\qecho in the circulating library''''s time zone, and not the server time zone.
+\qecho 
+\qecho It is safe to run this after any change to library time zones.
+\qecho 
+\qecho Running this is not required, as no code before this change has
+\qecho depended on the time string of '''23:59:59'''.  It is also not necessary
+\qecho if all of your libraries are in the same time zone, and that time zone
+\qecho is the same as the database''''s configured time zone.
+\qecho 
+\qecho 'DO $$'
+\qecho 'declare'
+\qecho '    new_tz  text;'
+\qecho '    ou_id   int;'
+\qecho 'begin'
+\qecho '    for ou_id in select id from actor.org_unit loop'
+\qecho '        for new_tz in select oils_json_to_text(value) from actor.org_unit_ancestor_setting('''lib.timezone''',ou_id) loop'
+\qecho '            if new_tz is not null then'
+\qecho '                update  action.circulation'
+\qecho '                  set   due_date = (due_date::timestamp || ''' ''' || new_tz)::timestamptz'
+\qecho '                  where circ_lib = ou_id'
+\qecho '                        and substring((due_date at time zone new_tz)::time::text from 1 for 8) <> '''23:59:59''';'
+\qecho '            end if;'
+\qecho '        end loop;'
+\qecho '    end loop;'
+\qecho 'end;'
+\qecho '$$;'
+\qecho 
+
+SELECT evergreen.upgrade_deps_block_check('1055', :eg_version);
+
+CREATE OR REPLACE FUNCTION actor.usr_merge( src_usr INT, dest_usr INT, del_addrs BOOLEAN, del_cards BOOLEAN, deactivate_cards BOOLEAN ) RETURNS VOID AS $$
+DECLARE
+	suffix TEXT;
+	bucket_row RECORD;
+	picklist_row RECORD;
+	queue_row RECORD;
+	folder_row RECORD;
+BEGIN
+
+    -- do some initial cleanup 
+    UPDATE actor.usr SET card = NULL WHERE id = src_usr;
+    UPDATE actor.usr SET mailing_address = NULL WHERE id = src_usr;
+    UPDATE actor.usr SET billing_address = NULL WHERE id = src_usr;
+
+    -- actor.*
+    IF del_cards THEN
+        DELETE FROM actor.card where usr = src_usr;
+    ELSE
+        IF deactivate_cards THEN
+            UPDATE actor.card SET active = 'f' WHERE usr = src_usr;
+        END IF;
+        UPDATE actor.card SET usr = dest_usr WHERE usr = src_usr;
+    END IF;
+
+
+    IF del_addrs THEN
+        DELETE FROM actor.usr_address WHERE usr = src_usr;
+    ELSE
+        UPDATE actor.usr_address SET usr = dest_usr WHERE usr = src_usr;
+    END IF;
+
+    UPDATE actor.usr_note SET usr = dest_usr WHERE usr = src_usr;
+    -- dupes are technically OK in actor.usr_standing_penalty, should manually delete them...
+    UPDATE actor.usr_standing_penalty SET usr = dest_usr WHERE usr = src_usr;
+    PERFORM actor.usr_merge_rows('actor.usr_org_unit_opt_in', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('actor.usr_setting', 'usr', src_usr, dest_usr);
+
+    -- permission.*
+    PERFORM actor.usr_merge_rows('permission.usr_perm_map', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('permission.usr_object_perm_map', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('permission.usr_grp_map', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('permission.usr_work_ou_map', 'usr', src_usr, dest_usr);
+
+
+    -- container.*
+	
+	-- For each *_bucket table: transfer every bucket belonging to src_usr
+	-- into the custody of dest_usr.
+	--
+	-- In order to avoid colliding with an existing bucket owned by
+	-- the destination user, append the source user's id (in parenthesese)
+	-- to the name.  If you still get a collision, add successive
+	-- spaces to the name and keep trying until you succeed.
+	--
+	FOR bucket_row in
+		SELECT id, name
+		FROM   container.biblio_record_entry_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.biblio_record_entry_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = bucket_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	FOR bucket_row in
+		SELECT id, name
+		FROM   container.call_number_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.call_number_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = bucket_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	FOR bucket_row in
+		SELECT id, name
+		FROM   container.copy_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.copy_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = bucket_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	FOR bucket_row in
+		SELECT id, name
+		FROM   container.user_bucket
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  container.user_bucket
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = bucket_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+	UPDATE container.user_bucket_item SET target_user = dest_usr WHERE target_user = src_usr;
+
+    -- vandelay.*
+	-- transfer queues the same way we transfer buckets (see above)
+	FOR queue_row in
+		SELECT id, name
+		FROM   vandelay.queue
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  vandelay.queue
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = queue_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+    -- money.*
+    PERFORM actor.usr_merge_rows('money.collections_tracker', 'usr', src_usr, dest_usr);
+    PERFORM actor.usr_merge_rows('money.collections_tracker', 'collector', src_usr, dest_usr);
+    UPDATE money.billable_xact SET usr = dest_usr WHERE usr = src_usr;
+    UPDATE money.billing SET voider = dest_usr WHERE voider = src_usr;
+    UPDATE money.bnm_payment SET accepting_usr = dest_usr WHERE accepting_usr = src_usr;
+
+    -- action.*
+    UPDATE action.circulation SET usr = dest_usr WHERE usr = src_usr;
+    UPDATE action.circulation SET circ_staff = dest_usr WHERE circ_staff = src_usr;
+    UPDATE action.circulation SET checkin_staff = dest_usr WHERE checkin_staff = src_usr;
+    UPDATE action.usr_circ_history SET usr = dest_usr WHERE usr = src_usr;
+
+    UPDATE action.hold_request SET usr = dest_usr WHERE usr = src_usr;
+    UPDATE action.hold_request SET fulfillment_staff = dest_usr WHERE fulfillment_staff = src_usr;
+    UPDATE action.hold_request SET requestor = dest_usr WHERE requestor = src_usr;
+    UPDATE action.hold_notification SET notify_staff = dest_usr WHERE notify_staff = src_usr;
+
+    UPDATE action.in_house_use SET staff = dest_usr WHERE staff = src_usr;
+    UPDATE action.non_cataloged_circulation SET staff = dest_usr WHERE staff = src_usr;
+    UPDATE action.non_cataloged_circulation SET patron = dest_usr WHERE patron = src_usr;
+    UPDATE action.non_cat_in_house_use SET staff = dest_usr WHERE staff = src_usr;
+    UPDATE action.survey_response SET usr = dest_usr WHERE usr = src_usr;
+
+    -- acq.*
+    UPDATE acq.fund_allocation SET allocator = dest_usr WHERE allocator = src_usr;
+	UPDATE acq.fund_transfer SET transfer_user = dest_usr WHERE transfer_user = src_usr;
+
+	-- transfer picklists the same way we transfer buckets (see above)
+	FOR picklist_row in
+		SELECT id, name
+		FROM   acq.picklist
+		WHERE  owner = src_usr
+	LOOP
+		suffix := ' (' || src_usr || ')';
+		LOOP
+			BEGIN
+				UPDATE  acq.picklist
+				SET     owner = dest_usr, name = name || suffix
+				WHERE   id = picklist_row.id;
+			EXCEPTION WHEN unique_violation THEN
+				suffix := suffix || ' ';
+				CONTINUE;
+			END;
+			EXIT;
+		END LOOP;
+	END LOOP;
+
+    UPDATE acq.purchase_order SET owner = dest_usr WHERE owner = src_usr;
+    UPDATE acq.po_note SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE acq.po_note SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE acq.provider_note SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE acq.provider_note SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE acq.lineitem_note SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE acq.lineitem_note SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE acq.lineitem_usr_attr_definition SET usr = dest_usr WHERE usr = src_usr;
+
+    -- asset.*
+    UPDATE asset.copy SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE asset.copy SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE asset.copy_note SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE asset.call_number SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE asset.call_number SET editor = dest_usr WHERE editor = src_usr;
+    UPDATE asset.call_number_note SET creator = dest_usr WHERE creator = src_usr;
+
+    -- serial.*
+    UPDATE serial.record_entry SET creator = dest_usr WHERE creator = src_usr;
+    UPDATE serial.record_entry SET editor = dest_usr WHERE editor = src_usr;
+
+    -- reporter.*
+    -- It's not uncommon to define the reporter schema in a replica 
+    -- DB only, so don't assume these tables exist in the write DB.
+    BEGIN
+    	UPDATE reporter.template SET owner = dest_usr WHERE owner = src_usr;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+    	UPDATE reporter.report SET owner = dest_usr WHERE owner = src_usr;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+    	UPDATE reporter.schedule SET runner = dest_usr WHERE runner = src_usr;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+		-- transfer folders the same way we transfer buckets (see above)
+		FOR folder_row in
+			SELECT id, name
+			FROM   reporter.template_folder
+			WHERE  owner = src_usr
+		LOOP
+			suffix := ' (' || src_usr || ')';
+			LOOP
+				BEGIN
+					UPDATE  reporter.template_folder
+					SET     owner = dest_usr, name = name || suffix
+					WHERE   id = folder_row.id;
+				EXCEPTION WHEN unique_violation THEN
+					suffix := suffix || ' ';
+					CONTINUE;
+				END;
+				EXIT;
+			END LOOP;
+		END LOOP;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+		-- transfer folders the same way we transfer buckets (see above)
+		FOR folder_row in
+			SELECT id, name
+			FROM   reporter.report_folder
+			WHERE  owner = src_usr
+		LOOP
+			suffix := ' (' || src_usr || ')';
+			LOOP
+				BEGIN
+					UPDATE  reporter.report_folder
+					SET     owner = dest_usr, name = name || suffix
+					WHERE   id = folder_row.id;
+				EXCEPTION WHEN unique_violation THEN
+					suffix := suffix || ' ';
+					CONTINUE;
+				END;
+				EXIT;
+			END LOOP;
+		END LOOP;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+    BEGIN
+		-- transfer folders the same way we transfer buckets (see above)
+		FOR folder_row in
+			SELECT id, name
+			FROM   reporter.output_folder
+			WHERE  owner = src_usr
+		LOOP
+			suffix := ' (' || src_usr || ')';
+			LOOP
+				BEGIN
+					UPDATE  reporter.output_folder
+					SET     owner = dest_usr, name = name || suffix
+					WHERE   id = folder_row.id;
+				EXCEPTION WHEN unique_violation THEN
+					suffix := suffix || ' ';
+					CONTINUE;
+				END;
+				EXIT;
+			END LOOP;
+		END LOOP;
+    EXCEPTION WHEN undefined_table THEN
+        -- do nothing
+    END;
+
+    -- Finally, delete the source user
+    DELETE FROM actor.usr WHERE id = src_usr;
+
+END;
+$$ LANGUAGE plpgsql;
+
+
+
+
+
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('1056', :eg_version); -- miker/gmcharlt
+
+INSERT INTO permission.perm_list (id,code,description) VALUES (592,'CONTAINER_BATCH_UPDATE','Allow batch update via buckets');
+
+INSERT INTO container.user_bucket_type (code,label) SELECT code,label FROM container.copy_bucket_type where code = 'staff_client';
+
+CREATE TABLE action.fieldset_group (
+    id              SERIAL  PRIMARY KEY,
+    name            TEXT        NOT NULL,
+    create_time     TIMESTAMPTZ NOT NULL DEFAULT NOW(),
+    complete_time   TIMESTAMPTZ,
+    container       INT,        -- Points to a container of some type ...
+    container_type  TEXT,       -- One of 'biblio_record_entry', 'user', 'call_number', 'copy'
+    can_rollback    BOOL        DEFAULT TRUE,
+    rollback_group  INT         REFERENCES action.fieldset_group (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    rollback_time   TIMESTAMPTZ,
+    creator         INT         NOT NULL REFERENCES actor.usr (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    owning_lib      INT         NOT NULL REFERENCES actor.org_unit (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED
+);
+
+ALTER TABLE action.fieldset ADD COLUMN fieldset_group INT REFERENCES action.fieldset_group (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE action.fieldset ADD COLUMN error_msg TEXT;
+ALTER TABLE container.biblio_record_entry_bucket ADD COLUMN owning_lib INT REFERENCES actor.org_unit (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE container.user_bucket ADD COLUMN owning_lib INT REFERENCES actor.org_unit (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE container.call_number_bucket ADD COLUMN owning_lib INT REFERENCES actor.org_unit (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE container.copy_bucket ADD COLUMN owning_lib INT REFERENCES actor.org_unit (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+
+UPDATE query.stored_query SET id = id + 1000 WHERE id < 1000;
+UPDATE query.from_relation SET id = id + 1000 WHERE id < 1000;
+UPDATE query.expression SET id = id + 1000 WHERE id < 1000;
+
+SELECT SETVAL('query.stored_query_id_seq', 1, FALSE);
+SELECT SETVAL('query.from_relation_id_seq', 1, FALSE);
+SELECT SETVAL('query.expression_id_seq', 1, FALSE);
+
+INSERT INTO query.bind_variable (name,type,description,label)
+    SELECT  'bucket','number','ID of the bucket to pull items from','Bucket ID'
+      WHERE NOT EXISTS (SELECT 1 FROM query.bind_variable WHERE name = 'bucket');
+
+-- Assumes completely empty 'query' schema
+INSERT INTO query.stored_query (type, use_distinct) VALUES ('SELECT', TRUE); -- 1
+
+INSERT INTO query.from_relation (type, table_name, class_name, table_alias) VALUES ('RELATION', 'container.user_bucket_item', 'cubi', 'cubi'); -- 1
+UPDATE query.stored_query SET from_clause = 1;
+
+INSERT INTO query.expr_xcol (table_alias, column_name) VALUES ('cubi', 'target_user'); -- 1
+INSERT INTO query.select_item (stored_query,seq_no,expression) VALUES (1,1,1);
+
+INSERT INTO query.expr_xcol (table_alias, column_name) VALUES ('cubi', 'bucket'); -- 2
+INSERT INTO query.expr_xbind (bind_variable) VALUES ('bucket'); -- 3
+
+INSERT INTO query.expr_xop (left_operand, operator, right_operand) VALUES (2, '=', 3); -- 4
+UPDATE query.stored_query SET where_clause = 4;
+
+SELECT SETVAL('query.stored_query_id_seq', 1000, TRUE) FROM query.stored_query;
+SELECT SETVAL('query.from_relation_id_seq', 1000, TRUE) FROM query.from_relation;
+SELECT SETVAL('query.expression_id_seq', 10000, TRUE) FROM query.expression;
+
+CREATE OR REPLACE FUNCTION action.apply_fieldset(
+    fieldset_id IN INT,        -- id from action.fieldset
+    table_name  IN TEXT,       -- table to be updated
+    pkey_name   IN TEXT,       -- name of primary key column in that table
+    query       IN TEXT        -- query constructed by qstore (for query-based
+                               --    fieldsets only; otherwise null
+)
+RETURNS TEXT AS $$
+DECLARE
+    statement TEXT;
+    where_clause TEXT;
+    fs_status TEXT;
+    fs_pkey_value TEXT;
+    fs_query TEXT;
+    sep CHAR;
+    status_code TEXT;
+    msg TEXT;
+    fs_id INT;
+    fsg_id INT;
+    update_count INT;
+    cv RECORD;
+    fs_obj action.fieldset%ROWTYPE;
+    fs_group action.fieldset_group%ROWTYPE;
+    rb_row RECORD;
+BEGIN
+    -- Sanity checks
+    IF fieldset_id IS NULL THEN
+        RETURN 'Fieldset ID parameter is NULL';
+    END IF;
+    IF table_name IS NULL THEN
+        RETURN 'Table name parameter is NULL';
+    END IF;
+    IF pkey_name IS NULL THEN
+        RETURN 'Primary key name parameter is NULL';
+    END IF;
+
+    SELECT
+        status,
+        quote_literal( pkey_value )
+    INTO
+        fs_status,
+        fs_pkey_value
+    FROM
+        action.fieldset
+    WHERE
+        id = fieldset_id;
+
+    --
+    -- Build the WHERE clause.  This differs according to whether it's a
+    -- single-row fieldset or a query-based fieldset.
+    --
+    IF query IS NULL        AND fs_pkey_value IS NULL THEN
+        RETURN 'Incomplete fieldset: neither a primary key nor a query available';
+    ELSIF query IS NOT NULL AND fs_pkey_value IS NULL THEN
+        fs_query := rtrim( query, ';' );
+        where_clause := 'WHERE ' || pkey_name || ' IN ( '
+                     || fs_query || ' )';
+    ELSIF query IS NULL     AND fs_pkey_value IS NOT NULL THEN
+        where_clause := 'WHERE ' || pkey_name || ' = ';
+        IF pkey_name = 'id' THEN
+            where_clause := where_clause || fs_pkey_value;
+        ELSIF pkey_name = 'code' THEN
+            where_clause := where_clause || quote_literal(fs_pkey_value);
+        ELSE
+            RETURN 'Only know how to handle "id" and "code" pkeys currently, received ' || pkey_name;
+        END IF;
+    ELSE  -- both are not null
+        RETURN 'Ambiguous fieldset: both a primary key and a query provided';
+    END IF;
+
+    IF fs_status IS NULL THEN
+        RETURN 'No fieldset found for id = ' || fieldset_id;
+    ELSIF fs_status = 'APPLIED' THEN
+        RETURN 'Fieldset ' || fieldset_id || ' has already been applied';
+    END IF;
+
+    SELECT * INTO fs_obj FROM action.fieldset WHERE id = fieldset_id;
+    SELECT * INTO fs_group FROM action.fieldset_group WHERE id = fs_obj.fieldset_group;
+
+    IF fs_group.can_rollback THEN
+        -- This is part of a non-rollback group.  We need to record the current values for future rollback.
+
+        INSERT INTO action.fieldset_group (can_rollback, name, creator, owning_lib, container, container_type)
+            VALUES (FALSE, 'ROLLBACK: '|| fs_group.name, fs_group.creator, fs_group.owning_lib, fs_group.container, fs_group.container_type);
+
+        fsg_id := CURRVAL('action.fieldset_group_id_seq');
+
+        FOR rb_row IN EXECUTE 'SELECT * FROM ' || table_name || ' ' || where_clause LOOP
+            IF pkey_name = 'id' THEN
+                fs_pkey_value := rb_row.id;
+            ELSIF pkey_name = 'code' THEN
+                fs_pkey_value := rb_row.code;
+            ELSE
+                RETURN 'Only know how to handle "id" and "code" pkeys currently, received ' || pkey_name;
+            END IF;
+            INSERT INTO action.fieldset (fieldset_group,owner,owning_lib,status,classname,name,pkey_value)
+                VALUES (fsg_id, fs_obj.owner, fs_obj.owning_lib, 'PENDING', fs_obj.classname, fs_obj.name || ' ROLLBACK FOR ' || fs_pkey_value, fs_pkey_value);
+
+            fs_id := CURRVAL('action.fieldset_id_seq');
+            sep := '';
+            FOR cv IN
+                SELECT  DISTINCT col
+                FROM    action.fieldset_col_val
+                WHERE   fieldset = fieldset_id
+            LOOP
+                EXECUTE 'INSERT INTO action.fieldset_col_val (fieldset, col, val) ' || 
+                    'SELECT '|| fs_id || ', '||quote_literal(cv.col)||', '||cv.col||' FROM '||table_name||' WHERE '||pkey_name||' = '||fs_pkey_value;
+            END LOOP;
+        END LOOP;
+    END IF;
+
+    statement := 'UPDATE ' || table_name || ' SET';
+
+    sep := '';
+    FOR cv IN
+        SELECT  col,
+                val
+        FROM    action.fieldset_col_val
+        WHERE   fieldset = fieldset_id
+    LOOP
+        statement := statement || sep || ' ' || cv.col
+                     || ' = ' || coalesce( quote_literal( cv.val ), 'NULL' );
+        sep := ',';
+    END LOOP;
+
+    IF sep = '' THEN
+        RETURN 'Fieldset ' || fieldset_id || ' has no column values defined';
+    END IF;
+    statement := statement || ' ' || where_clause;
+
+    --
+    -- Execute the update
+    --
+    BEGIN
+        EXECUTE statement;
+        GET DIAGNOSTICS update_count = ROW_COUNT;
+
+        IF update_count = 0 THEN
+            RAISE data_exception;
+        END IF;
+
+        IF fsg_id IS NOT NULL THEN
+            UPDATE action.fieldset_group SET rollback_group = fsg_id WHERE id = fs_group.id;
+        END IF;
+
+        IF fs_group.id IS NOT NULL THEN
+            UPDATE action.fieldset_group SET complete_time = now() WHERE id = fs_group.id;
+        END IF;
+
+        UPDATE action.fieldset SET status = 'APPLIED', applied_time = now() WHERE id = fieldset_id;
+
+    EXCEPTION WHEN data_exception THEN
+        msg := 'No eligible rows found for fieldset ' || fieldset_id;
+        UPDATE action.fieldset SET status = 'ERROR', applied_time = now() WHERE id = fieldset_id;
+        RETURN msg;
+
+    END;
+
+    RETURN msg;
+
+EXCEPTION WHEN OTHERS THEN
+    msg := 'Unable to apply fieldset ' || fieldset_id || ': ' || sqlerrm;
+    UPDATE action.fieldset SET status = 'ERROR', applied_time = now() WHERE id = fieldset_id;
+    RETURN msg;
+
+END;
+$$ LANGUAGE plpgsql;
+
+
+
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('1057', :eg_version); -- miker/gmcharlt/kmlussier
+
+-- Thist change drops a needless join and saves 10-15% in time cost
+CREATE OR REPLACE FUNCTION search.facets_for_record_set(ignore_facet_classes text[], hits bigint[]) RETURNS TABLE(id integer, value text, count bigint)
+AS $f$
+    SELECT id, value, count
+      FROM (
+        SELECT  mfae.field AS id,
+                mfae.value,
+                COUNT(DISTINCT mfae.source),
+                row_number() OVER (
+                    PARTITION BY mfae.field ORDER BY COUNT(DISTINCT mfae.source) DESC
+                ) AS rownum
+          FROM  metabib.facet_entry mfae
+                JOIN config.metabib_field cmf ON (cmf.id = mfae.field)
+          WHERE mfae.source = ANY ($2)
+                AND cmf.facet_field
+                AND cmf.field_class NOT IN (SELECT * FROM unnest($1))
+          GROUP by 1, 2
+      ) all_facets
+      WHERE rownum <= (
+        SELECT COALESCE(
+            (SELECT value::INT FROM config.global_flag WHERE name = 'search.max_facets_per_field' AND enabled),
+            1000
+        )
+      );
+$f$ LANGUAGE SQL;
+
+CREATE OR REPLACE FUNCTION unapi.metabib_virtual_record_feed ( id_list BIGINT[], format TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit HSTORE DEFAULT NULL, soffset HSTORE DEFAULT NULL, include_xmlns BOOL DEFAULT TRUE, title TEXT DEFAULT NULL, description TEXT DEFAULT NULL, creator TEXT DEFAULT NULL, update_ts TEXT DEFAULT NULL, unapi_url TEXT DEFAULT NULL, header_xml XML DEFAULT NULL ) RETURNS XML AS $F$
+DECLARE
+    layout          unapi.bre_output_layout%ROWTYPE;
+    transform       config.xml_transform%ROWTYPE;
+    item_format     TEXT;
+    tmp_xml         TEXT;
+    xmlns_uri       TEXT := 'http://open-ils.org/spec/feed-xml/v1';
+    ouid            INT;
+    element_list    TEXT[];
+BEGIN
+
+    IF org = '-' OR org IS NULL THEN
+        SELECT shortname INTO org FROM evergreen.org_top();
+    END IF;
+
+    SELECT id INTO ouid FROM actor.org_unit WHERE shortname = org;
+    SELECT * INTO layout FROM unapi.bre_output_layout WHERE name = format;
+
+    IF layout.name IS NULL THEN
+        RETURN NULL::XML;
+    END IF;
+
+    SELECT * INTO transform FROM config.xml_transform WHERE name = layout.transform;
+    xmlns_uri := COALESCE(transform.namespace_uri,xmlns_uri);
+
+    -- Gather the bib xml
+    SELECT XMLAGG( unapi.mmr(i, format, '', includes, org, depth, slimit, soffset, include_xmlns)) INTO tmp_xml FROM UNNEST( id_list ) i;
+
+    IF layout.title_element IS NOT NULL THEN
+        EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.title_element ||', XMLATTRIBUTES( $1 AS xmlns), $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, title;
+    END IF;
+
+    IF layout.description_element IS NOT NULL THEN
+        EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.description_element ||', XMLATTRIBUTES( $1 AS xmlns), $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, description;
+    END IF;
+
+    IF layout.creator_element IS NOT NULL THEN
+        EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.creator_element ||', XMLATTRIBUTES( $1 AS xmlns), $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, creator;
+    END IF;
+
+    IF layout.update_ts_element IS NOT NULL THEN
+        EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.update_ts_element ||', XMLATTRIBUTES( $1 AS xmlns), $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, update_ts;
+    END IF;
+
+    IF unapi_url IS NOT NULL THEN
+        EXECUTE $$SELECT XMLCONCAT( XMLELEMENT( name link, XMLATTRIBUTES( 'http://www.w3.org/1999/xhtml' AS xmlns, 'unapi-server' AS rel, $1 AS href, 'unapi' AS title)), $2)$$ INTO tmp_xml USING unapi_url, tmp_xml::XML;
+    END IF;
+
+    IF header_xml IS NOT NULL THEN tmp_xml := XMLCONCAT(header_xml,tmp_xml::XML); END IF;
+
+    element_list := regexp_split_to_array(layout.feed_top,E'\\.');
+    FOR i IN REVERSE ARRAY_UPPER(element_list, 1) .. 1 LOOP
+        EXECUTE 'SELECT XMLELEMENT( name '|| quote_ident(element_list[i]) ||', XMLATTRIBUTES( $1 AS xmlns), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML;
+    END LOOP;
+
+    RETURN tmp_xml::XML;
+END;
+$F$ LANGUAGE PLPGSQL STABLE;
+
+CREATE TABLE asset.copy_vis_attr_cache (
+    id              BIGSERIAL   PRIMARY KEY,
+    record          BIGINT      NOT NULL, -- No FKEYs, managed by user triggers.
+    target_copy     BIGINT      NOT NULL,
+    vis_attr_vector INT[]
+);
+CREATE INDEX copy_vis_attr_cache_record_idx ON asset.copy_vis_attr_cache (record);
+CREATE INDEX copy_vis_attr_cache_copy_idx ON asset.copy_vis_attr_cache (target_copy);
+
+ALTER TABLE biblio.record_entry ADD COLUMN vis_attr_vector INT[];
+
+CREATE OR REPLACE FUNCTION search.calculate_visibility_attribute ( value INT, attr TEXT ) RETURNS INT AS $f$
+SELECT  ((CASE $2
+
+            WHEN 'luri_org'         THEN 0 -- "b" attr
+            WHEN 'bib_source'       THEN 1 -- "b" attr
+
+            WHEN 'copy_flags'       THEN 0 -- "c" attr
+            WHEN 'owning_lib'       THEN 1 -- "c" attr
+            WHEN 'circ_lib'         THEN 2 -- "c" attr
+            WHEN 'status'           THEN 3 -- "c" attr
+            WHEN 'location'         THEN 4 -- "c" attr
+            WHEN 'location_group'   THEN 5 -- "c" attr
+
+        END) << 28 ) | $1;
+
+/* copy_flags bit positions, LSB-first:
+
+ 0: asset.copy.opac_visible
+
+
+   When adding flags, you must update asset.all_visible_flags()
+
+   Because bib and copy values are stored separately, we can reuse
+   shifts, saving us some space. We could probably take back a bit
+   too, but I'm not sure its worth squeezing that last one out. We'd
+   be left with just 2 slots for copy attrs, rather than 10.
+*/
+
+$f$ LANGUAGE SQL IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION search.calculate_visibility_attribute_list ( attr TEXT, value INT[] ) RETURNS INT[] AS $f$
+    SELECT ARRAY_AGG(search.calculate_visibility_attribute(x, $1)) FROM UNNEST($2) AS X;
+$f$ LANGUAGE SQL IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION search.calculate_visibility_attribute_test ( attr TEXT, value INT[], negate BOOL DEFAULT FALSE ) RETURNS TEXT AS $f$
+    SELECT  CASE WHEN $3 THEN '!' ELSE '' END || '(' || ARRAY_TO_STRING(search.calculate_visibility_attribute_list($1,$2),'|') || ')';
+$f$ LANGUAGE SQL IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION asset.calculate_copy_visibility_attribute_set ( copy_id BIGINT ) RETURNS INT[] AS $f$
+DECLARE
+    copy_row    asset.copy%ROWTYPE;
+    lgroup_map  asset.copy_location_group_map%ROWTYPE;
+    attr_set    INT[];
+BEGIN
+    SELECT * INTO copy_row FROM asset.copy WHERE id = copy_id;
+
+    attr_set := attr_set || search.calculate_visibility_attribute(copy_row.opac_visible::INT, 'copy_flags');
+    attr_set := attr_set || search.calculate_visibility_attribute(copy_row.circ_lib, 'circ_lib');
+    attr_set := attr_set || search.calculate_visibility_attribute(copy_row.status, 'status');
+    attr_set := attr_set || search.calculate_visibility_attribute(copy_row.location, 'location');
+
+    SELECT  ARRAY_APPEND(
+                attr_set,
+                search.calculate_visibility_attribute(owning_lib, 'owning_lib')
+            ) INTO attr_set
+      FROM  asset.call_number
+      WHERE id = copy_row.call_number;
+
+    FOR lgroup_map IN SELECT * FROM asset.copy_location_group_map WHERE location = copy_row.location LOOP
+        attr_set := attr_set || search.calculate_visibility_attribute(lgroup_map.lgroup, 'location_group');
+    END LOOP;
+
+    RETURN attr_set;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION biblio.calculate_bib_visibility_attribute_set ( bib_id BIGINT ) RETURNS INT[] AS $f$
+DECLARE
+    bib_row     biblio.record_entry%ROWTYPE;
+    cn_row      asset.call_number%ROWTYPE;
+    attr_set    INT[];
+BEGIN
+    SELECT * INTO bib_row FROM biblio.record_entry WHERE id = bib_id;
+
+    IF bib_row.source IS NOT NULL THEN
+        attr_set := attr_set || search.calculate_visibility_attribute(bib_row.source, 'bib_source');
+    END IF;
+
+    FOR cn_row IN
+        SELECT  cn.*
+          FROM  asset.call_number cn
+                JOIN asset.uri_call_number_map m ON (cn.id = m.call_number)
+                JOIN asset.uri u ON (u.id = m.uri)
+          WHERE cn.record = bib_id
+                AND cn.label = '##URI##'
+                AND u.active
+    LOOP
+        attr_set := attr_set || search.calculate_visibility_attribute(cn_row.owning_lib, 'luri_org');
+    END LOOP;
+
+    RETURN attr_set;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION asset.cache_copy_visibility () RETURNS TRIGGER as $func$
+DECLARE
+    ocn     asset.call_number%ROWTYPE;
+    ncn     asset.call_number%ROWTYPE;
+    cid     BIGINT;
+BEGIN
+
+    IF TG_TABLE_NAME = 'peer_bib_copy_map' THEN -- Only needs ON INSERT OR DELETE, so handle separately
+        IF TG_OP = 'INSERT' THEN
+            INSERT INTO asset.copy_vis_attr_cache (record, target_copy, vis_attr_vector) VALUES (
+                NEW.peer_record,
+                NEW.target_copy,
+                asset.calculate_copy_visibility_attribute_set(NEW.target_copy)
+            );
+
+            RETURN NEW;
+        ELSIF TG_OP = 'DELETE' THEN
+            DELETE FROM asset.copy_vis_attr_cache
+              WHERE record = NEW.peer_record AND target_copy = NEW.target_copy;
+
+            RETURN OLD;
+        END IF;
+    END IF;
+
+    IF TG_OP = 'INSERT' THEN -- Handles ON INSERT. ON UPDATE is below.
+        IF TG_TABLE_NAME IN ('copy', 'unit') THEN
+            SELECT * INTO ncn FROM asset.call_number cn WHERE id = NEW.call_number;
+            INSERT INTO asset.copy_vis_attr_cache (record, target_copy, vis_attr_vector) VALUES (
+                ncn.record,
+                NEW.id,
+                asset.calculate_copy_visibility_attribute_set(NEW.id)
+            );
+        ELSIF TG_TABLE_NAME = 'record_entry' THEN
+            NEW.vis_attr_vector := biblio.calculate_bib_visibility_attribute_set(NEW.id);
+        END IF;
+
+        RETURN NEW;
+    END IF;
+
+    -- handle items first, since with circulation activity
+    -- their statuses change frequently
+    IF TG_TABLE_NAME IN ('copy', 'unit') THEN -- This handles ON UPDATE OR DELETE. ON INSERT above
+
+        IF TG_OP = 'DELETE' THEN -- Shouldn't get here, normally
+            DELETE FROM asset.copy_vis_attr_cache WHERE target_copy = OLD.id;
+            RETURN OLD;
+        END IF;
+
+        SELECT * INTO ncn FROM asset.call_number cn WHERE id = NEW.call_number;
+
+        IF OLD.deleted <> NEW.deleted THEN
+            IF NEW.deleted THEN
+                DELETE FROM asset.copy_vis_attr_cache WHERE target_copy = OLD.id;
+            ELSE
+                INSERT INTO asset.copy_vis_attr_cache (record, target_copy, vis_attr_vector) VALUES (
+                    ncn.record,
+                    NEW.id,
+                    asset.calculate_copy_visibility_attribute_set(NEW.id)
+                );
+            END IF;
+
+            RETURN NEW;
+        ELSIF OLD.call_number  <> NEW.call_number THEN
+            SELECT * INTO ocn FROM asset.call_number cn WHERE id = OLD.call_number;
+
+            IF ncn.record <> ocn.record THEN
+                UPDATE  biblio.record_entry
+                  SET   vis_attr_vector = biblio.calculate_bib_visibility_attribute_set(ncn.record)
+                  WHERE id = ocn.record;
+            END IF;
+        END IF;
+
+        IF OLD.location     <> NEW.location OR
+           OLD.status       <> NEW.status OR
+           OLD.opac_visible <> NEW.opac_visible OR
+           OLD.circ_lib     <> NEW.circ_lib
+        THEN
+            -- any of these could change visibility, but
+            -- we'll save some queries and not try to calculate
+            -- the change directly
+            UPDATE  asset.copy_vis_attr_cache
+              SET   target_copy = NEW.id,
+                    vis_attr_vector = asset.calculate_copy_visibility_attribute_set(NEW.id)
+              WHERE target_copy = OLD.id;
+
+        END IF;
+
+    ELSIF TG_TABLE_NAME = 'call_number' THEN -- Only ON UPDATE. Copy handler will deal with ON INSERT OR DELETE.
+
+        IF OLD.record <> NEW.record THEN
+            IF NEW.label = '##URI##' THEN
+                UPDATE  biblio.record_entry
+                  SET   vis_attr_vector = biblio.calculate_bib_visibility_attribute_set(OLD.record)
+                  WHERE id = OLD.record;
+
+                UPDATE  biblio.record_entry
+                  SET   vis_attr_vector = biblio.calculate_bib_visibility_attribute_set(NEW.record)
+                  WHERE id = NEW.record;
+            END IF;
+
+            UPDATE  asset.copy_vis_attr_cache
+              SET   record = NEW.record,
+                    vis_attr_vector = asset.calculate_copy_visibility_attribute_set(target_copy)
+              WHERE target_copy IN (SELECT id FROM asset.copy WHERE call_number = NEW.id)
+                    AND record = OLD.record;
+
+        ELSIF OLD.owning_lib <> NEW.owning_lib THEN
+            UPDATE  asset.copy_vis_attr_cache
+              SET   vis_attr_vector = asset.calculate_copy_visibility_attribute_set(target_copy)
+              WHERE target_copy IN (SELECT id FROM asset.copy WHERE call_number = NEW.id)
+                    AND record = NEW.record;
+
+            IF NEW.label = '##URI##' THEN
+                UPDATE  biblio.record_entry
+                  SET   vis_attr_vector = biblio.calculate_bib_visibility_attribute_set(OLD.record)
+                  WHERE id = OLD.record;
+            END IF;
+        END IF;
+
+    ELSIF TG_TABLE_NAME = 'record_entry' THEN -- Only handles ON UPDATE OR DELETE
+
+        IF TG_OP = 'DELETE' THEN -- Shouldn't get here, normally
+            DELETE FROM asset.copy_vis_attr_cache WHERE record = OLD.id;
+            RETURN OLD;
+        ELSIF OLD.source <> NEW.source THEN
+            NEW.vis_attr_vector := biblio.calculate_bib_visibility_attribute_set(NEW.id);
+        END IF;
+
+    END IF;
+
+    RETURN NEW;
+END;
+$func$ LANGUAGE PLPGSQL;
+
+
+-- Helper functions for use in constructing searches --
+
+CREATE OR REPLACE FUNCTION asset.all_visible_flags () RETURNS TEXT AS $f$
+    SELECT  '(' || ARRAY_TO_STRING(ARRAY_AGG(search.calculate_visibility_attribute(1 << x, 'copy_flags')),'&') || ')'
+      FROM  GENERATE_SERIES(0,0) AS x; -- increment as new flags are added.
+$f$ LANGUAGE SQL STABLE;
+
+CREATE OR REPLACE FUNCTION asset.visible_orgs (otype TEXT) RETURNS TEXT AS $f$
+    SELECT  '(' || ARRAY_TO_STRING(ARRAY_AGG(search.calculate_visibility_attribute(id, $1)),'|') || ')'
+      FROM  actor.org_unit
+      WHERE opac_visible;
+$f$ LANGUAGE SQL STABLE;
+
+CREATE OR REPLACE FUNCTION asset.invisible_orgs (otype TEXT) RETURNS TEXT AS $f$
+    SELECT  '!(' || ARRAY_TO_STRING(ARRAY_AGG(search.calculate_visibility_attribute(id, $1)),'|') || ')'
+      FROM  actor.org_unit
+      WHERE NOT opac_visible;
+$f$ LANGUAGE SQL STABLE;
+
+-- Bib-oriented defaults for search
+CREATE OR REPLACE FUNCTION asset.bib_source_default () RETURNS TEXT AS $f$
+    SELECT  '(' || ARRAY_TO_STRING(ARRAY_AGG(search.calculate_visibility_attribute(id, 'bib_source')),'|') || ')'
+      FROM  config.bib_source
+      WHERE transcendant;
+$f$ LANGUAGE SQL IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION asset.luri_org_default () RETURNS TEXT AS $f$
+    SELECT  * FROM asset.invisible_orgs('luri_org');
+$f$ LANGUAGE SQL STABLE;
+
+-- Copy-oriented defaults for search
+CREATE OR REPLACE FUNCTION asset.location_group_default () RETURNS TEXT AS $f$
+    SELECT  '!(' || ARRAY_TO_STRING(ARRAY_AGG(search.calculate_visibility_attribute(id, 'location_group')),'|') || ')'
+      FROM  asset.copy_location_group
+      WHERE NOT opac_visible;
+$f$ LANGUAGE SQL STABLE;
+
+CREATE OR REPLACE FUNCTION asset.location_default () RETURNS TEXT AS $f$
+    SELECT  '!(' || ARRAY_TO_STRING(ARRAY_AGG(search.calculate_visibility_attribute(id, 'location')),'|') || ')'
+      FROM  asset.copy_location
+      WHERE NOT opac_visible;
+$f$ LANGUAGE SQL STABLE;
+
+CREATE OR REPLACE FUNCTION asset.status_default () RETURNS TEXT AS $f$
+    SELECT  '!(' || ARRAY_TO_STRING(ARRAY_AGG(search.calculate_visibility_attribute(id, 'status')),'|') || ')'
+      FROM  config.copy_status
+      WHERE NOT opac_visible;
+$f$ LANGUAGE SQL STABLE;
+
+CREATE OR REPLACE FUNCTION asset.owning_lib_default () RETURNS TEXT AS $f$
+    SELECT  * FROM asset.invisible_orgs('owning_lib');
+$f$ LANGUAGE SQL STABLE;
+
+CREATE OR REPLACE FUNCTION asset.circ_lib_default () RETURNS TEXT AS $f$
+    SELECT  * FROM asset.invisible_orgs('circ_lib');
+$f$ LANGUAGE SQL STABLE;
+
+CREATE OR REPLACE FUNCTION asset.patron_default_visibility_mask () RETURNS TABLE (b_attrs TEXT, c_attrs TEXT)  AS $f$
+DECLARE
+    copy_flags      TEXT; -- "c" attr
+
+    owning_lib      TEXT; -- "c" attr
+    circ_lib        TEXT; -- "c" attr
+    status          TEXT; -- "c" attr
+    location        TEXT; -- "c" attr
+    location_group  TEXT; -- "c" attr
+
+    luri_org        TEXT; -- "b" attr
+    bib_sources     TEXT; -- "b" attr
+BEGIN
+    copy_flags      := asset.all_visible_flags(); -- Will always have at least one
+
+    owning_lib      := NULLIF(asset.owning_lib_default(),'!()');
+    
+    circ_lib        := NULLIF(asset.circ_lib_default(),'!()');
+    status          := NULLIF(asset.status_default(),'!()');
+    location        := NULLIF(asset.location_default(),'!()');
+    location_group  := NULLIF(asset.location_group_default(),'!()');
+
+    luri_org        := NULLIF(asset.luri_org_default(),'!()');
+    bib_sources     := NULLIF(asset.bib_source_default(),'()');
+
+    RETURN QUERY SELECT
+        '('||ARRAY_TO_STRING(
+            ARRAY[luri_org,bib_sources],
+            '|'
+        )||')',
+        '('||ARRAY_TO_STRING(
+            ARRAY[copy_flags,owning_lib,circ_lib,status,location,location_group]::TEXT[],
+            '&'
+        )||')';
+END;
+$f$ LANGUAGE PLPGSQL STABLE ROWS 1;
+
+CREATE OR REPLACE FUNCTION metabib.suggest_browse_entries(raw_query_text text, search_class text, headline_opts text, visibility_org integer, query_limit integer, normalization integer)
+ RETURNS TABLE(value text, field integer, buoyant_and_class_match boolean, field_match boolean, field_weight integer, rank real, buoyant boolean, match text)
+AS $f$
+DECLARE
+    prepared_query_texts    TEXT[];
+    query                   TSQUERY;
+    plain_query             TSQUERY;
+    opac_visibility_join    TEXT;
+    search_class_join       TEXT;
+    r_fields                RECORD;
+BEGIN
+    prepared_query_texts := metabib.autosuggest_prepare_tsquery(raw_query_text);
+
+    query := TO_TSQUERY('keyword', prepared_query_texts[1]);
+    plain_query := TO_TSQUERY('keyword', prepared_query_texts[2]);
+
+    visibility_org := NULLIF(visibility_org,-1);
+    IF visibility_org IS NOT NULL THEN
+        PERFORM FROM actor.org_unit WHERE id = visibility_org AND parent_ou IS NULL;
+        IF FOUND THEN
+            opac_visibility_join := '';
+        ELSE
+            opac_visibility_join := '
+    JOIN asset.copy_vis_attr_cache acvac ON (acvac.record = x.source)
+    JOIN vm ON (acvac.vis_attr_vector @@
+            (vm.c_attrs || $$&$$ ||
+                search.calculate_visibility_attribute_test(
+                    $$circ_lib$$,
+                    (SELECT ARRAY_AGG(id) FROM actor.org_unit_descendants($4))
+                )
+            )::query_int
+         )
+';
+        END IF;
+    ELSE
+        opac_visibility_join := '';
+    END IF;
+
+    -- The following determines whether we only provide suggestsons matching
+    -- the user's selected search_class, or whether we show other suggestions
+    -- too. The reason for MIN() is that for search_classes like
+    -- 'title|proper|uniform' you would otherwise get multiple rows.  The
+    -- implication is that if title as a class doesn't have restrict,
+    -- nor does the proper field, but the uniform field does, you're going
+    -- to get 'false' for your overall evaluation of 'should we restrict?'
+    -- To invert that, change from MIN() to MAX().
+
+    SELECT
+        INTO r_fields
+            MIN(cmc.restrict::INT) AS restrict_class,
+            MIN(cmf.restrict::INT) AS restrict_field
+        FROM metabib.search_class_to_registered_components(search_class)
+            AS _registered (field_class TEXT, field INT)
+        JOIN
+            config.metabib_class cmc ON (cmc.name = _registered.field_class)
+        LEFT JOIN
+            config.metabib_field cmf ON (cmf.id = _registered.field);
+
+    -- evaluate 'should we restrict?'
+    IF r_fields.restrict_field::BOOL OR r_fields.restrict_class::BOOL THEN
+        search_class_join := '
+    JOIN
+        metabib.search_class_to_registered_components($2)
+        AS _registered (field_class TEXT, field INT) ON (
+            (_registered.field IS NULL AND
+                _registered.field_class = cmf.field_class) OR
+            (_registered.field = cmf.id)
+        )
+    ';
+    ELSE
+        search_class_join := '
+    LEFT JOIN
+        metabib.search_class_to_registered_components($2)
+        AS _registered (field_class TEXT, field INT) ON (
+            _registered.field_class = cmc.name
+        )
+    ';
+    END IF;
+
+    RETURN QUERY EXECUTE '
+WITH vm AS ( SELECT * FROM asset.patron_default_visibility_mask() ),
+     mbe AS (SELECT * FROM metabib.browse_entry WHERE index_vector @@ $1 LIMIT 10000)
+SELECT  DISTINCT
+        x.value,
+        x.id,
+        x.push,
+        x.restrict,
+        x.weight,
+        x.ts_rank_cd,
+        x.buoyant,
+        TS_HEADLINE(value, $7, $3)
+  FROM  (SELECT DISTINCT
+                mbe.value,
+                cmf.id,
+                cmc.buoyant AND _registered.field_class IS NOT NULL AS push,
+                _registered.field = cmf.id AS restrict,
+                cmf.weight,
+                TS_RANK_CD(mbe.index_vector, $1, $6),
+                cmc.buoyant,
+                mbedm.source
+          FROM  metabib.browse_entry_def_map mbedm
+                JOIN mbe ON (mbe.id = mbedm.entry)
+                JOIN config.metabib_field cmf ON (cmf.id = mbedm.def)
+                JOIN config.metabib_class cmc ON (cmf.field_class = cmc.name)
+                '  || search_class_join || '
+          ORDER BY 3 DESC, 4 DESC NULLS LAST, 5 DESC, 6 DESC, 7 DESC, 1 ASC
+          LIMIT 1000) AS x
+        ' || opac_visibility_join || '
+  ORDER BY 3 DESC, 4 DESC NULLS LAST, 5 DESC, 6 DESC, 7 DESC, 1 ASC
+  LIMIT $5
+'   -- sic, repeat the order by clause in the outer select too
+    USING
+        query, search_class, headline_opts,
+        visibility_org, query_limit, normalization, plain_query
+        ;
+
+    -- sort order:
+    --  buoyant AND chosen class = match class
+    --  chosen field = match field
+    --  field weight
+    --  rank
+    --  buoyancy
+    --  value itself
+
+END;
+$f$ LANGUAGE plpgsql ROWS 10;
+
+CREATE OR REPLACE FUNCTION metabib.browse(search_field integer[], browse_term text, context_org integer DEFAULT NULL::integer, context_loc_group integer DEFAULT NULL::integer, staff boolean DEFAULT false, pivot_id bigint DEFAULT NULL::bigint, result_limit integer DEFAULT 10)
+ RETURNS SETOF metabib.flat_browse_entry_appearance
+AS $f$
+DECLARE
+    core_query              TEXT;
+    back_query              TEXT;
+    forward_query           TEXT;
+    pivot_sort_value        TEXT;
+    pivot_sort_fallback     TEXT;
+    context_locations       INT[];
+    browse_superpage_size   INT;
+    results_skipped         INT := 0;
+    back_limit              INT;
+    back_to_pivot           INT;
+    forward_limit           INT;
+    forward_to_pivot        INT;
+BEGIN
+    -- First, find the pivot if we were given a browse term but not a pivot.
+    IF pivot_id IS NULL THEN
+        pivot_id := metabib.browse_pivot(search_field, browse_term);
+    END IF;
+
+    SELECT INTO pivot_sort_value, pivot_sort_fallback
+        sort_value, value FROM metabib.browse_entry WHERE id = pivot_id;
+
+    -- Bail if we couldn't find a pivot.
+    IF pivot_sort_value IS NULL THEN
+        RETURN;
+    END IF;
+
+    -- Transform the context_loc_group argument (if any) (logc at the
+    -- TPAC layer) into a form we'll be able to use.
+    IF context_loc_group IS NOT NULL THEN
+        SELECT INTO context_locations ARRAY_AGG(location)
+            FROM asset.copy_location_group_map
+            WHERE lgroup = context_loc_group;
+    END IF;
+
+    -- Get the configured size of browse superpages.
+    SELECT INTO browse_superpage_size COALESCE(value::INT,100)     -- NULL ok
+        FROM config.global_flag
+        WHERE enabled AND name = 'opac.browse.holdings_visibility_test_limit';
+
+    -- First we're going to search backward from the pivot, then we're going
+    -- to search forward.  In each direction, we need two limits.  At the
+    -- lesser of the two limits, we delineate the edge of the result set
+    -- we're going to return.  At the greater of the two limits, we find the
+    -- pivot value that would represent an offset from the current pivot
+    -- at a distance of one "page" in either direction, where a "page" is a
+    -- result set of the size specified in the "result_limit" argument.
+    --
+    -- The two limits in each direction make four derived values in total,
+    -- and we calculate them now.
+    back_limit := CEIL(result_limit::FLOAT / 2);
+    back_to_pivot := result_limit;
+    forward_limit := result_limit / 2;
+    forward_to_pivot := result_limit - 1;
+
+    -- This is the meat of the SQL query that finds browse entries.  We'll
+    -- pass this to a function which uses it with a cursor, so that individual
+    -- rows may be fetched in a loop until some condition is satisfied, without
+    -- waiting for a result set of fixed size to be collected all at once.
+    core_query := '
+SELECT  mbe.id,
+        mbe.value,
+        mbe.sort_value
+  FROM  metabib.browse_entry mbe
+  WHERE (
+            EXISTS ( -- are there any bibs using this mbe via the requested fields?
+                SELECT  1
+                  FROM  metabib.browse_entry_def_map mbedm
+                  WHERE mbedm.entry = mbe.id AND mbedm.def = ANY(' || quote_literal(search_field) || ')
+            ) OR EXISTS ( -- are there any authorities using this mbe via the requested fields?
+                SELECT  1
+                  FROM  metabib.browse_entry_simple_heading_map mbeshm
+                        JOIN authority.simple_heading ash ON ( mbeshm.simple_heading = ash.id )
+                        JOIN authority.control_set_auth_field_metabib_field_map_refs map ON (
+                            ash.atag = map.authority_field
+                            AND map.metabib_field = ANY(' || quote_literal(search_field) || ')
+                        )
+                  WHERE mbeshm.entry = mbe.id
+            )
+        ) AND ';
+
+    -- This is the variant of the query for browsing backward.
+    back_query := core_query ||
+        ' mbe.sort_value <= ' || quote_literal(pivot_sort_value) ||
+    ' ORDER BY mbe.sort_value DESC, mbe.value DESC LIMIT 1000';
+
+    -- This variant browses forward.
+    forward_query := core_query ||
+        ' mbe.sort_value > ' || quote_literal(pivot_sort_value) ||
+    ' ORDER BY mbe.sort_value, mbe.value LIMIT 1000';
+
+    -- We now call the function which applies a cursor to the provided
+    -- queries, stopping at the appropriate limits and also giving us
+    -- the next page's pivot.
+    RETURN QUERY
+        SELECT * FROM metabib.staged_browse(
+            back_query, search_field, context_org, context_locations,
+            staff, browse_superpage_size, TRUE, back_limit, back_to_pivot
+        ) UNION
+        SELECT * FROM metabib.staged_browse(
+            forward_query, search_field, context_org, context_locations,
+            staff, browse_superpage_size, FALSE, forward_limit, forward_to_pivot
+        ) ORDER BY row_number DESC;
+
+END;
+$f$ LANGUAGE plpgsql ROWS 10;
+
+CREATE OR REPLACE FUNCTION metabib.staged_browse(query text, fields integer[], context_org integer, context_locations integer[], staff boolean, browse_superpage_size integer, count_up_from_zero boolean, result_limit integer, next_pivot_pos integer)
+ RETURNS SETOF metabib.flat_browse_entry_appearance
+AS $f$
+DECLARE
+    curs                    REFCURSOR;
+    rec                     RECORD;
+    qpfts_query             TEXT;
+    aqpfts_query            TEXT;
+    afields                 INT[];
+    bfields                 INT[];
+    result_row              metabib.flat_browse_entry_appearance%ROWTYPE;
+    results_skipped         INT := 0;
+    row_counter             INT := 0;
+    row_number              INT;
+    slice_start             INT;
+    slice_end               INT;
+    full_end                INT;
+    all_records             BIGINT[];
+    all_brecords             BIGINT[];
+    all_arecords            BIGINT[];
+    superpage_of_records    BIGINT[];
+    superpage_size          INT;
+    c_tests                 TEXT := '';
+    b_tests                 TEXT := '';
+    c_orgs                  INT[];
+BEGIN
+    IF count_up_from_zero THEN
+        row_number := 0;
+    ELSE
+        row_number := -1;
+    END IF;
+
+    IF NOT staff THEN
+        SELECT x.c_attrs, x.b_attrs INTO c_tests, b_tests FROM asset.patron_default_visibility_mask() x;
+    END IF;
+
+    IF c_tests <> '' THEN c_tests := c_tests || '&'; END IF;
+    IF b_tests <> '' THEN b_tests := b_tests || '&'; END IF;
+
+    SELECT ARRAY_AGG(id) INTO c_orgs FROM actor.org_unit_descendants(context_org);
+    
+    c_tests := c_tests || search.calculate_visibility_attribute_test('circ_lib',c_orgs)
+               || '&' || search.calculate_visibility_attribute_test('owning_lib',c_orgs);
+    
+    PERFORM 1 FROM config.internal_flag WHERE enabled AND name = 'opac.located_uri.act_as_copy';
+    IF FOUND THEN
+        b_tests := b_tests || search.calculate_visibility_attribute_test(
+            'luri_org',
+            (SELECT ARRAY_AGG(id) FROM actor.org_unit_full_path(context_org) x)
+        );
+    ELSE
+        b_tests := b_tests || search.calculate_visibility_attribute_test(
+            'luri_org',
+            (SELECT ARRAY_AGG(id) FROM actor.org_unit_ancestors(context_org) x)
+        );
+    END IF;
+
+    IF context_locations THEN
+        IF c_tests <> '' THEN c_tests := c_tests || '&'; END IF;
+        c_tests := c_tests || search.calculate_visibility_attribute_test('location',context_locations);
+    END IF;
+
+    OPEN curs NO SCROLL FOR EXECUTE query;
+
+    LOOP
+        FETCH curs INTO rec;
+        IF NOT FOUND THEN
+            IF result_row.pivot_point IS NOT NULL THEN
+                RETURN NEXT result_row;
+            END IF;
+            RETURN;
+        END IF;
+
+        -- Gather aggregate data based on the MBE row we're looking at now, authority axis
+        SELECT INTO all_arecords, result_row.sees, afields
+                ARRAY_AGG(DISTINCT abl.bib), -- bibs to check for visibility
+                STRING_AGG(DISTINCT aal.source::TEXT, $$,$$), -- authority record ids
+                ARRAY_AGG(DISTINCT map.metabib_field) -- authority-tag-linked CMF rows
+
+          FROM  metabib.browse_entry_simple_heading_map mbeshm
+                JOIN authority.simple_heading ash ON ( mbeshm.simple_heading = ash.id )
+                JOIN authority.authority_linking aal ON ( ash.record = aal.source )
+                JOIN authority.bib_linking abl ON ( aal.target = abl.authority )
+                JOIN authority.control_set_auth_field_metabib_field_map_refs map ON (
+                    ash.atag = map.authority_field
+                    AND map.metabib_field = ANY(fields)
+                )
+          WHERE mbeshm.entry = rec.id;
+
+        -- Gather aggregate data based on the MBE row we're looking at now, bib axis
+        SELECT INTO all_brecords, result_row.authorities, bfields
+                ARRAY_AGG(DISTINCT source),
+                STRING_AGG(DISTINCT authority::TEXT, $$,$$),
+                ARRAY_AGG(DISTINCT def)
+          FROM  metabib.browse_entry_def_map
+          WHERE entry = rec.id
+                AND def = ANY(fields);
+
+        SELECT INTO result_row.fields STRING_AGG(DISTINCT x::TEXT, $$,$$) FROM UNNEST(afields || bfields) x;
+
+        result_row.sources := 0;
+        result_row.asources := 0;
+
+        -- Bib-linked vis checking
+        IF ARRAY_UPPER(all_brecords,1) IS NOT NULL THEN
+
+            SELECT  INTO result_row.sources COUNT(DISTINCT b.id)
+              FROM  biblio.record_entry b
+                    JOIN asset.copy_vis_attr_cache acvac ON (acvac.record = b.id)
+              WHERE b.id = ANY(all_brecords[1:browse_superpage_size])
+                    AND (
+                        acvac.vis_attr_vector @@ c_tests::query_int
+                        OR b.vis_attr_vector @@ b_tests::query_int
+                    );
+
+            result_row.accurate := TRUE;
+
+        END IF;
+
+        -- Authority-linked vis checking
+        IF ARRAY_UPPER(all_arecords,1) IS NOT NULL THEN
+
+            SELECT  INTO result_row.asources COUNT(DISTINCT b.id)
+              FROM  biblio.record_entry b
+                    JOIN asset.copy_vis_attr_cache acvac ON (acvac.record = b.id)
+              WHERE b.id = ANY(all_arecords[1:browse_superpage_size])
+                    AND (
+                        acvac.vis_attr_vector @@ c_tests::query_int
+                        OR b.vis_attr_vector @@ b_tests::query_int
+                    );
+
+            result_row.aaccurate := TRUE;
+
+        END IF;
+
+        IF result_row.sources > 0 OR result_row.asources > 0 THEN
+
+            -- The function that calls this function needs row_number in order
+            -- to correctly order results from two different runs of this
+            -- functions.
+            result_row.row_number := row_number;
+
+            -- Now, if row_counter is still less than limit, return a row.  If
+            -- not, but it is less than next_pivot_pos, continue on without
+            -- returning actual result rows until we find
+            -- that next pivot, and return it.
+
+            IF row_counter < result_limit THEN
+                result_row.browse_entry := rec.id;
+                result_row.value := rec.value;
+
+                RETURN NEXT result_row;
+            ELSE
+                result_row.browse_entry := NULL;
+                result_row.authorities := NULL;
+                result_row.fields := NULL;
+                result_row.value := NULL;
+                result_row.sources := NULL;
+                result_row.sees := NULL;
+                result_row.accurate := NULL;
+                result_row.aaccurate := NULL;
+                result_row.pivot_point := rec.id;
+
+                IF row_counter >= next_pivot_pos THEN
+                    RETURN NEXT result_row;
+                    RETURN;
+                END IF;
+            END IF;
+
+            IF count_up_from_zero THEN
+                row_number := row_number + 1;
+            ELSE
+                row_number := row_number - 1;
+            END IF;
+
+            -- row_counter is different from row_number.
+            -- It simply counts up from zero so that we know when
+            -- we've reached our limit.
+            row_counter := row_counter + 1;
+        END IF;
+    END LOOP;
+END;
+$f$ LANGUAGE plpgsql ROWS 10;
+
+DROP TRIGGER IF EXISTS a_opac_vis_mat_view_tgr ON biblio.peer_bib_copy_map;
+DROP TRIGGER IF EXISTS a_opac_vis_mat_view_tgr ON biblio.record_entry;
+DROP TRIGGER IF EXISTS a_opac_vis_mat_view_tgr ON asset.copy;
+DROP TRIGGER IF EXISTS a_opac_vis_mat_view_tgr ON asset.call_number;
+DROP TRIGGER IF EXISTS a_opac_vis_mat_view_tgr ON asset.copy_location;
+DROP TRIGGER IF EXISTS a_opac_vis_mat_view_tgr ON serial.unit;
+DROP TRIGGER IF EXISTS a_opac_vis_mat_view_tgr ON config.copy_status;
+DROP TRIGGER IF EXISTS a_opac_vis_mat_view_tgr ON actor.org_unit;
+
+-- Upgrade the data!
+INSERT INTO asset.copy_vis_attr_cache (target_copy, record, vis_attr_vector)
+    SELECT  cp.id,
+            cn.record,
+            asset.calculate_copy_visibility_attribute_set(cp.id)
+      FROM  asset.copy cp
+            JOIN asset.call_number cn ON (cp.call_number = cn.id);
+
+UPDATE biblio.record_entry SET vis_attr_vector = biblio.calculate_bib_visibility_attribute_set(id);
+
+CREATE TRIGGER z_opac_vis_mat_view_tgr BEFORE INSERT OR UPDATE ON biblio.record_entry FOR EACH ROW EXECUTE PROCEDURE asset.cache_copy_visibility();
+CREATE TRIGGER z_opac_vis_mat_view_tgr AFTER INSERT OR DELETE ON biblio.peer_bib_copy_map FOR EACH ROW EXECUTE PROCEDURE asset.cache_copy_visibility();
+CREATE TRIGGER z_opac_vis_mat_view_tgr AFTER UPDATE ON asset.call_number FOR EACH ROW EXECUTE PROCEDURE asset.cache_copy_visibility();
+CREATE TRIGGER z_opac_vis_mat_view_del_tgr BEFORE DELETE ON asset.copy FOR EACH ROW EXECUTE PROCEDURE asset.cache_copy_visibility();
+CREATE TRIGGER z_opac_vis_mat_view_del_tgr BEFORE DELETE ON serial.unit FOR EACH ROW EXECUTE PROCEDURE asset.cache_copy_visibility();
+CREATE TRIGGER z_opac_vis_mat_view_tgr AFTER INSERT OR UPDATE ON asset.copy FOR EACH ROW EXECUTE PROCEDURE asset.cache_copy_visibility();
+CREATE TRIGGER z_opac_vis_mat_view_tgr AFTER INSERT OR UPDATE ON serial.unit FOR EACH ROW EXECUTE PROCEDURE asset.cache_copy_visibility();
+
+CREATE OR REPLACE FUNCTION asset.opac_ou_record_copy_count (org INT, rid BIGINT) RETURNS TABLE (depth INT, org_unit INT, visible BIGINT, available BIGINT, unshadow BIGINT, transcendant INT) AS $f$
+DECLARE
+    ans RECORD;
+    trans INT;
+BEGIN
+    SELECT 1 INTO trans FROM biblio.record_entry b JOIN config.bib_source src ON (b.source = src.id) WHERE src.transcendant AND b.id = rid;
+
+    FOR ans IN SELECT u.id, t.depth FROM actor.org_unit_ancestors(org) AS u JOIN actor.org_unit_type t ON (u.ou_type = t.id) LOOP
+        RETURN QUERY
+        WITH org_list AS (SELECT ARRAY_AGG(id)::BIGINT[] AS orgs FROM actor.org_unit_descendants(ans.id) x),
+             available_statuses AS (SELECT ARRAY_AGG(id) AS ids FROM config.copy_status WHERE is_available),
+             mask AS (SELECT c_attrs FROM asset.patron_default_visibility_mask() x)
+        SELECT  ans.depth,
+                ans.id,
+                COUNT( av.id ),
+                SUM( (cp.status = ANY (available_statuses.ids))::INT ),
+                COUNT( av.id ),
+                trans
+          FROM  mask,
+                available_statuses,
+                org_list,
+                asset.copy_vis_attr_cache av
+                JOIN asset.copy cp ON (cp.id = av.target_copy AND av.record = rid)
+          WHERE cp.circ_lib = ANY (org_list.orgs) AND av.vis_attr_vector @@ mask.c_attrs::query_int
+          GROUP BY 1,2,6;
+
+        IF NOT FOUND THEN
+            RETURN QUERY SELECT ans.depth, ans.id, 0::BIGINT, 0::BIGINT, 0::BIGINT, trans;
+        END IF;
+
+    END LOOP;
+
+    RETURN;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION asset.opac_lasso_record_copy_count (i_lasso INT, rid BIGINT) RETURNS TABLE (depth INT, org_unit INT, visible BIGINT, available BIGINT, unshadow BIGINT, transcendant INT) AS $f$
+DECLARE
+    ans RECORD;
+    trans INT;
+BEGIN
+    SELECT 1 INTO trans FROM biblio.record_entry b JOIN config.bib_source src ON (b.source = src.id) WHERE src.transcendant AND b.id = rid;
+
+    FOR ans IN SELECT u.org_unit AS id FROM actor.org_lasso_map AS u WHERE lasso = i_lasso LOOP
+        RETURN QUERY
+        WITH org_list AS (SELECT ARRAY_AGG(id)::BIGINT[] AS orgs FROM actor.org_unit_descendants(ans.id) x),
+             available_statuses AS (SELECT ARRAY_AGG(id) AS ids FROM config.copy_status WHERE is_available),
+             mask AS (SELECT c_attrs FROM asset.patron_default_visibility_mask() x)
+        SELECT  -1,
+                ans.id,
+                COUNT( av.id ),
+                SUM( (cp.status = ANY (available_statuses.ids))::INT ),
+                COUNT( av.id ),
+                trans
+          FROM  mask,
+                org_list,
+                asset.copy_vis_attr_cache av
+                JOIN asset.copy cp ON (cp.id = av.target_copy AND av.record = rid)
+          WHERE cp.circ_lib = ANY (org_list.orgs) AND av.vis_attr_vector @@ mask.c_attrs::query_int
+          GROUP BY 1,2,6;
+
+        IF NOT FOUND THEN
+            RETURN QUERY SELECT -1, ans.id, 0::BIGINT, 0::BIGINT, 0::BIGINT, trans;
+        END IF;
+
+    END LOOP;
+
+    RETURN;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION asset.opac_ou_metarecord_copy_count (org INT, rid BIGINT) RETURNS TABLE (depth INT, org_unit INT, visible BIGINT, available BIGINT, unshadow BIGINT, transcendant INT) AS $f$
+DECLARE
+    ans RECORD;
+    trans INT;
+BEGIN
+    SELECT 1 INTO trans FROM biblio.record_entry b JOIN config.bib_source src ON (b.source = src.id) JOIN metabib.metarecord_source_map m ON (m.source = b.id) WHERE src.transcendant AND m.metarecord = rid;
+
+    FOR ans IN SELECT u.id, t.depth FROM actor.org_unit_ancestors(org) AS u JOIN actor.org_unit_type t ON (u.ou_type = t.id) LOOP
+        RETURN QUERY
+        WITH org_list AS (SELECT ARRAY_AGG(id)::BIGINT[] AS orgs FROM actor.org_unit_descendants(ans.id) x),
+             available_statuses AS (SELECT ARRAY_AGG(id) AS ids FROM config.copy_status WHERE is_available),
+             mask AS (SELECT c_attrs FROM asset.patron_default_visibility_mask() x)
+        SELECT  ans.depth,
+                ans.id,
+                COUNT( av.id ),
+                SUM( (cp.status = ANY (available_statuses.ids))::INT ),
+                COUNT( av.id ),
+                trans
+          FROM  mask,
+                org_list,
+                available_statuses,
+                asset.copy_vis_attr_cache av
+                JOIN asset.copy cp ON (cp.id = av.target_copy)
+                JOIN metabib.metarecord_source_map m ON (m.metarecord = rid AND m.source = av.record)
+          WHERE cp.circ_lib = ANY (org_list.orgs) AND av.vis_attr_vector @@ mask.c_attrs::query_int
+          GROUP BY 1,2,6;
+
+        IF NOT FOUND THEN
+            RETURN QUERY SELECT ans.depth, ans.id, 0::BIGINT, 0::BIGINT, 0::BIGINT, trans;
+        END IF;
+
+    END LOOP;
+
+    RETURN;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION asset.opac_lasso_metarecord_copy_count (i_lasso INT, rid BIGINT) RETURNS TABLE (depth INT, org_unit INT, visible BIGINT, available BIGINT, unshadow BIGINT, transcendant INT) AS $f$
+DECLARE
+    ans RECORD;
+    trans INT;
+BEGIN
+    SELECT 1 INTO trans FROM biblio.record_entry b JOIN config.bib_source src ON (b.source = src.id) JOIN metabib.metarecord_source_map m ON (m.source = b.id) WHERE src.transcendant AND m.metarecord = rid;
+
+    FOR ans IN SELECT u.org_unit AS id FROM actor.org_lasso_map AS u WHERE lasso = i_lasso LOOP
+        RETURN QUERY
+        WITH org_list AS (SELECT ARRAY_AGG(id)::BIGINT[] AS orgs FROM actor.org_unit_descendants(ans.id) x),
+             available_statuses AS (SELECT ARRAY_AGG(id) AS ids FROM config.copy_status WHERE is_available),
+             mask AS (SELECT c_attrs FROM asset.patron_default_visibility_mask() x)
+        SELECT  -1,
+                ans.id,
+                COUNT( av.id ),
+                SUM( (cp.status = ANY (available_statuses.ids))::INT ),
+                COUNT( av.id ),
+                trans
+          FROM  mask,
+                org_list,
+                available_statuses,
+                asset.copy_vis_attr_cache av
+                JOIN asset.copy cp ON (cp.id = av.target_copy)
+                JOIN metabib.metarecord_source_map m ON (m.metarecord = rid AND m.source = av.record)
+          WHERE cp.circ_lib = ANY (org_list.orgs) AND av.vis_attr_vector @@ mask.c_attrs::query_int
+          GROUP BY 1,2,6;
+
+        IF NOT FOUND THEN
+            RETURN QUERY SELECT ans.depth, ans.id, 0::BIGINT, 0::BIGINT, 0::BIGINT, trans;
+        END IF;
+
+    END LOOP;
+
+    RETURN;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION unapi.mmr_mra (
+    obj_id BIGINT,
+    format TEXT,
+    ename TEXT,
+    includes TEXT[],
+    org TEXT,
+    depth INT DEFAULT NULL,
+    slimit HSTORE DEFAULT NULL,
+    soffset HSTORE DEFAULT NULL,
+    include_xmlns BOOL DEFAULT TRUE,
+    pref_lib INT DEFAULT NULL
+) RETURNS XML AS $F$
+    SELECT  XMLELEMENT(
+        name attributes,
+        XMLATTRIBUTES(
+            CASE WHEN $9 THEN 'http://open-ils.org/spec/indexing/v1' ELSE NULL END AS xmlns,
+            'tag:open-ils.org:U2 at mmr/' || $1 AS metarecord
+        ),
+        (SELECT XMLAGG(foo.y)
+          FROM (
+            WITH sourcelist AS (
+                WITH aou AS (SELECT COALESCE(id, (evergreen.org_top()).id) AS id FROM actor.org_unit WHERE shortname = $5 LIMIT 1),
+                     basevm AS (SELECT c_attrs FROM  asset.patron_default_visibility_mask()),
+                     circvm AS (SELECT search.calculate_visibility_attribute_test('circ_lib', ARRAY_AGG(aoud.id)) AS mask
+                                  FROM aou, LATERAL actor.org_unit_descendants(aou.id, $6) aoud)
+                SELECT  source
+                  FROM  aou, circvm, basevm, metabib.metarecord_source_map mmsm
+                  WHERE mmsm.metarecord = $1 AND (
+                    EXISTS (
+                        SELECT  1
+                          FROM  circvm, basevm, asset.copy_vis_attr_cache acvac
+                          WHERE acvac.vis_attr_vector @@ (basevm.c_attrs || '&' || circvm.mask)::query_int
+                                AND acvac.record = mmsm.source
+                    )
+                    OR EXISTS (SELECT 1 FROM evergreen.located_uris(source, aou.id, $10) LIMIT 1)
+                    OR EXISTS (SELECT 1 FROM biblio.record_entry b JOIN config.bib_source src ON (b.source = src.id) WHERE src.transcendant AND b.id = mmsm.source)
+                )
+            )
+            SELECT  cmra.aid,
+                    XMLELEMENT(
+                        name field,
+                        XMLATTRIBUTES(
+                            cmra.attr AS name,
+                            cmra.value AS "coded-value",
+                            cmra.aid AS "cvmid",
+                            rad.composite,
+                            rad.multi,
+                            rad.filter,
+                            rad.sorter,
+                            cmra.source_list
+                        ),
+                        cmra.value
+                    )
+              FROM  (
+                SELECT DISTINCT aid, attr, value, STRING_AGG(x.id::TEXT, ',') AS source_list
+                  FROM (
+                    SELECT  v.source AS id,
+                            c.id AS aid,
+                            c.ctype AS attr,
+                            c.code AS value
+                      FROM  metabib.record_attr_vector_list v
+                            JOIN config.coded_value_map c ON ( c.id = ANY( v.vlist ) )
+                    ) AS x
+                    JOIN sourcelist ON (x.id = sourcelist.source)
+                    GROUP BY 1, 2, 3
+                ) AS cmra
+                JOIN config.record_attr_definition rad ON (cmra.attr = rad.name)
+                UNION ALL
+            SELECT  umra.aid,
+                    XMLELEMENT(
+                        name field,
+                        XMLATTRIBUTES(
+                            umra.attr AS name,
+                            rad.composite,
+                            rad.multi,
+                            rad.filter,
+                            rad.sorter
+                        ),
+                        umra.value
+                    )
+              FROM  (
+                SELECT DISTINCT aid, attr, value
+                  FROM (
+                    SELECT  v.source AS id,
+                            m.id AS aid,
+                            m.attr AS attr,
+                            m.value AS value
+                      FROM  metabib.record_attr_vector_list v
+                            JOIN metabib.uncontrolled_record_attr_value m ON ( m.id = ANY( v.vlist ) )
+                    ) AS x
+                    JOIN sourcelist ON (x.id = sourcelist.source)
+                ) AS umra
+                JOIN config.record_attr_definition rad ON (umra.attr = rad.name)
+                ORDER BY 1
+
+            )foo(id,y)
+        )
+    )
+$F$ LANGUAGE SQL STABLE;
+
+CREATE OR REPLACE FUNCTION evergreen.ranked_volumes(
+    bibid BIGINT[],
+    ouid INT,
+    depth INT DEFAULT NULL,
+    slimit HSTORE DEFAULT NULL,
+    soffset HSTORE DEFAULT NULL,
+    pref_lib INT DEFAULT NULL,
+    includes TEXT[] DEFAULT NULL::TEXT[]
+) RETURNS TABLE(id BIGINT, name TEXT, label_sortkey TEXT, rank BIGINT) AS $$
+    WITH RECURSIVE ou_depth AS (
+        SELECT COALESCE(
+            $3,
+            (
+                SELECT depth
+                FROM actor.org_unit_type aout
+                    INNER JOIN actor.org_unit ou ON ou_type = aout.id
+                WHERE ou.id = $2
+            )
+        ) AS depth
+    ), descendant_depth AS (
+        SELECT  ou.id,
+                ou.parent_ou,
+                out.depth
+        FROM  actor.org_unit ou
+                JOIN actor.org_unit_type out ON (out.id = ou.ou_type)
+                JOIN anscestor_depth ad ON (ad.id = ou.id),
+                ou_depth
+        WHERE ad.depth = ou_depth.depth
+            UNION ALL
+        SELECT  ou.id,
+                ou.parent_ou,
+                out.depth
+        FROM  actor.org_unit ou
+                JOIN actor.org_unit_type out ON (out.id = ou.ou_type)
+                JOIN descendant_depth ot ON (ot.id = ou.parent_ou)
+    ), anscestor_depth AS (
+        SELECT  ou.id,
+                ou.parent_ou,
+                out.depth
+        FROM  actor.org_unit ou
+                JOIN actor.org_unit_type out ON (out.id = ou.ou_type)
+        WHERE ou.id = $2
+            UNION ALL
+        SELECT  ou.id,
+                ou.parent_ou,
+                out.depth
+        FROM  actor.org_unit ou
+                JOIN actor.org_unit_type out ON (out.id = ou.ou_type)
+                JOIN anscestor_depth ot ON (ot.parent_ou = ou.id)
+    ), descendants as (
+        SELECT ou.* FROM actor.org_unit ou JOIN descendant_depth USING (id)
+    )
+
+    SELECT ua.id, ua.name, ua.label_sortkey, MIN(ua.rank) AS rank FROM (
+        SELECT acn.id, owning_lib.name, acn.label_sortkey,
+            evergreen.rank_cp(acp),
+            RANK() OVER w
+        FROM asset.call_number acn
+            JOIN asset.copy acp ON (acn.id = acp.call_number)
+            JOIN descendants AS aou ON (acp.circ_lib = aou.id)
+            JOIN actor.org_unit AS owning_lib ON (acn.owning_lib = owning_lib.id)
+        WHERE acn.record = ANY ($1)
+            AND acn.deleted IS FALSE
+            AND acp.deleted IS FALSE
+            AND CASE WHEN ('exclude_invisible_acn' = ANY($7)) THEN
+                EXISTS (
+                    WITH basevm AS (SELECT c_attrs FROM  asset.patron_default_visibility_mask()),
+                         circvm AS (SELECT search.calculate_visibility_attribute_test('circ_lib', ARRAY[acp.circ_lib]) AS mask)
+                    SELECT  1
+                      FROM  basevm, circvm, asset.copy_vis_attr_cache acvac
+                      WHERE acvac.vis_attr_vector @@ (basevm.c_attrs || '&' || circvm.mask)::query_int
+                            AND acvac.target_copy = acp.id
+                            AND acvac.record = acn.record
+                ) ELSE TRUE END
+        GROUP BY acn.id, evergreen.rank_cp(acp), owning_lib.name, acn.label_sortkey, aou.id
+        WINDOW w AS (
+            ORDER BY
+                COALESCE(
+                    CASE WHEN aou.id = $2 THEN -20000 END,
+                    CASE WHEN aou.id = $6 THEN -10000 END,
+                    (SELECT distance - 5000
+                        FROM actor.org_unit_descendants_distance($6) as x
+                        WHERE x.id = aou.id AND $6 IN (
+                            SELECT q.id FROM actor.org_unit_descendants($2) as q)),
+                    (SELECT e.distance FROM actor.org_unit_descendants_distance($2) as e WHERE e.id = aou.id),
+                    1000
+                ),
+                evergreen.rank_cp(acp)
+        )
+    ) AS ua
+    GROUP BY ua.id, ua.name, ua.label_sortkey
+    ORDER BY rank, ua.name, ua.label_sortkey
+    LIMIT ($4 -> 'acn')::INT
+    OFFSET ($5 -> 'acn')::INT;
+$$ LANGUAGE SQL STABLE ROWS 10;
+
+
+-- Evergreen DB patch XXXX.schema.action-trigger.event_definition.sms_preminder.sql
+--
+-- New action trigger event definition: 3 Day Courtesy Notice by SMS
+--
+
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('1058', :eg_version); -- mccanna/csharp/gmcharlt
+
+INSERT INTO action_trigger.event_definition (id, active, owner, name, hook,
+        validator, reactor, delay, max_delay, delay_field, group_field, template)
+    VALUES (54, FALSE, 1,
+        '3 Day Courtesy Notice by SMS',
+        'checkout.due',
+        'CircIsOpen', 'SendSMS', '-3 days', '-2 days', 'due_date', 'usr',
+$$
+[%- USE date -%]
+[%- user = target.0.usr -%]
+[%- homelib = user.home_ou -%]
+[%- sms_number = helpers.get_user_setting(user.id, 'opac.default_sms_notify') -%]
+[%- sms_carrier = helpers.get_user_setting(user.id, 'opac.default_sms_carrier') -%]
+From: [%- helpers.get_org_setting(homelib.id, 'org.bounced_emails') || homelib.email || params.sender_email || default_sender %]
+To: [%- helpers.get_sms_gateway_email(sms_carrier,sms_number) %]
+Subject: Library Materials Due Soon
+
+You have items due soon:
+
+[% FOR circ IN target %]
+[%- copy_details = helpers.get_copy_bib_basics(circ.target_copy.id) -%]
+[% copy_details.title FILTER ucfirst %] by [% copy_details.author FILTER ucfirst %] due on [% date.format(helpers.format_date(circ.due_date), '%m-%d-%Y') %]
+
+[% END %]
+
+$$);
+
+INSERT INTO action_trigger.environment (event_def, path) VALUES
+    (54, 'circ_lib.billing_address'),
+    (54, 'target_copy.call_number'),
+    (54, 'usr'),
+    (54, 'usr.home_ou');
+
+
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('1059', :eg_version); --Stompro/DPearl/kmlussier
+
+CREATE OR REPLACE VIEW reporter.old_super_simple_record AS
+SELECT  r.id,
+    r.fingerprint,
+    r.quality,
+    r.tcn_source,
+    r.tcn_value,
+    CONCAT_WS(' ', FIRST(title.value),FIRST(title_np.val)) AS title,
+    FIRST(author.value) AS author,
+    STRING_AGG(DISTINCT publisher.value, ', ') AS publisher,
+    STRING_AGG(DISTINCT SUBSTRING(pubdate.value FROM $$\d+$$), ', ') AS pubdate,
+    CASE WHEN ARRAY_AGG( DISTINCT REPLACE(SUBSTRING(isbn.value FROM $$^\S+$$), '-', '') ) = '{NULL}'
+        THEN NULL
+        ELSE ARRAY_AGG( DISTINCT REPLACE(SUBSTRING(isbn.value FROM $$^\S+$$), '-', '') )
+    END AS isbn,
+    CASE WHEN ARRAY_AGG( DISTINCT REGEXP_REPLACE(issn.value, E'^\\S*(\\d{4})[-\\s](\\d{3,4}x?)', E'\\1 \\2') ) = '{NULL}'
+        THEN NULL
+        ELSE ARRAY_AGG( DISTINCT REGEXP_REPLACE(issn.value, E'^\\S*(\\d{4})[-\\s](\\d{3,4}x?)', E'\\1 \\2') )
+    END AS issn
+  FROM  biblio.record_entry r
+    LEFT JOIN metabib.full_rec title ON (r.id = title.record AND title.tag = '245' AND title.subfield = 'a')
+    LEFT JOIN ( -- Grab 245 N and P subfields in the order that they appear.
+      SELECT b.record, string_agg(val, ' ') AS val FROM (
+	     SELECT title_np.record, title_np.value AS val
+	      FROM metabib.full_rec title_np
+	      WHERE
+	      title_np.tag = '245'
+			AND title_np.subfield IN ('p','n')			
+			ORDER BY title_np.id
+		) b
+		GROUP BY 1
+	 ) title_np ON (title_np.record=r.id) 
+    LEFT JOIN metabib.full_rec author ON (r.id = author.record AND author.tag IN ('100','110','111') AND author.subfield = 'a')
+    LEFT JOIN metabib.full_rec publisher ON (r.id = publisher.record AND (publisher.tag = '260' OR (publisher.tag = '264' AND publisher.ind2 = '1')) AND publisher.subfield = 'b')
+    LEFT JOIN metabib.full_rec pubdate ON (r.id = pubdate.record AND (pubdate.tag = '260' OR (pubdate.tag = '264' AND pubdate.ind2 = '1')) AND pubdate.subfield = 'c')
+    LEFT JOIN metabib.full_rec isbn ON (r.id = isbn.record AND isbn.tag IN ('024', '020') AND isbn.subfield IN ('a','z'))
+    LEFT JOIN metabib.full_rec issn ON (r.id = issn.record AND issn.tag = '022' AND issn.subfield = 'a')
+  GROUP BY 1,2,3,4,5;
+
+  
+  -- Remove trigger on biblio.record_entry
+  SELECT reporter.disable_materialized_simple_record_trigger();
+  
+  -- Rebuild reporter.materialized_simple_record
+  SELECT reporter.enable_materialized_simple_record_trigger();
+  
+
+SELECT evergreen.upgrade_deps_block_check('1060', :eg_version);
+
+DROP VIEW IF EXISTS extend_reporter.copy_count_per_org;
+
+
+CREATE OR REPLACE VIEW extend_reporter.copy_count_per_org AS
+ SELECT acn.record AS bibid,
+    ac.circ_lib,
+    acn.owning_lib,
+    max(ac.edit_date) AS last_edit_time,
+    min(ac.deleted::integer) AS has_only_deleted_copies,
+    count(
+        CASE
+            WHEN ac.deleted THEN ac.id
+            ELSE NULL::bigint
+        END) AS deleted_count,
+    count(
+        CASE
+            WHEN NOT ac.deleted THEN ac.id
+            ELSE NULL::bigint
+        END) AS visible_count,
+    count(*) AS total_count
+   FROM asset.call_number acn,
+    asset.copy ac
+  WHERE ac.call_number = acn.id
+  GROUP BY acn.record, acn.owning_lib, ac.circ_lib;
+
+
+
+SELECT evergreen.upgrade_deps_block_check('1061', :eg_version);
+
+INSERT INTO config.org_unit_setting_type
+    (name, label, description, grp, datatype)
+VALUES (
+    'ui.staff.max_recent_patrons',
+    oils_i18n_gettext(
+        'ui.staff.max_recent_patrons',
+        'Number of Retrievable Recent Patrons',
+        'coust',
+        'label'
+    ),
+    oils_i18n_gettext(
+        'ui.staff.max_recent_patrons',
+        'Number of most recently accessed patrons that can be re-retrieved ' ||
+        'in the staff client.  A value of 0 or less disables the feature. Defaults to 1.',
+        'coust',
+        'description'
+    ),
+    'circ',
+    'integer'
+);
+
+
+SELECT evergreen.upgrade_deps_block_check('1062', :eg_version);
+
+CREATE TABLE acq.edi_attr (
+    key     TEXT PRIMARY KEY,
+    label   TEXT NOT NULL UNIQUE
+);
+
+CREATE TABLE acq.edi_attr_set (
+    id      SERIAL  PRIMARY KEY,
+    label   TEXT NOT NULL UNIQUE
+);
+
+CREATE TABLE acq.edi_attr_set_map (
+    id          SERIAL  PRIMARY KEY,
+    attr_set    INTEGER NOT NULL REFERENCES acq.edi_attr_set(id) 
+                ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    attr        TEXT NOT NULL REFERENCES acq.edi_attr(key) 
+                ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    CONSTRAINT edi_attr_set_map_attr_once UNIQUE (attr_set, attr)
+);
+
+-- An attr_set is not strictly required, since some edi_accounts/vendors 
+-- may not need to apply any attributes.
+ALTER TABLE acq.edi_account 
+    ADD COLUMN attr_set INTEGER REFERENCES acq.edi_attr_set(id),
+    ADD COLUMN use_attrs BOOLEAN NOT NULL DEFAULT FALSE;
+
+
+
+
+SELECT evergreen.upgrade_deps_block_check('1063', :eg_version);
+
+DO $temp$
+DECLARE
+	r RECORD;
+BEGIN
+
+	FOR r IN SELECT	t.table_schema AS sname,
+			t.table_name AS tname,
+			t.column_name AS colname,
+			t.constraint_name
+		  FROM	information_schema.referential_constraints ref
+			JOIN information_schema.key_column_usage t USING (constraint_schema,constraint_name)
+		  WHERE	ref.unique_constraint_schema = 'asset'
+			AND ref.unique_constraint_name = 'copy_pkey'
+	LOOP
+
+		EXECUTE 'ALTER TABLE '||r.sname||'.'||r.tname||' DROP CONSTRAINT '||r.constraint_name||';';
+
+		EXECUTE '
+			CREATE OR REPLACE FUNCTION evergreen.'||r.sname||'_'||r.tname||'_'||r.colname||'_inh_fkey() RETURNS TRIGGER AS $f$
+			BEGIN
+				PERFORM 1 FROM asset.copy WHERE id = NEW.'||r.colname||';
+				IF NOT FOUND THEN
+					RAISE foreign_key_violation USING MESSAGE = FORMAT(
+						$$Referenced asset.copy id not found, '||r.colname||':%s$$, NEW.'||r.colname||'
+					);
+				END IF;
+				RETURN NEW;
+			END;
+			$f$ LANGUAGE PLPGSQL VOLATILE COST 50;
+		';
+
+		EXECUTE '
+			CREATE CONSTRAINT TRIGGER inherit_'||r.constraint_name||'
+				AFTER UPDATE OR INSERT OR DELETE ON '||r.sname||'.'||r.tname||'
+				DEFERRABLE FOR EACH ROW EXECUTE PROCEDURE evergreen.'||r.sname||'_'||r.tname||'_'||r.colname||'_inh_fkey();
+		';
+	END LOOP;
+END
+$temp$;
+
+
+
+SELECT evergreen.upgrade_deps_block_check('1064', :eg_version);
+
+ALTER TABLE serial.issuance DROP CONSTRAINT IF EXISTS issuance_caption_and_pattern_fkey;
+
+-- Using NOT VALID and VALIDATE CONSTRAINT limits the impact to concurrent work.
+-- For details, see: https://www.postgresql.org/docs/current/static/sql-altertable.html
+
+ALTER TABLE serial.issuance ADD CONSTRAINT issuance_caption_and_pattern_fkey
+    FOREIGN KEY (caption_and_pattern)
+    REFERENCES serial.caption_and_pattern (id)
+    ON DELETE CASCADE
+    DEFERRABLE INITIALLY DEFERRED
+    NOT VALID;
+
+ALTER TABLE serial.issuance VALIDATE CONSTRAINT issuance_caption_and_pattern_fkey;
+
+
+
+SELECT evergreen.upgrade_deps_block_check('1065', :eg_version);
+
+CREATE TABLE serial.pattern_template (
+    id            SERIAL PRIMARY KEY,
+    name          TEXT NOT NULL,
+    pattern_code  TEXT NOT NULL,
+    owning_lib    INTEGER REFERENCES actor.org_unit(id) DEFERRABLE INITIALLY DEFERRED,
+    share_depth   INTEGER NOT NULL DEFAULT 0
+);
+CREATE INDEX serial_pattern_template_name_idx ON serial.pattern_template (evergreen.lowercase(name));
+
+CREATE OR REPLACE FUNCTION serial.pattern_templates_visible_to(org_unit INT) RETURNS SETOF serial.pattern_template AS $func$
+BEGIN
+    RETURN QUERY SELECT *
+           FROM serial.pattern_template spt
+           WHERE (
+             SELECT ARRAY_AGG(id)
+             FROM actor.org_unit_descendants(spt.owning_lib, spt.share_depth)
+           ) @@ org_unit::TEXT::QUERY_INT;
+END;
+$func$ LANGUAGE PLPGSQL;
+
+
+SELECT evergreen.upgrade_deps_block_check('1066', :eg_version);
+
+INSERT INTO permission.perm_list ( id, code, description ) VALUES
+ ( 593, 'ADMIN_SERIAL_PATTERN_TEMPLATE', oils_i18n_gettext( 593,
+    'Administer serial prediction pattern templates', 'ppl', 'description' ))
+;
+
+INSERT INTO permission.grp_perm_map (grp, perm, depth, grantable)
+    SELECT
+        pgt.id, perm.id, aout.depth, FALSE
+    FROM
+        permission.grp_tree pgt,
+        permission.perm_list perm,
+        actor.org_unit_type aout
+    WHERE
+        pgt.name = 'Serials' AND
+        aout.name = 'System' AND
+        perm.code IN (
+            'ADMIN_SERIAL_PATTERN_TEMPLATE'
+        );
+
+
+SELECT evergreen.upgrade_deps_block_check('1067', :eg_version);
+
+INSERT INTO acq.edi_attr (key, label) VALUES
+    ('INCLUDE_PO_NAME', 
+        oils_i18n_gettext('INCLUDE_PO_NAME', 
+        'Orders Include PO Name', 'aea', 'label')),
+    ('INCLUDE_COPIES', 
+        oils_i18n_gettext('INCLUDE_COPIES', 
+        'Orders Include Copy Data', 'aea', 'label')),
+    ('INCLUDE_FUND', 
+        oils_i18n_gettext('INCLUDE_FUND', 
+        'Orders Include Copy Funds', 'aea', 'label')),
+    ('INCLUDE_CALL_NUMBER', 
+        oils_i18n_gettext('INCLUDE_CALL_NUMBER', 
+        'Orders Include Copy Call Numbers', 'aea', 'label')),
+    ('INCLUDE_ITEM_TYPE', 
+        oils_i18n_gettext('INCLUDE_ITEM_TYPE', 
+        'Orders Include Copy Item Types', 'aea', 'label')),
+    ('INCLUDE_ITEM_BARCODE',
+        oils_i18n_gettext('INCLUDE_ITEM_BARCODE',
+        'Orders Include Copy Barcodes', 'aea', 'label')),
+    ('INCLUDE_LOCATION', 
+        oils_i18n_gettext('INCLUDE_LOCATION', 
+        'Orders Include Copy Locations', 'aea', 'label')),
+    ('INCLUDE_COLLECTION_CODE', 
+        oils_i18n_gettext('INCLUDE_COLLECTION_CODE', 
+        'Orders Include Copy Collection Codes', 'aea', 'label')),
+    ('INCLUDE_OWNING_LIB', 
+        oils_i18n_gettext('INCLUDE_OWNING_LIB', 
+        'Orders Include Copy Owning Library', 'aea', 'label')),
+    ('USE_ID_FOR_OWNING_LIB',
+        oils_i18n_gettext('USE_ID_FOR_OWNING_LIB',
+        'Emit Owning Library ID Rather Than Short Name. Takes effect only if INCLUDE_OWNING_LIB is in use', 'aea', 'label')),
+    ('INCLUDE_QUANTITY', 
+        oils_i18n_gettext('INCLUDE_QUANTITY', 
+        'Orders Include Copy Quantities', 'aea', 'label')),
+    ('INCLUDE_COPY_ID', 
+        oils_i18n_gettext('INCLUDE_COPY_ID', 
+        'Orders Include Copy IDs', 'aea', 'label')),
+    ('BUYER_ID_INCLUDE_VENDCODE', 
+        oils_i18n_gettext('BUYER_ID_INCLUDE_VENDCODE', 
+        'Buyer ID Qualifier Includes Vendcode', 'aea', 'label')),
+    ('BUYER_ID_ONLY_VENDCODE', 
+        oils_i18n_gettext('BUYER_ID_ONLY_VENDCODE', 
+        'Buyer ID Qualifier Only Contains Vendcode', 'aea', 'label')),
+    ('INCLUDE_BIB_EDITION', 
+        oils_i18n_gettext('INCLUDE_BIB_EDITION', 
+        'Order Lineitems Include Edition Info', 'aea', 'label')),
+    ('INCLUDE_BIB_AUTHOR', 
+        oils_i18n_gettext('INCLUDE_BIB_AUTHOR', 
+        'Order Lineitems Include Author Info', 'aea', 'label')),
+    ('INCLUDE_BIB_PAGINATION', 
+        oils_i18n_gettext('INCLUDE_BIB_PAGINATION', 
+        'Order Lineitems Include Pagination Info', 'aea', 'label')),
+    ('COPY_SPEC_CODES', 
+        oils_i18n_gettext('COPY_SPEC_CODES', 
+        'Order Lineitem Notes Include Copy Spec Codes', 'aea', 'label')),
+    ('INCLUDE_EMPTY_IMD_VALUES', 
+        oils_i18n_gettext('INCLUDE_EMPTY_IMD_VALUES',
+        'Lineitem Title, Author, etc. Fields Are Present Even if Empty', 'aea', 'label')),
+    ('INCLUDE_EMPTY_LI_NOTE', 
+        oils_i18n_gettext('INCLUDE_EMPTY_LI_NOTE', 
+        'Order Lineitem Notes Always Present (Even if Empty)', 'aea', 'label')),
+    ('INCLUDE_EMPTY_CALL_NUMBER', 
+        oils_i18n_gettext('INCLUDE_EMPTY_CALL_NUMBER', 
+        'Order Copies Always Include Call Number (Even if Empty)', 'aea', 'label')),
+    ('INCLUDE_EMPTY_ITEM_TYPE', 
+        oils_i18n_gettext('INCLUDE_EMPTY_ITEM_TYPE', 
+        'Order Copies Always Include Item Type (Even if Empty)', 'aea', 'label')),
+    ('INCLUDE_EMPTY_LOCATION', 
+        oils_i18n_gettext('INCLUDE_EMPTY_LOCATION', 
+        'Order Copies Always Include Location (Even if Empty)', 'aea', 'label')),
+    ('INCLUDE_EMPTY_COLLECTION_CODE', 
+        oils_i18n_gettext('INCLUDE_EMPTY_COLLECTION_CODE', 
+        'Order Copies Always Include Collection Code (Even if Empty)', 'aea', 'label')),
+    ('LINEITEM_IDENT_VENDOR_NUMBER',
+        oils_i18n_gettext('LINEITEM_IDENT_VENDOR_NUMBER',
+        'Lineitem Identifier Fields (LIN/PIA) Use Vendor-Encoded ID Value When Available', 'aea', 'label')),
+    ('LINEITEM_REF_ID_ONLY',
+        oils_i18n_gettext('LINEITEM_REF_ID_ONLY',
+        'Lineitem Reference Field (RFF) Uses Lineitem ID Only', 'aea', 'label'))
+
+;
+
+INSERT INTO acq.edi_attr_set (id, label) VALUES (1, 'Ingram Default');
+INSERT INTO acq.edi_attr_set (id, label) VALUES (2, 'Baker & Taylor Default');
+INSERT INTO acq.edi_attr_set (id, label) VALUES (3, 'Brodart Default');
+INSERT INTO acq.edi_attr_set (id, label) VALUES (4, 'Midwest Tape Default');
+INSERT INTO acq.edi_attr_set (id, label) VALUES (5, 'ULS Default');
+INSERT INTO acq.edi_attr_set (id, label) VALUES (6, 'Recorded Books Default');
+INSERT INTO acq.edi_attr_set (id, label) VALUES (7, 'Midwest Library Service');
+
+-- carve out space for mucho defaults
+SELECT SETVAL('acq.edi_attr_set_id_seq'::TEXT, 1000);
+
+INSERT INTO acq.edi_attr_set_map (attr_set, attr) VALUES
+
+    -- Ingram
+    (1, 'INCLUDE_PO_NAME'),
+    (1, 'INCLUDE_COPIES'),
+    (1, 'INCLUDE_ITEM_TYPE'),
+    (1, 'INCLUDE_COLLECTION_CODE'),
+    (1, 'INCLUDE_OWNING_LIB'),
+    (1, 'INCLUDE_QUANTITY'),
+    (1, 'INCLUDE_BIB_PAGINATION'),
+
+    -- B&T
+    (2, 'INCLUDE_COPIES'),
+    (2, 'INCLUDE_ITEM_TYPE'),
+    (2, 'INCLUDE_COLLECTION_CODE'),
+    (2, 'INCLUDE_CALL_NUMBER'),
+    (2, 'INCLUDE_OWNING_LIB'),
+    (2, 'INCLUDE_QUANTITY'),
+    (2, 'INCLUDE_BIB_PAGINATION'),
+    (2, 'BUYER_ID_INCLUDE_VENDCODE'),
+    (2, 'INCLUDE_EMPTY_LI_NOTE'),
+    (2, 'INCLUDE_EMPTY_CALL_NUMBER'),
+    (2, 'INCLUDE_EMPTY_ITEM_TYPE'),
+    (2, 'INCLUDE_EMPTY_COLLECTION_CODE'),
+    (2, 'INCLUDE_EMPTY_LOCATION'),
+    (2, 'LINEITEM_IDENT_VENDOR_NUMBER'),
+    (2, 'LINEITEM_REF_ID_ONLY'),
+
+    -- Brodart
+    (3, 'INCLUDE_COPIES'),
+    (3, 'INCLUDE_FUND'),
+    (3, 'INCLUDE_ITEM_TYPE'),
+    (3, 'INCLUDE_COLLECTION_CODE'),
+    (3, 'INCLUDE_OWNING_LIB'),
+    (3, 'INCLUDE_QUANTITY'),
+    (3, 'INCLUDE_BIB_PAGINATION'),
+    (3, 'COPY_SPEC_CODES'),
+
+    -- Midwest
+    (4, 'INCLUDE_COPIES'),
+    (4, 'INCLUDE_FUND'),
+    (4, 'INCLUDE_OWNING_LIB'),
+    (4, 'INCLUDE_QUANTITY'),
+    (4, 'INCLUDE_BIB_PAGINATION'),
+
+    -- ULS
+    (5, 'INCLUDE_COPIES'),
+    (5, 'INCLUDE_ITEM_TYPE'),
+    (5, 'INCLUDE_COLLECTION_CODE'),
+    (5, 'INCLUDE_OWNING_LIB'),
+    (5, 'INCLUDE_QUANTITY'),
+    (5, 'INCLUDE_BIB_AUTHOR'),
+    (5, 'INCLUDE_BIB_EDITION'),
+    (5, 'INCLUDE_EMPTY_LI_NOTE'),
+
+    -- Recorded Books
+    (6, 'INCLUDE_COPIES'),
+    (6, 'INCLUDE_ITEM_TYPE'),
+    (6, 'INCLUDE_COLLECTION_CODE'),
+    (6, 'INCLUDE_OWNING_LIB'),
+    (6, 'INCLUDE_QUANTITY'),
+    (6, 'INCLUDE_BIB_PAGINATION'),
+
+    -- Midwest Library Service
+    (7, 'INCLUDE_BIB_AUTHOR'),
+    (7, 'INCLUDE_BIB_EDITION'),
+    (7, 'BUYER_ID_ONLY_VENDCODE'),
+    (7, 'INCLUDE_EMPTY_IMD_VALUES')
+;
+
+
+
+
+
+SELECT evergreen.upgrade_deps_block_check('1068', :eg_version); --miker/gmcharlt/kmlussier
+
+INSERT INTO config.xml_transform (name,namespace_uri,prefix,xslt) VALUES ('mads21','http://www.loc.gov/mads/v2','mads21',$XSLT$<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" xmlns:mads="http://www.loc.gov/mads/v2"
+	xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:marc="http://www.loc.gov/MARC21/slim"
+	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="marc">
+	<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
+	<xsl:strip-space elements="*"/>
+
+	<xsl:variable name="ascii">
+		<xsl:text> !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~</xsl:text>
+	</xsl:variable>
+
+	<xsl:variable name="latin1">
+		<xsl:text> ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ</xsl:text>
+	</xsl:variable>
+	<!-- Characters that usually don't need to be escaped -->
+	<xsl:variable name="safe">
+		<xsl:text>!'()*-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~</xsl:text>
+	</xsl:variable>
+
+	<xsl:variable name="hex">0123456789ABCDEF</xsl:variable>
+
+
+	<xsl:template name="datafield">
+		<xsl:param name="tag"/>
+		<xsl:param name="ind1">
+			<xsl:text> </xsl:text>
+		</xsl:param>
+		<xsl:param name="ind2">
+			<xsl:text> </xsl:text>
+		</xsl:param>
+		<xsl:param name="subfields"/>
+		<xsl:element name="marc:datafield">
+			<xsl:attribute name="tag">
+				<xsl:value-of select="$tag"/>
+			</xsl:attribute>
+			<xsl:attribute name="ind1">
+				<xsl:value-of select="$ind1"/>
+			</xsl:attribute>
+			<xsl:attribute name="ind2">
+				<xsl:value-of select="$ind2"/>
+			</xsl:attribute>
+			<xsl:copy-of select="$subfields"/>
+		</xsl:element>
+	</xsl:template>
+
+	<xsl:template name="subfieldSelect">
+		<xsl:param name="codes">abcdefghijklmnopqrstuvwxyz</xsl:param>
+		<xsl:param name="delimeter">
+			<xsl:text> </xsl:text>
+		</xsl:param>
+		<xsl:variable name="str">
+			<xsl:for-each select="marc:subfield">
+				<xsl:if test="contains($codes, @code)">
+					<xsl:value-of select="text()"/>
+					<xsl:value-of select="$delimeter"/>
+				</xsl:if>
+			</xsl:for-each>
+		</xsl:variable>
+		<xsl:value-of select="substring($str,1,string-length($str)-string-length($delimeter))"/>
+	</xsl:template>
+
+	<xsl:template name="buildSpaces">
+		<xsl:param name="spaces"/>
+		<xsl:param name="char">
+			<xsl:text> </xsl:text>
+		</xsl:param>
+		<xsl:if test="$spaces>0">
+			<xsl:value-of select="$char"/>
+			<xsl:call-template name="buildSpaces">
+				<xsl:with-param name="spaces" select="$spaces - 1"/>
+				<xsl:with-param name="char" select="$char"/>
+			</xsl:call-template>
+		</xsl:if>
+	</xsl:template>
+
+	<xsl:template name="chopPunctuation">
+		<xsl:param name="chopString"/>
+		<xsl:param name="punctuation">
+			<xsl:text>.:,;/ </xsl:text>
+		</xsl:param>
+		<xsl:variable name="length" select="string-length($chopString)"/>
+		<xsl:choose>
+			<xsl:when test="$length=0"/>
+			<xsl:when test="contains($punctuation, substring($chopString,$length,1))">
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString" select="substring($chopString,1,$length - 1)"/>
+					<xsl:with-param name="punctuation" select="$punctuation"/>
+				</xsl:call-template>
+			</xsl:when>
+			<xsl:when test="not($chopString)"/>
+			<xsl:otherwise>
+				<xsl:value-of select="$chopString"/>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+
+	<xsl:template name="chopPunctuationFront">
+		<xsl:param name="chopString"/>
+		<xsl:variable name="length" select="string-length($chopString)"/>
+		<xsl:choose>
+			<xsl:when test="$length=0"/>
+			<xsl:when test="contains('.:,;/[ ', substring($chopString,1,1))">
+				<xsl:call-template name="chopPunctuationFront">
+					<xsl:with-param name="chopString" select="substring($chopString,2,$length - 1)"
+					/>
+				</xsl:call-template>
+			</xsl:when>
+			<xsl:when test="not($chopString)"/>
+			<xsl:otherwise>
+				<xsl:value-of select="$chopString"/>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+
+	<xsl:template name="chopPunctuationBack">
+		<xsl:param name="chopString"/>
+		<xsl:param name="punctuation">
+			<xsl:text>.:,;/] </xsl:text>
+		</xsl:param>
+		<xsl:variable name="length" select="string-length($chopString)"/>
+		<xsl:choose>
+			<xsl:when test="$length=0"/>
+			<xsl:when test="contains($punctuation, substring($chopString,$length,1))">
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString" select="substring($chopString,1,$length - 1)"/>
+					<xsl:with-param name="punctuation" select="$punctuation"/>
+				</xsl:call-template>
+			</xsl:when>
+			<xsl:when test="not($chopString)"/>
+			<xsl:otherwise>
+				<xsl:value-of select="$chopString"/>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+
+	<!-- nate added 12/14/2007 for lccn.loc.gov: url encode ampersand, etc. -->
+	<xsl:template name="url-encode">
+
+		<xsl:param name="str"/>
+
+		<xsl:if test="$str">
+			<xsl:variable name="first-char" select="substring($str,1,1)"/>
+			<xsl:choose>
+				<xsl:when test="contains($safe,$first-char)">
+					<xsl:value-of select="$first-char"/>
+				</xsl:when>
+				<xsl:otherwise>
+					<xsl:variable name="codepoint">
+						<xsl:choose>
+							<xsl:when test="contains($ascii,$first-char)">
+								<xsl:value-of
+									select="string-length(substring-before($ascii,$first-char)) + 32"
+								/>
+							</xsl:when>
+							<xsl:when test="contains($latin1,$first-char)">
+								<xsl:value-of
+									select="string-length(substring-before($latin1,$first-char)) + 160"/>
+								<!-- was 160 -->
+							</xsl:when>
+							<xsl:otherwise>
+								<xsl:message terminate="no">Warning: string contains a character
+									that is out of range! Substituting "?".</xsl:message>
+								<xsl:text>63</xsl:text>
+							</xsl:otherwise>
+						</xsl:choose>
+					</xsl:variable>
+					<xsl:variable name="hex-digit1"
+						select="substring($hex,floor($codepoint div 16) + 1,1)"/>
+					<xsl:variable name="hex-digit2" select="substring($hex,$codepoint mod 16 + 1,1)"/>
+					<!-- <xsl:value-of select="concat('%',$hex-digit2)"/> -->
+					<xsl:value-of select="concat('%',$hex-digit1,$hex-digit2)"/>
+				</xsl:otherwise>
+			</xsl:choose>
+			<xsl:if test="string-length($str) > 1">
+				<xsl:call-template name="url-encode">
+					<xsl:with-param name="str" select="substring($str,2)"/>
+				</xsl:call-template>
+			</xsl:if>
+		</xsl:if>
+	</xsl:template>
+
+
+<!--
+2.14    Fixed bug in mads:geographic attributes syntax                                      ws   05/04/2016		
+2.13	fixed repeating <geographic>														tmee 01/31/2014
+2.12	added $2 authority for <classification>												tmee 09/18/2012
+2.11	added delimiters between <classification> subfields									tmee 09/18/2012
+2.10	fixed type="other" and type="otherType" for mads:related							tmee 09/16/2011
+2.09	fixed professionTerm and genreTerm empty tag error									tmee 09/16/2011
+2.08	fixed marc:subfield @code='i' matching error										tmee 09/16/2011
+2.07	fixed 555 duplication error															tmee 08/10/2011	
+2.06	fixed topic subfield error															tmee 08/10/2011	
+2.05	fixed title subfield error															tmee 06/20/2011	
+2.04	fixed geographicSubdivision mapping for authority element							tmee 06/16/2011
+2.03	added classification for 053, 055, 060, 065, 070, 080, 082, 083, 086, 087			tmee 06/03/2011		
+2.02	added descriptionStandard for 008/10												tmee 04/27/2011
+2.01	added extensions for 046, 336, 370, 374, 375, 376									tmee 04/08/2011
+2.00	redefined imported MODS elements in version 1.0 to MADS elements in version 2.0		tmee 02/08/2011
+1.08	added 372 subfields $a $s $t for <fieldOfActivity>									tmee 06/24/2010
+1.07	removed role/roleTerm 100, 110, 111, 400, 410, 411, 500, 510, 511, 700, 710, 711	tmee 06/24/2010
+1.06	added strip-space																	tmee 06/24/2010
+1.05	added subfield $a for 130, 430, 530													tmee 06/21/2010
+1.04	fixed 550 z omission																ntra 08/11/2008
+1.03	removed duplication of 550 $a text													tmee 11/01/2006
+1.02	fixed namespace references between mads and mods									ntra 10/06/2006
+1.01	revised																				rgue/jrad 11/29/05
+1.00	adapted from MARC21Slim2MODS3.xsl													ntra 07/06/05
+-->
+
+	<!-- authority attribute defaults to 'naf' if not set using this authority parameter, for <authority> descriptors: name, titleInfo, geographic -->
+	<xsl:param name="authority"/>
+	<xsl:variable name="auth">
+		<xsl:choose>
+			<xsl:when test="$authority">
+				<xsl:value-of select="$authority"/>
+			</xsl:when>
+			<xsl:otherwise>naf</xsl:otherwise>
+		</xsl:choose>
+	</xsl:variable>
+	<xsl:variable name="controlField008" select="marc:controlfield[@tag='008']"/>
+	<xsl:variable name="controlField008-06"
+		select="substring(descendant-or-self::marc:controlfield[@tag=008],7,1)"/>
+	<xsl:variable name="controlField008-11"
+		select="substring(descendant-or-self::marc:controlfield[@tag=008],12,1)"/>
+	<xsl:variable name="controlField008-14"
+		select="substring(descendant-or-self::marc:controlfield[@tag=008],15,1)"/>
+	<xsl:template match="/">
+		<xsl:choose>
+			<xsl:when test="descendant-or-self::marc:collection">
+				<mads:madsCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+					xsi:schemaLocation="http://www.loc.gov/mads/v2 http://www.loc.gov/standards/mads/v2/mads-2-0.xsd">
+					<xsl:for-each select="descendant-or-self::marc:collection/marc:record">
+						<mads:mads version="2.0">
+							<xsl:call-template name="marcRecord"/>
+						</mads:mads>
+					</xsl:for-each>
+				</mads:madsCollection>
+			</xsl:when>
+			<xsl:otherwise>
+				<mads:mads version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+					xsi:schemaLocation="http://www.loc.gov/mads/v2 http://www.loc.gov/standards/mads/mads-2-0.xsd">
+					<xsl:for-each select="descendant-or-self::marc:record">
+						<xsl:call-template name="marcRecord"/>
+					</xsl:for-each>
+				</mads:mads>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+
+	<xsl:template name="marcRecord">
+		<mads:authority>
+			<!-- 2.04 -->
+			<xsl:choose>
+				<xsl:when test="$controlField008-06='d'">
+					<xsl:attribute name="geographicSubdivision">
+						<xsl:text>direct</xsl:text>
+					</xsl:attribute>
+				</xsl:when>
+				<xsl:when test="$controlField008-06='i'">
+					<xsl:attribute name="geographicSubdivision">
+						<xsl:text>indirect</xsl:text>
+					</xsl:attribute>
+				</xsl:when>
+				<xsl:when test="$controlField008-06='n'">
+					<xsl:attribute name="geographicSubdivision">
+						<xsl:text>not applicable</xsl:text>
+					</xsl:attribute>
+				</xsl:when>
+			</xsl:choose>
+			
+			<xsl:apply-templates select="marc:datafield[100 <= @tag  and @tag < 200]"/>		
+		</mads:authority>
+
+		<!-- related -->
+		<xsl:apply-templates
+			select="marc:datafield[500 <= @tag and @tag <= 585]|marc:datafield[700 <= @tag and @tag <= 785]"/>
+
+		<!-- variant -->
+		<xsl:apply-templates select="marc:datafield[400 <= @tag and @tag <= 485]"/>
+
+		<!-- notes -->
+		<xsl:apply-templates select="marc:datafield[667 <= @tag and @tag <= 688]"/>
+
+		<!-- url -->
+		<xsl:apply-templates select="marc:datafield[@tag=856]"/>
+		<xsl:apply-templates select="marc:datafield[@tag=010]"/>
+		<xsl:apply-templates select="marc:datafield[@tag=024]"/>
+		<xsl:apply-templates select="marc:datafield[@tag=372]"/>
+		
+		<!-- classification -->
+		<xsl:apply-templates select="marc:datafield[@tag=053]"/>
+		<xsl:apply-templates select="marc:datafield[@tag=055]"/>
+		<xsl:apply-templates select="marc:datafield[@tag=060]"/>
+		<xsl:apply-templates select="marc:datafield[@tag=065]"/>
+		<xsl:apply-templates select="marc:datafield[@tag=070]"/>
+		<xsl:apply-templates select="marc:datafield[@tag=080]"/>
+		<xsl:apply-templates select="marc:datafield[@tag=082]"/>
+		<xsl:apply-templates select="marc:datafield[@tag=083]"/>
+		<xsl:apply-templates select="marc:datafield[@tag=086]"/>
+		<xsl:apply-templates select="marc:datafield[@tag=087]"/>
+
+		<!-- affiliation-->
+		<xsl:for-each select="marc:datafield[@tag=373]">
+			<mads:affiliation>
+				<mads:position>
+					<xsl:value-of select="marc:subfield[@code='a']"/>
+				</mads:position>
+				<mads:dateValid point="start">
+					<xsl:value-of select="marc:subfield[@code='s']"/>
+				</mads:dateValid>
+				<mads:dateValid point="end">
+					<xsl:value-of select="marc:subfield[@code='t']"/>
+				</mads:dateValid>
+			</mads:affiliation>
+		</xsl:for-each>
+		<xsl:for-each select="marc:datafield[@tag=371]">
+			<mads:affiliation>
+				<mads:address>
+					<mads:street>
+						<xsl:value-of select="marc:subfield[@code='a']"/>
+					</mads:street>
+					<mads:city>
+						<xsl:value-of select="marc:subfield[@code='b']"/>
+					</mads:city>
+					<mads:state>
+						<xsl:value-of select="marc:subfield[@code='c']"/>
+					</mads:state>
+					<mads:country>
+						<xsl:value-of select="marc:subfield[@code='d']"/>
+					</mads:country>
+					<mads:postcode>
+						<xsl:value-of select="marc:subfield[@code='e']"/>
+					</mads:postcode>
+				</mads:address>
+				<mads:email>
+					<xsl:value-of select="marc:subfield[@code='m']"/>
+				</mads:email>
+			</mads:affiliation>
+		</xsl:for-each>
+
+		<!-- extension-->
+		<xsl:for-each select="marc:datafield[@tag=336]">
+			<mads:extension>
+				<mads:contentType>
+					<mads:contentType type="text">
+						<xsl:value-of select="marc:subfield[@code='a']"/>
+					</mads:contentType>
+					<mads:contentType type="code">
+						<xsl:value-of select="marc:subfield[@code='b']"/>
+					</mads:contentType>
+				</mads:contentType>
+			</mads:extension>
+		</xsl:for-each>
+
+		<xsl:for-each select="marc:datafield[@tag=374]">
+			<mads:extension>
+				<mads:profession>
+					<xsl:choose>
+						<xsl:when test="marc:subfield[@code='a']">
+							<mads:professionTerm>
+								<xsl:value-of select="marc:subfield[@code='a']"/>
+							</mads:professionTerm>
+						</xsl:when>
+						<xsl:when test="marc:subfield[@code='s']">
+							<mads:dateValid point="start">
+								<xsl:value-of select="marc:subfield[@code='s']"/>
+							</mads:dateValid>
+						</xsl:when>
+						<xsl:when test="marc:subfield[@code='t']">
+							<mads:dateValid point="end">
+								<xsl:value-of select="marc:subfield[@code='t']"/>
+							</mads:dateValid>
+						</xsl:when>
+					</xsl:choose>
+				</mads:profession>
+			</mads:extension>
+		</xsl:for-each>
+		
+		<xsl:for-each select="marc:datafield[@tag=375]">
+			<mads:extension>
+				<mads:gender>
+					<xsl:choose>
+						<xsl:when test="marc:subfield[@code='a']">
+							<mads:genderTerm>
+								<xsl:value-of select="marc:subfield[@code='a']"/>
+							</mads:genderTerm>
+						</xsl:when>
+						<xsl:when test="marc:subfield[@code='s']">
+							<mads:dateValid point="start">
+								<xsl:value-of select="marc:subfield[@code='s']"/>
+							</mads:dateValid>
+						</xsl:when>
+						<xsl:when test="marc:subfield[@code='t']">
+							<mads:dateValid point="end">
+								<xsl:value-of select="marc:subfield[@code='t']"/>
+							</mads:dateValid>
+						</xsl:when>
+					</xsl:choose>
+				</mads:gender>
+			</mads:extension>
+		</xsl:for-each>
+
+		<xsl:for-each select="marc:datafield[@tag=376]">
+			<mads:extension>
+				<mads:familyInformation>
+					<mads:typeOfFamily>
+						<xsl:value-of select="marc:subfield[@code='a']"/>
+					</mads:typeOfFamily>
+					<mads:nameOfProminentMember>
+						<xsl:value-of select="marc:subfield[@code='b']"/>
+					</mads:nameOfProminentMember>
+					<mads:hereditaryTitle>
+						<xsl:value-of select="marc:subfield[@code='c']"/>
+					</mads:hereditaryTitle>
+					<mads:dateValid point="start">
+						<xsl:value-of select="marc:subfield[@code='s']"/>
+					</mads:dateValid>
+					<mads:dateValid point="end">
+						<xsl:value-of select="marc:subfield[@code='t']"/>
+					</mads:dateValid>
+				</mads:familyInformation>
+			</mads:extension>
+		</xsl:for-each>
+
+		<mads:recordInfo>
+			<mads:recordOrigin>Converted from MARCXML to MADS version 2.0 (Revision 2.13)</mads:recordOrigin>
+			<!-- <xsl:apply-templates select="marc:datafield[@tag=024]"/> -->
+
+			<xsl:apply-templates select="marc:datafield[@tag=040]/marc:subfield[@code='a']"/>
+			<xsl:apply-templates select="marc:controlfield[@tag=005]"/>
+			<xsl:apply-templates select="marc:controlfield[@tag=001]"/>
+			<xsl:apply-templates select="marc:datafield[@tag=040]/marc:subfield[@code='b']"/>
+			<xsl:apply-templates select="marc:datafield[@tag=040]/marc:subfield[@code='e']"/>
+			<xsl:for-each select="marc:controlfield[@tag=008]">
+				<xsl:if test="substring(.,11,1)='a'">
+					<mads:descriptionStandard>
+						<xsl:text>earlier rules</xsl:text>
+					</mads:descriptionStandard>
+				</xsl:if>
+				<xsl:if test="substring(.,11,1)='b'">
+					<mads:descriptionStandard>
+						<xsl:text>aacr1</xsl:text>
+					</mads:descriptionStandard>
+				</xsl:if>
+				<xsl:if test="substring(.,11,1)='c'">
+					<mads:descriptionStandard>
+						<xsl:text>aacr2</xsl:text>
+					</mads:descriptionStandard>
+				</xsl:if>
+				<xsl:if test="substring(.,11,1)='d'">
+					<mads:descriptionStandard>
+						<xsl:text>aacr2 compatible</xsl:text>
+					</mads:descriptionStandard>
+				</xsl:if>
+				<xsl:if test="substring(.,11,1)='z'">
+					<mads:descriptionStandard>
+						<xsl:text>other rules</xsl:text>
+					</mads:descriptionStandard>
+				</xsl:if>
+			</xsl:for-each>
+		</mads:recordInfo>
+	</xsl:template>
+
+	<!-- start of secondary templates -->
+
+	<!-- ======== xlink ======== -->
+
+	<!-- <xsl:template name="uri"> 
+    <xsl:for-each select="marc:subfield[@code='0']">
+      <xsl:attribute name="xlink:href">
+	<xsl:value-of select="."/>
+      </xsl:attribute>
+    </xsl:for-each>
+     </xsl:template> 
+   -->
+	<xsl:template match="marc:subfield[@code='i']">
+		<xsl:attribute name="otherType">
+			<xsl:value-of select="."/>
+		</xsl:attribute>
+	</xsl:template>
+
+	<!-- No role/roleTerm mapped in MADS 06/24/2010
+	<xsl:template name="role">
+		<xsl:for-each select="marc:subfield[@code='e']">
+			<mads:role>
+				<mads:roleTerm type="text">
+					<xsl:value-of select="."/>
+				</mads:roleTerm>
+			</mads:role>
+		</xsl:for-each>
+	</xsl:template>
+-->
+
+	<xsl:template name="part">
+		<xsl:variable name="partNumber">
+			<xsl:call-template name="specialSubfieldSelect">
+				<xsl:with-param name="axis">n</xsl:with-param>
+				<xsl:with-param name="anyCodes">n</xsl:with-param>
+				<xsl:with-param name="afterCodes">fghkdlmor</xsl:with-param>
+			</xsl:call-template>
+		</xsl:variable>
+		<xsl:variable name="partName">
+			<xsl:call-template name="specialSubfieldSelect">
+				<xsl:with-param name="axis">p</xsl:with-param>
+				<xsl:with-param name="anyCodes">p</xsl:with-param>
+				<xsl:with-param name="afterCodes">fghkdlmor</xsl:with-param>
+			</xsl:call-template>
+		</xsl:variable>
+		<xsl:if test="string-length(normalize-space($partNumber))">
+			<mads:partNumber>
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString" select="$partNumber"/>
+				</xsl:call-template>
+			</mads:partNumber>
+		</xsl:if>
+		<xsl:if test="string-length(normalize-space($partName))">
+			<mads:partName>
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString" select="$partName"/>
+				</xsl:call-template>
+			</mads:partName>
+		</xsl:if>
+	</xsl:template>
+
+	<xsl:template name="nameABCDN">
+		<xsl:for-each select="marc:subfield[@code='a']">
+			<mads:namePart>
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString" select="."/>
+				</xsl:call-template>
+			</mads:namePart>
+		</xsl:for-each>
+		<xsl:for-each select="marc:subfield[@code='b']">
+			<mads:namePart>
+				<xsl:value-of select="."/>
+			</mads:namePart>
+		</xsl:for-each>
+		<xsl:if
+			test="marc:subfield[@code='c'] or marc:subfield[@code='d'] or marc:subfield[@code='n']">
+			<mads:namePart>
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">cdn</xsl:with-param>
+				</xsl:call-template>
+			</mads:namePart>
+		</xsl:if>
+	</xsl:template>
+
+	<xsl:template name="nameABCDQ">
+		<mads:namePart>
+			<xsl:call-template name="chopPunctuation">
+				<xsl:with-param name="chopString">
+					<xsl:call-template name="subfieldSelect">
+						<xsl:with-param name="codes">aq</xsl:with-param>
+					</xsl:call-template>
+				</xsl:with-param>
+			</xsl:call-template>
+		</mads:namePart>
+		<xsl:call-template name="termsOfAddress"/>
+		<xsl:call-template name="nameDate"/>
+	</xsl:template>
+
+	<xsl:template name="nameACDENQ">
+		<mads:namePart>
+			<xsl:call-template name="subfieldSelect">
+				<xsl:with-param name="codes">acdenq</xsl:with-param>
+			</xsl:call-template>
+		</mads:namePart>
+	</xsl:template>
+
+	<xsl:template name="nameDate">
+		<xsl:for-each select="marc:subfield[@code='d']">
+			<mads:namePart type="date">
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString" select="."/>
+				</xsl:call-template>
+			</mads:namePart>
+		</xsl:for-each>
+	</xsl:template>
+
+	<xsl:template name="specialSubfieldSelect">
+		<xsl:param name="anyCodes"/>
+		<xsl:param name="axis"/>
+		<xsl:param name="beforeCodes"/>
+		<xsl:param name="afterCodes"/>
+		<xsl:variable name="str">
+			<xsl:for-each select="marc:subfield">
+				<xsl:if
+					test="contains($anyCodes, @code) or (contains($beforeCodes, at code) and following-sibling::marc:subfield[@code=$axis]) or (contains($afterCodes, at code) and preceding-sibling::marc:subfield[@code=$axis])">
+					<xsl:value-of select="text()"/>
+					<xsl:text> </xsl:text>
+				</xsl:if>
+			</xsl:for-each>
+		</xsl:variable>
+		<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+	</xsl:template>
+
+	<xsl:template name="termsOfAddress">
+		<xsl:if test="marc:subfield[@code='b' or @code='c']">
+			<mads:namePart type="termsOfAddress">
+				<xsl:call-template name="chopPunctuation">
+					<xsl:with-param name="chopString">
+						<xsl:call-template name="subfieldSelect">
+							<xsl:with-param name="codes">bc</xsl:with-param>
+						</xsl:call-template>
+					</xsl:with-param>
+				</xsl:call-template>
+			</mads:namePart>
+		</xsl:if>
+	</xsl:template>
+
+	<xsl:template name="displayLabel">
+		<xsl:if test="marc:subfield[@code='z']">
+			<xsl:attribute name="displayLabel">
+				<xsl:value-of select="marc:subfield[@code='z']"/>
+			</xsl:attribute>
+		</xsl:if>
+		<xsl:if test="marc:subfield[@code='3']">
+			<xsl:attribute name="displayLabel">
+				<xsl:value-of select="marc:subfield[@code='3']"/>
+			</xsl:attribute>
+		</xsl:if>
+	</xsl:template>
+
+	<xsl:template name="isInvalid">
+		<xsl:if test="@code='z'">
+			<xsl:attribute name="invalid">yes</xsl:attribute>
+		</xsl:if>
+	</xsl:template>
+
+	<xsl:template name="sub2Attribute">
+		<!-- 024 -->
+		<xsl:if test="../marc:subfield[@code='2']">
+			<xsl:attribute name="type">
+				<xsl:value-of select="../marc:subfield[@code='2']"/>
+			</xsl:attribute>
+		</xsl:if>
+	</xsl:template>
+
+	<xsl:template match="marc:controlfield[@tag=001]">
+		<mads:recordIdentifier>
+			<xsl:if test="../marc:controlfield[@tag=003]">
+				<xsl:attribute name="source">
+					<xsl:value-of select="../marc:controlfield[@tag=003]"/>
+				</xsl:attribute>
+			</xsl:if>
+			<xsl:value-of select="."/>
+		</mads:recordIdentifier>
+	</xsl:template>
+
+	<xsl:template match="marc:controlfield[@tag=005]">
+		<mads:recordChangeDate encoding="iso8601">
+			<xsl:value-of select="."/>
+		</mads:recordChangeDate>
+	</xsl:template>
+
+	<xsl:template match="marc:controlfield[@tag=008]">
+		<mads:recordCreationDate encoding="marc">
+			<xsl:value-of select="substring(.,1,6)"/>
+		</mads:recordCreationDate>
+	</xsl:template>
+
+	<xsl:template match="marc:datafield[@tag=010]">
+		<xsl:for-each select="marc:subfield">
+			<mads:identifier type="lccn">
+				<xsl:call-template name="isInvalid"/>
+				<xsl:value-of select="."/>
+			</mads:identifier>
+		</xsl:for-each>
+	</xsl:template>
+
+	<xsl:template match="marc:datafield[@tag=024]">
+		<xsl:for-each select="marc:subfield[not(@code=2)]">
+			<mads:identifier>
+				<xsl:call-template name="isInvalid"/>
+				<xsl:call-template name="sub2Attribute"/>
+				<xsl:value-of select="."/>
+			</mads:identifier>
+		</xsl:for-each>
+	</xsl:template>
+
+	<!-- ========== 372 ========== -->
+	<xsl:template match="marc:datafield[@tag=372]">
+		<mads:fieldOfActivity>
+			<xsl:call-template name="subfieldSelect">
+				<xsl:with-param name="codes">a</xsl:with-param>
+			</xsl:call-template>
+			<xsl:text>-</xsl:text>
+			<xsl:call-template name="subfieldSelect">
+				<xsl:with-param name="codes">st</xsl:with-param>
+			</xsl:call-template>
+		</mads:fieldOfActivity>
+	</xsl:template>
+
+
+	<!-- ========== 040 ========== -->
+	<xsl:template match="marc:datafield[@tag=040]/marc:subfield[@code='a']">
+		<mads:recordContentSource authority="marcorg">
+			<xsl:value-of select="."/>
+		</mads:recordContentSource>
+	</xsl:template>
+
+	<xsl:template match="marc:datafield[@tag=040]/marc:subfield[@code='b']">
+		<mads:languageOfCataloging>
+			<mads:languageTerm authority="iso639-2b" type="code">
+				<xsl:value-of select="."/>
+			</mads:languageTerm>
+		</mads:languageOfCataloging>
+	</xsl:template>
+
+	<xsl:template match="marc:datafield[@tag=040]/marc:subfield[@code='e']">
+		<mads:descriptionStandard>
+			<xsl:value-of select="."/>
+		</mads:descriptionStandard>
+	</xsl:template>
+	
+	<!-- ========== classification 2.03 ========== -->
+	
+	<xsl:template match="marc:datafield[@tag=053]">
+		<mads:classification>
+			<xsl:call-template name="subfieldSelect">
+				<xsl:with-param name="codes">abcdxyz</xsl:with-param>
+				<xsl:with-param name="delimeter">-</xsl:with-param>
+			</xsl:call-template>
+		</mads:classification>
+	</xsl:template>
+	
+	<xsl:template match="marc:datafield[@tag=055]">
+		<mads:classification>
+			<xsl:call-template name="subfieldSelect">
+				<xsl:with-param name="codes">abcdxyz</xsl:with-param>
+				<xsl:with-param name="delimeter">-</xsl:with-param>
+			</xsl:call-template>
+		</mads:classification>
+	</xsl:template>
+	
+	<xsl:template match="marc:datafield[@tag=060]">
+		<mads:classification>
+			<xsl:call-template name="subfieldSelect">
+				<xsl:with-param name="codes">abcdxyz</xsl:with-param>
+				<xsl:with-param name="delimeter">-</xsl:with-param>
+			</xsl:call-template>
+		</mads:classification>
+	</xsl:template>
+	<xsl:template match="marc:datafield[@tag=065]">
+		<mads:classification>
+			<xsl:attribute name="authority">
+				<xsl:value-of select="marc:subfield[@code='2']"/>
+			</xsl:attribute>
+			<xsl:call-template name="subfieldSelect">
+				<xsl:with-param name="codes">abcdxyz</xsl:with-param>
+				<xsl:with-param name="delimeter">-</xsl:with-param>
+			</xsl:call-template>
+		</mads:classification>
+	</xsl:template>
+	<xsl:template match="marc:datafield[@tag=070]">
+		<mads:classification>
+			<xsl:call-template name="subfieldSelect">
+				<xsl:with-param name="codes">abcdxyz5</xsl:with-param>
+				<xsl:with-param name="delimeter">-</xsl:with-param>
+			</xsl:call-template>
+		</mads:classification>
+	</xsl:template>
+	<xsl:template match="marc:datafield[@tag=080]">
+		<mads:classification>
+			<xsl:attribute name="authority">
+				<xsl:value-of select="marc:subfield[@code='2']"/>
+			</xsl:attribute>
+			<xsl:call-template name="subfieldSelect">
+				<xsl:with-param name="codes">abcdxyz5</xsl:with-param>
+				<xsl:with-param name="delimeter">-</xsl:with-param>
+			</xsl:call-template>
+		</mads:classification>
+	</xsl:template>
+	<xsl:template match="marc:datafield[@tag=082]">
+		<mads:classification>
+			<xsl:attribute name="authority">
+				<xsl:value-of select="marc:subfield[@code='2']"/>
+			</xsl:attribute>
+			<xsl:call-template name="subfieldSelect">
+				<xsl:with-param name="codes">abcdxyz5</xsl:with-param>
+				<xsl:with-param name="delimeter">-</xsl:with-param>
+			</xsl:call-template>
+		</mads:classification>
+	</xsl:template>
+	<xsl:template match="marc:datafield[@tag=083]">
+		<mads:classification>
+			<xsl:attribute name="authority">
+				<xsl:value-of select="marc:subfield[@code='2']"/>
+			</xsl:attribute>
+			<xsl:call-template name="subfieldSelect">
+				<xsl:with-param name="codes">abcdxyz5</xsl:with-param>
+				<xsl:with-param name="delimeter">-</xsl:with-param>
+			</xsl:call-template>
+		</mads:classification>
+	</xsl:template>
+	<xsl:template match="marc:datafield[@tag=086]">
+		<mads:classification>
+			<xsl:attribute name="authority">
+				<xsl:value-of select="marc:subfield[@code='2']"/>
+			</xsl:attribute>
+			<xsl:call-template name="subfieldSelect">
+				<xsl:with-param name="codes">abcdxyz5</xsl:with-param>
+				<xsl:with-param name="delimeter">-</xsl:with-param>
+			</xsl:call-template>
+		</mads:classification>
+	</xsl:template>
+	<xsl:template match="marc:datafield[@tag=087]">
+		<mads:classification>
+			<xsl:attribute name="authority">
+				<xsl:value-of select="marc:subfield[@code='2']"/>
+			</xsl:attribute>
+			<xsl:call-template name="subfieldSelect">
+				<xsl:with-param name="codes">abcdxyz5</xsl:with-param>
+				<xsl:with-param name="delimeter">-</xsl:with-param>
+			</xsl:call-template>
+		</mads:classification>
+	</xsl:template>
+	
+
+	<!-- ========== names  ========== -->
+	<xsl:template match="marc:datafield[@tag=100]">
+		<mads:name type="personal">
+			<xsl:call-template name="setAuthority"/>
+			<xsl:call-template name="nameABCDQ"/>
+		</mads:name>
+		<xsl:apply-templates select="*[marc:subfield[not(contains('abcdeq', at code))]]"/>
+		<xsl:call-template name="title"/>
+		<xsl:apply-templates select="marc:subfield[@code!='i']"/>
+	</xsl:template>
+
+	<xsl:template match="marc:datafield[@tag=110]">
+		<mads:name type="corporate">
+			<xsl:call-template name="setAuthority"/>
+			<xsl:call-template name="nameABCDN"/>
+		</mads:name>
+		<xsl:apply-templates select="marc:subfield[@code!='i']"/>
+	</xsl:template>
+
+	<xsl:template match="marc:datafield[@tag=111]">
+		<mads:name type="conference">
+			<xsl:call-template name="setAuthority"/>
+			<xsl:call-template name="nameACDENQ"/>
+		</mads:name>
+		<xsl:apply-templates select="marc:subfield[@code!='i']"/>
+	</xsl:template>
+
+	<xsl:template match="marc:datafield[@tag=400]">
+		<mads:variant>
+			<xsl:call-template name="variantTypeAttribute"/>
+			<mads:name type="personal">
+				<xsl:call-template name="nameABCDQ"/>
+			</mads:name>
+			<xsl:apply-templates select="marc:subfield[@code!='i']"/>
+			<xsl:call-template name="title"/>
+		</mads:variant>
+	</xsl:template>
+
+	<xsl:template match="marc:datafield[@tag=410]">
+		<mads:variant>
+			<xsl:call-template name="variantTypeAttribute"/>
+			<mads:name type="corporate">
+				<xsl:call-template name="nameABCDN"/>
+			</mads:name>
+			<xsl:apply-templates select="marc:subfield[@code!='i']"/>
+		</mads:variant>
+	</xsl:template>
+
+	<xsl:template match="marc:datafield[@tag=411]">
+		<mads:variant>
+			<xsl:call-template name="variantTypeAttribute"/>
+			<mads:name type="conference">
+				<xsl:call-template name="nameACDENQ"/>
+			</mads:name>
+			<xsl:apply-templates select="marc:subfield[@code!='i']"/>
+		</mads:variant>
+	</xsl:template>
+
+	<xsl:template match="marc:datafield[@tag=500]|marc:datafield[@tag=700]">
+		<mads:related>
+			<xsl:call-template name="relatedTypeAttribute"/>
+			<!-- <xsl:call-template name="uri"/> -->
+			<mads:name type="personal">
+				<xsl:call-template name="setAuthority"/>
+				<xsl:call-template name="nameABCDQ"/>
+			</mads:name>
+			<xsl:call-template name="title"/>
+			<xsl:apply-templates select="marc:subfield[@code!='i']"/>
+		</mads:related>
+	</xsl:template>
+
+	<xsl:template match="marc:datafield[@tag=510]|marc:datafield[@tag=710]">
+		<mads:related>
+			<xsl:call-template name="relatedTypeAttribute"/>
+			<!-- <xsl:call-template name="uri"/> -->
+			<mads:name type="corporate">
+				<xsl:call-template name="setAuthority"/>
+				<xsl:call-template name="nameABCDN"/>
+			</mads:name>
+			<xsl:apply-templates select="marc:subfield[@code!='i']"/>
+		</mads:related>
+	</xsl:template>
+
+	<xsl:template match="marc:datafield[@tag=511]|marc:datafield[@tag=711]">
+		<mads:related>
+			<xsl:call-template name="relatedTypeAttribute"/>
+			<!-- <xsl:call-template name="uri"/> -->
+			<mads:name type="conference">
+				<xsl:call-template name="setAuthority"/>
+				<xsl:call-template name="nameACDENQ"/>
+			</mads:name>
+			<xsl:apply-templates select="marc:subfield[@code!='i']"/>
+		</mads:related>
+	</xsl:template>
+
+	<!-- ========== titles  ========== -->
+	<xsl:template match="marc:datafield[@tag=130]">
+		<xsl:call-template name="uniform-title"/>
+		<xsl:apply-templates select="marc:subfield[@code!='i']"/>
+	</xsl:template>
+
+	<xsl:template match="marc:datafield[@tag=430]">
+		<mads:variant>
+			<xsl:call-template name="variantTypeAttribute"/>
+			<xsl:call-template name="uniform-title"/>
+			<xsl:apply-templates select="marc:subfield[@code!='i']"/>
+		</mads:variant>
+	</xsl:template>
+
+	<xsl:template match="marc:datafield[@tag=530]|marc:datafield[@tag=730]">
+		<mads:related>
+			<xsl:call-template name="relatedTypeAttribute"/>
+			<xsl:call-template name="uniform-title"/>
+			<xsl:apply-templates select="marc:subfield[@code!='i']"/>
+		</mads:related>
+	</xsl:template>
+
+	<xsl:template name="title">
+		<xsl:variable name="hasTitle">
+			<xsl:for-each select="marc:subfield">
+				<xsl:if test="(contains('tfghklmors', at code) )">
+					<xsl:value-of select="@code"/>
+				</xsl:if>
+			</xsl:for-each>
+		</xsl:variable>
+		<xsl:if test="string-length($hasTitle) > 0 ">
+			<mads:titleInfo>
+				<xsl:call-template name="setAuthority"/>
+				<mads:title>
+					<xsl:variable name="str">
+						<xsl:for-each select="marc:subfield">
+							<xsl:if test="(contains('atfghklmors', at code) )">
+								<xsl:value-of select="text()"/>
+								<xsl:text> </xsl:text>
+							</xsl:if>
+						</xsl:for-each>
+					</xsl:variable>
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString">
+							<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+						</xsl:with-param>
+					</xsl:call-template>
+				</mads:title>
+				<xsl:call-template name="part"/>
+				<!-- <xsl:call-template name="uri"/> -->
+			</mads:titleInfo>
+		</xsl:if>
+	</xsl:template>
+
+	<xsl:template name="uniform-title">
+		<xsl:variable name="hasTitle">
+			<xsl:for-each select="marc:subfield">
+				<xsl:if test="(contains('atfghklmors', at code) )">
+					<xsl:value-of select="@code"/>
+				</xsl:if>
+			</xsl:for-each>
+		</xsl:variable>
+		<xsl:if test="string-length($hasTitle) > 0 ">
+			<mads:titleInfo>
+				<xsl:call-template name="setAuthority"/>
+				<mads:title>
+					<xsl:variable name="str">
+						<xsl:for-each select="marc:subfield">
+							<xsl:if test="(contains('adfghklmors', at code) )">
+								<xsl:value-of select="text()"/>
+								<xsl:text> </xsl:text>
+							</xsl:if>
+						</xsl:for-each>
+					</xsl:variable>
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString">
+							<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+						</xsl:with-param>
+					</xsl:call-template>
+				</mads:title>
+				<xsl:call-template name="part"/>
+				<!-- <xsl:call-template name="uri"/> -->
+			</mads:titleInfo>
+		</xsl:if>
+	</xsl:template>
+
+
+	<!-- ========== topics  ========== -->
+	<xsl:template match="marc:subfield[@code='x']">
+		<mads:topic>
+			<xsl:call-template name="chopPunctuation">
+				<xsl:with-param name="chopString">
+					<xsl:value-of select="."/>
+				</xsl:with-param>
+			</xsl:call-template>
+		</mads:topic>
+	</xsl:template>
+	
+	<!-- 2.06 fix -->
+	<xsl:template
+		match="marc:datafield[@tag=150][marc:subfield[@code='a' or @code='b']]|marc:datafield[@tag=180][marc:subfield[@code='x']]">
+		<xsl:call-template name="topic"/>
+		<xsl:apply-templates select="marc:subfield[@code!='i']"/>
+	</xsl:template>
+	<xsl:template
+		match="marc:datafield[@tag=450][marc:subfield[@code='a' or @code='b']]|marc:datafield[@tag=480][marc:subfield[@code='x']]">
+		<mads:variant>
+			<xsl:call-template name="variantTypeAttribute"/>
+			<xsl:call-template name="topic"/>
+		</mads:variant>
+	</xsl:template>
+	<xsl:template
+		match="marc:datafield[@tag=550 or @tag=750][marc:subfield[@code='a' or @code='b']]">
+		<mads:related>
+			<xsl:call-template name="relatedTypeAttribute"/>
+			<!-- <xsl:call-template name="uri"/> -->
+			<xsl:call-template name="topic"/>
+			<xsl:apply-templates select="marc:subfield[@code='z']"/>
+		</mads:related>
+	</xsl:template>
+	<xsl:template name="topic">
+		<mads:topic>
+			<xsl:call-template name="setAuthority"/>
+			<!-- tmee2006 dedupe 550a
+			<xsl:if test="@tag=550 or @tag=750">
+				<xsl:call-template name="subfieldSelect">
+					<xsl:with-param name="codes">ab</xsl:with-param>
+				</xsl:call-template>
+			</xsl:if>	
+			-->
+			<xsl:choose>
+				<xsl:when test="@tag=180 or @tag=480 or @tag=580 or @tag=780">
+					<xsl:call-template name="chopPunctuation">
+						<xsl:with-param name="chopString">
+							<xsl:apply-templates select="marc:subfield[@code='x']"/>
+						</xsl:with-param>
+					</xsl:call-template>
+				</xsl:when>
+			</xsl:choose>
+			<xsl:call-template name="chopPunctuation">
+				<xsl:with-param name="chopString">
+					<xsl:choose>
+						<xsl:when test="@tag=180 or @tag=480 or @tag=580 or @tag=780">
+							<xsl:apply-templates select="marc:subfield[@code='x']"/>
+						</xsl:when>
+						<xsl:otherwise>
+							<xsl:call-template name="subfieldSelect">
+								<xsl:with-param name="codes">ab</xsl:with-param>
+							</xsl:call-template>
+						</xsl:otherwise>
+					</xsl:choose>
+				</xsl:with-param>
+			</xsl:call-template>
+		</mads:topic>
+	</xsl:template>
+
+	<!-- ========= temporals  ========== -->
+	<xsl:template match="marc:subfield[@code='y']">
+		<mads:temporal>
+			<xsl:call-template name="chopPunctuation">
+				<xsl:with-param name="chopString">
+					<xsl:value-of select="."/>
+				</xsl:with-param>
+			</xsl:call-template>
+		</mads:temporal>
+	</xsl:template>
+	<xsl:template
+		match="marc:datafield[@tag=148][marc:subfield[@code='a']]|marc:datafield[@tag=182 ][marc:subfield[@code='y']]">
+		<xsl:call-template name="temporal"/>
+	</xsl:template>
+	<xsl:template
+		match="marc:datafield[@tag=448][marc:subfield[@code='a']]|marc:datafield[@tag=482][marc:subfield[@code='y']]">
+		<mads:variant>
+			<xsl:call-template name="variantTypeAttribute"/>
+			<xsl:call-template name="temporal"/>
+		</mads:variant>
+	</xsl:template>
+	<xsl:template
+		match="marc:datafield[@tag=548 or @tag=748][marc:subfield[@code='a']]|marc:datafield[@tag=582 or @tag=782][marc:subfield[@code='y']]">
+		<mads:related>
+			<xsl:call-template name="relatedTypeAttribute"/>
+			<!-- <xsl:call-template name="uri"/> -->
+			<xsl:call-template name="temporal"/>
+		</mads:related>
+	</xsl:template>
+	<xsl:template name="temporal">
+		<mads:temporal>
+			<xsl:call-template name="setAuthority"/>
+			<xsl:if test="@tag=548 or @tag=748">
+				<xsl:value-of select="marc:subfield[@code='a']"/>
+			</xsl:if>
+			<xsl:call-template name="chopPunctuation">
+				<xsl:with-param name="chopString">
+					<xsl:choose>
+						<xsl:when test="@tag=182 or @tag=482 or @tag=582 or @tag=782">
+							<xsl:apply-templates select="marc:subfield[@code='y']"/>
+						</xsl:when>
+						<xsl:otherwise>
+							<xsl:value-of select="marc:subfield[@code='a']"/>
+						</xsl:otherwise>
+					</xsl:choose>
+				</xsl:with-param>
+			</xsl:call-template>
+		</mads:temporal>
+		<xsl:apply-templates select="marc:subfield[@code!='i']"/>
+	</xsl:template>
+
+	<!-- ========== genre  ========== -->
+	<xsl:template match="marc:subfield[@code='v']">
+		<mads:genre>
+			<xsl:call-template name="chopPunctuation">
+				<xsl:with-param name="chopString">
+					<xsl:value-of select="."/>
+				</xsl:with-param>
+			</xsl:call-template>
+		</mads:genre>
+	</xsl:template>
+	<xsl:template
+		match="marc:datafield[@tag=155][marc:subfield[@code='a']]|marc:datafield[@tag=185][marc:subfield[@code='v']]">
+		<xsl:call-template name="genre"/>
+	</xsl:template>
+	<xsl:template
+		match="marc:datafield[@tag=455][marc:subfield[@code='a']]|marc:datafield[@tag=485 ][marc:subfield[@code='v']]">
+		<mads:variant>
+			<xsl:call-template name="variantTypeAttribute"/>
+			<xsl:call-template name="genre"/>
+		</mads:variant>
+	</xsl:template>
+	<!--
+	<xsl:template match="marc:datafield[@tag=555]">
+		<mads:related>
+			<xsl:call-template name="relatedTypeAttribute"/>
+			<xsl:call-template name="uri"/>
+			<xsl:call-template name="genre"/>
+		</mads:related>
+	</xsl:template>
+	-->
+	<xsl:template
+		match="marc:datafield[@tag=555 or @tag=755][marc:subfield[@code='a']]|marc:datafield[@tag=585][marc:subfield[@code='v']]">
+		<mads:related>
+			<xsl:call-template name="relatedTypeAttribute"/>
+			<xsl:call-template name="genre"/>
+		</mads:related>
+	</xsl:template>
+	<xsl:template name="genre">
+		<mads:genre>
+			<xsl:if test="@tag=555">
+				<xsl:value-of select="marc:subfield[@code='a']"/>
+			</xsl:if>
+			<xsl:call-template name="setAuthority"/>
+			<xsl:call-template name="chopPunctuation">
+				<xsl:with-param name="chopString">
+					<xsl:choose>
+						<!-- 2.07 fix -->
+						<xsl:when test="@tag='555'"/>
+						<xsl:when test="@tag=185 or @tag=485 or @tag=585">
+							<xsl:apply-templates select="marc:subfield[@code='v']"/>
+						</xsl:when>
+						<xsl:otherwise>
+							<xsl:value-of select="marc:subfield[@code='a']"/>
+						</xsl:otherwise>
+					</xsl:choose>
+				</xsl:with-param>
+			</xsl:call-template>
+		</mads:genre>
+		<xsl:apply-templates/>
+	</xsl:template>
+
+	<!-- ========= geographic  ========== -->
+	<xsl:template match="marc:subfield[@code='z']">
+		<mads:geographic>
+			<xsl:call-template name="chopPunctuation">
+				<xsl:with-param name="chopString">
+					<xsl:value-of select="."/>
+				</xsl:with-param>
+			</xsl:call-template>
+		</mads:geographic>
+	</xsl:template>
+	<xsl:template name="geographic">
+		<mads:geographic>
+			<!-- 2.14 -->
+			<xsl:call-template name="setAuthority"/>
+			<!-- 2.13 -->
+			<xsl:if test="@tag=151 or @tag=551">
+				<xsl:value-of select="marc:subfield[@code='a']"/>
+			</xsl:if>
+			<xsl:call-template name="chopPunctuation">
+				<xsl:with-param name="chopString">
+						<xsl:if test="@tag=181 or @tag=481 or @tag=581">
+								<xsl:apply-templates select="marc:subfield[@code='z']"/>
+						</xsl:if>
+						<!-- 2.13
+							<xsl:choose>
+						<xsl:when test="@tag=181 or @tag=481 or @tag=581">
+							<xsl:apply-templates select="marc:subfield[@code='z']"/>
+						</xsl:when>
+					
+						<xsl:otherwise>
+							<xsl:value-of select="marc:subfield[@code='a']"/>
+						</xsl:otherwise>
+						</xsl:choose>
+						-->
+				</xsl:with-param>
+			</xsl:call-template>
+		</mads:geographic>
+		<xsl:apply-templates select="marc:subfield[@code!='i']"/>
+	</xsl:template>
+	<xsl:template
+		match="marc:datafield[@tag=151][marc:subfield[@code='a']]|marc:datafield[@tag=181][marc:subfield[@code='z']]">
+		<xsl:call-template name="geographic"/>
+	</xsl:template>
+	<xsl:template
+		match="marc:datafield[@tag=451][marc:subfield[@code='a']]|marc:datafield[@tag=481][marc:subfield[@code='z']]">
+		<mads:variant>
+			<xsl:call-template name="variantTypeAttribute"/>
+			<xsl:call-template name="geographic"/>
+		</mads:variant>
+	</xsl:template>
+	<xsl:template
+		match="marc:datafield[@tag=551]|marc:datafield[@tag=581][marc:subfield[@code='z']]">
+		<mads:related>
+			<xsl:call-template name="relatedTypeAttribute"/>
+			<!-- <xsl:call-template name="uri"/> -->
+			<xsl:call-template name="geographic"/>
+		</mads:related>
+	</xsl:template>
+	<xsl:template match="marc:datafield[@tag=580]">
+		<mads:related>
+			<xsl:call-template name="relatedTypeAttribute"/>
+			<xsl:apply-templates select="marc:subfield[@code!='i']"/>
+		</mads:related>
+	</xsl:template>
+	<xsl:template
+		match="marc:datafield[@tag=751][marc:subfield[@code='z']]|marc:datafield[@tag=781][marc:subfield[@code='z']]">
+		<mads:related>
+			<xsl:call-template name="relatedTypeAttribute"/>
+			<xsl:call-template name="geographic"/>
+		</mads:related>
+	</xsl:template>
+	<xsl:template match="marc:datafield[@tag=755]">
+		<mads:related>
+			<xsl:call-template name="relatedTypeAttribute"/>
+			<xsl:call-template name="genre"/>
+			<xsl:call-template name="setAuthority"/>
+			<xsl:apply-templates select="marc:subfield[@code!='i']"/>
+		</mads:related>
+	</xsl:template>
+	<xsl:template match="marc:datafield[@tag=780]">
+		<mads:related>
+			<xsl:call-template name="relatedTypeAttribute"/>
+			<xsl:apply-templates select="marc:subfield[@code!='i']"/>
+		</mads:related>
+	</xsl:template>
+	<xsl:template match="marc:datafield[@tag=785]">
+		<mads:related>
+			<xsl:call-template name="relatedTypeAttribute"/>
+			<xsl:apply-templates select="marc:subfield[@code!='i']"/>
+		</mads:related>
+	</xsl:template>
+
+	<!-- ========== notes  ========== -->
+	<xsl:template match="marc:datafield[667 <= @tag and @tag <= 688]">
+		<mads:note>
+			<xsl:choose>
+				<xsl:when test="@tag=667">
+					<xsl:attribute name="type">nonpublic</xsl:attribute>
+				</xsl:when>
+				<xsl:when test="@tag=670">
+					<xsl:attribute name="type">source</xsl:attribute>
+				</xsl:when>
+				<xsl:when test="@tag=675">
+					<xsl:attribute name="type">notFound</xsl:attribute>
+				</xsl:when>
+				<xsl:when test="@tag=678">
+					<xsl:attribute name="type">history</xsl:attribute>
+				</xsl:when>
+				<xsl:when test="@tag=681">
+					<xsl:attribute name="type">subject example</xsl:attribute>
+				</xsl:when>
+				<xsl:when test="@tag=682">
+					<xsl:attribute name="type">deleted heading information</xsl:attribute>
+				</xsl:when>
+				<xsl:when test="@tag=688">
+					<xsl:attribute name="type">application history</xsl:attribute>
+				</xsl:when>
+			</xsl:choose>
+			<xsl:call-template name="chopPunctuation">
+				<xsl:with-param name="chopString">
+					<xsl:choose>
+						<xsl:when test="@tag=667 or @tag=675">
+							<xsl:value-of select="marc:subfield[@code='a']"/>
+						</xsl:when>
+						<xsl:when test="@tag=670 or @tag=678">
+							<xsl:call-template name="subfieldSelect">
+								<xsl:with-param name="codes">ab</xsl:with-param>
+							</xsl:call-template>
+						</xsl:when>
+						<xsl:when test="680 <= @tag and @tag <=688">
+							<xsl:call-template name="subfieldSelect">
+								<xsl:with-param name="codes">ai</xsl:with-param>
+							</xsl:call-template>
+						</xsl:when>
+					</xsl:choose>
+				</xsl:with-param>
+			</xsl:call-template>
+		</mads:note>
+	</xsl:template>
+
+	<!-- ========== url  ========== -->
+	<xsl:template match="marc:datafield[@tag=856][marc:subfield[@code='u']]">
+		<mads:url>
+			<xsl:if test="marc:subfield[@code='z' or @code='3']">
+				<xsl:attribute name="displayLabel">
+					<xsl:call-template name="subfieldSelect">
+						<xsl:with-param name="codes">z3</xsl:with-param>
+					</xsl:call-template>
+				</xsl:attribute>
+			</xsl:if>
+			<xsl:value-of select="marc:subfield[@code='u']"/>
+		</mads:url>
+	</xsl:template>
+
+	<xsl:template name="relatedTypeAttribute">
+		<xsl:choose>
+			<xsl:when
+				test="@tag=500 or @tag=510 or @tag=511 or @tag=548 or @tag=550 or @tag=551 or @tag=555 or @tag=580 or @tag=581 or @tag=582 or @tag=585">
+				<xsl:if test="substring(marc:subfield[@code='w'],1,1)='a'">
+					<xsl:attribute name="type">earlier</xsl:attribute>
+				</xsl:if>
+				<xsl:if test="substring(marc:subfield[@code='w'],1,1)='b'">
+					<xsl:attribute name="type">later</xsl:attribute>
+				</xsl:if>
+				<xsl:if test="substring(marc:subfield[@code='w'],1,1)='t'">
+					<xsl:attribute name="type">parentOrg</xsl:attribute>
+				</xsl:if>
+				<xsl:if test="substring(marc:subfield[@code='w'],1,1)='g'">
+					<xsl:attribute name="type">broader</xsl:attribute>
+				</xsl:if>
+				<xsl:if test="substring(marc:subfield[@code='w'],1,1)='h'">
+					<xsl:attribute name="type">narrower</xsl:attribute>
+				</xsl:if>
+				<xsl:if test="substring(marc:subfield[@code='w'],1,1)='r'">
+					<xsl:attribute name="type">other</xsl:attribute>
+				</xsl:if>
+				<xsl:if test="contains('fin|', substring(marc:subfield[@code='w'],1,1))">
+					<xsl:attribute name="type">other</xsl:attribute>
+				</xsl:if>
+			</xsl:when>
+			<xsl:when test="@tag=530 or @tag=730">
+				<xsl:attribute name="type">other</xsl:attribute>
+			</xsl:when>
+			<xsl:otherwise>
+				<!-- 7xx -->
+				<xsl:attribute name="type">equivalent</xsl:attribute>
+			</xsl:otherwise>
+		</xsl:choose>
+		<xsl:apply-templates select="marc:subfield[@code='i']"/>
+	</xsl:template>
+	
+
+
+	<xsl:template name="variantTypeAttribute">
+		<xsl:choose>
+			<xsl:when
+				test="@tag=400 or @tag=410 or @tag=411 or @tag=451 or @tag=455 or @tag=480 or @tag=481 or @tag=482 or @tag=485">
+				<xsl:if test="substring(marc:subfield[@code='w'],1,1)='d'">
+					<xsl:attribute name="type">acronym</xsl:attribute>
+				</xsl:if>
+				<xsl:if test="substring(marc:subfield[@code='w'],1,1)='n'">
+					<xsl:attribute name="type">other</xsl:attribute>
+				</xsl:if>
+				<xsl:if test="contains('fit', substring(marc:subfield[@code='w'],1,1))">
+					<xsl:attribute name="type">other</xsl:attribute>
+				</xsl:if>
+			</xsl:when>
+			<xsl:otherwise>
+				<!-- 430  -->
+				<xsl:attribute name="type">other</xsl:attribute>
+			</xsl:otherwise>
+		</xsl:choose>
+		<xsl:apply-templates select="marc:subfield[@code='i']"/>
+	</xsl:template>
+
+	<xsl:template name="setAuthority">
+		<xsl:choose>
+			<!-- can be called from the datafield or subfield level, so "..//@tag" means
+			the tag can be at the subfield's parent level or at the datafields own level -->
+
+			<xsl:when
+				test="ancestor-or-self::marc:datafield/@tag=100 and (@ind1=0 or @ind1=1) and $controlField008-11='a' and $controlField008-14='a'">
+				<xsl:attribute name="authority">
+					<xsl:text>naf</xsl:text>
+				</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="ancestor-or-self::marc:datafield/@tag=100 and (@ind1=0 or @ind1=1) and $controlField008-11='a' and $controlField008-14='b'">
+				<xsl:attribute name="authority">
+					<xsl:text>lcsh</xsl:text>
+				</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="ancestor-or-self::marc:datafield/@tag=100 and (@ind1=0 or @ind1=1) and $controlField008-11='k'">
+				<xsl:attribute name="authority">
+					<xsl:text>lacnaf</xsl:text>
+				</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="ancestor-or-self::marc:datafield/@tag=100 and @ind1=3 and $controlField008-11='a' and $controlField008-14='b'">
+				<xsl:attribute name="authority">
+					<xsl:text>lcsh</xsl:text>
+				</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="ancestor-or-self::marc:datafield/@tag=100 and @ind1=3 and $controlField008-11='k' and $controlField008-14='b'">
+				<xsl:attribute name="authority">cash</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="ancestor-or-self::marc:datafield/@tag=110 and $controlField008-11='a' and $controlField008-14='a'">
+				<xsl:attribute name="authority">naf</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="ancestor-or-self::marc:datafield/@tag=110 and $controlField008-11='a' and $controlField008-14='b'">
+				<xsl:attribute name="authority">lcsh</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="ancestor-or-self::marc:datafield/@tag=110 and $controlField008-11='k' and $controlField008-14='a'">
+				<xsl:attribute name="authority">
+					<xsl:text>lacnaf</xsl:text>
+				</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="ancestor-or-self::marc:datafield/@tag=110 and $controlField008-11='k' and $controlField008-14='b'">
+				<xsl:attribute name="authority">
+					<xsl:text>cash</xsl:text>
+				</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="100 <= ancestor-or-self::marc:datafield/@tag and ancestor-or-self::marc:datafield/@tag <= 155 and $controlField008-11='b'">
+				<xsl:attribute name="authority">
+					<xsl:text>lcshcl</xsl:text>
+				</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="(ancestor-or-self::marc:datafield/@tag=100 or ancestor-or-self::marc:datafield/@tag=110 or ancestor-or-self::marc:datafield/@tag=111 or ancestor-or-self::marc:datafield/@tag=130 or ancestor-or-self::marc:datafield/@tag=151) and $controlField008-11='c'">
+				<xsl:attribute name="authority">
+					<xsl:text>nlmnaf</xsl:text>
+				</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="(ancestor-or-self::marc:datafield/@tag=100 or ancestor-or-self::marc:datafield/@tag=110 or ancestor-or-self::marc:datafield/@tag=111 or ancestor-or-self::marc:datafield/@tag=130 or ancestor-or-self::marc:datafield/@tag=151) and $controlField008-11='d'">
+				<xsl:attribute name="authority">
+					<xsl:text>nalnaf</xsl:text>
+				</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="100 <= ancestor-or-self::marc:datafield/@tag and ancestor-or-self::marc:datafield/@tag <= 155 and $controlField008-11='r'">
+				<xsl:attribute name="authority">
+					<xsl:text>aat</xsl:text>
+				</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="100 <= ancestor-or-self::marc:datafield/@tag and ancestor-or-self::marc:datafield/@tag <= 155 and $controlField008-11='s'">
+				<xsl:attribute name="authority">sears</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="100 <= ancestor-or-self::marc:datafield/@tag and ancestor-or-self::marc:datafield/@tag <= 155 and $controlField008-11='v'">
+				<xsl:attribute name="authority">rvm</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="100 <= ancestor-or-self::marc:datafield/@tag and ancestor-or-self::marc:datafield/@tag <= 155 and $controlField008-11='z'">
+				<xsl:attribute name="authority">
+					<xsl:value-of
+						select="../marc:datafield[ancestor-or-self::marc:datafield/@tag=040]/marc:subfield[@code='f']"
+					/>
+				</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="(ancestor-or-self::marc:datafield/@tag=111 or ancestor-or-self::marc:datafield/@tag=130) and $controlField008-11='a' and $controlField008-14='a'">
+				<xsl:attribute name="authority">
+					<xsl:text>naf</xsl:text>
+				</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="(ancestor-or-self::marc:datafield/@tag=111 or ancestor-or-self::marc:datafield/@tag=130) and $controlField008-11='a' and $controlField008-14='b'">
+				<xsl:attribute name="authority">
+					<xsl:text>lcsh</xsl:text>
+				</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="(ancestor-or-self::marc:datafield/@tag=111 or ancestor-or-self::marc:datafield/@tag=130) and $controlField008-11='k' ">
+				<xsl:attribute name="authority">
+					<xsl:text>lacnaf</xsl:text>
+				</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="(ancestor-or-self::marc:datafield/@tag=148 or ancestor-or-self::marc:datafield/@tag=150  or ancestor-or-self::marc:datafield/@tag=155) and $controlField008-11='a' ">
+				<xsl:attribute name="authority">
+					<xsl:text>lcsh</xsl:text>
+				</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="(ancestor-or-self::marc:datafield/@tag=148 or ancestor-or-self::marc:datafield/@tag=150  or ancestor-or-self::marc:datafield/@tag=155) and $controlField008-11='a' ">
+				<xsl:attribute name="authority">
+					<xsl:text>lcsh</xsl:text>
+				</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="(ancestor-or-self::marc:datafield/@tag=148 or ancestor-or-self::marc:datafield/@tag=150  or ancestor-or-self::marc:datafield/@tag=155) and $controlField008-11='c' ">
+				<xsl:attribute name="authority">
+					<xsl:text>mesh</xsl:text>
+				</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="(ancestor-or-self::marc:datafield/@tag=148 or ancestor-or-self::marc:datafield/@tag=150  or ancestor-or-self::marc:datafield/@tag=155) and $controlField008-11='d' ">
+				<xsl:attribute name="authority">
+					<xsl:text>nal</xsl:text>
+				</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="(ancestor-or-self::marc:datafield/@tag=148 or ancestor-or-self::marc:datafield/@tag=150  or ancestor-or-self::marc:datafield/@tag=155) and $controlField008-11='k' ">
+				<xsl:attribute name="authority">
+					<xsl:text>cash</xsl:text>
+				</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="ancestor-or-self::marc:datafield/@tag=151 and $controlField008-11='a' and $controlField008-14='a'">
+				<xsl:attribute name="authority">
+					<xsl:text>naf</xsl:text>
+				</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="ancestor-or-self::marc:datafield/@tag=151 and $controlField008-11='a' and $controlField008-14='b'">
+				<xsl:attribute name="authority">lcsh</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="ancestor-or-self::marc:datafield/@tag=151 and $controlField008-11='k' and $controlField008-14='a'">
+				<xsl:attribute name="authority">lacnaf</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="ancestor-or-self::marc:datafield/@tag=151 and $controlField008-11='k' and $controlField008-14='b'">
+				<xsl:attribute name="authority">cash</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="(..//ancestor-or-self::marc:datafield/@tag=180 or ..//ancestor-or-self::marc:datafield/@tag=181 or ..//ancestor-or-self::marc:datafield/@tag=182 or ..//ancestor-or-self::marc:datafield/@tag=185) and $controlField008-11='a'">
+				<xsl:attribute name="authority">lcsh</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="ancestor-or-self::marc:datafield/@tag=700 and (@ind1='0' or @ind1='1') and @ind2='0'">
+				<xsl:attribute name="authority">naf</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="ancestor-or-self::marc:datafield/@tag=700 and (@ind1='0' or @ind1='1') and @ind2='5'">
+				<xsl:attribute name="authority">lacnaf</xsl:attribute>
+			</xsl:when>
+			<xsl:when test="ancestor-or-self::marc:datafield/@tag=700 and @ind1='3' and @ind2='0'">
+				<xsl:attribute name="authority">lcsh</xsl:attribute>
+			</xsl:when>
+			<xsl:when test="ancestor-or-self::marc:datafield/@tag=700 and @ind1='3' and @ind2='5'">
+				<xsl:attribute name="authority">cash</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="(700 <= ancestor-or-self::marc:datafield/@tag and ancestor-or-self::marc:datafield/@tag <= 755 ) and @ind2='1'">
+				<xsl:attribute name="authority">lcshcl</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="(ancestor-or-self::marc:datafield/@tag=700 or ancestor-or-self::marc:datafield/@tag=710 or ancestor-or-self::marc:datafield/@tag=711 or ancestor-or-self::marc:datafield/@tag=730 or ancestor-or-self::marc:datafield/@tag=751)  and @ind2='2'">
+				<xsl:attribute name="authority">nlmnaf</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="(ancestor-or-self::marc:datafield/@tag=700 or ancestor-or-self::marc:datafield/@tag=710 or ancestor-or-self::marc:datafield/@tag=711 or ancestor-or-self::marc:datafield/@tag=730 or ancestor-or-self::marc:datafield/@tag=751)  and @ind2='3'">
+				<xsl:attribute name="authority">nalnaf</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="(700 <= ancestor-or-self::marc:datafield/@tag and ancestor-or-self::marc:datafield/@tag <= 755 ) and @ind2='6'">
+				<xsl:attribute name="authority">rvm</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="(700 <= ancestor-or-self::marc:datafield/@tag and ancestor-or-self::marc:datafield/@tag <= 755 ) and @ind2='7'">
+				<xsl:attribute name="authority">
+					<xsl:value-of select="marc:subfield[@code='2']"/>
+				</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="(ancestor-or-self::marc:datafield/@tag=710 or ancestor-or-self::marc:datafield/@tag=711 or ancestor-or-self::marc:datafield/@tag=730 or ancestor-or-self::marc:datafield/@tag=751)  and @ind2='5'">
+				<xsl:attribute name="authority">lacnaf</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="(ancestor-or-self::marc:datafield/@tag=710 or ancestor-or-self::marc:datafield/@tag=711 or ancestor-or-self::marc:datafield/@tag=730 or ancestor-or-self::marc:datafield/@tag=751)  and @ind2='0'">
+				<xsl:attribute name="authority">naf</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="(ancestor-or-self::marc:datafield/@tag=748 or ancestor-or-self::marc:datafield/@tag=750 or ancestor-or-self::marc:datafield/@tag=755)  and @ind2='0'">
+				<xsl:attribute name="authority">lcsh</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="(ancestor-or-self::marc:datafield/@tag=748 or ancestor-or-self::marc:datafield/@tag=750 or ancestor-or-self::marc:datafield/@tag=755)  and @ind2='2'">
+				<xsl:attribute name="authority">mesh</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="(ancestor-or-self::marc:datafield/@tag=748 or ancestor-or-self::marc:datafield/@tag=750 or ancestor-or-self::marc:datafield/@tag=755)  and @ind2='3'">
+				<xsl:attribute name="authority">nal</xsl:attribute>
+			</xsl:when>
+			<xsl:when
+				test="(ancestor-or-self::marc:datafield/@tag=748 or ancestor-or-self::marc:datafield/@tag=750 or ancestor-or-self::marc:datafield/@tag=755)  and @ind2='5'">
+				<xsl:attribute name="authority">cash</xsl:attribute>
+			</xsl:when>
+		</xsl:choose>
+	</xsl:template>
+	<xsl:template match="*"/>
+</xsl:stylesheet>$XSLT$);
+
+
+SELECT evergreen.upgrade_deps_block_check('1069', :eg_version); --gmcharlt/kmlussier
+
+-- subset of types listed in https://www.loc.gov/marc/authority/ad1xx3xx.html
+-- for now, ignoring subdivisions
+CREATE TYPE authority.heading_type AS ENUM (
+    'personal_name',
+    'corporate_name',
+    'meeting_name',
+    'uniform_title',
+    'named_event',
+    'chronological_term',
+    'topical_term',
+    'geographic_name',
+    'genre_form_term',
+    'medium_of_performance_term'
+);
+
+CREATE TYPE authority.variant_heading_type AS ENUM (
+    'abbreviation',
+    'acronym',
+    'translation',
+    'expansion',
+    'other',
+    'hidden'
+);
+
+CREATE TYPE authority.related_heading_type AS ENUM (
+    'earlier',
+    'later',
+    'parent organization',
+    'broader',
+    'narrower',
+    'equivalent',
+    'other'
+);
+
+CREATE TYPE authority.heading_purpose AS ENUM (
+    'main',
+    'variant',
+    'related'
+);
+
+CREATE TABLE authority.heading_field (
+    id              SERIAL                      PRIMARY KEY,
+    heading_type    authority.heading_type      NOT NULL,
+    heading_purpose authority.heading_purpose   NOT NULL,
+    label           TEXT                        NOT NULL,
+    format          TEXT                        NOT NULL REFERENCES config.xml_transform (name) DEFAULT 'mads21',
+    heading_xpath   TEXT                        NOT NULL,
+    component_xpath TEXT                        NOT NULL,
+    type_xpath      TEXT                        NULL, -- to extract related or variant type
+    thesaurus_xpath TEXT                        NULL,
+    thesaurus_override_xpath TEXT               NULL,
+    joiner          TEXT                        NULL
+);
+
+CREATE TABLE authority.heading_field_norm_map (
+        id      SERIAL  PRIMARY KEY,
+        field   INT     NOT NULL REFERENCES authority.heading_field (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+        norm    INT     NOT NULL REFERENCES config.index_normalizer (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+        params  TEXT,
+        pos     INT     NOT NULL DEFAULT 0
+);
+
+INSERT INTO authority.heading_field(heading_type, heading_purpose, label, heading_xpath, component_xpath, type_xpath, thesaurus_xpath, thesaurus_override_xpath) VALUES
+ ( 'topical_term', 'main',    'Main Topical Term',    '/mads21:mads/mads21:authority', '//mads21:topic', NULL, '/mads21:mads/mads21:authority/mads21:topic[1]/@authority', NULL )
+,( 'topical_term', 'variant', 'Variant Topical Term', '/mads21:mads/mads21:variant',   '//mads21:topic', '/mads21:variant/@type', '/mads21:mads/mads21:authority/mads21:topic[1]/@authority', '//mads21:topic[1]/@authority')
+,( 'topical_term', 'related', 'Related Topical Term', '/mads21:mads/mads21:related',   '//mads21:topic', '/mads21:related/@type', '/mads21:mads/mads21:authority/mads21:topic[1]/@authority', '//mads21:topic[1]/@authority')
+,( 'personal_name', 'main', 'Main Personal Name',     '/mads21:mads/mads21:authority', '//mads21:name[@type="personal"]', NULL, NULL, NULL )
+,( 'personal_name', 'variant', 'Variant Personal Name',     '/mads21:mads/mads21:variant', '//mads21:name[@type="personal"]', NULL, NULL, NULL )
+,( 'personal_name', 'related', 'Related Personal Name',     '/mads21:mads/mads21:related', '//mads21:name[@type="personal"]', '/mads21:related/@type', NULL, NULL )
+,( 'corporate_name', 'main', 'Main Corporate name',     '/mads21:mads/mads21:authority', '//mads21:name[@type="corporate"]', NULL, NULL, NULL )
+,( 'corporate_name', 'variant', 'Variant Corporate Name',     '/mads21:mads/mads21:variant', '//mads21:name[@type="corporate"]', NULL, NULL, NULL )
+,( 'corporate_name', 'related', 'Related Corporate Name',     '/mads21:mads/mads21:related', '//mads21:name[@type="corporate"]', '/mads21:related/@type', NULL, NULL )
+,( 'meeting_name', 'main', 'Main Meeting name',     '/mads21:mads/mads21:authority', '//mads21:name[@type="conference"]', NULL, NULL, NULL )
+,( 'meeting_name', 'variant', 'Variant Meeting Name',     '/mads21:mads/mads21:variant', '//mads21:name[@type="conference"]', NULL, NULL, NULL )
+,( 'meeting_name', 'related', 'Related Meeting Name',     '/mads21:mads/mads21:related', '//mads21:name[@type="meeting"]', '/mads21:related/@type', NULL, NULL )
+,( 'geographic_name', 'main',    'Main Geographic Term',    '/mads21:mads/mads21:authority', '//mads21:geographic', NULL, '/mads21:mads/mads21:authority/mads21:geographic[1]/@authority', NULL )
+,( 'geographic_name', 'variant', 'Variant Geographic Term', '/mads21:mads/mads21:variant',   '//mads21:geographic', '/mads21:variant/@type', '/mads21:mads/mads21:authority/mads21:geographic[1]/@authority', '//mads21:geographic[1]/@authority')
+,( 'geographic_name', 'related', 'Related Geographic Term', '/mads21:mads/mads21:related',   '//mads21:geographic', '/mads21:related/@type', '/mads21:mads/mads21:authority/mads21:geographic[1]/@authority', '//mads21:geographic[1]/@authority')
+,( 'genre_form_term', 'main',    'Main Genre/Form Term',    '/mads21:mads/mads21:authority', '//mads21:genre', NULL, '/mads21:mads/mads21:authority/mads21:genre[1]/@authority', NULL )
+,( 'genre_form_term', 'variant', 'Variant Genre/Form Term', '/mads21:mads/mads21:variant',   '//mads21:genre', '/mads21:variant/@type', '/mads21:mads/mads21:authority/mads21:genre[1]/@authority', '//mads21:genre[1]/@authority')
+,( 'genre_form_term', 'related', 'Related Genre/Form Term', '/mads21:mads/mads21:related',   '//mads21:genre', '/mads21:related/@type', '/mads21:mads/mads21:authority/mads21:genre[1]/@authority', '//mads21:genre[1]/@authority')
+,( 'chronological_term', 'main',    'Main Chronological Term',    '/mads21:mads/mads21:authority', '//mads21:temporal', NULL, '/mads21:mads/mads21:authority/mads21:temporal[1]/@authority', NULL )
+,( 'chronological_term', 'variant', 'Variant Chronological Term', '/mads21:mads/mads21:variant',   '//mads21:temporal', '/mads21:variant/@type', '/mads21:mads/mads21:authority/mads21:temporal[1]/@authority', '//mads21:temporal[1]/@authority')
+,( 'chronological_term', 'related', 'Related Chronological Term', '/mads21:mads/mads21:related',   '//mads21:temporal', '/mads21:related/@type', '/mads21:mads/mads21:authority/mads21:temporal[1]/@authority', '//mads21:temporal[1]/@authority')
+,( 'uniform_title', 'main',    'Main Uniform Title',    '/mads21:mads/mads21:authority', '//mads21:title', NULL, '/mads21:mads/mads21:authority/mads21:title[1]/@authority', NULL )
+,( 'uniform_title', 'variant', 'Variant Uniform Title', '/mads21:mads/mads21:variant',   '//mads21:title', '/mads21:variant/@type', '/mads21:mads/mads21:authority/mads21:title[1]/@authority', '//mads21:title[1]/@authority')
+,( 'uniform_title', 'related', 'Related Uniform Title', '/mads21:mads/mads21:related',   '//mads21:title', '/mads21:related/@type', '/mads21:mads/mads21:authority/mads21:title[1]/@authority', '//mads21:title[1]/@authority')
+;
+
+-- NACO normalize all the things
+INSERT INTO authority.heading_field_norm_map (field, norm, pos)
+SELECT id, 1, 0
+FROM authority.heading_field;
+
+CREATE TYPE authority.heading AS (
+    field               INT,
+    type                authority.heading_type,
+    purpose             authority.heading_purpose,
+    variant_type        authority.variant_heading_type,
+    related_type        authority.related_heading_type,
+    thesaurus           TEXT,
+    heading             TEXT,
+    normalized_heading  TEXT
+);
+
+CREATE OR REPLACE FUNCTION authority.extract_headings(marc TEXT, restrict INT[] DEFAULT NULL) RETURNS SETOF authority.heading AS $func$
+DECLARE
+    idx         authority.heading_field%ROWTYPE;
+    xfrm        config.xml_transform%ROWTYPE;
+    prev_xfrm   TEXT;
+    transformed_xml TEXT;
+    heading_node    TEXT;
+    heading_node_list   TEXT[];
+    component_node    TEXT;
+    component_node_list   TEXT[];
+    raw_text    TEXT;
+    normalized_text    TEXT;
+    normalizer  RECORD;
+    curr_text   TEXT;
+    joiner      TEXT;
+    type_value  TEXT;
+    base_thesaurus TEXT := NULL;
+    output_row  authority.heading;
+BEGIN
+
+    -- Loop over the indexing entries
+    FOR idx IN SELECT * FROM authority.heading_field WHERE restrict IS NULL OR id = ANY (restrict) ORDER BY format LOOP
+
+        output_row.field   := idx.id;
+        output_row.type    := idx.heading_type;
+        output_row.purpose := idx.heading_purpose;
+
+        joiner := COALESCE(idx.joiner, ' ');
+
+        SELECT INTO xfrm * from config.xml_transform WHERE name = idx.format;
+
+        -- See if we can skip the XSLT ... it's expensive
+        IF prev_xfrm IS NULL OR prev_xfrm <> xfrm.name THEN
+            -- Can't skip the transform
+            IF xfrm.xslt <> '---' THEN
+                transformed_xml := oils_xslt_process(marc, xfrm.xslt);
+            ELSE
+                transformed_xml := marc;
+            END IF;
+
+            prev_xfrm := xfrm.name;
+        END IF;
+
+        IF idx.thesaurus_xpath IS NOT NULL THEN
+            base_thesaurus := ARRAY_TO_STRING(oils_xpath(idx.thesaurus_xpath, transformed_xml, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]]), '');
+        END IF;
+
+        heading_node_list := oils_xpath( idx.heading_xpath, transformed_xml, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
+
+        FOR heading_node IN SELECT x FROM unnest(heading_node_list) AS x LOOP
+
+            CONTINUE WHEN heading_node !~ E'^\\s*<';
+
+            output_row.variant_type := NULL;
+            output_row.related_type := NULL;
+            output_row.thesaurus    := NULL;
+            output_row.heading      := NULL;
+
+            IF idx.heading_purpose = 'variant' AND idx.type_xpath IS NOT NULL THEN
+                type_value := ARRAY_TO_STRING(oils_xpath(idx.type_xpath, heading_node, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]]), '');
+                BEGIN
+                    output_row.variant_type := type_value;
+                EXCEPTION WHEN invalid_text_representation THEN
+                    RAISE NOTICE 'Do not recognize variant heading type %', type_value;
+                END;
+            END IF;
+            IF idx.heading_purpose = 'related' AND idx.type_xpath IS NOT NULL THEN
+                type_value := ARRAY_TO_STRING(oils_xpath(idx.type_xpath, heading_node, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]]), '');
+                BEGIN
+                    output_row.related_type := type_value;
+                EXCEPTION WHEN invalid_text_representation THEN
+                    RAISE NOTICE 'Do not recognize related heading type %', type_value;
+                END;
+            END IF;
+ 
+            IF idx.thesaurus_override_xpath IS NOT NULL THEN
+                output_row.thesaurus := ARRAY_TO_STRING(oils_xpath(idx.thesaurus_override_xpath, heading_node, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]]), '');
+            END IF;
+            IF output_row.thesaurus IS NULL THEN
+                output_row.thesaurus := base_thesaurus;
+            END IF;
+
+            raw_text := NULL;
+
+            -- now iterate over components of heading
+            component_node_list := oils_xpath( idx.component_xpath, heading_node, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
+            FOR component_node IN SELECT x FROM unnest(component_node_list) AS x LOOP
+            -- XXX much of this should be moved into oils_xpath_string...
+                curr_text := ARRAY_TO_STRING(evergreen.array_remove_item_by_value(evergreen.array_remove_item_by_value(
+                    oils_xpath( '//text()', -- get the content of all the nodes within the main selected node
+                        REGEXP_REPLACE( component_node, E'\\s+', ' ', 'g' ) -- Translate adjacent whitespace to a single space
+                    ), ' '), ''),  -- throw away morally empty (bankrupt?) strings
+                    joiner
+                );
+
+                CONTINUE WHEN curr_text IS NULL OR curr_text = '';
+
+                IF raw_text IS NOT NULL THEN
+                    raw_text := raw_text || joiner;
+                END IF;
+
+                raw_text := COALESCE(raw_text,'') || curr_text;
+            END LOOP;
+
+            IF raw_text IS NOT NULL THEN
+                output_row.heading := raw_text;
+                normalized_text := raw_text;
+
+                FOR normalizer IN
+                    SELECT  n.func AS func,
+                            n.param_count AS param_count,
+                            m.params AS params
+                    FROM  config.index_normalizer n
+                            JOIN authority.heading_field_norm_map m ON (m.norm = n.id)
+                    WHERE m.field = idx.id
+                    ORDER BY m.pos LOOP
+            
+                        EXECUTE 'SELECT ' || normalizer.func || '(' ||
+                            quote_literal( normalized_text ) ||
+                            CASE
+                                WHEN normalizer.param_count > 0
+                                    THEN ',' || REPLACE(REPLACE(BTRIM(normalizer.params,'[]'),E'\'',E'\\\''),E'"',E'\'')
+                                    ELSE ''
+                                END ||
+                            ')' INTO normalized_text;
+            
+                END LOOP;
+            
+                output_row.normalized_heading := normalized_text;
+            
+                RETURN NEXT output_row;
+            END IF;
+        END LOOP;
+
+    END LOOP;
+END;
+$func$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION authority.extract_headings(rid BIGINT, restrict INT[] DEFAULT NULL) RETURNS SETOF authority.heading AS $func$
+DECLARE
+    auth        authority.record_entry%ROWTYPE;
+    output_row  authority.heading;
+BEGIN
+    -- Get the record
+    SELECT INTO auth * FROM authority.record_entry WHERE id = rid;
+
+    RETURN QUERY SELECT * FROM authority.extract_headings(auth.marc, restrict);
+END;
+$func$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION authority.simple_heading_set( marcxml TEXT ) RETURNS SETOF authority.simple_heading AS $func$
+DECLARE
+    res             authority.simple_heading%ROWTYPE;
+    acsaf           authority.control_set_authority_field%ROWTYPE;
+    heading_row     authority.heading%ROWTYPE;
+    tag_used        TEXT;
+    nfi_used        TEXT;
+    sf              TEXT;
+    cset            INT;
+    heading_text    TEXT;
+    joiner_text     TEXT;
+    sort_text       TEXT;
+    tmp_text        TEXT;
+    tmp_xml         TEXT;
+    first_sf        BOOL;
+    auth_id         INT DEFAULT COALESCE(NULLIF(oils_xpath_string('//*[@tag="901"]/*[local-name()="subfield" and @code="c"]', marcxml), ''), '0')::INT; 
+BEGIN
+
+    SELECT control_set INTO cset FROM authority.record_entry WHERE id = auth_id;
+
+    IF cset IS NULL THEN
+        SELECT  control_set INTO cset
+          FROM  authority.control_set_authority_field
+          WHERE tag IN ( SELECT  UNNEST(XPATH('//*[starts-with(@tag,"1")]/@tag',marcxml::XML)::TEXT[]))
+          LIMIT 1;
+    END IF;
+
+    res.record := auth_id;
+    res.thesaurus := authority.extract_thesaurus(marcxml);
+
+    FOR acsaf IN SELECT * FROM authority.control_set_authority_field WHERE control_set = cset LOOP
+        res.atag := acsaf.id;
+
+        IF acsaf.heading_field IS NULL THEN
+            tag_used := acsaf.tag;
+            nfi_used := acsaf.nfi;
+            joiner_text := COALESCE(acsaf.joiner, ' ');
+    
+            FOR tmp_xml IN SELECT UNNEST(XPATH('//*[@tag="'||tag_used||'"]', marcxml::XML)::TEXT[]) LOOP
+    
+                heading_text := COALESCE(
+                    oils_xpath_string('./*[contains("'||acsaf.display_sf_list||'", at code)]', tmp_xml, joiner_text),
+                    ''
+                );
+    
+                IF nfi_used IS NOT NULL THEN
+    
+                    sort_text := SUBSTRING(
+                        heading_text FROM
+                        COALESCE(
+                            NULLIF(
+                                REGEXP_REPLACE(
+                                    oils_xpath_string('./@ind'||nfi_used, tmp_xml::TEXT),
+                                    $$\D+$$,
+                                    '',
+                                    'g'
+                                ),
+                                ''
+                            )::INT,
+                            0
+                        ) + 1
+                    );
+    
+                ELSE
+                    sort_text := heading_text;
+                END IF;
+    
+                IF heading_text IS NOT NULL AND heading_text <> '' THEN
+                    res.value := heading_text;
+                    res.sort_value := public.naco_normalize(sort_text);
+                    res.index_vector = to_tsvector('keyword'::regconfig, res.sort_value);
+                    RETURN NEXT res;
+                END IF;
+    
+            END LOOP;
+        ELSE
+            FOR heading_row IN SELECT * FROM authority.extract_headings(marcxml, ARRAY[acsaf.heading_field]) LOOP
+                res.value := heading_row.heading;
+                res.sort_value := heading_row.normalized_heading;
+                res.index_vector = to_tsvector('keyword'::regconfig, res.sort_value);
+                RETURN NEXT res;
+            END LOOP;
+        END IF;
+    END LOOP;
+
+    RETURN;
+END;
+$func$ LANGUAGE PLPGSQL STABLE STRICT;
+
+ALTER TABLE authority.control_set_authority_field ADD COLUMN heading_field INTEGER REFERENCES authority.heading_field(id);
+
+UPDATE authority.control_set_authority_field acsaf
+SET heading_field = ahf.id
+FROM authority.heading_field ahf
+WHERE tag = '100'
+AND control_set = 1
+AND ahf.heading_purpose = 'main'
+AND ahf.heading_type = 'personal_name';
+UPDATE authority.control_set_authority_field acsaf
+SET heading_field = ahf.id
+FROM authority.heading_field ahf
+WHERE tag = '400'
+AND control_set = 1
+AND ahf.heading_purpose = 'variant'
+AND ahf.heading_type = 'personal_name';
+UPDATE authority.control_set_authority_field acsaf
+SET heading_field = ahf.id
+FROM authority.heading_field ahf
+WHERE tag = '500'
+AND control_set = 1
+AND ahf.heading_purpose = 'related'
+AND ahf.heading_type = 'personal_name';
+
+UPDATE authority.control_set_authority_field acsaf
+SET heading_field = ahf.id
+FROM authority.heading_field ahf
+WHERE tag = '110'
+AND control_set = 1
+AND ahf.heading_purpose = 'main'
+AND ahf.heading_type = 'corporate_name';
+UPDATE authority.control_set_authority_field acsaf
+SET heading_field = ahf.id
+FROM authority.heading_field ahf
+WHERE tag = '410'
+AND control_set = 1
+AND ahf.heading_purpose = 'variant'
+AND ahf.heading_type = 'corporate_name';
+UPDATE authority.control_set_authority_field acsaf
+SET heading_field = ahf.id
+FROM authority.heading_field ahf
+WHERE tag = '510'
+AND control_set = 1
+AND ahf.heading_purpose = 'related'
+AND ahf.heading_type = 'corporate_name';
+
+UPDATE authority.control_set_authority_field acsaf
+SET heading_field = ahf.id
+FROM authority.heading_field ahf
+WHERE tag = '111'
+AND control_set = 1
+AND ahf.heading_purpose = 'main'
+AND ahf.heading_type = 'meeting_name';
+UPDATE authority.control_set_authority_field acsaf
+SET heading_field = ahf.id
+FROM authority.heading_field ahf
+WHERE tag = '411'
+AND control_set = 1
+AND ahf.heading_purpose = 'variant'
+AND ahf.heading_type = 'meeting_name';
+UPDATE authority.control_set_authority_field acsaf
+SET heading_field = ahf.id
+FROM authority.heading_field ahf
+WHERE tag = '511'
+AND control_set = 1
+AND ahf.heading_purpose = 'related'
+AND ahf.heading_type = 'meeting_name';
+
+UPDATE authority.control_set_authority_field acsaf
+SET heading_field = ahf.id
+FROM authority.heading_field ahf
+WHERE tag = '130'
+AND control_set = 1
+AND ahf.heading_purpose = 'main'
+AND ahf.heading_type = 'uniform_title';
+UPDATE authority.control_set_authority_field acsaf
+SET heading_field = ahf.id
+FROM authority.heading_field ahf
+WHERE tag = '430'
+AND control_set = 1
+AND ahf.heading_purpose = 'variant'
+AND ahf.heading_type = 'uniform_title';
+UPDATE authority.control_set_authority_field acsaf
+SET heading_field = ahf.id
+FROM authority.heading_field ahf
+WHERE tag = '530'
+AND control_set = 1
+AND ahf.heading_purpose = 'related'
+AND ahf.heading_type = 'uniform_title';
+
+UPDATE authority.control_set_authority_field acsaf
+SET heading_field = ahf.id
+FROM authority.heading_field ahf
+WHERE tag = '150'
+AND control_set = 1
+AND ahf.heading_purpose = 'main'
+AND ahf.heading_type = 'topical_term';
+UPDATE authority.control_set_authority_field acsaf
+SET heading_field = ahf.id
+FROM authority.heading_field ahf
+WHERE tag = '450'
+AND control_set = 1
+AND ahf.heading_purpose = 'variant'
+AND ahf.heading_type = 'topical_term';
+UPDATE authority.control_set_authority_field acsaf
+SET heading_field = ahf.id
+FROM authority.heading_field ahf
+WHERE tag = '550'
+AND control_set = 1
+AND ahf.heading_purpose = 'related'
+AND ahf.heading_type = 'topical_term';
+
+UPDATE authority.control_set_authority_field acsaf
+SET heading_field = ahf.id
+FROM authority.heading_field ahf
+WHERE tag = '151'
+AND control_set = 1
+AND ahf.heading_purpose = 'main'
+AND ahf.heading_type = 'geographic_name';
+UPDATE authority.control_set_authority_field acsaf
+SET heading_field = ahf.id
+FROM authority.heading_field ahf
+WHERE tag = '451'
+AND control_set = 1
+AND ahf.heading_purpose = 'variant'
+AND ahf.heading_type = 'geographic_name';
+UPDATE authority.control_set_authority_field acsaf
+SET heading_field = ahf.id
+FROM authority.heading_field ahf
+WHERE tag = '551'
+AND control_set = 1
+AND ahf.heading_purpose = 'related'
+AND ahf.heading_type = 'geographic_name';
+
+UPDATE authority.control_set_authority_field acsaf
+SET heading_field = ahf.id
+FROM authority.heading_field ahf
+WHERE tag = '155'
+AND control_set = 1
+AND ahf.heading_purpose = 'main'
+AND ahf.heading_type = 'genre_form_term';
+UPDATE authority.control_set_authority_field acsaf
+SET heading_field = ahf.id
+FROM authority.heading_field ahf
+WHERE tag = '455'
+AND control_set = 1
+AND ahf.heading_purpose = 'variant'
+AND ahf.heading_type = 'genre_form_term';
+UPDATE authority.control_set_authority_field acsaf
+SET heading_field = ahf.id
+FROM authority.heading_field ahf
+WHERE tag = '555'
+AND control_set = 1
+AND ahf.heading_purpose = 'related'
+AND ahf.heading_type = 'genre_form_term';
+
+
+SELECT evergreen.upgrade_deps_block_check('1070', :eg_version); --miker/gmcharlt/kmlussier
+
+CREATE TRIGGER thes_code_tracking_trigger
+    AFTER UPDATE ON authority.thesaurus
+    FOR EACH ROW EXECUTE PROCEDURE oils_i18n_code_tracking('at');
+
+ALTER TABLE authority.thesaurus ADD COLUMN short_code TEXT, ADD COLUMN uri TEXT;
+
+DELETE FROM authority.thesaurus WHERE control_set = 1 AND code NOT IN ('n',' ','|');
+UPDATE authority.thesaurus SET short_code = code;
+
+CREATE TEMP TABLE thesauri (code text, uri text, name text, xlate hstore);
+COPY thesauri (code, uri, name, xlate) FROM STDIN;
+migfg	http://id.loc.gov/vocabulary/genreFormSchemes/migfg	Moving image genre-form guide	
+reveal	http://id.loc.gov/vocabulary/genreFormSchemes/reveal	REVEAL: fiction indexing and genre headings	
+dct	http://id.loc.gov/vocabulary/genreFormSchemes/dct	Dublin Core list of resource types	
+gmgpc	http://id.loc.gov/vocabulary/genreFormSchemes/gmgpc	Thesaurus for graphic materials: TGM II, Genre and physical characteristic terms	
+rbgenr	http://id.loc.gov/vocabulary/genreFormSchemes/rbgenr	Genre terms: a thesaurus for use in rare book and special collections cataloguing	
+sgp	http://id.loc.gov/vocabulary/genreFormSchemes/sgp	Svenska genrebeteckningar fr periodika	"sv"=>"Svenska genrebeteckningar fr periodika"
+estc	http://id.loc.gov/vocabulary/genreFormSchemes/estc	Eighteenth century short title catalogue, the cataloguing rules. New ed.	
+ftamc	http://id.loc.gov/vocabulary/genreFormSchemes/ftamc	Form terms for archival and manuscripts control	
+alett	http://id.loc.gov/vocabulary/genreFormSchemes/alett	An alphabetical list of English text types	
+gtlm	http://id.loc.gov/vocabulary/genreFormSchemes/gtlm	Genre terms for law materials: a thesaurus	
+rbprov	http://id.loc.gov/vocabulary/genreFormSchemes/rbprov	Provenance evidence: a thesaurus for use in rare book and special collections cataloging	
+rbbin	http://id.loc.gov/vocabulary/genreFormSchemes/rbbin	Binding terms: a thesaurus for use in rare book and special collections cataloguing	
+fbg	http://id.loc.gov/vocabulary/genreFormSchemes/fbg	Films by genre /dd>	
+isbdmedia	http://id.loc.gov/vocabulary/genreFormSchemes/isbdmedia	ISBD Area 0 [media]	
+marccategory	http://id.loc.gov/vocabulary/genreFormSchemes/marccategory	MARC form category term list	
+gnd-music	http://id.loc.gov/vocabulary/genreFormSchemes/gnd-music	Gemeinsame Normdatei: Musikalische Ausgabeform	
+proysen	http://id.loc.gov/vocabulary/genreFormSchemes/proysen	Prøysen: emneord for Prøysen-bibliografien	
+rdacarrier	http://id.loc.gov/vocabulary/genreFormSchemes/rdacarrier	Term and code list for RDA carrier types	
+gnd	http://id.loc.gov/vocabulary/genreFormSchemes/gnd	Gemeinsame Normdatei	
+cjh	http://id.loc.gov/vocabulary/genreFormSchemes/cjh	Center for Jewish History thesaurus	
+rbpri	http://id.loc.gov/vocabulary/genreFormSchemes/rbpri	Printing & publishing evidence: a thesaurus for use in rare book and special collections cataloging	
+fgtpcm	http://id.loc.gov/vocabulary/genreFormSchemes/fgtpcm	Form/genre terms for printed cartoon material	
+rbpub	http://id.loc.gov/vocabulary/genreFormSchemes/rbpub	Printing and publishing evidence: a thesaurus for use in rare book and special collections cataloging	
+gmd	http://id.loc.gov/vocabulary/genreFormSchemes/gmd	Anglo-American Cataloguing Rules general material designation	
+rbpap	http://id.loc.gov/vocabulary/genreFormSchemes/rbpap	Paper terms: a thesaurus for use in rare book and special collections cataloging	
+rdamedia	http://id.loc.gov/vocabulary/genreFormSchemes/rdamedia	Term and code list for RDA media types	
+marcsmd	http://id.loc.gov/vocabulary/genreFormSchemes/marcsmd	MARC specific material form term list	
+saogf	http://id.loc.gov/vocabulary/genreFormSchemes/saogf	Svenska ämnesord - Genre/Form	"sv"=>"Svenska ämnesord - Genre/Form"
+lcgft	http://id.loc.gov/vocabulary/genreFormSchemes/lcgft	Library of Congress genre/form terms for library and archival materials	
+muzeukv	http://id.loc.gov/vocabulary/genreFormSchemes/muzeukv	MuzeVideo UK DVD and UMD film genre classification	
+mim	http://id.loc.gov/vocabulary/genreFormSchemes/mim	Moving image materials: genre terms	
+nmc	http://id.loc.gov/vocabulary/genreFormSchemes/nmc	Revised nomenclature for museum cataloging: a revised and expanded version of Robert C. Chenhall's system for classifying man-made objects	
+gnd-content	http://id.loc.gov/vocabulary/genreFormSchemes/gnd-content	Gemeinsame Normdatei: Beschreibung des Inhalts	
+bgtchm	http://id.loc.gov/vocabulary/genreFormSchemes/bgtchm	Basic genre terms for cultural heritage materials	
+gsafd	http://id.loc.gov/vocabulary/genreFormSchemes/gsafd	Guidelines on subject access to individual works of fiction, drama, etc	
+marcform	http://id.loc.gov/vocabulary/genreFormSchemes/marcform	MARC form of item term list	
+marcgt	http://id.loc.gov/vocabulary/genreFormSchemes/marcgt	MARC genre terms	
+barngf	http://id.loc.gov/vocabulary/genreFormSchemes/barngf	Svenska ämnesord för barn - Genre/Form	"sv"=>"Svenska ämnesord för barn - Genre/Form"
+ngl	http://id.loc.gov/vocabulary/genreFormSchemes/ngl	Newspaper genre list	
+rvmgf	http://id.loc.gov/vocabulary/genreFormSchemes/rvmgf	Thésaurus des descripteurs de genre/forme de l'Université Laval	"fr"=>"Thésaurus des descripteurs de genre/forme de l'Université Laval"
+tgfbne	http://id.loc.gov/vocabulary/genreFormSchemes/tgfbne	Términos de género/forma de la Biblioteca Nacional de España	
+nbdbgf	http://id.loc.gov/vocabulary/genreFormSchemes/nbdbgf	NBD Biblion Genres Fictie	
+rbtyp	http://id.loc.gov/vocabulary/genreFormSchemes/rbtyp	Type evidence: a thesaurus for use in rare book and special collections cataloging	
+radfg	http://id.loc.gov/vocabulary/genreFormSchemes/radfg	Radio form / genre terms guide	
+gnd-carrier	http://id.loc.gov/vocabulary/genreFormSchemes/gnd-carrier	Gemeinsame Normdatei: Datenträgertyp	
+gatbeg	http://id.loc.gov/vocabulary/genreFormSchemes/gatbeg	Gattungsbegriffe	"de"=>"Gattungsbegriffe"
+rdacontent	http://id.loc.gov/vocabulary/genreFormSchemes/rdacontent	Term and code list for RDA content types	
+isbdcontent	http://id.loc.gov/vocabulary/genreFormSchemes/isbdcontent	ISBD Area 0 [content]	
+nimafc	http://id.loc.gov/vocabulary/genreFormSchemes/nimafc	NIMA form codes	
+amg	http://id.loc.gov/vocabulary/genreFormSchemes/amg	Audiovisual material glossary	
+local	http://id.loc.gov/vocabulary/subjectSchemes/local	Locally assigned term	
+taika	http://id.loc.gov/vocabulary/subjectSchemes/taika	Taideteollisuuden asiasanasto	"fi"=>"Taideteollisuuden asiasanasto"
+nasat	http://id.loc.gov/vocabulary/subjectSchemes/nasat	NASA thesaurus	
+rswkaf	http://id.loc.gov/vocabulary/subjectSchemes/rswkaf	Alternativform zum Hauptschlagwort	"de"=>"Alternativform zum Hauptschlagwort"
+jhpk	http://id.loc.gov/vocabulary/subjectSchemes/jhpk	Język haseł przedmiotowych KABA	"pl"=>"Język haseł przedmiotowych KABA"
+asrcrfcd	http://id.loc.gov/vocabulary/subjectSchemes/asrcrfcd	Australian Standard Research Classification: Research Fields, Courses and Disciplines (RFCD) classification	
+bt	http://id.loc.gov/vocabulary/subjectSchemes/bt	Bioethics thesaurus	
+lcstt	http://id.loc.gov/vocabulary/subjectSchemes/lcstt	List of Chinese subject terms	
+netc	http://id.loc.gov/vocabulary/subjectSchemes/netc	National Emergency Training Center Thesaurus (NETC)	
+aat	http://id.loc.gov/vocabulary/subjectSchemes/aat	Art & architecture thesaurus	
+bet	http://id.loc.gov/vocabulary/subjectSchemes/bet	British education thesaurus	
+ncjt	http://id.loc.gov/vocabulary/subjectSchemes/ncjt	National criminal justice thesaurus	
+samisk	http://id.loc.gov/vocabulary/subjectSchemes/samisk	Sami bibliography	"no"=>"Sámi bibliografia = Samisk bibliografi (Norge)"
+tips	http://id.loc.gov/vocabulary/subjectSchemes/tips	Tesauro ISOC de psicología	"es"=>"Tesauro ISOC de psicología"
+ukslc	http://id.loc.gov/vocabulary/subjectSchemes/ukslc	UK Standard Library Categories	
+tekord	http://id.loc.gov/vocabulary/subjectSchemes/tekord	TEK-ord : UBiTs emneordliste for arkitektur, realfag, og teknolog	"no"=>"TEK-ord : UBiTs emneordliste for arkitektur, realfag, og teknolog"
+umitrist	http://id.loc.gov/vocabulary/subjectSchemes/umitrist	University of Michigan Transportation Research Institute structured thesaurus	
+wgst	http://id.loc.gov/vocabulary/subjectSchemes/wgst	Washington GILS Subject Tree	
+rasuqam	http://id.loc.gov/vocabulary/subjectSchemes/rasuqam	Répertoire d'autorités-sujet de l'UQAM	"fr"=>"Répertoire d'autorités-sujet de l'UQAM"
+ntids	http://id.loc.gov/vocabulary/subjectSchemes/ntids	Norske tidsskrifter 1700-1820: emneord	"no"=>"Norske tidsskrifter 1700-1820: emneord"
+kaa	http://id.loc.gov/vocabulary/subjectSchemes/kaa	Kasvatusalan asiasanasto	"fi"=>"Kasvatusalan asiasanasto"
+yso	http://id.loc.gov/vocabulary/subjectSchemes/yso	YSO - Yleinen suomalainen ontologia	"fi"=>"YSO - Yleinen suomalainen ontologia"
+gcipmedia	http://id.loc.gov/vocabulary/subjectSchemes/gcipmedia	GAMECIP - Computer Game Media Formats (GAMECIP (Game Metadata and Citation Project))	
+inspect	http://id.loc.gov/vocabulary/subjectSchemes/inspect	INSPEC thesaurus	
+ordnok	http://id.loc.gov/vocabulary/subjectSchemes/ordnok	Ordnokkelen: tesaurus for kulturminnevern	"no"=>"Ordnokkelen: tesaurus for kulturminnevern"
+helecon	http://id.loc.gov/vocabulary/subjectSchemes/helecon	Asiasanasto HELECON-tietikantoihin	"fi"=>"Asiasanasto HELECON-tietikantoihin"
+dltlt	http://id.loc.gov/vocabulary/subjectSchemes/dltlt	Cuddon, J. A. A dictionary of literary terms and literary theory	
+csapa	http://id.loc.gov/vocabulary/subjectSchemes/csapa	"Controlled vocabulary" in Pollution abstracts	
+gtt	http://id.loc.gov/vocabulary/subjectSchemes/gtt	GOO-trefwoorden thesaurus	"nl"=>"GOO-trefwoorden thesaurus"
+iescs	http://id.loc.gov/vocabulary/subjectSchemes/iescs	International energy subject categories and scope	
+itrt	http://id.loc.gov/vocabulary/subjectSchemes/itrt	International Thesaurus of Refugee Terminology	
+sanb	http://id.loc.gov/vocabulary/subjectSchemes/sanb	South African national bibliography authority file	
+blmlsh	http://id.loc.gov/vocabulary/subjectSchemes/blmlsh	British Library - Map library subject headings	
+bhb	http://id.loc.gov/vocabulary/subjectSchemes/bhb	Bibliography of the Hebrew Book	
+csh	http://id.loc.gov/vocabulary/subjectSchemes/csh	Kapsner, Oliver Leonard. Catholic subject headings	
+fire	http://id.loc.gov/vocabulary/subjectSchemes/fire	FireTalk, IFSI thesaurus	
+jlabsh	http://id.loc.gov/vocabulary/subjectSchemes/jlabsh	Basic subject headings	"ja"=>"Kihon kenmei hyômokuhyô"
+udc	http://id.loc.gov/vocabulary/subjectSchemes/udc	Universal decimal classification	
+lcshac	http://id.loc.gov/vocabulary/subjectSchemes/lcshac	Children's subject headings in Library of Congress subject headings: supplementary vocabularies	
+geonet	http://id.loc.gov/vocabulary/subjectSchemes/geonet	NGA GEOnet Names Server (GNS)	
+humord	http://id.loc.gov/vocabulary/subjectSchemes/humord	HUMORD	"no"=>"HUMORD"
+no-ubo-mr	http://id.loc.gov/vocabulary/subjectSchemes/no-ubo-mr	Menneskerettighets-tesaurus	"no"=>"Menneskerettighets-tesaurus"
+sgce	http://id.loc.gov/vocabulary/subjectSchemes/sgce	COBISS.SI General List of subject headings (English subject headings)	"sl"=>"Splošni geslovnik COBISS.SI"
+kdm	http://id.loc.gov/vocabulary/subjectSchemes/kdm	Khung dê muc hê thông thông tin khoa hoc và ky thuât quôc gia	"vi"=>"Khung dê muc hê thông thông tin khoa hoc và ky thuât quôc gia"
+thesoz	http://id.loc.gov/vocabulary/subjectSchemes/thesoz	Thesaurus for the Social Sciences	
+asth	http://id.loc.gov/vocabulary/subjectSchemes/asth	Astronomy thesaurus	
+muzeukc	http://id.loc.gov/vocabulary/subjectSchemes/muzeukc	MuzeMusic UK classical music classification	
+norbok	http://id.loc.gov/vocabulary/subjectSchemes/norbok	Norbok: emneord i Norsk bokfortegnelse	"no"=>"Norbok: emneord i Norsk bokfortegnelse"
+masa	http://id.loc.gov/vocabulary/subjectSchemes/masa	Museoalan asiasanasto	"fi"=>"Museoalan asiasanasto"
+conorsi	http://id.loc.gov/vocabulary/subjectSchemes/conorsi	CONOR.SI (name authority file) (Maribor, Slovenia: Institut informacijskih znanosti (IZUM))	
+eurovocen	http://id.loc.gov/vocabulary/subjectSchemes/eurovocen	Eurovoc thesaurus (English)	
+kto	http://id.loc.gov/vocabulary/subjectSchemes/kto	KTO - Kielitieteen ontologia	"fi"=>"KTO - Kielitieteen ontologia"
+muzvukci	http://id.loc.gov/vocabulary/subjectSchemes/muzvukci	MuzeVideo UK contributor index	
+kaunokki	http://id.loc.gov/vocabulary/subjectSchemes/kaunokki	Kaunokki: kaunokirjallisuuden asiasanasto	"fi"=>"Kaunokki: kaunokirjallisuuden asiasanasto"
+maotao	http://id.loc.gov/vocabulary/subjectSchemes/maotao	MAO/TAO - Ontologi för museibranschen och Konstindustriella ontologin	"fi"=>"MAO/TAO - Ontologi för museibranschen och Konstindustriella ontologin"
+psychit	http://id.loc.gov/vocabulary/subjectSchemes/psychit	Thesaurus of psychological index terms.	
+tlsh	http://id.loc.gov/vocabulary/subjectSchemes/tlsh	Subject heading authority list	
+csalsct	http://id.loc.gov/vocabulary/subjectSchemes/csalsct	CSA life sciences collection thesaurus	
+ciesiniv	http://id.loc.gov/vocabulary/subjectSchemes/ciesiniv	CIESIN indexing vocabulary	
+ebfem	http://id.loc.gov/vocabulary/subjectSchemes/ebfem	Encabezamientos bilingües de la Fundación Educativa Ana G. Mendez	
+mero	http://id.loc.gov/vocabulary/subjectSchemes/mero	MERO - Merenkulkualan ontologia	"fi"=>"MERO - Merenkulkualan ontologia"
+mmm	http://id.loc.gov/vocabulary/subjectSchemes/mmm	"Subject key" in Marxism and the mass media	
+pascal	http://id.loc.gov/vocabulary/subjectSchemes/pascal	PASCAL database classification scheme	"fr"=>"Base de donneés PASCAL: plan de classement"
+chirosh	http://id.loc.gov/vocabulary/subjectSchemes/chirosh	Chiropractic Subject Headings	
+cilla	http://id.loc.gov/vocabulary/subjectSchemes/cilla	Cilla: specialtesaurus för musik	"fi"=>"Cilla: specialtesaurus för musik"
+aiatsisl	http://id.loc.gov/vocabulary/subjectSchemes/aiatsisl	AIATSIS language thesaurus	
+nskps	http://id.loc.gov/vocabulary/subjectSchemes/nskps	Priručnik za izradu predmetnog kataloga u Nacionalnoj i sveučilišnoj knjičnici u Zagrebu	"hr"=>"Priručnik za izradu predmetnog kataloga u Nacionalnoj i sveučilišnoj knjičnici u Zagrebu"
+lctgm	http://id.loc.gov/vocabulary/subjectSchemes/lctgm	Thesaurus for graphic materials: TGM I, Subject terms	
+muso	http://id.loc.gov/vocabulary/subjectSchemes/muso	MUSO - Ontologi för musik	"fi"=>"MUSO - Ontologi för musik"
+blcpss	http://id.loc.gov/vocabulary/subjectSchemes/blcpss	COMPASS subject authority system	
+fast	http://id.loc.gov/vocabulary/subjectSchemes/fast	Faceted application of subject terminology	
+bisacmt	http://id.loc.gov/vocabulary/subjectSchemes/bisacmt	BISAC Merchandising Themes	
+lapponica	http://id.loc.gov/vocabulary/subjectSchemes/lapponica	Lapponica	"fi"=>"Lapponica"
+juho	http://id.loc.gov/vocabulary/subjectSchemes/juho	JUHO - Julkishallinnon ontologia	"fi"=>"JUHO - Julkishallinnon ontologia"
+idas	http://id.loc.gov/vocabulary/subjectSchemes/idas	ID-Archivschlüssel	"de"=>"ID-Archivschlüssel"
+tbjvp	http://id.loc.gov/vocabulary/subjectSchemes/tbjvp	Tesauro de la Biblioteca Dr. Jorge Villalobos Padilla, S.J.	"es"=>"Tesauro de la Biblioteca Dr. Jorge Villalobos Padilla, S.J."
+test	http://id.loc.gov/vocabulary/subjectSchemes/test	Thesaurus of engineering and scientific terms	
+finmesh	http://id.loc.gov/vocabulary/subjectSchemes/finmesh	FinMeSH	"fi"=>"FinMeSH"
+kssbar	http://id.loc.gov/vocabulary/subjectSchemes/kssbar	Klassifikationssystem for svenska bibliotek. Ämnesordregister. Alfabetisk del	"sv"=>"Klassifikationssystem for svenska bibliotek. Ämnesordregister. Alfabetisk del"
+kupu	http://id.loc.gov/vocabulary/subjectSchemes/kupu	Maori Wordnet	"mi"=>"He puna kupu"
+rpe	http://id.loc.gov/vocabulary/subjectSchemes/rpe	Rubricator on economics	"ru"=>"Rubrikator po ekonomike"
+dit	http://id.loc.gov/vocabulary/subjectSchemes/dit	Defense intelligence thesaurus	
+she	http://id.loc.gov/vocabulary/subjectSchemes/she	SHE: subject headings for engineering	
+idszbzna	http://id.loc.gov/vocabulary/subjectSchemes/idszbzna	Thesaurus IDS Nebis Zentralbibliothek Zürich, Nordamerika-Bibliothek	"de"=>"Thesaurus IDS Nebis Zentralbibliothek Zürich, Nordamerika-Bibliothek"
+msc	http://id.loc.gov/vocabulary/subjectSchemes/msc	Mathematical subject classification	
+muzeukn	http://id.loc.gov/vocabulary/subjectSchemes/muzeukn	MuzeMusic UK non-classical music classification	
+ipsp	http://id.loc.gov/vocabulary/subjectSchemes/ipsp	Defense intelligence production schedule.	
+sthus	http://id.loc.gov/vocabulary/subjectSchemes/sthus	Subject Taxonomy of the History of U.S. Foreign Relations	
+poliscit	http://id.loc.gov/vocabulary/subjectSchemes/poliscit	Political science thesaurus II	
+qtglit	http://id.loc.gov/vocabulary/subjectSchemes/qtglit	A queer thesaurus : an international thesaurus of gay and lesbian index terms	
+unbist	http://id.loc.gov/vocabulary/subjectSchemes/unbist	UNBIS thesaurus	
+gcipplatform	http://id.loc.gov/vocabulary/subjectSchemes/gcipplatform	GAMECIP - Computer Game Platforms (GAMECIP (Game Metadata and Citation Project))	
+puho	http://id.loc.gov/vocabulary/subjectSchemes/puho	PUHO - Puolustushallinnon ontologia	"fi"=>"PUHO - Puolustushallinnon ontologia"
+thub	http://id.loc.gov/vocabulary/subjectSchemes/thub	Thesaurus de la Universitat de Barcelona	"ca"=>"Thesaurus de la Universitat de Barcelona"
+ndlsh	http://id.loc.gov/vocabulary/subjectSchemes/ndlsh	National Diet Library list of subject headings	"ja"=>"Koktsu Kokkai Toshokan kenmei hyômokuhyô"
+czenas	http://id.loc.gov/vocabulary/subjectSchemes/czenas	CZENAS thesaurus: a list of subject terms used in the National Library of the Czech Republic	"cs"=>"Soubor vĕcných autorit Národní knihovny ČR"
+idszbzzh	http://id.loc.gov/vocabulary/subjectSchemes/idszbzzh	Thesaurus IDS Nebis Zentralbibliothek Zürich, Handschriftenabteilung	"de"=>"Thesaurus IDS Nebis Zentralbibliothek Zürich, Handschriftenabteilung"
+unbisn	http://id.loc.gov/vocabulary/subjectSchemes/unbisn	UNBIS name authority list (New York, NY: Dag Hammarskjld Library, United Nations; : Chadwyck-Healey)	
+rswk	http://id.loc.gov/vocabulary/subjectSchemes/rswk	Regeln für den Schlagwortkatalog	"de"=>"Regeln für den Schlagwortkatalog"
+larpcal	http://id.loc.gov/vocabulary/subjectSchemes/larpcal	Lista de assuntos referente ao programa de cadastramento automatizado de livros da USP	"pt"=>"Lista de assuntos referente ao programa de cadastramento automatizado de livros da USP"
+biccbmc	http://id.loc.gov/vocabulary/subjectSchemes/biccbmc	BIC Children's Books Marketing Classifications	
+kulo	http://id.loc.gov/vocabulary/subjectSchemes/kulo	KULO - Kulttuurien tutkimuksen ontologia	"fi"=>"KULO - Kulttuurien tutkimuksen ontologia"
+popinte	http://id.loc.gov/vocabulary/subjectSchemes/popinte	POPIN thesaurus: population multilingual thesaurus	
+tisa	http://id.loc.gov/vocabulary/subjectSchemes/tisa	Villagrá Rubio, Angel. Tesauro ISOC de sociología autores	"es"=>"Villagrá Rubio, Angel. Tesauro ISOC de sociología autores"
+atg	http://id.loc.gov/vocabulary/subjectSchemes/atg	Agricultural thesaurus and glossary	
+eflch	http://id.loc.gov/vocabulary/subjectSchemes/eflch	E4Libraries Category Headings	
+maaq	http://id.loc.gov/vocabulary/subjectSchemes/maaq	Madâkhil al-asmâ' al-'arabîyah al-qadîmah	"ar"=>"Madâkhil al-asmâ' al-'arabîyah al-qadîmah"
+rvmgd	http://id.loc.gov/vocabulary/subjectSchemes/rvmgd	Thésaurus des descripteurs de groupes démographiques de l'Université Laval	"fr"=>"Thésaurus des descripteurs de groupes démographiques de l'Université Laval"
+csahssa	http://id.loc.gov/vocabulary/subjectSchemes/csahssa	"Controlled vocabulary" in Health and safety science abstracts	
+sigle	http://id.loc.gov/vocabulary/subjectSchemes/sigle	SIGLE manual, Part 2, Subject category list	
+blnpn	http://id.loc.gov/vocabulary/subjectSchemes/blnpn	British Library newspaper place names	
+asrctoa	http://id.loc.gov/vocabulary/subjectSchemes/asrctoa	Australian Standard Research Classification: Type of Activity (TOA) classification	
+lcdgt	http://id.loc.gov/vocabulary/subjectSchemes/lcdgt	Library of Congress demographic group term and code List	
+bokbas	http://id.loc.gov/vocabulary/subjectSchemes/bokbas	Bokbasen	"no"=>"Bokbasen"
+gnis	http://id.loc.gov/vocabulary/subjectSchemes/gnis	Geographic Names Information System (GNIS)	
+nbiemnfag	http://id.loc.gov/vocabulary/subjectSchemes/nbiemnfag	NBIs emneordsliste for faglitteratur	"no"=>"NBIs emneordsliste for faglitteratur"
+nlgaf	http://id.loc.gov/vocabulary/subjectSchemes/nlgaf	Archeio Kathierōmenōn Epikephalidōn	"el"=>"Archeio Kathierōmenōn Epikephalidōn"
+bhashe	http://id.loc.gov/vocabulary/subjectSchemes/bhashe	BHA, Bibliography of the history of art, subject headings/English	
+tsht	http://id.loc.gov/vocabulary/subjectSchemes/tsht	Thesaurus of subject headings for television	
+scbi	http://id.loc.gov/vocabulary/subjectSchemes/scbi	Soggettario per i cataloghi delle biblioteche italiane	"it"=>"Soggettario per i cataloghi delle biblioteche italiane"
+valo	http://id.loc.gov/vocabulary/subjectSchemes/valo	VALO - Fotografiska ontologin	"fi"=>"VALO - Fotografiska ontologin"
+wpicsh	http://id.loc.gov/vocabulary/subjectSchemes/wpicsh	WPIC Library thesaurus of subject headings	
+aktp	http://id.loc.gov/vocabulary/subjectSchemes/aktp	Alphavētikos Katalogos Thematikōn Perigrapheōn	"el"=>"Alphavētikos Katalogos Thematikōn Perigrapheōn"
+stw	http://id.loc.gov/vocabulary/subjectSchemes/stw	STW Thesaurus for Economics	"de"=>"Standard-Thesaurus Wirtschaft"
+mesh	http://id.loc.gov/vocabulary/subjectSchemes/mesh	Medical subject headings	
+ica	http://id.loc.gov/vocabulary/subjectSchemes/ica	Index of Christian art	
+emnmus	http://id.loc.gov/vocabulary/subjectSchemes/emnmus	Emneord for musikkdokument i EDB-kataloger	"no"=>"Emneord for musikkdokument i EDB-kataloger"
+sao	http://id.loc.gov/vocabulary/subjectSchemes/sao	Svenska ämnesord	"sv"=>"Svenska ämnesord"
+sgc	http://id.loc.gov/vocabulary/subjectSchemes/sgc	COBISS.SI General List of subject headings (Slovenian subject headings)	"sl"=>"Splošni geslovnik COBISS.SI"
+bib1814	http://id.loc.gov/vocabulary/subjectSchemes/bib1814	1814-bibliografi: emneord for 1814-bibliografi	"no"=>"1814-bibliografi: emneord for 1814-bibliografi"
+bjornson	http://id.loc.gov/vocabulary/subjectSchemes/bjornson	Bjornson: emneord for Bjornsonbibliografien	"no"=>"Bjornson: emneord for Bjornsonbibliografien"
+liito	http://id.loc.gov/vocabulary/subjectSchemes/liito	LIITO - Liiketoimintaontologia	"fi"=>"LIITO - Liiketoimintaontologia"
+apaist	http://id.loc.gov/vocabulary/subjectSchemes/apaist	APAIS thesaurus: a list of subject terms used in the Australian Public Affairs Information Service	
+itglit	http://id.loc.gov/vocabulary/subjectSchemes/itglit	International thesaurus of gay and lesbian index terms (Chicago?: Thesaurus Committee, Gay and Lesbian Task Force, American Library Association)	
+ntcsd	http://id.loc.gov/vocabulary/subjectSchemes/ntcsd	"National Translations Center secondary descriptors" in National Translation Center primary subject classification and secondary descriptor	
+scisshl	http://id.loc.gov/vocabulary/subjectSchemes/scisshl	SCIS subject headings	
+opms	http://id.loc.gov/vocabulary/subjectSchemes/opms	Opetusministeriön asiasanasto	"fi"=>"Opetusministeriön asiasanasto"
+ttka	http://id.loc.gov/vocabulary/subjectSchemes/ttka	Teologisen tiedekunnan kirjaston asiasanasto	"fi"=>"Teologisen tiedekunnan kirjaston asiasanasto"
+watrest	http://id.loc.gov/vocabulary/subjectSchemes/watrest	Thesaurus of water resources terms: a collection of water resources and related terms for use in indexing technical information	
+ysa	http://id.loc.gov/vocabulary/subjectSchemes/ysa	Yleinen suomalainen asiasanasto	"fi"=>"Yleinen suomalainen asiasanasto"
+kitu	http://id.loc.gov/vocabulary/subjectSchemes/kitu	Kirjallisuudentutkimuksen asiasanasto	"fi"=>"Kirjallisuudentutkimuksen asiasanasto"
+sk	http://id.loc.gov/vocabulary/subjectSchemes/sk	'Zhong guo gu ji shan ban shu zong mu' fen lei biao	"zh"=>"'Zhong guo gu ji shan ban shu zong mu' fen lei biao"
+aiatsisp	http://id.loc.gov/vocabulary/subjectSchemes/aiatsisp	AIATSIS place thesaurus	
+ram	http://id.loc.gov/vocabulary/subjectSchemes/ram	RAMEAU: répertoire d'authorité de matières encyclopédique unifié	"fr"=>"RAMEAU: répertoire d'authorité de matières encyclopédique unifié"
+aedoml	http://id.loc.gov/vocabulary/subjectSchemes/aedoml	Listado de encabezamientos de materia de música	"es"=>"Listado de encabezamientos de materia de música"
+ated	http://id.loc.gov/vocabulary/subjectSchemes/ated	Australian Thesaurus of Education Descriptors (ATED)	
+cabt	http://id.loc.gov/vocabulary/subjectSchemes/cabt	CAB thesaurus (Slough [England]: Commonwealth Agricultural Bureaux)	
+kassu	http://id.loc.gov/vocabulary/subjectSchemes/kassu	Kassu - Kasvien suomenkieliset nimet	"fi"=>"Kassu - Kasvien suomenkieliset nimet"
+nbdbt	http://id.loc.gov/vocabulary/subjectSchemes/nbdbt	NBD Biblion Trefwoordenthesaurus	"nl"=>"NBD Biblion Trefwoordenthesaurus"
+jhpb	http://id.loc.gov/vocabulary/subjectSchemes/jhpb	Język haseł przedmiotowych Biblioteki Narodowej	"pl"=>"Język haseł przedmiotowych Biblioteki Narodowej"
+bidex	http://id.loc.gov/vocabulary/subjectSchemes/bidex	Bilindex: a bilingual Spanish-English subject heading list	
+ccsa	http://id.loc.gov/vocabulary/subjectSchemes/ccsa	Catalogue collectif suisse des affiches	"fr"=>"Catalogue collectif suisse des affiches"
+noraf	http://id.loc.gov/vocabulary/subjectSchemes/noraf	Norwegian Authority File	
+kito	http://id.loc.gov/vocabulary/subjectSchemes/kito	KITO - Kirjallisuudentutkimuksen ontologia	"fi"=>"KITO - Kirjallisuudentutkimuksen ontologia"
+tho	http://id.loc.gov/vocabulary/subjectSchemes/tho	Thesauros Hellēnikōn Oron	"el"=>"Thesauros Hellēnikōn Oron"
+pmont	http://id.loc.gov/vocabulary/subjectSchemes/pmont	Powerhouse Museum Object Name Thesaurus	
+ssg	http://id.loc.gov/vocabulary/subjectSchemes/ssg	Splošni slovenski geslovnik	"sl"=>"Splošni slovenski geslovnik"
+huc	http://id.loc.gov/vocabulary/subjectSchemes/huc	U.S. Geological Survey water-supply paper 2294: hydrologic basins unit codes	
+isis	http://id.loc.gov/vocabulary/subjectSchemes/isis	"Classification scheme" in Isis	
+ibsen	http://id.loc.gov/vocabulary/subjectSchemes/ibsen	Ibsen: emneord for Den internasjonale Ibsen-bibliografien	"no"=>"Ibsen: emneord for Den internasjonale Ibsen-bibliografien"
+lacnaf	http://id.loc.gov/vocabulary/subjectSchemes/lacnaf	Library and Archives Canada name authority file	
+swemesh	http://id.loc.gov/vocabulary/subjectSchemes/swemesh	Swedish MeSH	"sv"=>"Svenska MeSH"
+hamsun	http://id.loc.gov/vocabulary/subjectSchemes/hamsun	Hamsun: emneord for Hamsunbibliografien	"no"=>"Hamsun: emneord for Hamsunbibliografien"
+qrma	http://id.loc.gov/vocabulary/subjectSchemes/qrma	List of Arabic subject headings	"ar"=>"Qâ'imat ru'ûs al-mawdûât al-'Arabîyah"
+qrmak	http://id.loc.gov/vocabulary/subjectSchemes/qrmak	Qâ'imat ru'ûs al-mawdû'ât al-'Arabîyah al-qiyâsîyah al-maktabât wa-marâkaz al-ma'lûmât wa-qawâid al-bayânât	"ar"=>"Qâ'imat ru'ûs al-mawdû'ât al-'Arabîyah al-qiyâsîyah al-maktabât wa-marâkaz al-ma'lûmât wa-qawâid al-bayânât"
+ceeus	http://id.loc.gov/vocabulary/subjectSchemes/ceeus	Counties and equivalent entities of the United States its possessions, and associated areas	
+taxhs	http://id.loc.gov/vocabulary/subjectSchemes/taxhs	A taxonomy or human services: a conceptual framework with standardized terminology and definitions for the field	
+noram	http://id.loc.gov/vocabulary/subjectSchemes/noram	Noram: emneord for Norsk-amerikansk samling	"no"=>"Noram: emneord for Norsk-amerikansk samling"
+eurovocfr	http://id.loc.gov/vocabulary/subjectSchemes/eurovocfr	Eurovoc thesaurus (French)	
+jurivoc	http://id.loc.gov/vocabulary/subjectSchemes/jurivoc	JURIVOC	
+agrifors	http://id.loc.gov/vocabulary/subjectSchemes/agrifors	AGRIFOREST-sanasto	"fi"=>"AGRIFOREST-sanasto"
+noubojur	http://id.loc.gov/vocabulary/subjectSchemes/noubojur	Thesaurus of Law	"no"=>"Thesaurus of Law"
+pha	http://id.loc.gov/vocabulary/subjectSchemes/pha	Puolostushallinnon asiasanasto	"fi"=>"Puolostushallinnon asiasanasto"
+ddcrit	http://id.loc.gov/vocabulary/subjectSchemes/ddcrit	DDC retrieval and indexing terminology; posting terms with hierarchy and KWOC	
+mar	http://id.loc.gov/vocabulary/subjectSchemes/mar	Merenkulun asiasanasto	"fi"=>"Merenkulun asiasanasto"
+sbt	http://id.loc.gov/vocabulary/subjectSchemes/sbt	Soggettario Sistema Bibliotecario Ticinese	"it"=>"Soggettario Sistema Bibliotecario Ticinese"
+nzggn	http://id.loc.gov/vocabulary/subjectSchemes/nzggn	New Zealand gazetteer of official geographic names (New Zealand Geographic Board Ngā Pou Taunaha o Aotearoa (NZGB))	
+kta	http://id.loc.gov/vocabulary/subjectSchemes/kta	Kielitieteen asiasanasto	"fi"=>"Kielitieteen asiasanasto"
+snt	http://id.loc.gov/vocabulary/subjectSchemes/snt	Sexual nomenclature : a thesaurus	
+francis	http://id.loc.gov/vocabulary/subjectSchemes/francis	FRANCIS database classification scheme	"fr"=>"Base de donneés FRANCIS: plan de classement"
+eurovocsl	http://id.loc.gov/vocabulary/subjectSchemes/eurovocsl	Eurovoc thesaurus	"sl"=>"Eurovoc thesaurus"
+idszbzes	http://id.loc.gov/vocabulary/subjectSchemes/idszbzes	Thesaurus IDS Nebis Bibliothek Englisches Seminar der Universität Zürich	"de"=>"Thesaurus IDS Nebis Bibliothek Englisches Seminar der Universität Zürich"
+nlmnaf	http://id.loc.gov/vocabulary/subjectSchemes/nlmnaf	National Library of Medicine name authority file	
+rugeo	http://id.loc.gov/vocabulary/subjectSchemes/rugeo	Natsional'nyi normativnyi fail geograficheskikh nazvanii Rossiiskoi Federatsii	"ru"=>"Natsional'nyi normativnyi fail geograficheskikh nazvanii Rossiiskoi Federatsii"
+sipri	http://id.loc.gov/vocabulary/subjectSchemes/sipri	SIPRI library thesaurus	
+kkts	http://id.loc.gov/vocabulary/subjectSchemes/kkts	Katalogos Kathierōmenōn Typōn Syllogikou Katalogou Demosion Vivliothekon	"el"=>"Katalogos Kathierōmenōn Typōn Syllogikou Katalogou Demosion Vivliothekon"
+tucua	http://id.loc.gov/vocabulary/subjectSchemes/tucua	Thesaurus for use in college and university archives	
+pmbok	http://id.loc.gov/vocabulary/subjectSchemes/pmbok	Guide to the project management body of knowledge (PMBOK Guide)	
+agrovoc	http://id.loc.gov/vocabulary/subjectSchemes/agrovoc	AGROVOC multilingual agricultural thesaurus	
+nal	http://id.loc.gov/vocabulary/subjectSchemes/nal	National Agricultural Library subject headings	
+lnmmbr	http://id.loc.gov/vocabulary/subjectSchemes/lnmmbr	Lietuvos nacionalines Martyno Mazvydo bibliotekos rubrikynas	"lt"=>"Lietuvos nacionalines Martyno Mazvydo bibliotekos rubrikynas"
+vmj	http://id.loc.gov/vocabulary/subjectSchemes/vmj	Vedettes-matière jeunesse	"fr"=>"Vedettes-matière jeunesse"
+ddcut	http://id.loc.gov/vocabulary/subjectSchemes/ddcut	Dewey Decimal Classification user terms	
+eks	http://id.loc.gov/vocabulary/subjectSchemes/eks	Eduskunnan kirjaston asiasanasto	"fi"=>"Eduskunnan kirjaston asiasanasto"
+wot	http://id.loc.gov/vocabulary/subjectSchemes/wot	A Women's thesaurus	
+noubomn	http://id.loc.gov/vocabulary/subjectSchemes/noubomn	University of Oslo Library Thesaurus of Science	"no"=>"University of Oslo Library Thesaurus of Science"
+idszbzzg	http://id.loc.gov/vocabulary/subjectSchemes/idszbzzg	Thesaurus IDS Nebis Zentralbibliothek Zürich, Graphische Sammlung	"de"=>"Thesaurus IDS Nebis Zentralbibliothek Zürich, Graphische Sammlung"
+precis	http://id.loc.gov/vocabulary/subjectSchemes/precis	PRECIS: a manual of concept analysis and subject indexing	
+cstud	http://id.loc.gov/vocabulary/subjectSchemes/cstud	Classificatieschema's Bibliotheek TU Delft	"nl"=>"Classificatieschema's Bibliotheek TU Delft"
+nlgkk	http://id.loc.gov/vocabulary/subjectSchemes/nlgkk	Katalogos kathierōmenōn onomatōn physikōn prosōpōn	"el"=>"Katalogos kathierōmenōn onomatōn physikōn prosōpōn"
+pmt	http://id.loc.gov/vocabulary/subjectSchemes/pmt	Project management terminology. Newtown Square, PA: Project Management Institute	
+ericd	http://id.loc.gov/vocabulary/subjectSchemes/ericd	Thesaurus of ERIC descriptors	
+rvm	http://id.loc.gov/vocabulary/subjectSchemes/rvm	Répertoire de vedettes-matière	"fr"=>"Répertoire de vedettes-matière"
+sfit	http://id.loc.gov/vocabulary/subjectSchemes/sfit	Svenska filminstitutets tesaurus	"sv"=>"Svenska filminstitutets tesaurus"
+trtsa	http://id.loc.gov/vocabulary/subjectSchemes/trtsa	Teatterin ja tanssin asiasanasto	"fi"=>"Teatterin ja tanssin asiasanasto"
+ulan	http://id.loc.gov/vocabulary/subjectSchemes/ulan	Union list of artist names	
+unescot	http://id.loc.gov/vocabulary/subjectSchemes/unescot	UNESCO thesaurus	"fr"=>"Thésaurus de l'UNESCO","es"=>"Tesauro de la UNESCO"
+koko	http://id.loc.gov/vocabulary/subjectSchemes/koko	KOKO-ontologia	"fi"=>"KOKO-ontologia"
+msh	http://id.loc.gov/vocabulary/subjectSchemes/msh	Trimboli, T., and Martyn S. Marianist subject headings	
+trt	http://id.loc.gov/vocabulary/subjectSchemes/trt	Transportation resource thesaurus	
+agrovocf	http://id.loc.gov/vocabulary/subjectSchemes/agrovocf	AGROVOC thésaurus agricole multilingue	"fr"=>"AGROVOC thésaurus agricole multilingue"
+aucsh	http://id.loc.gov/vocabulary/subjectSchemes/aucsh	Arabic Union Catalog Subject Headings	"ar"=>"Qâ'imat ru'ûs mawdû'ât al-fahras al-'Arabîyah al-mowahad"
+ddcri	http://id.loc.gov/vocabulary/subjectSchemes/ddcri	Dewey Decimal Classification Relative Index	
+est	http://id.loc.gov/vocabulary/subjectSchemes/est	International energy: subject thesaurus (: International Energy Agency, Energy Technology Data Exchange)	
+lua	http://id.loc.gov/vocabulary/subjectSchemes/lua	Liikunnan ja urheilun asiasanasto	"fi"=>"Liikunnan ja urheilun asiasanasto"
+mipfesd	http://id.loc.gov/vocabulary/subjectSchemes/mipfesd	Macrothesaurus for information processing in the field of economic and social development	
+rurkp	http://id.loc.gov/vocabulary/subjectSchemes/rurkp	Predmetnye rubriki Rossiiskoi knizhnoi palaty	"ru"=>"Predmetnye rubriki Rossiiskoi knizhnoi palaty"
+albt	http://id.loc.gov/vocabulary/subjectSchemes/albt	Arbetslivsbibliotekets tesaurus	"sv"=>"Arbetslivsbibliotekets tesaurus"
+fmesh	http://id.loc.gov/vocabulary/subjectSchemes/fmesh	Liste systématique et liste permutée des descripteurs français MeSH	"fr"=>"Liste systématique et liste permutée des descripteurs français MeSH"
+bicssc	http://id.loc.gov/vocabulary/subjectSchemes/bicssc	BIC standard subject categories	
+cctf	http://id.loc.gov/vocabulary/subjectSchemes/cctf	Carto-Canadiana thésaurus - Français	"fr"=>"Carto-Canadiana thésaurus - Français"
+reo	http://id.loc.gov/vocabulary/subjectSchemes/reo	Māori Subject Headings thesaurus	"mi"=>"Ngā Ūpoko Tukutuku"
+icpsr	http://id.loc.gov/vocabulary/subjectSchemes/icpsr	ICPSR controlled vocabulary system	
+kao	http://id.loc.gov/vocabulary/subjectSchemes/kao	KVINNSAM ämnesordsregister	"sv"=>"KVINNSAM ämnesordsregister"
+asrcseo	http://id.loc.gov/vocabulary/subjectSchemes/asrcseo	Australian Standard Research Classification: Socio-Economic Objective (SEO) classification	
+georeft	http://id.loc.gov/vocabulary/subjectSchemes/georeft	GeoRef thesaurus	
+cct	http://id.loc.gov/vocabulary/subjectSchemes/cct	Chinese Classified Thesaurus	"zh"=>"Zhong guo fen lei zhu ti ci biao"
+dcs	http://id.loc.gov/vocabulary/subjectSchemes/dcs	Health Sciences Descriptors	"es"=>"Descriptores en Ciencias de la Salud","pt"=>"Descritores em Ciências da Saúde"
+musa	http://id.loc.gov/vocabulary/subjectSchemes/musa	Musiikin asiasanasto: erikoissanasto	"fi"=>"Musiikin asiasanasto: erikoissanasto"
+ntissc	http://id.loc.gov/vocabulary/subjectSchemes/ntissc	NTIS subject categories	
+idszbz	http://id.loc.gov/vocabulary/subjectSchemes/idszbz	Thesaurus IDS Nebis Zentralbibliothek Zürich	"de"=>"Thesaurus IDS Nebis Zentralbibliothek Zürich"
+tlka	http://id.loc.gov/vocabulary/subjectSchemes/tlka	Investigació, Procés Tècnicn kirjaston asiasanasto	"fi"=>"Investigació, Procés Tècnicn kirjaston asiasanasto"
+usaidt	http://id.loc.gov/vocabulary/subjectSchemes/usaidt	USAID thesaurus: Keywords used to index documents included in the USAID Development Experience System.	
+embne	http://id.loc.gov/vocabulary/subjectSchemes/embne	Encabezamientos de Materia de la Biblioteca Nacional de España	"es"=>"Encabezamientos de Materia de la Biblioteca Nacional de España"
+vcaadu	http://id.loc.gov/vocabulary/subjectSchemes/vcaadu	Vocabulario controlado de arquitectura, arte, diseño y urbanismo	"es"=>"Vocabulario controlado de arquitectura, arte, diseño y urbanismo"
+ntcpsc	http://id.loc.gov/vocabulary/subjectSchemes/ntcpsc	"National Translations Center primary subject classification" in National Translations Center primary subject classification and secondary descriptors	
+quiding	http://id.loc.gov/vocabulary/subjectSchemes/quiding	Quiding, Nils Herman. Svenskt allmänt författningsregister för tiden från år 1522 till och med år 1862	"sv"=>"Quiding, Nils Herman. Svenskt allmänt författningsregister för tiden från år 1522 till och med år 1862"
+allars	http://id.loc.gov/vocabulary/subjectSchemes/allars	Allärs: allmän tesaurus pä svenska	"fi"=>"Allärs: allmän tesaurus pä svenska"
+ogst	http://id.loc.gov/vocabulary/subjectSchemes/ogst	Oregon GILS Subject Tree (Oregon: Oregon State Library and Oregon Information Resource Management Division (IRMD))	
+bella	http://id.loc.gov/vocabulary/subjectSchemes/bella	Bella: specialtesaurus för skönlitteratur	"fi"=>"Bella: specialtesaurus för skönlitteratur"
+bibalex	http://id.loc.gov/vocabulary/subjectSchemes/bibalex	Bibliotheca Alexandrina name and subject authority file	
+pepp	http://id.loc.gov/vocabulary/subjectSchemes/pepp	The Princeton encyclopedia of poetry and poetics	
+hkcan	http://id.loc.gov/vocabulary/subjectSchemes/hkcan	Hong Kong Chinese Authority File (Name) - HKCAN	
+dissao	http://id.loc.gov/vocabulary/subjectSchemes/dissao	"Dissertation abstracts online" in Search tools: the guide to UNI/Data Courier Online	
+ltcsh	http://id.loc.gov/vocabulary/subjectSchemes/ltcsh	Land Tenure Center Library list of subject headings	
+mpirdes	http://id.loc.gov/vocabulary/subjectSchemes/mpirdes	Macrothesaurus para el procesamiento de la información relativa al desarrollo económico y social	"es"=>"Macrothesaurus para el procesamiento de la información relativa al desarrollo económico y social"
+asft	http://id.loc.gov/vocabulary/subjectSchemes/asft	Aquatic sciences and fisheries thesaurus	
+naf	http://id.loc.gov/vocabulary/subjectSchemes/naf	NACO authority file	
+nimacsc	http://id.loc.gov/vocabulary/subjectSchemes/nimacsc	NIMA cartographic subject categories	
+khib	http://id.loc.gov/vocabulary/subjectSchemes/khib	Emneord, KHiB Biblioteket	"no"=>"Emneord, KHiB Biblioteket"
+cdcng	http://id.loc.gov/vocabulary/subjectSchemes/cdcng	Catalogage des documents cartographiques: forme et structure des vedettes noms géographiques - NF Z 44-081	"fr"=>"Catalogage des documents cartographiques: forme et structure des vedettes noms géographiques - NF Z 44-081"
+afset	http://id.loc.gov/vocabulary/subjectSchemes/afset	American Folklore Society Ethnographic Thesaurus	
+erfemn	http://id.loc.gov/vocabulary/subjectSchemes/erfemn	Erfaringskompetanses emneord	"no"=>"Erfaringskompetanses emneord"
+sbiao	http://id.loc.gov/vocabulary/subjectSchemes/sbiao	Svenska barnboksinstitutets ämnesordslista	"sv"=>"Svenska barnboksinstitutets ämnesordslista"
+socio	http://id.loc.gov/vocabulary/subjectSchemes/socio	Sociological Abstracts Thesaurus	
+bisacrt	http://id.loc.gov/vocabulary/subjectSchemes/bisacrt	BISAC Regional Themes	
+eum	http://id.loc.gov/vocabulary/subjectSchemes/eum	Eesti uldine märksonastik	"et"=>"Eesti uldine märksonastik"
+kula	http://id.loc.gov/vocabulary/subjectSchemes/kula	Kulttuurien tutkimuksen asiasanasto	"fi"=>"Kulttuurien tutkimuksen asiasanasto"
+odlt	http://id.loc.gov/vocabulary/subjectSchemes/odlt	Baldick, C. The Oxford dictionary of literary terms	
+rerovoc	http://id.loc.gov/vocabulary/subjectSchemes/rerovoc	Indexation matiéres RERO autoritès	"fr"=>"Indexation matiéres RERO autoritès"
+tsr	http://id.loc.gov/vocabulary/subjectSchemes/tsr	TSR-ontologia	"fi"=>"TSR-ontologia"
+czmesh	http://id.loc.gov/vocabulary/subjectSchemes/czmesh	Czech MeSH	"cs"=>"Czech MeSH"
+dltt	http://id.loc.gov/vocabulary/subjectSchemes/dltt	Quinn, E. A dictionary of literary and thematic terms	
+idsbb	http://id.loc.gov/vocabulary/subjectSchemes/idsbb	Thesaurus IDS Basel Bern	"de"=>"Thesaurus IDS Basel Bern"
+inist	http://id.loc.gov/vocabulary/subjectSchemes/inist	INIS: thesaurus	
+idszbzzk	http://id.loc.gov/vocabulary/subjectSchemes/idszbzzk	Thesaurus IDS Nebis Zentralbibliothek Zürich, Kartensammlung	"de"=>"Thesaurus IDS Nebis Zentralbibliothek Zürich, Kartensammlung"
+tesa	http://id.loc.gov/vocabulary/subjectSchemes/tesa	Tesauro Agrícola	"es"=>"Tesauro Agrícola"
+liv	http://id.loc.gov/vocabulary/subjectSchemes/liv	Legislative indexing vocabulary	
+collett	http://id.loc.gov/vocabulary/subjectSchemes/collett	Collett-bibliografi: litteratur av og om Camilla Collett	"no"=>"Collett-bibliografi: litteratur av og om Camilla Collett"
+nsbncf	http://id.loc.gov/vocabulary/subjectSchemes/nsbncf	Nuovo Soggettario	"it"=>"Nuovo Soggettario"
+ipat	http://id.loc.gov/vocabulary/subjectSchemes/ipat	IPA thesaurus and frequency list	
+skon	http://id.loc.gov/vocabulary/subjectSchemes/skon	Att indexera skönlitteratur: Ämnesordslista, vuxenlitteratur	"sv"=>"Att indexera skönlitteratur: Ämnesordslista, vuxenlitteratur"
+renib	http://id.loc.gov/vocabulary/subjectSchemes/renib	Renib	"es"=>"Renib"
+hrvmesh	http://id.loc.gov/vocabulary/subjectSchemes/hrvmesh	Croatian MeSH / Hrvatski MeSH	"no"=>"Croatian MeSH / Hrvatski MeSH"
+swd	http://id.loc.gov/vocabulary/subjectSchemes/swd	Schlagwortnormdatei	"de"=>"Schlagwortnormdatei"
+aass	http://id.loc.gov/vocabulary/subjectSchemes/aass	"Asian American Studies Library subject headings" in A Guide for establishing Asian American core collections	
+cht	http://id.loc.gov/vocabulary/subjectSchemes/cht	Chicano thesaurus for indexing Chicano materials in Chicano periodical index	
+galestne	http://id.loc.gov/vocabulary/subjectSchemes/galestne	Gale Group subject thesaurus and named entity vocabulary	
+nlgsh	http://id.loc.gov/vocabulary/subjectSchemes/nlgsh	Katalogos Hellēnikōn thematikōn epikephalidōn	"el"=>"Katalogos Hellēnikōn thematikōn epikephalidōn"
+hoidokki	http://id.loc.gov/vocabulary/subjectSchemes/hoidokki	Hoitotieteellinen asiasanasto	
+vffyl	http://id.loc.gov/vocabulary/subjectSchemes/vffyl	Vocabulario de la Biblioteca Central de la FFyL	"es"=>"Vocabulario de la Biblioteca Central de la FFyL"
+kubikat	http://id.loc.gov/vocabulary/subjectSchemes/kubikat	kubikat	"de"=>"kubikat"
+waqaf	http://id.loc.gov/vocabulary/subjectSchemes/waqaf	Maknas Uloom Al Waqaf	"ar"=>"Maknas Uloom Al Waqaf"
+hapi	http://id.loc.gov/vocabulary/subjectSchemes/hapi	HAPI thesaurus and name authority, 1970-2000	
+drama	http://id.loc.gov/vocabulary/subjectSchemes/drama	Drama: specialtesaurus för teater och dans	
+sosa	http://id.loc.gov/vocabulary/subjectSchemes/sosa	Sociaalialan asiasanasto	"fi"=>"Sociaalialan asiasanasto"
+ilpt	http://id.loc.gov/vocabulary/subjectSchemes/ilpt	Index to legal periodicals: thesaurus	
+nicem	http://id.loc.gov/vocabulary/subjectSchemes/nicem	NICEM subject headings and classification system	
+qlsp	http://id.loc.gov/vocabulary/subjectSchemes/qlsp	Queens Library Spanish language subject headings	
+eet	http://id.loc.gov/vocabulary/subjectSchemes/eet	European education thesaurus	
+nalnaf	http://id.loc.gov/vocabulary/subjectSchemes/nalnaf	National Agricultural Library name authority file	
+eclas	http://id.loc.gov/vocabulary/subjectSchemes/eclas	ECLAS thesaurus	
+agrovocs	http://id.loc.gov/vocabulary/subjectSchemes/agrovocs	AGROVOC tesauro agrícola multilingée	"es"=>"AGROVOC tesauro agrícola multilingée"
+shbe	http://id.loc.gov/vocabulary/subjectSchemes/shbe	Subject headings in business and economics	"sv"=>"Subject headings in business and economics"
+barn	http://id.loc.gov/vocabulary/subjectSchemes/barn	Svenska ämnesord för barn	"sv"=>"Svenska ämnesord för barn"
+bhammf	http://id.loc.gov/vocabulary/subjectSchemes/bhammf	BHA, Bibliographie d'histoire de l'art, mots-matière/français	"fr"=>"BHA, Bibliographie d'histoire de l'art, mots-matière/français"
+gccst	http://id.loc.gov/vocabulary/subjectSchemes/gccst	Government of Canada core subject thesaurus (Gatineau : Library and Archives Canada)	
+fnhl	http://id.loc.gov/vocabulary/subjectSchemes/fnhl	First Nations House of Learning Subject Headings	
+kauno	http://id.loc.gov/vocabulary/subjectSchemes/kauno	KAUNO - Kaunokki-ontologin	"fi"=>"KAUNO - Kaunokki-ontologin"
+dtict	http://id.loc.gov/vocabulary/subjectSchemes/dtict	Defense Technical Information Center thesaurus	
+mech	http://id.loc.gov/vocabulary/subjectSchemes/mech	Iskanje po zbirki MECH	"sl"=>"Iskanje po zbirki MECH"
+jupo	http://id.loc.gov/vocabulary/subjectSchemes/jupo	JUPO - Julkisen hallinnon palveluontologia	"fi"=>"JUPO - Julkisen hallinnon palveluontologia"
+ktpt	http://id.loc.gov/vocabulary/subjectSchemes/ktpt	Kirjasto- ja tietopalvelualan tesaurus	"fi"=>"Kirjasto- ja tietopalvelualan tesaurus"
+aiatsiss	http://id.loc.gov/vocabulary/subjectSchemes/aiatsiss	AIATSIS subject Thesaurus	
+lcac	http://id.loc.gov/vocabulary/subjectSchemes/lcac	Library of Congress Annotated Children's Cataloging Program subject headings	
+lemac	http://id.loc.gov/vocabulary/subjectSchemes/lemac	Llista d'encapçalaments de matèria en català	"ca"=>"Llista d'encapçalaments de matèria en català"
+lemb	http://id.loc.gov/vocabulary/subjectSchemes/lemb	Lista de encabezamientos de materia para bibliotecas	"es"=>"Lista de encabezamientos de materia para bibliotecas"
+henn	http://id.loc.gov/vocabulary/subjectSchemes/henn	Hennepin County Library cumulative authority list	
+mtirdes	http://id.loc.gov/vocabulary/subjectSchemes/mtirdes	Macrothésaurus pour le traitement de l'information relative au développement économique et social	"fr"=>"Macrothésaurus pour le traitement de l'information relative au développement économique et social"
+cash	http://id.loc.gov/vocabulary/subjectSchemes/cash	Canadian subject headings	
+nznb	http://id.loc.gov/vocabulary/subjectSchemes/nznb	New Zealand national bibliographic	
+prvt	http://id.loc.gov/vocabulary/subjectSchemes/prvt	Patent- och registreringsverkets tesaurus	"sv"=>"Patent- och registreringsverkets tesaurus"
+scgdst	http://id.loc.gov/vocabulary/subjectSchemes/scgdst	Subject categorization guide for defense science and technology	
+gem	http://id.loc.gov/vocabulary/subjectSchemes/gem	GEM controlled vocabularies	
+lcsh	http://id.loc.gov/vocabulary/subjectSchemes/lcsh	Library of Congress subject headings	
+rero	http://id.loc.gov/vocabulary/subjectSchemes/rero	Indexation matires RERO	"fr"=>"Indexation matires RERO"
+peri	http://id.loc.gov/vocabulary/subjectSchemes/peri	Perinnetieteiden asiasanasto	"fi"=>"Perinnetieteiden asiasanasto"
+shsples	http://id.loc.gov/vocabulary/subjectSchemes/shsples	Encabezamientos de materia para bibliotecas escolares y públicas	"es"=>"Encabezamientos de materia para bibliotecas escolares y públicas"
+slem	http://id.loc.gov/vocabulary/subjectSchemes/slem	Sears: lista de encabezamientos de materia	"es"=>"Sears: lista de encabezamientos de materia"
+afo	http://id.loc.gov/vocabulary/subjectSchemes/afo	AFO - Viikin kampuskirjaston ontologia	"fi"=>"AFO - Viikin kampuskirjaston ontologia"
+gst	http://id.loc.gov/vocabulary/subjectSchemes/gst	Gay studies thesaurus: a controlled vocabulary for indexing and accessing materials of relevance to gay culture, history, politics and psychology	
+hlasstg	http://id.loc.gov/vocabulary/subjectSchemes/hlasstg	HLAS subject term glossary	
+iest	http://id.loc.gov/vocabulary/subjectSchemes/iest	International energy: subject thesaurus	
+pkk	http://id.loc.gov/vocabulary/subjectSchemes/pkk	Predmetnik za katoliške knjižnice	"sl"=>"Predmetnik za katoliške knjižnice"
+atla	http://id.loc.gov/vocabulary/subjectSchemes/atla	Religion indexes: thesaurus	
+scot	http://id.loc.gov/vocabulary/subjectSchemes/scot	Schools Online Thesaurus (ScOT)	
+smda	http://id.loc.gov/vocabulary/subjectSchemes/smda	Smithsonian National Air and Space Museum Directory of Airplanes	
+solstad	http://id.loc.gov/vocabulary/subjectSchemes/solstad	Solstad: emneord for Solstadbibliografien	"no"=>"Solstad: emneord for Solstadbibliografien"
+abne	http://id.loc.gov/vocabulary/subjectSchemes/abne	Autoridades de la Biblioteca Nacional de España	"es"=>"Autoridades de la Biblioteca Nacional de España"
+spines	http://id.loc.gov/vocabulary/subjectSchemes/spines	Tesauro SPINES: un vocabulario controlado y estructurado para el tratamiento de información sobre ciencia y tecnología para el desarrollo	"es"=>"Tesauro SPINES: un vocabulario controlado y estructurado para el tratamiento de información sobre ciencia y tecnología para el desarrollo"
+ktta	http://id.loc.gov/vocabulary/subjectSchemes/ktta	Käsi - ja taideteollisuuden asiasanasto	"fi"=>"Käsi - ja taideteollisuuden asiasanasto"
+ccte	http://id.loc.gov/vocabulary/subjectSchemes/ccte	Carto-Canadiana thesaurus - English	
+pmcsg	http://id.loc.gov/vocabulary/subjectSchemes/pmcsg	Combined standards glossary	
+bisacsh	http://id.loc.gov/vocabulary/subjectSchemes/bisacsh	BISAC Subject Headings	
+fssh	http://id.loc.gov/vocabulary/subjectSchemes/fssh	FamilySearch Subject Headings (FamilySearch)	
+tasmas	http://id.loc.gov/vocabulary/subjectSchemes/tasmas	Tesaurus de Asuntos Sociales del Ministerio de Asuntos Sociales de España	"es"=>"Tesaurus de Asuntos Sociales del Ministerio de Asuntos Sociales de España"
+tero	http://id.loc.gov/vocabulary/subjectSchemes/tero	TERO - Terveyden ja hyvinvoinnin ontologia	"fi"=>"TERO - Terveyden ja hyvinvoinnin ontologia"
+rma	http://id.loc.gov/vocabulary/subjectSchemes/rma	Ru'us al-mawdu'at al-'Arabiyah	"ar"=>"Ru'us al-mawdu'at al-'Arabiyah"
+tgn	http://id.loc.gov/vocabulary/subjectSchemes/tgn	Getty thesaurus of geographic names	
+tha	http://id.loc.gov/vocabulary/subjectSchemes/tha	Barcala de Moyano, Graciela G., Cristina Voena. Tesauro de Historia Argentina	"es"=>"Barcala de Moyano, Graciela G., Cristina Voena. Tesauro de Historia Argentina"
+ttll	http://id.loc.gov/vocabulary/subjectSchemes/ttll	Roggau, Zunilda. Tell. Tesauro de lengua y literatura	"es"=>"Roggau, Zunilda. Tell. Tesauro de lengua y literatura"
+sears	http://id.loc.gov/vocabulary/subjectSchemes/sears	Sears list of subject headings	
+csht	http://id.loc.gov/vocabulary/subjectSchemes/csht	Chinese subject headings	
+\.
+
+-- ' ...blah
+
+INSERT INTO authority.thesaurus (code, uri, name, control_set)
+  SELECT code, uri, name, 1 FROM thesauri;
+
+UPDATE authority.thesaurus SET short_code = 'a' WHERE code = 'lcsh';
+UPDATE authority.thesaurus SET short_code = 'b' WHERE code = 'lcshac';
+UPDATE authority.thesaurus SET short_code = 'c' WHERE code = 'mesh';
+UPDATE authority.thesaurus SET short_code = 'd' WHERE code = 'nal';
+UPDATE authority.thesaurus SET short_code = 'k' WHERE code = 'cash';
+UPDATE authority.thesaurus SET short_code = 'r' WHERE code = 'aat';
+UPDATE authority.thesaurus SET short_code = 's' WHERE code = 'sears';
+UPDATE authority.thesaurus SET short_code = 'v' WHERE code = 'rvm';
+
+UPDATE  authority.thesaurus
+  SET   short_code = 'z'
+  WHERE short_code IS NULL
+        AND control_set = 1;
+
+INSERT INTO config.i18n_core (fq_field, identity_value, translation, string )
+  SELECT  'at.name', t.code, xlate->key, xlate->value
+    FROM  thesauri t
+          JOIN LATERAL each(t.xlate) AS xlate ON TRUE
+    WHERE NOT EXISTS
+            (SELECT id
+              FROM  config.i18n_core
+              WHERE fq_field = 'at.name'
+                    AND identity_value = t.code
+                    AND translation = xlate->key)
+          AND t.xlate IS NOT NULL
+          AND t.name <> (xlate->value);
+
+CREATE OR REPLACE FUNCTION authority.extract_thesaurus( marcxml TEXT ) RETURNS TEXT AS $func$
+DECLARE
+    thes_code TEXT;
+BEGIN
+    thes_code := vandelay.marc21_extract_fixed_field(marcxml,'Subj');
+    IF thes_code IS NULL THEN
+        thes_code := '|';
+    ELSIF thes_code = 'z' THEN
+        thes_code := COALESCE( oils_xpath_string('//*[@tag="040"]/*[@code="f"][1]', marcxml), 'z' );
+    ELSE
+        SELECT code INTO thes_code FROM authority.thesaurus WHERE short_code = thes_code;
+        IF NOT FOUND THEN
+            thes_code := '|'; -- default
+        END IF;
+    END IF;
+    RETURN thes_code;
+END;
+$func$ LANGUAGE PLPGSQL STABLE STRICT;
+
+CREATE OR REPLACE FUNCTION authority.map_thesaurus_to_control_set () RETURNS TRIGGER AS $func$
+BEGIN
+    IF NEW.control_set IS NULL THEN
+        SELECT control_set INTO NEW.control_set
+        FROM authority.thesaurus
+        WHERE code = authority.extract_thesaurus(NEW.marc);
+    END IF;
+
+    RETURN NEW;
+END;
+$func$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION authority.reingest_authority_rec_descriptor( auth_id BIGINT ) RETURNS VOID AS $func$
+BEGIN
+    DELETE FROM authority.rec_descriptor WHERE record = auth_id;
+    INSERT INTO authority.rec_descriptor (record, record_status, encoding_level, thesaurus)
+        SELECT  auth_id,
+                vandelay.marc21_extract_fixed_field(marc,'RecStat'),
+                vandelay.marc21_extract_fixed_field(marc,'ELvl'),
+                authority.extract_thesaurus(marc)
+          FROM  authority.record_entry
+          WHERE id = auth_id;
+    RETURN;
+END;
+$func$ LANGUAGE PLPGSQL;
+
+
+
+SELECT evergreen.upgrade_deps_block_check('1071', :eg_version); --gmcharlt/kmlussier
+
+CREATE OR REPLACE FUNCTION metabib.staged_browse(query text, fields integer[], context_org integer, context_locations integer[], staff boolean, browse_superpage_size integer, count_up_from_zero boolean, result_limit integer, next_pivot_pos integer)
+ RETURNS SETOF metabib.flat_browse_entry_appearance
+AS $f$
+DECLARE
+    curs                    REFCURSOR;
+    rec                     RECORD;
+    qpfts_query             TEXT;
+    aqpfts_query            TEXT;
+    afields                 INT[];
+    bfields                 INT[];
+    result_row              metabib.flat_browse_entry_appearance%ROWTYPE;
+    results_skipped         INT := 0;
+    row_counter             INT := 0;
+    row_number              INT;
+    slice_start             INT;
+    slice_end               INT;
+    full_end                INT;
+    all_records             BIGINT[];
+    all_brecords             BIGINT[];
+    all_arecords            BIGINT[];
+    superpage_of_records    BIGINT[];
+    superpage_size          INT;
+    c_tests                 TEXT := '';
+    b_tests                 TEXT := '';
+    c_orgs                  INT[];
+    unauthorized_entry      RECORD;
+BEGIN
+    IF count_up_from_zero THEN
+        row_number := 0;
+    ELSE
+        row_number := -1;
+    END IF;
+
+    IF NOT staff THEN
+        SELECT x.c_attrs, x.b_attrs INTO c_tests, b_tests FROM asset.patron_default_visibility_mask() x;
+    END IF;
+
+    IF c_tests <> '' THEN c_tests := c_tests || '&'; END IF;
+    IF b_tests <> '' THEN b_tests := b_tests || '&'; END IF;
+
+    SELECT ARRAY_AGG(id) INTO c_orgs FROM actor.org_unit_descendants(context_org);
+
+    c_tests := c_tests || search.calculate_visibility_attribute_test('circ_lib',c_orgs)
+               || '&' || search.calculate_visibility_attribute_test('owning_lib',c_orgs);
+
+    PERFORM 1 FROM config.internal_flag WHERE enabled AND name = 'opac.located_uri.act_as_copy';
+    IF FOUND THEN
+        b_tests := b_tests || search.calculate_visibility_attribute_test(
+            'luri_org',
+            (SELECT ARRAY_AGG(id) FROM actor.org_unit_full_path(context_org) x)
+        );
+    ELSE
+        b_tests := b_tests || search.calculate_visibility_attribute_test(
+            'luri_org',
+            (SELECT ARRAY_AGG(id) FROM actor.org_unit_ancestors(context_org) x)
+        );
+    END IF;
+
+    IF context_locations THEN
+        IF c_tests <> '' THEN c_tests := c_tests || '&'; END IF;
+        c_tests := c_tests || search.calculate_visibility_attribute_test('location',context_locations);
+    END IF;
+
+    OPEN curs NO SCROLL FOR EXECUTE query;
+
+    LOOP
+        FETCH curs INTO rec;
+        IF NOT FOUND THEN
+            IF result_row.pivot_point IS NOT NULL THEN
+                RETURN NEXT result_row;
+            END IF;
+            RETURN;
+        END IF;
+
+        --Is unauthorized?
+        SELECT INTO unauthorized_entry *
+        FROM metabib.browse_entry_simple_heading_map mbeshm
+        INNER JOIN authority.simple_heading ash ON ( mbeshm.simple_heading = ash.id )
+        INNER JOIN authority.control_set_authority_field acsaf ON ( acsaf.id = ash.atag )
+        JOIN authority.heading_field ahf ON (ahf.id = acsaf.heading_field)
+        WHERE mbeshm.entry = rec.id
+        AND   ahf.heading_purpose = 'variant';
+
+        -- Gather aggregate data based on the MBE row we're looking at now, authority axis
+        IF (unauthorized_entry.record IS NOT NULL) THEN
+            --unauthorized term belongs to an auth linked to a bib?
+            SELECT INTO all_arecords, result_row.sees, afields
+                    ARRAY_AGG(DISTINCT abl.bib),
+                    STRING_AGG(DISTINCT abl.authority::TEXT, $$,$$),
+                    ARRAY_AGG(DISTINCT map.metabib_field)
+            FROM authority.bib_linking abl
+            INNER JOIN authority.control_set_auth_field_metabib_field_map_refs map ON (
+                    map.authority_field = unauthorized_entry.atag
+                    AND map.metabib_field = ANY(fields)
+            )
+            WHERE abl.authority = unauthorized_entry.record;
+        ELSE
+            --do usual procedure
+            SELECT INTO all_arecords, result_row.sees, afields
+                    ARRAY_AGG(DISTINCT abl.bib), -- bibs to check for visibility
+                    STRING_AGG(DISTINCT aal.source::TEXT, $$,$$), -- authority record ids
+                    ARRAY_AGG(DISTINCT map.metabib_field) -- authority-tag-linked CMF rows
+
+            FROM  metabib.browse_entry_simple_heading_map mbeshm
+                    JOIN authority.simple_heading ash ON ( mbeshm.simple_heading = ash.id )
+                    JOIN authority.authority_linking aal ON ( ash.record = aal.source )
+                    JOIN authority.bib_linking abl ON ( aal.target = abl.authority )
+                    JOIN authority.control_set_auth_field_metabib_field_map_refs map ON (
+                        ash.atag = map.authority_field
+                        AND map.metabib_field = ANY(fields)
+                    )
+                    JOIN authority.control_set_authority_field acsaf ON (
+                        map.authority_field = acsaf.id
+                    )
+                    JOIN authority.heading_field ahf ON (ahf.id = acsaf.heading_field)
+              WHERE mbeshm.entry = rec.id
+              AND   ahf.heading_purpose = 'variant';
+
+        END IF;
+
+        -- Gather aggregate data based on the MBE row we're looking at now, bib axis
+        SELECT INTO all_brecords, result_row.authorities, bfields
+                ARRAY_AGG(DISTINCT source),
+                STRING_AGG(DISTINCT authority::TEXT, $$,$$),
+                ARRAY_AGG(DISTINCT def)
+          FROM  metabib.browse_entry_def_map
+          WHERE entry = rec.id
+                AND def = ANY(fields);
+
+        SELECT INTO result_row.fields STRING_AGG(DISTINCT x::TEXT, $$,$$) FROM UNNEST(afields || bfields) x;
+
+        result_row.sources := 0;
+        result_row.asources := 0;
+
+        -- Bib-linked vis checking
+        IF ARRAY_UPPER(all_brecords,1) IS NOT NULL THEN
+
+            SELECT  INTO result_row.sources COUNT(DISTINCT b.id)
+              FROM  biblio.record_entry b
+                    JOIN asset.copy_vis_attr_cache acvac ON (acvac.record = b.id)
+              WHERE b.id = ANY(all_brecords[1:browse_superpage_size])
+                    AND (
+                        acvac.vis_attr_vector @@ c_tests::query_int
+                        OR b.vis_attr_vector @@ b_tests::query_int
+                    );
+
+            result_row.accurate := TRUE;
+
+        END IF;
+
+        -- Authority-linked vis checking
+        IF ARRAY_UPPER(all_arecords,1) IS NOT NULL THEN
+
+            SELECT  INTO result_row.asources COUNT(DISTINCT b.id)
+              FROM  biblio.record_entry b
+                    JOIN asset.copy_vis_attr_cache acvac ON (acvac.record = b.id)
+              WHERE b.id = ANY(all_arecords[1:browse_superpage_size])
+                    AND (
+                        acvac.vis_attr_vector @@ c_tests::query_int
+                        OR b.vis_attr_vector @@ b_tests::query_int
+                    );
+
+            result_row.aaccurate := TRUE;
+
+        END IF;
+
+        IF result_row.sources > 0 OR result_row.asources > 0 THEN
+
+            -- The function that calls this function needs row_number in order
+            -- to correctly order results from two different runs of this
+            -- functions.
+            result_row.row_number := row_number;
+
+            -- Now, if row_counter is still less than limit, return a row.  If
+            -- not, but it is less than next_pivot_pos, continue on without
+            -- returning actual result rows until we find
+            -- that next pivot, and return it.
+
+            IF row_counter < result_limit THEN
+                result_row.browse_entry := rec.id;
+                result_row.value := rec.value;
+
+                RETURN NEXT result_row;
+            ELSE
+                result_row.browse_entry := NULL;
+                result_row.authorities := NULL;
+                result_row.fields := NULL;
+                result_row.value := NULL;
+                result_row.sources := NULL;
+                result_row.sees := NULL;
+                result_row.accurate := NULL;
+                result_row.aaccurate := NULL;
+                result_row.pivot_point := rec.id;
+
+                IF row_counter >= next_pivot_pos THEN
+                    RETURN NEXT result_row;
+                    RETURN;
+                END IF;
+            END IF;
+
+            IF count_up_from_zero THEN
+                row_number := row_number + 1;
+            ELSE
+                row_number := row_number - 1;
+            END IF;
+
+            -- row_counter is different from row_number.
+            -- It simply counts up from zero so that we know when
+            -- we've reached our limit.
+            row_counter := row_counter + 1;
+        END IF;
+    END LOOP;
+END;
+$f$ LANGUAGE plpgsql ROWS 10;
+
+CREATE OR REPLACE FUNCTION metabib.browse(search_field integer[], browse_term text, context_org integer DEFAULT NULL::integer, context_loc_group integer DEFAULT NULL::integer, staff boolean DEFAULT false, pivot_id bigint DEFAULT NULL::bigint, result_limit integer DEFAULT 10)
+ RETURNS SETOF metabib.flat_browse_entry_appearance
+AS $f$
+DECLARE
+    core_query              TEXT;
+    back_query              TEXT;
+    forward_query           TEXT;
+    pivot_sort_value        TEXT;
+    pivot_sort_fallback     TEXT;
+    context_locations       INT[];
+    browse_superpage_size   INT;
+    results_skipped         INT := 0;
+    back_limit              INT;
+    back_to_pivot           INT;
+    forward_limit           INT;
+    forward_to_pivot        INT;
+BEGIN
+    -- First, find the pivot if we were given a browse term but not a pivot.
+    IF pivot_id IS NULL THEN
+        pivot_id := metabib.browse_pivot(search_field, browse_term);
+    END IF;
+
+    SELECT INTO pivot_sort_value, pivot_sort_fallback
+        sort_value, value FROM metabib.browse_entry WHERE id = pivot_id;
+
+    -- Bail if we couldn't find a pivot.
+    IF pivot_sort_value IS NULL THEN
+        RETURN;
+    END IF;
+
+    -- Transform the context_loc_group argument (if any) (logc at the
+    -- TPAC layer) into a form we'll be able to use.
+    IF context_loc_group IS NOT NULL THEN
+        SELECT INTO context_locations ARRAY_AGG(location)
+            FROM asset.copy_location_group_map
+            WHERE lgroup = context_loc_group;
+    END IF;
+
+    -- Get the configured size of browse superpages.
+    SELECT INTO browse_superpage_size COALESCE(value::INT,100)     -- NULL ok
+        FROM config.global_flag
+        WHERE enabled AND name = 'opac.browse.holdings_visibility_test_limit';
+
+    -- First we're going to search backward from the pivot, then we're going
+    -- to search forward.  In each direction, we need two limits.  At the
+    -- lesser of the two limits, we delineate the edge of the result set
+    -- we're going to return.  At the greater of the two limits, we find the
+    -- pivot value that would represent an offset from the current pivot
+    -- at a distance of one "page" in either direction, where a "page" is a
+    -- result set of the size specified in the "result_limit" argument.
+    --
+    -- The two limits in each direction make four derived values in total,
+    -- and we calculate them now.
+    back_limit := CEIL(result_limit::FLOAT / 2);
+    back_to_pivot := result_limit;
+    forward_limit := result_limit / 2;
+    forward_to_pivot := result_limit - 1;
+
+    -- This is the meat of the SQL query that finds browse entries.  We'll
+    -- pass this to a function which uses it with a cursor, so that individual
+    -- rows may be fetched in a loop until some condition is satisfied, without
+    -- waiting for a result set of fixed size to be collected all at once.
+    core_query := '
+SELECT  mbe.id,
+        mbe.value,
+        mbe.sort_value
+  FROM  metabib.browse_entry mbe
+  WHERE (
+            EXISTS ( -- are there any bibs using this mbe via the requested fields?
+                SELECT  1
+                  FROM  metabib.browse_entry_def_map mbedm
+                  WHERE mbedm.entry = mbe.id AND mbedm.def = ANY(' || quote_literal(search_field) || ')
+            ) OR EXISTS ( -- are there any authorities using this mbe via the requested fields?
+                SELECT  1
+                  FROM  metabib.browse_entry_simple_heading_map mbeshm
+                        JOIN authority.simple_heading ash ON ( mbeshm.simple_heading = ash.id )
+                        JOIN authority.control_set_auth_field_metabib_field_map_refs map ON (
+                            ash.atag = map.authority_field
+                            AND map.metabib_field = ANY(' || quote_literal(search_field) || ')
+                        )
+                        JOIN authority.control_set_authority_field acsaf ON (
+                            map.authority_field = acsaf.id
+                        )
+                        JOIN authority.heading_field ahf ON (ahf.id = acsaf.heading_field)
+                  WHERE mbeshm.entry = mbe.id
+                    AND ahf.heading_purpose IN (' || $$'variant'$$ || ')
+                    -- and authority that variant is coming from is linked to a bib
+                    AND EXISTS (
+                        SELECT  1
+                        FROM  metabib.browse_entry_def_map mbedm2
+                        WHERE mbedm2.authority = ash.record AND mbedm2.def = ANY(' || quote_literal(search_field) || ')
+                    )
+            )
+        ) AND ';
+
+    -- This is the variant of the query for browsing backward.
+    back_query := core_query ||
+        ' mbe.sort_value <= ' || quote_literal(pivot_sort_value) ||
+    ' ORDER BY mbe.sort_value DESC, mbe.value DESC LIMIT 1000';
+
+    -- This variant browses forward.
+    forward_query := core_query ||
+        ' mbe.sort_value > ' || quote_literal(pivot_sort_value) ||
+    ' ORDER BY mbe.sort_value, mbe.value LIMIT 1000';
+
+    -- We now call the function which applies a cursor to the provided
+    -- queries, stopping at the appropriate limits and also giving us
+    -- the next page's pivot.
+    RETURN QUERY
+        SELECT * FROM metabib.staged_browse(
+            back_query, search_field, context_org, context_locations,
+            staff, browse_superpage_size, TRUE, back_limit, back_to_pivot
+        ) UNION
+        SELECT * FROM metabib.staged_browse(
+            forward_query, search_field, context_org, context_locations,
+            staff, browse_superpage_size, FALSE, forward_limit, forward_to_pivot
+        ) ORDER BY row_number DESC;
+
+END;
+$f$ LANGUAGE plpgsql ROWS 10;
+
+
+SELECT evergreen.upgrade_deps_block_check('1072', :eg_version); --gmcharlt/kmlussier
+
+INSERT INTO config.global_flag (name, label, enabled) VALUES (
+    'opac.show_related_headings_in_browse',
+    oils_i18n_gettext(
+        'opac.show_related_headings_in_browse',
+        'Display related headings (see-also) in browse',
+        'cgf',
+        'label'
+    ),
+    TRUE
+);
+
+
+
+SELECT evergreen.upgrade_deps_block_check('1073', :eg_version);
+
+ALTER TABLE config.metabib_field 
+    ADD COLUMN display_xpath TEXT, 
+    ADD COLUMN display_field BOOL NOT NULL DEFAULT FALSE;
+
+CREATE TABLE config.display_field_map (
+    name    TEXT   PRIMARY KEY,
+    field   INTEGER REFERENCES config.metabib_field (id),
+    multi   BOOLEAN DEFAULT FALSE
+);
+
+CREATE TABLE metabib.display_entry (
+    id      BIGSERIAL  PRIMARY KEY,
+    source  BIGINT     NOT NULL REFERENCES biblio.record_entry (id),
+    field   INT        NOT NULL REFERENCES config.metabib_field (id),
+    value   TEXT       NOT NULL
+);
+
+CREATE INDEX metabib_display_entry_field_idx ON metabib.display_entry (field);
+CREATE INDEX metabib_display_entry_source_idx ON metabib.display_entry (source);
+
+-- one row per display entry fleshed with field info
+CREATE VIEW metabib.flat_display_entry AS
+    SELECT
+        mde.source,
+        cdfm.name,
+        cdfm.multi,
+        cmf.label,
+        cmf.id AS field,
+        mde.value
+    FROM metabib.display_entry mde
+    JOIN config.metabib_field cmf ON (cmf.id = mde.field)
+    JOIN config.display_field_map cdfm ON (cdfm.field = mde.field)
+;
+
+-- like flat_display_entry except values are compressed 
+-- into one row per display_field_map and JSON-ified.
+CREATE VIEW metabib.compressed_display_entry AS
+    SELECT 
+        source,
+        name,
+        multi,
+        label,
+        field,
+        CASE WHEN multi THEN
+            TO_JSON(ARRAY_AGG(value))
+        ELSE
+            TO_JSON(MIN(value))
+        END AS value
+    FROM metabib.flat_display_entry
+    GROUP BY 1, 2, 3, 4, 5
+;
+
+-- TODO: expand to encompass all well-known fields
+CREATE VIEW metabib.wide_display_entry AS
+    SELECT 
+        bre.id AS source,
+        COALESCE(mcde_title.value, 'null') AS title,
+        COALESCE(mcde_author.value, 'null') AS author,
+        COALESCE(mcde_subject.value, 'null') AS subject,
+        COALESCE(mcde_creators.value, 'null') AS creators,
+        COALESCE(mcde_isbn.value, 'null') AS isbn
+    -- ensure one row per bre regardless of any display fields
+    FROM biblio.record_entry bre 
+    LEFT JOIN metabib.compressed_display_entry mcde_title 
+        ON (bre.id = mcde_title.source AND mcde_title.name = 'title')
+    LEFT JOIN metabib.compressed_display_entry mcde_author 
+        ON (bre.id = mcde_author.source AND mcde_author.name = 'author')
+    LEFT JOIN metabib.compressed_display_entry mcde_subject 
+        ON (bre.id = mcde_subject.source AND mcde_subject.name = 'subject')
+    LEFT JOIN metabib.compressed_display_entry mcde_creators 
+        ON (bre.id = mcde_creators.source AND mcde_creators.name = 'creators')
+    LEFT JOIN metabib.compressed_display_entry mcde_isbn 
+        ON (bre.id = mcde_isbn.source AND mcde_isbn.name = 'isbn')
+;
+
+
+CREATE OR REPLACE FUNCTION metabib.display_field_normalize_trigger () 
+    RETURNS TRIGGER AS $$
+DECLARE
+    normalizer  RECORD;
+    display_field_text  TEXT;
+BEGIN
+    display_field_text := NEW.value;
+
+    FOR normalizer IN
+        SELECT  n.func AS func,
+                n.param_count AS param_count,
+                m.params AS params
+          FROM  config.index_normalizer n
+                JOIN config.metabib_field_index_norm_map m ON (m.norm = n.id)
+          WHERE m.field = NEW.field AND m.pos < 0
+          ORDER BY m.pos LOOP
+
+            EXECUTE 'SELECT ' || normalizer.func || '(' ||
+                quote_literal( display_field_text ) ||
+                CASE
+                    WHEN normalizer.param_count > 0
+                        THEN ',' || REPLACE(REPLACE(BTRIM(
+                            normalizer.params,'[]'),E'\'',E'\\\''),E'"',E'\'')
+                        ELSE ''
+                    END ||
+                ')' INTO display_field_text;
+
+    END LOOP;
+
+    NEW.value = display_field_text;
+
+    RETURN NEW;
+END;
+$$ LANGUAGE PLPGSQL;
+
+CREATE TRIGGER display_field_normalize_tgr
+	BEFORE UPDATE OR INSERT ON metabib.display_entry
+	FOR EACH ROW EXECUTE PROCEDURE metabib.display_field_normalize_trigger();
+
+CREATE OR REPLACE FUNCTION evergreen.display_field_force_nfc() 
+    RETURNS TRIGGER AS $$
+BEGIN
+    NEW.value := force_unicode_normal_form(NEW.value,'NFC');
+    RETURN NEW;
+END;
+$$ LANGUAGE PLPGSQL;
+
+CREATE TRIGGER display_field_force_nfc_tgr
+	BEFORE UPDATE OR INSERT ON metabib.display_entry
+	FOR EACH ROW EXECUTE PROCEDURE evergreen.display_field_force_nfc();
+
+ALTER TYPE metabib.field_entry_template ADD ATTRIBUTE display_field BOOL;
+
+DROP FUNCTION metabib.reingest_metabib_field_entries(BIGINT, BOOL, BOOL, BOOL);
+DROP FUNCTION biblio.extract_metabib_field_entry(BIGINT);
+DROP FUNCTION biblio.extract_metabib_field_entry(BIGINT, TEXT);
+
+CREATE OR REPLACE FUNCTION biblio.extract_metabib_field_entry (
+    rid BIGINT,
+    default_joiner TEXT,
+    field_types TEXT[],
+    only_fields INT[]
+) RETURNS SETOF metabib.field_entry_template AS $func$
+DECLARE
+    bib     biblio.record_entry%ROWTYPE;
+    idx     config.metabib_field%ROWTYPE;
+    xfrm        config.xml_transform%ROWTYPE;
+    prev_xfrm   TEXT;
+    transformed_xml TEXT;
+    xml_node    TEXT;
+    xml_node_list   TEXT[];
+    facet_text  TEXT;
+    display_text TEXT;
+    browse_text TEXT;
+    sort_value  TEXT;
+    raw_text    TEXT;
+    curr_text   TEXT;
+    joiner      TEXT := default_joiner; -- XXX will index defs supply a joiner?
+    authority_text TEXT;
+    authority_link BIGINT;
+    output_row  metabib.field_entry_template%ROWTYPE;
+    process_idx BOOL;
+BEGIN
+
+    -- Start out with no field-use bools set
+    output_row.browse_field = FALSE;
+    output_row.facet_field = FALSE;
+    output_row.display_field = FALSE;
+    output_row.search_field = FALSE;
+
+    -- Get the record
+    SELECT INTO bib * FROM biblio.record_entry WHERE id = rid;
+
+    -- Loop over the indexing entries
+    FOR idx IN SELECT * FROM config.metabib_field WHERE id = ANY (only_fields) ORDER BY format LOOP
+
+        process_idx := FALSE;
+        IF idx.display_field AND 'display' = ANY (field_types) THEN process_idx = TRUE; END IF;
+        IF idx.browse_field AND 'browse' = ANY (field_types) THEN process_idx = TRUE; END IF;
+        IF idx.search_field AND 'search' = ANY (field_types) THEN process_idx = TRUE; END IF;
+        IF idx.facet_field AND 'facet' = ANY (field_types) THEN process_idx = TRUE; END IF;
+        CONTINUE WHEN process_idx = FALSE;
+
+        joiner := COALESCE(idx.joiner, default_joiner);
+
+        SELECT INTO xfrm * from config.xml_transform WHERE name = idx.format;
+
+        -- See if we can skip the XSLT ... it's expensive
+        IF prev_xfrm IS NULL OR prev_xfrm <> xfrm.name THEN
+            -- Can't skip the transform
+            IF xfrm.xslt <> '---' THEN
+                transformed_xml := oils_xslt_process(bib.marc,xfrm.xslt);
+            ELSE
+                transformed_xml := bib.marc;
+            END IF;
+
+            prev_xfrm := xfrm.name;
+        END IF;
+
+        xml_node_list := oils_xpath( idx.xpath, transformed_xml, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
+
+        raw_text := NULL;
+        FOR xml_node IN SELECT x FROM unnest(xml_node_list) AS x LOOP
+            CONTINUE WHEN xml_node !~ E'^\\s*<';
+
+            -- XXX much of this should be moved into oils_xpath_string...
+            curr_text := ARRAY_TO_STRING(evergreen.array_remove_item_by_value(evergreen.array_remove_item_by_value(
+                oils_xpath( '//text()', -- get the content of all the nodes within the main selected node
+                    REGEXP_REPLACE( xml_node, E'\\s+', ' ', 'g' ) -- Translate adjacent whitespace to a single space
+                ), ' '), ''),  -- throw away morally empty (bankrupt?) strings
+                joiner
+            );
+
+            CONTINUE WHEN curr_text IS NULL OR curr_text = '';
+
+            IF raw_text IS NOT NULL THEN
+                raw_text := raw_text || joiner;
+            END IF;
+
+            raw_text := COALESCE(raw_text,'') || curr_text;
+
+            -- autosuggest/metabib.browse_entry
+            IF idx.browse_field THEN
+
+                IF idx.browse_xpath IS NOT NULL AND idx.browse_xpath <> '' THEN
+                    browse_text := oils_xpath_string( idx.browse_xpath, xml_node, joiner, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
+                ELSE
+                    browse_text := curr_text;
+                END IF;
+
+                IF idx.browse_sort_xpath IS NOT NULL AND
+                    idx.browse_sort_xpath <> '' THEN
+
+                    sort_value := oils_xpath_string(
+                        idx.browse_sort_xpath, xml_node, joiner,
+                        ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]]
+                    );
+                ELSE
+                    sort_value := browse_text;
+                END IF;
+
+                output_row.field_class = idx.field_class;
+                output_row.field = idx.id;
+                output_row.source = rid;
+                output_row.value = BTRIM(REGEXP_REPLACE(browse_text, E'\\s+', ' ', 'g'));
+                output_row.sort_value :=
+                    public.naco_normalize(sort_value);
+
+                output_row.authority := NULL;
+
+                IF idx.authority_xpath IS NOT NULL AND idx.authority_xpath <> '' THEN
+                    authority_text := oils_xpath_string(
+                        idx.authority_xpath, xml_node, joiner,
+                        ARRAY[
+                            ARRAY[xfrm.prefix, xfrm.namespace_uri],
+                            ARRAY['xlink','http://www.w3.org/1999/xlink']
+                        ]
+                    );
+
+                    IF authority_text ~ '^\d+$' THEN
+                        authority_link := authority_text::BIGINT;
+                        PERFORM * FROM authority.record_entry WHERE id = authority_link;
+                        IF FOUND THEN
+                            output_row.authority := authority_link;
+                        END IF;
+                    END IF;
+
+                END IF;
+
+                output_row.browse_field = TRUE;
+                -- Returning browse rows with search_field = true for search+browse
+                -- configs allows us to retain granularity of being able to search
+                -- browse fields with "starts with" type operators (for example, for
+                -- titles of songs in music albums)
+                IF idx.search_field THEN
+                    output_row.search_field = TRUE;
+                END IF;
+                RETURN NEXT output_row;
+                output_row.browse_field = FALSE;
+                output_row.search_field = FALSE;
+                output_row.sort_value := NULL;
+            END IF;
+
+            -- insert raw node text for faceting
+            IF idx.facet_field THEN
+
+                IF idx.facet_xpath IS NOT NULL AND idx.facet_xpath <> '' THEN
+                    facet_text := oils_xpath_string( idx.facet_xpath, xml_node, joiner, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
+                ELSE
+                    facet_text := curr_text;
+                END IF;
+
+                output_row.field_class = idx.field_class;
+                output_row.field = -1 * idx.id;
+                output_row.source = rid;
+                output_row.value = BTRIM(REGEXP_REPLACE(facet_text, E'\\s+', ' ', 'g'));
+
+                output_row.facet_field = TRUE;
+                RETURN NEXT output_row;
+                output_row.facet_field = FALSE;
+            END IF;
+
+            -- insert raw node text for display
+            IF idx.display_field THEN
+
+                IF idx.display_xpath IS NOT NULL AND idx.display_xpath <> '' THEN
+                    display_text := oils_xpath_string( idx.display_xpath, xml_node, joiner, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
+                ELSE
+                    display_text := curr_text;
+                END IF;
+
+                output_row.field_class = idx.field_class;
+                output_row.field = -1 * idx.id;
+                output_row.source = rid;
+                output_row.value = BTRIM(REGEXP_REPLACE(display_text, E'\\s+', ' ', 'g'));
+
+                output_row.display_field = TRUE;
+                RETURN NEXT output_row;
+                output_row.display_field = FALSE;
+            END IF;
+
+        END LOOP;
+
+        CONTINUE WHEN raw_text IS NULL OR raw_text = '';
+
+        -- insert combined node text for searching
+        IF idx.search_field THEN
+            output_row.field_class = idx.field_class;
+            output_row.field = idx.id;
+            output_row.source = rid;
+            output_row.value = BTRIM(REGEXP_REPLACE(raw_text, E'\\s+', ' ', 'g'));
+
+            output_row.search_field = TRUE;
+            RETURN NEXT output_row;
+            output_row.search_field = FALSE;
+        END IF;
+
+    END LOOP;
+
+END;
+
+$func$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION metabib.reingest_metabib_field_entries( 
+    bib_id BIGINT,
+    skip_facet BOOL DEFAULT FALSE, 
+    skip_display BOOL DEFAULT FALSE,
+    skip_browse BOOL DEFAULT FALSE, 
+    skip_search BOOL DEFAULT FALSE,
+    only_fields INT[] DEFAULT '{}'::INT[]
+) RETURNS VOID AS $func$
+DECLARE
+    fclass          RECORD;
+    ind_data        metabib.field_entry_template%ROWTYPE;
+    mbe_row         metabib.browse_entry%ROWTYPE;
+    mbe_id          BIGINT;
+    b_skip_facet    BOOL;
+    b_skip_display    BOOL;
+    b_skip_browse   BOOL;
+    b_skip_search   BOOL;
+    value_prepped   TEXT;
+    field_list      INT[] := only_fields;
+    field_types     TEXT[] := '{}'::TEXT[];
+BEGIN
+
+    IF field_list = '{}'::INT[] THEN
+        SELECT ARRAY_AGG(id) INTO field_list FROM config.metabib_field;
+    END IF;
+
+    SELECT COALESCE(NULLIF(skip_facet, FALSE), EXISTS (SELECT enabled FROM config.internal_flag WHERE name =  'ingest.skip_facet_indexing' AND enabled)) INTO b_skip_facet;
+    SELECT COALESCE(NULLIF(skip_display, FALSE), EXISTS (SELECT enabled FROM config.internal_flag WHERE name =  'ingest.skip_display_indexing' AND enabled)) INTO b_skip_display;
+    SELECT COALESCE(NULLIF(skip_browse, FALSE), EXISTS (SELECT enabled FROM config.internal_flag WHERE name =  'ingest.skip_browse_indexing' AND enabled)) INTO b_skip_browse;
+    SELECT COALESCE(NULLIF(skip_search, FALSE), EXISTS (SELECT enabled FROM config.internal_flag WHERE name =  'ingest.skip_search_indexing' AND enabled)) INTO b_skip_search;
+
+    IF NOT b_skip_facet THEN field_types := field_types || '{facet}'; END IF;
+    IF NOT b_skip_display THEN field_types := field_types || '{display}'; END IF;
+    IF NOT b_skip_browse THEN field_types := field_types || '{browse}'; END IF;
+    IF NOT b_skip_search THEN field_types := field_types || '{search}'; END IF;
+
+    PERFORM * FROM config.internal_flag WHERE name = 'ingest.assume_inserts_only' AND enabled;
+    IF NOT FOUND THEN
+        IF NOT b_skip_search THEN
+            FOR fclass IN SELECT * FROM config.metabib_class LOOP
+                -- RAISE NOTICE 'Emptying out %', fclass.name;
+                EXECUTE $$DELETE FROM metabib.$$ || fclass.name || $$_field_entry WHERE source = $$ || bib_id;
+            END LOOP;
+        END IF;
+        IF NOT b_skip_facet THEN
+            DELETE FROM metabib.facet_entry WHERE source = bib_id;
+        END IF;
+        IF NOT b_skip_display THEN
+            DELETE FROM metabib.display_entry WHERE source = bib_id;
+        END IF;
+        IF NOT b_skip_browse THEN
+            DELETE FROM metabib.browse_entry_def_map WHERE source = bib_id;
+        END IF;
+    END IF;
+
+    FOR ind_data IN SELECT * FROM biblio.extract_metabib_field_entry( bib_id, ' ', field_types, field_list ) LOOP
+
+	-- don't store what has been normalized away
+        CONTINUE WHEN ind_data.value IS NULL;
+
+        IF ind_data.field < 0 THEN
+            ind_data.field = -1 * ind_data.field;
+        END IF;
+
+        IF ind_data.facet_field AND NOT b_skip_facet THEN
+            INSERT INTO metabib.facet_entry (field, source, value)
+                VALUES (ind_data.field, ind_data.source, ind_data.value);
+        END IF;
+
+        IF ind_data.display_field AND NOT b_skip_display THEN
+            INSERT INTO metabib.display_entry (field, source, value)
+                VALUES (ind_data.field, ind_data.source, ind_data.value);
+        END IF;
+
+
+        IF ind_data.browse_field AND NOT b_skip_browse THEN
+            -- A caveat about this SELECT: this should take care of replacing
+            -- old mbe rows when data changes, but not if normalization (by
+            -- which I mean specifically the output of
+            -- evergreen.oils_tsearch2()) changes.  It may or may not be
+            -- expensive to add a comparison of index_vector to index_vector
+            -- to the WHERE clause below.
+
+            CONTINUE WHEN ind_data.sort_value IS NULL;
+
+            value_prepped := metabib.browse_normalize(ind_data.value, ind_data.field);
+            SELECT INTO mbe_row * FROM metabib.browse_entry
+                WHERE value = value_prepped AND sort_value = ind_data.sort_value;
+
+            IF FOUND THEN
+                mbe_id := mbe_row.id;
+            ELSE
+                INSERT INTO metabib.browse_entry
+                    ( value, sort_value ) VALUES
+                    ( value_prepped, ind_data.sort_value );
+
+                mbe_id := CURRVAL('metabib.browse_entry_id_seq'::REGCLASS);
+            END IF;
+
+            INSERT INTO metabib.browse_entry_def_map (entry, def, source, authority)
+                VALUES (mbe_id, ind_data.field, ind_data.source, ind_data.authority);
+        END IF;
+
+        IF ind_data.search_field AND NOT b_skip_search THEN
+            -- Avoid inserting duplicate rows
+            EXECUTE 'SELECT 1 FROM metabib.' || ind_data.field_class ||
+                '_field_entry WHERE field = $1 AND source = $2 AND value = $3'
+                INTO mbe_id USING ind_data.field, ind_data.source, ind_data.value;
+                -- RAISE NOTICE 'Search for an already matching row returned %', mbe_id;
+            IF mbe_id IS NULL THEN
+                EXECUTE $$
+                INSERT INTO metabib.$$ || ind_data.field_class || $$_field_entry (field, source, value)
+                    VALUES ($$ ||
+                        quote_literal(ind_data.field) || $$, $$ ||
+                        quote_literal(ind_data.source) || $$, $$ ||
+                        quote_literal(ind_data.value) ||
+                    $$);$$;
+            END IF;
+        END IF;
+
+    END LOOP;
+
+    IF NOT b_skip_search THEN
+        PERFORM metabib.update_combined_index_vectors(bib_id);
+    END IF;
+
+    RETURN;
+END;
+$func$ LANGUAGE PLPGSQL;
+
+-- AFTER UPDATE OR INSERT trigger for biblio.record_entry
+CREATE OR REPLACE FUNCTION biblio.indexing_ingest_or_delete () RETURNS TRIGGER AS $func$
+DECLARE
+    tmp_bool BOOL;
+BEGIN
+
+    IF NEW.deleted THEN -- If this bib is deleted
+
+        PERFORM * FROM config.internal_flag WHERE
+            name = 'ingest.metarecord_mapping.preserve_on_delete' AND enabled;
+
+        tmp_bool := FOUND; -- Just in case this is changed by some other statement
+
+        PERFORM metabib.remap_metarecord_for_bib( NEW.id, NEW.fingerprint, TRUE, tmp_bool );
+
+        IF NOT tmp_bool THEN
+            -- One needs to keep these around to support searches
+            -- with the #deleted modifier, so one should turn on the named
+            -- internal flag for that functionality.
+            DELETE FROM metabib.record_attr_vector_list WHERE source = NEW.id;
+        END IF;
+
+        DELETE FROM authority.bib_linking WHERE bib = NEW.id; -- Avoid updating fields in bibs that are no longer visible
+        DELETE FROM biblio.peer_bib_copy_map WHERE peer_record = NEW.id; -- Separate any multi-homed items
+        DELETE FROM metabib.browse_entry_def_map WHERE source = NEW.id; -- Don't auto-suggest deleted bibs
+        RETURN NEW; -- and we're done
+    END IF;
+
+    IF TG_OP = 'UPDATE' THEN -- re-ingest?
+        PERFORM * FROM config.internal_flag WHERE name = 'ingest.reingest.force_on_same_marc' AND enabled;
+
+        IF NOT FOUND AND OLD.marc = NEW.marc THEN -- don't do anything if the MARC didn't change
+            RETURN NEW;
+        END IF;
+    END IF;
+
+    -- Record authority linking
+    PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_linking' AND enabled;
+    IF NOT FOUND THEN
+        PERFORM biblio.map_authority_linking( NEW.id, NEW.marc );
+    END IF;
+
+    -- Flatten and insert the mfr data
+    PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_metabib_full_rec' AND enabled;
+    IF NOT FOUND THEN
+        PERFORM metabib.reingest_metabib_full_rec(NEW.id);
+
+        -- Now we pull out attribute data, which is dependent on the mfr for all but XPath-based fields
+        PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_metabib_rec_descriptor' AND enabled;
+        IF NOT FOUND THEN
+            PERFORM metabib.reingest_record_attributes(NEW.id, NULL, NEW.marc, TG_OP = 'INSERT' OR OLD.deleted);
+        END IF;
+    END IF;
+
+    -- Gather and insert the field entry data
+    PERFORM metabib.reingest_metabib_field_entries(NEW.id);
+
+    -- Located URI magic
+    PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_located_uri' AND enabled;
+    IF NOT FOUND THEN PERFORM biblio.extract_located_uris( NEW.id, NEW.marc, NEW.editor ); END IF;
+
+    -- (re)map metarecord-bib linking
+    IF TG_OP = 'INSERT' THEN -- if not deleted and performing an insert, check for the flag
+        PERFORM * FROM config.internal_flag WHERE name = 'ingest.metarecord_mapping.skip_on_insert' AND enabled;
+        IF NOT FOUND THEN
+            PERFORM metabib.remap_metarecord_for_bib( NEW.id, NEW.fingerprint );
+        END IF;
+    ELSE -- we're doing an update, and we're not deleted, remap
+        PERFORM * FROM config.internal_flag WHERE name = 'ingest.metarecord_mapping.skip_on_update' AND enabled;
+        IF NOT FOUND THEN
+            PERFORM metabib.remap_metarecord_for_bib( NEW.id, NEW.fingerprint );
+        END IF;
+    END IF;
+
+    RETURN NEW;
+END;
+$func$ LANGUAGE PLPGSQL;
+
+
+
+
+SELECT evergreen.upgrade_deps_block_check('1074', :eg_version);
+
+INSERT INTO config.internal_flag (name, enabled) 
+    VALUES ('ingest.skip_display_indexing', FALSE);
+
+-- Adds seed data to replace (for now) values from the 'mvr' class
+
+UPDATE config.metabib_field SET display_field = TRUE WHERE id IN (6, 8, 16, 18);
+
+INSERT INTO config.metabib_field ( id, field_class, name, label,
+    format, xpath, display_field, display_xpath ) VALUES
+    (37, 'author', 'creator', oils_i18n_gettext(37, 'All Creators', 'cmf', 'label'),
+     'mods32', $$//mods32:mods/mods32:name[mods32:role/mods32:roleTerm[text()='creator']]$$, 
+     TRUE, $$//*[local-name()='namePart']$$ ); -- /* to fool vim */;
+
+-- 'author' field
+UPDATE config.metabib_field SET display_xpath = 
+    $$//*[local-name()='namePart']$$ -- /* to fool vim */
+    WHERE id = 8;
+
+INSERT INTO config.display_field_map (name, field, multi) VALUES
+    ('title', 6, FALSE),
+    ('author', 8, FALSE),
+    ('creators', 37, TRUE),
+    ('subject', 16, TRUE),
+    ('isbn', 18, TRUE)
+;
+
+
+
+SELECT evergreen.upgrade_deps_block_check('1075', :eg_version);
+
+CREATE OR REPLACE FUNCTION evergreen.vandelay_import_item_imported_as_inh_fkey() RETURNS TRIGGER AS $f$
+BEGIN   
+        IF NEW.imported_as IS NULL THEN
+                RETURN NEW;
+        END IF;
+        PERFORM 1 FROM asset.copy WHERE id = NEW.imported_as;
+        IF NOT FOUND THEN
+                RAISE foreign_key_violation USING MESSAGE = FORMAT(
+                        $$Referenced asset.copy id not found, imported_as:%s$$, NEW.imported_as
+                );
+        END IF;
+        RETURN NEW;
+END;
+$f$ LANGUAGE PLPGSQL VOLATILE COST 50;
+
+
+COMMIT;
+
+\echo ---------------------------------------------------------------------
+\echo Reingest display fields.  This can ban canceled via Ctrl-C and run at
+\echo a later time with the following (or similar) SQL:
+\echo
+\echo 'SELECT metabib.reingest_metabib_field_entries(id, TRUE, FALSE, TRUE, TRUE, '
+\echo '    (SELECT ARRAY_AGG(id)::INT[] FROM config.metabib_field WHERE display_field))'
+\echo '    FROM biblio.record_entry WHERE NOT deleted AND id > 0;'
+\echo
+
+-- REINGEST DISPLAY ENTRIES
+SELECT metabib.reingest_metabib_field_entries(id, TRUE, FALSE, TRUE, TRUE, 
+    (SELECT ARRAY_AGG(id)::INT[] FROM config.metabib_field WHERE display_field))
+    FROM biblio.record_entry WHERE NOT deleted AND id > 0;
+
+

-----------------------------------------------------------------------


hooks/post-receive
-- 
Evergreen ILS




More information about the open-ils-commits mailing list