[Zope] Ordered Folders - the result

Itamar Shtull-Trauring itamars@ibm.net
Sun, 10 Oct 1999 20:36:34 +0200


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

Here's the working version.  I'd be grateful for any comments and bug
reports.

Description:
Add a "First" button to folders, so you can select some items and make them
appear first in the list.  Therefore, items in a folder are now displayed by
order of creation plus whatever changes you made, and not alphabetically as
before.  The code that does this was liberated from the ZClasses Views page
(manage_first in lib/python/ZClasses/Basic.py).

Potential problems:
Is the line "self._objects = objects" OK as far as multithreading goes? 
Also, I have no idea if the permissions thing will work.  I assume I did it
right, but who knows.

Attached are a new Folder.py and main.dtml (based off the Zope 2.0.1
release, not CVS), which need to be put in lib/python/OFS.  I don't know how
to make a patch - could someone tell me the command?

-- 
Itamar - itamars@ibm.net
---------------------------o----------------------------------------------o
 Perl/Gimp Greeting Cards  | Trust? Ha! The US dollar is backed by ICBMs! |
 http://www.sealingwax.com |      --Anonymous Coward, Slashdot            |
--------------1B26FC3C2460802D5DB22E94
Content-Type: application/octet-stream;
 name="main.dtml"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="main.dtml"

