[Zope-dev] ZCatalog FieldIndex Bug

Chris Withers chrisw@nipltd.com
Thu, 05 Apr 2001 19:21:36 +0100


This is a multi-part message in MIME format.
--------------9C3FFE7F6ADF4E363BC10190
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Hi,

Correct me if I'm wrong, but if I query a field index with an empty string, I
expect to get returned all catalogued objects where that attribute's value _is_
the empty string.

Anyway, this happens most of the time and I wish it happened all the time.
Basically, the only situation where this _doesn't_ happen is when _none_ of the
objects catalogued in the field index have a value of the empty string, which
seems really bug and nasty to me ;-)

Well, the attached .zexp will demonstrate the problem nicely. Import it and
'Test' the 'dotest' python script.
..then read the source. You'll also see my gripe about the hard coded redirect
in manage_catalogReindex, which prevents you automatically re-indexing catalogs
unless you use the hack I did.

Right, I'm off to the collector :-)

cheers,

Chris
--------------9C3FFE7F6ADF4E363BC10190
Content-Type: application/octet-stream;
 name="fieldindexTest.zexp"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="fieldindexTest.zexp"

WkVYUAAAAAAAJePfAAAAAAAAAwEoKFUKT0ZTLkZvbGRlcnEBVQZGb2xkZXJxAnRxA050Ln1x
BChVBmRvdGVzdHEFKFUIAAAAAAAl5B5xBihVI1Byb2R1Y3RzLlB5dGhvblNjcmlwdHMuUHl0
aG9uU2NyaXB0cQdVDFB5dGhvblNjcmlwdHEIdHRRVQJpZHEJVQ5maWVsZGluZGV4VGVzdHEK
VRJfX2FjX2xvY2FsX3JvbGVzX19xC31xDFUFY2hyaXNxDV1xDlUFT3duZXJxD2FzVQhfb2Jq
ZWN0c3EQKH1xEShVCW1ldGFfdHlwZXESVQhaQ2F0YWxvZ3ETVQJpZHEUVQdDYXRhbG9ncRV1
fXEWKGgSVQ1EVE1MIERvY3VtZW50cRdoFFUFdGVzdDFxGHV9cRkoVQltZXRhX3R5cGVxGlUL
RFRNTCBNZXRob2RxG1UCaWRxHFUFdGVzdGZxHXV9cR4oaBpoG2gcVQV0ZXN0cnEfdX1xIChV
CW1ldGFfdHlwZXEhVQ1EVE1MIERvY3VtZW50cSJVAmlkcSNVBXRlc3QycSR1fXElKFUJbWV0
YV90eXBlcSZVD1NjcmlwdCAoUHl0aG9uKXEnVQJpZHEoaAV1dFUFdGVzdGZxKShVCAAAAAAA
JeQEcSooVQ5PRlMuRFRNTE1ldGhvZHErVQpEVE1MTWV0aG9kcSx0dFFVBl9vd25lcnEtKF1x
LlUJYWNsX3VzZXJzcS9haA10VQV0aXRsZXEwVQBVBXRlc3RycTEoVQgAAAAAACXkBXEyKGgr
VQpEVE1MTWV0aG9kcTN0dFFVB0NhdGFsb2dxNChVCAAAAAAAJePgcTUoVRpQcm9kdWN0cy5a
Q2F0YWxvZy5aQ2F0YWxvZ3E2VQhaQ2F0YWxvZ3E3dHRRVQV0ZXN0MXE4KFUIAAAAAAAl5AFx
OShVEE9GUy5EVE1MRG9jdW1lbnRxOlUMRFRNTERvY3VtZW50cTt0dFFVBXRlc3QycTwoVQgA
AAAAACXkBnE9KGg6VQxEVE1MRG9jdW1lbnRxPnR0UXUuAAAAAAAl5B4AAAAAAAAKsSgoVSNQ
cm9kdWN0cy5QeXRob25TY3JpcHRzLlB5dGhvblNjcmlwdHEBVQxQeXRob25TY3JpcHRxAnRx
A050Ln1xBChVCWZ1bmNfY29kZXEFKGNTaGFyZWQuREMuU2NyaXB0cy5TaWduYXR1cmUKRnVu
Y0NvZGUKcQZvcQd9cQgoVQtjb192YXJuYW1lc3EJKFUNJGxvb3Bfd2F0Y2hlcnEKVQgkcHJp
bnRlZHELVQ4kcHJpbnRfaGFuZGxlcnEMVQ0kam9pbl9wcmludGVkcQ1VCyRyZWFkX2d1YXJk
cQ5VDCR3cml0ZV9ndWFyZHEPVQYkZ3VhcmRxEHRVC2NvX2FyZ2NvdW50cRFLAHViVQdfcGFy
YW1zcRJVAFUCaWRxE1UGZG90ZXN0cRRVEl9fYWNfbG9jYWxfcm9sZXNfX3EVfXEWVQVjaHJp
c3EXXXEYVQVPd25lcnEZYXNVAl90cRooaBROKEsASwdLB0sDVE8CAAB0CwB9AAB8AACDAAAB
ZwAAYQwAdAwAfQEAdA0AfQIAdA4AfQMAdA8AfQQAdBAAfQUAdBEAfQYAfwEAfwIAfAIAfAEA
ZAEAgwIAAXwCAHwBAIMBAAF/AwB8BAB8BAB0AACDAQBpAQCDAQBpAgBkAgBkAwBkBABkAwBk
BQBkBgCDAAMBfwUAfAIAfAEAZAcAgwIAAXwCAHwBAIMBAAF/BgB5MgB/BwB8BAB8BAB0AACD
AQBpAwCDAQBpBAB8BAB0BQCDAQBpBgB0BwB0BwCDAwABV24ZAH8IAAR0CABqCgBvCgABAQEB
fwkAbgIAAVh/CwB8AgB8AQBkCACDAgABfAIAfAEAgwEAAX8MAHwCAHwBAHwEAHwEAHQAAIMB
AGkDAIMBAGkJAGQCAGQDAIMAAYMCAAF8AgB8AQCDAQABfw4AfAIAfAEAZAkAgwIAAXwCAHwB
AIMBAAF/DwB8BAB8BAB0AACDAQBpAQCDAQBpAgBkAgBkCgBkBABkAwBkBQBkBgCDAAMBfxEA
fAIAfAEAZAcAgwIAAXwCAHwBAIMBAAF/EgB5MgB/EwB8BAB8BAB0AACDAQBpAwCDAQBpBAB8
BAB0BQCDAQBpBgB0BwB0BwCDAwABV24ZAH8UAAR0CABqCgBvCgABAQEBfxUAbgIAAVh/FwB8
AgB8AQBkCwCDAgABfAIAfAEAgwEAAX8YAHwCAHwBAHwEAHwEAHQAAIMBAGkDAIMBAGkJAGQC
AGQDAIMAAYMCAAF8AgB8AQCDAQABfxoAfAMAfAEAgwEAU2QAAFNxGyhOVS9FbnN1cmUgYXQg
bGVhc3Qgb25lIG9iamVjdCBoYXMgYSBibGFuayB0aXRsZS4uLnEcVQV0aXRsZXEdVQBVBGRh
dGFxHlUGU1VCTUlUcR9VDFNhdmUgQ2hhbmdlc3EgVRRyZWNhdGFsb2cgZXZlcnl0aGluZ3Eh
VR1sb29rLCBvbmx5IG9uZSBpdGVtIHJldHVybmVkOnEiVT5Ob3cgZ2l2ZSBpdCBhIHRpdGxl
LCBzbyBubyBjYXRhbG9ndWVkIG9iamVjdCBoYXMgYSB0aXRsZSBvZiAnJ3EjVQdBIFRpdGxl
cSRVIm5vdyBsb29rLCBhbGwgaXRlbXMgcmV0dXJuZWQgOi0oIDpxJXRxJihVCWNvbnRhaW5l
cnEnVQV0ZXN0MXEoVQttYW5hZ2VfZWRpdHEpVQdDYXRhbG9ncSpVFW1hbmFnZV9jYXRhbG9n
UmVpbmRleHErVQdjb250ZXh0cSxVB1JFUVVFU1RxLVUETm9uZXEuVQ5BdHRyaWJ1dGVFcnJv
cnEvVQ1zZWFyY2hSZXN1bHRzcTBVB3ByaW50ZWRxMVUNJGxvb3Bfd2F0Y2hlcnEyVQgkcHJp
bnRlZHEzVQ4kcHJpbnRfaGFuZGxlcnE0VQ0kam9pbl9wcmludGVkcTVVCyRyZWFkX2d1YXJk
cTZVDCR3cml0ZV9ndWFyZHE3VQYkZ3VhcmRxOHRxOShoMmgzaDRoNWg2aDdoOHRxOlUPU2Ny
aXB0IChQeXRob24pcTtoFEsBVSYDAQgBIgIIAQYBIAERAQgCCAEXAggBIgIIAQYBIAERAQgC
CAEXAnE8KXROfXE9dHE+VQVfYm9keXE/VHcDAABwcmludCAiRW5zdXJlIGF0IGxlYXN0IG9u
ZSBvYmplY3QgaGFzIGEgYmxhbmsgdGl0bGUuLi4iCmNvbnRhaW5lci50ZXN0MS5tYW5hZ2Vf
ZWRpdCh0aXRsZT0nJyxkYXRhPScnLFNVQk1JVD0nU2F2ZSBDaGFuZ2VzJykKCnByaW50ICJy
ZWNhdGFsb2cgZXZlcnl0aGluZyIKdHJ5OiAjIHRoaXMgdHJ5IGlzICdjb3MgdGhlIGJhc3Rh
cmQgY2F0YWxvZ1JlaW5kZXggbWV0aG9kIGFsd2F5cyByZWRpcmVjdHMgOi0oKCgoCiAgY29u
dGFpbmVyLkNhdGFsb2cubWFuYWdlX2NhdGFsb2dSZWluZGV4KGNvbnRleHQuUkVRVUVTVCxO
b25lLE5vbmUpCmV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICBwYXNzCgpwcmludCAibG9vaywg
b25seSBvbmUgaXRlbSByZXR1cm5lZDoiCnByaW50IGNvbnRhaW5lci5DYXRhbG9nLnNlYXJj
aFJlc3VsdHModGl0bGU9JycpCgpwcmludCAiTm93IGdpdmUgaXQgYSB0aXRsZSwgc28gbm8g
Y2F0YWxvZ3VlZCBvYmplY3QgaGFzIGEgdGl0bGUgb2YgJyciCmNvbnRhaW5lci50ZXN0MS5t
YW5hZ2VfZWRpdCh0aXRsZT0nQSBUaXRsZScsZGF0YT0nJyxTVUJNSVQ9J1NhdmUgQ2hhbmdl
cycpCgpwcmludCAicmVjYXRhbG9nIGV2ZXJ5dGhpbmciCnRyeTogIyB0aGlzIHRyeSBpcyAn
Y29zIHRoZSBiYXN0YXJkIGNhdGFsb2dSZWluZGV4IG1ldGhvZCBhbHdheXMgcmVkaXJlY3Rz
IDotKCgoKAogIGNvbnRhaW5lci5DYXRhbG9nLm1hbmFnZV9jYXRhbG9nUmVpbmRleChjb250
ZXh0LlJFUVVFU1QsTm9uZSxOb25lKQpleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgcGFzcwoK
cHJpbnQgIm5vdyBsb29rLCBhbGwgaXRlbXMgcmV0dXJuZWQgOi0oIDoiCnByaW50IGNvbnRh
aW5lci5DYXRhbG9nLnNlYXJjaFJlc3VsdHModGl0bGU9JycpCgpyZXR1cm4gcHJpbnRlZHFA
VQtfYmluZF9uYW1lc3FBKGNTaGFyZWQuREMuU2NyaXB0cy5CaW5kaW5ncwpOYW1lQXNzaWdu
bWVudHMKcUJvcUN9cURVBl9hc2duc3FFfXFGKFUObmFtZV9jb250YWluZXJxR1UJY29udGFp
bmVycUhVDG5hbWVfc3VicGF0aHFJVRB0cmF2ZXJzZV9zdWJwYXRocUpVC25hbWVfbV9zZWxm
cUtVBnNjcmlwdHFMVQxuYW1lX2NvbnRleHRxTVUHY29udGV4dHFOdXNiVQxQeXRob25fbWFn
aWNxT1UEmU4NCnFQVQ1mdW5jX2RlZmF1bHRzcVFOdS4AAAAAACXkBAAAAAAAAAIqKChVDk9G
Uy5EVE1MTWV0aG9kcQFVCkRUTUxNZXRob2RxAnRxA050Ln1xBChVBXRpdGxlcQVVB0EgVGl0
bGVxBlUDcmF3cQdUewEAADxkdG1sLXZhciBzdGFuZGFyZF9odG1sX2hlYWRlcj4KCjxmb3Jt
IGFjdGlvbj0idGVzdHIiIG1ldGhvZD0iZ2V0Ij4KPGgyPjxkdG1sLXZhciBkb2N1bWVudF90
aXRsZT48L2gyPgpFbnRlciBxdWVyeSBwYXJhbWV0ZXJzOjxicj48dGFibGU+Cgo8dHI+PHRo
PlRpdGxlPC90aD4KICAgIDx0ZD48aW5wdXQgbmFtZT0idGl0bGUiCiAgICAgICAgICAgICAg
IHdpZHRoPTMwIHZhbHVlPSIiPjwvdGQ+PC90cj4KPHRyPjx0ZCBjb2xzcGFuPTIgYWxpZ249
Y2VudGVyPgo8aW5wdXQgdHlwZT0iU1VCTUlUIiBuYW1lPSJTVUJNSVQiIHZhbHVlPSJTdWJt
aXQgUXVlcnkiPgo8L3RkPjwvdHI+CjwvdGFibGU+CjwvZm9ybT4KPGR0bWwtdmFyIHN0YW5k
YXJkX2h0bWxfZm9vdGVyPgpxCFUSX19hY19sb2NhbF9yb2xlc19fcQl9cQpVBWNocmlzcQtd
cQxVBU93bmVycQ1hc1UHZ2xvYmFsc3EOfXEPVQhfX25hbWVfX3EQVQV0ZXN0ZnERVQVfdmFy
c3ESfXETdS4AAAAAACXkBQAAAAAAAAYoKChVDk9GUy5EVE1MTWV0aG9kcQFVCkRUTUxNZXRo
b2RxAnRxA050Ln1xBChVBXRpdGxlcQVVB0EgdGl0bGVxBlUDcmF3cQdUeQUAADxkdG1sLXZh
ciBzdGFuZGFyZF9odG1sX2hlYWRlcj4KPGR0bWwtaW4gQ2F0YWxvZyBzaXplPTUwIHN0YXJ0
PXF1ZXJ5X3N0YXJ0PgogICA8ZHRtbC1pZiBzZXF1ZW5jZS1zdGFydD4KCiAgICAgIDxkdG1s
LWlmIHByZXZpb3VzLXNlcXVlbmNlPgoKICAgICAgICA8YSBocmVmPSI8ZHRtbC12YXIgVVJM
PjxkdG1sLXZhciBzZXF1ZW5jZS1xdWVyeQogICAgICAgICAgICAgICAgID5xdWVyeV9zdGFy
dD08ZHRtbC12YXIKICAgICAgICAgICAgICAgICBwcmV2aW91cy1zZXF1ZW5jZS1zdGFydC1u
dW1iZXI+Ij4KICAgICAgICAoUHJldmlvdXMgPGR0bWwtdmFyIHByZXZpb3VzLXNlcXVlbmNl
LXNpemU+IHJlc3VsdHMpCiAgICAgICAgPC9hPgoKICAgICAgPC9kdG1sLWlmIHByZXZpb3Vz
LXNlcXVlbmNlPgoKICAgICAgPHRhYmxlIGJvcmRlcj4KICAgICAgICA8dHI+CiAgICAgICAg
ICA8dGg+VGl0bGU8L3RoPgogICAgICAgICAgPHRoPklkPC90aD4KICAgICAgICAgIDx0aD5T
dW1tYXJ5PC90aD4KICAgICAgICAgIDx0aD5NZXRhIHR5cGU8L3RoPgogICAgICAgICAgPHRo
PkJvYm9iYXNlIG1vZGlmaWNhdGlvbiB0aW1lPC90aD4KICAgICAgICAgIDx0aD5EYXRhIHJl
Y29yZCBpZCA8L3RoPgogICAgICAgIDwvdHI+CiAgICAgIAogICA8L2R0bWwtaWYgc2VxdWVu
Y2Utc3RhcnQ+CgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD48ZHRtbC12YXIgdGl0bGU+
PC90ZD4KICAgICAgICAgIDx0ZD48ZHRtbC12YXIgaWQ+PC90ZD4KICAgICAgICAgIDx0ZD48
ZHRtbC12YXIgc3VtbWFyeT48L3RkPgogICAgICAgICAgPHRkPjxkdG1sLXZhciBtZXRhX3R5
cGU+PC90ZD4KICAgICAgICAgIDx0ZD48ZHRtbC12YXIgYm9ib2Jhc2VfbW9kaWZpY2F0aW9u
X3RpbWU+PC90ZD4KICAgICAgICAgIDx0ZD48ZHRtbC12YXIgZGF0YV9yZWNvcmRfaWRfPjwv
dGQ+CiAgICAgICAgPC90cj4KCiAgIDxkdG1sLWlmIHNlcXVlbmNlLWVuZD4KCiAgICAgIDwv
dGFibGU+CiAgICAgIDxkdG1sLWlmIG5leHQtc2VxdWVuY2U+CgogICAgICAgICA8YSBocmVm
PSI8ZHRtbC12YXIgVVJMPjxkdG1sLXZhciBzZXF1ZW5jZS1xdWVyeQogICAgICAgICAgICA+
cXVlcnlfc3RhcnQ9PGR0bWwtdmFyCiAgICAgICAgICAgIG5leHQtc2VxdWVuY2Utc3RhcnQt
bnVtYmVyPiI+CiAgICAgICAgIChOZXh0IDxkdG1sLXZhciBuZXh0LXNlcXVlbmNlLXNpemU+
IHJlc3VsdHMpCiAgICAgICAgIDwvYT4KCiAgICAgIDwvZHRtbC1pZiBuZXh0LXNlcXVlbmNl
PgogICA8L2R0bWwtaWYgc2VxdWVuY2UtZW5kPgoKPGR0bWwtZWxzZT4KCiAgVGhlcmUgd2Fz
IG5vIGRhdGEgbWF0Y2hpbmcgdGhpcyA8ZHRtbC12YXIgdGl0bGVfb3JfaWQ+IHF1ZXJ5LgoK
PC9kdG1sLWluPgoKPGR0bWwtdmFyIHN0YW5kYXJkX2h0bWxfZm9vdGVyPnEIVRJfX2FjX2xv
Y2FsX3JvbGVzX19xCX1xClUFY2hyaXNxC11xDFUFT3duZXJxDWFzVQdnbG9iYWxzcQ59cQ9V
CF9fbmFtZV9fcRBVBXRlc3RycRFVBV92YXJzcRJ9cRN1LgAAAAAAJePgAAAAAAAAAWUoKFUa
UHJvZHVjdHMuWkNhdGFsb2cuWkNhdGFsb2dxAVUIWkNhdGFsb2dxAnRxA050Ln1xBChVAmlk
cQVVB0NhdGFsb2dxBlUSX19hY19sb2NhbF9yb2xlc19fcQd9cQhVBWNocmlzcQldcQpVBU93
bmVycQthc1UIX29iamVjdHNxDCh9cQ0oVQltZXRhX3R5cGVxDlUKVm9jYWJ1bGFyeXEPaAVo
D3V0cRBVCXRocmVzaG9sZHERTRAnVQh2b2NhYl9pZHESaA9oDyhVCAAAAAAAJePhcRMoVRxQ
cm9kdWN0cy5aQ2F0YWxvZy5Wb2NhYnVsYXJ5cRRVClZvY2FidWxhcnlxFXR0UVUIX2NhdGFs
b2dxFihVCAAAAAAAJePicRcoVRlQcm9kdWN0cy5aQ2F0YWxvZy5DYXRhbG9ncRhVB0NhdGFs
b2dxGXR0UVUFdGl0bGVxGlUHQSBUaXRsZXEbdS4AAAAAACXkAQAAAAAAAACuKChVEE9GUy5E
VE1MRG9jdW1lbnRxAVUMRFRNTERvY3VtZW50cQJ0cQNOdC59cQQoVQV0aXRsZXEFVQdBIFRp
dGxlcQZVA3Jhd3EHVQBVEl9fYWNfbG9jYWxfcm9sZXNfX3EIfXEJVQVjaHJpc3EKXXELVQVP
d25lcnEMYXNVB2dsb2JhbHNxDX1xDlUIX19uYW1lX19xD1UFdGVzdDFxEFUFX3ZhcnNxEX1x
EnUuAAAAAAAl5AYAAAAAAAABOSgoVRBPRlMuRFRNTERvY3VtZW50cQFVDERUTUxEb2N1bWVu
dHECdHEDTnQufXEEKFUFdGl0bGVxBVUERmlzaHEGVQNyYXdxB1WMPGR0bWwtdmFyIHN0YW5k
YXJkX2h0bWxfaGVhZGVyPgo8aDI+PGR0bWwtdmFyIHRpdGxlX29yX2lkPjwvaDI+CjxwPgpU
aGlzIGlzIHRoZSA8ZHRtbC12YXIgaWQ+IERvY3VtZW50Lgo8L3A+CjxkdG1sLXZhciBzdGFu
ZGFyZF9odG1sX2Zvb3Rlcj5xCFUSX19hY19sb2NhbF9yb2xlc19fcQl9cQpVBWNocmlzcQtd
cQxVBU93bmVycQ1hc1UHZ2xvYmFsc3EOfXEPVQhfX25hbWVfX3EQVQV0ZXN0MnERVQVfdmFy
c3ESfXETdS4AAAAAACXj4QAAAAAAAADnKChVHFByb2R1Y3RzLlpDYXRhbG9nLlZvY2FidWxh
cnlxAVUKVm9jYWJ1bGFyeXECdHEDTnQufXEEKFUFdGl0bGVxBVUKVm9jYWJ1bGFyeXEGVQJp
ZHEHaAZVEl9fYWNfbG9jYWxfcm9sZXNfX3EIfXEJVQVjaHJpc3EKXXELVQVPd25lcnEMYXNV
B2xleGljb25xDShVCAAAAAAAJePxcQ4oVRtTZWFyY2hJbmRleC5HbG9iYmluZ0xleGljb25x
D1UPR2xvYmJpbmdMZXhpY29ucRB0dFFVCGdsb2JiaW5ncRFLAXUuAAAAAAAl4+IAAAAAAAAB
2SgoVRlQcm9kdWN0cy5aQ2F0YWxvZy5DYXRhbG9ncQFVB0NhdGFsb2dxAnRxA050Ln1xBChV
BnNjaGVtYXEFfXEGKFUFdGl0bGVxB0sBVQltZXRhX3R5cGVxCEsCVQJpZHEJSwBVB3N1bW1h
cnlxCksEVRpib2JvYmFzZV9tb2RpZmljYXRpb25fdGltZXELSwN1VQdfX2xlbl9fcQwoVQgA
AAAAACXj43ENKFUNQlRyZWVzLkxlbmd0aHEOVQZMZW5ndGhxD3R0UVUEZGF0YXEQKFUIAAAA
AAAl5DFxEShVDkJUcmVlcy5JT0JUcmVlcRJVB0lPQlRyZWVxE3R0UVUHaW5kZXhlc3EUfXEV
VQV0aXRsZXEWKFUIAAAAAAAl4/1xFyhVE1NlYXJjaEluZGV4LlVuSW5kZXhxGFUHVW5JbmRl
eHEZdHRRc1UFbmFtZXNxGihoCWgHaAhoC2gKdHEbVQR1aWRzcRwoVQgAAAAAACXkMnEdKFUO
QlRyZWVzLk9JQlRyZWVxHlUHT0lCVHJlZXEfdHRRVQdsZXhpY29ucSBVClZvY2FidWxhcnlx
IVUFcGF0aHNxIihVCAAAAAAAJeQzcSMoaBJVB0lPQlRyZWVxJHR0UXUuAAAAAAAl4/EAAAAA
AAAA8SgoVRtTZWFyY2hJbmRleC5HbG9iYmluZ0xleGljb25xAVUPR2xvYmJpbmdMZXhpY29u
cQJ0cQNOdC59cQQoVQtfaW52ZXJzZUxleHEFKFUIAAAAAAAl4/JxBihVDkJUcmVlcy5JT0JU
cmVlcQdVB0lPQlRyZWVxCHR0UVUIX2RpZ3JhbXNxCShVCAAAAAAAJePzcQooVQ5CVHJlZXMu
T09CVHJlZXELVQdPT0JUcmVlcQx0dFFVCF9sZXhpY29ucQ0oVQgAAAAAACXj9HEOKFUOQlRy
ZWVzLk9JQlRyZWVxD1UHT0lCVHJlZXEQdHRRdS4AAAAAACXj4wAAAAAAAAAmKChVDUJUcmVl
cy5MZW5ndGhxAVUGTGVuZ3RocQJ0cQNOdC5LBi4AAAAAACXkMQAAAAAAAAWAKChVDkJUcmVl
cy5JT0JUcmVlcQFVB0lPQlRyZWVxAnRxA050LigoKChKeyuFDChVB0NhdGFsb2dxBFUHQSBU
aXRsZXEFVQhaQ2F0YWxvZ3EGKGNEYXRlVGltZS5EYXRlVGltZQpEYXRlVGltZQpxB05vcQh9
cQkoVQVfaG91cnEKSxJVAl9kcQtHQOHhdsORt61VBV9mbW9ucQxVBUFwcmlscQ1VBV95ZWFy
cQ5N0QdVBV9wbW9ucQ9VBEFwci5xEFUEdGltZXERRz/mw5G3rQAAVQRfZGF5cRJLBVUHX21p
bGxpc3ETTDk4NjQ5MDI2MjY0NEwKVQVfYWRheXEUVQNUaHVxFVUCX3RxFkdBzWZSy1JumFUK
X2RheW9mZnNldHEXSwRVB19taW51dGVxGEsEVQZfbW9udGhxGUsEVQNfcG1xGlUCcG1xG1UH
X3NlY29uZHEcR0A2pN0wAAAAVQVfYW1vbnEdVQNBcHJxHlUFX2ZkYXlxH1UIVGh1cnNkYXlx
IFUFX3BkYXlxIVUEVGh1LnEiVQdfcG1ob3VycSNLBlUDX3R6cSRVBUdNVCsxcSVVCF9uZWFy
c2VjcSZHQDYAAAAAAAB1YmNNaXNzaW5nClYKcSd0cShKfCuFDChVClZvY2FidWxhcnlxKWgp
VQpWb2NhYnVsYXJ5cSooaAdOb3ErfXEsKGgKSxFoC0dA4eF2oJLsCGgMaA1oDk3RB2gPaBBo
EUc/5qCS7AgAAGgSSwVoE0w5ODY0ODk4OTM1NTNMCmgUaBVoFkdBzWZSEsbItGgXSwRoGEs6
aBlLBGgaaBtoHEdAKxsi0AAAAGgdaB5oH2ggaCFoImgjSwVoJGglaCZHQCoAAAAAAAB1Ymgn
dHEtSn0rhQwoVQV0ZXN0MXEuVQdBIFRpdGxlcS9VDURUTUwgRG9jdW1lbnRxMChoB05vcTF9
cTIoaApLE2gLR0Dh4Xhi5pJJaAxoDWgOTdEHaA9oEGgRRz/oYuaSSQAAaBJLBWgTTDk4NjQ5
NDY0MzA5MkwKaBRoFWgWR0HNZltZi+dsaBdLBGgYSxFoGUsEaBpoG2gcR0A3F87YAAAAaB1o
HmgfaCBoIWgiaCNLB2gkaCVoJkdANwAAAAAAAHViaCd0cTNKfiuFDChVBXRlc3RmcTRVB0Eg
VGl0bGVxNVULRFRNTCBNZXRob2RxNihoB05vcTd9cTgoaApLEmgLR0Dh4XbEL/NVaAxoDWgO
TdEHaA9oEGgRRz/mxC/zVQAAaBJLBWgTTDk4NjQ5MDI2OTE2M0wKaBRoFWgWR0HNZlLOlN0w
aBdLBGgYSwRoGUsEaBpoG2gcR0A9KbpgAAAAaB1oHmgfaCBoIWgiaCNLBmgkaCVoJkdAPQAA
AAAAAHViaCd0cTlKfyuFDChVBXRlc3RycTpVB0EgdGl0bGVxO2g2KGgHTm9xPH1xPShoCksS
aAtHQOHhdsXXYsloDGgNaA5N0QdoD2gQaBFHP+bF12LJAABoEksFaBNMOTg2NDkwMjg2NjA3
TApoFGgVaBZHQc1mUtdN0vBoF0sEaBhLBGgZSwRoGmgbaBxHQEdN0vAAAABoHWgeaB9oIGgh
aCJoI0sGaCRoJWgmR0BHAAAAAAAAdWJoJ3RxPkqAK4UMKFUFdGVzdDJxP1UERmlzaHFAaDAo
aAdOb3FBfXFCKGgKSxJoC0dA4eF2u9s3A2gMaA1oDk3RB2gPaBBoEUc/5rvbNwMAAGgSSwVo
E0w5ODY0OTAxODEyOTZMCmgUaBVoFkdBzWZSoqYEGGgXSwRoGEsDaBlLBGgaaBtoHEc/9MCD
AAAAAGgdaB5oH2ggaCFoImgjSwZoJGglaCZHP/AAAAAAAAB1YmgndHFDdHR0dHFELgAAAAAA
JeP9AAAAAAAAAQcoKFUTU2VhcmNoSW5kZXguVW5JbmRleHEBVQdVbkluZGV4cQJ0cQNOdC59
cQQoVQdfX2xlbl9fcQUoVQgAAAAAACXj/nEGKFUNQlRyZWVzLkxlbmd0aHEHVQZMZW5ndGhx
CHR0UVUCaWRxCVUFdGl0bGVxClUIX3VuaW5kZXhxCyhVCAAAAAAAJeQ0cQwoVQ5CVHJlZXMu
SU9CVHJlZXENVQdJT0JUcmVlcQ50dFFVDGNhbGxfbWV0aG9kc3EPTlUGX2luZGV4cRAoVQgA
AAAAACXkNXERKFUOQlRyZWVzLk9PQlRyZWVxElUHT09CVHJlZXETdHRRVQlpZ25vcmVfZXhx
FE51LgAAAAAAJeQyAAAAAAAAAPMoKFUOQlRyZWVzLk9JQlRyZWVxAVUHT0lCVHJlZXECdHED
TnQuKCgoKFUXL2ZpZWxkaW5kZXhUZXN0L0NhdGFsb2dxBEp7K4UMVSIvZmllbGRpbmRleFRl
c3QvQ2F0YWxvZy9Wb2NhYnVsYXJ5cQVKfCuFDFUVL2ZpZWxkaW5kZXhUZXN0L3Rlc3QxcQZK
fSuFDFUVL2ZpZWxkaW5kZXhUZXN0L3Rlc3QycQdKgCuFDFUVL2ZpZWxkaW5kZXhUZXN0L3Rl
c3RmcQhKfiuFDFUVL2ZpZWxkaW5kZXhUZXN0L3Rlc3RycQlKfyuFDHR0dHRxCi4AAAAAACXk
MwAAAAAAAADzKChVDkJUcmVlcy5JT0JUcmVlcQFVB0lPQlRyZWVxAnRxA050LigoKChKeyuF
DFUXL2ZpZWxkaW5kZXhUZXN0L0NhdGFsb2dxBEp8K4UMVSIvZmllbGRpbmRleFRlc3QvQ2F0
YWxvZy9Wb2NhYnVsYXJ5cQVKfSuFDFUVL2ZpZWxkaW5kZXhUZXN0L3Rlc3QxcQZKfiuFDFUV
L2ZpZWxkaW5kZXhUZXN0L3Rlc3RmcQdKfyuFDFUVL2ZpZWxkaW5kZXhUZXN0L3Rlc3RycQhK
gCuFDFUVL2ZpZWxkaW5kZXhUZXN0L3Rlc3QycQl0dHR0cQouAAAAAAAl4/IAAAAAAAAAJygo
VQ5CVHJlZXMuSU9CVHJlZXEBVQdJT0JUcmVlcQJ0cQNOdC5OLgAAAAAAJePzAAAAAAAAACco
KFUOQlRyZWVzLk9PQlRyZWVxAVUHT09CVHJlZXECdHEDTnQuTi4AAAAAACXj9AAAAAAAAAAn
KChVDkJUcmVlcy5PSUJUcmVlcQFVB09JQlRyZWVxAnRxA050Lk4uAAAAAAAl4/4AAAAAAAAA
JigoVQ1CVHJlZXMuTGVuZ3RocQFVBkxlbmd0aHECdHEDTnQuSwQuAAAAAAAl5DQAAAAAAAAA
kCgoVQ5CVHJlZXMuSU9CVHJlZXEBVQdJT0JUcmVlcQJ0cQNOdC4oKCgoSnsrhQxVB0EgVGl0
bGVxBEp8K4UMVQpWb2NhYnVsYXJ5cQVKfSuFDFUHQSBUaXRsZXEGSn4rhQxVB0EgVGl0bGVx
B0p/K4UMVQdBIHRpdGxlcQhKgCuFDFUERmlzaHEJdHR0dHEKLgAAAAAAJeQ1AAAAAAAAAJso
KFUOQlRyZWVzLk9PQlRyZWVxAVUHT09CVHJlZXECdHEDTnQuKCgoKFUHQSBUaXRsZXEEKFUI
AAAAAAAl5DZxBShVDkJUcmVlcy5JSUJUcmVlcQZVCUlJVHJlZVNldHEHdHRRVQdBIHRpdGxl
cQhKfyuFDFUERmlzaHEJSoArhQxVClZvY2FidWxhcnlxCkp8K4UMdHR0dHELLgAAAAAAJeQ2
AAAAAAAAAEEoKFUOQlRyZWVzLklJQlRyZWVxAVUJSUlUcmVlU2V0cQJ0cQNOdC4oKCgoSnsr
hQxKfSuFDEp+K4UMdHR0dHEELv////////////////////8=
--------------9C3FFE7F6ADF4E363BC10190--