PEhUTUw+CjxIRUFEPgo8VElUTEU+Q29udGVudHM8L1RJVExFPgo8L0hFQUQ+CjxCT0RZIEJH
Q09MT1I9IiNGRkZGRkYiIExJTks9IiMwMDAwOTkiIFZMSU5LPSIjNTU1NTU1Ij4KPCEtLSN2
YXIgbWFuYWdlX3RhYnMtLT4KPFA+Cgo8Rk9STSBBQ1RJT049IjwhLS0jdmFyIFVSTDEtLT4i
IE1FVEhPRD0iUE9TVCI+CjwhLS0jaWYgb2JqZWN0SXRlbXMtLT4KPFRBQkxFIEJPUkRFUj0i
MCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIyIj4KPCEtLSNpbiBvYmplY3RJdGVt
cy0tPgo8VFI+CiAgPFREIEFMSUdOPSJMRUZUIiBWQUxJR049IlRPUCIgV0lEVEg9IjE2Ij4K
ICA8SU5QVVQgVFlQRT0iQ0hFQ0tCT1giIE5BTUU9ImlkczpsaXN0IiBWQUxVRT0iPCEtLSN2
YXIgc2VxdWVuY2Uta2V5IGh0bWxfcXVvdGUtLT4iPgogIDwvVEQ+CiAgPFREIEFMSUdOPSJM
RUZUIiBWQUxJR049IlRPUCI+CiAgPCEtLSNpZiBpY29uLS0+CiAgPEEgSFJFRj0iPCEtLSN2
YXIgc2VxdWVuY2Uta2V5IHVybF9xdW90ZS0tPi9tYW5hZ2Vfd29ya3NwYWNlIj4KICA8SU1H
IFNSQz0iPCEtLSN2YXIgU0NSSVBUX05BTUUtLT4vPCEtLSN2YXIgaWNvbi0tPiIKICAgQUxU
PSJbPCEtLSN2YXIgbWV0YV90eXBlLS0+XSIgQk9SREVSPSIwIj48L0E+CiAgPCEtLSMvaWYg
aWNvbi0tPgogIDwvVEQ+CiAgPFREIEFMSUdOPSJMRUZUIiBWQUxJR049IlRPUCI+CiAgPEEg
SFJFRj0iPCEtLSN2YXIgc2VxdWVuY2Uta2V5IHVybF9xdW90ZS0tPi9tYW5hZ2Vfd29ya3Nw
YWNlIj4KICA8IS0tI3ZhciBzZXF1ZW5jZS1rZXkgZm10PSJodG1sLXF1b3RlIi0tPiA8IS0t
I2lmIHRpdGxlLS0+KDwhLS0jdmFyIAogICB0aXRsZSBmbXQ9Imh0bWwtcXVvdGUiLS0+KTwh
LS0jL2lmLS0+CiAgPC9BPgogIDwhLS0jaWYgbG9ja2VkX2luX3ZlcnNpb24tLT4KICAgIDwh
LS0jaWYgbW9kaWZpZWRfaW5fdmVyc2lvbi0tPgogICAgICA8SU1HIFNSQz0iPCEtLSN2YXIg
U0NSSVBUX05BTUUtLT4vcF8vbG9ja2VkIgogICAgICAgQUxUPSJUaGlzIGl0ZW0gaGFzIGJl
ZW4gbW9kaWZpZWQgaW4gdGhpcyB2ZXJzaW9uIj4KICAgIDwhLS0jZWxzZS0tPgogICAgICA8
SU1HIFNSQz0iPCEtLSN2YXIgU0NSSVBUX05BTUUtLT4vcF8vbG9ja2VkbyIKICAgICAgIEFM
VD0iVGhpcyBpdGVtIGhhcyBiZWVuIG1vZGlmaWVkIGluIGFub3RoZXIgdmVyc2lvbiI+CiAg
ICAgICAoPGVtPjwhLS0jdmFyIGxvY2tlZF9pbl92ZXJzaW9uLS0+PC9lbT4pCiAgICA8IS0t
Iy9pZi0tPgogIDwhLS0jL2lmLS0+CiAgPC9URD4KPC9UUj4KPCEtLSMvaW4tLT4KPC9UQUJM
RT4KCjxUQUJMRSBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0yPgo8
VFI+CiAgPFREIEFMSUdOPSJMRUZUIiBWQUxJR049IlRPUCIgV0lEVEg9IjE2Ij48L1REPgog
IDxURCBBTElHTj0iTEVGVCIgVkFMSUdOPSJUT1AiPgogIDwhLS0jdW5sZXNzIGRvbnRBbGxv
d0NvcHlBbmRQYXN0ZS0tPgogIDxJTlBVVCBUWVBFPSJTVUJNSVQiIE5BTUU9Im1hbmFnZV9y
ZW5hbWVGb3JtOm1ldGhvZCIgVkFMVUU9IlJlbmFtZSI+CiAgPElOUFVUIFRZUEU9IlNVQk1J
VCIgTkFNRT0ibWFuYWdlX2N1dE9iamVjdHM6bWV0aG9kIiBWQUxVRT0iQ3V0Ij4gCiAgPElO
UFVUIFRZUEU9IlNVQk1JVCIgTkFNRT0ibWFuYWdlX2NvcHlPYmplY3RzOm1ldGhvZCIgVkFM
VUU9IkNvcHkiPgogIDwhLS0jaWYgY2JfZGF0YVZhbGlkLS0+CiAgPElOUFVUIFRZUEU9IlNV
Qk1JVCIgTkFNRT0ibWFuYWdlX3Bhc3RlT2JqZWN0czptZXRob2QiIFZBTFVFPSJQYXN0ZSI+
CiAgPCEtLSMvaWYtLT4KICA8IS0tIy91bmxlc3MtLT4KICA8IS0tI2lmICJBVVRIRU5USUNB
VEVEX1VTRVIuaGFzX3Blcm1pc3Npb24oJ0RlbGV0ZSBvYmplY3RzJywgdGhpcygpKSItLT4K
ICA8SU5QVVQgVFlQRT0iU1VCTUlUIiBOQU1FPSJtYW5hZ2VfZGVsT2JqZWN0czptZXRob2Qi
IFZBTFVFPSJEZWxldGUiPgogIDwhLS0jL2lmLS0+CiAgPCEtLSNpZiAiQVVUSEVOVElDQVRF
RF9VU0VSLmhhc19wZXJtaXNzaW9uKCdSZWFycmFuZ2Ugb2JqZWN0cycsIHRoaXMoKSkiLS0+
CiAgPElOUFVUIFRZUEU9IlNVQk1JVCIgTkFNRT0ibWFuYWdlX2ZpcnN0Om1ldGhvZCIgVkFM
VUU9IkZpcnN0Ij4KICA8IS0tIy9pZi0tPgogIDwhLS0jaWYgIkFVVEhFTlRJQ0FURURfVVNF
Ui5oYXNfcGVybWlzc2lvbignSW1wb3J0L0V4cG9ydCBvYmplY3RzJywgdGhpcygpKSItLT4K
ICA8SU5QVVQgVFlQRT0iU1VCTUlUIiBOQU1FPSJtYW5hZ2VfaW1wb3J0RXhwb3J0Rm9ybTpt
ZXRob2QiIFZBTFVFPSJFeHBvcnQuLi4iPgogIDwhLS0jL2lmLS0+CiAgPC9URD4KPC9UUj4K
PC9UQUJMRT4KPCEtLSNlbHNlLS0+CjxUQUJMRSBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIw
IiBDRUxMUEFERElORz0iMiI+CjxUUj4KPFREPgpUaGVyZSBhcmUgY3VycmVudGx5IG5vIGl0
ZW1zIGluIDxFTT48IS0tI3ZhciB0aXRsZV9vcl9pZC0tPjwvRU0+CjxQPgo8IS0tI3VubGVz
cyBkb250QWxsb3dDb3B5QW5kUGFzdGUtLT4KPCEtLSNpZiBjYl9kYXRhVmFsaWQtLT4KPElO
UFVUIFRZUEU9IlNVQk1JVCIgTkFNRT0ibWFuYWdlX3Bhc3RlT2JqZWN0czptZXRob2QiIFZB
TFVFPSJQYXN0ZSI+CjwhLS0jL2lmLS0+CiAgPCEtLSMvdW5sZXNzLS0+CjwvVEQ+CjwvVEFC
TEU+CjwhLS0jL2lmLS0+CjwvRk9STT4KCjwhLS0jaWYgImZpbHRlcmVkX21ldGFfdHlwZXMo
QVVUSEVOVElDQVRFRF9VU0VSKSItLT4KCjwhLS0jaWYgIl8ubGVuKGZpbHRlcmVkX21ldGFf
dHlwZXMoQVVUSEVOVElDQVRFRF9VU0VSKSkgPiAxIi0tPgo8VEFCTEUgQUxJR049IkxFRlQi
Pgo8VFI+CjxURCBWQUxJR049Ik1JRERMRSI+CiAgVG8gYWRkIGEgbmV3IGl0ZW0sIHNlbGVj
dCBhbiBpdGVtIHR5cGUgCiAgPE5PU0NSSVBUPmFuZCBjbGljayAmcXVvdDtBZGQmcXVvdDs8
L05PU0NSSVBUPi4gCjwvVEQ+CjwvVFI+CjxUUj4KPFREIFZBTElHTj0iTUlERExFIj4KICA8
Rk9STSBBQ1RJT049IjwhLS0jdmFyIFVSTDEtLT4vIiBNRVRIT0Q9IkdFVCI+CiAgPFNFTEVD
VCBOQU1FPSI6bWV0aG9kIiBPTkNIQU5HRT0ibG9jYXRpb24uaHJlZj10aGlzLm9wdGlvbnNb
dGhpcy5zZWxlY3RlZEluZGV4XS52YWx1ZSI+CiAgICA8T1BUSU9OIHZhbHVlPSJtYW5hZ2Vf
d29ya3NwYWNlIiBESVNBQkxFRD5BdmFpbGFibGUgT2JqZWN0cwogIDwhLS0jaW4gImZpbHRl
cmVkX21ldGFfdHlwZXMoQVVUSEVOVElDQVRFRF9VU0VSKSIgbWFwcGluZyBzb3J0PW5hbWUt
LT4KICAgIDxPUFRJT04gdmFsdWU9IjwhLS0jdmFyIGFjdGlvbiBmbXQ9InVybC1xdW90ZSIt
LT4iPjwhLS0jdmFyIG5hbWUtLT4KICA8IS0tIy9pbi0tPgogIDwvU0VMRUNUPgogIDxOT1ND
UklQVD48SU5QVVQgVFlQRT0iU1VCTUlUIiBWQUxVRT0iIEFkZCAiPjwvTk9TQ1JJUFQ+CiAg
PC9GT1JNPgo8L1REPgo8L1RSPgo8L1RBQkxFPgo8IS0tI2Vsc2UtLT4KICA8Rk9STSBBQ1RJ
T049IjwhLS0jdmFyIFVSTDEtLT4vIiBNRVRIT0Q9IkdFVCI+CiAgICBUbyBhZGQgYSBuZXcg
aXRlbSBjbGljayAmcXVvdDtBZGQmcXVvdDsuCiAgICA8IS0tI2luICJmaWx0ZXJlZF9tZXRh
X3R5cGVzKEFVVEhFTlRJQ0FURURfVVNFUikiIG1hcHBpbmcgc29ydD1uYW1lLS0+CiAgICAg
IDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPSI6bWV0aG9kIiB2YWx1ZT0iPCEtLSN2YXIgYWN0
aW9uIGZtdD0idXJsLXF1b3RlIi0tPiI+CiAgICAgIDxJTlBVVCBUWVBFPSJTVUJNSVQiIFZB
TFVFPSIgQWRkICI+CiAgICA8IS0tIy9pbi0tPgogIDwvRk9STT4KPCEtLSMvaWYtLT4KCjwh
LS0jL2lmLS0+Cgo8IS0tI2lmIHVwZGF0ZV9tZW51LS0+CjxTQ1JJUFQgTEFOR1VBR0U9Imph
dmFzY3JpcHQiPgo8IS0tCndpbmRvdy5wYXJlbnQudXBkYXRlX21lbnUoKTsKLy8tLT4KPC9T
Q1JJUFQ+CjwhLS0jL2lmLS0+Cgo8L0JPRFk+CjwvSFRNTD4K
--------------1B26FC3C2460802D5DB22E94
Content-Type: application/octet-stream;
 name="Folder.py"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="Folder.py"

IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgCiMgWm9wZSBQdWJsaWMgTGljZW5zZSAoWlBM
KSBWZXJzaW9uIDEuMAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
IyAKIyBDb3B5cmlnaHQgKGMpIERpZ2l0YWwgQ3JlYXRpb25zLiAgQWxsIHJpZ2h0cyByZXNl
cnZlZC4KIyAKIyBUaGlzIGxpY2Vuc2UgaGFzIGJlZW4gY2VydGlmaWVkIGFzIE9wZW4gU291
cmNlKHRtKS4KIyAKIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCiMgbWV0Ogoj
IAojIDEuIFJlZGlzdHJpYnV0aW9ucyBpbiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CiMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KIyAKIyAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAojICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4KIyAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlCiMgICAgZGlzdHJpYnV0aW9uLgojIAojIDMuIERpZ2l0
YWwgQ3JlYXRpb25zIHJlcXVlc3RzIHRoYXQgYXR0cmlidXRpb24gYmUgZ2l2ZW4gdG8gWm9w
ZQojICAgIGluIGFueSBtYW5uZXIgcG9zc2libGUuIFpvcGUgaW5jbHVkZXMgYSAiUG93ZXJl
ZCBieSBab3BlIgojICAgIGJ1dHRvbiB0aGF0IGlzIGluc3RhbGxlZCBieSBkZWZhdWx0LiBX
aGlsZSBpdCBpcyBub3QgYSBsaWNlbnNlCiMgICAgdmlvbGF0aW9uIHRvIHJlbW92ZSB0aGlz
IGJ1dHRvbiwgaXQgaXMgcmVxdWVzdGVkIHRoYXQgdGhlCiMgICAgYXR0cmlidXRpb24gcmVt
YWluLiBBIHNpZ25pZmljYW50IGludmVzdG1lbnQgaGFzIGJlZW4gcHV0CiMgICAgaW50byBa
b3BlLCBhbmQgdGhpcyBlZmZvcnQgd2lsbCBjb250aW51ZSBpZiB0aGUgWm9wZSBjb21tdW5p
dHkKIyAgICBjb250aW51ZXMgdG8gZ3Jvdy4gVGhpcyBpcyBvbmUgd2F5IHRvIGFzc3VyZSB0
aGF0IGdyb3d0aC4KIyAKIyA0LiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIGFuZCBkb2N1
bWVudGF0aW9uIG1lbnRpb25pbmcKIyAgICBmZWF0dXJlcyBkZXJpdmVkIGZyb20gb3IgdXNl
IG9mIHRoaXMgc29mdHdhcmUgbXVzdCBkaXNwbGF5CiMgICAgdGhlIGZvbGxvd2luZyBhY2tu
b3dsZWRnZW1lbnQ6CiMgCiMgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJl
IGRldmVsb3BlZCBieSBEaWdpdGFsIENyZWF0aW9ucwojICAgICAgZm9yIHVzZSBpbiB0aGUg
WiBPYmplY3QgUHVibGlzaGluZyBFbnZpcm9ubWVudAojICAgICAgKGh0dHA6Ly93d3cuem9w
ZS5vcmcvKS4iCiMgCiMgICAgSW4gdGhlIGV2ZW50IHRoYXQgdGhlIHByb2R1Y3QgYmVpbmcg
YWR2ZXJ0aXNlZCBpbmNsdWRlcyBhbgojICAgIGludGFjdCBab3BlIGRpc3RyaWJ1dGlvbiAo
d2l0aCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5jbHVkZWQpCiMgICAgdGhlbiB0aGlzIGNs
YXVzZSBpcyB3YWl2ZWQuCiMgCiMgNS4gTmFtZXMgYXNzb2NpYXRlZCB3aXRoIFpvcGUgb3Ig
RGlnaXRhbCBDcmVhdGlvbnMgbXVzdCBub3QgYmUgdXNlZCB0bwojICAgIGVuZG9yc2Ugb3Ig
cHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CiMg
ICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIGZyb20gRGlnaXRhbCBDcmVhdGlvbnMuCiMg
CiMgNi4gTW9kaWZpZWQgcmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIg
bXVzdCByZXRhaW4KIyAgICB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgojIAojICAg
ICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgRGlnaXRh
bCBDcmVhdGlvbnMKIyAgICAgIGZvciB1c2UgaW4gdGhlIFogT2JqZWN0IFB1Ymxpc2hpbmcg
RW52aXJvbm1lbnQKIyAgICAgIChodHRwOi8vd3d3LnpvcGUub3JnLykuIgojIAojICAgIElu
dGFjdCAocmUtKWRpc3RyaWJ1dGlvbnMgb2YgYW55IG9mZmljaWFsIFpvcGUgcmVsZWFzZSBk
byBub3QKIyAgICByZXF1aXJlIGFuIGV4dGVybmFsIGFja25vd2xlZGdlbWVudC4KIyAKIyA3
LiBNb2RpZmljYXRpb25zIGFyZSBlbmNvdXJhZ2VkIGJ1dCBtdXN0IGJlIHBhY2thZ2VkIHNl
cGFyYXRlbHkgYXMKIyAgICBwYXRjaGVzIHRvIG9mZmljaWFsIFpvcGUgcmVsZWFzZXMuICBE
aXN0cmlidXRpb25zIHRoYXQgZG8gbm90CiMgICAgY2xlYXJseSBzZXBhcmF0ZSB0aGUgcGF0
Y2hlcyBmcm9tIHRoZSBvcmlnaW5hbCB3b3JrIG11c3QgYmUgY2xlYXJseQojICAgIGxhYmVs
ZWQgYXMgdW5vZmZpY2lhbCBkaXN0cmlidXRpb25zLiAgTW9kaWZpY2F0aW9ucyB3aGljaCBk
byBub3QKIyAgICBjYXJyeSB0aGUgbmFtZSBab3BlIG1heSBiZSBwYWNrYWdlZCBpbiBhbnkg
Zm9ybSwgYXMgbG9uZyBhcyB0aGV5CiMgICAgY29uZm9ybSB0byBhbGwgb2YgdGhlIGNsYXVz
ZXMgYWJvdmUuCiMgCiMgCiMgRGlzY2xhaW1lcgojIAojICAgVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBESUdJVEFMIENSRUFUSU9OUyBgYEFTIElTJycgQU5EIEFOWQojICAgRVhQ
UkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQojICAgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCiMgICBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgRElHSVRBTCBDUkVBVElPTlMgT1IgSVRTCiMgICBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwKIyAgIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QKIyAgIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKIyAgIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKIyAg
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLAojICAgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCiMgICBPRiBUSEUgVVNFIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKIyAgIFNV
Q0ggREFNQUdFLgojIAojIAojIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2YgY29udHJpYnV0
aW9ucyBtYWRlIGJ5IERpZ2l0YWwgQ3JlYXRpb25zIGFuZAojIG1hbnkgaW5kaXZpZHVhbHMg
b24gYmVoYWxmIG9mIERpZ2l0YWwgQ3JlYXRpb25zLiAgU3BlY2lmaWMKIyBhdHRyaWJ1dGlv
bnMgYXJlIGxpc3RlZCBpbiB0aGUgYWNjb21wYW55aW5nIGNyZWRpdHMgZmlsZS4KIyAKIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoiIiJGb2xkZXIgb2JqZWN0CgpGb2xkZXJzIGFyZSB0
aGUgYmFzaWMgY29udGFpbmVyIG9iamVjdHMgYW5kIGFyZSBhbmFsb2dvdXMgdG8gZGlyZWN0
b3JpZXMuCgokSWQ6IEZvbGRlci5weSx2IDEuODIgMTk5OS8wNy8wNSAxNDo0NDo0OSBqaW0g
RXhwICQiIiIKCl9fdmVyc2lvbl9fPSckUmV2aXNpb246IDEuODIgJCdbMTE6LTJdCgppbXBv
cnQgR2xvYmFscywgU2ltcGxlSXRlbQpmcm9tIE9iamVjdE1hbmFnZXIgaW1wb3J0IE9iamVj
dE1hbmFnZXIKZnJvbSBQcm9wZXJ0eU1hbmFnZXIgaW1wb3J0IFByb3BlcnR5TWFuYWdlcgpm
cm9tIEFjY2Vzc0NvbnRyb2wuUm9sZSBpbXBvcnQgUm9sZU1hbmFnZXIKZnJvbSB3ZWJkYXYu
Q29sbGVjdGlvbiBpbXBvcnQgQ29sbGVjdGlvbgpmcm9tIEZpbmRTdXBwb3J0IGltcG9ydCBG
aW5kU3VwcG9ydApmcm9tIEdsb2JhbHMgaW1wb3J0IEhUTUxGaWxlCgoKCm1hbmFnZV9hZGRG
b2xkZXJGb3JtPUhUTUxGaWxlKCdmb2xkZXJBZGQnLCBnbG9iYWxzKCkpCgpkZWYgbWFuYWdl
X2FkZEZvbGRlcihzZWxmLCBpZCwgdGl0bGU9JycsCiAgICAgICAgICAgICAgICAgICAgIGNy
ZWF0ZVB1YmxpYz0wLAogICAgICAgICAgICAgICAgICAgICBjcmVhdGVVc2VyRj0wLAogICAg
ICAgICAgICAgICAgICAgICBSRVFVRVNUPU5vbmUpOgogICAgIiIiQWRkIGEgbmV3IEZvbGRl
ciBvYmplY3Qgd2l0aCBpZCAqaWQqLgoKICAgIElmIHRoZSAnY3JlYXRlUHVibGljJyBhbmQg
J2NyZWF0ZVVzZXJGJyBwYXJhbWV0ZXJzIGFyZSBzZXQgdG8gYW55IHRydWUKICAgIHZhbHVl
LCBhbiAnaW5kZXhfaHRtbCcgYW5kIGEgJ1VzZXJGb2xkZXInIG9iamVjdHMgYXJlIGNyZWF0
ZWQgcmVzcGVjdGl2ZWx5CiAgICBpbiB0aGUgbmV3IGZvbGRlci4KICAgICIiIgogICAgb2I9
Rm9sZGVyKCkKICAgIG9iLmlkPWlkCiAgICBvYi50aXRsZT10aXRsZQogICAgc2VsZi5fc2V0
T2JqZWN0KGlkLCBvYikKICAgIHRyeTogdXNlcj1SRVFVRVNUWydBVVRIRU5USUNBVEVEX1VT
RVInXQogICAgZXhjZXB0OiB1c2VyPU5vbmUKICAgIGlmIGNyZWF0ZVVzZXJGOgogICAgICAg
IGlmICh1c2VyIGlzIG5vdCBOb25lKSBhbmQgbm90ICgKICAgICAgICAgICAgdXNlci5oYXNf
cGVybWlzc2lvbignQWRkIFVzZXIgRm9sZGVycycsIHNlbGYpKToKICAgICAgICAgICAgcmFp
c2UgJ1VuYXV0aG9yaXplZCcsICgKICAgICAgICAgICAgICAgICAgJ1lvdSBhcmUgbm90IGF1
dGhvcml6ZWQgdG8gYWRkIFVzZXIgRm9sZGVycy4nCiAgICAgICAgICAgICAgICAgICkKICAg
ICAgICBvYi5tYW5hZ2VfYWRkVXNlckZvbGRlcigpCiAgICBpZiBjcmVhdGVQdWJsaWM6CiAg
ICAgICAgaWYgKHVzZXIgaXMgbm90IE5vbmUpIGFuZCBub3QgKAogICAgICAgICAgICB1c2Vy
Lmhhc19wZXJtaXNzaW9uKCdBZGQgRG9jdW1lbnRzLCBJbWFnZXMsIGFuZCBGaWxlcycsIHNl
bGYpKToKICAgICAgICAgICAgcmFpc2UgJ1VuYXV0aG9yaXplZCcsICgKICAgICAgICAgICAg
ICAgICAgJ1lvdSBhcmUgbm90IGF1dGhvcml6ZWQgdG8gYWRkIERUTUwgRG9jdW1lbnRzLicK
ICAgICAgICAgICAgICAgICAgKQogICAgICAgIG9iLm1hbmFnZV9hZGREVE1MRG9jdW1lbnQo
aWQ9J2luZGV4X2h0bWwnLCB0aXRsZT0nJykKICAgIGlmIFJFUVVFU1QgaXMgbm90IE5vbmU6
CiAgICAgICAgcmV0dXJuIHNlbGYubWFuYWdlX21haW4oc2VsZiwgUkVRVUVTVCwgdXBkYXRl
X21lbnU9MSkKCgoKY2xhc3MgRm9sZGVyKE9iamVjdE1hbmFnZXIsIFByb3BlcnR5TWFuYWdl
ciwgUm9sZU1hbmFnZXIsIENvbGxlY3Rpb24sCiAgICAgICAgICAgICBTaW1wbGVJdGVtLkl0
ZW0sIEZpbmRTdXBwb3J0KToKICAgICIiIgogICAgVGhlIGJhc2ljIGNvbnRhaW5lciBvYmpl
Y3QgaW4gUHJpbmNpcGlhLiAgRm9sZGVycyBjYW4gaG9sZCBhbG1vc3QgYWxsCiAgICBvdGhl
ciBQcmluY2lwaWEgb2JqZWN0cy4KICAgICIiIgogICAgbWV0YV90eXBlPSdGb2xkZXInCgog
ICAgX3Byb3BlcnRpZXM9KHsnaWQnOid0aXRsZScsICd0eXBlJzogJ3N0cmluZyd9LCkKCiAg
ICBtYW5hZ2Vfb3B0aW9ucz0oCiAgICAgICAgeydsYWJlbCc6J0NvbnRlbnRzJywgJ2FjdGlv
bic6J21hbmFnZV9tYWluJ30sCiAgICAgICAgeydsYWJlbCc6J1ZpZXcnLCAnYWN0aW9uJzon
aW5kZXhfaHRtbCd9LAogICAgICAgIHsnbGFiZWwnOidQcm9wZXJ0aWVzJywgJ2FjdGlvbic6
J21hbmFnZV9wcm9wZXJ0aWVzRm9ybSd9LAogICAgICAgIHsnbGFiZWwnOidJbXBvcnQvRXhw
b3J0JywgJ2FjdGlvbic6J21hbmFnZV9pbXBvcnRFeHBvcnRGb3JtJ30sCiAgICAgICAgeyds
YWJlbCc6J1NlY3VyaXR5JywgJ2FjdGlvbic6J21hbmFnZV9hY2Nlc3MnfSwKICAgICAgICB7
J2xhYmVsJzonVW5kbycsICdhY3Rpb24nOidtYW5hZ2VfVW5kb0Zvcm0nfSwKICAgICAgICB7
J2xhYmVsJzonRmluZCcsICdhY3Rpb24nOidtYW5hZ2VfZmluZEZyYW1lJywgJ3RhcmdldCc6
J21hbmFnZV9tYWluJ30sCiAgICApCgogICAgX19hY19wZXJtaXNzaW9uc19fPSgoJ1JlYXJy
YW5nZSBvYmplY3RzJywgICAgICgnbWFuYWdlX2ZpcnN0JywpKSwpCiAgICAKICAgIGRlZiBt
YW5hZ2VfZmlyc3Qoc2VsZiwgaWRzPVtdLCBSRVFVRVNUPU5vbmUpOgogICAgICAgICIiIk1h
a2Ugc29tZSBvYmplY3RzIGZpcnN0IiIiCiAgICAgICAgb2JqZWN0cz1zZWxmLl9vYmplY3Rz
CiAgICAgICAgaWYgbm90IGlkczoKICAgICAgICAgICAgbWVzc2FnZT0iTm8gb2JqZWN0cyB3
ZXJlIHNlbGVjdGVkIHRvIGJlIG1hZGUgZmlyc3QuIgogICAgICAgIGVsaWYgbGVuKGlkcyk9
PWxlbihvYmplY3RzKToKICAgICAgICAgICAgbWVzc2FnZT0iTWFraW5nIGFsbCBvYmplY3Rz
IGZpcnN0IGhhcyBubyBlZmZlY3QuIgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG9iamVj
dHM9c2VsZi5fb2JqZWN0cwogICAgICAgICAgICBvYmplY3RzPXR1cGxlKAogICAgICAgICAg
ICAgICAgZmlsdGVyKGxhbWJkYSBvYmplY3QsIGlkcz1pZHM6CiAgICAgICAgICAgICAgICAg
ICAgICAgb2JqZWN0WydpZCddIGluIGlkcywKICAgICAgICAgICAgICAgICAgICAgICBvYmpl
Y3RzKQogICAgICAgICAgICAgICAgKwogICAgICAgICAgICAgICAgZmlsdGVyKGxhbWJkYSBv
YmplY3QsIGlkcz1pZHM6CiAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0WydpZCddIG5v
dCBpbiBpZHMsCiAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cykKICAgICAgICAgICAg
ICAgICkKICAgICAgICAgICAgc2VsZi5fb2JqZWN0cyA9IG9iamVjdHMKICAgICAgICAgICAg
bWVzc2FnZT0iT2JqZWN0cyB3ZXJlIHJlYXJyYW5nZWQgYXMgcmVxdWVzdGVkLiIKCiAgICAg
ICAgaWYgUkVRVUVTVCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubWFu
YWdlX21haW4oCiAgICAgICAgICAgICAgICBzZWxmLCBSRVFVRVNULCBtYW5hZ2VfdGFic19t
ZXNzYWdlPW1lc3NhZ2UpCgpHbG9iYWxzLmRlZmF1bHRfX2NsYXNzX2luaXRfXyhGb2xkZXIp
Cg==
--------------1B26FC3C2460802D5DB22E94--