From kmayilsa at redhat.com Fri Nov 29 03:16:13 2013 Content-Type: multipart/mixed; boundary="===============1834468307727887980==" MIME-Version: 1.0 From: Kanagaraj To: devel at ovirt.org Subject: [Engine-devel] Using config values Date: Fri, 29 Nov 2013 13:46:08 +0530 Message-ID: <52984D48.1070009@redhat.com> --===============1834468307727887980== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable This is a multi-part message in MIME format. --------------050008020702070900040001 Content-Type: text/plain; charset=3DISO-8859-1; format=3Dflowed Content-Transfer-Encoding: 7bit Hi All, The are some issues arising in configurations whenever we move up on the = versions(3.3 =3D> 3.4), because of the way we store and interpret them. Whenever there is a new cluster level, you will need to add a new entry = for all(most) of the configuration. Mostly a copy paste if you see from = 3.2 to 3.3, except some CPU/PM type related configurations. Better option would be to have the defaul config value in = ConfigValues.java and the overrides will go to config.sql. In this = approach you don't need a new entries to config.sql when there is a new = cluster level. Lets take an exmaple, "SupportForceCreateVG" - This is supported from = 3.1 onwards, If you look at config.sql, you will see following entries select fn_db_add_config_value('SupportForceCreateVG','false','3.0'); select fn_db_add_config_value('SupportForceCreateVG','true','3.1'); select fn_db_add_config_value('SupportForceCreateVG','true','3.2'); select fn_db_add_config_value('SupportForceCreateVG','true','3.3'); And in ConfigValues.java @TypeConverterAttribute(Boolean.class) @DefaultValueAttribute("false") SupportForceCreateVG, Now if there is 3.4 and 3.5, the user needs to add 2 more entries, which = i feel is redundant. Instead we can make @TypeConverterAttribute(Boolean.class) @DefaultValueAttribute("true") SupportForceCreateVG, and have only the following in config.sql select fn_db_add_config_value('SupportForceCreateVG','false','3.0'); if a particular value(for a specific cluster level) is not found in = Config.sql, the fallback is to use the value available in ConfigValues.java. Please share your thoughts on this. Thanks, Kanagaraj --------------050008020702070900040001 Content-Type: text/html; charset=3DISO-8859-1 Content-Transfer-Encoding: 7bit Hi All,

The are some issues arising in configurations whenever we move up on the versions(3.3 =3D> 3.4), because of the way we store and interpret them.

Whenever there is a new cluster level, you will need to add a new entry for all(most) of the configuration. Mostly a copy paste if you see from 3.2 to 3.3, except some CPU/PM type related configurations.
Better option would be to have the defaul config value in ConfigValues.java and the overrides will go to config.sql. In this approach you don't need a new entries to config.sql when there is a new cluster level.

Lets take an exmaple, "SupportForceCreateVG" - This is supported from 3.1 onwards,

If you look at config.sql, you will see following entries
select fn_db_add_config_value('SupportForceCreateVG','false','3.0');
select fn_db_add_config_value('SupportForceCreateVG','true','3.1');
select fn_db_add_config_value('SupportForceCreateVG','true','3.2');
select fn_db_add_config_value('SupportForceCreateVG','true','3.3');

And in ConfigValues.java

    @TypeConverterAttribute(Boolean.class)
    @DefaultValueAttribute("false")
    SupportForceCreateVG,

Now if there is 3.4 and 3.5, the user needs to add 2 more entries, which i feel is redundant.

Instead we can make

    @TypeConverterAttribute(Boolean.class)
    @DefaultValueAttribute("true")
    SupportForceCreateVG,

and have only the following in config.sql
select fn_db_add_config_value('SupportForceCreateVG','false','3.0');

if a particular value(for a specific cluster level) is not found in Config.sql, the fallback is to use the value available in ConfigValues.java.

Please share your thoughts on this.

Thanks,
Kanagaraj

--------------050008020702070900040001-- --===============1834468307727887980== Content-Type: multipart/alternative MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.bin" VGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KLS0tLS0tLS0tLS0t LS0wNTAwMDgwMjA3MDIwNzA5MDAwNDAwMDEKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFy c2V0PUlTTy04ODU5LTE7IGZvcm1hdD1mbG93ZWQKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzog N2JpdAoKSGkgQWxsLAoKVGhlIGFyZSBzb21lIGlzc3VlcyBhcmlzaW5nIGluIGNvbmZpZ3VyYXRp b25zIHdoZW5ldmVyIHdlIG1vdmUgdXAgb24gdGhlIAp2ZXJzaW9ucygzLjMgPT4gMy40KSwgYmVj YXVzZSBvZiB0aGUgd2F5IHdlIHN0b3JlIGFuZCBpbnRlcnByZXQgdGhlbS4KCldoZW5ldmVyIHRo ZXJlIGlzIGEgbmV3IGNsdXN0ZXIgbGV2ZWwsIHlvdSB3aWxsIG5lZWQgdG8gYWRkIGEgbmV3IGVu dHJ5IApmb3IgYWxsKG1vc3QpIG9mIHRoZSBjb25maWd1cmF0aW9uLiBNb3N0bHkgYSBjb3B5IHBh c3RlIGlmIHlvdSBzZWUgZnJvbSAKMy4yIHRvIDMuMywgZXhjZXB0IHNvbWUgQ1BVL1BNIHR5cGUg cmVsYXRlZCBjb25maWd1cmF0aW9ucy4KQmV0dGVyIG9wdGlvbiB3b3VsZCBiZSB0byBoYXZlIHRo ZSBkZWZhdWwgY29uZmlnIHZhbHVlIGluIApDb25maWdWYWx1ZXMuamF2YSBhbmQgdGhlIG92ZXJy aWRlcyB3aWxsIGdvIHRvIGNvbmZpZy5zcWwuIEluIHRoaXMgCmFwcHJvYWNoIHlvdSBkb24ndCBu ZWVkIGEgbmV3IGVudHJpZXMgdG8gY29uZmlnLnNxbCB3aGVuIHRoZXJlIGlzIGEgbmV3IApjbHVz dGVyIGxldmVsLgoKTGV0cyB0YWtlIGFuIGV4bWFwbGUsICJTdXBwb3J0Rm9yY2VDcmVhdGVWRyIg LSBUaGlzIGlzIHN1cHBvcnRlZCBmcm9tIAozLjEgb253YXJkcywKCklmIHlvdSBsb29rIGF0IGNv bmZpZy5zcWwsIHlvdSB3aWxsIHNlZSBmb2xsb3dpbmcgZW50cmllcwpzZWxlY3QgZm5fZGJfYWRk X2NvbmZpZ192YWx1ZSgnU3VwcG9ydEZvcmNlQ3JlYXRlVkcnLCdmYWxzZScsJzMuMCcpOwpzZWxl Y3QgZm5fZGJfYWRkX2NvbmZpZ192YWx1ZSgnU3VwcG9ydEZvcmNlQ3JlYXRlVkcnLCd0cnVlJywn My4xJyk7CnNlbGVjdCBmbl9kYl9hZGRfY29uZmlnX3ZhbHVlKCdTdXBwb3J0Rm9yY2VDcmVhdGVW RycsJ3RydWUnLCczLjInKTsKc2VsZWN0IGZuX2RiX2FkZF9jb25maWdfdmFsdWUoJ1N1cHBvcnRG b3JjZUNyZWF0ZVZHJywndHJ1ZScsJzMuMycpOwoKQW5kIGluIENvbmZpZ1ZhbHVlcy5qYXZhCgog ICAgIEBUeXBlQ29udmVydGVyQXR0cmlidXRlKEJvb2xlYW4uY2xhc3MpCiAgICAgQERlZmF1bHRW YWx1ZUF0dHJpYnV0ZSgiZmFsc2UiKQogICAgIFN1cHBvcnRGb3JjZUNyZWF0ZVZHLAoKTm93IGlm IHRoZXJlIGlzIDMuNCBhbmQgMy41LCB0aGUgdXNlciBuZWVkcyB0byBhZGQgMiBtb3JlIGVudHJp ZXMsIHdoaWNoIAppIGZlZWwgaXMgcmVkdW5kYW50LgoKSW5zdGVhZCB3ZSBjYW4gbWFrZQoKICAg ICBAVHlwZUNvbnZlcnRlckF0dHJpYnV0ZShCb29sZWFuLmNsYXNzKQogICAgIEBEZWZhdWx0VmFs dWVBdHRyaWJ1dGUoInRydWUiKQogICAgIFN1cHBvcnRGb3JjZUNyZWF0ZVZHLAoKYW5kIGhhdmUg b25seSB0aGUgZm9sbG93aW5nIGluIGNvbmZpZy5zcWwKc2VsZWN0IGZuX2RiX2FkZF9jb25maWdf dmFsdWUoJ1N1cHBvcnRGb3JjZUNyZWF0ZVZHJywnZmFsc2UnLCczLjAnKTsKCmlmIGEgcGFydGlj dWxhciB2YWx1ZShmb3IgYSBzcGVjaWZpYyBjbHVzdGVyIGxldmVsKSBpcyBub3QgZm91bmQgaW4g CkNvbmZpZy5zcWwsIHRoZSBmYWxsYmFjayBpcyB0byB1c2UgdGhlIHZhbHVlIGF2YWlsYWJsZSBp biBDb25maWdWYWx1ZXMuamF2YS4KClBsZWFzZSBzaGFyZSB5b3VyIHRob3VnaHRzIG9uIHRoaXMu CgpUaGFua3MsCkthbmFnYXJhagoKCi0tLS0tLS0tLS0tLS0tMDUwMDA4MDIwNzAyMDcwOTAwMDQw MDAxCkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEKQ29udGVudC1U cmFuc2Zlci1FbmNvZGluZzogN2JpdAoKPGh0bWw+CiAgPGhlYWQ+CgogICAgPG1ldGEgaHR0cC1l cXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTkt MSI+CiAgPC9oZWFkPgogIDxib2R5IGJnY29sb3I9IiNGRkZGRkYiIHRleHQ9IiMwMDAwMDAiPgog ICAgSGkgQWxsLDxicj4KICAgIDxicj4KICAgIFRoZSBhcmUgc29tZSBpc3N1ZXMgYXJpc2luZyBp biBjb25maWd1cmF0aW9ucyB3aGVuZXZlciB3ZSBtb3ZlIHVwIG9uCiAgICB0aGUgdmVyc2lvbnMo My4zID0mZ3Q7IDMuNCksIGJlY2F1c2Ugb2YgdGhlIHdheSB3ZSBzdG9yZSBhbmQKICAgIGludGVy cHJldCB0aGVtLjxicj4KICAgIDxicj4KICAgIFdoZW5ldmVyIHRoZXJlIGlzIGEgbmV3IGNsdXN0 ZXIgbGV2ZWwsIHlvdSB3aWxsIG5lZWQgdG8gYWRkIGEgbmV3CiAgICBlbnRyeSBmb3IgYWxsKG1v c3QpIG9mIHRoZSBjb25maWd1cmF0aW9uLiBNb3N0bHkgYSBjb3B5IHBhc3RlIGlmIHlvdQogICAg c2VlIGZyb20gMy4yIHRvIDMuMywgZXhjZXB0IHNvbWUgQ1BVL1BNIHR5cGUgcmVsYXRlZCBjb25m aWd1cmF0aW9ucy48YnI+CiAgICBCZXR0ZXIgb3B0aW9uIHdvdWxkIGJlIHRvIGhhdmUgdGhlIGRl ZmF1bCBjb25maWcgdmFsdWUgaW4KICAgIENvbmZpZ1ZhbHVlcy5qYXZhIGFuZCB0aGUgb3ZlcnJp ZGVzIHdpbGwgZ28gdG8gY29uZmlnLnNxbC4gSW4gdGhpcwogICAgYXBwcm9hY2ggeW91IGRvbid0 IG5lZWQgYSBuZXcgZW50cmllcyB0byBjb25maWcuc3FsIHdoZW4gdGhlcmUgaXMgYQogICAgbmV3 IGNsdXN0ZXIgbGV2ZWwuPGJyPgogICAgPGJyPgogICAgTGV0cyB0YWtlIGFuIGV4bWFwbGUsICJT dXBwb3J0Rm9yY2VDcmVhdGVWRyIgLSBUaGlzIGlzIHN1cHBvcnRlZAogICAgZnJvbSAzLjEgb253 YXJkcyw8YnI+CiAgICA8YnI+CiAgICBJZiB5b3UgbG9vayBhdCBjb25maWcuc3FsLCB5b3Ugd2ls bCBzZWUgZm9sbG93aW5nIGVudHJpZXMgPGJyPgogICAgc2VsZWN0IGZuX2RiX2FkZF9jb25maWdf dmFsdWUoJ1N1cHBvcnRGb3JjZUNyZWF0ZVZHJywnZmFsc2UnLCczLjAnKTsKICAgIDxicj4KICAg IHNlbGVjdCBmbl9kYl9hZGRfY29uZmlnX3ZhbHVlKCdTdXBwb3J0Rm9yY2VDcmVhdGVWRycsJ3Ry dWUnLCczLjEnKTsKICAgIDxicj4KICAgIHNlbGVjdCBmbl9kYl9hZGRfY29uZmlnX3ZhbHVlKCdT dXBwb3J0Rm9yY2VDcmVhdGVWRycsJ3RydWUnLCczLjInKTsKICAgIDxicj4KICAgIHNlbGVjdCBm bl9kYl9hZGRfY29uZmlnX3ZhbHVlKCdTdXBwb3J0Rm9yY2VDcmVhdGVWRycsJ3RydWUnLCczLjMn KTs8YnI+CiAgICA8YnI+CiAgICBBbmQgaW4gQ29uZmlnVmFsdWVzLmphdmE8YnI+CiAgICA8YnI+ CiAgICAmbmJzcDsmbmJzcDsmbmJzcDsgQFR5cGVDb252ZXJ0ZXJBdHRyaWJ1dGUoQm9vbGVhbi5j bGFzcyk8YnI+CiAgICAmbmJzcDsmbmJzcDsmbmJzcDsgQERlZmF1bHRWYWx1ZUF0dHJpYnV0ZSgi ZmFsc2UiKTxicj4KICAgICZuYnNwOyZuYnNwOyZuYnNwOyBTdXBwb3J0Rm9yY2VDcmVhdGVWRyw8 YnI+CiAgICA8YnI+CiAgICBOb3cgaWYgdGhlcmUgaXMgMy40IGFuZCAzLjUsIHRoZSB1c2VyIG5l ZWRzIHRvIGFkZCAyIG1vcmUgZW50cmllcywKICAgIHdoaWNoIGkgZmVlbCBpcyByZWR1bmRhbnQu PGJyPgogICAgPGJyPgogICAgSW5zdGVhZCB3ZSBjYW4gbWFrZSA8YnI+CiAgICA8YnI+CiAgICAm bmJzcDsmbmJzcDsmbmJzcDsgQFR5cGVDb252ZXJ0ZXJBdHRyaWJ1dGUoQm9vbGVhbi5jbGFzcyk8 YnI+CiAgICAmbmJzcDsmbmJzcDsmbmJzcDsgQERlZmF1bHRWYWx1ZUF0dHJpYnV0ZSgidHJ1ZSIp PGJyPgogICAgJm5ic3A7Jm5ic3A7Jm5ic3A7IFN1cHBvcnRGb3JjZUNyZWF0ZVZHLDxicj4KICAg IDxicj4KICAgIGFuZCBoYXZlIG9ubHkgdGhlIGZvbGxvd2luZyBpbiBjb25maWcuc3FsPGJyPgog ICAgc2VsZWN0IGZuX2RiX2FkZF9jb25maWdfdmFsdWUoJ1N1cHBvcnRGb3JjZUNyZWF0ZVZHJywn ZmFsc2UnLCczLjAnKTs8YnI+CiAgICA8YnI+CiAgICBpZiBhIHBhcnRpY3VsYXIgdmFsdWUoZm9y IGEgc3BlY2lmaWMgY2x1c3RlciBsZXZlbCkgaXMgbm90IGZvdW5kIGluCiAgICBDb25maWcuc3Fs LCB0aGUgZmFsbGJhY2sgaXMgdG8gdXNlIHRoZSB2YWx1ZSBhdmFpbGFibGUgaW4KICAgIENvbmZp Z1ZhbHVlcy5qYXZhLjxicj4KICAgIDxicj4KICAgIFBsZWFzZSBzaGFyZSB5b3VyIHRob3VnaHRz IG9uIHRoaXMuPGJyPgogICAgPGJyPgogICAgVGhhbmtzLDxicj4KICAgIEthbmFnYXJhajxicj4K ICAgIDxicj4KICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4 dC9odG1sOwogICAgICBjaGFyc2V0PUlTTy04ODU5LTEiPgogIDwvYm9keT4KPC9odG1sPgoKLS0t LS0tLS0tLS0tLS0wNTAwMDgwMjA3MDIwNzA5MDAwNDAwMDEtLQo= --===============1834468307727887980==-- From sabose at redhat.com Fri Nov 29 04:06:36 2013 Content-Type: multipart/mixed; boundary="===============7759334009555552658==" MIME-Version: 1.0 From: Sahina Bose To: devel at ovirt.org Subject: Re: [Engine-devel] Using config values Date: Fri, 29 Nov 2013 14:36:33 +0530 Message-ID: <52985919.2050109@redhat.com> In-Reply-To: 52984D48.1070009@redhat.com --===============7759334009555552658== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable This is a multi-part message in MIME format. --------------060202090604020609010600 Content-Type: text/plain; charset=3DISO-8859-1; format=3Dflowed Content-Transfer-Encoding: 7bit On 11/29/2013 01:46 PM, Kanagaraj wrote: > Hi All, > > The are some issues arising in configurations whenever we move up on = > the versions(3.3 =3D> 3.4), because of the way we store and interpret the= m. > > Whenever there is a new cluster level, you will need to add a new = > entry for all(most) of the configuration. Mostly a copy paste if you = > see from 3.2 to 3.3, except some CPU/PM type related configurations. > Better option would be to have the defaul config value in = > ConfigValues.java and the overrides will go to config.sql. In this = > approach you don't need a new entries to config.sql when there is a = > new cluster level. > > Lets take an exmaple, "SupportForceCreateVG" - This is supported from = > 3.1 onwards, > > If you look at config.sql, you will see following entries > select fn_db_add_config_value('SupportForceCreateVG','false','3.0'); > select fn_db_add_config_value('SupportForceCreateVG','true','3.1'); > select fn_db_add_config_value('SupportForceCreateVG','true','3.2'); > select fn_db_add_config_value('SupportForceCreateVG','true','3.3'); > > And in ConfigValues.java > > @TypeConverterAttribute(Boolean.class) > @DefaultValueAttribute("false") > SupportForceCreateVG, > > Now if there is 3.4 and 3.5, the user needs to add 2 more entries, = > which i feel is redundant. > > Instead we can make > > @TypeConverterAttribute(Boolean.class) > @DefaultValueAttribute("true") > SupportForceCreateVG, > > and have only the following in config.sql > select fn_db_add_config_value('SupportForceCreateVG','false','3.0'); > > if a particular value(for a specific cluster level) is not found in = > Config.sql, the fallback is to use the value available in = > ConfigValues.java. > > Please share your thoughts on this. +1 > > Thanks, > Kanagaraj > > > > _______________________________________________ > Engine-devel mailing list > Engine-devel(a)ovirt.org > http://lists.ovirt.org/mailman/listinfo/engine-devel --------------060202090604020609010600 Content-Type: text/html; charset=3DISO-8859-1 Content-Transfer-Encoding: 7bit
On 11/29/2013 01:46 PM, Kanagaraj wrote:
Hi All,

The are some issues arising in configurations whenever we move up on the versions(3.3 =3D> 3.4), because of the way we store and interpret them.

Whenever there is a new cluster level, you will need to add a new entry for all(most) of the configuration. Mostly a copy paste if you see from 3.2 to 3.3, except some CPU/PM type related configurations.
Better option would be to have the defaul config value in ConfigValues.java and the overrides will go to config.sql. In this approach you don't need a new entries to config.sql when there is a new cluster level.

Lets take an exmaple, "SupportForceCreateVG" - This is supported from 3.1 onwards,

If you look at config.sql, you will see following entries
select fn_db_add_config_value('SupportForceCreateVG','false','3.0');
select fn_db_add_config_value('SupportForceCreateVG','true','3.1');
select fn_db_add_config_value('SupportForceCreateVG','true','3.2');
select fn_db_add_config_value('SupportForceCreateVG','true','3.3');

And in ConfigValues.java

    @TypeConverterAttribute(Boolean.class)
    @DefaultValueAttribute("false")
    SupportForceCreateVG,

Now if there is 3.4 and 3.5, the user needs to add 2 more entries, which i feel is redundant.

Instead we can make

    @TypeConverterAttribute(Boolean.class)
    @DefaultValueAttribute("true")
    SupportForceCreateVG,

and have only the following in config.sql
select fn_db_add_config_value('SupportForceCreateVG','false','3.0');

if a particular value(for a specific cluster level) is not found in Config.sql, the fallback is to use the value available in ConfigValues.java.

Please share your thoughts on this.

+1

<= br> Thanks,
Kanagaraj



_______________________________________________
Engine-devel mailing list
Engine-devel(a)ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-devel<=
/a>

--------------060202090604020609010600-- --===============7759334009555552658== Content-Type: multipart/alternative MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.bin" VGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KLS0tLS0tLS0tLS0t LS0wNjAyMDIwOTA2MDQwMjA2MDkwMTA2MDAKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFy c2V0PUlTTy04ODU5LTE7IGZvcm1hdD1mbG93ZWQKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzog N2JpdAoKCk9uIDExLzI5LzIwMTMgMDE6NDYgUE0sIEthbmFnYXJhaiB3cm90ZToKPiBIaSBBbGws Cj4KPiBUaGUgYXJlIHNvbWUgaXNzdWVzIGFyaXNpbmcgaW4gY29uZmlndXJhdGlvbnMgd2hlbmV2 ZXIgd2UgbW92ZSB1cCBvbiAKPiB0aGUgdmVyc2lvbnMoMy4zID0+IDMuNCksIGJlY2F1c2Ugb2Yg dGhlIHdheSB3ZSBzdG9yZSBhbmQgaW50ZXJwcmV0IHRoZW0uCj4KPiBXaGVuZXZlciB0aGVyZSBp cyBhIG5ldyBjbHVzdGVyIGxldmVsLCB5b3Ugd2lsbCBuZWVkIHRvIGFkZCBhIG5ldyAKPiBlbnRy eSBmb3IgYWxsKG1vc3QpIG9mIHRoZSBjb25maWd1cmF0aW9uLiBNb3N0bHkgYSBjb3B5IHBhc3Rl IGlmIHlvdSAKPiBzZWUgZnJvbSAzLjIgdG8gMy4zLCBleGNlcHQgc29tZSBDUFUvUE0gdHlwZSBy ZWxhdGVkIGNvbmZpZ3VyYXRpb25zLgo+IEJldHRlciBvcHRpb24gd291bGQgYmUgdG8gaGF2ZSB0 aGUgZGVmYXVsIGNvbmZpZyB2YWx1ZSBpbiAKPiBDb25maWdWYWx1ZXMuamF2YSBhbmQgdGhlIG92 ZXJyaWRlcyB3aWxsIGdvIHRvIGNvbmZpZy5zcWwuIEluIHRoaXMgCj4gYXBwcm9hY2ggeW91IGRv bid0IG5lZWQgYSBuZXcgZW50cmllcyB0byBjb25maWcuc3FsIHdoZW4gdGhlcmUgaXMgYSAKPiBu ZXcgY2x1c3RlciBsZXZlbC4KPgo+IExldHMgdGFrZSBhbiBleG1hcGxlLCAiU3VwcG9ydEZvcmNl Q3JlYXRlVkciIC0gVGhpcyBpcyBzdXBwb3J0ZWQgZnJvbSAKPiAzLjEgb253YXJkcywKPgo+IElm IHlvdSBsb29rIGF0IGNvbmZpZy5zcWwsIHlvdSB3aWxsIHNlZSBmb2xsb3dpbmcgZW50cmllcwo+ IHNlbGVjdCBmbl9kYl9hZGRfY29uZmlnX3ZhbHVlKCdTdXBwb3J0Rm9yY2VDcmVhdGVWRycsJ2Zh bHNlJywnMy4wJyk7Cj4gc2VsZWN0IGZuX2RiX2FkZF9jb25maWdfdmFsdWUoJ1N1cHBvcnRGb3Jj ZUNyZWF0ZVZHJywndHJ1ZScsJzMuMScpOwo+IHNlbGVjdCBmbl9kYl9hZGRfY29uZmlnX3ZhbHVl KCdTdXBwb3J0Rm9yY2VDcmVhdGVWRycsJ3RydWUnLCczLjInKTsKPiBzZWxlY3QgZm5fZGJfYWRk X2NvbmZpZ192YWx1ZSgnU3VwcG9ydEZvcmNlQ3JlYXRlVkcnLCd0cnVlJywnMy4zJyk7Cj4KPiBB bmQgaW4gQ29uZmlnVmFsdWVzLmphdmEKPgo+ICAgICBAVHlwZUNvbnZlcnRlckF0dHJpYnV0ZShC b29sZWFuLmNsYXNzKQo+ICAgICBARGVmYXVsdFZhbHVlQXR0cmlidXRlKCJmYWxzZSIpCj4gICAg IFN1cHBvcnRGb3JjZUNyZWF0ZVZHLAo+Cj4gTm93IGlmIHRoZXJlIGlzIDMuNCBhbmQgMy41LCB0 aGUgdXNlciBuZWVkcyB0byBhZGQgMiBtb3JlIGVudHJpZXMsIAo+IHdoaWNoIGkgZmVlbCBpcyBy ZWR1bmRhbnQuCj4KPiBJbnN0ZWFkIHdlIGNhbiBtYWtlCj4KPiAgICAgQFR5cGVDb252ZXJ0ZXJB dHRyaWJ1dGUoQm9vbGVhbi5jbGFzcykKPiAgICAgQERlZmF1bHRWYWx1ZUF0dHJpYnV0ZSgidHJ1 ZSIpCj4gICAgIFN1cHBvcnRGb3JjZUNyZWF0ZVZHLAo+Cj4gYW5kIGhhdmUgb25seSB0aGUgZm9s bG93aW5nIGluIGNvbmZpZy5zcWwKPiBzZWxlY3QgZm5fZGJfYWRkX2NvbmZpZ192YWx1ZSgnU3Vw cG9ydEZvcmNlQ3JlYXRlVkcnLCdmYWxzZScsJzMuMCcpOwo+Cj4gaWYgYSBwYXJ0aWN1bGFyIHZh bHVlKGZvciBhIHNwZWNpZmljIGNsdXN0ZXIgbGV2ZWwpIGlzIG5vdCBmb3VuZCBpbiAKPiBDb25m aWcuc3FsLCB0aGUgZmFsbGJhY2sgaXMgdG8gdXNlIHRoZSB2YWx1ZSBhdmFpbGFibGUgaW4gCj4g Q29uZmlnVmFsdWVzLmphdmEuCj4KPiBQbGVhc2Ugc2hhcmUgeW91ciB0aG91Z2h0cyBvbiB0aGlz LgoKKzEKCj4KPiBUaGFua3MsCj4gS2FuYWdhcmFqCj4KPgo+Cj4gX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KPiBFbmdpbmUtZGV2ZWwgbWFpbGluZyBsaXN0 Cj4gRW5naW5lLWRldmVsQG92aXJ0Lm9yZwo+IGh0dHA6Ly9saXN0cy5vdmlydC5vcmcvbWFpbG1h bi9saXN0aW5mby9lbmdpbmUtZGV2ZWwKCgotLS0tLS0tLS0tLS0tLTA2MDIwMjA5MDYwNDAyMDYw OTAxMDYwMApDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xCkNvbnRl bnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKCjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY29u dGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiCiAgICAgIGh0dHAtZXF1aXY9IkNv bnRlbnQtVHlwZSI+CiAgPC9oZWFkPgogIDxib2R5IGJnY29sb3I9IiNGRkZGRkYiIHRleHQ9IiMw MDAwMDAiPgogICAgPGJyPgogICAgPGRpdiBjbGFzcz0ibW96LWNpdGUtcHJlZml4Ij5PbiAxMS8y OS8yMDEzIDAxOjQ2IFBNLCBLYW5hZ2FyYWoKICAgICAgd3JvdGU6PGJyPgogICAgPC9kaXY+CiAg ICA8YmxvY2txdW90ZSBjaXRlPSJtaWQ6NTI5ODRENDguMTA3MDAwOUByZWRoYXQuY29tIiB0eXBl PSJjaXRlIj4KICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0 ZXh0L2h0bWw7CiAgICAgICAgY2hhcnNldD1JU08tODg1OS0xIj4KICAgICAgSGkgQWxsLDxicj4K ICAgICAgPGJyPgogICAgICBUaGUgYXJlIHNvbWUgaXNzdWVzIGFyaXNpbmcgaW4gY29uZmlndXJh dGlvbnMgd2hlbmV2ZXIgd2UgbW92ZSB1cAogICAgICBvbiB0aGUgdmVyc2lvbnMoMy4zID0mZ3Q7 IDMuNCksIGJlY2F1c2Ugb2YgdGhlIHdheSB3ZSBzdG9yZSBhbmQKICAgICAgaW50ZXJwcmV0IHRo ZW0uPGJyPgogICAgICA8YnI+CiAgICAgIFdoZW5ldmVyIHRoZXJlIGlzIGEgbmV3IGNsdXN0ZXIg bGV2ZWwsIHlvdSB3aWxsIG5lZWQgdG8gYWRkIGEgbmV3CiAgICAgIGVudHJ5IGZvciBhbGwobW9z dCkgb2YgdGhlIGNvbmZpZ3VyYXRpb24uIE1vc3RseSBhIGNvcHkgcGFzdGUgaWYKICAgICAgeW91 IHNlZSBmcm9tIDMuMiB0byAzLjMsIGV4Y2VwdCBzb21lIENQVS9QTSB0eXBlIHJlbGF0ZWQKICAg ICAgY29uZmlndXJhdGlvbnMuPGJyPgogICAgICBCZXR0ZXIgb3B0aW9uIHdvdWxkIGJlIHRvIGhh dmUgdGhlIGRlZmF1bCBjb25maWcgdmFsdWUgaW4KICAgICAgQ29uZmlnVmFsdWVzLmphdmEgYW5k IHRoZSBvdmVycmlkZXMgd2lsbCBnbyB0byBjb25maWcuc3FsLiBJbiB0aGlzCiAgICAgIGFwcHJv YWNoIHlvdSBkb24ndCBuZWVkIGEgbmV3IGVudHJpZXMgdG8gY29uZmlnLnNxbCB3aGVuIHRoZXJl IGlzCiAgICAgIGEgbmV3IGNsdXN0ZXIgbGV2ZWwuPGJyPgogICAgICA8YnI+CiAgICAgIExldHMg dGFrZSBhbiBleG1hcGxlLCAiU3VwcG9ydEZvcmNlQ3JlYXRlVkciIC0gVGhpcyBpcyBzdXBwb3J0 ZWQKICAgICAgZnJvbSAzLjEgb253YXJkcyw8YnI+CiAgICAgIDxicj4KICAgICAgSWYgeW91IGxv b2sgYXQgY29uZmlnLnNxbCwgeW91IHdpbGwgc2VlIGZvbGxvd2luZyBlbnRyaWVzIDxicj4KICAg ICAgc2VsZWN0CiAgICAgIGZuX2RiX2FkZF9jb25maWdfdmFsdWUoJ1N1cHBvcnRGb3JjZUNyZWF0 ZVZHJywnZmFsc2UnLCczLjAnKTsgPGJyPgogICAgICBzZWxlY3QKICAgICAgZm5fZGJfYWRkX2Nv bmZpZ192YWx1ZSgnU3VwcG9ydEZvcmNlQ3JlYXRlVkcnLCd0cnVlJywnMy4xJyk7IDxicj4KICAg ICAgc2VsZWN0CiAgICAgIGZuX2RiX2FkZF9jb25maWdfdmFsdWUoJ1N1cHBvcnRGb3JjZUNyZWF0 ZVZHJywndHJ1ZScsJzMuMicpOyA8YnI+CiAgICAgIHNlbGVjdAogICAgICBmbl9kYl9hZGRfY29u ZmlnX3ZhbHVlKCdTdXBwb3J0Rm9yY2VDcmVhdGVWRycsJ3RydWUnLCczLjMnKTs8YnI+CiAgICAg IDxicj4KICAgICAgQW5kIGluIENvbmZpZ1ZhbHVlcy5qYXZhPGJyPgogICAgICA8YnI+CiAgICAg ICZuYnNwOyZuYnNwOyZuYnNwOyBAVHlwZUNvbnZlcnRlckF0dHJpYnV0ZShCb29sZWFuLmNsYXNz KTxicj4KICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7IEBEZWZhdWx0VmFsdWVBdHRyaWJ1dGUoImZh bHNlIik8YnI+CiAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyBTdXBwb3J0Rm9yY2VDcmVhdGVWRyw8 YnI+CiAgICAgIDxicj4KICAgICAgTm93IGlmIHRoZXJlIGlzIDMuNCBhbmQgMy41LCB0aGUgdXNl ciBuZWVkcyB0byBhZGQgMiBtb3JlIGVudHJpZXMsCiAgICAgIHdoaWNoIGkgZmVlbCBpcyByZWR1 bmRhbnQuPGJyPgogICAgICA8YnI+CiAgICAgIEluc3RlYWQgd2UgY2FuIG1ha2UgPGJyPgogICAg ICA8YnI+CiAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyBAVHlwZUNvbnZlcnRlckF0dHJpYnV0ZShC b29sZWFuLmNsYXNzKTxicj4KICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7IEBEZWZhdWx0VmFsdWVB dHRyaWJ1dGUoInRydWUiKTxicj4KICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7IFN1cHBvcnRGb3Jj ZUNyZWF0ZVZHLDxicj4KICAgICAgPGJyPgogICAgICBhbmQgaGF2ZSBvbmx5IHRoZSBmb2xsb3dp bmcgaW4gY29uZmlnLnNxbDxicj4KICAgICAgc2VsZWN0CiAgICAgIGZuX2RiX2FkZF9jb25maWdf dmFsdWUoJ1N1cHBvcnRGb3JjZUNyZWF0ZVZHJywnZmFsc2UnLCczLjAnKTs8YnI+CiAgICAgIDxi cj4KICAgICAgaWYgYSBwYXJ0aWN1bGFyIHZhbHVlKGZvciBhIHNwZWNpZmljIGNsdXN0ZXIgbGV2 ZWwpIGlzIG5vdCBmb3VuZAogICAgICBpbiBDb25maWcuc3FsLCB0aGUgZmFsbGJhY2sgaXMgdG8g dXNlIHRoZSB2YWx1ZSBhdmFpbGFibGUgaW4KICAgICAgQ29uZmlnVmFsdWVzLmphdmEuPGJyPgog ICAgICA8YnI+CiAgICAgIFBsZWFzZSBzaGFyZSB5b3VyIHRob3VnaHRzIG9uIHRoaXMuPGJyPgog ICAgPC9ibG9ja3F1b3RlPgogICAgPGJyPgogICAgKzE8YnI+CiAgICA8YnI+CiAgICA8YmxvY2tx dW90ZSBjaXRlPSJtaWQ6NTI5ODRENDguMTA3MDAwOUByZWRoYXQuY29tIiB0eXBlPSJjaXRlIj4g PGJyPgogICAgICBUaGFua3MsPGJyPgogICAgICBLYW5hZ2FyYWo8YnI+CiAgICAgIDxicj4KICAg ICAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7CiAg ICAgICAgY2hhcnNldD1JU08tODg1OS0xIj4KICAgICAgPGJyPgogICAgICA8ZmllbGRzZXQgY2xh c3M9Im1pbWVBdHRhY2htZW50SGVhZGVyIj48L2ZpZWxkc2V0PgogICAgICA8YnI+CiAgICAgIDxw cmUgd3JhcD0iIj5fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f XwpFbmdpbmUtZGV2ZWwgbWFpbGluZyBsaXN0CjxhIGNsYXNzPSJtb3otdHh0LWxpbmstYWJicmV2 aWF0ZWQiIGhyZWY9Im1haWx0bzpFbmdpbmUtZGV2ZWxAb3ZpcnQub3JnIj5FbmdpbmUtZGV2ZWxA b3ZpcnQub3JnPC9hPgo8YSBjbGFzcz0ibW96LXR4dC1saW5rLWZyZWV0ZXh0IiBocmVmPSJodHRw Oi8vbGlzdHMub3ZpcnQub3JnL21haWxtYW4vbGlzdGluZm8vZW5naW5lLWRldmVsIj5odHRwOi8v bGlzdHMub3ZpcnQub3JnL21haWxtYW4vbGlzdGluZm8vZW5naW5lLWRldmVsPC9hPgo8L3ByZT4K ICAgIDwvYmxvY2txdW90ZT4KICAgIDxicj4KICA8L2JvZHk+CjwvaHRtbD4KCi0tLS0tLS0tLS0t LS0tMDYwMjAyMDkwNjA0MDIwNjA5MDEwNjAwLS0K --===============7759334009555552658==-- From dpati at redhat.com Fri Nov 29 06:41:57 2013 Content-Type: multipart/mixed; boundary="===============4800016525800271269==" MIME-Version: 1.0 From: Dusmant Kumar Pati To: devel at ovirt.org Subject: Re: [Engine-devel] Using config values Date: Fri, 29 Nov 2013 17:10:09 +0530 Message-ID: <52987D19.9000203@redhat.com> In-Reply-To: 52984D48.1070009@redhat.com --===============4800016525800271269== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable This is a multi-part message in MIME format. --------------010309070708090904000001 Content-Type: text/plain; charset=3DISO-8859-1; format=3Dflowed Content-Transfer-Encoding: 7bit On 11/29/2013 01:46 PM, Kanagaraj wrote: > Hi All, > > The are some issues arising in configurations whenever we move up on = > the versions(3.3 =3D> 3.4), because of the way we store and interpret the= m. > > Whenever there is a new cluster level, you will need to add a new = > entry for all(most) of the configuration. Mostly a copy paste if you = > see from 3.2 to 3.3, except some CPU/PM type related configurations. > Better option would be to have the defaul config value in = > ConfigValues.java and the overrides will go to config.sql. In this = > approach you don't need a new entries to config.sql when there is a = > new cluster level. > > Lets take an exmaple, "SupportForceCreateVG" - This is supported from = > 3.1 onwards, > > If you look at config.sql, you will see following entries > select fn_db_add_config_value('SupportForceCreateVG','false','3.0'); > select fn_db_add_config_value('SupportForceCreateVG','true','3.1'); > select fn_db_add_config_value('SupportForceCreateVG','true','3.2'); > select fn_db_add_config_value('SupportForceCreateVG','true','3.3'); > > And in ConfigValues.java > > @TypeConverterAttribute(Boolean.class) > @DefaultValueAttribute("false") > SupportForceCreateVG, > > Now if there is 3.4 and 3.5, the user needs to add 2 more entries, = > which i feel is redundant. > > Instead we can make > > @TypeConverterAttribute(Boolean.class) > @DefaultValueAttribute("true") > SupportForceCreateVG, > > and have only the following in config.sql > select fn_db_add_config_value('SupportForceCreateVG','false','3.0'); > > if a particular value(for a specific cluster level) is not found in = > Config.sql, the fallback is to use the value available in = > ConfigValues.java. > > Please share your thoughts on this. > > Thanks, > Kanagaraj > > > > _______________________________________________ > Engine-devel mailing list > Engine-devel(a)ovirt.org > http://lists.ovirt.org/mailman/listinfo/engine-devel I think, this is a good suggestion... --------------010309070708090904000001 Content-Type: text/html; charset=3DISO-8859-1 Content-Transfer-Encoding: 7bit
On 11/29/2013 01:46 PM, Kanagaraj wrote:
Hi All,

The are some issues arising in configurations whenever we move up on the versions(3.3 =3D> 3.4), because of the way we store and interpret them.

Whenever there is a new cluster level, you will need to add a new entry for all(most) of the configuration. Mostly a copy paste if you see from 3.2 to 3.3, except some CPU/PM type related configurations.
Better option would be to have the defaul config value in ConfigValues.java and the overrides will go to config.sql. In this approach you don't need a new entries to config.sql when there is a new cluster level.

Lets take an exmaple, "SupportForceCreateVG" - This is supported from 3.1 onwards,

If you look at config.sql, you will see following entries
select fn_db_add_config_value('SupportForceCreateVG','false','3.0');
select fn_db_add_config_value('SupportForceCreateVG','true','3.1');
select fn_db_add_config_value('SupportForceCreateVG','true','3.2');
select fn_db_add_config_value('SupportForceCreateVG','true','3.3');

And in ConfigValues.java

    @TypeConverterAttribute(Boolean.class)
    @DefaultValueAttribute("false")
    SupportForceCreateVG,

Now if there is 3.4 and 3.5, the user needs to add 2 more entries, which i feel is redundant.

Instead we can make

    @TypeConverterAttribute(Boolean.class)
    @DefaultValueAttribute("true")
    SupportForceCreateVG,

and have only the following in config.sql
select fn_db_add_config_value('SupportForceCreateVG','false','3.0');

if a particular value(for a specific cluster level) is not found in Config.sql, the fallback is to use the value available in ConfigValues.java.

Please share your thoughts on this.

Thanks,
Kanagaraj



_______________________________________________
Engine-devel mailing list
Engine-devel(a)ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-devel<=
/a>
I think, this is a good suggestion...

--------------010309070708090904000001-- --===============4800016525800271269== Content-Type: multipart/alternative MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.bin" VGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KLS0tLS0tLS0tLS0t LS0wMTAzMDkwNzA3MDgwOTA5MDQwMDAwMDEKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFy c2V0PUlTTy04ODU5LTE7IGZvcm1hdD1mbG93ZWQKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzog N2JpdAoKT24gMTEvMjkvMjAxMyAwMTo0NiBQTSwgS2FuYWdhcmFqIHdyb3RlOgo+IEhpIEFsbCwK Pgo+IFRoZSBhcmUgc29tZSBpc3N1ZXMgYXJpc2luZyBpbiBjb25maWd1cmF0aW9ucyB3aGVuZXZl ciB3ZSBtb3ZlIHVwIG9uIAo+IHRoZSB2ZXJzaW9ucygzLjMgPT4gMy40KSwgYmVjYXVzZSBvZiB0 aGUgd2F5IHdlIHN0b3JlIGFuZCBpbnRlcnByZXQgdGhlbS4KPgo+IFdoZW5ldmVyIHRoZXJlIGlz IGEgbmV3IGNsdXN0ZXIgbGV2ZWwsIHlvdSB3aWxsIG5lZWQgdG8gYWRkIGEgbmV3IAo+IGVudHJ5 IGZvciBhbGwobW9zdCkgb2YgdGhlIGNvbmZpZ3VyYXRpb24uIE1vc3RseSBhIGNvcHkgcGFzdGUg aWYgeW91IAo+IHNlZSBmcm9tIDMuMiB0byAzLjMsIGV4Y2VwdCBzb21lIENQVS9QTSB0eXBlIHJl bGF0ZWQgY29uZmlndXJhdGlvbnMuCj4gQmV0dGVyIG9wdGlvbiB3b3VsZCBiZSB0byBoYXZlIHRo ZSBkZWZhdWwgY29uZmlnIHZhbHVlIGluIAo+IENvbmZpZ1ZhbHVlcy5qYXZhIGFuZCB0aGUgb3Zl cnJpZGVzIHdpbGwgZ28gdG8gY29uZmlnLnNxbC4gSW4gdGhpcyAKPiBhcHByb2FjaCB5b3UgZG9u J3QgbmVlZCBhIG5ldyBlbnRyaWVzIHRvIGNvbmZpZy5zcWwgd2hlbiB0aGVyZSBpcyBhIAo+IG5l dyBjbHVzdGVyIGxldmVsLgo+Cj4gTGV0cyB0YWtlIGFuIGV4bWFwbGUsICJTdXBwb3J0Rm9yY2VD cmVhdGVWRyIgLSBUaGlzIGlzIHN1cHBvcnRlZCBmcm9tIAo+IDMuMSBvbndhcmRzLAo+Cj4gSWYg eW91IGxvb2sgYXQgY29uZmlnLnNxbCwgeW91IHdpbGwgc2VlIGZvbGxvd2luZyBlbnRyaWVzCj4g c2VsZWN0IGZuX2RiX2FkZF9jb25maWdfdmFsdWUoJ1N1cHBvcnRGb3JjZUNyZWF0ZVZHJywnZmFs c2UnLCczLjAnKTsKPiBzZWxlY3QgZm5fZGJfYWRkX2NvbmZpZ192YWx1ZSgnU3VwcG9ydEZvcmNl Q3JlYXRlVkcnLCd0cnVlJywnMy4xJyk7Cj4gc2VsZWN0IGZuX2RiX2FkZF9jb25maWdfdmFsdWUo J1N1cHBvcnRGb3JjZUNyZWF0ZVZHJywndHJ1ZScsJzMuMicpOwo+IHNlbGVjdCBmbl9kYl9hZGRf Y29uZmlnX3ZhbHVlKCdTdXBwb3J0Rm9yY2VDcmVhdGVWRycsJ3RydWUnLCczLjMnKTsKPgo+IEFu ZCBpbiBDb25maWdWYWx1ZXMuamF2YQo+Cj4gICAgIEBUeXBlQ29udmVydGVyQXR0cmlidXRlKEJv b2xlYW4uY2xhc3MpCj4gICAgIEBEZWZhdWx0VmFsdWVBdHRyaWJ1dGUoImZhbHNlIikKPiAgICAg U3VwcG9ydEZvcmNlQ3JlYXRlVkcsCj4KPiBOb3cgaWYgdGhlcmUgaXMgMy40IGFuZCAzLjUsIHRo ZSB1c2VyIG5lZWRzIHRvIGFkZCAyIG1vcmUgZW50cmllcywgCj4gd2hpY2ggaSBmZWVsIGlzIHJl ZHVuZGFudC4KPgo+IEluc3RlYWQgd2UgY2FuIG1ha2UKPgo+ICAgICBAVHlwZUNvbnZlcnRlckF0 dHJpYnV0ZShCb29sZWFuLmNsYXNzKQo+ICAgICBARGVmYXVsdFZhbHVlQXR0cmlidXRlKCJ0cnVl IikKPiAgICAgU3VwcG9ydEZvcmNlQ3JlYXRlVkcsCj4KPiBhbmQgaGF2ZSBvbmx5IHRoZSBmb2xs b3dpbmcgaW4gY29uZmlnLnNxbAo+IHNlbGVjdCBmbl9kYl9hZGRfY29uZmlnX3ZhbHVlKCdTdXBw b3J0Rm9yY2VDcmVhdGVWRycsJ2ZhbHNlJywnMy4wJyk7Cj4KPiBpZiBhIHBhcnRpY3VsYXIgdmFs dWUoZm9yIGEgc3BlY2lmaWMgY2x1c3RlciBsZXZlbCkgaXMgbm90IGZvdW5kIGluIAo+IENvbmZp Zy5zcWwsIHRoZSBmYWxsYmFjayBpcyB0byB1c2UgdGhlIHZhbHVlIGF2YWlsYWJsZSBpbiAKPiBD b25maWdWYWx1ZXMuamF2YS4KPgo+IFBsZWFzZSBzaGFyZSB5b3VyIHRob3VnaHRzIG9uIHRoaXMu Cj4KPiBUaGFua3MsCj4gS2FuYWdhcmFqCj4KPgo+Cj4gX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18KPiBFbmdpbmUtZGV2ZWwgbWFpbGluZyBsaXN0Cj4gRW5n aW5lLWRldmVsQG92aXJ0Lm9yZwo+IGh0dHA6Ly9saXN0cy5vdmlydC5vcmcvbWFpbG1hbi9saXN0 aW5mby9lbmdpbmUtZGV2ZWwKSSB0aGluaywgdGhpcyBpcyBhIGdvb2Qgc3VnZ2VzdGlvbi4uLgoK Ci0tLS0tLS0tLS0tLS0tMDEwMzA5MDcwNzA4MDkwOTA0MDAwMDAxCkNvbnRlbnQtVHlwZTogdGV4 dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2Jp dAoKPGh0bWw+CiAgPGhlYWQ+CiAgICA8bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9 SVNPLTg4NTktMSIKICAgICAgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIj4KICA8L2hlYWQ+CiAg PGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiIgdGV4dD0iIzAwMDAwMCI+CiAgICA8ZGl2IGNsYXNzPSJt b3otY2l0ZS1wcmVmaXgiPk9uIDExLzI5LzIwMTMgMDE6NDYgUE0sIEthbmFnYXJhagogICAgICB3 cm90ZTo8YnI+CiAgICA8L2Rpdj4KICAgIDxibG9ja3F1b3RlIGNpdGU9Im1pZDo1Mjk4NEQ0OC4x MDcwMDA5QHJlZGhhdC5jb20iIHR5cGU9ImNpdGUiPgogICAgICA8bWV0YSBodHRwLWVxdWl2PSJj b250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsKICAgICAgICBjaGFyc2V0PUlTTy04ODU5 LTEiPgogICAgICBIaSBBbGwsPGJyPgogICAgICA8YnI+CiAgICAgIFRoZSBhcmUgc29tZSBpc3N1 ZXMgYXJpc2luZyBpbiBjb25maWd1cmF0aW9ucyB3aGVuZXZlciB3ZSBtb3ZlIHVwCiAgICAgIG9u IHRoZSB2ZXJzaW9ucygzLjMgPSZndDsgMy40KSwgYmVjYXVzZSBvZiB0aGUgd2F5IHdlIHN0b3Jl IGFuZAogICAgICBpbnRlcnByZXQgdGhlbS48YnI+CiAgICAgIDxicj4KICAgICAgV2hlbmV2ZXIg dGhlcmUgaXMgYSBuZXcgY2x1c3RlciBsZXZlbCwgeW91IHdpbGwgbmVlZCB0byBhZGQgYSBuZXcK ICAgICAgZW50cnkgZm9yIGFsbChtb3N0KSBvZiB0aGUgY29uZmlndXJhdGlvbi4gTW9zdGx5IGEg Y29weSBwYXN0ZSBpZgogICAgICB5b3Ugc2VlIGZyb20gMy4yIHRvIDMuMywgZXhjZXB0IHNvbWUg Q1BVL1BNIHR5cGUgcmVsYXRlZAogICAgICBjb25maWd1cmF0aW9ucy48YnI+CiAgICAgIEJldHRl ciBvcHRpb24gd291bGQgYmUgdG8gaGF2ZSB0aGUgZGVmYXVsIGNvbmZpZyB2YWx1ZSBpbgogICAg ICBDb25maWdWYWx1ZXMuamF2YSBhbmQgdGhlIG92ZXJyaWRlcyB3aWxsIGdvIHRvIGNvbmZpZy5z cWwuIEluIHRoaXMKICAgICAgYXBwcm9hY2ggeW91IGRvbid0IG5lZWQgYSBuZXcgZW50cmllcyB0 byBjb25maWcuc3FsIHdoZW4gdGhlcmUgaXMKICAgICAgYSBuZXcgY2x1c3RlciBsZXZlbC48YnI+ CiAgICAgIDxicj4KICAgICAgTGV0cyB0YWtlIGFuIGV4bWFwbGUsICJTdXBwb3J0Rm9yY2VDcmVh dGVWRyIgLSBUaGlzIGlzIHN1cHBvcnRlZAogICAgICBmcm9tIDMuMSBvbndhcmRzLDxicj4KICAg ICAgPGJyPgogICAgICBJZiB5b3UgbG9vayBhdCBjb25maWcuc3FsLCB5b3Ugd2lsbCBzZWUgZm9s bG93aW5nIGVudHJpZXMgPGJyPgogICAgICBzZWxlY3QKICAgICAgZm5fZGJfYWRkX2NvbmZpZ192 YWx1ZSgnU3VwcG9ydEZvcmNlQ3JlYXRlVkcnLCdmYWxzZScsJzMuMCcpOyA8YnI+CiAgICAgIHNl bGVjdAogICAgICBmbl9kYl9hZGRfY29uZmlnX3ZhbHVlKCdTdXBwb3J0Rm9yY2VDcmVhdGVWRycs J3RydWUnLCczLjEnKTsgPGJyPgogICAgICBzZWxlY3QKICAgICAgZm5fZGJfYWRkX2NvbmZpZ192 YWx1ZSgnU3VwcG9ydEZvcmNlQ3JlYXRlVkcnLCd0cnVlJywnMy4yJyk7IDxicj4KICAgICAgc2Vs ZWN0CiAgICAgIGZuX2RiX2FkZF9jb25maWdfdmFsdWUoJ1N1cHBvcnRGb3JjZUNyZWF0ZVZHJywn dHJ1ZScsJzMuMycpOzxicj4KICAgICAgPGJyPgogICAgICBBbmQgaW4gQ29uZmlnVmFsdWVzLmph dmE8YnI+CiAgICAgIDxicj4KICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7IEBUeXBlQ29udmVydGVy QXR0cmlidXRlKEJvb2xlYW4uY2xhc3MpPGJyPgogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsgQERl ZmF1bHRWYWx1ZUF0dHJpYnV0ZSgiZmFsc2UiKTxicj4KICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7 IFN1cHBvcnRGb3JjZUNyZWF0ZVZHLDxicj4KICAgICAgPGJyPgogICAgICBOb3cgaWYgdGhlcmUg aXMgMy40IGFuZCAzLjUsIHRoZSB1c2VyIG5lZWRzIHRvIGFkZCAyIG1vcmUgZW50cmllcywKICAg ICAgd2hpY2ggaSBmZWVsIGlzIHJlZHVuZGFudC48YnI+CiAgICAgIDxicj4KICAgICAgSW5zdGVh ZCB3ZSBjYW4gbWFrZSA8YnI+CiAgICAgIDxicj4KICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7IEBU eXBlQ29udmVydGVyQXR0cmlidXRlKEJvb2xlYW4uY2xhc3MpPGJyPgogICAgICAmbmJzcDsmbmJz cDsmbmJzcDsgQERlZmF1bHRWYWx1ZUF0dHJpYnV0ZSgidHJ1ZSIpPGJyPgogICAgICAmbmJzcDsm bmJzcDsmbmJzcDsgU3VwcG9ydEZvcmNlQ3JlYXRlVkcsPGJyPgogICAgICA8YnI+CiAgICAgIGFu ZCBoYXZlIG9ubHkgdGhlIGZvbGxvd2luZyBpbiBjb25maWcuc3FsPGJyPgogICAgICBzZWxlY3QK ICAgICAgZm5fZGJfYWRkX2NvbmZpZ192YWx1ZSgnU3VwcG9ydEZvcmNlQ3JlYXRlVkcnLCdmYWxz ZScsJzMuMCcpOzxicj4KICAgICAgPGJyPgogICAgICBpZiBhIHBhcnRpY3VsYXIgdmFsdWUoZm9y IGEgc3BlY2lmaWMgY2x1c3RlciBsZXZlbCkgaXMgbm90IGZvdW5kCiAgICAgIGluIENvbmZpZy5z cWwsIHRoZSBmYWxsYmFjayBpcyB0byB1c2UgdGhlIHZhbHVlIGF2YWlsYWJsZSBpbgogICAgICBD b25maWdWYWx1ZXMuamF2YS48YnI+CiAgICAgIDxicj4KICAgICAgUGxlYXNlIHNoYXJlIHlvdXIg dGhvdWdodHMgb24gdGhpcy48YnI+CiAgICAgIDxicj4KICAgICAgVGhhbmtzLDxicj4KICAgICAg S2FuYWdhcmFqPGJyPgogICAgICA8YnI+CiAgICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQt dHlwZSIgY29udGVudD0idGV4dC9odG1sOwogICAgICAgIGNoYXJzZXQ9SVNPLTg4NTktMSI+CiAg ICAgIDxicj4KICAgICAgPGZpZWxkc2V0IGNsYXNzPSJtaW1lQXR0YWNobWVudEhlYWRlciI+PC9m aWVsZHNldD4KICAgICAgPGJyPgogICAgICA8cHJlIHdyYXA9IiI+X19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KRW5naW5lLWRldmVsIG1haWxpbmcgbGlzdAo8 YSBjbGFzcz0ibW96LXR4dC1saW5rLWFiYnJldmlhdGVkIiBocmVmPSJtYWlsdG86RW5naW5lLWRl dmVsQG92aXJ0Lm9yZyI+RW5naW5lLWRldmVsQG92aXJ0Lm9yZzwvYT4KPGEgY2xhc3M9Im1vei10 eHQtbGluay1mcmVldGV4dCIgaHJlZj0iaHR0cDovL2xpc3RzLm92aXJ0Lm9yZy9tYWlsbWFuL2xp c3RpbmZvL2VuZ2luZS1kZXZlbCI+aHR0cDovL2xpc3RzLm92aXJ0Lm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2VuZ2luZS1kZXZlbDwvYT4KPC9wcmU+CiAgICA8L2Jsb2NrcXVvdGU+CiAgICBJIHRoaW5r LCB0aGlzIGlzIGEgZ29vZCBzdWdnZXN0aW9uLi4uPGJyPgogICAgPGJyPgogIDwvYm9keT4KPC9o dG1sPgoKLS0tLS0tLS0tLS0tLS0wMTAzMDkwNzA3MDgwOTA5MDQwMDAwMDEtLQo= --===============4800016525800271269==-- From emesika at redhat.com Sat Nov 30 15:58:36 2013 Content-Type: multipart/mixed; boundary="===============0434410347254430288==" MIME-Version: 1.0 From: Eli Mesika To: devel at ovirt.org Subject: Re: [Engine-devel] Using config values Date: Sat, 30 Nov 2013 15:58:35 -0500 Message-ID: <1299085692.33736696.1385845115835.JavaMail.root@redhat.com> In-Reply-To: 52987D19.9000203@redhat.com --===============0434410347254430288== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable ----- Original Message ----- > From: "Dusmant Kumar Pati" > To: "Kanagaraj" , "engine-devel" > Sent: Friday, November 29, 2013 1:40:09 PM > Subject: Re: [Engine-devel] Using config values > = > On 11/29/2013 01:46 PM, Kanagaraj wrote: > = > = > Hi All, > = > The are some issues arising in configurations whenever we move up on the > versions(3.3 =3D> 3.4), because of the way we store and interpret them. > = > Whenever there is a new cluster level, you will need to add a new entry f= or > all(most) of the configuration. Mostly a copy paste if you see from 3.2 to > 3.3, except some CPU/PM type related configurations. > Better option would be to have the defaul config value in ConfigValues.ja= va > and the overrides will go to config.sql. In this approach you don't need a > new entries to config.sql when there is a new cluster level. > = > Lets take an exmaple, "SupportForceCreateVG" - This is supported from 3.1 > onwards, > = > If you look at config.sql, you will see following entries > select fn_db_add_config_value('SupportForceCreateVG','false','3.0'); > select fn_db_add_config_value('SupportForceCreateVG','true','3.1'); > select fn_db_add_config_value('SupportForceCreateVG','true','3.2'); > select fn_db_add_config_value('SupportForceCreateVG','true','3.3'); > = > And in ConfigValues.java > = > @TypeConverterAttribute(Boolean.class) > @DefaultValueAttribute("false") > SupportForceCreateVG, > = > Now if there is 3.4 and 3.5, the user needs to add 2 more entries, which i > feel is redundant. > = > Instead we can make > = > @TypeConverterAttribute(Boolean.class) > @DefaultValueAttribute("true") > SupportForceCreateVG, > = > and have only the following in config.sql > select fn_db_add_config_value('SupportForceCreateVG','false','3.0'); > = > if a particular value(for a specific cluster level) is not found in > Config.sql, the fallback is to use the value available in ConfigValues.ja= va. > = > Please share your thoughts on this. Hi = First of all I think its a good idea I have 2 questions = 1) Which value will be stored as default in the java class for configuratio= n values that are not a boolean, that represents if a feature is active or = not. Is that the latest version value ? sounds not obvious to me = 2) There are some configuration values that are exposed to the user via the= engine-config tool, how this will work, we can not remove the entries thei= r since the user may change and override those values. I have a different suggestion: Default value will stay as is , meaning , it will reflect the value that sh= ould be used to keep the application running correctly if a value is not fo= und in DB (which should not occur) Code of getting configuration value (getConfigValue(,) will b= e changed to get the closest version value to the given one. For example , if a 3.4 version is given for a given and we have in DB= just values for 3.0 and 3.1 , the 3.1 value is returned. I prefer this solution since it makes the config.sql file self documented ,= showing only value changes and in which version each change occurred. To implement that, we should add this mechanism to the current code that ca= ches the DB content and as I see that it should be a simple change. engine-config should be modified such that if the user change a value, this= value will be inserted to the database with the current release if not exi= sts and then the mechanism described above will get this value = Example: VdsFenceType lists all the supported fencing agents for power management , = it currently has the following settings option_value = | version = ---------------------------------------------------------------------------= ------------------+--------- alom,apc,bladecenter,drac5,eps,ilo,ilo3,ipmilan,rsa,rsb,wti,cisco_ucs = | 3.0 alom,apc,bladecenter,drac5,eps,ilo,ilo3,ipmilan,rsa,rsb,wti,cisco_ucs = | 3.1 apc,apc_snmp,bladecenter,cisco_ucs,drac5,eps,ilo,ilo2,ilo3,ilo4,ipmilan,rs= a,rsb,wti | 3.2 apc,apc_snmp,bladecenter,cisco_ucs,drac5,eps,ilo,ilo2,ilo3,ilo4,ipmilan,rs= a,rsb,wti | 3.3 In the proposed solution, we will have = option_value = | version = ---------------------------------------------------------------------------= ------------------+--------- alom,apc,bladecenter,drac5,eps,ilo,ilo3,ipmilan,rsa,rsb,wti,cisco_ucs = | 3.0 apc,apc_snmp,bladecenter,cisco_ucs,drac5,eps,ilo,ilo2,ilo3,ilo4,ipmilan,rs= a,rsb,wti | 3.2 This is clear and documents only the changes done between versions and serv= e all values: boolean , string and complex type (those which requires any k= ind of parsing) What do you think? Eli = = > = > Thanks, > Kanagaraj > = > = > = > _______________________________________________ > Engine-devel mailing list Engine-devel(a)ovirt.org > http://lists.ovirt.org/mailman/listinfo/engine-devel > I think, this is a good suggestion... > = > = > _______________________________________________ > Engine-devel mailing list > Engine-devel(a)ovirt.org > http://lists.ovirt.org/mailman/listinfo/engine-devel >=20 --===============0434410347254430288==-- From mkolesni at redhat.com Sun Dec 1 01:08:44 2013 Content-Type: multipart/mixed; boundary="===============3086811216356368907==" MIME-Version: 1.0 From: Mike Kolesnik To: devel at ovirt.org Subject: Re: [Engine-devel] Using config values Date: Sun, 01 Dec 2013 01:08:42 -0500 Message-ID: <1643824061.43195741.1385878122949.JavaMail.root@redhat.com> In-Reply-To: 52984D48.1070009@redhat.com --===============3086811216356368907== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable ------=3D_Part_43195740_1618344988.1385878122945 Content-Type: text/plain; charset=3Dutf-8 Content-Transfer-Encoding: 7bit ----- Original Message ----- > Hi All, Hi Kanagaraj, = > The are some issues arising in configurations whenever we move up on the > versions(3.3 =3D> 3.4), because of the way we store and interpret them. > Whenever there is a new cluster level, you will need to add a new entry f= or > all(most) of the configuration. Mostly a copy paste if you see from 3.2 to > 3.3, except some CPU/PM type related configurations. > Better option would be to have the defaul config value in ConfigValues.ja= va > and the overrides will go to config.sql. In this approach you don't need a > new entries to config.sql when there is a new cluster level. > Lets take an exmaple, "SupportForceCreateVG" - This is supported from 3.1 > onwards, > If you look at config.sql, you will see following entries > select fn_db_add_config_value('SupportForceCreateVG','false','3.0'); > select fn_db_add_config_value('SupportForceCreateVG','true','3.1'); > select fn_db_add_config_value('SupportForceCreateVG','true','3.2'); > select fn_db_add_config_value('SupportForceCreateVG','true','3.3'); > And in ConfigValues.java > @TypeConverterAttribute(Boolean.class) > @DefaultValueAttribute("false") > SupportForceCreateVG, > Now if there is 3.4 and 3.5, the user needs to add 2 more entries, which i > feel is redundant. > Instead we can make > @TypeConverterAttribute(Boolean.class) > @DefaultValueAttribute("true") > SupportForceCreateVG, > and have only the following in config.sql > select fn_db_add_config_value('SupportForceCreateVG','false','3.0'); > if a particular value(for a specific cluster level) is not found in > Config.sql, the fallback is to use the value available in ConfigValues.ja= va. This has already been implemented, there are many "feature supported" confi= gurations working like this (for example GlusterSupport). = I think a more interesting approach would be to move these out of the DB si= nce these values don't really hav e a reson to be there. = Since the entire thing is abstracted by "Gluster/FeatureSupported" classes = then we can easily change mechanism (of course whatever code is not using i= t can be easily converted to use the mechanism) = For example a simple enum could do the trick: = ------------------------------------- EXAMPLE -----------------------------= -------- = /** = * Convenience class to check if a gluster feature is supported or not in an= y given version.
= * Methods should be named by feature and accept version to check against. = */ = public class GlusterFeatureSupported { = /** = * @param version = * Compatibility version to check for. = * @return true if gluster support is enabled, false if it's not. = */ = public static boolean gluster(Version version) { = return SupportedFeatures.GLUSTER.isSupportedOn(version); = } = /** = * @param version = * Compatibility version to check for. = * @return true if gluster heavyweight refresh is enabled, false if it's not. = */ = public static boolean refreshHeavyWeight(Version version) { = return SupportedFeatures.REFRESH_HEAVYWEIGHT.isSupportedOn(version); = } = /* More methods... */ = enum SupportedFeatures { = GLUSTER(Version.v3_0), = REFRESH_HEAVYWEIGHT(Version.v3_0, Version.v3_1), = /* More members */; = private Set unsupportedVersions =3D new HashSet(); = private SupportedFeatures(Version... versions) { = unsupportedVersions.addAll(Arrays.asList(versions)); = } = public boolean isSupportedOn(Version version) { = return !unsupportedVersions.contains(version); = } = } = ------------------------------------- END EXAMPLE -------------------------= ------------ = Thoughts? = Regards, = Mike = > Please share your thoughts on this. > Thanks, > Kanagaraj ------=3D_Part_43195740_1618344988.1385878122945 Content-Type: text/html; charset=3Dutf-8 Content-Transfer-Encoding: quoted-printable

=3D20 =3D20 =3D20 =3D20 Hi All,

Hi Kanagaraj,

The are some issues arising in configurations whenever we move up on the versions(3.3 =3D3D> 3.4), because of the way we store and interpret them.

Whenever there is a new cluster level, you will need to add a new entry for all(most) of the configuration. Mostly a copy paste if you see from 3.2 to 3.3, except some CPU/PM type related configurations. Better option would be to have the defaul config value in ConfigValues.java and the overrides will go to config.sql. In this approach you don't need a new entries to config.sql when there is a new cluster level.

Lets take an exmaple, "SupportForceCreateVG" - This is supported from 3.1 onwards,

If you look at config.sql, you will see following entries
select fn_db_add_config_value('SupportForceCreateVG','false','3.0');
select fn_db_add_config_value('SupportForceCreateVG','true','3.1');
select fn_db_add_config_value('SupportForceCreateVG','true','3.2');
select fn_db_add_config_value('SupportForceCreateVG','true','3.3');
= =3D
And in ConfigValues.java

    @TypeConverterAttribute(Boolean.class)
    @DefaultValueAttribute("false")
    SupportForceCreateVG,

Now if there is 3.4 and 3.5, the user needs to add 2 more entries, which i feel is redundant.

Instead we can make

    @TypeConverterAttribute(Boolean.class)
    @DefaultValueAttribute("true")
    SupportForceCreateVG,

and have only the following in config.sql
select fn_db_add_config_value('SupportForceCreateVG','false','3.0');
if a particular value(for a specific cluster level) is not found in Config.sql, the fallback is to use the value available in ConfigValues.java.

This has already bee= =3D n implemented, there are many "feature supported" configurations working li= =3D ke this (for example GlusterSupport).

I think = =3D a more interesting approach would be to move these out of the DB since thes= =3D e values don't really hav e a reson to be there.
Since the en= =3D tire thing is abstracted by "Gluster/FeatureSupported" classes then we can = =3D easily change mechanism (of course whatever code is not using it can be eas= =3D ily converted to use the mechanism)

For exampl= =3D e a simple enum could do the trick:
-------------------------= =3D ------------ EXAMPLE -------------------------------------
/*= =3D *
 * Convenience class to check if a gluster feature is supported o= =3D r not in any given version.<br>
 * Methods should be named by= =3D feature and accept version to check against.
 */
public class G= =3D lusterFeatureSupported {
    /**
  &n= =3D bsp;  * @param version
     *   = =3D          Compatibility version to c= =3D heck for.
     * @return <code>true</code&g= =3D t; if gluster support is enabled, <code>false</code> if it's no= =3D t.
     */
    public static boole= =3D an gluster(Version version) {
       = =3D return SupportedFeatures.GLUSTER.isSupportedOn(version);
  &n= =3D bsp; }

    /**
     * @param v= =3D ersion
     *      &nb= =3D sp;     Compatibility version to check for.
 &n= =3D bsp;   * @return <code>true</code> if gluster heavywe= =3D ight refresh is enabled, <code>false</code> if it's not.
&nb= =3D sp;    */
    public static boolean refres= =3D hHeavyWeight(Version version) {
      &nbs= =3D p; return SupportedFeatures.REFRESH_HEAVYWEIGHT.isSupportedOn(version);
= =3D     }

    /* Mor= =3D e methods... */

    enum SupportedFeatures {        GLUSTER(Version.v3_0),
&nbs= =3D p;       REFRESH_HEAVYWEIGHT(Version.v3_0, Ve= =3D rsion.v3_1),
        /* More m= =3D embers */;

        private Set<= =3D ;Version> unsupportedVersions =3D3D new HashSet<Version>();
&=3D nbsp;       private SupportedFeatures(Version= =3D ... versions) {
         &n= =3D bsp;  unsupportedVersions.addAll(Arrays.asList(versions));
 &n= =3D bsp;      }

     &= =3D nbsp;  public boolean isSupportedOn(Version version) {
  = =3D           return !unsupportedV= =3D ersions.contains(version);
        }<= =3D br>    }
------------------------------------- END= =3D EXAMPLE -------------------------------------

Tho= =3D ughts?

Regards,
Mike

Please share your thoughts on this.

Thanks,
Kanagaraj

------=3D_Part_43195740_1618344988.1385878122945-- --===============3086811216356368907== Content-Type: multipart/alternative MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.bin" LS0tLS0tPV9QYXJ0XzQzMTk1NzQwXzE2MTgzNDQ5ODguMTM4NTg3ODEyMjk0NQpDb250ZW50LVR5 cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzog N2JpdAoKLS0tLS0gT3JpZ2luYWwgTWVzc2FnZSAtLS0tLQoKPiBIaSBBbGwsCkhpIEthbmFnYXJh aiwgCgo+IFRoZSBhcmUgc29tZSBpc3N1ZXMgYXJpc2luZyBpbiBjb25maWd1cmF0aW9ucyB3aGVu ZXZlciB3ZSBtb3ZlIHVwIG9uIHRoZQo+IHZlcnNpb25zKDMuMyA9PiAzLjQpLCBiZWNhdXNlIG9m IHRoZSB3YXkgd2Ugc3RvcmUgYW5kIGludGVycHJldCB0aGVtLgoKPiBXaGVuZXZlciB0aGVyZSBp cyBhIG5ldyBjbHVzdGVyIGxldmVsLCB5b3Ugd2lsbCBuZWVkIHRvIGFkZCBhIG5ldyBlbnRyeSBm b3IKPiBhbGwobW9zdCkgb2YgdGhlIGNvbmZpZ3VyYXRpb24uIE1vc3RseSBhIGNvcHkgcGFzdGUg aWYgeW91IHNlZSBmcm9tIDMuMiB0bwo+IDMuMywgZXhjZXB0IHNvbWUgQ1BVL1BNIHR5cGUgcmVs YXRlZCBjb25maWd1cmF0aW9ucy4KPiBCZXR0ZXIgb3B0aW9uIHdvdWxkIGJlIHRvIGhhdmUgdGhl IGRlZmF1bCBjb25maWcgdmFsdWUgaW4gQ29uZmlnVmFsdWVzLmphdmEKPiBhbmQgdGhlIG92ZXJy aWRlcyB3aWxsIGdvIHRvIGNvbmZpZy5zcWwuIEluIHRoaXMgYXBwcm9hY2ggeW91IGRvbid0IG5l ZWQgYQo+IG5ldyBlbnRyaWVzIHRvIGNvbmZpZy5zcWwgd2hlbiB0aGVyZSBpcyBhIG5ldyBjbHVz dGVyIGxldmVsLgoKPiBMZXRzIHRha2UgYW4gZXhtYXBsZSwgIlN1cHBvcnRGb3JjZUNyZWF0ZVZH IiAtIFRoaXMgaXMgc3VwcG9ydGVkIGZyb20gMy4xCj4gb253YXJkcywKCj4gSWYgeW91IGxvb2sg YXQgY29uZmlnLnNxbCwgeW91IHdpbGwgc2VlIGZvbGxvd2luZyBlbnRyaWVzCj4gc2VsZWN0IGZu X2RiX2FkZF9jb25maWdfdmFsdWUoJ1N1cHBvcnRGb3JjZUNyZWF0ZVZHJywnZmFsc2UnLCczLjAn KTsKPiBzZWxlY3QgZm5fZGJfYWRkX2NvbmZpZ192YWx1ZSgnU3VwcG9ydEZvcmNlQ3JlYXRlVkcn LCd0cnVlJywnMy4xJyk7Cj4gc2VsZWN0IGZuX2RiX2FkZF9jb25maWdfdmFsdWUoJ1N1cHBvcnRG b3JjZUNyZWF0ZVZHJywndHJ1ZScsJzMuMicpOwo+IHNlbGVjdCBmbl9kYl9hZGRfY29uZmlnX3Zh bHVlKCdTdXBwb3J0Rm9yY2VDcmVhdGVWRycsJ3RydWUnLCczLjMnKTsKCj4gQW5kIGluIENvbmZp Z1ZhbHVlcy5qYXZhCgo+IEBUeXBlQ29udmVydGVyQXR0cmlidXRlKEJvb2xlYW4uY2xhc3MpCj4g QERlZmF1bHRWYWx1ZUF0dHJpYnV0ZSgiZmFsc2UiKQo+IFN1cHBvcnRGb3JjZUNyZWF0ZVZHLAoK PiBOb3cgaWYgdGhlcmUgaXMgMy40IGFuZCAzLjUsIHRoZSB1c2VyIG5lZWRzIHRvIGFkZCAyIG1v cmUgZW50cmllcywgd2hpY2ggaQo+IGZlZWwgaXMgcmVkdW5kYW50LgoKPiBJbnN0ZWFkIHdlIGNh biBtYWtlCgo+IEBUeXBlQ29udmVydGVyQXR0cmlidXRlKEJvb2xlYW4uY2xhc3MpCj4gQERlZmF1 bHRWYWx1ZUF0dHJpYnV0ZSgidHJ1ZSIpCj4gU3VwcG9ydEZvcmNlQ3JlYXRlVkcsCgo+IGFuZCBo YXZlIG9ubHkgdGhlIGZvbGxvd2luZyBpbiBjb25maWcuc3FsCj4gc2VsZWN0IGZuX2RiX2FkZF9j b25maWdfdmFsdWUoJ1N1cHBvcnRGb3JjZUNyZWF0ZVZHJywnZmFsc2UnLCczLjAnKTsKCj4gaWYg YSBwYXJ0aWN1bGFyIHZhbHVlKGZvciBhIHNwZWNpZmljIGNsdXN0ZXIgbGV2ZWwpIGlzIG5vdCBm b3VuZCBpbgo+IENvbmZpZy5zcWwsIHRoZSBmYWxsYmFjayBpcyB0byB1c2UgdGhlIHZhbHVlIGF2 YWlsYWJsZSBpbiBDb25maWdWYWx1ZXMuamF2YS4KVGhpcyBoYXMgYWxyZWFkeSBiZWVuIGltcGxl bWVudGVkLCB0aGVyZSBhcmUgbWFueSAiZmVhdHVyZSBzdXBwb3J0ZWQiIGNvbmZpZ3VyYXRpb25z IHdvcmtpbmcgbGlrZSB0aGlzIChmb3IgZXhhbXBsZSBHbHVzdGVyU3VwcG9ydCkuIAoKSSB0aGlu ayBhIG1vcmUgaW50ZXJlc3RpbmcgYXBwcm9hY2ggd291bGQgYmUgdG8gbW92ZSB0aGVzZSBvdXQg b2YgdGhlIERCIHNpbmNlIHRoZXNlIHZhbHVlcyBkb24ndCByZWFsbHkgaGF2IGUgYSByZXNvbiB0 byBiZSB0aGVyZS4gClNpbmNlIHRoZSBlbnRpcmUgdGhpbmcgaXMgYWJzdHJhY3RlZCBieSAiR2x1 c3Rlci9GZWF0dXJlU3VwcG9ydGVkIiBjbGFzc2VzIHRoZW4gd2UgY2FuIGVhc2lseSBjaGFuZ2Ug bWVjaGFuaXNtIChvZiBjb3Vyc2Ugd2hhdGV2ZXIgY29kZSBpcyBub3QgdXNpbmcgaXQgY2FuIGJl IGVhc2lseSBjb252ZXJ0ZWQgdG8gdXNlIHRoZSBtZWNoYW5pc20pIAoKRm9yIGV4YW1wbGUgYSBz aW1wbGUgZW51bSBjb3VsZCBkbyB0aGUgdHJpY2s6IAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tIEVYQU1QTEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LSAKLyoqIAoqIENvbnZlbmllbmNlIGNsYXNzIHRvIGNoZWNrIGlmIGEgZ2x1c3RlciBmZWF0dXJl IGlzIHN1cHBvcnRlZCBvciBub3QgaW4gYW55IGdpdmVuIHZlcnNpb24uPGJyPiAKKiBNZXRob2Rz IHNob3VsZCBiZSBuYW1lZCBieSBmZWF0dXJlIGFuZCBhY2NlcHQgdmVyc2lvbiB0byBjaGVjayBh Z2FpbnN0LiAKKi8gCnB1YmxpYyBjbGFzcyBHbHVzdGVyRmVhdHVyZVN1cHBvcnRlZCB7IAovKiog CiogQHBhcmFtIHZlcnNpb24gCiogQ29tcGF0aWJpbGl0eSB2ZXJzaW9uIHRvIGNoZWNrIGZvci4g CiogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBnbHVzdGVyIHN1cHBvcnQgaXMgZW5hYmxl ZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0J3Mgbm90LiAKKi8gCnB1YmxpYyBzdGF0aWMgYm9v bGVhbiBnbHVzdGVyKFZlcnNpb24gdmVyc2lvbikgeyAKcmV0dXJuIFN1cHBvcnRlZEZlYXR1cmVz LkdMVVNURVIuaXNTdXBwb3J0ZWRPbih2ZXJzaW9uKTsgCn0gCgovKiogCiogQHBhcmFtIHZlcnNp b24gCiogQ29tcGF0aWJpbGl0eSB2ZXJzaW9uIHRvIGNoZWNrIGZvci4gCiogQHJldHVybiA8Y29k ZT50cnVlPC9jb2RlPiBpZiBnbHVzdGVyIGhlYXZ5d2VpZ2h0IHJlZnJlc2ggaXMgZW5hYmxlZCwg PGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0J3Mgbm90LiAKKi8gCnB1YmxpYyBzdGF0aWMgYm9vbGVh biByZWZyZXNoSGVhdnlXZWlnaHQoVmVyc2lvbiB2ZXJzaW9uKSB7IApyZXR1cm4gU3VwcG9ydGVk RmVhdHVyZXMuUkVGUkVTSF9IRUFWWVdFSUdIVC5pc1N1cHBvcnRlZE9uKHZlcnNpb24pOyAKfSAK Ci8qIE1vcmUgbWV0aG9kcy4uLiAqLyAKCmVudW0gU3VwcG9ydGVkRmVhdHVyZXMgeyAKR0xVU1RF UihWZXJzaW9uLnYzXzApLCAKUkVGUkVTSF9IRUFWWVdFSUdIVChWZXJzaW9uLnYzXzAsIFZlcnNp b24udjNfMSksIAovKiBNb3JlIG1lbWJlcnMgKi87IAoKcHJpdmF0ZSBTZXQ8VmVyc2lvbj4gdW5z dXBwb3J0ZWRWZXJzaW9ucyA9IG5ldyBIYXNoU2V0PFZlcnNpb24+KCk7IAoKcHJpdmF0ZSBTdXBw b3J0ZWRGZWF0dXJlcyhWZXJzaW9uLi4uIHZlcnNpb25zKSB7IAp1bnN1cHBvcnRlZFZlcnNpb25z LmFkZEFsbChBcnJheXMuYXNMaXN0KHZlcnNpb25zKSk7IAp9IAoKcHVibGljIGJvb2xlYW4gaXNT dXBwb3J0ZWRPbihWZXJzaW9uIHZlcnNpb24pIHsgCnJldHVybiAhdW5zdXBwb3J0ZWRWZXJzaW9u cy5jb250YWlucyh2ZXJzaW9uKTsgCn0gCn0gCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0gRU5EIEVYQU1QTEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LSAKClRob3VnaHRzPyAKClJlZ2FyZHMsIApNaWtlIAoKPiBQbGVhc2Ugc2hhcmUgeW91ciB0aG91 Z2h0cyBvbiB0aGlzLgoKPiBUaGFua3MsCj4gS2FuYWdhcmFqCgotLS0tLS09X1BhcnRfNDMxOTU3 NDBfMTYxODM0NDk4OC4xMzg1ODc4MTIyOTQ1CkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFy c2V0PXV0Zi04CkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IHF1b3RlZC1wcmludGFibGUKCjxo dG1sPjxib2R5PjxkaXYgc3R5bGU9M0QiZm9udC1mYW1pbHk6IHRpbWVzIG5ldyByb21hbiwgbmV3 IHlvcmssIHRpbWVzLCBzZT0KcmlmOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiAjMDAwMDAwIj48 aHIgaWQ9M0QiendjaHIiPjxibG9ja3F1b3RlIHN0eWxlPTNEPQoiYm9yZGVyLWxlZnQ6MnB4IHNv bGlkICMxMDEwRkY7bWFyZ2luLWxlZnQ6NXB4O3BhZGRpbmctbGVmdDo1cHg7Y29sb3I6IzAwMDs9 CmZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0eWxlOm5vcm1hbDt0ZXh0LWRlY29yYXRpb246bm9u ZTtmb250LWZhbWlseTpIZWx2ZT0KdGljYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB0 OyI+CiA9MjAKCiAgID0yMAogPTIwCiA9MjAKICAgIEhpIEFsbCw8L2Jsb2NrcXVvdGU+PGRpdj48 YnI+PC9kaXY+PGRpdj5IaSBLYW5hZ2FyYWosPGJyPjwvZGl2PjxkaXY+PGJyPQo+PC9kaXY+PGJs b2NrcXVvdGUgc3R5bGU9M0QiYm9yZGVyLWxlZnQ6MnB4IHNvbGlkICMxMDEwRkY7bWFyZ2luLWxl ZnQ6NXB4O3A9CmFkZGluZy1sZWZ0OjVweDtjb2xvcjojMDAwO2ZvbnQtd2VpZ2h0Om5vcm1hbDtm b250LXN0eWxlOm5vcm1hbDt0ZXh0LWRlY29yYT0KdGlvbjpub25lO2ZvbnQtZmFtaWx5OkhlbHZl dGljYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB0OyI+PGJyPgogICAgVGhlIGFyZSBz b21lIGlzc3VlcyBhcmlzaW5nIGluIGNvbmZpZ3VyYXRpb25zIHdoZW5ldmVyIHdlIG1vdmUgdXAg b24KICAgIHRoZSB2ZXJzaW9ucygzLjMgPTNEJmd0OyAzLjQpLCBiZWNhdXNlIG9mIHRoZSB3YXkg d2Ugc3RvcmUgYW5kCiAgICBpbnRlcnByZXQgdGhlbS48YnI+PGJyPgogICAgV2hlbmV2ZXIgdGhl cmUgaXMgYSBuZXcgY2x1c3RlciBsZXZlbCwgeW91IHdpbGwgbmVlZCB0byBhZGQgYSBuZXcKICAg IGVudHJ5IGZvciBhbGwobW9zdCkgb2YgdGhlIGNvbmZpZ3VyYXRpb24uIE1vc3RseSBhIGNvcHkg cGFzdGUgaWYgeW91CiAgICBzZWUgZnJvbSAzLjIgdG8gMy4zLCBleGNlcHQgc29tZSBDUFUvUE0g dHlwZSByZWxhdGVkIGNvbmZpZ3VyYXRpb25zLjxicj0KPgogICAgQmV0dGVyIG9wdGlvbiB3b3Vs ZCBiZSB0byBoYXZlIHRoZSBkZWZhdWwgY29uZmlnIHZhbHVlIGluCiAgICBDb25maWdWYWx1ZXMu amF2YSBhbmQgdGhlIG92ZXJyaWRlcyB3aWxsIGdvIHRvIGNvbmZpZy5zcWwuIEluIHRoaXMKICAg IGFwcHJvYWNoIHlvdSBkb24ndCBuZWVkIGEgbmV3IGVudHJpZXMgdG8gY29uZmlnLnNxbCB3aGVu IHRoZXJlIGlzIGEKICAgIG5ldyBjbHVzdGVyIGxldmVsLjxicj48YnI+CiAgICBMZXRzIHRha2Ug YW4gZXhtYXBsZSwgIlN1cHBvcnRGb3JjZUNyZWF0ZVZHIiAtIFRoaXMgaXMgc3VwcG9ydGVkCiAg ICBmcm9tIDMuMSBvbndhcmRzLDxicj48YnI+CiAgICBJZiB5b3UgbG9vayBhdCBjb25maWcuc3Fs LCB5b3Ugd2lsbCBzZWUgZm9sbG93aW5nIGVudHJpZXMgPGJyPgogICAgc2VsZWN0IGZuX2RiX2Fk ZF9jb25maWdfdmFsdWUoJ1N1cHBvcnRGb3JjZUNyZWF0ZVZHJywnZmFsc2UnLCczLjAnKTsKICAg IDxicj4KICAgIHNlbGVjdCBmbl9kYl9hZGRfY29uZmlnX3ZhbHVlKCdTdXBwb3J0Rm9yY2VDcmVh dGVWRycsJ3RydWUnLCczLjEnKTsKICAgIDxicj4KICAgIHNlbGVjdCBmbl9kYl9hZGRfY29uZmln X3ZhbHVlKCdTdXBwb3J0Rm9yY2VDcmVhdGVWRycsJ3RydWUnLCczLjInKTsKICAgIDxicj4KICAg IHNlbGVjdCBmbl9kYl9hZGRfY29uZmlnX3ZhbHVlKCdTdXBwb3J0Rm9yY2VDcmVhdGVWRycsJ3Ry dWUnLCczLjMnKTs8YnI+PQo8YnI+CiAgICBBbmQgaW4gQ29uZmlnVmFsdWVzLmphdmE8YnI+PGJy PgogICAgJm5ic3A7Jm5ic3A7Jm5ic3A7IEBUeXBlQ29udmVydGVyQXR0cmlidXRlKEJvb2xlYW4u Y2xhc3MpPGJyPgogICAgJm5ic3A7Jm5ic3A7Jm5ic3A7IEBEZWZhdWx0VmFsdWVBdHRyaWJ1dGUo ImZhbHNlIik8YnI+CiAgICAmbmJzcDsmbmJzcDsmbmJzcDsgU3VwcG9ydEZvcmNlQ3JlYXRlVkcs PGJyPjxicj4KICAgIE5vdyBpZiB0aGVyZSBpcyAzLjQgYW5kIDMuNSwgdGhlIHVzZXIgbmVlZHMg dG8gYWRkIDIgbW9yZSBlbnRyaWVzLAogICAgd2hpY2ggaSBmZWVsIGlzIHJlZHVuZGFudC48YnI+ PGJyPgogICAgSW5zdGVhZCB3ZSBjYW4gbWFrZSA8YnI+PGJyPgogICAgJm5ic3A7Jm5ic3A7Jm5i c3A7IEBUeXBlQ29udmVydGVyQXR0cmlidXRlKEJvb2xlYW4uY2xhc3MpPGJyPgogICAgJm5ic3A7 Jm5ic3A7Jm5ic3A7IEBEZWZhdWx0VmFsdWVBdHRyaWJ1dGUoInRydWUiKTxicj4KICAgICZuYnNw OyZuYnNwOyZuYnNwOyBTdXBwb3J0Rm9yY2VDcmVhdGVWRyw8YnI+PGJyPgogICAgYW5kIGhhdmUg b25seSB0aGUgZm9sbG93aW5nIGluIGNvbmZpZy5zcWw8YnI+CiAgICBzZWxlY3QgZm5fZGJfYWRk X2NvbmZpZ192YWx1ZSgnU3VwcG9ydEZvcmNlQ3JlYXRlVkcnLCdmYWxzZScsJzMuMCcpOzxicj0K Pjxicj4KICAgIGlmIGEgcGFydGljdWxhciB2YWx1ZShmb3IgYSBzcGVjaWZpYyBjbHVzdGVyIGxl dmVsKSBpcyBub3QgZm91bmQgaW4KICAgIENvbmZpZy5zcWwsIHRoZSBmYWxsYmFjayBpcyB0byB1 c2UgdGhlIHZhbHVlIGF2YWlsYWJsZSBpbgogICAgQ29uZmlnVmFsdWVzLmphdmEuPC9ibG9ja3F1 b3RlPjxkaXY+PGJyPjwvZGl2PjxkaXY+VGhpcyBoYXMgYWxyZWFkeSBiZWU9Cm4gaW1wbGVtZW50 ZWQsIHRoZXJlIGFyZSBtYW55ICJmZWF0dXJlIHN1cHBvcnRlZCIgY29uZmlndXJhdGlvbnMgd29y a2luZyBsaT0Ka2UgdGhpcyAoZm9yIGV4YW1wbGUgR2x1c3RlclN1cHBvcnQpLjxicj48L2Rpdj48 ZGl2Pjxicj48L2Rpdj48ZGl2PkkgdGhpbmsgPQphIG1vcmUgaW50ZXJlc3RpbmcgYXBwcm9hY2gg d291bGQgYmUgdG8gbW92ZSB0aGVzZSBvdXQgb2YgdGhlIERCIHNpbmNlIHRoZXM9CmUgdmFsdWVz IGRvbid0IHJlYWxseSBoYXYgZSBhIHJlc29uIHRvIGJlIHRoZXJlLjxicj48L2Rpdj48ZGl2PlNp bmNlIHRoZSBlbj0KdGlyZSB0aGluZyBpcyBhYnN0cmFjdGVkIGJ5ICJHbHVzdGVyL0ZlYXR1cmVT dXBwb3J0ZWQiIGNsYXNzZXMgdGhlbiB3ZSBjYW4gPQplYXNpbHkgY2hhbmdlIG1lY2hhbmlzbSAo b2YgY291cnNlIHdoYXRldmVyIGNvZGUgaXMgbm90IHVzaW5nIGl0IGNhbiBiZSBlYXM9CmlseSBj b252ZXJ0ZWQgdG8gdXNlIHRoZSBtZWNoYW5pc20pPGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2Pjxk aXY+Rm9yIGV4YW1wbD0KZSBhIHNpbXBsZSBlbnVtIGNvdWxkIGRvIHRoZSB0cmljazo8YnI+PC9k aXY+PGRpdj4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPQotLS0tLS0tLS0tLS0gRVhBTVBMRSAt LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPGJyPjwvZGl2PjxkaXY+Lyo9Cio8 YnI+Jm5ic3A7KiBDb252ZW5pZW5jZSBjbGFzcyB0byBjaGVjayBpZiBhIGdsdXN0ZXIgZmVhdHVy ZSBpcyBzdXBwb3J0ZWQgbz0KciBub3QgaW4gYW55IGdpdmVuIHZlcnNpb24uJmx0O2JyJmd0Ozxi cj4mbmJzcDsqIE1ldGhvZHMgc2hvdWxkIGJlIG5hbWVkIGJ5PQogZmVhdHVyZSBhbmQgYWNjZXB0 IHZlcnNpb24gdG8gY2hlY2sgYWdhaW5zdC48YnI+Jm5ic3A7Ki88YnI+cHVibGljIGNsYXNzIEc9 Cmx1c3RlckZlYXR1cmVTdXBwb3J0ZWQgezwvZGl2PjxkaXY+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8q Kjxicj4mbmJzcDsmbmJzcDsmbj0KYnNwOyZuYnNwOyAqIEBwYXJhbSB2ZXJzaW9uPGJyPiZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyAqJm5ic3A7Jm5ic3A7Jm5ic3A7PQombmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgQ29tcGF0aWJpbGl0eSB2ZXJzaW9uIHRv IGM9CmhlY2sgZm9yLjxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgKiBAcmV0dXJuICZsdDtj b2RlJmd0O3RydWUmbHQ7L2NvZGUmZz0KdDsgaWYgZ2x1c3RlciBzdXBwb3J0IGlzIGVuYWJsZWQs ICZsdDtjb2RlJmd0O2ZhbHNlJmx0Oy9jb2RlJmd0OyBpZiBpdCdzIG5vPQp0Ljxicj4mbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsgKi88YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBzdGF0aWMg Ym9vbGU9CmFuIGdsdXN0ZXIoVmVyc2lvbiB2ZXJzaW9uKSB7PGJyPiZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOz0KIHJldHVybiBTdXBwb3J0ZWRGZWF0dXJlcy5HTFVT VEVSLmlzU3VwcG9ydGVkT24odmVyc2lvbik7PGJyPiZuYnNwOyZuYnNwOyZuPQpic3A7IH08YnI+ PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyAvKio8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICog QHBhcmFtIHY9CmVyc2lvbjxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgKiZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYj0Kc3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 IENvbXBhdGliaWxpdHkgdmVyc2lvbiB0byBjaGVjayBmb3IuPGJyPiZuYnNwOyZuPQpic3A7Jm5i c3A7Jm5ic3A7ICogQHJldHVybiAmbHQ7Y29kZSZndDt0cnVlJmx0Oy9jb2RlJmd0OyBpZiBnbHVz dGVyIGhlYXZ5d2U9CmlnaHQgcmVmcmVzaCBpcyBlbmFibGVkLCAmbHQ7Y29kZSZndDtmYWxzZSZs dDsvY29kZSZndDsgaWYgaXQncyBub3QuPGJyPiZuYj0Kc3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICov PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVmcmVzPQpoSGVh dnlXZWlnaHQoVmVyc2lvbiB2ZXJzaW9uKSB7PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnM9CnA7IHJldHVybiBTdXBwb3J0ZWRGZWF0dXJlcy5SRUZSRVNIX0hFQVZZ V0VJR0hULmlzU3VwcG9ydGVkT24odmVyc2lvbik7PGJyPj0KJm5ic3A7Jm5ic3A7Jm5ic3A7IH08 YnI+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj4mbmJzcDsmbmJzcDsmbmJzcDsgLyogTW9yPQpl IG1ldGhvZHMuLi4gKi88L2Rpdj48ZGl2Pjxicj4mbmJzcDsmbmJzcDsmbmJzcDsgZW51bSBTdXBw b3J0ZWRGZWF0dXJlcyB7PGI9CnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7IEdMVVNURVIoVmVyc2lvbi52M18wKSw8YnI+Jm5icz0KcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsgUkVGUkVTSF9IRUFWWVdFSUdIVChWZXJzaW9uLnYzXzAsIFZl PQpyc2lvbi52M18xKSw8L2Rpdj48ZGl2PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyAvKiBNb3JlIG09CmVtYmVycyAqLzs8YnI+PGJyPiZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwcml2YXRlIFNldCZsdD0KO1ZlcnNpb24mZ3Q7IHVu c3VwcG9ydGVkVmVyc2lvbnMgPTNEIG5ldyBIYXNoU2V0Jmx0O1ZlcnNpb24mZ3Q7KCk7PGJyPjxi cj4mPQpuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwcml2YXRlIFN1 cHBvcnRlZEZlYXR1cmVzKFZlcnNpb249Ci4uLiB2ZXJzaW9ucykgezxicj4mbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbj0KYnNwOyZuYnNwOyB1 bnN1cHBvcnRlZFZlcnNpb25zLmFkZEFsbChBcnJheXMuYXNMaXN0KHZlcnNpb25zKSk7PGJyPiZu YnNwOyZuPQpic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH08YnI+PGJyPiZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyY9Cm5ic3A7Jm5ic3A7IHB1YmxpYyBib29sZWFuIGlz U3VwcG9ydGVkT24oVmVyc2lvbiB2ZXJzaW9uKSB7PGJyPiZuYnNwOyZuYnNwOz0KJm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHJldHVybiAhdW5z dXBwb3J0ZWRWPQplcnNpb25zLmNvbnRhaW5zKHZlcnNpb24pOzxicj4mbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfTw9CmJyPiZuYnNwOyZuYnNwOyZuYnNwOyB9PC9k aXY+PGRpdj4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVORD0KIEVYQU1Q TEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvZGl2PjxkaXY+PGJyPjwv ZGl2PjxkaXY+VGhvPQp1Z2h0cz88YnI+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5SZWdhcmRz LDxicj48L2Rpdj48ZGl2Pk1pa2U8YnI+PC9kaXY+PGI9CmxvY2txdW90ZSBzdHlsZT0zRCJib3Jk ZXItbGVmdDoycHggc29saWQgIzEwMTBGRjttYXJnaW4tbGVmdDo1cHg7cGFkZGluZy1sZT0KZnQ6 NXB4O2NvbG9yOiMwMDA7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3R5bGU6bm9ybWFsO3RleHQt ZGVjb3JhdGlvbjpub25lPQo7Zm9udC1mYW1pbHk6SGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7 Zm9udC1zaXplOjEycHQ7Ij48YnI+CiAgICBQbGVhc2Ugc2hhcmUgeW91ciB0aG91Z2h0cyBvbiB0 aGlzLjxicj48YnI+CiAgICBUaGFua3MsPGJyPgogICAgS2FuYWdhcmFqPGJyPjxicj48L2Jsb2Nr cXVvdGU+PC9kaXY+PC9ib2R5PjwvaHRtbD4KLS0tLS0tPV9QYXJ0XzQzMTk1NzQwXzE2MTgzNDQ5 ODguMTM4NTg3ODEyMjk0NS0tCg== --===============3086811216356368907==-- From ofrenkel at redhat.com Sun Dec 1 03:55:21 2013 Content-Type: multipart/mixed; boundary="===============4969084531728349995==" MIME-Version: 1.0 From: Omer Frenkel To: devel at ovirt.org Subject: Re: [Engine-devel] Using config values Date: Sun, 01 Dec 2013 03:55:19 -0500 Message-ID: <1268805500.21090048.1385888119665.JavaMail.root@redhat.com> In-Reply-To: 1643824061.43195741.1385878122949.JavaMail.root@redhat.com --===============4969084531728349995== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable ------=3D_Part_21090047_1204116571.1385888119663 Content-Type: text/plain; charset=3Dutf-8 Content-Transfer-Encoding: 7bit ----- Original Message ----- > From: "Mike Kolesnik" > To: "Kanagaraj" > Cc: "engine-devel" > Sent: Sunday, December 1, 2013 8:08:42 AM > Subject: Re: [Engine-devel] Using config values > ----- Original Message ----- > > Hi All, > = > Hi Kanagaraj, > > The are some issues arising in configurations whenever we move up on the > > versions(3.3 =3D> 3.4), because of the way we store and interpret them. > = > > Whenever there is a new cluster level, you will need to add a new entry= for > > all(most) of the configuration. Mostly a copy paste if you see from 3.2= to > > 3.3, except some CPU/PM type related configurations. > = > > Better option would be to have the defaul config value in ConfigValues.= java > > and the overrides will go to config.sql. In this approach you don't nee= d a > > new entries to config.sql when there is a new cluster level. > = > > Lets take an exmaple, "SupportForceCreateVG" - This is supported from 3= .1 > > onwards, > = > > If you look at config.sql, you will see following entries > = > > select fn_db_add_config_value('SupportForceCreateVG','false','3.0'); > = > > select fn_db_add_config_value('SupportForceCreateVG','true','3.1'); > = > > select fn_db_add_config_value('SupportForceCreateVG','true','3.2'); > = > > select fn_db_add_config_value('SupportForceCreateVG','true','3.3'); > = > > And in ConfigValues.java > = > > @TypeConverterAttribute(Boolean.class) > = > > @DefaultValueAttribute("false") > = > > SupportForceCreateVG, > = > > Now if there is 3.4 and 3.5, the user needs to add 2 more entries, whic= h i > > feel is redundant. > = > > Instead we can make > = > > @TypeConverterAttribute(Boolean.class) > = > > @DefaultValueAttribute("true") > = > > SupportForceCreateVG, > = > > and have only the following in config.sql > = > > select fn_db_add_config_value('SupportForceCreateVG','false','3.0'); > = > > if a particular value(for a specific cluster level) is not found in > > Config.sql, the fallback is to use the value available in > > ConfigValues.java. > = > This has already been implemented, there are many "feature supported" > configurations working like this (for example GlusterSupport). > I think a more interesting approach would be to move these out of the DB > since these values don't really hav e a reson to be there. > Since the entire thing is abstracted by "Gluster/FeatureSupported" classes > then we can easily change mechanism (of course whatever code is not using= it > can be easily converted to use the mechanism) > For example a simple enum could do the trick: > ------------------------------------- EXAMPLE > ------------------------------------- > /** > * Convenience class to check if a gluster feature is supported or not in = any > given version.
> * Methods should be named by feature and accept version to check against. > */ > public class GlusterFeatureSupported { > /** > * @param version > * Compatibility version to check for. > * @return true if gluster support is enabled, false > if it's not. > */ > public static boolean gluster(Version version) { > return SupportedFeatures.GLUSTER.isSupportedOn(version); > } > /** > * @param version > * Compatibility version to check for. > * @return true if gluster heavyweight refresh is enabled, > false if it's not. > */ > public static boolean refreshHeavyWeight(Version version) { > return SupportedFeatures.REFRESH_HEAVYWEIGHT.isSupportedOn(version); > } > /* More methods... */ > enum SupportedFeatures { > GLUSTER(Version.v3_0), > REFRESH_HEAVYWEIGHT(Version.v3_0, Version.v3_1), > /* More members */; > private Set unsupportedVersions =3D new HashSet(); > private SupportedFeatures(Version... versions) { > unsupportedVersions.addAll(Arrays.asList(versions)); > } > public boolean isSupportedOn(Version version) { > return !unsupportedVersions.contains(version); > } > } > ------------------------------------- END EXAMPLE > ------------------------------------- > Thoughts? unless i didn't understand something, this is not good, = this should stay configurable by the users, = for example if some user experience some issues with a feature and want to = turn it off/change the values.. = (not all version configuration are boolean, some are different values to di= fferent versions, like cpu-list) = > Regards, > Mike > > Please share your thoughts on this. > = > > Thanks, > = > > Kanagaraj > = > _______________________________________________ > Engine-devel mailing list > Engine-devel(a)ovirt.org > http://lists.ovirt.org/mailman/listinfo/engine-devel ------=3D_Part_21090047_1204116571.1385888119663 Content-Type: text/html; charset=3Dutf-8 Content-Transfer-Encoding: quoted-printable



Fr= =3D om: "Mike Kolesnik" <mkolesni(a)redhat.com>
To: "Kanaga= ra=3D j" <kmayilsa(a)redhat.com>
Cc: "engine-devel" <engine-de= ve=3D l(a)ovirt.org>
Sent: Sunday, December 1, 2013 8:08:42 AM
S=3D ubject: Re: [Engine-devel] Using config values


=3D20 =3D20 =3D20 =3D20 Hi All,

Hi Kanagaraj,

The are some issues arising in configurations whenever we move up on the versions(3.3 =3D3D> 3.4), because of the way we store and interpret them.

Whenever there is a new cluster level, you will need to add a new entry for all(most) of the configuration. Mostly a copy paste if you see from 3.2 to 3.3, except some CPU/PM type related configurations. Better option would be to have the defaul config value in ConfigValues.java and the overrides will go to config.sql. In this approach you don't need a new entries to config.sql when there is a new cluster level.

Lets take an exmaple, "SupportForceCreateVG" - This is supported from 3.1 onwards,

If you look at config.sql, you will see following entries
select fn_db_add_config_value('SupportForceCreateVG','false','3.0');
select fn_db_add_config_value('SupportForceCreateVG','true','3.1');
select fn_db_add_config_value('SupportForceCreateVG','true','3.2');
select fn_db_add_config_value('SupportForceCreateVG','true','3.3');
= =3D

And in ConfigValues.java

    @TypeConverterAttribute(Boolean.class)
    @DefaultValueAttribute("false")
    SupportForceCreateVG,

Now if there is 3.4 and 3.5, the user needs to add 2 more entries, which i feel is redundant.

Instead we can make

    @TypeConverterAttribute(Boolean.class)
    @DefaultValueAttribute("true")
    SupportForceCreateVG,

and have only the following in config.sql
select fn_db_add_config_value('SupportForceCreateVG','false','3.0');

if a particular value(for a specific cluster level) is not found in Config.sql, the fallback is to use the value available in ConfigValues.java.

This has already bee= =3D n implemented, there are many "feature supported" configurations working li= =3D ke this (for example GlusterSupport).

I think = =3D a more interesting approach would be to move these out of the DB since thes= =3D e values don't really hav e a reson to be there.
Since the en= =3D tire thing is abstracted by "Gluster/FeatureSupported" classes then we can = =3D easily change mechanism (of course whatever code is not using it can be eas= =3D ily converted to use the mechanism)

For exampl= =3D e a simple enum could do the trick:
-------------------------= =3D ------------ EXAMPLE -------------------------------------
/*= =3D *
 * Convenience class to check if a gluster feature is supported o= =3D r not in any given version.<br>
 * Methods should be named by= =3D feature and accept version to check against.
 */
public class G= =3D lusterFeatureSupported {
    /**
  &n= =3D bsp;  * @param version
     *   = =3D          Compatibility version to c= =3D heck for.
     * @return <code>true</code&g= =3D t; if gluster support is enabled, <code>false</code> if it's no= =3D t.
     */
    public static boole= =3D an gluster(Version version) {
       = =3D return SupportedFeatures.GLUSTER.isSupportedOn(version);
  &n= =3D bsp; }

    /**
    = =3D * @param version
     *    &nbs= =3D p;       Compatibility version to check for.<= =3D br>     * @return <code>true</code> if glus= =3D ter heavyweight refresh is enabled, <code>false</code> if it's = =3D not.
     */
    public static boo= =3D lean refreshHeavyWeight(Version version) {
     = =3D ;   return SupportedFeatures.REFRESH_HEAVYWEIGHT.isSupportedOn(ve= =3D rsion);
    }

  &n= =3D bsp; /* More methods... */

    enum SupportedF= =3D eatures {
        GLUSTER(Version.v3_= =3D 0),
        REFRESH_HEAVYWEIGHT(Versi= =3D on.v3_0, Version.v3_1),
       = =3D ; /* More members */;

      = =3D ;  private Set<Version> unsupportedVersions =3D3D new HashSet<= ;V=3D ersion>();

        = =3D private SupportedFeatures(Version... versions) {
    = =3D ;        unsupportedVersions.addAll(Arra= =3D ys.asList(versions));
        }

        public boolean isSu= =3D pportedOn(Version version) {
       &= =3D nbsp;    return !unsupportedVersions.contains(version);
&= =3D nbsp;       }
    }
------------------------------------- END EXAMPLE ----------------------= =3D ---------------

Thoughts?
= =3D

unless i didn't understand something, this is not good,
<= =3D div>this should stay configurable by the users,
for example i= =3D f some user experience some issues with a feature and want to turn it off/c= =3D hange the values..
(not all version configuration are boolean, s= =3D ome are different values to different versions, like cpu-list)


Regards,
Mike

Please share your thoughts on this.

Thanks,
Kanagaraj


____________________= =3D ___________________________
Engine-devel mailing list
Engine-devel(a)= ov=3D irt.org
http://lists.ovirt.org/mailman/listinfo/engine-devel

------=3D_Part_21090047_1204116571.1385888119663-- --===============4969084531728349995== Content-Type: multipart/alternative MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.bin" LS0tLS0tPV9QYXJ0XzIxMDkwMDQ3XzEyMDQxMTY1NzEuMTM4NTg4ODExOTY2MwpDb250ZW50LVR5 cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzog N2JpdAoKLS0tLS0gT3JpZ2luYWwgTWVzc2FnZSAtLS0tLQoKPiBGcm9tOiAiTWlrZSBLb2xlc25p ayIgPG1rb2xlc25pQHJlZGhhdC5jb20+Cj4gVG86ICJLYW5hZ2FyYWoiIDxrbWF5aWxzYUByZWRo YXQuY29tPgo+IENjOiAiZW5naW5lLWRldmVsIiA8ZW5naW5lLWRldmVsQG92aXJ0Lm9yZz4KPiBT ZW50OiBTdW5kYXksIERlY2VtYmVyIDEsIDIwMTMgODowODo0MiBBTQo+IFN1YmplY3Q6IFJlOiBb RW5naW5lLWRldmVsXSBVc2luZyBjb25maWcgdmFsdWVzCgo+IC0tLS0tIE9yaWdpbmFsIE1lc3Nh Z2UgLS0tLS0KCj4gPiBIaSBBbGwsCj4gCj4gSGkgS2FuYWdhcmFqLAoKPiA+IFRoZSBhcmUgc29t ZSBpc3N1ZXMgYXJpc2luZyBpbiBjb25maWd1cmF0aW9ucyB3aGVuZXZlciB3ZSBtb3ZlIHVwIG9u IHRoZQo+ID4gdmVyc2lvbnMoMy4zID0+IDMuNCksIGJlY2F1c2Ugb2YgdGhlIHdheSB3ZSBzdG9y ZSBhbmQgaW50ZXJwcmV0IHRoZW0uCj4gCgo+ID4gV2hlbmV2ZXIgdGhlcmUgaXMgYSBuZXcgY2x1 c3RlciBsZXZlbCwgeW91IHdpbGwgbmVlZCB0byBhZGQgYSBuZXcgZW50cnkgZm9yCj4gPiBhbGwo bW9zdCkgb2YgdGhlIGNvbmZpZ3VyYXRpb24uIE1vc3RseSBhIGNvcHkgcGFzdGUgaWYgeW91IHNl ZSBmcm9tIDMuMiB0bwo+ID4gMy4zLCBleGNlcHQgc29tZSBDUFUvUE0gdHlwZSByZWxhdGVkIGNv bmZpZ3VyYXRpb25zLgo+IAo+ID4gQmV0dGVyIG9wdGlvbiB3b3VsZCBiZSB0byBoYXZlIHRoZSBk ZWZhdWwgY29uZmlnIHZhbHVlIGluIENvbmZpZ1ZhbHVlcy5qYXZhCj4gPiBhbmQgdGhlIG92ZXJy aWRlcyB3aWxsIGdvIHRvIGNvbmZpZy5zcWwuIEluIHRoaXMgYXBwcm9hY2ggeW91IGRvbid0IG5l ZWQgYQo+ID4gbmV3IGVudHJpZXMgdG8gY29uZmlnLnNxbCB3aGVuIHRoZXJlIGlzIGEgbmV3IGNs dXN0ZXIgbGV2ZWwuCj4gCgo+ID4gTGV0cyB0YWtlIGFuIGV4bWFwbGUsICJTdXBwb3J0Rm9yY2VD cmVhdGVWRyIgLSBUaGlzIGlzIHN1cHBvcnRlZCBmcm9tIDMuMQo+ID4gb253YXJkcywKPiAKCj4g PiBJZiB5b3UgbG9vayBhdCBjb25maWcuc3FsLCB5b3Ugd2lsbCBzZWUgZm9sbG93aW5nIGVudHJp ZXMKPiAKPiA+IHNlbGVjdCBmbl9kYl9hZGRfY29uZmlnX3ZhbHVlKCdTdXBwb3J0Rm9yY2VDcmVh dGVWRycsJ2ZhbHNlJywnMy4wJyk7Cj4gCj4gPiBzZWxlY3QgZm5fZGJfYWRkX2NvbmZpZ192YWx1 ZSgnU3VwcG9ydEZvcmNlQ3JlYXRlVkcnLCd0cnVlJywnMy4xJyk7Cj4gCj4gPiBzZWxlY3QgZm5f ZGJfYWRkX2NvbmZpZ192YWx1ZSgnU3VwcG9ydEZvcmNlQ3JlYXRlVkcnLCd0cnVlJywnMy4yJyk7 Cj4gCj4gPiBzZWxlY3QgZm5fZGJfYWRkX2NvbmZpZ192YWx1ZSgnU3VwcG9ydEZvcmNlQ3JlYXRl VkcnLCd0cnVlJywnMy4zJyk7Cj4gCgo+ID4gQW5kIGluIENvbmZpZ1ZhbHVlcy5qYXZhCj4gCgo+ ID4gQFR5cGVDb252ZXJ0ZXJBdHRyaWJ1dGUoQm9vbGVhbi5jbGFzcykKPiAKPiA+IEBEZWZhdWx0 VmFsdWVBdHRyaWJ1dGUoImZhbHNlIikKPiAKPiA+IFN1cHBvcnRGb3JjZUNyZWF0ZVZHLAo+IAoK PiA+IE5vdyBpZiB0aGVyZSBpcyAzLjQgYW5kIDMuNSwgdGhlIHVzZXIgbmVlZHMgdG8gYWRkIDIg bW9yZSBlbnRyaWVzLCB3aGljaCBpCj4gPiBmZWVsIGlzIHJlZHVuZGFudC4KPiAKCj4gPiBJbnN0 ZWFkIHdlIGNhbiBtYWtlCj4gCgo+ID4gQFR5cGVDb252ZXJ0ZXJBdHRyaWJ1dGUoQm9vbGVhbi5j bGFzcykKPiAKPiA+IEBEZWZhdWx0VmFsdWVBdHRyaWJ1dGUoInRydWUiKQo+IAo+ID4gU3VwcG9y dEZvcmNlQ3JlYXRlVkcsCj4gCgo+ID4gYW5kIGhhdmUgb25seSB0aGUgZm9sbG93aW5nIGluIGNv bmZpZy5zcWwKPiAKPiA+IHNlbGVjdCBmbl9kYl9hZGRfY29uZmlnX3ZhbHVlKCdTdXBwb3J0Rm9y Y2VDcmVhdGVWRycsJ2ZhbHNlJywnMy4wJyk7Cj4gCgo+ID4gaWYgYSBwYXJ0aWN1bGFyIHZhbHVl KGZvciBhIHNwZWNpZmljIGNsdXN0ZXIgbGV2ZWwpIGlzIG5vdCBmb3VuZCBpbgo+ID4gQ29uZmln LnNxbCwgdGhlIGZhbGxiYWNrIGlzIHRvIHVzZSB0aGUgdmFsdWUgYXZhaWxhYmxlIGluCj4gPiBD b25maWdWYWx1ZXMuamF2YS4KPiAKPiBUaGlzIGhhcyBhbHJlYWR5IGJlZW4gaW1wbGVtZW50ZWQs IHRoZXJlIGFyZSBtYW55ICJmZWF0dXJlIHN1cHBvcnRlZCIKPiBjb25maWd1cmF0aW9ucyB3b3Jr aW5nIGxpa2UgdGhpcyAoZm9yIGV4YW1wbGUgR2x1c3RlclN1cHBvcnQpLgoKPiBJIHRoaW5rIGEg bW9yZSBpbnRlcmVzdGluZyBhcHByb2FjaCB3b3VsZCBiZSB0byBtb3ZlIHRoZXNlIG91dCBvZiB0 aGUgREIKPiBzaW5jZSB0aGVzZSB2YWx1ZXMgZG9uJ3QgcmVhbGx5IGhhdiBlIGEgcmVzb24gdG8g YmUgdGhlcmUuCj4gU2luY2UgdGhlIGVudGlyZSB0aGluZyBpcyBhYnN0cmFjdGVkIGJ5ICJHbHVz dGVyL0ZlYXR1cmVTdXBwb3J0ZWQiIGNsYXNzZXMKPiB0aGVuIHdlIGNhbiBlYXNpbHkgY2hhbmdl IG1lY2hhbmlzbSAob2YgY291cnNlIHdoYXRldmVyIGNvZGUgaXMgbm90IHVzaW5nIGl0Cj4gY2Fu IGJlIGVhc2lseSBjb252ZXJ0ZWQgdG8gdXNlIHRoZSBtZWNoYW5pc20pCgo+IEZvciBleGFtcGxl IGEgc2ltcGxlIGVudW0gY291bGQgZG8gdGhlIHRyaWNrOgo+IC0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0gRVhBTVBMRQo+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KPiAvKioKPiAqIENvbnZlbmllbmNlIGNsYXNzIHRvIGNoZWNrIGlmIGEgZ2x1c3Rl ciBmZWF0dXJlIGlzIHN1cHBvcnRlZCBvciBub3QgaW4gYW55Cj4gZ2l2ZW4gdmVyc2lvbi48YnI+ Cj4gKiBNZXRob2RzIHNob3VsZCBiZSBuYW1lZCBieSBmZWF0dXJlIGFuZCBhY2NlcHQgdmVyc2lv biB0byBjaGVjayBhZ2FpbnN0Lgo+ICovCj4gcHVibGljIGNsYXNzIEdsdXN0ZXJGZWF0dXJlU3Vw cG9ydGVkIHsKPiAvKioKPiAqIEBwYXJhbSB2ZXJzaW9uCj4gKiBDb21wYXRpYmlsaXR5IHZlcnNp b24gdG8gY2hlY2sgZm9yLgo+ICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBnbHVzdGVy IHN1cHBvcnQgaXMgZW5hYmxlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+Cj4gaWYgaXQncyBub3QuCj4g Ki8KPiBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2x1c3RlcihWZXJzaW9uIHZlcnNpb24pIHsKPiBy ZXR1cm4gU3VwcG9ydGVkRmVhdHVyZXMuR0xVU1RFUi5pc1N1cHBvcnRlZE9uKHZlcnNpb24pOwo+ IH0KCj4gLyoqCj4gKiBAcGFyYW0gdmVyc2lvbgo+ICogQ29tcGF0aWJpbGl0eSB2ZXJzaW9uIHRv IGNoZWNrIGZvci4KPiAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZ2x1c3RlciBoZWF2 eXdlaWdodCByZWZyZXNoIGlzIGVuYWJsZWQsCj4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0J3Mg bm90Lgo+ICovCj4gcHVibGljIHN0YXRpYyBib29sZWFuIHJlZnJlc2hIZWF2eVdlaWdodChWZXJz aW9uIHZlcnNpb24pIHsKPiByZXR1cm4gU3VwcG9ydGVkRmVhdHVyZXMuUkVGUkVTSF9IRUFWWVdF SUdIVC5pc1N1cHBvcnRlZE9uKHZlcnNpb24pOwo+IH0KCj4gLyogTW9yZSBtZXRob2RzLi4uICov Cgo+IGVudW0gU3VwcG9ydGVkRmVhdHVyZXMgewo+IEdMVVNURVIoVmVyc2lvbi52M18wKSwKPiBS RUZSRVNIX0hFQVZZV0VJR0hUKFZlcnNpb24udjNfMCwgVmVyc2lvbi52M18xKSwKPiAvKiBNb3Jl IG1lbWJlcnMgKi87Cgo+IHByaXZhdGUgU2V0PFZlcnNpb24+IHVuc3VwcG9ydGVkVmVyc2lvbnMg PSBuZXcgSGFzaFNldDxWZXJzaW9uPigpOwoKPiBwcml2YXRlIFN1cHBvcnRlZEZlYXR1cmVzKFZl cnNpb24uLi4gdmVyc2lvbnMpIHsKPiB1bnN1cHBvcnRlZFZlcnNpb25zLmFkZEFsbChBcnJheXMu YXNMaXN0KHZlcnNpb25zKSk7Cj4gfQoKPiBwdWJsaWMgYm9vbGVhbiBpc1N1cHBvcnRlZE9uKFZl cnNpb24gdmVyc2lvbikgewo+IHJldHVybiAhdW5zdXBwb3J0ZWRWZXJzaW9ucy5jb250YWlucyh2 ZXJzaW9uKTsKPiB9Cj4gfQo+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0g RU5EIEVYQU1QTEUKPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgo+IFRo b3VnaHRzPwoKdW5sZXNzIGkgZGlkbid0IHVuZGVyc3RhbmQgc29tZXRoaW5nLCB0aGlzIGlzIG5v dCBnb29kLCAKdGhpcyBzaG91bGQgc3RheSBjb25maWd1cmFibGUgYnkgdGhlIHVzZXJzLCAKZm9y IGV4YW1wbGUgaWYgc29tZSB1c2VyIGV4cGVyaWVuY2Ugc29tZSBpc3N1ZXMgd2l0aCBhIGZlYXR1 cmUgYW5kIHdhbnQgdG8gdHVybiBpdCBvZmYvY2hhbmdlIHRoZSB2YWx1ZXMuLiAKKG5vdCBhbGwg dmVyc2lvbiBjb25maWd1cmF0aW9uIGFyZSBib29sZWFuLCBzb21lIGFyZSBkaWZmZXJlbnQgdmFs dWVzIHRvIGRpZmZlcmVudCB2ZXJzaW9ucywgbGlrZSBjcHUtbGlzdCkgCgo+IFJlZ2FyZHMsCj4g TWlrZQoKPiA+IFBsZWFzZSBzaGFyZSB5b3VyIHRob3VnaHRzIG9uIHRoaXMuCj4gCgo+ID4gVGhh bmtzLAo+IAo+ID4gS2FuYWdhcmFqCj4gCgo+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCj4gRW5naW5lLWRldmVsIG1haWxpbmcgbGlzdAo+IEVuZ2luZS1k ZXZlbEBvdmlydC5vcmcKPiBodHRwOi8vbGlzdHMub3ZpcnQub3JnL21haWxtYW4vbGlzdGluZm8v ZW5naW5lLWRldmVsCgotLS0tLS09X1BhcnRfMjEwOTAwNDdfMTIwNDExNjU3MS4xMzg1ODg4MTE5 NjYzCkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04CkNvbnRlbnQtVHJhbnNm ZXItRW5jb2Rpbmc6IHF1b3RlZC1wcmludGFibGUKCjxodG1sPjxib2R5PjxkaXYgc3R5bGU9M0Qi Zm9udC1mYW1pbHk6IHRpbWVzIG5ldyByb21hbiwgbmV3IHlvcmssIHRpbWVzLCBzZT0KcmlmOyBm b250LXNpemU6IDEycHQ7IGNvbG9yOiAjMDAwMDAwIj48ZGl2Pjxicj48L2Rpdj48ZGl2Pjxicj48 L2Rpdj48aHIgaWQ9Cj0zRCJ6d2NociI+PGJsb2NrcXVvdGUgc3R5bGU9M0QiYm9yZGVyLWxlZnQ6 MnB4IHNvbGlkICMxMDEwRkY7bWFyZ2luLWxlZnQ6NT0KcHg7cGFkZGluZy1sZWZ0OjVweDtjb2xv cjojMDAwO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0eWxlOm5vcm1hbDt0ZXh0LWRlPQpjb3Jh dGlvbjpub25lO2ZvbnQtZmFtaWx5OkhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6 ZToxMnB0OyI+PGI+RnI9Cm9tOiA8L2I+Ik1pa2UgS29sZXNuaWsiICZsdDtta29sZXNuaUByZWRo YXQuY29tJmd0Ozxicj48Yj5UbzogPC9iPiJLYW5hZ2FyYT0KaiIgJmx0O2ttYXlpbHNhQHJlZGhh dC5jb20mZ3Q7PGJyPjxiPkNjOiA8L2I+ImVuZ2luZS1kZXZlbCIgJmx0O2VuZ2luZS1kZXZlPQps QG92aXJ0Lm9yZyZndDs8YnI+PGI+U2VudDogPC9iPlN1bmRheSwgRGVjZW1iZXIgMSwgMjAxMyA4 OjA4OjQyIEFNPGJyPjxiPlM9CnViamVjdDogPC9iPlJlOiBbRW5naW5lLWRldmVsXSBVc2luZyBj b25maWcgdmFsdWVzPGJyPjxkaXY+PGJyPjwvZGl2PjxkaXYgcz0KdHlsZT0zRCJmb250LWZhbWls eTogdGltZXMgbmV3IHJvbWFuLCBuZXcgeW9yaywgdGltZXMsIHNlcmlmOyBmb250LXNpemU6IDEy PQpwdDsgY29sb3I6ICMwMDAwMDAiPjxociBpZD0zRCJ6d2NociI+PGJsb2NrcXVvdGUgc3R5bGU9 M0QiYm9yZGVyLWxlZnQ6MnB4IHM9Cm9saWQgIzEwMTBGRjttYXJnaW4tbGVmdDo1cHg7cGFkZGlu Zy1sZWZ0OjVweDtjb2xvcjojMDAwO2ZvbnQtd2VpZ2h0Om5vcm1hbD0KO2ZvbnQtc3R5bGU6bm9y bWFsO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtZmFtaWx5OkhlbHZldGljYSxBcmlhbCxzYW5z LXNlPQpyaWY7Zm9udC1zaXplOjEycHQ7Ij4KID0yMAoKICAgPTIwCiA9MjAKID0yMAogICAgSGkg QWxsLDwvYmxvY2txdW90ZT48ZGl2Pjxicj48L2Rpdj48ZGl2PkhpIEthbmFnYXJhaiw8YnI+PC9k aXY+PGRpdj48YnI9Cj48L2Rpdj48YmxvY2txdW90ZSBzdHlsZT0zRCJib3JkZXItbGVmdDoycHgg c29saWQgIzEwMTBGRjttYXJnaW4tbGVmdDo1cHg7cD0KYWRkaW5nLWxlZnQ6NXB4O2NvbG9yOiMw MDA7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3R5bGU6bm9ybWFsO3RleHQtZGVjb3JhPQp0aW9u Om5vbmU7Zm9udC1mYW1pbHk6SGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjEy cHQ7Ij48YnI+CiAgICBUaGUgYXJlIHNvbWUgaXNzdWVzIGFyaXNpbmcgaW4gY29uZmlndXJhdGlv bnMgd2hlbmV2ZXIgd2UgbW92ZSB1cCBvbgogICAgdGhlIHZlcnNpb25zKDMuMyA9M0QmZ3Q7IDMu NCksIGJlY2F1c2Ugb2YgdGhlIHdheSB3ZSBzdG9yZSBhbmQKICAgIGludGVycHJldCB0aGVtLjxi cj48ZGl2Pjxicj48L2Rpdj4KICAgIFdoZW5ldmVyIHRoZXJlIGlzIGEgbmV3IGNsdXN0ZXIgbGV2 ZWwsIHlvdSB3aWxsIG5lZWQgdG8gYWRkIGEgbmV3CiAgICBlbnRyeSBmb3IgYWxsKG1vc3QpIG9m IHRoZSBjb25maWd1cmF0aW9uLiBNb3N0bHkgYSBjb3B5IHBhc3RlIGlmIHlvdQogICAgc2VlIGZy b20gMy4yIHRvIDMuMywgZXhjZXB0IHNvbWUgQ1BVL1BNIHR5cGUgcmVsYXRlZCBjb25maWd1cmF0 aW9ucy48YnI9Cj4KICAgIEJldHRlciBvcHRpb24gd291bGQgYmUgdG8gaGF2ZSB0aGUgZGVmYXVs IGNvbmZpZyB2YWx1ZSBpbgogICAgQ29uZmlnVmFsdWVzLmphdmEgYW5kIHRoZSBvdmVycmlkZXMg d2lsbCBnbyB0byBjb25maWcuc3FsLiBJbiB0aGlzCiAgICBhcHByb2FjaCB5b3UgZG9uJ3QgbmVl ZCBhIG5ldyBlbnRyaWVzIHRvIGNvbmZpZy5zcWwgd2hlbiB0aGVyZSBpcyBhCiAgICBuZXcgY2x1 c3RlciBsZXZlbC48YnI+PGRpdj48YnI+PC9kaXY+CiAgICBMZXRzIHRha2UgYW4gZXhtYXBsZSwg IlN1cHBvcnRGb3JjZUNyZWF0ZVZHIiAtIFRoaXMgaXMgc3VwcG9ydGVkCiAgICBmcm9tIDMuMSBv bndhcmRzLDxicj48ZGl2Pjxicj48L2Rpdj4KICAgIElmIHlvdSBsb29rIGF0IGNvbmZpZy5zcWws IHlvdSB3aWxsIHNlZSBmb2xsb3dpbmcgZW50cmllcyA8YnI+CiAgICBzZWxlY3QgZm5fZGJfYWRk X2NvbmZpZ192YWx1ZSgnU3VwcG9ydEZvcmNlQ3JlYXRlVkcnLCdmYWxzZScsJzMuMCcpOwogICAg PGJyPgogICAgc2VsZWN0IGZuX2RiX2FkZF9jb25maWdfdmFsdWUoJ1N1cHBvcnRGb3JjZUNyZWF0 ZVZHJywndHJ1ZScsJzMuMScpOwogICAgPGJyPgogICAgc2VsZWN0IGZuX2RiX2FkZF9jb25maWdf dmFsdWUoJ1N1cHBvcnRGb3JjZUNyZWF0ZVZHJywndHJ1ZScsJzMuMicpOwogICAgPGJyPgogICAg c2VsZWN0IGZuX2RiX2FkZF9jb25maWdfdmFsdWUoJ1N1cHBvcnRGb3JjZUNyZWF0ZVZHJywndHJ1 ZScsJzMuMycpOzxicj49CjxkaXY+PGJyPjwvZGl2PgogICAgQW5kIGluIENvbmZpZ1ZhbHVlcy5q YXZhPGJyPjxkaXY+PGJyPjwvZGl2PgogICAgJm5ic3A7Jm5ic3A7Jm5ic3A7IEBUeXBlQ29udmVy dGVyQXR0cmlidXRlKEJvb2xlYW4uY2xhc3MpPGJyPgogICAgJm5ic3A7Jm5ic3A7Jm5ic3A7IEBE ZWZhdWx0VmFsdWVBdHRyaWJ1dGUoImZhbHNlIik8YnI+CiAgICAmbmJzcDsmbmJzcDsmbmJzcDsg U3VwcG9ydEZvcmNlQ3JlYXRlVkcsPGJyPjxkaXY+PGJyPjwvZGl2PgogICAgTm93IGlmIHRoZXJl IGlzIDMuNCBhbmQgMy41LCB0aGUgdXNlciBuZWVkcyB0byBhZGQgMiBtb3JlIGVudHJpZXMsCiAg ICB3aGljaCBpIGZlZWwgaXMgcmVkdW5kYW50Ljxicj48ZGl2Pjxicj48L2Rpdj4KICAgIEluc3Rl YWQgd2UgY2FuIG1ha2UgPGJyPjxkaXY+PGJyPjwvZGl2PgogICAgJm5ic3A7Jm5ic3A7Jm5ic3A7 IEBUeXBlQ29udmVydGVyQXR0cmlidXRlKEJvb2xlYW4uY2xhc3MpPGJyPgogICAgJm5ic3A7Jm5i c3A7Jm5ic3A7IEBEZWZhdWx0VmFsdWVBdHRyaWJ1dGUoInRydWUiKTxicj4KICAgICZuYnNwOyZu YnNwOyZuYnNwOyBTdXBwb3J0Rm9yY2VDcmVhdGVWRyw8YnI+PGRpdj48YnI+PC9kaXY+CiAgICBh bmQgaGF2ZSBvbmx5IHRoZSBmb2xsb3dpbmcgaW4gY29uZmlnLnNxbDxicj4KICAgIHNlbGVjdCBm bl9kYl9hZGRfY29uZmlnX3ZhbHVlKCdTdXBwb3J0Rm9yY2VDcmVhdGVWRycsJ2ZhbHNlJywnMy4w Jyk7PGJyPQo+PGRpdj48YnI+PC9kaXY+CiAgICBpZiBhIHBhcnRpY3VsYXIgdmFsdWUoZm9yIGEg c3BlY2lmaWMgY2x1c3RlciBsZXZlbCkgaXMgbm90IGZvdW5kIGluCiAgICBDb25maWcuc3FsLCB0 aGUgZmFsbGJhY2sgaXMgdG8gdXNlIHRoZSB2YWx1ZSBhdmFpbGFibGUgaW4KICAgIENvbmZpZ1Zh bHVlcy5qYXZhLjwvYmxvY2txdW90ZT48ZGl2Pjxicj48L2Rpdj48ZGl2PlRoaXMgaGFzIGFscmVh ZHkgYmVlPQpuIGltcGxlbWVudGVkLCB0aGVyZSBhcmUgbWFueSAiZmVhdHVyZSBzdXBwb3J0ZWQi IGNvbmZpZ3VyYXRpb25zIHdvcmtpbmcgbGk9CmtlIHRoaXMgKGZvciBleGFtcGxlIEdsdXN0ZXJT dXBwb3J0KS48YnI+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5JIHRoaW5rID0KYSBtb3JlIGlu dGVyZXN0aW5nIGFwcHJvYWNoIHdvdWxkIGJlIHRvIG1vdmUgdGhlc2Ugb3V0IG9mIHRoZSBEQiBz aW5jZSB0aGVzPQplIHZhbHVlcyBkb24ndCByZWFsbHkgaGF2IGUgYSByZXNvbiB0byBiZSB0aGVy ZS48YnI+PC9kaXY+PGRpdj5TaW5jZSB0aGUgZW49CnRpcmUgdGhpbmcgaXMgYWJzdHJhY3RlZCBi eSAiR2x1c3Rlci9GZWF0dXJlU3VwcG9ydGVkIiBjbGFzc2VzIHRoZW4gd2UgY2FuID0KZWFzaWx5 IGNoYW5nZSBtZWNoYW5pc20gKG9mIGNvdXJzZSB3aGF0ZXZlciBjb2RlIGlzIG5vdCB1c2luZyBp dCBjYW4gYmUgZWFzPQppbHkgY29udmVydGVkIHRvIHVzZSB0aGUgbWVjaGFuaXNtKTxicj48L2Rp dj48ZGl2Pjxicj48L2Rpdj48ZGl2PkZvciBleGFtcGw9CmUgYSBzaW1wbGUgZW51bSBjb3VsZCBk byB0aGUgdHJpY2s6PGJyPjwvZGl2PjxkaXY+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT0KLS0t LS0tLS0tLS0tIEVYQU1QTEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTxi cj48L2Rpdj48ZGl2Pi8qPQoqPGJyPiZuYnNwOyogQ29udmVuaWVuY2UgY2xhc3MgdG8gY2hlY2sg aWYgYSBnbHVzdGVyIGZlYXR1cmUgaXMgc3VwcG9ydGVkIG89CnIgbm90IGluIGFueSBnaXZlbiB2 ZXJzaW9uLiZsdDticiZndDs8YnI+Jm5ic3A7KiBNZXRob2RzIHNob3VsZCBiZSBuYW1lZCBieT0K IGZlYXR1cmUgYW5kIGFjY2VwdCB2ZXJzaW9uIHRvIGNoZWNrIGFnYWluc3QuPGJyPiZuYnNwOyov PGJyPnB1YmxpYyBjbGFzcyBHPQpsdXN0ZXJGZWF0dXJlU3VwcG9ydGVkIHs8L2Rpdj48ZGl2PiZu YnNwOyZuYnNwOyZuYnNwOyAvKio8YnI+Jm5ic3A7Jm5ic3A7Jm49CmJzcDsmbmJzcDsgKiBAcGFy YW0gdmVyc2lvbjxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgKiZuYnNwOyZuYnNwOyZuYnNw Oz0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IENvbXBh dGliaWxpdHkgdmVyc2lvbiB0byBjPQpoZWNrIGZvci48YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7ICogQHJldHVybiAmbHQ7Y29kZSZndDt0cnVlJmx0Oy9jb2RlJmc9CnQ7IGlmIGdsdXN0ZXIg c3VwcG9ydCBpcyBlbmFibGVkLCAmbHQ7Y29kZSZndDtmYWxzZSZsdDsvY29kZSZndDsgaWYgaXQn cyBubz0KdC48YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICovPGJyPiZuYnNwOyZuYnNwOyZu YnNwOyBwdWJsaWMgc3RhdGljIGJvb2xlPQphbiBnbHVzdGVyKFZlcnNpb24gdmVyc2lvbikgezxi cj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs9CiByZXR1cm4gU3Vw cG9ydGVkRmVhdHVyZXMuR0xVU1RFUi5pc1N1cHBvcnRlZE9uKHZlcnNpb24pOzxicj4mbmJzcDsm bmJzcDsmbj0KYnNwOyB9PGJyPjxkaXY+PGJyPjwvZGl2PiZuYnNwOyZuYnNwOyZuYnNwOyAvKio8 YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PQogKiBAcGFyYW0gdmVyc2lvbjxicj4mbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsgKiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnM9CnA7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IENvbXBhdGliaWxpdHkgdmVyc2lvbiB0byBj aGVjayBmb3IuPD0KYnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICogQHJldHVybiAmbHQ7Y29k ZSZndDt0cnVlJmx0Oy9jb2RlJmd0OyBpZiBnbHVzPQp0ZXIgaGVhdnl3ZWlnaHQgcmVmcmVzaCBp cyBlbmFibGVkLCAmbHQ7Y29kZSZndDtmYWxzZSZsdDsvY29kZSZndDsgaWYgaXQncyA9Cm5vdC48 YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICovPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJs aWMgc3RhdGljIGJvbz0KbGVhbiByZWZyZXNoSGVhdnlXZWlnaHQoVmVyc2lvbiB2ZXJzaW9uKSB7 PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwPQo7Jm5ic3A7Jm5ic3A7IHJldHVybiBT dXBwb3J0ZWRGZWF0dXJlcy5SRUZSRVNIX0hFQVZZV0VJR0hULmlzU3VwcG9ydGVkT24odmU9CnJz aW9uKTs8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IH08YnI+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRp dj4mbmJzcDsmbmJzcDsmbj0KYnNwOyAvKiBNb3JlIG1ldGhvZHMuLi4gKi88L2Rpdj48ZGl2Pjxi cj4mbmJzcDsmbmJzcDsmbmJzcDsgZW51bSBTdXBwb3J0ZWRGPQplYXR1cmVzIHs8YnI+Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEdMVVNURVIoVmVyc2lvbi52M189 CjApLDxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgUkVGUkVT SF9IRUFWWVdFSUdIVChWZXJzaT0Kb24udjNfMCwgVmVyc2lvbi52M18xKSw8L2Rpdj48ZGl2PiZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwPQo7IC8qIE1vcmUgbWVtYmVy cyAqLzs8YnI+PGRpdj48YnI+PC9kaXY+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A9CjsmbmJzcDsgcHJpdmF0ZSBTZXQmbHQ7VmVyc2lvbiZndDsgdW5zdXBwb3J0ZWRWZXJzaW9u cyA9M0QgbmV3IEhhc2hTZXQmbHQ7Vj0KZXJzaW9uJmd0OygpOzxicj48ZGl2Pjxicj48L2Rpdj4m bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPQpwcml2YXRlIFN1cHBv cnRlZEZlYXR1cmVzKFZlcnNpb24uLi4gdmVyc2lvbnMpIHs8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A9CjsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgdW5zdXBw b3J0ZWRWZXJzaW9ucy5hZGRBbGwoQXJyYT0KeXMuYXNMaXN0KHZlcnNpb25zKSk7PGJyPiZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB9PGJyPjxkPQppdj48YnI+PC9k aXY+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBib29s ZWFuIGlzU3U9CnBwb3J0ZWRPbihWZXJzaW9uIHZlcnNpb24pIHs8YnI+Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jj0KbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcmV0 dXJuICF1bnN1cHBvcnRlZFZlcnNpb25zLmNvbnRhaW5zKHZlcnNpb24pOzxicj4mPQpuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB9PGJyPiZuYnNwOyZuYnNwOyZuYnNw OyB9PC9kaXY+PGQ9Cml2Pi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRU5E IEVYQU1QTEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT0KLS0tLS0tLS0tLS0tLS0tPC9kaXY+PGRp dj48YnI+PC9kaXY+PGRpdj5UaG91Z2h0cz88L2Rpdj48L2Rpdj48L2Jsb2NrcXVvdGU+PQo8ZGl2 Pjxicj51bmxlc3MgaSBkaWRuJ3QgdW5kZXJzdGFuZCBzb21ldGhpbmcsIHRoaXMgaXMgbm90IGdv b2QsPGJyPjwvZGl2Pjw9CmRpdj50aGlzIHNob3VsZCBzdGF5IGNvbmZpZ3VyYWJsZSBieSB0aGUg dXNlcnMsPGJyPjwvZGl2PjxkaXY+Zm9yIGV4YW1wbGUgaT0KZiBzb21lIHVzZXIgZXhwZXJpZW5j ZSBzb21lIGlzc3VlcyB3aXRoIGEgZmVhdHVyZSBhbmQgd2FudCB0byB0dXJuIGl0IG9mZi9jPQpo YW5nZSB0aGUgdmFsdWVzLi4gPC9kaXY+PGRpdj4obm90IGFsbCB2ZXJzaW9uIGNvbmZpZ3VyYXRp b24gYXJlIGJvb2xlYW4sIHM9Cm9tZSBhcmUgZGlmZmVyZW50IHZhbHVlcyB0byBkaWZmZXJlbnQg dmVyc2lvbnMsIGxpa2UgY3B1LWxpc3QpPGJyPjwvZGl2PjxibD0Kb2NrcXVvdGUgc3R5bGU9M0Qi Ym9yZGVyLWxlZnQ6MnB4IHNvbGlkICMxMDEwRkY7bWFyZ2luLWxlZnQ6NXB4O3BhZGRpbmctbGVm PQp0OjVweDtjb2xvcjojMDAwO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0eWxlOm5vcm1hbDt0 ZXh0LWRlY29yYXRpb246bm9uZTs9CmZvbnQtZmFtaWx5OkhlbHZldGljYSxBcmlhbCxzYW5zLXNl cmlmO2ZvbnQtc2l6ZToxMnB0OyI+PGRpdiBzdHlsZT0zRCJmb250LT0KZmFtaWx5OiB0aW1lcyBu ZXcgcm9tYW4sIG5ldyB5b3JrLCB0aW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6 ICMwPQowMDAwMCI+PGRpdj48YnI+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5SZWdhcmRzLDxi cj48L2Rpdj48ZGl2Pk1pa2U8YnI+PC89CmRpdj48YmxvY2txdW90ZSBzdHlsZT0zRCJib3JkZXIt bGVmdDoycHggc29saWQgIzEwMTBGRjttYXJnaW4tbGVmdDo1cHg7cGFkZD0KaW5nLWxlZnQ6NXB4 O2NvbG9yOiMwMDA7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3R5bGU6bm9ybWFsO3RleHQtZGVj b3JhdGlvPQpuOm5vbmU7Zm9udC1mYW1pbHk6SGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7Zm9u dC1zaXplOjEycHQ7Ij48YnI+CiAgICBQbGVhc2Ugc2hhcmUgeW91ciB0aG91Z2h0cyBvbiB0aGlz Ljxicj48ZGl2Pjxicj48L2Rpdj4KICAgIFRoYW5rcyw8YnI+CiAgICBLYW5hZ2FyYWo8YnI+PGRp dj48YnI+PC9kaXY+PC9ibG9ja3F1b3RlPjwvZGl2Pjxicj5fX19fX19fX19fX19fX19fX19fXz0K X19fX19fX19fX19fX19fX19fX19fX19fX19fPGJyPkVuZ2luZS1kZXZlbCBtYWlsaW5nIGxpc3Q8 YnI+RW5naW5lLWRldmVsQG92PQppcnQub3JnPGJyPmh0dHA6Ly9saXN0cy5vdmlydC5vcmcvbWFp bG1hbi9saXN0aW5mby9lbmdpbmUtZGV2ZWw8YnI+PC9ibG9ja3E9CnVvdGU+PGRpdj48YnI+PC9k aXY+PC9kaXY+PC9ib2R5PjwvaHRtbD4KLS0tLS0tPV9QYXJ0XzIxMDkwMDQ3XzEyMDQxMTY1NzEu MTM4NTg4ODExOTY2My0tCg== --===============4969084531728349995==-- From mkolesni at redhat.com Sun Dec 1 04:01:51 2013 Content-Type: multipart/mixed; boundary="===============3156409857702630307==" MIME-Version: 1.0 From: Mike Kolesnik To: devel at ovirt.org Subject: Re: [Engine-devel] Using config values Date: Sun, 01 Dec 2013 04:01:50 -0500 Message-ID: <1138287431.43206802.1385888510815.JavaMail.root@redhat.com> In-Reply-To: 1268805500.21090048.1385888119665.JavaMail.root@redhat.com --===============3156409857702630307== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable ------=3D_Part_43206801_1748816137.1385888510809 Content-Type: text/plain; charset=3Dutf-8 Content-Transfer-Encoding: 7bit ----- Original Message ----- > ----- Original Message ----- > > From: "Mike Kolesnik" > = > > To: "Kanagaraj" > = > > Cc: "engine-devel" > = > > Sent: Sunday, December 1, 2013 8:08:42 AM > = > > Subject: Re: [Engine-devel] Using config values > = > > ----- Original Message ----- > = > > > Hi All, > > = > = > > Hi Kanagaraj, > = > > > The are some issues arising in configurations whenever we move up on = the > > > versions(3.3 =3D> 3.4), because of the way we store and interpret the= m. > > = > = > > > Whenever there is a new cluster level, you will need to add a new ent= ry > > > for > > > all(most) of the configuration. Mostly a copy paste if you see from 3= .2 > > > to > > > 3.3, except some CPU/PM type related configurations. > > = > = > > > Better option would be to have the defaul config value in > > > ConfigValues.java > > > and the overrides will go to config.sql. In this approach you don't n= eed > > > a > > > new entries to config.sql when there is a new cluster level. > > = > = > > > Lets take an exmaple, "SupportForceCreateVG" - This is supported from= 3.1 > > > onwards, > > = > = > > > If you look at config.sql, you will see following entries > > = > = > > > select fn_db_add_config_value('SupportForceCreateVG','false','3.0'); > > = > = > > > select fn_db_add_config_value('SupportForceCreateVG','true','3.1'); > > = > = > > > select fn_db_add_config_value('SupportForceCreateVG','true','3.2'); > > = > = > > > select fn_db_add_config_value('SupportForceCreateVG','true','3.3'); > > = > = > > > And in ConfigValues.java > > = > = > > > @TypeConverterAttribute(Boolean.class) > > = > = > > > @DefaultValueAttribute("false") > > = > = > > > SupportForceCreateVG, > > = > = > > > Now if there is 3.4 and 3.5, the user needs to add 2 more entries, wh= ich > > > i > > > feel is redundant. > > = > = > > > Instead we can make > > = > = > > > @TypeConverterAttribute(Boolean.class) > > = > = > > > @DefaultValueAttribute("true") > > = > = > > > SupportForceCreateVG, > > = > = > > > and have only the following in config.sql > > = > = > > > select fn_db_add_config_value('SupportForceCreateVG','false','3.0'); > > = > = > > > if a particular value(for a specific cluster level) is not found in > > > Config.sql, the fallback is to use the value available in > > > ConfigValues.java. > > = > = > > This has already been implemented, there are many "feature supported" > > configurations working like this (for example GlusterSupport). > = > > I think a more interesting approach would be to move these out of the DB > > since these values don't really hav e a reson to be there. > = > > Since the entire thing is abstracted by "Gluster/FeatureSupported" clas= ses > > then we can easily change mechanism (of course whatever code is not usi= ng > > it > > can be easily converted to use the mechanism) > = > > For example a simple enum could do the trick: > = > > ------------------------------------- EXAMPLE > > ------------------------------------- > = > > /** > = > > * Convenience class to check if a gluster feature is supported or not in > > any > > given version.
> = > > * Methods should be named by feature and accept version to check agains= t. > = > > */ > = > > public class GlusterFeatureSupported { > = > > /** > = > > * @param version > = > > * Compatibility version to check for. > = > > * @return true if gluster support is enabled, > > false > > if it's not. > = > > */ > = > > public static boolean gluster(Version version) { > = > > return SupportedFeatures.GLUSTER.isSupportedOn(version); > = > > } > = > > /** > = > > * @param version > = > > * Compatibility version to check for. > = > > * @return true if gluster heavyweight refresh is enabled, > > false if it's not. > = > > */ > = > > public static boolean refreshHeavyWeight(Version version) { > = > > return SupportedFeatures.REFRESH_HEAVYWEIGHT.isSupportedOn(version); > = > > } > = > > /* More methods... */ > = > > enum SupportedFeatures { > = > > GLUSTER(Version.v3_0), > = > > REFRESH_HEAVYWEIGHT(Version.v3_0, Version.v3_1), > = > > /* More members */; > = > > private Set unsupportedVersions =3D new HashSet(); > = > > private SupportedFeatures(Version... versions) { > = > > unsupportedVersions.addAll(Arrays.asList(versions)); > = > > } > = > > public boolean isSupportedOn(Version version) { > = > > return !unsupportedVersions.contains(version); > = > > } > = > > } > = > > ------------------------------------- END EXAMPLE > > ------------------------------------- > = > > Thoughts? > = > unless i didn't understand something, this is not good, > this should stay configurable by the users, > for example if some user experience some issues with a feature and want to > turn it off/change the values.. > (not all version configuration are boolean, some are different values to > different versions, like cpu-list) This is for API level compatibility. = If VDSM doesn't support for example hot plug in 3.1 then the user can't jus= t decide that it does and change it. = Also, this is not changeable by user since it's not exposed by engine-confi= g (nor should it be). = This is strictly for the engine-VDSM API compatibility, not for other confi= gs which are version specific. = > > Regards, > = > > Mike > = > > > Please share your thoughts on this. > > = > = > > > Thanks, > > = > = > > > Kanagaraj > > = > = > > _______________________________________________ > = > > Engine-devel mailing list > = > > Engine-devel(a)ovirt.org > = > > http://lists.ovirt.org/mailman/listinfo/engine-devel > = ------=3D_Part_43206801_1748816137.1385888510809 Content-Type: text/html; charset=3Dutf-8 Content-Transfer-Encoding: quoted-printable




From: "Mike Kolesnik= =3D " <mkolesni(a)redhat.com>
To: "Kanagaraj" <kmayilsa(a)re= dhat=3D .com>
Cc: "engine-devel" <engine-devel(a)ovirt.org>
<= b>=3D Sent: Sunday, December 1, 2013 8:08:42 AM
Subject: Re: [Engin= =3D e-devel] Using config values


Hi All,

Hi Kana= =3D garaj,


The are some issues arising in configurations whenever we= =3D move up on the versions(3.3 =3D3D> 3.4), because of the way we store an= d =3D interpret them.

Whenever there is a new cluster level, yo= =3D u will need to add a new entry for all(most) of the configuration. Mostly a= =3D copy paste if you see from 3.2 to 3.3, except some CPU/PM type related con= =3D figurations.
Better option would be to have the defaul config value in = =3D ConfigValues.java and the overrides will go to config.sql. In this approach= =3D you don't need a new entries to config.sql when there is a new cluster lev= =3D el.

Lets take an exmaple, "SupportForceCreateVG" - This i= =3D s supported from 3.1 onwards,

If you look at config.sql, = =3D you will see following entries
select fn_db_add_config_value('SupportF= =3D orceCreateVG','false','3.0');
select fn_db_add_config_value('SupportFo= =3D rceCreateVG','true','3.1');
select fn_db_add_config_value('SupportForc= =3D eCreateVG','true','3.2');
select fn_db_add_config_value('SupportForceC= =3D reateVG','true','3.3');

And in ConfigValues.java
= =3D
    @TypeConverterAttribute(Boolean.class)
&nb= =3D sp;   @DefaultValueAttribute("false")
    Supp= =3D ortForceCreateVG,

Now if there is 3.4 and 3.5, the user n= =3D eeds to add 2 more entries, which i feel is redundant.

In= =3D stead we can make

    @TypeConverterAttri= =3D bute(Boolean.class)
    @DefaultValueAttribute("true")     SupportForceCreateVG,

and have only= =3D the following in config.sql
select fn_db_add_config_value('SupportForc= =3D eCreateVG','false','3.0');

if a particular value(for a sp= =3D ecific cluster level) is not found in Config.sql, the fallback is to use th= =3D e value available in ConfigValues.java.

Thi= =3D s has already been implemented, there are many "feature supported" configur= =3D ations working like this (for example GlusterSupport).

I think a more interesting approach would be to move these out of = =3D the DB since these values don't really hav e a reson to be there.
= =3D
Since the entire thing is abstracted by "Gluster/FeatureSupported" cla= =3D sses then we can easily change mechanism (of course whatever code is not us= =3D ing it can be easily converted to use the mechanism)

For example a simple enum could do the trick:
--------= =3D ----------------------------- EXAMPLE -------------------------------------= =3D
/**
 * Convenience class to check if a gluster featu= =3D re is supported or not in any given version.<br>
 * Methods s= =3D hould be named by feature and accept version to check against.
 */<= =3D br>public class GlusterFeatureSupported {
    /**<= =3D br>     * @param version
     *&= =3D nbsp;           Compatibi= =3D lity version to check for.
     * @return <code&g= =3D t;true</code> if gluster support is enabled, <code>false</co= =3D de> if it's not.
     */
    pu= =3D blic static boolean gluster(Version version) {
    &= =3D nbsp;   return SupportedFeatures.GLUSTER.isSupportedOn(version);<= =3D br>    }

    /**
 &= =3D nbsp;   * @param version
     *  = =3D ;          Compatibility versi= =3D on to check for.
     * @return <code>true<= =3D /code> if gluster heavyweight refresh is enabled, <code>false</= =3D code> if it's not.
     */
    = =3D public static boolean refreshHeavyWeight(Version version) {
  = =3D       return SupportedFeatures.REFRESH_HEAVYWEIGHT= =3D .isSupportedOn(version);
    }

    /* More methods... */

   = =3D ; enum SupportedFeatures {
        GL= =3D USTER(Version.v3_0),
        REFRESH_= =3D HEAVYWEIGHT(Version.v3_0, Version.v3_1),
    = =3D     /* More members */;

   = =3D      private Set<Version> unsupportedVersions =3D= 3D=3D new HashSet<Version>();

    &n= =3D bsp;   private SupportedFeatures(Version... versions) {
 = =3D            unsupportedVer= =3D sions.addAll(Arrays.asList(versions));
     &nb= =3D sp;  }

        pu= =3D blic boolean isSupportedOn(Version version) {
    &n= =3D bsp;       return !unsupportedVersions.contai= =3D ns(version);
        }
  = =3D ;  }
------------------------------------- END EXAMPLE -----= =3D --------------------------------

Thoughts?

unless i didn't understand something, this is not= =3D good,
this should stay configurable by the users,
<= =3D div>for example if some user experience some issues with a feature and want= =3D to turn it off/change the values..
(not all version configuratio= =3D n are boolean, some are different values to different versions, like cpu-li= =3D st)

This is for API level compa= =3D tibility.
If VDSM doesn't support for example hot plug in 3.1= =3D then the user can't just decide that it does and change it.
= =3D Also, this is not changeable by user since it's not exposed by engine-confi= =3D g (nor should it be).

This is strictly for the= =3D engine-VDSM API compatibility, not for other configs which are version spe= =3D cific.

= =3D


Regards,
Mike

Please share your thoughts on this.

Thanks,
Kanagaraj


= =3D _______________________________________________
Engine-devel mailing lis= =3D t
Engine-devel(a)ovirt.org
http://lists.ovirt.org/mailman/listinfo/en= gi=3D ne-devel


<= =3D /div> ------=3D_Part_43206801_1748816137.1385888510809-- --===============3156409857702630307== Content-Type: multipart/alternative MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.bin" LS0tLS0tPV9QYXJ0XzQzMjA2ODAxXzE3NDg4MTYxMzcuMTM4NTg4ODUxMDgwOQpDb250ZW50LVR5 cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzog N2JpdAoKLS0tLS0gT3JpZ2luYWwgTWVzc2FnZSAtLS0tLQoKPiAtLS0tLSBPcmlnaW5hbCBNZXNz YWdlIC0tLS0tCgo+ID4gRnJvbTogIk1pa2UgS29sZXNuaWsiIDxta29sZXNuaUByZWRoYXQuY29t Pgo+IAo+ID4gVG86ICJLYW5hZ2FyYWoiIDxrbWF5aWxzYUByZWRoYXQuY29tPgo+IAo+ID4gQ2M6 ICJlbmdpbmUtZGV2ZWwiIDxlbmdpbmUtZGV2ZWxAb3ZpcnQub3JnPgo+IAo+ID4gU2VudDogU3Vu ZGF5LCBEZWNlbWJlciAxLCAyMDEzIDg6MDg6NDIgQU0KPiAKPiA+IFN1YmplY3Q6IFJlOiBbRW5n aW5lLWRldmVsXSBVc2luZyBjb25maWcgdmFsdWVzCj4gCgo+ID4gLS0tLS0gT3JpZ2luYWwgTWVz c2FnZSAtLS0tLQo+IAoKPiA+ID4gSGkgQWxsLAo+ID4gCj4gCj4gPiBIaSBLYW5hZ2FyYWosCj4g Cgo+ID4gPiBUaGUgYXJlIHNvbWUgaXNzdWVzIGFyaXNpbmcgaW4gY29uZmlndXJhdGlvbnMgd2hl bmV2ZXIgd2UgbW92ZSB1cCBvbiB0aGUKPiA+ID4gdmVyc2lvbnMoMy4zID0+IDMuNCksIGJlY2F1 c2Ugb2YgdGhlIHdheSB3ZSBzdG9yZSBhbmQgaW50ZXJwcmV0IHRoZW0uCj4gPiAKPiAKCj4gPiA+ IFdoZW5ldmVyIHRoZXJlIGlzIGEgbmV3IGNsdXN0ZXIgbGV2ZWwsIHlvdSB3aWxsIG5lZWQgdG8g YWRkIGEgbmV3IGVudHJ5Cj4gPiA+IGZvcgo+ID4gPiBhbGwobW9zdCkgb2YgdGhlIGNvbmZpZ3Vy YXRpb24uIE1vc3RseSBhIGNvcHkgcGFzdGUgaWYgeW91IHNlZSBmcm9tIDMuMgo+ID4gPiB0bwo+ ID4gPiAzLjMsIGV4Y2VwdCBzb21lIENQVS9QTSB0eXBlIHJlbGF0ZWQgY29uZmlndXJhdGlvbnMu Cj4gPiAKPiAKPiA+ID4gQmV0dGVyIG9wdGlvbiB3b3VsZCBiZSB0byBoYXZlIHRoZSBkZWZhdWwg Y29uZmlnIHZhbHVlIGluCj4gPiA+IENvbmZpZ1ZhbHVlcy5qYXZhCj4gPiA+IGFuZCB0aGUgb3Zl cnJpZGVzIHdpbGwgZ28gdG8gY29uZmlnLnNxbC4gSW4gdGhpcyBhcHByb2FjaCB5b3UgZG9uJ3Qg bmVlZAo+ID4gPiBhCj4gPiA+IG5ldyBlbnRyaWVzIHRvIGNvbmZpZy5zcWwgd2hlbiB0aGVyZSBp cyBhIG5ldyBjbHVzdGVyIGxldmVsLgo+ID4gCj4gCgo+ID4gPiBMZXRzIHRha2UgYW4gZXhtYXBs ZSwgIlN1cHBvcnRGb3JjZUNyZWF0ZVZHIiAtIFRoaXMgaXMgc3VwcG9ydGVkIGZyb20gMy4xCj4g PiA+IG9ud2FyZHMsCj4gPiAKPiAKCj4gPiA+IElmIHlvdSBsb29rIGF0IGNvbmZpZy5zcWwsIHlv dSB3aWxsIHNlZSBmb2xsb3dpbmcgZW50cmllcwo+ID4gCj4gCj4gPiA+IHNlbGVjdCBmbl9kYl9h ZGRfY29uZmlnX3ZhbHVlKCdTdXBwb3J0Rm9yY2VDcmVhdGVWRycsJ2ZhbHNlJywnMy4wJyk7Cj4g PiAKPiAKPiA+ID4gc2VsZWN0IGZuX2RiX2FkZF9jb25maWdfdmFsdWUoJ1N1cHBvcnRGb3JjZUNy ZWF0ZVZHJywndHJ1ZScsJzMuMScpOwo+ID4gCj4gCj4gPiA+IHNlbGVjdCBmbl9kYl9hZGRfY29u ZmlnX3ZhbHVlKCdTdXBwb3J0Rm9yY2VDcmVhdGVWRycsJ3RydWUnLCczLjInKTsKPiA+IAo+IAo+ ID4gPiBzZWxlY3QgZm5fZGJfYWRkX2NvbmZpZ192YWx1ZSgnU3VwcG9ydEZvcmNlQ3JlYXRlVkcn LCd0cnVlJywnMy4zJyk7Cj4gPiAKPiAKCj4gPiA+IEFuZCBpbiBDb25maWdWYWx1ZXMuamF2YQo+ ID4gCj4gCgo+ID4gPiBAVHlwZUNvbnZlcnRlckF0dHJpYnV0ZShCb29sZWFuLmNsYXNzKQo+ID4g Cj4gCj4gPiA+IEBEZWZhdWx0VmFsdWVBdHRyaWJ1dGUoImZhbHNlIikKPiA+IAo+IAo+ID4gPiBT dXBwb3J0Rm9yY2VDcmVhdGVWRywKPiA+IAo+IAoKPiA+ID4gTm93IGlmIHRoZXJlIGlzIDMuNCBh bmQgMy41LCB0aGUgdXNlciBuZWVkcyB0byBhZGQgMiBtb3JlIGVudHJpZXMsIHdoaWNoCj4gPiA+ IGkKPiA+ID4gZmVlbCBpcyByZWR1bmRhbnQuCj4gPiAKPiAKCj4gPiA+IEluc3RlYWQgd2UgY2Fu IG1ha2UKPiA+IAo+IAoKPiA+ID4gQFR5cGVDb252ZXJ0ZXJBdHRyaWJ1dGUoQm9vbGVhbi5jbGFz cykKPiA+IAo+IAo+ID4gPiBARGVmYXVsdFZhbHVlQXR0cmlidXRlKCJ0cnVlIikKPiA+IAo+IAo+ ID4gPiBTdXBwb3J0Rm9yY2VDcmVhdGVWRywKPiA+IAo+IAoKPiA+ID4gYW5kIGhhdmUgb25seSB0 aGUgZm9sbG93aW5nIGluIGNvbmZpZy5zcWwKPiA+IAo+IAo+ID4gPiBzZWxlY3QgZm5fZGJfYWRk X2NvbmZpZ192YWx1ZSgnU3VwcG9ydEZvcmNlQ3JlYXRlVkcnLCdmYWxzZScsJzMuMCcpOwo+ID4g Cj4gCgo+ID4gPiBpZiBhIHBhcnRpY3VsYXIgdmFsdWUoZm9yIGEgc3BlY2lmaWMgY2x1c3RlciBs ZXZlbCkgaXMgbm90IGZvdW5kIGluCj4gPiA+IENvbmZpZy5zcWwsIHRoZSBmYWxsYmFjayBpcyB0 byB1c2UgdGhlIHZhbHVlIGF2YWlsYWJsZSBpbgo+ID4gPiBDb25maWdWYWx1ZXMuamF2YS4KPiA+ IAo+IAo+ID4gVGhpcyBoYXMgYWxyZWFkeSBiZWVuIGltcGxlbWVudGVkLCB0aGVyZSBhcmUgbWFu eSAiZmVhdHVyZSBzdXBwb3J0ZWQiCj4gPiBjb25maWd1cmF0aW9ucyB3b3JraW5nIGxpa2UgdGhp cyAoZm9yIGV4YW1wbGUgR2x1c3RlclN1cHBvcnQpLgo+IAoKPiA+IEkgdGhpbmsgYSBtb3JlIGlu dGVyZXN0aW5nIGFwcHJvYWNoIHdvdWxkIGJlIHRvIG1vdmUgdGhlc2Ugb3V0IG9mIHRoZSBEQgo+ ID4gc2luY2UgdGhlc2UgdmFsdWVzIGRvbid0IHJlYWxseSBoYXYgZSBhIHJlc29uIHRvIGJlIHRo ZXJlLgo+IAo+ID4gU2luY2UgdGhlIGVudGlyZSB0aGluZyBpcyBhYnN0cmFjdGVkIGJ5ICJHbHVz dGVyL0ZlYXR1cmVTdXBwb3J0ZWQiIGNsYXNzZXMKPiA+IHRoZW4gd2UgY2FuIGVhc2lseSBjaGFu Z2UgbWVjaGFuaXNtIChvZiBjb3Vyc2Ugd2hhdGV2ZXIgY29kZSBpcyBub3QgdXNpbmcKPiA+IGl0 Cj4gPiBjYW4gYmUgZWFzaWx5IGNvbnZlcnRlZCB0byB1c2UgdGhlIG1lY2hhbmlzbSkKPiAKCj4g PiBGb3IgZXhhbXBsZSBhIHNpbXBsZSBlbnVtIGNvdWxkIGRvIHRoZSB0cmljazoKPiAKPiA+IC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRVhBTVBMRQo+ID4gLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+IAo+ID4gLyoqCj4gCj4gPiAqIENvbnZlbmll bmNlIGNsYXNzIHRvIGNoZWNrIGlmIGEgZ2x1c3RlciBmZWF0dXJlIGlzIHN1cHBvcnRlZCBvciBu b3QgaW4KPiA+IGFueQo+ID4gZ2l2ZW4gdmVyc2lvbi48YnI+Cj4gCj4gPiAqIE1ldGhvZHMgc2hv dWxkIGJlIG5hbWVkIGJ5IGZlYXR1cmUgYW5kIGFjY2VwdCB2ZXJzaW9uIHRvIGNoZWNrIGFnYWlu c3QuCj4gCj4gPiAqLwo+IAo+ID4gcHVibGljIGNsYXNzIEdsdXN0ZXJGZWF0dXJlU3VwcG9ydGVk IHsKPiAKPiA+IC8qKgo+IAo+ID4gKiBAcGFyYW0gdmVyc2lvbgo+IAo+ID4gKiBDb21wYXRpYmls aXR5IHZlcnNpb24gdG8gY2hlY2sgZm9yLgo+IAo+ID4gKiBAcmV0dXJuIDxjb2RlPnRydWU8L2Nv ZGU+IGlmIGdsdXN0ZXIgc3VwcG9ydCBpcyBlbmFibGVkLAo+ID4gPGNvZGU+ZmFsc2U8L2NvZGU+ Cj4gPiBpZiBpdCdzIG5vdC4KPiAKPiA+ICovCj4gCj4gPiBwdWJsaWMgc3RhdGljIGJvb2xlYW4g Z2x1c3RlcihWZXJzaW9uIHZlcnNpb24pIHsKPiAKPiA+IHJldHVybiBTdXBwb3J0ZWRGZWF0dXJl cy5HTFVTVEVSLmlzU3VwcG9ydGVkT24odmVyc2lvbik7Cj4gCj4gPiB9Cj4gCgo+ID4gLyoqCj4g Cj4gPiAqIEBwYXJhbSB2ZXJzaW9uCj4gCj4gPiAqIENvbXBhdGliaWxpdHkgdmVyc2lvbiB0byBj aGVjayBmb3IuCj4gCj4gPiAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZ2x1c3RlciBo ZWF2eXdlaWdodCByZWZyZXNoIGlzIGVuYWJsZWQsCj4gPiA8Y29kZT5mYWxzZTwvY29kZT4gaWYg aXQncyBub3QuCj4gCj4gPiAqLwo+IAo+ID4gcHVibGljIHN0YXRpYyBib29sZWFuIHJlZnJlc2hI ZWF2eVdlaWdodChWZXJzaW9uIHZlcnNpb24pIHsKPiAKPiA+IHJldHVybiBTdXBwb3J0ZWRGZWF0 dXJlcy5SRUZSRVNIX0hFQVZZV0VJR0hULmlzU3VwcG9ydGVkT24odmVyc2lvbik7Cj4gCj4gPiB9 Cj4gCgo+ID4gLyogTW9yZSBtZXRob2RzLi4uICovCj4gCgo+ID4gZW51bSBTdXBwb3J0ZWRGZWF0 dXJlcyB7Cj4gCj4gPiBHTFVTVEVSKFZlcnNpb24udjNfMCksCj4gCj4gPiBSRUZSRVNIX0hFQVZZ V0VJR0hUKFZlcnNpb24udjNfMCwgVmVyc2lvbi52M18xKSwKPiAKPiA+IC8qIE1vcmUgbWVtYmVy cyAqLzsKPiAKCj4gPiBwcml2YXRlIFNldDxWZXJzaW9uPiB1bnN1cHBvcnRlZFZlcnNpb25zID0g bmV3IEhhc2hTZXQ8VmVyc2lvbj4oKTsKPiAKCj4gPiBwcml2YXRlIFN1cHBvcnRlZEZlYXR1cmVz KFZlcnNpb24uLi4gdmVyc2lvbnMpIHsKPiAKPiA+IHVuc3VwcG9ydGVkVmVyc2lvbnMuYWRkQWxs KEFycmF5cy5hc0xpc3QodmVyc2lvbnMpKTsKPiAKPiA+IH0KPiAKCj4gPiBwdWJsaWMgYm9vbGVh biBpc1N1cHBvcnRlZE9uKFZlcnNpb24gdmVyc2lvbikgewo+IAo+ID4gcmV0dXJuICF1bnN1cHBv cnRlZFZlcnNpb25zLmNvbnRhaW5zKHZlcnNpb24pOwo+IAo+ID4gfQo+IAo+ID4gfQo+IAo+ID4g LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFTkQgRVhBTVBMRQo+ID4gLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+IAoKPiA+IFRob3VnaHRzPwo+IAoK PiB1bmxlc3MgaSBkaWRuJ3QgdW5kZXJzdGFuZCBzb21ldGhpbmcsIHRoaXMgaXMgbm90IGdvb2Qs Cj4gdGhpcyBzaG91bGQgc3RheSBjb25maWd1cmFibGUgYnkgdGhlIHVzZXJzLAo+IGZvciBleGFt cGxlIGlmIHNvbWUgdXNlciBleHBlcmllbmNlIHNvbWUgaXNzdWVzIHdpdGggYSBmZWF0dXJlIGFu ZCB3YW50IHRvCj4gdHVybiBpdCBvZmYvY2hhbmdlIHRoZSB2YWx1ZXMuLgo+IChub3QgYWxsIHZl cnNpb24gY29uZmlndXJhdGlvbiBhcmUgYm9vbGVhbiwgc29tZSBhcmUgZGlmZmVyZW50IHZhbHVl cyB0bwo+IGRpZmZlcmVudCB2ZXJzaW9ucywgbGlrZSBjcHUtbGlzdCkKClRoaXMgaXMgZm9yIEFQ SSBsZXZlbCBjb21wYXRpYmlsaXR5LiAKSWYgVkRTTSBkb2Vzbid0IHN1cHBvcnQgZm9yIGV4YW1w bGUgaG90IHBsdWcgaW4gMy4xIHRoZW4gdGhlIHVzZXIgY2FuJ3QganVzdCBkZWNpZGUgdGhhdCBp dCBkb2VzIGFuZCBjaGFuZ2UgaXQuIApBbHNvLCB0aGlzIGlzIG5vdCBjaGFuZ2VhYmxlIGJ5IHVz ZXIgc2luY2UgaXQncyBub3QgZXhwb3NlZCBieSBlbmdpbmUtY29uZmlnIChub3Igc2hvdWxkIGl0 IGJlKS4gCgpUaGlzIGlzIHN0cmljdGx5IGZvciB0aGUgZW5naW5lLVZEU00gQVBJIGNvbXBhdGli aWxpdHksIG5vdCBmb3Igb3RoZXIgY29uZmlncyB3aGljaCBhcmUgdmVyc2lvbiBzcGVjaWZpYy4g Cgo+ID4gUmVnYXJkcywKPiAKPiA+IE1pa2UKPiAKCj4gPiA+IFBsZWFzZSBzaGFyZSB5b3VyIHRo b3VnaHRzIG9uIHRoaXMuCj4gPiAKPiAKCj4gPiA+IFRoYW5rcywKPiA+IAo+IAo+ID4gPiBLYW5h Z2FyYWoKPiA+IAo+IAoKPiA+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fCj4gCj4gPiBFbmdpbmUtZGV2ZWwgbWFpbGluZyBsaXN0Cj4gCj4gPiBFbmdpbmUt ZGV2ZWxAb3ZpcnQub3JnCj4gCj4gPiBodHRwOi8vbGlzdHMub3ZpcnQub3JnL21haWxtYW4vbGlz dGluZm8vZW5naW5lLWRldmVsCj4gCgotLS0tLS09X1BhcnRfNDMyMDY4MDFfMTc0ODgxNjEzNy4x Mzg1ODg4NTEwODA5CkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04CkNvbnRl bnQtVHJhbnNmZXItRW5jb2Rpbmc6IHF1b3RlZC1wcmludGFibGUKCjxodG1sPjxib2R5PjxkaXYg c3R5bGU9M0QiZm9udC1mYW1pbHk6IHRpbWVzIG5ldyByb21hbiwgbmV3IHlvcmssIHRpbWVzLCBz ZT0KcmlmOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiAjMDAwMDAwIj48aHIgaWQ9M0QiendjaHIi PjxibG9ja3F1b3RlIHN0eWxlPTNEPQoiYm9yZGVyLWxlZnQ6MnB4IHNvbGlkICMxMDEwRkY7bWFy Z2luLWxlZnQ6NXB4O3BhZGRpbmctbGVmdDo1cHg7Y29sb3I6IzAwMDs9CmZvbnQtd2VpZ2h0Om5v cm1hbDtmb250LXN0eWxlOm5vcm1hbDt0ZXh0LWRlY29yYXRpb246bm9uZTtmb250LWZhbWlseTpI ZWx2ZT0KdGljYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB0OyIgZGF0YS1tY2Utc3R5 bGU9M0QiYm9yZGVyLWxlZnQ6IDJweCBzPQpvbGlkICMxMDEwRkY7IG1hcmdpbi1sZWZ0OiA1cHg7 IHBhZGRpbmctbGVmdDogNXB4OyBjb2xvcjogIzAwMDsgZm9udC13ZWlnaHQ9Cjogbm9ybWFsOyBm b250LXN0eWxlOiBub3JtYWw7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC1mYW1pbHk6IEhl bHZldGljYT0KLEFyaWFsLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsiPjxkaXYgc3R5bGU9 M0QiZm9udC1mYW1pbHk6IHRpbWVzIG5ldyByPQpvbWFuLCBuZXcgeW9yaywgdGltZXMsIHNlcmlm OyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiAjMDAwMDAwIiBkYXRhLW1jZS1zdHk9CmxlPTNEImZv bnQtZmFtaWx5OiB0aW1lcyBuZXcgcm9tYW4sIG5ldyB5b3JrLCB0aW1lcywgc2VyaWY7IGZvbnQt c2l6ZTogMTJwdD0KOyBjb2xvcjogIzAwMDAwMDsiPjxkaXY+PGJyPjwvZGl2PjxkaXY+PGJyPjwv ZGl2PjxociBpZD0zRCJ6d2NociI+PGJsb2NrcXVvPQp0ZSBzdHlsZT0zRCJib3JkZXItbGVmdDoy cHggc29saWQgIzEwMTBGRjttYXJnaW4tbGVmdDo1cHg7cGFkZGluZy1sZWZ0OjVweDs9CmNvbG9y OiMwMDA7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3R5bGU6bm9ybWFsO3RleHQtZGVjb3JhdGlv bjpub25lO2ZvbnQtZj0KYW1pbHk6SGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXpl OjEycHQ7IiBkYXRhLW1jZS1zdHlsZT0zRCJib3JkZXItPQpsZWZ0OiAycHggc29saWQgIzEwMTBG RjsgbWFyZ2luLWxlZnQ6IDVweDsgcGFkZGluZy1sZWZ0OiA1cHg7IGNvbG9yOiAjMDAwOyA9CmZv bnQtd2VpZ2h0OiBub3JtYWw7IGZvbnQtc3R5bGU6IG5vcm1hbDsgdGV4dC1kZWNvcmF0aW9uOiBu b25lOyBmb250LWZhbWlseT0KOiBIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjsgZm9udC1zaXpl OiAxMnB0OyI+PGI+RnJvbTogPC9iPiJNaWtlIEtvbGVzbmlrPQoiICZsdDtta29sZXNuaUByZWRo YXQuY29tJmd0Ozxicj48Yj5UbzogPC9iPiJLYW5hZ2FyYWoiICZsdDtrbWF5aWxzYUByZWRoYXQ9 Ci5jb20mZ3Q7PGJyPjxiPkNjOiA8L2I+ImVuZ2luZS1kZXZlbCIgJmx0O2VuZ2luZS1kZXZlbEBv dmlydC5vcmcmZ3Q7PGJyPjxiPj0KU2VudDogPC9iPlN1bmRheSwgRGVjZW1iZXIgMSwgMjAxMyA4 OjA4OjQyIEFNPGJyPjxiPlN1YmplY3Q6IDwvYj5SZTogW0VuZ2luPQplLWRldmVsXSBVc2luZyBj b25maWcgdmFsdWVzPGJyPjxkaXY+PGJyPjwvZGl2PjxkaXYgc3R5bGU9M0QiZm9udC1mYW1pbHk6 IHQ9CmltZXMgbmV3IHJvbWFuLCBuZXcgeW9yaywgdGltZXMsIHNlcmlmOyBmb250LXNpemU6IDEy cHQ7IGNvbG9yOiAjMDAwMDAwIiBkYT0KdGEtbWNlLXN0eWxlPTNEImZvbnQtZmFtaWx5OiB0aW1l cyBuZXcgcm9tYW4sIG5ldyB5b3JrLCB0aW1lcywgc2VyaWY7IGZvbnQtPQpzaXplOiAxMnB0OyBj b2xvcjogIzAwMDAwMDsiPjxociBpZD0zRCJ6d2NociI+PGJsb2NrcXVvdGUgc3R5bGU9M0QiYm9y ZGVyLWw9CmVmdDoycHggc29saWQgIzEwMTBGRjttYXJnaW4tbGVmdDo1cHg7cGFkZGluZy1sZWZ0 OjVweDtjb2xvcjojMDAwO2ZvbnQtd2VpZz0KaHQ6bm9ybWFsO2ZvbnQtc3R5bGU6bm9ybWFsO3Rl eHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtZmFtaWx5OkhlbHZldGljYSxBcmlhPQpsLHNhbnMtc2Vy aWY7Zm9udC1zaXplOjEycHQ7IiBkYXRhLW1jZS1zdHlsZT0zRCJib3JkZXItbGVmdDogMnB4IHNv bGlkICMxMDE9CjBGRjsgbWFyZ2luLWxlZnQ6IDVweDsgcGFkZGluZy1sZWZ0OiA1cHg7IGNvbG9y OiAjMDAwOyBmb250LXdlaWdodDogbm9ybWFsOz0KIGZvbnQtc3R5bGU6IG5vcm1hbDsgdGV4dC1k ZWNvcmF0aW9uOiBub25lOyBmb250LWZhbWlseTogSGVsdmV0aWNhLEFyaWFsLHNhPQpucy1zZXJp ZjsgZm9udC1zaXplOiAxMnB0OyI+SGkgQWxsLDwvYmxvY2txdW90ZT48ZGl2Pjxicj48L2Rpdj48 ZGl2PkhpIEthbmE9CmdhcmFqLDxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48YmxvY2txdW90ZSBz dHlsZT0zRCJib3JkZXItbGVmdDoycHggc29saWQgIz0KMTAxMEZGO21hcmdpbi1sZWZ0OjVweDtw YWRkaW5nLWxlZnQ6NXB4O2NvbG9yOiMwMDA7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtPQpzdHls ZTpub3JtYWw7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Zm9udC1mYW1pbHk6SGVsdmV0aWNhLEFyaWFs LHNhbnMtc2VyaWY7Zm89Cm50LXNpemU6MTJwdDsiIGRhdGEtbWNlLXN0eWxlPTNEImJvcmRlci1s ZWZ0OiAycHggc29saWQgIzEwMTBGRjsgbWFyZ2luLWxlZj0KdDogNXB4OyBwYWRkaW5nLWxlZnQ6 IDVweDsgY29sb3I6ICMwMDA7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGZvbnQtc3R5bGU6IG5vPQpy bWFsOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsQXJpYWws c2Fucy1zZXJpZjsgZm9udC09CnNpemU6IDEycHQ7Ij48YnI+IFRoZSBhcmUgc29tZSBpc3N1ZXMg YXJpc2luZyBpbiBjb25maWd1cmF0aW9ucyB3aGVuZXZlciB3ZT0KIG1vdmUgdXAgb24gdGhlIHZl cnNpb25zKDMuMyA9M0QmZ3Q7IDMuNCksIGJlY2F1c2Ugb2YgdGhlIHdheSB3ZSBzdG9yZSBhbmQg PQppbnRlcnByZXQgdGhlbS48YnI+PGRpdj48YnI+PC9kaXY+V2hlbmV2ZXIgdGhlcmUgaXMgYSBu ZXcgY2x1c3RlciBsZXZlbCwgeW89CnUgd2lsbCBuZWVkIHRvIGFkZCBhIG5ldyBlbnRyeSBmb3Ig YWxsKG1vc3QpIG9mIHRoZSBjb25maWd1cmF0aW9uLiBNb3N0bHkgYT0KIGNvcHkgcGFzdGUgaWYg eW91IHNlZSBmcm9tIDMuMiB0byAzLjMsIGV4Y2VwdCBzb21lIENQVS9QTSB0eXBlIHJlbGF0ZWQg Y29uPQpmaWd1cmF0aW9ucy48YnI+IEJldHRlciBvcHRpb24gd291bGQgYmUgdG8gaGF2ZSB0aGUg ZGVmYXVsIGNvbmZpZyB2YWx1ZSBpbiA9CkNvbmZpZ1ZhbHVlcy5qYXZhIGFuZCB0aGUgb3ZlcnJp ZGVzIHdpbGwgZ28gdG8gY29uZmlnLnNxbC4gSW4gdGhpcyBhcHByb2FjaD0KIHlvdSBkb24ndCBu ZWVkIGEgbmV3IGVudHJpZXMgdG8gY29uZmlnLnNxbCB3aGVuIHRoZXJlIGlzIGEgbmV3IGNsdXN0 ZXIgbGV2PQplbC48YnI+PGRpdj48YnI+PC9kaXY+TGV0cyB0YWtlIGFuIGV4bWFwbGUsICJTdXBw b3J0Rm9yY2VDcmVhdGVWRyIgLSBUaGlzIGk9CnMgc3VwcG9ydGVkIGZyb20gMy4xIG9ud2FyZHMs PGJyPjxkaXY+PGJyPjwvZGl2PklmIHlvdSBsb29rIGF0IGNvbmZpZy5zcWwsID0KeW91IHdpbGwg c2VlIGZvbGxvd2luZyBlbnRyaWVzIDxicj4gc2VsZWN0IGZuX2RiX2FkZF9jb25maWdfdmFsdWUo J1N1cHBvcnRGPQpvcmNlQ3JlYXRlVkcnLCdmYWxzZScsJzMuMCcpOyA8YnI+IHNlbGVjdCBmbl9k Yl9hZGRfY29uZmlnX3ZhbHVlKCdTdXBwb3J0Rm89CnJjZUNyZWF0ZVZHJywndHJ1ZScsJzMuMScp OyA8YnI+IHNlbGVjdCBmbl9kYl9hZGRfY29uZmlnX3ZhbHVlKCdTdXBwb3J0Rm9yYz0KZUNyZWF0 ZVZHJywndHJ1ZScsJzMuMicpOyA8YnI+IHNlbGVjdCBmbl9kYl9hZGRfY29uZmlnX3ZhbHVlKCdT dXBwb3J0Rm9yY2VDPQpyZWF0ZVZHJywndHJ1ZScsJzMuMycpOzxicj48ZGl2Pjxicj48L2Rpdj5B bmQgaW4gQ29uZmlnVmFsdWVzLmphdmE8YnI+PGRpdj49Cjxicj48L2Rpdj4mbmJzcDsmbmJzcDsm bmJzcDsgQFR5cGVDb252ZXJ0ZXJBdHRyaWJ1dGUoQm9vbGVhbi5jbGFzcyk8YnI+ICZuYj0Kc3A7 Jm5ic3A7Jm5ic3A7IEBEZWZhdWx0VmFsdWVBdHRyaWJ1dGUoImZhbHNlIik8YnI+ICZuYnNwOyZu YnNwOyZuYnNwOyBTdXBwPQpvcnRGb3JjZUNyZWF0ZVZHLDxicj48ZGl2Pjxicj48L2Rpdj5Ob3cg aWYgdGhlcmUgaXMgMy40IGFuZCAzLjUsIHRoZSB1c2VyIG49CmVlZHMgdG8gYWRkIDIgbW9yZSBl bnRyaWVzLCB3aGljaCBpIGZlZWwgaXMgcmVkdW5kYW50Ljxicj48ZGl2Pjxicj48L2Rpdj5Jbj0K c3RlYWQgd2UgY2FuIG1ha2UgPGJyPjxkaXY+PGJyPjwvZGl2PiZuYnNwOyZuYnNwOyZuYnNwOyBA VHlwZUNvbnZlcnRlckF0dHJpPQpidXRlKEJvb2xlYW4uY2xhc3MpPGJyPiAmbmJzcDsmbmJzcDsm bmJzcDsgQERlZmF1bHRWYWx1ZUF0dHJpYnV0ZSgidHJ1ZSIpPGI9CnI+ICZuYnNwOyZuYnNwOyZu YnNwOyBTdXBwb3J0Rm9yY2VDcmVhdGVWRyw8YnI+PGRpdj48YnI+PC9kaXY+YW5kIGhhdmUgb25s eT0KIHRoZSBmb2xsb3dpbmcgaW4gY29uZmlnLnNxbDxicj4gc2VsZWN0IGZuX2RiX2FkZF9jb25m aWdfdmFsdWUoJ1N1cHBvcnRGb3JjPQplQ3JlYXRlVkcnLCdmYWxzZScsJzMuMCcpOzxicj48ZGl2 Pjxicj48L2Rpdj5pZiBhIHBhcnRpY3VsYXIgdmFsdWUoZm9yIGEgc3A9CmVjaWZpYyBjbHVzdGVy IGxldmVsKSBpcyBub3QgZm91bmQgaW4gQ29uZmlnLnNxbCwgdGhlIGZhbGxiYWNrIGlzIHRvIHVz ZSB0aD0KZSB2YWx1ZSBhdmFpbGFibGUgaW4gQ29uZmlnVmFsdWVzLmphdmEuPC9ibG9ja3F1b3Rl PjxkaXY+PGJyPjwvZGl2PjxkaXY+VGhpPQpzIGhhcyBhbHJlYWR5IGJlZW4gaW1wbGVtZW50ZWQs IHRoZXJlIGFyZSBtYW55ICJmZWF0dXJlIHN1cHBvcnRlZCIgY29uZmlndXI9CmF0aW9ucyB3b3Jr aW5nIGxpa2UgdGhpcyAoZm9yIGV4YW1wbGUgR2x1c3RlclN1cHBvcnQpLjxicj48L2Rpdj48ZGl2 Pjxicj48Lz0KZGl2PjxkaXY+SSB0aGluayBhIG1vcmUgaW50ZXJlc3RpbmcgYXBwcm9hY2ggd291 bGQgYmUgdG8gbW92ZSB0aGVzZSBvdXQgb2YgPQp0aGUgREIgc2luY2UgdGhlc2UgdmFsdWVzIGRv bid0IHJlYWxseSBoYXYgZSBhIHJlc29uIHRvIGJlIHRoZXJlLjxicj48L2Rpdj49CjxkaXY+U2lu Y2UgdGhlIGVudGlyZSB0aGluZyBpcyBhYnN0cmFjdGVkIGJ5ICJHbHVzdGVyL0ZlYXR1cmVTdXBw b3J0ZWQiIGNsYT0Kc3NlcyB0aGVuIHdlIGNhbiBlYXNpbHkgY2hhbmdlIG1lY2hhbmlzbSAob2Yg Y291cnNlIHdoYXRldmVyIGNvZGUgaXMgbm90IHVzPQppbmcgaXQgY2FuIGJlIGVhc2lseSBjb252 ZXJ0ZWQgdG8gdXNlIHRoZSBtZWNoYW5pc20pPGJyPjwvZGl2PjxkaXY+PGJyPjwvZGk9CnY+PGRp dj5Gb3IgZXhhbXBsZSBhIHNpbXBsZSBlbnVtIGNvdWxkIGRvIHRoZSB0cmljazo8YnI+PC9kaXY+ PGRpdj4tLS0tLS0tLT0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRVhBTVBMRSAtLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPQo8YnI+PC9kaXY+PGRpdj4vKio8YnI+ Jm5ic3A7KiBDb252ZW5pZW5jZSBjbGFzcyB0byBjaGVjayBpZiBhIGdsdXN0ZXIgZmVhdHU9CnJl IGlzIHN1cHBvcnRlZCBvciBub3QgaW4gYW55IGdpdmVuIHZlcnNpb24uJmx0O2JyJmd0Ozxicj4m bmJzcDsqIE1ldGhvZHMgcz0KaG91bGQgYmUgbmFtZWQgYnkgZmVhdHVyZSBhbmQgYWNjZXB0IHZl cnNpb24gdG8gY2hlY2sgYWdhaW5zdC48YnI+Jm5ic3A7Ki88PQpicj5wdWJsaWMgY2xhc3MgR2x1 c3RlckZlYXR1cmVTdXBwb3J0ZWQgezwvZGl2PjxkaXY+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8qKjw9 CmJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAqIEBwYXJhbSB2ZXJzaW9uPGJyPiZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyAqJj0KbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgQ29tcGF0aWJpPQpsaXR5IHZlcnNpb24gdG8g Y2hlY2sgZm9yLjxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgKiBAcmV0dXJuICZsdDtjb2Rl Jmc9CnQ7dHJ1ZSZsdDsvY29kZSZndDsgaWYgZ2x1c3RlciBzdXBwb3J0IGlzIGVuYWJsZWQsICZs dDtjb2RlJmd0O2ZhbHNlJmx0Oy9jbz0KZGUmZ3Q7IGlmIGl0J3Mgbm90Ljxicj4mbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsgKi88YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1PQpibGljIHN0YXRpYyBi b29sZWFuIGdsdXN0ZXIoVmVyc2lvbiB2ZXJzaW9uKSB7PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyY9Cm5ic3A7Jm5ic3A7Jm5ic3A7IHJldHVybiBTdXBwb3J0ZWRGZWF0dXJlcy5HTFVTVEVS LmlzU3VwcG9ydGVkT24odmVyc2lvbik7PD0KYnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IH08YnI+PGRp dj48YnI+PC9kaXY+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8qKjxicj4mbmJzcDsmPQpuYnNwOyZuYnNw OyZuYnNwOyAqIEBwYXJhbSB2ZXJzaW9uPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAqJm5i c3A7Jm5ic3A9CjsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsgQ29tcGF0aWJpbGl0eSB2ZXJzaT0Kb24gdG8gY2hlY2sgZm9yLjxicj4mbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsgKiBAcmV0dXJuICZsdDtjb2RlJmd0O3RydWUmbHQ7PQovY29kZSZn dDsgaWYgZ2x1c3RlciBoZWF2eXdlaWdodCByZWZyZXNoIGlzIGVuYWJsZWQsICZsdDtjb2RlJmd0 O2ZhbHNlJmx0Oy89CmNvZGUmZ3Q7IGlmIGl0J3Mgbm90Ljxicj4mbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsgKi88YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7ID0KcHVibGljIHN0YXRpYyBib29sZWFuIHJl ZnJlc2hIZWF2eVdlaWdodChWZXJzaW9uIHZlcnNpb24pIHs8YnI+Jm5ic3A7Jm5ic3A7PQombmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcmV0dXJuIFN1cHBvcnRlZEZlYXR1cmVzLlJFRlJF U0hfSEVBVllXRUlHSFQ9Ci5pc1N1cHBvcnRlZE9uKHZlcnNpb24pOzxicj4mbmJzcDsmbmJzcDsm bmJzcDsgfTxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZD0KaXY+Jm5ic3A7Jm5ic3A7Jm5ic3A7 IC8qIE1vcmUgbWV0aG9kcy4uLiAqLzwvZGl2PjxkaXY+PGJyPiZuYnNwOyZuYnNwOyZuYnNwPQo7 IGVudW0gU3VwcG9ydGVkRmVhdHVyZXMgezxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsgR0w9ClVTVEVSKFZlcnNpb24udjNfMCksPGJyPiZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBSRUZSRVNIXz0KSEVBVllXRUlHSFQoVmVyc2lv bi52M18wLCBWZXJzaW9uLnYzXzEpLDwvZGl2PjxkaXY+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 PQombmJzcDsmbmJzcDsmbmJzcDsgLyogTW9yZSBtZW1iZXJzICovOzxicj48ZGl2Pjxicj48L2Rp dj4mbmJzcDsmbmJzcDsmbmJzcDs9CiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwcml2YXRlIFNl dCZsdDtWZXJzaW9uJmd0OyB1bnN1cHBvcnRlZFZlcnNpb25zID0zRD0KIG5ldyBIYXNoU2V0Jmx0 O1ZlcnNpb24mZ3Q7KCk7PGJyPjxkaXY+PGJyPjwvZGl2PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuPQpic3A7Jm5ic3A7Jm5ic3A7IHByaXZhdGUgU3VwcG9ydGVkRmVhdHVyZXMoVmVyc2lvbi4u LiB2ZXJzaW9ucykgezxicj4mbmJzcDs9CiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB1bnN1cHBvcnRlZFZlcj0Kc2lvbnMuYWRkQWxs KEFycmF5cy5hc0xpc3QodmVyc2lvbnMpKTs8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5iPQpzcDsmbmJzcDsgfTxicj48ZGl2Pjxicj48L2Rpdj4mbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcHU9CmJsaWMgYm9vbGVhbiBpc1N1cHBvcnRlZE9uKFZl cnNpb24gdmVyc2lvbikgezxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbj0KYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyByZXR1cm4gIXVuc3VwcG9ydGVkVmVyc2lv bnMuY29udGFpPQpucyh2ZXJzaW9uKTs8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7IH08YnI+Jm5ic3A7Jm5ic3A9CjsmbmJzcDsgfTwvZGl2PjxkaXY+LS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFTkQgRVhBTVBMRSAtLS0tLT0KLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PlRob3Vn aHRzPzwvZGl2PjwvPQpkaXY+PC9ibG9ja3F1b3RlPjxkaXY+PGJyPnVubGVzcyBpIGRpZG4ndCB1 bmRlcnN0YW5kIHNvbWV0aGluZywgdGhpcyBpcyBub3Q9CiBnb29kLDxicj48L2Rpdj48ZGl2PnRo aXMgc2hvdWxkIHN0YXkgY29uZmlndXJhYmxlIGJ5IHRoZSB1c2Vycyw8YnI+PC9kaXY+PD0KZGl2 PmZvciBleGFtcGxlIGlmIHNvbWUgdXNlciBleHBlcmllbmNlIHNvbWUgaXNzdWVzIHdpdGggYSBm ZWF0dXJlIGFuZCB3YW50PQogdG8gdHVybiBpdCBvZmYvY2hhbmdlIHRoZSB2YWx1ZXMuLjwvZGl2 PjxkaXY+KG5vdCBhbGwgdmVyc2lvbiBjb25maWd1cmF0aW89Cm4gYXJlIGJvb2xlYW4sIHNvbWUg YXJlIGRpZmZlcmVudCB2YWx1ZXMgdG8gZGlmZmVyZW50IHZlcnNpb25zLCBsaWtlIGNwdS1saT0K c3QpPC9kaXY+PC9kaXY+PC9ibG9ja3F1b3RlPjxkaXY+PGJyPjwvZGl2PjxkaXY+VGhpcyBpcyBm b3IgQVBJIGxldmVsIGNvbXBhPQp0aWJpbGl0eS48YnI+PC9kaXY+PGRpdj5JZiBWRFNNIGRvZXNu J3Qgc3VwcG9ydCBmb3IgZXhhbXBsZSBob3QgcGx1ZyBpbiAzLjE9CiB0aGVuIHRoZSB1c2VyIGNh bid0IGp1c3QgZGVjaWRlIHRoYXQgaXQgZG9lcyBhbmQgY2hhbmdlIGl0Ljxicj48L2Rpdj48ZGl2 Pj0KQWxzbywgdGhpcyBpcyBub3QgY2hhbmdlYWJsZSBieSB1c2VyIHNpbmNlIGl0J3Mgbm90IGV4 cG9zZWQgYnkgZW5naW5lLWNvbmZpPQpnIChub3Igc2hvdWxkIGl0IGJlKS48YnI+PC9kaXY+PGRp dj48YnI+PC9kaXY+PGRpdj5UaGlzIGlzIHN0cmljdGx5IGZvciB0aGU9CiBlbmdpbmUtVkRTTSBB UEkgY29tcGF0aWJpbGl0eSwgbm90IGZvciBvdGhlciBjb25maWdzIHdoaWNoIGFyZSB2ZXJzaW9u IHNwZT0KY2lmaWMuPGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxibG9ja3F1b3RlIHN0eWxlPTNE ImJvcmRlci1sZWZ0OjJweCBzb2xpZCAjPQoxMDEwRkY7bWFyZ2luLWxlZnQ6NXB4O3BhZGRpbmct bGVmdDo1cHg7Y29sb3I6IzAwMDtmb250LXdlaWdodDpub3JtYWw7Zm9udC09CnN0eWxlOm5vcm1h bDt0ZXh0LWRlY29yYXRpb246bm9uZTtmb250LWZhbWlseTpIZWx2ZXRpY2EsQXJpYWwsc2Fucy1z ZXJpZjtmbz0KbnQtc2l6ZToxMnB0OyIgZGF0YS1tY2Utc3R5bGU9M0QiYm9yZGVyLWxlZnQ6IDJw eCBzb2xpZCAjMTAxMEZGOyBtYXJnaW4tbGVmPQp0OiA1cHg7IHBhZGRpbmctbGVmdDogNXB4OyBj b2xvcjogIzAwMDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgZm9udC1zdHlsZTogbm89CnJtYWw7IHRl eHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC1mYW1pbHk6IEhlbHZldGljYSxBcmlhbCxzYW5zLXNl cmlmOyBmb250LT0Kc2l6ZTogMTJwdDsiPjxkaXYgc3R5bGU9M0QiZm9udC1mYW1pbHk6IHRpbWVz IG5ldyByb21hbiwgbmV3IHlvcmssIHRpbWVzLCBzPQplcmlmOyBmb250LXNpemU6IDEycHQ7IGNv bG9yOiAjMDAwMDAwIiBkYXRhLW1jZS1zdHlsZT0zRCJmb250LWZhbWlseTogdGltZXM9CiBuZXcg cm9tYW4sIG5ldyB5b3JrLCB0aW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6ICMw MDAwMDA7Ij48ZGl2Pj0KPGJyPjwvZGl2PjxibG9ja3F1b3RlIHN0eWxlPTNEImJvcmRlci1sZWZ0 OjJweCBzb2xpZCAjMTAxMEZGO21hcmdpbi1sZWZ0OjVwPQp4O3BhZGRpbmctbGVmdDo1cHg7Y29s b3I6IzAwMDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHlsZTpub3JtYWw7dGV4dC1kZWM9Cm9y YXRpb246bm9uZTtmb250LWZhbWlseTpIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjtmb250LXNp emU6MTJwdDsiIGRhdGEtbT0KY2Utc3R5bGU9M0QiYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjMTAx MEZGOyBtYXJnaW4tbGVmdDogNXB4OyBwYWRkaW5nLWxlZnQ6PQogNXB4OyBjb2xvcjogIzAwMDsg Zm9udC13ZWlnaHQ6IG5vcm1hbDsgZm9udC1zdHlsZTogbm9ybWFsOyB0ZXh0LWRlY29yYXRpb249 Cjogbm9uZTsgZm9udC1mYW1pbHk6IEhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmOyBmb250LXNp emU6IDEycHQ7Ij48ZGl2IHN0eT0KbGU9M0QiZm9udC1mYW1pbHk6IHRpbWVzIG5ldyByb21hbiwg bmV3IHlvcmssIHRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiAxMnB0PQo7IGNvbG9yOiAjMDAwMDAw IiBkYXRhLW1jZS1zdHlsZT0zRCJmb250LWZhbWlseTogdGltZXMgbmV3IHJvbWFuLCBuZXcgeW9y ayw9CiB0aW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6ICMwMDAwMDA7Ij48ZGl2 Pjxicj48L2Rpdj48ZGl2Pjxicj48Lz0KZGl2PjxkaXY+UmVnYXJkcyw8YnI+PC9kaXY+PGRpdj5N aWtlPGJyPjwvZGl2PjxibG9ja3F1b3RlIHN0eWxlPTNEImJvcmRlci1sPQplZnQ6MnB4IHNvbGlk ICMxMDEwRkY7bWFyZ2luLWxlZnQ6NXB4O3BhZGRpbmctbGVmdDo1cHg7Y29sb3I6IzAwMDtmb250 LXdlaWc9Cmh0Om5vcm1hbDtmb250LXN0eWxlOm5vcm1hbDt0ZXh0LWRlY29yYXRpb246bm9uZTtm b250LWZhbWlseTpIZWx2ZXRpY2EsQXJpYT0KbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB0OyIg ZGF0YS1tY2Utc3R5bGU9M0QiYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjMTAxPQowRkY7IG1hcmdp bi1sZWZ0OiA1cHg7IHBhZGRpbmctbGVmdDogNXB4OyBjb2xvcjogIzAwMDsgZm9udC13ZWlnaHQ6 IG5vcm1hbDs9CiBmb250LXN0eWxlOiBub3JtYWw7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9u dC1mYW1pbHk6IEhlbHZldGljYSxBcmlhbCxzYT0KbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsi Pjxicj4gUGxlYXNlIHNoYXJlIHlvdXIgdGhvdWdodHMgb24gdGhpcy48YnI+PGRpPQp2Pjxicj48 L2Rpdj5UaGFua3MsPGJyPiBLYW5hZ2FyYWo8YnI+PGRpdj48YnI+PC9kaXY+PC9ibG9ja3F1b3Rl PjwvZGl2Pjxicj49Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fPGJyPkVuZ2luZS1kZXZlbCBtYWlsaW5nIGxpcz0KdDxicj5FbmdpbmUtZGV2ZWxAb3ZpcnQu b3JnPGJyPmh0dHA6Ly9saXN0cy5vdmlydC5vcmcvbWFpbG1hbi9saXN0aW5mby9lbmdpPQpuZS1k ZXZlbDxicj48L2Jsb2NrcXVvdGU+PGRpdj48YnI+PC9kaXY+PC9kaXY+PC9ibG9ja3F1b3RlPjxk aXY+PGJyPjwvZGl2Pjw9Ci9kaXY+PC9ib2R5PjwvaHRtbD4KLS0tLS0tPV9QYXJ0XzQzMjA2ODAx XzE3NDg4MTYxMzcuMTM4NTg4ODUxMDgwOS0tCg== --===============3156409857702630307==-- From ofrenkel at redhat.com Sun Dec 1 04:02:49 2013 Content-Type: multipart/mixed; boundary="===============4570429135874635133==" MIME-Version: 1.0 From: Omer Frenkel To: devel at ovirt.org Subject: Re: [Engine-devel] Using config values Date: Sun, 01 Dec 2013 04:02:46 -0500 Message-ID: <496533960.21093647.1385888566815.JavaMail.root@redhat.com> In-Reply-To: 1299085692.33736696.1385845115835.JavaMail.root@redhat.com --===============4570429135874635133== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable ----- Original Message ----- > From: "Eli Mesika" > To: "Dusmant Kumar Pati" > Cc: "engine-devel" > Sent: Saturday, November 30, 2013 10:58:35 PM > Subject: Re: [Engine-devel] Using config values > = > = > = > ----- Original Message ----- > > From: "Dusmant Kumar Pati" > > To: "Kanagaraj" , "engine-devel" > > > > Sent: Friday, November 29, 2013 1:40:09 PM > > Subject: Re: [Engine-devel] Using config values > > = > > On 11/29/2013 01:46 PM, Kanagaraj wrote: > > = > > = > > Hi All, > > = > > The are some issues arising in configurations whenever we move up on the > > versions(3.3 =3D> 3.4), because of the way we store and interpret them. > > = > > Whenever there is a new cluster level, you will need to add a new entry= for > > all(most) of the configuration. Mostly a copy paste if you see from 3.2= to > > 3.3, except some CPU/PM type related configurations. > > Better option would be to have the defaul config value in ConfigValues.= java > > and the overrides will go to config.sql. In this approach you don't nee= d a > > new entries to config.sql when there is a new cluster level. > > = > > Lets take an exmaple, "SupportForceCreateVG" - This is supported from 3= .1 > > onwards, > > = > > If you look at config.sql, you will see following entries > > select fn_db_add_config_value('SupportForceCreateVG','false','3.0'); > > select fn_db_add_config_value('SupportForceCreateVG','true','3.1'); > > select fn_db_add_config_value('SupportForceCreateVG','true','3.2'); > > select fn_db_add_config_value('SupportForceCreateVG','true','3.3'); > > = > > And in ConfigValues.java > > = > > @TypeConverterAttribute(Boolean.class) > > @DefaultValueAttribute("false") > > SupportForceCreateVG, > > = > > Now if there is 3.4 and 3.5, the user needs to add 2 more entries, whic= h i > > feel is redundant. > > = > > Instead we can make > > = > > @TypeConverterAttribute(Boolean.class) > > @DefaultValueAttribute("true") > > SupportForceCreateVG, > > = > > and have only the following in config.sql > > select fn_db_add_config_value('SupportForceCreateVG','false','3.0'); > > = > > if a particular value(for a specific cluster level) is not found in > > Config.sql, the fallback is to use the value available in > > ConfigValues.java. > > = > > Please share your thoughts on this. > = > Hi > = > First of all I think its a good idea > I have 2 questions > = > 1) Which value will be stored as default in the java class for configurat= ion > values that are not a boolean, that represents if a feature is active or > not. > Is that the latest version value ? sounds not obvious to me > = i guess this will have to have a configuration values for each version in t= he db. > 2) There are some configuration values that are exposed to the user via t= he > engine-config tool, how this will work, we can not remove the entries the= ir > since the user may change and override those values. > = in your suggestion below, there is the same issue, if user want to change the 3.3 value, engine config will fail with "No such= entry" because 3.3 will not be in the db.. so if we are not fixing this, i think using the current implementation is g= ood enough, no need to add logic, just to convert current options that are not in this = format, to use this logic. > I have a different suggestion: > Default value will stay as is , meaning , it will reflect the value that > should be used to keep the application running correctly if a value is not > found in DB (which should not occur) > = > Code of getting configuration value (getConfigValue(,) will= be > changed to get the closest version value to the given one. > For example , if a 3.4 version is given for a given and we have in = DB > just values for 3.0 and 3.1 , the 3.1 value is returned. > I prefer this solution since it makes the config.sql file self documented= , > showing only value changes and in which version each change occurred. > = > To implement that, we should add this mechanism to the current code that > caches the DB content and as I see that it should be a simple change. > engine-config should be modified such that if the user change a value, th= is > value will be inserted to the database with the current release if not > exists and then the mechanism described above will get this value > = > Example: > = > VdsFenceType lists all the supported fencing agents for power management = , it > currently has the following settings > = > option_value > | > version > -------------------------------------------------------------------------= --------------------+--------- > alom,apc,bladecenter,drac5,eps,ilo,ilo3,ipmilan,rsa,rsb,wti,cisco_ucs > | 3.0 > alom,apc,bladecenter,drac5,eps,ilo,ilo3,ipmilan,rsa,rsb,wti,cisco_ucs > | 3.1 > apc,apc_snmp,bladecenter,cisco_ucs,drac5,eps,ilo,ilo2,ilo3,ilo4,ipmilan,= rsa,rsb,wti > | 3.2 > apc,apc_snmp,bladecenter,cisco_ucs,drac5,eps,ilo,ilo2,ilo3,ilo4,ipmilan,= rsa,rsb,wti > | 3.3 > = > In the proposed solution, we will have > = > option_value > | > version > -------------------------------------------------------------------------= --------------------+--------- > alom,apc,bladecenter,drac5,eps,ilo,ilo3,ipmilan,rsa,rsb,wti,cisco_ucs > | 3.0 > apc,apc_snmp,bladecenter,cisco_ucs,drac5,eps,ilo,ilo2,ilo3,ilo4,ipmilan,= rsa,rsb,wti > | 3.2 > = > This is clear and documents only the changes done between versions and se= rve > all values: boolean , string and complex type (those which requires any k= ind > of parsing) > = > What do you think? > = > Eli > = > = > = > = > = > = > = > = > = > = > = > = > = > = > > = > > Thanks, > > Kanagaraj > > = > > = > > = > > _______________________________________________ > > Engine-devel mailing list Engine-devel(a)ovirt.org > > http://lists.ovirt.org/mailman/listinfo/engine-devel > > I think, this is a good suggestion... > > = > > = > > _______________________________________________ > > Engine-devel mailing list > > Engine-devel(a)ovirt.org > > http://lists.ovirt.org/mailman/listinfo/engine-devel > > = > _______________________________________________ > Engine-devel mailing list > Engine-devel(a)ovirt.org > http://lists.ovirt.org/mailman/listinfo/engine-devel >=20 --===============4570429135874635133==-- From ofrenkel at redhat.com Sun Dec 1 04:09:33 2013 Content-Type: multipart/mixed; boundary="===============8561495138324543877==" MIME-Version: 1.0 From: Omer Frenkel To: devel at ovirt.org Subject: Re: [Engine-devel] Using config values Date: Sun, 01 Dec 2013 04:09:32 -0500 Message-ID: <823270883.21094118.1385888972530.JavaMail.root@redhat.com> In-Reply-To: 1138287431.43206802.1385888510815.JavaMail.root@redhat.com --===============8561495138324543877== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable ------=3D_Part_21094117_1742490232.1385888972528 Content-Type: text/plain; charset=3Dutf-8 Content-Transfer-Encoding: 7bit ----- Original Message ----- > From: "Mike Kolesnik" > To: "Omer Frenkel" > Cc: "Kanagaraj" , "engine-devel" > > Sent: Sunday, December 1, 2013 11:01:50 AM > Subject: Re: [Engine-devel] Using config values > ----- Original Message ----- > > ----- Original Message ----- > = > > > From: "Mike Kolesnik" > > = > = > > > To: "Kanagaraj" > > = > = > > > Cc: "engine-devel" > > = > = > > > Sent: Sunday, December 1, 2013 8:08:42 AM > > = > = > > > Subject: Re: [Engine-devel] Using config values > > = > = > > > ----- Original Message ----- > > = > = > > > > Hi All, > > > = > > = > = > > > Hi Kanagaraj, > > = > = > > > > The are some issues arising in configurations whenever we move up on > > > > the > > > > versions(3.3 =3D> 3.4), because of the way we store and interpret t= hem. > > > = > > = > = > > > > Whenever there is a new cluster level, you will need to add a new e= ntry > > > > for > > > > all(most) of the configuration. Mostly a copy paste if you see from= 3.2 > > > > to > > > > 3.3, except some CPU/PM type related configurations. > > > = > > = > = > > > > Better option would be to have the defaul config value in > > > > ConfigValues.java > > > > and the overrides will go to config.sql. In this approach you don't > > > > need > > > > a > > > > new entries to config.sql when there is a new cluster level. > > > = > > = > = > > > > Lets take an exmaple, "SupportForceCreateVG" - This is supported fr= om > > > > 3.1 > > > > onwards, > > > = > > = > = > > > > If you look at config.sql, you will see following entries > > > = > > = > = > > > > select fn_db_add_config_value('SupportForceCreateVG','false','3.0'); > > > = > > = > = > > > > select fn_db_add_config_value('SupportForceCreateVG','true','3.1'); > > > = > > = > = > > > > select fn_db_add_config_value('SupportForceCreateVG','true','3.2'); > > > = > > = > = > > > > select fn_db_add_config_value('SupportForceCreateVG','true','3.3'); > > > = > > = > = > > > > And in ConfigValues.java > > > = > > = > = > > > > @TypeConverterAttribute(Boolean.class) > > > = > > = > = > > > > @DefaultValueAttribute("false") > > > = > > = > = > > > > SupportForceCreateVG, > > > = > > = > = > > > > Now if there is 3.4 and 3.5, the user needs to add 2 more entries, > > > > which > > > > i > > > > feel is redundant. > > > = > > = > = > > > > Instead we can make > > > = > > = > = > > > > @TypeConverterAttribute(Boolean.class) > > > = > > = > = > > > > @DefaultValueAttribute("true") > > > = > > = > = > > > > SupportForceCreateVG, > > > = > > = > = > > > > and have only the following in config.sql > > > = > > = > = > > > > select fn_db_add_config_value('SupportForceCreateVG','false','3.0'); > > > = > > = > = > > > > if a particular value(for a specific cluster level) is not found in > > > > Config.sql, the fallback is to use the value available in > > > > ConfigValues.java. > > > = > > = > = > > > This has already been implemented, there are many "feature supported" > > > configurations working like this (for example GlusterSupport). > > = > = > > > I think a more interesting approach would be to move these out of the= DB > > > since these values don't really hav e a reson to be there. > > = > = > > > Since the entire thing is abstracted by "Gluster/FeatureSupported" > > > classes > > > then we can easily change mechanism (of course whatever code is not u= sing > > > it > > > can be easily converted to use the mechanism) > > = > = > > > For example a simple enum could do the trick: > > = > = > > > ------------------------------------- EXAMPLE > > > ------------------------------------- > > = > = > > > /** > > = > = > > > * Convenience class to check if a gluster feature is supported or not= in > > > any > > > given version.
> > = > = > > > * Methods should be named by feature and accept version to check agai= nst. > > = > = > > > */ > > = > = > > > public class GlusterFeatureSupported { > > = > = > > > /** > > = > = > > > * @param version > > = > = > > > * Compatibility version to check for. > > = > = > > > * @return true if gluster support is enabled, > > > false > > > if it's not. > > = > = > > > */ > > = > = > > > public static boolean gluster(Version version) { > > = > = > > > return SupportedFeatures.GLUSTER.isSupportedOn(version); > > = > = > > > } > > = > = > > > /** > > = > = > > > * @param version > > = > = > > > * Compatibility version to check for. > > = > = > > > * @return true if gluster heavyweight refresh is enabled, > > > false if it's not. > > = > = > > > */ > > = > = > > > public static boolean refreshHeavyWeight(Version version) { > > = > = > > > return SupportedFeatures.REFRESH_HEAVYWEIGHT.isSupportedOn(version); > > = > = > > > } > > = > = > > > /* More methods... */ > > = > = > > > enum SupportedFeatures { > > = > = > > > GLUSTER(Version.v3_0), > > = > = > > > REFRESH_HEAVYWEIGHT(Version.v3_0, Version.v3_1), > > = > = > > > /* More members */; > > = > = > > > private Set unsupportedVersions =3D new HashSet(); > > = > = > > > private SupportedFeatures(Version... versions) { > > = > = > > > unsupportedVersions.addAll(Arrays.asList(versions)); > > = > = > > > } > > = > = > > > public boolean isSupportedOn(Version version) { > > = > = > > > return !unsupportedVersions.contains(version); > > = > = > > > } > > = > = > > > } > > = > = > > > ------------------------------------- END EXAMPLE > > > ------------------------------------- > > = > = > > > Thoughts? > > = > = > > unless i didn't understand something, this is not good, > = > > this should stay configurable by the users, > = > > for example if some user experience some issues with a feature and want= to > > turn it off/change the values.. > = > > (not all version configuration are boolean, some are different values to > > different versions, like cpu-list) > = > This is for API level compatibility. > If VDSM doesn't support for example hot plug in 3.1 then the user can't j= ust > decide that it does and change it. > Also, this is not changeable by user since it's not exposed by engine-con= fig > (nor should it be). some are exposed = > This is strictly for the engine-VDSM API compatibility, not for other con= figs > which are version specific. right, but still user should be able to turn features off in case of proble= ms, = or change in some cases (for example it is possible to add support for more= power management devices, i know it was done by users) = no reason to block this = > > > Regards, > > = > = > > > Mike > > = > = > > > > Please share your thoughts on this. > > > = > > = > = > > > > Thanks, > > > = > > = > = > > > > Kanagaraj > > > = > > = > = > > > _______________________________________________ > > = > = > > > Engine-devel mailing list > > = > = > > > Engine-devel(a)ovirt.org > > = > = > > > http://lists.ovirt.org/mailman/listinfo/engine-devel > > = > = ------=3D_Part_21094117_1742490232.1385888972528 Content-Type: text/html; charset=3Dutf-8 Content-Transfer-Encoding: quoted-printable



Fr= =3D om: "Mike Kolesnik" <mkolesni(a)redhat.com>
To: "Omer F= re=3D nkel" <ofrenkel(a)redhat.com>
Cc: "Kanagaraj" <kmayilsa(= a)re=3D dhat.com>, "engine-devel" <engine-devel(a)ovirt.org>
Sent: <= /b=3D >Sunday, December 1, 2013 11:01:50 AM
Subject: Re: [Engine-devel]= =3D Using config values





From: "Mike Kolesnik= =3D " <mkolesni(a)redhat.com>
To: "Kanagaraj" <kmayilsa(a)re= dhat=3D .com>
Cc: "engine-devel" <engine-devel(a)ovirt.org>
<= b>=3D Sent:
Sunday, December 1, 2013 8:08:42 AM
Subject: Re: [Engin= =3D e-devel] Using config values

H= =3D i All,

Hi Kanagaraj,


The are s= =3D ome issues arising in configurations whenever we move up on the versions(3.= =3D 3 =3D3D> 3.4), because of the way we store and interpret them.
<= br=3D >
Whenever there is a new cluster level, you will need to add a new en= =3D try for all(most) of the configuration. Mostly a copy paste if you see from= =3D 3.2 to 3.3, except some CPU/PM type related configurations.
Better opt= =3D ion would be to have the defaul config value in ConfigValues.java and the o= =3D verrides will go to config.sql. In this approach you don't need a new entri= =3D es to config.sql when there is a new cluster level.

Lets = =3D take an exmaple, "SupportForceCreateVG" - This is supported from 3.1 onward= =3D s,

If you look at config.sql, you will see following entr= =3D ies
select fn_db_add_config_value('SupportForceCreateVG','false','3.0'= =3D );
select fn_db_add_config_value('SupportForceCreateVG','true','3.1');= =3D
select fn_db_add_config_value('SupportForceCreateVG','true','3.2'); <= =3D br> select fn_db_add_config_value('SupportForceCreateVG','true','3.3');
= =3D

And in ConfigValues.java

   = =3D ; @TypeConverterAttribute(Boolean.class)
    @DefaultVal= =3D ueAttribute("false")
    SupportForceCreateVG,
<= =3D br>
Now if there is 3.4 and 3.5, the user needs to add 2 more entries,= =3D which i feel is redundant.

Instead we can make
= =3D
    @TypeConverterAttribute(Boolean.class)
&nb= =3D sp;   @DefaultValueAttribute("true")
    Suppo= =3D rtForceCreateVG,

and have only the following in config.sq= =3D l
select fn_db_add_config_value('SupportForceCreateVG','false','3.0');<= =3D br>

if a particular value(for a specific cluster level) is no= =3D t found in Config.sql, the fallback is to use the value available in Config= =3D Values.java.

This has already been implemen= =3D ted, there are many "feature supported" configurations working like this (f= =3D or example GlusterSupport).

I think a more int= =3D eresting approach would be to move these out of the DB since these values d= =3D on't really hav e a reson to be there.
Since the entire thing= =3D is abstracted by "Gluster/FeatureSupported" classes then we can easily cha= =3D nge mechanism (of course whatever code is not using it can be easily conver= =3D ted to use the mechanism)

For example a simple= =3D enum could do the trick:
-----------------------------------= =3D -- EXAMPLE -------------------------------------
/**
 = =3D ;* Convenience class to check if a gluster feature is supported or not in a= =3D ny given version.<br>
 * Methods should be named by feature a= =3D nd accept version to check against.
 */
public class GlusterFeat= =3D ureSupported {
    /**
    = =3D * @param version
     *    &nbs= =3D p;       Compatibility version to check for.<= =3D br>     * @return <code>true</code> if glus= =3D ter support is enabled, <code>false</code> if it's not.
&nbs= =3D p;    */
    public static boolean gluster= =3D (Version version) {
        return Su= =3D pportedFeatures.GLUSTER.isSupportedOn(version);
    }
= =3D

    /**
     * @param = =3D version
     *      &n= =3D bsp;     Compatibility version to check for.
 &= =3D nbsp;   * @return <code>true</code> if gluster heavyw= =3D eight refresh is enabled, <code>false</code> if it's not.
&n= =3D bsp;    */
    public static boolean refre= =3D shHeavyWeight(Version version) {
      &nb= =3D sp; return SupportedFeatures.REFRESH_HEAVYWEIGHT.isSupportedOn(version);    }

    /* Mo= =3D re methods... */

    enum SupportedFeatures {<= =3D br>        GLUSTER(Version.v3_0),
&nb= =3D sp;       REFRESH_HEAVYWEIGHT(Version.v3_0, V= =3D ersion.v3_1),
        /* More = =3D members */;

        pr= =3D ivate Set<Version> unsupportedVersions =3D3D new HashSet<Version&g= t;=3D ();

        private Su= =3D pportedFeatures(Version... versions) {
     &nb= =3D sp;      unsupportedVersions.addAll(Arrays.asList(= =3D versions));
        }

        public boolean isSupportedOn(= =3D Version version) {
         = =3D ;   return !unsupportedVersions.contains(version);
  = =3D ;      }
    }
-------= =3D ------------------------------ END EXAMPLE --------------------------------= =3D -----

Thoughts?

u= =3D nless i didn't understand something, this is not good,
this s= =3D hould stay configurable by the users,
for example if some use= =3D r experience some issues with a feature and want to turn it off/change the = =3D values..
(not all version configuration are boolean, some are dif= =3D ferent values to different versions, like cpu-list)

This is for API level compatibility.
If = =3D VDSM doesn't support for example hot plug in 3.1 then the user can't just d= =3D ecide that it does and change it.
Also, this is not changeabl= =3D e by user since it's not exposed by engine-config (nor should it be).
some are exposed
This i= =3D s strictly for the engine-VDSM API compatibility, not for other configs whi= =3D ch are version specific.
right, but still = =3D user should be able to turn features off in case of problems,
or change in some cases (for example it is possible to add support for mor= =3D e power management devices, i know it was done by users)
no r= =3D eason to block this

<= =3D div>

Regards,
Mike

Please share yo= =3D ur thoughts on this.

Thanks,
Kanagaraj


_______________________________________________<= =3D br>Engine-devel mailing list
Engine-devel(a)ovirt.org
http://lists.ov= ir=3D t.org/mailman/listinfo/engine-devel



------=3D_Part_21094117_1742490232.1385888972528-- --===============8561495138324543877== Content-Type: multipart/alternative MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.bin" LS0tLS0tPV9QYXJ0XzIxMDk0MTE3XzE3NDI0OTAyMzIuMTM4NTg4ODk3MjUyOApDb250ZW50LVR5 cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzog N2JpdAoKLS0tLS0gT3JpZ2luYWwgTWVzc2FnZSAtLS0tLQoKPiBGcm9tOiAiTWlrZSBLb2xlc25p ayIgPG1rb2xlc25pQHJlZGhhdC5jb20+Cj4gVG86ICJPbWVyIEZyZW5rZWwiIDxvZnJlbmtlbEBy ZWRoYXQuY29tPgo+IENjOiAiS2FuYWdhcmFqIiA8a21heWlsc2FAcmVkaGF0LmNvbT4sICJlbmdp bmUtZGV2ZWwiCj4gPGVuZ2luZS1kZXZlbEBvdmlydC5vcmc+Cj4gU2VudDogU3VuZGF5LCBEZWNl bWJlciAxLCAyMDEzIDExOjAxOjUwIEFNCj4gU3ViamVjdDogUmU6IFtFbmdpbmUtZGV2ZWxdIFVz aW5nIGNvbmZpZyB2YWx1ZXMKCj4gLS0tLS0gT3JpZ2luYWwgTWVzc2FnZSAtLS0tLQoKPiA+IC0t LS0tIE9yaWdpbmFsIE1lc3NhZ2UgLS0tLS0KPiAKCj4gPiA+IEZyb206ICJNaWtlIEtvbGVzbmlr IiA8bWtvbGVzbmlAcmVkaGF0LmNvbT4KPiA+IAo+IAo+ID4gPiBUbzogIkthbmFnYXJhaiIgPGtt YXlpbHNhQHJlZGhhdC5jb20+Cj4gPiAKPiAKPiA+ID4gQ2M6ICJlbmdpbmUtZGV2ZWwiIDxlbmdp bmUtZGV2ZWxAb3ZpcnQub3JnPgo+ID4gCj4gCj4gPiA+IFNlbnQ6IFN1bmRheSwgRGVjZW1iZXIg MSwgMjAxMyA4OjA4OjQyIEFNCj4gPiAKPiAKPiA+ID4gU3ViamVjdDogUmU6IFtFbmdpbmUtZGV2 ZWxdIFVzaW5nIGNvbmZpZyB2YWx1ZXMKPiA+IAo+IAoKPiA+ID4gLS0tLS0gT3JpZ2luYWwgTWVz c2FnZSAtLS0tLQo+ID4gCj4gCgo+ID4gPiA+IEhpIEFsbCwKPiA+ID4gCj4gPiAKPiAKPiA+ID4g SGkgS2FuYWdhcmFqLAo+ID4gCj4gCgo+ID4gPiA+IFRoZSBhcmUgc29tZSBpc3N1ZXMgYXJpc2lu ZyBpbiBjb25maWd1cmF0aW9ucyB3aGVuZXZlciB3ZSBtb3ZlIHVwIG9uCj4gPiA+ID4gdGhlCj4g PiA+ID4gdmVyc2lvbnMoMy4zID0+IDMuNCksIGJlY2F1c2Ugb2YgdGhlIHdheSB3ZSBzdG9yZSBh bmQgaW50ZXJwcmV0IHRoZW0uCj4gPiA+IAo+ID4gCj4gCgo+ID4gPiA+IFdoZW5ldmVyIHRoZXJl IGlzIGEgbmV3IGNsdXN0ZXIgbGV2ZWwsIHlvdSB3aWxsIG5lZWQgdG8gYWRkIGEgbmV3IGVudHJ5 Cj4gPiA+ID4gZm9yCj4gPiA+ID4gYWxsKG1vc3QpIG9mIHRoZSBjb25maWd1cmF0aW9uLiBNb3N0 bHkgYSBjb3B5IHBhc3RlIGlmIHlvdSBzZWUgZnJvbSAzLjIKPiA+ID4gPiB0bwo+ID4gPiA+IDMu MywgZXhjZXB0IHNvbWUgQ1BVL1BNIHR5cGUgcmVsYXRlZCBjb25maWd1cmF0aW9ucy4KPiA+ID4g Cj4gPiAKPiAKPiA+ID4gPiBCZXR0ZXIgb3B0aW9uIHdvdWxkIGJlIHRvIGhhdmUgdGhlIGRlZmF1 bCBjb25maWcgdmFsdWUgaW4KPiA+ID4gPiBDb25maWdWYWx1ZXMuamF2YQo+ID4gPiA+IGFuZCB0 aGUgb3ZlcnJpZGVzIHdpbGwgZ28gdG8gY29uZmlnLnNxbC4gSW4gdGhpcyBhcHByb2FjaCB5b3Ug ZG9uJ3QKPiA+ID4gPiBuZWVkCj4gPiA+ID4gYQo+ID4gPiA+IG5ldyBlbnRyaWVzIHRvIGNvbmZp Zy5zcWwgd2hlbiB0aGVyZSBpcyBhIG5ldyBjbHVzdGVyIGxldmVsLgo+ID4gPiAKPiA+IAo+IAoK PiA+ID4gPiBMZXRzIHRha2UgYW4gZXhtYXBsZSwgIlN1cHBvcnRGb3JjZUNyZWF0ZVZHIiAtIFRo aXMgaXMgc3VwcG9ydGVkIGZyb20KPiA+ID4gPiAzLjEKPiA+ID4gPiBvbndhcmRzLAo+ID4gPiAK PiA+IAo+IAoKPiA+ID4gPiBJZiB5b3UgbG9vayBhdCBjb25maWcuc3FsLCB5b3Ugd2lsbCBzZWUg Zm9sbG93aW5nIGVudHJpZXMKPiA+ID4gCj4gPiAKPiAKPiA+ID4gPiBzZWxlY3QgZm5fZGJfYWRk X2NvbmZpZ192YWx1ZSgnU3VwcG9ydEZvcmNlQ3JlYXRlVkcnLCdmYWxzZScsJzMuMCcpOwo+ID4g PiAKPiA+IAo+IAo+ID4gPiA+IHNlbGVjdCBmbl9kYl9hZGRfY29uZmlnX3ZhbHVlKCdTdXBwb3J0 Rm9yY2VDcmVhdGVWRycsJ3RydWUnLCczLjEnKTsKPiA+ID4gCj4gPiAKPiAKPiA+ID4gPiBzZWxl Y3QgZm5fZGJfYWRkX2NvbmZpZ192YWx1ZSgnU3VwcG9ydEZvcmNlQ3JlYXRlVkcnLCd0cnVlJywn My4yJyk7Cj4gPiA+IAo+ID4gCj4gCj4gPiA+ID4gc2VsZWN0IGZuX2RiX2FkZF9jb25maWdfdmFs dWUoJ1N1cHBvcnRGb3JjZUNyZWF0ZVZHJywndHJ1ZScsJzMuMycpOwo+ID4gPiAKPiA+IAo+IAoK PiA+ID4gPiBBbmQgaW4gQ29uZmlnVmFsdWVzLmphdmEKPiA+ID4gCj4gPiAKPiAKCj4gPiA+ID4g QFR5cGVDb252ZXJ0ZXJBdHRyaWJ1dGUoQm9vbGVhbi5jbGFzcykKPiA+ID4gCj4gPiAKPiAKPiA+ ID4gPiBARGVmYXVsdFZhbHVlQXR0cmlidXRlKCJmYWxzZSIpCj4gPiA+IAo+ID4gCj4gCj4gPiA+ ID4gU3VwcG9ydEZvcmNlQ3JlYXRlVkcsCj4gPiA+IAo+ID4gCj4gCgo+ID4gPiA+IE5vdyBpZiB0 aGVyZSBpcyAzLjQgYW5kIDMuNSwgdGhlIHVzZXIgbmVlZHMgdG8gYWRkIDIgbW9yZSBlbnRyaWVz LAo+ID4gPiA+IHdoaWNoCj4gPiA+ID4gaQo+ID4gPiA+IGZlZWwgaXMgcmVkdW5kYW50Lgo+ID4g PiAKPiA+IAo+IAoKPiA+ID4gPiBJbnN0ZWFkIHdlIGNhbiBtYWtlCj4gPiA+IAo+ID4gCj4gCgo+ ID4gPiA+IEBUeXBlQ29udmVydGVyQXR0cmlidXRlKEJvb2xlYW4uY2xhc3MpCj4gPiA+IAo+ID4g Cj4gCj4gPiA+ID4gQERlZmF1bHRWYWx1ZUF0dHJpYnV0ZSgidHJ1ZSIpCj4gPiA+IAo+ID4gCj4g Cj4gPiA+ID4gU3VwcG9ydEZvcmNlQ3JlYXRlVkcsCj4gPiA+IAo+ID4gCj4gCgo+ID4gPiA+IGFu ZCBoYXZlIG9ubHkgdGhlIGZvbGxvd2luZyBpbiBjb25maWcuc3FsCj4gPiA+IAo+ID4gCj4gCj4g PiA+ID4gc2VsZWN0IGZuX2RiX2FkZF9jb25maWdfdmFsdWUoJ1N1cHBvcnRGb3JjZUNyZWF0ZVZH JywnZmFsc2UnLCczLjAnKTsKPiA+ID4gCj4gPiAKPiAKCj4gPiA+ID4gaWYgYSBwYXJ0aWN1bGFy IHZhbHVlKGZvciBhIHNwZWNpZmljIGNsdXN0ZXIgbGV2ZWwpIGlzIG5vdCBmb3VuZCBpbgo+ID4g PiA+IENvbmZpZy5zcWwsIHRoZSBmYWxsYmFjayBpcyB0byB1c2UgdGhlIHZhbHVlIGF2YWlsYWJs ZSBpbgo+ID4gPiA+IENvbmZpZ1ZhbHVlcy5qYXZhLgo+ID4gPiAKPiA+IAo+IAo+ID4gPiBUaGlz IGhhcyBhbHJlYWR5IGJlZW4gaW1wbGVtZW50ZWQsIHRoZXJlIGFyZSBtYW55ICJmZWF0dXJlIHN1 cHBvcnRlZCIKPiA+ID4gY29uZmlndXJhdGlvbnMgd29ya2luZyBsaWtlIHRoaXMgKGZvciBleGFt cGxlIEdsdXN0ZXJTdXBwb3J0KS4KPiA+IAo+IAoKPiA+ID4gSSB0aGluayBhIG1vcmUgaW50ZXJl c3RpbmcgYXBwcm9hY2ggd291bGQgYmUgdG8gbW92ZSB0aGVzZSBvdXQgb2YgdGhlIERCCj4gPiA+ IHNpbmNlIHRoZXNlIHZhbHVlcyBkb24ndCByZWFsbHkgaGF2IGUgYSByZXNvbiB0byBiZSB0aGVy ZS4KPiA+IAo+IAo+ID4gPiBTaW5jZSB0aGUgZW50aXJlIHRoaW5nIGlzIGFic3RyYWN0ZWQgYnkg IkdsdXN0ZXIvRmVhdHVyZVN1cHBvcnRlZCIKPiA+ID4gY2xhc3Nlcwo+ID4gPiB0aGVuIHdlIGNh biBlYXNpbHkgY2hhbmdlIG1lY2hhbmlzbSAob2YgY291cnNlIHdoYXRldmVyIGNvZGUgaXMgbm90 IHVzaW5nCj4gPiA+IGl0Cj4gPiA+IGNhbiBiZSBlYXNpbHkgY29udmVydGVkIHRvIHVzZSB0aGUg bWVjaGFuaXNtKQo+ID4gCj4gCgo+ID4gPiBGb3IgZXhhbXBsZSBhIHNpbXBsZSBlbnVtIGNvdWxk IGRvIHRoZSB0cmljazoKPiA+IAo+IAo+ID4gPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tIEVYQU1QTEUKPiA+ID4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQo+ID4gCj4gCj4gPiA+IC8qKgo+ID4gCj4gCj4gPiA+ICogQ29udmVuaWVuY2UgY2xhc3Mg dG8gY2hlY2sgaWYgYSBnbHVzdGVyIGZlYXR1cmUgaXMgc3VwcG9ydGVkIG9yIG5vdCBpbgo+ID4g PiBhbnkKPiA+ID4gZ2l2ZW4gdmVyc2lvbi48YnI+Cj4gPiAKPiAKPiA+ID4gKiBNZXRob2RzIHNo b3VsZCBiZSBuYW1lZCBieSBmZWF0dXJlIGFuZCBhY2NlcHQgdmVyc2lvbiB0byBjaGVjayBhZ2Fp bnN0Lgo+ID4gCj4gCj4gPiA+ICovCj4gPiAKPiAKPiA+ID4gcHVibGljIGNsYXNzIEdsdXN0ZXJG ZWF0dXJlU3VwcG9ydGVkIHsKPiA+IAo+IAo+ID4gPiAvKioKPiA+IAo+IAo+ID4gPiAqIEBwYXJh bSB2ZXJzaW9uCj4gPiAKPiAKPiA+ID4gKiBDb21wYXRpYmlsaXR5IHZlcnNpb24gdG8gY2hlY2sg Zm9yLgo+ID4gCj4gCj4gPiA+ICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBnbHVzdGVy IHN1cHBvcnQgaXMgZW5hYmxlZCwKPiA+ID4gPGNvZGU+ZmFsc2U8L2NvZGU+Cj4gPiA+IGlmIGl0 J3Mgbm90Lgo+ID4gCj4gCj4gPiA+ICovCj4gPiAKPiAKPiA+ID4gcHVibGljIHN0YXRpYyBib29s ZWFuIGdsdXN0ZXIoVmVyc2lvbiB2ZXJzaW9uKSB7Cj4gPiAKPiAKPiA+ID4gcmV0dXJuIFN1cHBv cnRlZEZlYXR1cmVzLkdMVVNURVIuaXNTdXBwb3J0ZWRPbih2ZXJzaW9uKTsKPiA+IAo+IAo+ID4g PiB9Cj4gPiAKPiAKCj4gPiA+IC8qKgo+ID4gCj4gCj4gPiA+ICogQHBhcmFtIHZlcnNpb24KPiA+ IAo+IAo+ID4gPiAqIENvbXBhdGliaWxpdHkgdmVyc2lvbiB0byBjaGVjayBmb3IuCj4gPiAKPiAK PiA+ID4gKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGdsdXN0ZXIgaGVhdnl3ZWlnaHQg cmVmcmVzaCBpcyBlbmFibGVkLAo+ID4gPiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQncyBub3Qu Cj4gPiAKPiAKPiA+ID4gKi8KPiA+IAo+IAo+ID4gPiBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVm cmVzaEhlYXZ5V2VpZ2h0KFZlcnNpb24gdmVyc2lvbikgewo+ID4gCj4gCj4gPiA+IHJldHVybiBT dXBwb3J0ZWRGZWF0dXJlcy5SRUZSRVNIX0hFQVZZV0VJR0hULmlzU3VwcG9ydGVkT24odmVyc2lv bik7Cj4gPiAKPiAKPiA+ID4gfQo+ID4gCj4gCgo+ID4gPiAvKiBNb3JlIG1ldGhvZHMuLi4gKi8K PiA+IAo+IAoKPiA+ID4gZW51bSBTdXBwb3J0ZWRGZWF0dXJlcyB7Cj4gPiAKPiAKPiA+ID4gR0xV U1RFUihWZXJzaW9uLnYzXzApLAo+ID4gCj4gCj4gPiA+IFJFRlJFU0hfSEVBVllXRUlHSFQoVmVy c2lvbi52M18wLCBWZXJzaW9uLnYzXzEpLAo+ID4gCj4gCj4gPiA+IC8qIE1vcmUgbWVtYmVycyAq LzsKPiA+IAo+IAoKPiA+ID4gcHJpdmF0ZSBTZXQ8VmVyc2lvbj4gdW5zdXBwb3J0ZWRWZXJzaW9u cyA9IG5ldyBIYXNoU2V0PFZlcnNpb24+KCk7Cj4gPiAKPiAKCj4gPiA+IHByaXZhdGUgU3VwcG9y dGVkRmVhdHVyZXMoVmVyc2lvbi4uLiB2ZXJzaW9ucykgewo+ID4gCj4gCj4gPiA+IHVuc3VwcG9y dGVkVmVyc2lvbnMuYWRkQWxsKEFycmF5cy5hc0xpc3QodmVyc2lvbnMpKTsKPiA+IAo+IAo+ID4g PiB9Cj4gPiAKPiAKCj4gPiA+IHB1YmxpYyBib29sZWFuIGlzU3VwcG9ydGVkT24oVmVyc2lvbiB2 ZXJzaW9uKSB7Cj4gPiAKPiAKPiA+ID4gcmV0dXJuICF1bnN1cHBvcnRlZFZlcnNpb25zLmNvbnRh aW5zKHZlcnNpb24pOwo+ID4gCj4gCj4gPiA+IH0KPiA+IAo+IAo+ID4gPiB9Cj4gPiAKPiAKPiA+ ID4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFTkQgRVhBTVBMRQo+ID4g PiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gPiAKPiAKCj4gPiA+IFRo b3VnaHRzPwo+ID4gCj4gCgo+ID4gdW5sZXNzIGkgZGlkbid0IHVuZGVyc3RhbmQgc29tZXRoaW5n LCB0aGlzIGlzIG5vdCBnb29kLAo+IAo+ID4gdGhpcyBzaG91bGQgc3RheSBjb25maWd1cmFibGUg YnkgdGhlIHVzZXJzLAo+IAo+ID4gZm9yIGV4YW1wbGUgaWYgc29tZSB1c2VyIGV4cGVyaWVuY2Ug c29tZSBpc3N1ZXMgd2l0aCBhIGZlYXR1cmUgYW5kIHdhbnQgdG8KPiA+IHR1cm4gaXQgb2ZmL2No YW5nZSB0aGUgdmFsdWVzLi4KPiAKPiA+IChub3QgYWxsIHZlcnNpb24gY29uZmlndXJhdGlvbiBh cmUgYm9vbGVhbiwgc29tZSBhcmUgZGlmZmVyZW50IHZhbHVlcyB0bwo+ID4gZGlmZmVyZW50IHZl cnNpb25zLCBsaWtlIGNwdS1saXN0KQo+IAoKPiBUaGlzIGlzIGZvciBBUEkgbGV2ZWwgY29tcGF0 aWJpbGl0eS4KPiBJZiBWRFNNIGRvZXNuJ3Qgc3VwcG9ydCBmb3IgZXhhbXBsZSBob3QgcGx1ZyBp biAzLjEgdGhlbiB0aGUgdXNlciBjYW4ndCBqdXN0Cj4gZGVjaWRlIHRoYXQgaXQgZG9lcyBhbmQg Y2hhbmdlIGl0Lgo+IEFsc28sIHRoaXMgaXMgbm90IGNoYW5nZWFibGUgYnkgdXNlciBzaW5jZSBp dCdzIG5vdCBleHBvc2VkIGJ5IGVuZ2luZS1jb25maWcKPiAobm9yIHNob3VsZCBpdCBiZSkuCgpz b21lIGFyZSBleHBvc2VkIAoKPiBUaGlzIGlzIHN0cmljdGx5IGZvciB0aGUgZW5naW5lLVZEU00g QVBJIGNvbXBhdGliaWxpdHksIG5vdCBmb3Igb3RoZXIgY29uZmlncwo+IHdoaWNoIGFyZSB2ZXJz aW9uIHNwZWNpZmljLgoKcmlnaHQsIGJ1dCBzdGlsbCB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIHR1 cm4gZmVhdHVyZXMgb2ZmIGluIGNhc2Ugb2YgcHJvYmxlbXMsIApvciBjaGFuZ2UgaW4gc29tZSBj YXNlcyAoZm9yIGV4YW1wbGUgaXQgaXMgcG9zc2libGUgdG8gYWRkIHN1cHBvcnQgZm9yIG1vcmUg cG93ZXIgbWFuYWdlbWVudCBkZXZpY2VzLCBpIGtub3cgaXQgd2FzIGRvbmUgYnkgdXNlcnMpIApu byByZWFzb24gdG8gYmxvY2sgdGhpcyAKCj4gPiA+IFJlZ2FyZHMsCj4gPiAKPiAKPiA+ID4gTWlr ZQo+ID4gCj4gCgo+ID4gPiA+IFBsZWFzZSBzaGFyZSB5b3VyIHRob3VnaHRzIG9uIHRoaXMuCj4g PiA+IAo+ID4gCj4gCgo+ID4gPiA+IFRoYW5rcywKPiA+ID4gCj4gPiAKPiAKPiA+ID4gPiBLYW5h Z2FyYWoKPiA+ID4gCj4gPiAKPiAKCj4gPiA+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCj4gPiAKPiAKPiA+ID4gRW5naW5lLWRldmVsIG1haWxpbmcgbGlz dAo+ID4gCj4gCj4gPiA+IEVuZ2luZS1kZXZlbEBvdmlydC5vcmcKPiA+IAo+IAo+ID4gPiBodHRw Oi8vbGlzdHMub3ZpcnQub3JnL21haWxtYW4vbGlzdGluZm8vZW5naW5lLWRldmVsCj4gPiAKPiAK Ci0tLS0tLT1fUGFydF8yMTA5NDExN18xNzQyNDkwMjMyLjEzODU4ODg5NzI1MjgKQ29udGVudC1U eXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzog cXVvdGVkLXByaW50YWJsZQoKPGh0bWw+PGJvZHk+PGRpdiBzdHlsZT0zRCJmb250LWZhbWlseTog dGltZXMgbmV3IHJvbWFuLCBuZXcgeW9yaywgdGltZXMsIHNlPQpyaWY7IGZvbnQtc2l6ZTogMTJw dDsgY29sb3I6ICMwMDAwMDAiPjxkaXY+PGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxociBpZD0K PTNEInp3Y2hyIj48YmxvY2txdW90ZSBzdHlsZT0zRCJib3JkZXItbGVmdDoycHggc29saWQgIzEw MTBGRjttYXJnaW4tbGVmdDo1PQpweDtwYWRkaW5nLWxlZnQ6NXB4O2NvbG9yOiMwMDA7Zm9udC13 ZWlnaHQ6bm9ybWFsO2ZvbnQtc3R5bGU6bm9ybWFsO3RleHQtZGU9CmNvcmF0aW9uOm5vbmU7Zm9u dC1mYW1pbHk6SGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHQ7Ij48Yj5G cj0Kb206IDwvYj4iTWlrZSBLb2xlc25payIgJmx0O21rb2xlc25pQHJlZGhhdC5jb20mZ3Q7PGJy PjxiPlRvOiA8L2I+Ik9tZXIgRnJlPQpua2VsIiAmbHQ7b2ZyZW5rZWxAcmVkaGF0LmNvbSZndDs8 YnI+PGI+Q2M6IDwvYj4iS2FuYWdhcmFqIiAmbHQ7a21heWlsc2FAcmU9CmRoYXQuY29tJmd0Oywg ImVuZ2luZS1kZXZlbCIgJmx0O2VuZ2luZS1kZXZlbEBvdmlydC5vcmcmZ3Q7PGJyPjxiPlNlbnQ6 IDwvYj0KPlN1bmRheSwgRGVjZW1iZXIgMSwgMjAxMyAxMTowMTo1MCBBTTxicj48Yj5TdWJqZWN0 OiA8L2I+UmU6IFtFbmdpbmUtZGV2ZWxdPQogVXNpbmcgY29uZmlnIHZhbHVlczxicj48ZGl2Pjxi cj48L2Rpdj48ZGl2IHN0eWxlPTNEImZvbnQtZmFtaWx5OiB0aW1lcyBuZXc9CiByb21hbiwgbmV3 IHlvcmssIHRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogIzAwMDAwMCI+PGhy IGlkPTNEIj0KendjaHIiPjxibG9ja3F1b3RlIHN0eWxlPTNEImJvcmRlci1sZWZ0OjJweCBzb2xp ZCAjMTAxMEZGO21hcmdpbi1sZWZ0OjVweDtwPQphZGRpbmctbGVmdDo1cHg7Y29sb3I6IzAwMDtm b250LXdlaWdodDpub3JtYWw7Zm9udC1zdHlsZTpub3JtYWw7dGV4dC1kZWNvcmE9CnRpb246bm9u ZTtmb250LWZhbWlseTpIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjtmb250LXNpemU6MTJwdDsi PjxkaXYgc3R5bD0KZT0zRCJmb250LWZhbWlseTogdGltZXMgbmV3IHJvbWFuLCBuZXcgeW9yaywg dGltZXMsIHNlcmlmOyBmb250LXNpemU6IDEycHQ7PQogY29sb3I6ICMwMDAwMDAiPjxkaXY+PGJy PjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxociBpZD0zRCJ6d2NociI+PGJsb2NrcXVvdGU9CiBzdHls ZT0zRCJib3JkZXItbGVmdDoycHggc29saWQgIzEwMTBGRjttYXJnaW4tbGVmdDo1cHg7cGFkZGlu Zy1sZWZ0OjVweDtjbz0KbG9yOiMwMDA7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3R5bGU6bm9y bWFsO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtZmFtPQppbHk6SGVsdmV0aWNhLEFyaWFsLHNh bnMtc2VyaWY7Zm9udC1zaXplOjEycHQ7Ij48Yj5Gcm9tOiA8L2I+Ik1pa2UgS29sZXNuaWs9CiIg Jmx0O21rb2xlc25pQHJlZGhhdC5jb20mZ3Q7PGJyPjxiPlRvOiA8L2I+IkthbmFnYXJhaiIgJmx0 O2ttYXlpbHNhQHJlZGhhdD0KLmNvbSZndDs8YnI+PGI+Q2M6IDwvYj4iZW5naW5lLWRldmVsIiAm bHQ7ZW5naW5lLWRldmVsQG92aXJ0Lm9yZyZndDs8YnI+PGI+PQpTZW50OiA8L2I+U3VuZGF5LCBE ZWNlbWJlciAxLCAyMDEzIDg6MDg6NDIgQU08YnI+PGI+U3ViamVjdDogPC9iPlJlOiBbRW5naW49 CmUtZGV2ZWxdIFVzaW5nIGNvbmZpZyB2YWx1ZXM8YnI+PGRpdj48YnI+PC9kaXY+PGRpdiBzdHls ZT0zRCJmb250LWZhbWlseTogdD0KaW1lcyBuZXcgcm9tYW4sIG5ldyB5b3JrLCB0aW1lcywgc2Vy aWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6ICMwMDAwMDAiPjxoPQpyIGlkPTNEInp3Y2hyIj48 YmxvY2txdW90ZSBzdHlsZT0zRCJib3JkZXItbGVmdDoycHggc29saWQgIzEwMTBGRjttYXJnaW4t bGU9CmZ0OjVweDtwYWRkaW5nLWxlZnQ6NXB4O2NvbG9yOiMwMDA7Zm9udC13ZWlnaHQ6bm9ybWFs O2ZvbnQtc3R5bGU6bm9ybWFsO3RleD0KdC1kZWNvcmF0aW9uOm5vbmU7Zm9udC1mYW1pbHk6SGVs dmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHQ7Ij5IPQppIEFsbCw8L2Jsb2Nr cXVvdGU+PGRpdj48YnI+PC9kaXY+PGRpdj5IaSBLYW5hZ2FyYWosPGJyPjwvZGl2PjxkaXY+PGJy PjwvZGk9CnY+PGJsb2NrcXVvdGUgc3R5bGU9M0QiYm9yZGVyLWxlZnQ6MnB4IHNvbGlkICMxMDEw RkY7bWFyZ2luLWxlZnQ6NXB4O3BhZGRpbj0KZy1sZWZ0OjVweDtjb2xvcjojMDAwO2ZvbnQtd2Vp Z2h0Om5vcm1hbDtmb250LXN0eWxlOm5vcm1hbDt0ZXh0LWRlY29yYXRpb246PQpub25lO2ZvbnQt ZmFtaWx5OkhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB0OyI+PGJyPiBU aGUgYXJlIHM9Cm9tZSBpc3N1ZXMgYXJpc2luZyBpbiBjb25maWd1cmF0aW9ucyB3aGVuZXZlciB3 ZSBtb3ZlIHVwIG9uIHRoZSB2ZXJzaW9ucygzLj0KMyA9M0QmZ3Q7IDMuNCksIGJlY2F1c2Ugb2Yg dGhlIHdheSB3ZSBzdG9yZSBhbmQgaW50ZXJwcmV0IHRoZW0uPGJyPjxkaXY+PGJyPQo+PC9kaXY+ V2hlbmV2ZXIgdGhlcmUgaXMgYSBuZXcgY2x1c3RlciBsZXZlbCwgeW91IHdpbGwgbmVlZCB0byBh ZGQgYSBuZXcgZW49CnRyeSBmb3IgYWxsKG1vc3QpIG9mIHRoZSBjb25maWd1cmF0aW9uLiBNb3N0 bHkgYSBjb3B5IHBhc3RlIGlmIHlvdSBzZWUgZnJvbT0KIDMuMiB0byAzLjMsIGV4Y2VwdCBzb21l IENQVS9QTSB0eXBlIHJlbGF0ZWQgY29uZmlndXJhdGlvbnMuPGJyPiBCZXR0ZXIgb3B0PQppb24g d291bGQgYmUgdG8gaGF2ZSB0aGUgZGVmYXVsIGNvbmZpZyB2YWx1ZSBpbiBDb25maWdWYWx1ZXMu amF2YSBhbmQgdGhlIG89CnZlcnJpZGVzIHdpbGwgZ28gdG8gY29uZmlnLnNxbC4gSW4gdGhpcyBh cHByb2FjaCB5b3UgZG9uJ3QgbmVlZCBhIG5ldyBlbnRyaT0KZXMgdG8gY29uZmlnLnNxbCB3aGVu IHRoZXJlIGlzIGEgbmV3IGNsdXN0ZXIgbGV2ZWwuPGJyPjxkaXY+PGJyPjwvZGl2PkxldHMgPQp0 YWtlIGFuIGV4bWFwbGUsICJTdXBwb3J0Rm9yY2VDcmVhdGVWRyIgLSBUaGlzIGlzIHN1cHBvcnRl ZCBmcm9tIDMuMSBvbndhcmQ9CnMsPGJyPjxkaXY+PGJyPjwvZGl2PklmIHlvdSBsb29rIGF0IGNv bmZpZy5zcWwsIHlvdSB3aWxsIHNlZSBmb2xsb3dpbmcgZW50cj0KaWVzIDxicj4gc2VsZWN0IGZu X2RiX2FkZF9jb25maWdfdmFsdWUoJ1N1cHBvcnRGb3JjZUNyZWF0ZVZHJywnZmFsc2UnLCczLjAn PQopOyA8YnI+IHNlbGVjdCBmbl9kYl9hZGRfY29uZmlnX3ZhbHVlKCdTdXBwb3J0Rm9yY2VDcmVh dGVWRycsJ3RydWUnLCczLjEnKTs9CiA8YnI+IHNlbGVjdCBmbl9kYl9hZGRfY29uZmlnX3ZhbHVl KCdTdXBwb3J0Rm9yY2VDcmVhdGVWRycsJ3RydWUnLCczLjInKTsgPD0KYnI+IHNlbGVjdCBmbl9k Yl9hZGRfY29uZmlnX3ZhbHVlKCdTdXBwb3J0Rm9yY2VDcmVhdGVWRycsJ3RydWUnLCczLjMnKTs8 YnI+PQo8ZGl2Pjxicj48L2Rpdj5BbmQgaW4gQ29uZmlnVmFsdWVzLmphdmE8YnI+PGRpdj48YnI+ PC9kaXY+Jm5ic3A7Jm5ic3A7Jm5ic3A9CjsgQFR5cGVDb252ZXJ0ZXJBdHRyaWJ1dGUoQm9vbGVh bi5jbGFzcyk8YnI+ICZuYnNwOyZuYnNwOyZuYnNwOyBARGVmYXVsdFZhbD0KdWVBdHRyaWJ1dGUo ImZhbHNlIik8YnI+ICZuYnNwOyZuYnNwOyZuYnNwOyBTdXBwb3J0Rm9yY2VDcmVhdGVWRyw8YnI+ PGRpdj48PQpicj48L2Rpdj5Ob3cgaWYgdGhlcmUgaXMgMy40IGFuZCAzLjUsIHRoZSB1c2VyIG5l ZWRzIHRvIGFkZCAyIG1vcmUgZW50cmllcyw9CiB3aGljaCBpIGZlZWwgaXMgcmVkdW5kYW50Ljxi cj48ZGl2Pjxicj48L2Rpdj5JbnN0ZWFkIHdlIGNhbiBtYWtlIDxicj48ZGl2Pj0KPGJyPjwvZGl2 PiZuYnNwOyZuYnNwOyZuYnNwOyBAVHlwZUNvbnZlcnRlckF0dHJpYnV0ZShCb29sZWFuLmNsYXNz KTxicj4gJm5iPQpzcDsmbmJzcDsmbmJzcDsgQERlZmF1bHRWYWx1ZUF0dHJpYnV0ZSgidHJ1ZSIp PGJyPiAmbmJzcDsmbmJzcDsmbmJzcDsgU3VwcG89CnJ0Rm9yY2VDcmVhdGVWRyw8YnI+PGRpdj48 YnI+PC9kaXY+YW5kIGhhdmUgb25seSB0aGUgZm9sbG93aW5nIGluIGNvbmZpZy5zcT0KbDxicj4g c2VsZWN0IGZuX2RiX2FkZF9jb25maWdfdmFsdWUoJ1N1cHBvcnRGb3JjZUNyZWF0ZVZHJywnZmFs c2UnLCczLjAnKTs8PQpicj48ZGl2Pjxicj48L2Rpdj5pZiBhIHBhcnRpY3VsYXIgdmFsdWUoZm9y IGEgc3BlY2lmaWMgY2x1c3RlciBsZXZlbCkgaXMgbm89CnQgZm91bmQgaW4gQ29uZmlnLnNxbCwg dGhlIGZhbGxiYWNrIGlzIHRvIHVzZSB0aGUgdmFsdWUgYXZhaWxhYmxlIGluIENvbmZpZz0KVmFs dWVzLmphdmEuPC9ibG9ja3F1b3RlPjxkaXY+PGJyPjwvZGl2PjxkaXY+VGhpcyBoYXMgYWxyZWFk eSBiZWVuIGltcGxlbWVuPQp0ZWQsIHRoZXJlIGFyZSBtYW55ICJmZWF0dXJlIHN1cHBvcnRlZCIg Y29uZmlndXJhdGlvbnMgd29ya2luZyBsaWtlIHRoaXMgKGY9Cm9yIGV4YW1wbGUgR2x1c3RlclN1 cHBvcnQpLjxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PkkgdGhpbmsgYSBtb3JlIGludD0K ZXJlc3RpbmcgYXBwcm9hY2ggd291bGQgYmUgdG8gbW92ZSB0aGVzZSBvdXQgb2YgdGhlIERCIHNp bmNlIHRoZXNlIHZhbHVlcyBkPQpvbid0IHJlYWxseSBoYXYgZSBhIHJlc29uIHRvIGJlIHRoZXJl Ljxicj48L2Rpdj48ZGl2PlNpbmNlIHRoZSBlbnRpcmUgdGhpbmc9CiBpcyBhYnN0cmFjdGVkIGJ5 ICJHbHVzdGVyL0ZlYXR1cmVTdXBwb3J0ZWQiIGNsYXNzZXMgdGhlbiB3ZSBjYW4gZWFzaWx5IGNo YT0KbmdlIG1lY2hhbmlzbSAob2YgY291cnNlIHdoYXRldmVyIGNvZGUgaXMgbm90IHVzaW5nIGl0 IGNhbiBiZSBlYXNpbHkgY29udmVyPQp0ZWQgdG8gdXNlIHRoZSBtZWNoYW5pc20pPGJyPjwvZGl2 PjxkaXY+PGJyPjwvZGl2PjxkaXY+Rm9yIGV4YW1wbGUgYSBzaW1wbGU9CiBlbnVtIGNvdWxkIGRv IHRoZSB0cmljazo8YnI+PC9kaXY+PGRpdj4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLT0KLS0gRVhBTVBMRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPGJy PjwvZGl2PjxkaXY+LyoqPGJyPiZuYnNwPQo7KiBDb252ZW5pZW5jZSBjbGFzcyB0byBjaGVjayBp ZiBhIGdsdXN0ZXIgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgb3Igbm90IGluIGE9Cm55IGdpdmVuIHZl cnNpb24uJmx0O2JyJmd0Ozxicj4mbmJzcDsqIE1ldGhvZHMgc2hvdWxkIGJlIG5hbWVkIGJ5IGZl YXR1cmUgYT0KbmQgYWNjZXB0IHZlcnNpb24gdG8gY2hlY2sgYWdhaW5zdC48YnI+Jm5ic3A7Ki88 YnI+cHVibGljIGNsYXNzIEdsdXN0ZXJGZWF0PQp1cmVTdXBwb3J0ZWQgezwvZGl2PjxkaXY+Jm5i c3A7Jm5ic3A7Jm5ic3A7IC8qKjxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs9CiAqIEBwYXJh bSB2ZXJzaW9uPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAqJm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5icz0KcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgQ29tcGF0 aWJpbGl0eSB2ZXJzaW9uIHRvIGNoZWNrIGZvci48PQpicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsgKiBAcmV0dXJuICZsdDtjb2RlJmd0O3RydWUmbHQ7L2NvZGUmZ3Q7IGlmIGdsdXM9CnRlciBz dXBwb3J0IGlzIGVuYWJsZWQsICZsdDtjb2RlJmd0O2ZhbHNlJmx0Oy9jb2RlJmd0OyBpZiBpdCdz IG5vdC48YnI+Jm5icz0KcDsmbmJzcDsmbmJzcDsmbmJzcDsgKi88YnI+Jm5ic3A7Jm5ic3A7Jm5i c3A7IHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnbHVzdGVyPQooVmVyc2lvbiB2ZXJzaW9uKSB7PGJy PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyByZXR1cm4gU3U9CnBw b3J0ZWRGZWF0dXJlcy5HTFVTVEVSLmlzU3VwcG9ydGVkT24odmVyc2lvbik7PGJyPiZuYnNwOyZu YnNwOyZuYnNwOyB9PGJyPj0KPGRpdj48YnI+PC9kaXY+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8qKjxi cj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgKiBAcGFyYW0gPQp2ZXJzaW9uPGJyPiZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyAqJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm49 CmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgQ29tcGF0aWJpbGl0eSB2ZXJzaW9uIHRvIGNo ZWNrIGZvci48YnI+Jm5ic3A7Jj0KbmJzcDsmbmJzcDsmbmJzcDsgKiBAcmV0dXJuICZsdDtjb2Rl Jmd0O3RydWUmbHQ7L2NvZGUmZ3Q7IGlmIGdsdXN0ZXIgaGVhdnl3PQplaWdodCByZWZyZXNoIGlz IGVuYWJsZWQsICZsdDtjb2RlJmd0O2ZhbHNlJmx0Oy9jb2RlJmd0OyBpZiBpdCdzIG5vdC48YnI+ Jm49CmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgKi88YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1Ymxp YyBzdGF0aWMgYm9vbGVhbiByZWZyZT0Kc2hIZWF2eVdlaWdodChWZXJzaW9uIHZlcnNpb24pIHs8 YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5iPQpzcDsgcmV0dXJuIFN1 cHBvcnRlZEZlYXR1cmVzLlJFRlJFU0hfSEVBVllXRUlHSFQuaXNTdXBwb3J0ZWRPbih2ZXJzaW9u KTs8YnI9Cj4mbmJzcDsmbmJzcDsmbmJzcDsgfTxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2 PiZuYnNwOyZuYnNwOyZuYnNwOyAvKiBNbz0KcmUgbWV0aG9kcy4uLiAqLzwvZGl2PjxkaXY+PGJy PiZuYnNwOyZuYnNwOyZuYnNwOyBlbnVtIFN1cHBvcnRlZEZlYXR1cmVzIHs8PQpicj4mbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgR0xVU1RFUihWZXJzaW9uLnYzXzAp LDxicj4mbmI9CnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBSRUZSRVNI X0hFQVZZV0VJR0hUKFZlcnNpb24udjNfMCwgVj0KZXJzaW9uLnYzXzEpLDwvZGl2PjxkaXY+Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8qIE1vcmUgPQptZW1iZXJz ICovOzxicj48ZGl2Pjxicj48L2Rpdj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsgcHI9Cml2YXRlIFNldCZsdDtWZXJzaW9uJmd0OyB1bnN1cHBvcnRlZFZlcnNpb25z ID0zRCBuZXcgSGFzaFNldCZsdDtWZXJzaW9uJmd0Oz0KKCk7PGJyPjxkaXY+PGJyPjwvZGl2PiZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwcml2YXRlIFN1PQpwcG9y dGVkRmVhdHVyZXMoVmVyc2lvbi4uLiB2ZXJzaW9ucykgezxicj4mbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmI9CnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB1bnN1cHBv cnRlZFZlcnNpb25zLmFkZEFsbChBcnJheXMuYXNMaXN0KD0KdmVyc2lvbnMpKTs8YnI+Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH08YnI+PGRpdj48YnI+PC9kPQpp dj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGJvb2xl YW4gaXNTdXBwb3J0ZWRPbig9ClZlcnNpb24gdmVyc2lvbikgezxicj4mbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcD0KOyZuYnNwOyZuYnNwOyByZXR1 cm4gIXVuc3VwcG9ydGVkVmVyc2lvbnMuY29udGFpbnModmVyc2lvbik7PGJyPiZuYnNwOyZuYnNw PQo7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7 IH08L2Rpdj48ZGl2Pi0tLS0tLS09Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFTkQg RVhBTVBMRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT0KLS0tLS08L2Rpdj48ZGl2 Pjxicj48L2Rpdj48ZGl2PlRob3VnaHRzPzwvZGl2PjwvZGl2PjwvYmxvY2txdW90ZT48ZGl2Pjxi cj51PQpubGVzcyBpIGRpZG4ndCB1bmRlcnN0YW5kIHNvbWV0aGluZywgdGhpcyBpcyBub3QgZ29v ZCw8YnI+PC9kaXY+PGRpdj50aGlzIHM9CmhvdWxkIHN0YXkgY29uZmlndXJhYmxlIGJ5IHRoZSB1 c2Vycyw8YnI+PC9kaXY+PGRpdj5mb3IgZXhhbXBsZSBpZiBzb21lIHVzZT0KciBleHBlcmllbmNl IHNvbWUgaXNzdWVzIHdpdGggYSBmZWF0dXJlIGFuZCB3YW50IHRvIHR1cm4gaXQgb2ZmL2NoYW5n ZSB0aGUgPQp2YWx1ZXMuLjwvZGl2PjxkaXY+KG5vdCBhbGwgdmVyc2lvbiBjb25maWd1cmF0aW9u IGFyZSBib29sZWFuLCBzb21lIGFyZSBkaWY9CmZlcmVudCB2YWx1ZXMgdG8gZGlmZmVyZW50IHZl cnNpb25zLCBsaWtlIGNwdS1saXN0KTwvZGl2PjwvZGl2PjwvYmxvY2txdW90ZT0KPjxkaXY+PGJy PjwvZGl2PjxkaXY+VGhpcyBpcyBmb3IgQVBJIGxldmVsIGNvbXBhdGliaWxpdHkuPGJyPjwvZGl2 PjxkaXY+SWYgPQpWRFNNIGRvZXNuJ3Qgc3VwcG9ydCBmb3IgZXhhbXBsZSBob3QgcGx1ZyBpbiAz LjEgdGhlbiB0aGUgdXNlciBjYW4ndCBqdXN0IGQ9CmVjaWRlIHRoYXQgaXQgZG9lcyBhbmQgY2hh bmdlIGl0Ljxicj48L2Rpdj48ZGl2PkFsc28sIHRoaXMgaXMgbm90IGNoYW5nZWFibD0KZSBieSB1 c2VyIHNpbmNlIGl0J3Mgbm90IGV4cG9zZWQgYnkgZW5naW5lLWNvbmZpZyAobm9yIHNob3VsZCBp dCBiZSkuPGJyPjwvPQpkaXY+PC9kaXY+PC9ibG9ja3F1b3RlPjxkaXY+c29tZSBhcmUgZXhwb3Nl ZDxicj48L2Rpdj48YmxvY2txdW90ZSBzdHlsZT0zRCI9CmJvcmRlci1sZWZ0OjJweCBzb2xpZCAj MTAxMEZGO21hcmdpbi1sZWZ0OjVweDtwYWRkaW5nLWxlZnQ6NXB4O2NvbG9yOiMwMDA7Zj0Kb250 LXdlaWdodDpub3JtYWw7Zm9udC1zdHlsZTpub3JtYWw7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Zm9u dC1mYW1pbHk6SGVsdmV0PQppY2EsQXJpYWwsc2Fucy1zZXJpZjtmb250LXNpemU6MTJwdDsiPjxk aXYgc3R5bGU9M0QiZm9udC1mYW1pbHk6IHRpbWVzIG5ldyA9CnJvbWFuLCBuZXcgeW9yaywgdGlt ZXMsIHNlcmlmOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiAjMDAwMDAwIj48ZGl2PlRoaXMgaT0K cyBzdHJpY3RseSBmb3IgdGhlIGVuZ2luZS1WRFNNIEFQSSBjb21wYXRpYmlsaXR5LCBub3QgZm9y IG90aGVyIGNvbmZpZ3Mgd2hpPQpjaCBhcmUgdmVyc2lvbiBzcGVjaWZpYy48YnI+PC9kaXY+PC9k aXY+PC9ibG9ja3F1b3RlPjxkaXY+cmlnaHQsIGJ1dCBzdGlsbCA9CnVzZXIgc2hvdWxkIGJlIGFi bGUgdG8gdHVybiBmZWF0dXJlcyBvZmYgaW4gY2FzZSBvZiBwcm9ibGVtcyw8YnI+PC9kaXY+PGRp dj0KPm9yIGNoYW5nZSBpbiBzb21lIGNhc2VzIChmb3IgZXhhbXBsZSBpdCBpcyBwb3NzaWJsZSB0 byBhZGQgc3VwcG9ydCBmb3IgbW9yPQplIHBvd2VyIG1hbmFnZW1lbnQgZGV2aWNlcywgaSBrbm93 IGl0IHdhcyBkb25lIGJ5IHVzZXJzKTxicj48L2Rpdj48ZGl2Pm5vIHI9CmVhc29uIHRvIGJsb2Nr IHRoaXM8YnI+PC9kaXY+PGJsb2NrcXVvdGUgc3R5bGU9M0QiYm9yZGVyLWxlZnQ6MnB4IHNvbGlk ICMxMD0KMTBGRjttYXJnaW4tbGVmdDo1cHg7cGFkZGluZy1sZWZ0OjVweDtjb2xvcjojMDAwO2Zv bnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0PQp5bGU6bm9ybWFsO3RleHQtZGVjb3JhdGlvbjpub25l O2ZvbnQtZmFtaWx5OkhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQ9Ci1zaXplOjEycHQ7 Ij48ZGl2IHN0eWxlPTNEImZvbnQtZmFtaWx5OiB0aW1lcyBuZXcgcm9tYW4sIG5ldyB5b3JrLCB0 aW1lcywgcz0KZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogIzAwMDAwMCI+PGJsb2NrcXVv dGUgc3R5bGU9M0QiYm9yZGVyLWxlZnQ6MnB4PQogc29saWQgIzEwMTBGRjttYXJnaW4tbGVmdDo1 cHg7cGFkZGluZy1sZWZ0OjVweDtjb2xvcjojMDAwO2ZvbnQtd2VpZ2h0Om5vcm09CmFsO2ZvbnQt c3R5bGU6bm9ybWFsO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtZmFtaWx5OkhlbHZldGljYSxB cmlhbCxzYW5zLT0Kc2VyaWY7Zm9udC1zaXplOjEycHQ7Ij48ZGl2IHN0eWxlPTNEImZvbnQtZmFt aWx5OiB0aW1lcyBuZXcgcm9tYW4sIG5ldyB5b3JrPQosIHRpbWVzLCBzZXJpZjsgZm9udC1zaXpl OiAxMnB0OyBjb2xvcjogIzAwMDAwMCI+PGRpdj48YnI+PC9kaXY+PGJsb2NrcXVvdGU9CiBzdHls ZT0zRCJib3JkZXItbGVmdDoycHggc29saWQgIzEwMTBGRjttYXJnaW4tbGVmdDo1cHg7cGFkZGlu Zy1sZWZ0OjVweDtjbz0KbG9yOiMwMDA7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3R5bGU6bm9y bWFsO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtZmFtPQppbHk6SGVsdmV0aWNhLEFyaWFsLHNh bnMtc2VyaWY7Zm9udC1zaXplOjEycHQ7Ij48ZGl2IHN0eWxlPTNEImZvbnQtZmFtaWx5OiA9CnRp bWVzIG5ldyByb21hbiwgbmV3IHlvcmssIHRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBj b2xvcjogIzAwMDAwMCI+PD0KZGl2Pjxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PlJlZ2Fy ZHMsPGJyPjwvZGl2PjxkaXY+TWlrZTxicj48L2Rpdj48YmxvPQpja3F1b3RlIHN0eWxlPTNEImJv cmRlci1sZWZ0OjJweCBzb2xpZCAjMTAxMEZGO21hcmdpbi1sZWZ0OjVweDtwYWRkaW5nLWxlZnQ9 Cjo1cHg7Y29sb3I6IzAwMDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHlsZTpub3JtYWw7dGV4 dC1kZWNvcmF0aW9uOm5vbmU7Zj0Kb250LWZhbWlseTpIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJp Zjtmb250LXNpemU6MTJwdDsiPjxicj4gUGxlYXNlIHNoYXJlIHlvPQp1ciB0aG91Z2h0cyBvbiB0 aGlzLjxicj48ZGl2Pjxicj48L2Rpdj5UaGFua3MsPGJyPiBLYW5hZ2FyYWo8YnI+PGRpdj48YnI+ PC89CmRpdj48L2Jsb2NrcXVvdGU+PC9kaXY+PGJyPl9fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fPD0KYnI+RW5naW5lLWRldmVsIG1haWxpbmcgbGlzdDxicj5F bmdpbmUtZGV2ZWxAb3ZpcnQub3JnPGJyPmh0dHA6Ly9saXN0cy5vdmlyPQp0Lm9yZy9tYWlsbWFu L2xpc3RpbmZvL2VuZ2luZS1kZXZlbDxicj48L2Jsb2NrcXVvdGU+PGRpdj48YnI+PC9kaXY+PC9k aXY+PC89CmJsb2NrcXVvdGU+PGRpdj48YnI+PC9kaXY+PC9kaXY+PC9ibG9ja3F1b3RlPjxkaXY+ PGJyPjwvZGl2PjwvZGl2PjwvYm9keT48Lz0KaHRtbD4KLS0tLS0tPV9QYXJ0XzIxMDk0MTE3XzE3 NDI0OTAyMzIuMTM4NTg4ODk3MjUyOC0tCg== --===============8561495138324543877==-- From masayag at redhat.com Sun Dec 1 04:23:26 2013 Content-Type: multipart/mixed; boundary="===============7153690384851450959==" MIME-Version: 1.0 From: Moti Asayag To: devel at ovirt.org Subject: Re: [Engine-devel] Using config values Date: Sun, 01 Dec 2013 04:23:24 -0500 Message-ID: <1728493072.3569411.1385889804043.JavaMail.root@redhat.com> In-Reply-To: 823270883.21094118.1385888972530.JavaMail.root@redhat.com --===============7153690384851450959== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable ----- Original Message ----- > From: "Omer Frenkel" > To: "Mike Kolesnik" > Cc: "engine-devel" > Sent: Sunday, December 1, 2013 11:09:32 AM > Subject: Re: [Engine-devel] Using config values > = > = > = > = > = > = > From: "Mike Kolesnik" > To: "Omer Frenkel" > Cc: "Kanagaraj" , "engine-devel" > > Sent: Sunday, December 1, 2013 11:01:50 AM > Subject: Re: [Engine-devel] Using config values > = > = > = > = > = > = > = > = > = > = > From: "Mike Kolesnik" > To: "Kanagaraj" > Cc: "engine-devel" > Sent: Sunday, December 1, 2013 8:08:42 AM > Subject: Re: [Engine-devel] Using config values > = > = > = > = > Hi All, > = > Hi Kanagaraj, > = > = > = > = > The are some issues arising in configurations whenever we move up on the > versions(3.3 =3D> 3.4), because of the way we store and interpret them. > = > Whenever there is a new cluster level, you will need to add a new entry f= or > all(most) of the configuration. Mostly a copy paste if you see from 3.2 to > 3.3, except some CPU/PM type related configurations. > Better option would be to have the defaul config value in ConfigValues.ja= va > and the overrides will go to config.sql. In this approach you don't need a > new entries to config.sql when there is a new cluster level. > = > Lets take an exmaple, "SupportForceCreateVG" - This is supported from 3.1 > onwards, > = > If you look at config.sql, you will see following entries > select fn_db_add_config_value('SupportForceCreateVG','false','3.0'); > select fn_db_add_config_value('SupportForceCreateVG','true','3.1'); > select fn_db_add_config_value('SupportForceCreateVG','true','3.2'); > select fn_db_add_config_value('SupportForceCreateVG','true','3.3'); > = > And in ConfigValues.java > = > @TypeConverterAttribute(Boolean.class) > @DefaultValueAttribute("false") > SupportForceCreateVG, > = > Now if there is 3.4 and 3.5, the user needs to add 2 more entries, which i > feel is redundant. > = > Instead we can make > = > @TypeConverterAttribute(Boolean.class) > @DefaultValueAttribute("true") > SupportForceCreateVG, > = > and have only the following in config.sql > select fn_db_add_config_value('SupportForceCreateVG','false','3.0'); > = > if a particular value(for a specific cluster level) is not found in > Config.sql, the fallback is to use the value available in ConfigValues.ja= va. > = > This has already been implemented, there are many "feature supported" > configurations working like this (for example GlusterSupport). > = > I think a more interesting approach would be to move these out of the DB > since these values don't really hav e a reson to be there. > Since the entire thing is abstracted by "Gluster/FeatureSupported" classes > then we can easily change mechanism (of course whatever code is not using= it > can be easily converted to use the mechanism) > = > For example a simple enum could do the trick: > ------------------------------------- EXAMPLE > ------------------------------------- > /** > * Convenience class to check if a gluster feature is supported or not in = any > given version.
> * Methods should be named by feature and accept version to check against. > */ > public class GlusterFeatureSupported { > /** > * @param version > * Compatibility version to check for. > * @return true if gluster support is enabled, false > if it's not. > */ > public static boolean gluster(Version version) { > return SupportedFeatures.GLUSTER.isSupportedOn(version); > } > = > /** > * @param version > * Compatibility version to check for. > * @return true if gluster heavyweight refresh is enabled, > false if it's not. > */ > public static boolean refreshHeavyWeight(Version version) { > return SupportedFeatures.REFRESH_HEAVYWEIGHT.isSupportedOn(version); > } > = > /* More methods... */ > = > enum SupportedFeatures { > GLUSTER(Version.v3_0), > REFRESH_HEAVYWEIGHT(Version.v3_0, Version.v3_1), > /* More members */; > = > private Set unsupportedVersions =3D new HashSet(); > = > private SupportedFeatures(Version... versions) { > unsupportedVersions.addAll(Arrays.asList(versions)); > } > = > public boolean isSupportedOn(Version version) { > return !unsupportedVersions.contains(version); > } > } > ------------------------------------- END EXAMPLE > ------------------------------------- > = > Thoughts? > = > unless i didn't understand something, this is not good, > this should stay configurable by the users, > for example if some user experience some issues with a feature and want to > turn it off/change the values.. > (not all version configuration are boolean, some are different values to > different versions, like cpu-list) > = > This is for API level compatibility. > If VDSM doesn't support for example hot plug in 3.1 then the user can't j= ust > decide that it does and change it. > Also, this is not changeable by user since it's not exposed by engine-con= fig > (nor should it be). > some are exposed > = > = > = > This is strictly for the engine-VDSM API compatibility, not for other con= figs > which are version specific. > right, but still user should be able to turn features off in case of > problems, > or change in some cases (for example it is possible to add support for mo= re > power management devices, i know it was done by users) > no reason to block this > = In this case you add additional protection level to block user from enablin= g features for unsupported cluster levels. However it sounds more reasonable than requiring the user to use a lower cl= uster level which enforces him to give up on other features. > = > = > = > = > = > = > = > = > = > = > = > Regards, > Mike > = > = > = > Please share your thoughts on this. > = > Thanks, > Kanagaraj > = > = > _______________________________________________ > Engine-devel mailing list > Engine-devel(a)ovirt.org > http://lists.ovirt.org/mailman/listinfo/engine-devel > = > = > = > = > _______________________________________________ > Engine-devel mailing list > Engine-devel(a)ovirt.org > http://lists.ovirt.org/mailman/listinfo/engine-devel >=20 --===============7153690384851450959==-- From mkolesni at redhat.com Sun Dec 1 04:26:33 2013 Content-Type: multipart/mixed; boundary="===============5210880528237370469==" MIME-Version: 1.0 From: Mike Kolesnik To: devel at ovirt.org Subject: Re: [Engine-devel] Using config values Date: Sun, 01 Dec 2013 04:26:32 -0500 Message-ID: <2111239521.43208505.1385889991988.JavaMail.root@redhat.com> In-Reply-To: 823270883.21094118.1385888972530.JavaMail.root@redhat.com --===============5210880528237370469== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable ------=3D_Part_43208504_1304306350.1385889991982 Content-Type: text/plain; charset=3Dutf-8 Content-Transfer-Encoding: 7bit Regards, = Mike = ----- Original Message ----- > ----- Original Message ----- > > From: "Mike Kolesnik" > = > > To: "Omer Frenkel" > = > > Cc: "Kanagaraj" , "engine-devel" > > > = > > Sent: Sunday, December 1, 2013 11:01:50 AM > = > > Subject: Re: [Engine-devel] Using config values > = > > ----- Original Message ----- > = > > > ----- Original Message ----- > > = > = > > > > From: "Mike Kolesnik" > > > = > > = > = > > > > To: "Kanagaraj" > > > = > > = > = > > > > Cc: "engine-devel" > > > = > > = > = > > > > Sent: Sunday, December 1, 2013 8:08:42 AM > > > = > > = > = > > > > Subject: Re: [Engine-devel] Using config values > > > = > > = > = > > > > ----- Original Message ----- > > > = > > = > = > > > > > Hi All, > > > > = > > > = > > = > = > > > > Hi Kanagaraj, > > > = > > = > = > > > > > The are some issues arising in configurations whenever we move up= on > > > > > the > > > > > versions(3.3 =3D> 3.4), because of the way we store and interpret= them. > > > > = > > > = > > = > = > > > > > Whenever there is a new cluster level, you will need to add a new > > > > > entry > > > > > for > > > > > all(most) of the configuration. Mostly a copy paste if you see fr= om > > > > > 3.2 > > > > > to > > > > > 3.3, except some CPU/PM type related configurations. > > > > = > > > = > > = > = > > > > > Better option would be to have the defaul config value in > > > > > ConfigValues.java > > > > > and the overrides will go to config.sql. In this approach you don= 't > > > > > need > > > > > a > > > > > new entries to config.sql when there is a new cluster level. > > > > = > > > = > > = > = > > > > > Lets take an exmaple, "SupportForceCreateVG" - This is supported = from > > > > > 3.1 > > > > > onwards, > > > > = > > > = > > = > = > > > > > If you look at config.sql, you will see following entries > > > > = > > > = > > = > = > > > > > select fn_db_add_config_value('SupportForceCreateVG','false','3.0= '); > > > > = > > > = > > = > = > > > > > select fn_db_add_config_value('SupportForceCreateVG','true','3.1'= ); > > > > = > > > = > > = > = > > > > > select fn_db_add_config_value('SupportForceCreateVG','true','3.2'= ); > > > > = > > > = > > = > = > > > > > select fn_db_add_config_value('SupportForceCreateVG','true','3.3'= ); > > > > = > > > = > > = > = > > > > > And in ConfigValues.java > > > > = > > > = > > = > = > > > > > @TypeConverterAttribute(Boolean.class) > > > > = > > > = > > = > = > > > > > @DefaultValueAttribute("false") > > > > = > > > = > > = > = > > > > > SupportForceCreateVG, > > > > = > > > = > > = > = > > > > > Now if there is 3.4 and 3.5, the user needs to add 2 more entries, > > > > > which > > > > > i > > > > > feel is redundant. > > > > = > > > = > > = > = > > > > > Instead we can make > > > > = > > > = > > = > = > > > > > @TypeConverterAttribute(Boolean.class) > > > > = > > > = > > = > = > > > > > @DefaultValueAttribute("true") > > > > = > > > = > > = > = > > > > > SupportForceCreateVG, > > > > = > > > = > > = > = > > > > > and have only the following in config.sql > > > > = > > > = > > = > = > > > > > select fn_db_add_config_value('SupportForceCreateVG','false','3.0= '); > > > > = > > > = > > = > = > > > > > if a particular value(for a specific cluster level) is not found = in > > > > > Config.sql, the fallback is to use the value available in > > > > > ConfigValues.java. > > > > = > > > = > > = > = > > > > This has already been implemented, there are many "feature supporte= d" > > > > configurations working like this (for example GlusterSupport). > > > = > > = > = > > > > I think a more interesting approach would be to move these out of t= he > > > > DB > > > > since these values don't really hav e a reson to be there. > > > = > > = > = > > > > Since the entire thing is abstracted by "Gluster/FeatureSupported" > > > > classes > > > > then we can easily change mechanism (of course whatever code is not > > > > using > > > > it > > > > can be easily converted to use the mechanism) > > > = > > = > = > > > > For example a simple enum could do the trick: > > > = > > = > = > > > > ------------------------------------- EXAMPLE > > > > ------------------------------------- > > > = > > = > = > > > > /** > > > = > > = > = > > > > * Convenience class to check if a gluster feature is supported or n= ot > > > > in > > > > any > > > > given version.
> > > = > > = > = > > > > * Methods should be named by feature and accept version to check > > > > against. > > > = > > = > = > > > > */ > > > = > > = > = > > > > public class GlusterFeatureSupported { > > > = > > = > = > > > > /** > > > = > > = > = > > > > * @param version > > > = > > = > = > > > > * Compatibility version to check for. > > > = > > = > = > > > > * @return true if gluster support is enabled, > > > > false > > > > if it's not. > > > = > > = > = > > > > */ > > > = > > = > = > > > > public static boolean gluster(Version version) { > > > = > > = > = > > > > return SupportedFeatures.GLUSTER.isSupportedOn(version); > > > = > > = > = > > > > } > > > = > > = > = > > > > /** > > > = > > = > = > > > > * @param version > > > = > > = > = > > > > * Compatibility version to check for. > > > = > > = > = > > > > * @return true if gluster heavyweight refresh is enabl= ed, > > > > false if it's not. > > > = > > = > = > > > > */ > > > = > > = > = > > > > public static boolean refreshHeavyWeight(Version version) { > > > = > > = > = > > > > return SupportedFeatures.REFRESH_HEAVYWEIGHT.isSupportedOn(version); > > > = > > = > = > > > > } > > > = > > = > = > > > > /* More methods... */ > > > = > > = > = > > > > enum SupportedFeatures { > > > = > > = > = > > > > GLUSTER(Version.v3_0), > > > = > > = > = > > > > REFRESH_HEAVYWEIGHT(Version.v3_0, Version.v3_1), > > > = > > = > = > > > > /* More members */; > > > = > > = > = > > > > private Set unsupportedVersions =3D new HashSet(); > > > = > > = > = > > > > private SupportedFeatures(Version... versions) { > > > = > > = > = > > > > unsupportedVersions.addAll(Arrays.asList(versions)); > > > = > > = > = > > > > } > > > = > > = > = > > > > public boolean isSupportedOn(Version version) { > > > = > > = > = > > > > return !unsupportedVersions.contains(version); > > > = > > = > = > > > > } > > > = > > = > = > > > > } > > > = > > = > = > > > > ------------------------------------- END EXAMPLE > > > > ------------------------------------- > > > = > > = > = > > > > Thoughts? > > > = > > = > = > > > unless i didn't understand something, this is not good, > > = > = > > > this should stay configurable by the users, > > = > = > > > for example if some user experience some issues with a feature and wa= nt > > > to > > > turn it off/change the values.. > > = > = > > > (not all version configuration are boolean, some are different values= to > > > different versions, like cpu-list) > > = > = > > This is for API level compatibility. > = > > If VDSM doesn't support for example hot plug in 3.1 then the user can't > > just > > decide that it does and change it. > = > > Also, this is not changeable by user since it's not exposed by > > engine-config > > (nor should it be). > = > some are exposed If there is such a thing then its a design flaw. = The only one I see in FeatureSupported class is EnableMACAntiSpoofingFilter= Rules = This should be split into 2: = MACAntiSpoofingFilterRulesSupported - which is used to determine API compat= ibility = EnableMACAntiSpoofingFilterRules - which the user can set to determine syst= em behaviour = I see no reason why to allow user to set EnableMACAntiSpoofingFilterRules= =3Dtrue for 3.0 since it will not work so it's just confusing to him = > > This is strictly for the engine-VDSM API compatibility, not for other > > configs > > which are version specific. > = > right, but still user should be able to turn features off in case of > problems, > or change in some cases (for example it is possible to add support for mo= re > power management devices, i know it was done by users) > no reason to block this Again not talking about all the config values, strictly the ones that are (= or should be) in FeatureSupported class. = In case we want to allow user to tweak behavior there, we can always do as = I suggested for EnableMACAntiSpoofingFilterRules = > > > > Regards, > > > = > > = > = > > > > Mike > > > = > > = > = > > > > > Please share your thoughts on this. > > > > = > > > = > > = > = > > > > > Thanks, > > > > = > > > = > > = > = > > > > > Kanagaraj > > > > = > > > = > > = > = > > > > _______________________________________________ > > > = > > = > = > > > > Engine-devel mailing list > > > = > > = > = > > > > Engine-devel(a)ovirt.org > > > = > > = > = > > > > http://lists.ovirt.org/mailman/listinfo/engine-devel > > > = > > = > = ------=3D_Part_43208504_1304306350.1385889991982 Content-Type: text/html; charset=3Dutf-8 Content-Transfer-Encoding: quoted-printable


Regards,
Mike





Fr= =3D om: "Mike Kolesnik" <mkolesni(a)redhat.com>
To: "Omer F= re=3D nkel" <ofrenkel(a)redhat.com>
Cc: "Kanagaraj" <kmayilsa(= a)re=3D dhat.com>, "engine-devel" <engine-devel(a)ovirt.org>
Sent: <= /b=3D >Sunday, December 1, 2013 11:01:50 AM
Subject: Re: [Engine-devel]= =3D Using config values





From: "Mike Kolesnik= =3D " <mkolesni(a)redhat.com>
To: "Kanagaraj" <kmayilsa(a)re= dhat=3D .com>
Cc: "engine-devel" <engine-devel(a)ovirt.org>
<= b>=3D Sent:
Sunday, December 1, 2013 8:08:42 AM
Subject: Re: [Engin= =3D e-devel] Using config values

H= =3D i All,

Hi Kanagaraj,


The are s= =3D ome issues arising in configurations whenever we move up on the versions(3.= =3D 3 =3D3D> 3.4), because of the way we store and interpret them.
<= br=3D >
Whenever there is a new cluster level, you will need to add a new en= =3D try for all(most) of the configuration. Mostly a copy paste if you see from= =3D 3.2 to 3.3, except some CPU/PM type related configurations.
Better opt= =3D ion would be to have the defaul config value in ConfigValues.java and the o= =3D verrides will go to config.sql. In this approach you don't need a new entri= =3D es to config.sql when there is a new cluster level.

Lets = =3D take an exmaple, "SupportForceCreateVG" - This is supported from 3.1 onward= =3D s,

If you look at config.sql, you will see following entr= =3D ies
select fn_db_add_config_value('SupportForceCreateVG','false','3.0'= =3D );
select fn_db_add_config_value('SupportForceCreateVG','true','3.1');= =3D
select fn_db_add_config_value('SupportForceCreateVG','true','3.2'); <= =3D br> select fn_db_add_config_value('SupportForceCreateVG','true','3.3');
= =3D

And in ConfigValues.java

   = =3D ; @TypeConverterAttribute(Boolean.class)
    @DefaultVal= =3D ueAttribute("false")
    SupportForceCreateVG,
<= =3D br>
Now if there is 3.4 and 3.5, the user needs to add 2 more entries,= =3D which i feel is redundant.

Instead we can make
= =3D
    @TypeConverterAttribute(Boolean.class)
&nb= =3D sp;   @DefaultValueAttribute("true")
    Suppo= =3D rtForceCreateVG,

and have only the following in config.sq= =3D l
select fn_db_add_config_value('SupportForceCreateVG','false','3.0');<= =3D br>

if a particular value(for a specific cluster level) is no= =3D t found in Config.sql, the fallback is to use the value available in Config= =3D Values.java.

This has already been implemen= =3D ted, there are many "feature supported" configurations working like this (f= =3D or example GlusterSupport).

I think a more int= =3D eresting approach would be to move these out of the DB since these values d= =3D on't really hav e a reson to be there.
Since the entire thing= =3D is abstracted by "Gluster/FeatureSupported" classes then we can easily cha= =3D nge mechanism (of course whatever code is not using it can be easily conver= =3D ted to use the mechanism)

For example a simple= =3D enum could do the trick:
-----------------------------------= =3D -- EXAMPLE -------------------------------------
/**
 = =3D ;* Convenience class to check if a gluster feature is supported or not in a= =3D ny given version.<br>
 * Methods should be named by feature a= =3D nd accept version to check against.
 */
public class GlusterFeat= =3D ureSupported {
    /**
    = =3D * @param version
     *    &nbs= =3D p;       Compatibility version to check for.<= =3D br>     * @return <code>true</code> if glus= =3D ter support is enabled, <code>false</code> if it's not.
&nbs= =3D p;    */
    public static boolean gluster= =3D (Version version) {
        return Su= =3D pportedFeatures.GLUSTER.isSupportedOn(version);
    }
= =3D

    /**
     * @param = =3D version
     *      &n= =3D bsp;     Compatibility version to check for.
 &= =3D nbsp;   * @return <code>true</code> if gluster heavyw= =3D eight refresh is enabled, <code>false</code> if it's not.
&n= =3D bsp;    */
    public static boolean refre= =3D shHeavyWeight(Version version) {
      &nb= =3D sp; return SupportedFeatures.REFRESH_HEAVYWEIGHT.isSupportedOn(version);    }

    /* Mo= =3D re methods... */

    enum SupportedFeatures {<= =3D br>        GLUSTER(Version.v3_0),
&nb= =3D sp;       REFRESH_HEAVYWEIGHT(Version.v3_0, V= =3D ersion.v3_1),
        /* More = =3D members */;

        pr= =3D ivate Set<Version> unsupportedVersions =3D3D new HashSet<Version&g= t;=3D ();

        private Su= =3D pportedFeatures(Version... versions) {
     &nb= =3D sp;      unsupportedVersions.addAll(Arrays.asList(= =3D versions));
        }

        public boolean isSupportedOn(= =3D Version version) {
         = =3D ;   return !unsupportedVersions.contains(version);
  = =3D ;      }
    }
-------= =3D ------------------------------ END EXAMPLE --------------------------------= =3D -----

Thoughts?

u= =3D nless i didn't understand something, this is not good,
this s= =3D hould stay configurable by the users,
for example if some use= =3D r experience some issues with a feature and want to turn it off/change the = =3D values..
(not all version configuration are boolean, some are dif= =3D ferent values to different versions, like cpu-list)

This is for API level compatibility.
If = =3D VDSM doesn't support for example hot plug in 3.1 then the user can't just d= =3D ecide that it does and change it.
Also, this is not changeabl= =3D e by user since it's not exposed by engine-config (nor should it be).
some are exposed
I= =3D f there is such a thing then its a design flaw.

The only one I see in FeatureSupported class is EnableMACAntiSpoofingFilt= =3D erRules
This should be split into 2:
MACAntiSpo= =3D ofingFilterRulesSupported - which is used to determine API compatibility
EnableMACAntiSpoofingFilterRules - which the user can set to de= =3D termine system behaviour

I see no reason why t= =3D o allow user to set EnableMACAntiSpoofingFilterRules=3D3Dtrue for 3.0 since= i=3D t will not work so it's just confusing to him

<= =3D /div>
This is strictly for the engine-VDSM API compatibility= =3D , not for other configs which are version specific.
right, but still user should be able to turn features off in case= =3D of problems,
or change in some cases (for example it is poss= =3D ible to add support for more power management devices, i know it was done b= =3D y users)
no reason to block this
Again not talking about all the config values, strictly the ones that are = =3D (or should be) in FeatureSupported class.

In c= =3D ase we want to allow user to tweak behavior there, we can always do as I su= =3D ggested for EnableMACAntiSpoofingFilterRules

= =3D



= =3D
Regards,
Mike

Please share your thoughts on this.

Thanks,
Kanagaraj

= =3D
_______________________________________________
Engine-devel mailing= =3D list
Engine-devel(a)ovirt.org
http://lists.ovirt.org/mailman/listinf= o/=3D engine-devel




------=3D_Part_43208504_1304306350.1385889991982-- --===============5210880528237370469== Content-Type: multipart/alternative MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.bin" LS0tLS0tPV9QYXJ0XzQzMjA4NTA0XzEzMDQzMDYzNTAuMTM4NTg4OTk5MTk4MgpDb250ZW50LVR5 cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzog N2JpdAoKUmVnYXJkcywgCk1pa2UgCgotLS0tLSBPcmlnaW5hbCBNZXNzYWdlIC0tLS0tCgo+IC0t LS0tIE9yaWdpbmFsIE1lc3NhZ2UgLS0tLS0KCj4gPiBGcm9tOiAiTWlrZSBLb2xlc25payIgPG1r b2xlc25pQHJlZGhhdC5jb20+Cj4gCj4gPiBUbzogIk9tZXIgRnJlbmtlbCIgPG9mcmVua2VsQHJl ZGhhdC5jb20+Cj4gCj4gPiBDYzogIkthbmFnYXJhaiIgPGttYXlpbHNhQHJlZGhhdC5jb20+LCAi ZW5naW5lLWRldmVsIgo+ID4gPGVuZ2luZS1kZXZlbEBvdmlydC5vcmc+Cj4gCj4gPiBTZW50OiBT dW5kYXksIERlY2VtYmVyIDEsIDIwMTMgMTE6MDE6NTAgQU0KPiAKPiA+IFN1YmplY3Q6IFJlOiBb RW5naW5lLWRldmVsXSBVc2luZyBjb25maWcgdmFsdWVzCj4gCgo+ID4gLS0tLS0gT3JpZ2luYWwg TWVzc2FnZSAtLS0tLQo+IAoKPiA+ID4gLS0tLS0gT3JpZ2luYWwgTWVzc2FnZSAtLS0tLQo+ID4g Cj4gCgo+ID4gPiA+IEZyb206ICJNaWtlIEtvbGVzbmlrIiA8bWtvbGVzbmlAcmVkaGF0LmNvbT4K PiA+ID4gCj4gPiAKPiAKPiA+ID4gPiBUbzogIkthbmFnYXJhaiIgPGttYXlpbHNhQHJlZGhhdC5j b20+Cj4gPiA+IAo+ID4gCj4gCj4gPiA+ID4gQ2M6ICJlbmdpbmUtZGV2ZWwiIDxlbmdpbmUtZGV2 ZWxAb3ZpcnQub3JnPgo+ID4gPiAKPiA+IAo+IAo+ID4gPiA+IFNlbnQ6IFN1bmRheSwgRGVjZW1i ZXIgMSwgMjAxMyA4OjA4OjQyIEFNCj4gPiA+IAo+ID4gCj4gCj4gPiA+ID4gU3ViamVjdDogUmU6 IFtFbmdpbmUtZGV2ZWxdIFVzaW5nIGNvbmZpZyB2YWx1ZXMKPiA+ID4gCj4gPiAKPiAKCj4gPiA+ ID4gLS0tLS0gT3JpZ2luYWwgTWVzc2FnZSAtLS0tLQo+ID4gPiAKPiA+IAo+IAoKPiA+ID4gPiA+ IEhpIEFsbCwKPiA+ID4gPiAKPiA+ID4gCj4gPiAKPiAKPiA+ID4gPiBIaSBLYW5hZ2FyYWosCj4g PiA+IAo+ID4gCj4gCgo+ID4gPiA+ID4gVGhlIGFyZSBzb21lIGlzc3VlcyBhcmlzaW5nIGluIGNv bmZpZ3VyYXRpb25zIHdoZW5ldmVyIHdlIG1vdmUgdXAgb24KPiA+ID4gPiA+IHRoZQo+ID4gPiA+ ID4gdmVyc2lvbnMoMy4zID0+IDMuNCksIGJlY2F1c2Ugb2YgdGhlIHdheSB3ZSBzdG9yZSBhbmQg aW50ZXJwcmV0IHRoZW0uCj4gPiA+ID4gCj4gPiA+IAo+ID4gCj4gCgo+ID4gPiA+ID4gV2hlbmV2 ZXIgdGhlcmUgaXMgYSBuZXcgY2x1c3RlciBsZXZlbCwgeW91IHdpbGwgbmVlZCB0byBhZGQgYSBu ZXcKPiA+ID4gPiA+IGVudHJ5Cj4gPiA+ID4gPiBmb3IKPiA+ID4gPiA+IGFsbChtb3N0KSBvZiB0 aGUgY29uZmlndXJhdGlvbi4gTW9zdGx5IGEgY29weSBwYXN0ZSBpZiB5b3Ugc2VlIGZyb20KPiA+ ID4gPiA+IDMuMgo+ID4gPiA+ID4gdG8KPiA+ID4gPiA+IDMuMywgZXhjZXB0IHNvbWUgQ1BVL1BN IHR5cGUgcmVsYXRlZCBjb25maWd1cmF0aW9ucy4KPiA+ID4gPiAKPiA+ID4gCj4gPiAKPiAKPiA+ ID4gPiA+IEJldHRlciBvcHRpb24gd291bGQgYmUgdG8gaGF2ZSB0aGUgZGVmYXVsIGNvbmZpZyB2 YWx1ZSBpbgo+ID4gPiA+ID4gQ29uZmlnVmFsdWVzLmphdmEKPiA+ID4gPiA+IGFuZCB0aGUgb3Zl cnJpZGVzIHdpbGwgZ28gdG8gY29uZmlnLnNxbC4gSW4gdGhpcyBhcHByb2FjaCB5b3UgZG9uJ3QK PiA+ID4gPiA+IG5lZWQKPiA+ID4gPiA+IGEKPiA+ID4gPiA+IG5ldyBlbnRyaWVzIHRvIGNvbmZp Zy5zcWwgd2hlbiB0aGVyZSBpcyBhIG5ldyBjbHVzdGVyIGxldmVsLgo+ID4gPiA+IAo+ID4gPiAK PiA+IAo+IAoKPiA+ID4gPiA+IExldHMgdGFrZSBhbiBleG1hcGxlLCAiU3VwcG9ydEZvcmNlQ3Jl YXRlVkciIC0gVGhpcyBpcyBzdXBwb3J0ZWQgZnJvbQo+ID4gPiA+ID4gMy4xCj4gPiA+ID4gPiBv bndhcmRzLAo+ID4gPiA+IAo+ID4gPiAKPiA+IAo+IAoKPiA+ID4gPiA+IElmIHlvdSBsb29rIGF0 IGNvbmZpZy5zcWwsIHlvdSB3aWxsIHNlZSBmb2xsb3dpbmcgZW50cmllcwo+ID4gPiA+IAo+ID4g PiAKPiA+IAo+IAo+ID4gPiA+ID4gc2VsZWN0IGZuX2RiX2FkZF9jb25maWdfdmFsdWUoJ1N1cHBv cnRGb3JjZUNyZWF0ZVZHJywnZmFsc2UnLCczLjAnKTsKPiA+ID4gPiAKPiA+ID4gCj4gPiAKPiAK PiA+ID4gPiA+IHNlbGVjdCBmbl9kYl9hZGRfY29uZmlnX3ZhbHVlKCdTdXBwb3J0Rm9yY2VDcmVh dGVWRycsJ3RydWUnLCczLjEnKTsKPiA+ID4gPiAKPiA+ID4gCj4gPiAKPiAKPiA+ID4gPiA+IHNl bGVjdCBmbl9kYl9hZGRfY29uZmlnX3ZhbHVlKCdTdXBwb3J0Rm9yY2VDcmVhdGVWRycsJ3RydWUn LCczLjInKTsKPiA+ID4gPiAKPiA+ID4gCj4gPiAKPiAKPiA+ID4gPiA+IHNlbGVjdCBmbl9kYl9h ZGRfY29uZmlnX3ZhbHVlKCdTdXBwb3J0Rm9yY2VDcmVhdGVWRycsJ3RydWUnLCczLjMnKTsKPiA+ ID4gPiAKPiA+ID4gCj4gPiAKPiAKCj4gPiA+ID4gPiBBbmQgaW4gQ29uZmlnVmFsdWVzLmphdmEK PiA+ID4gPiAKPiA+ID4gCj4gPiAKPiAKCj4gPiA+ID4gPiBAVHlwZUNvbnZlcnRlckF0dHJpYnV0 ZShCb29sZWFuLmNsYXNzKQo+ID4gPiA+IAo+ID4gPiAKPiA+IAo+IAo+ID4gPiA+ID4gQERlZmF1 bHRWYWx1ZUF0dHJpYnV0ZSgiZmFsc2UiKQo+ID4gPiA+IAo+ID4gPiAKPiA+IAo+IAo+ID4gPiA+ ID4gU3VwcG9ydEZvcmNlQ3JlYXRlVkcsCj4gPiA+ID4gCj4gPiA+IAo+ID4gCj4gCgo+ID4gPiA+ ID4gTm93IGlmIHRoZXJlIGlzIDMuNCBhbmQgMy41LCB0aGUgdXNlciBuZWVkcyB0byBhZGQgMiBt b3JlIGVudHJpZXMsCj4gPiA+ID4gPiB3aGljaAo+ID4gPiA+ID4gaQo+ID4gPiA+ID4gZmVlbCBp cyByZWR1bmRhbnQuCj4gPiA+ID4gCj4gPiA+IAo+ID4gCj4gCgo+ID4gPiA+ID4gSW5zdGVhZCB3 ZSBjYW4gbWFrZQo+ID4gPiA+IAo+ID4gPiAKPiA+IAo+IAoKPiA+ID4gPiA+IEBUeXBlQ29udmVy dGVyQXR0cmlidXRlKEJvb2xlYW4uY2xhc3MpCj4gPiA+ID4gCj4gPiA+IAo+ID4gCj4gCj4gPiA+ ID4gPiBARGVmYXVsdFZhbHVlQXR0cmlidXRlKCJ0cnVlIikKPiA+ID4gPiAKPiA+ID4gCj4gPiAK PiAKPiA+ID4gPiA+IFN1cHBvcnRGb3JjZUNyZWF0ZVZHLAo+ID4gPiA+IAo+ID4gPiAKPiA+IAo+ IAoKPiA+ID4gPiA+IGFuZCBoYXZlIG9ubHkgdGhlIGZvbGxvd2luZyBpbiBjb25maWcuc3FsCj4g PiA+ID4gCj4gPiA+IAo+ID4gCj4gCj4gPiA+ID4gPiBzZWxlY3QgZm5fZGJfYWRkX2NvbmZpZ192 YWx1ZSgnU3VwcG9ydEZvcmNlQ3JlYXRlVkcnLCdmYWxzZScsJzMuMCcpOwo+ID4gPiA+IAo+ID4g PiAKPiA+IAo+IAoKPiA+ID4gPiA+IGlmIGEgcGFydGljdWxhciB2YWx1ZShmb3IgYSBzcGVjaWZp YyBjbHVzdGVyIGxldmVsKSBpcyBub3QgZm91bmQgaW4KPiA+ID4gPiA+IENvbmZpZy5zcWwsIHRo ZSBmYWxsYmFjayBpcyB0byB1c2UgdGhlIHZhbHVlIGF2YWlsYWJsZSBpbgo+ID4gPiA+ID4gQ29u ZmlnVmFsdWVzLmphdmEuCj4gPiA+ID4gCj4gPiA+IAo+ID4gCj4gCj4gPiA+ID4gVGhpcyBoYXMg YWxyZWFkeSBiZWVuIGltcGxlbWVudGVkLCB0aGVyZSBhcmUgbWFueSAiZmVhdHVyZSBzdXBwb3J0 ZWQiCj4gPiA+ID4gY29uZmlndXJhdGlvbnMgd29ya2luZyBsaWtlIHRoaXMgKGZvciBleGFtcGxl IEdsdXN0ZXJTdXBwb3J0KS4KPiA+ID4gCj4gPiAKPiAKCj4gPiA+ID4gSSB0aGluayBhIG1vcmUg aW50ZXJlc3RpbmcgYXBwcm9hY2ggd291bGQgYmUgdG8gbW92ZSB0aGVzZSBvdXQgb2YgdGhlCj4g PiA+ID4gREIKPiA+ID4gPiBzaW5jZSB0aGVzZSB2YWx1ZXMgZG9uJ3QgcmVhbGx5IGhhdiBlIGEg cmVzb24gdG8gYmUgdGhlcmUuCj4gPiA+IAo+ID4gCj4gCj4gPiA+ID4gU2luY2UgdGhlIGVudGly ZSB0aGluZyBpcyBhYnN0cmFjdGVkIGJ5ICJHbHVzdGVyL0ZlYXR1cmVTdXBwb3J0ZWQiCj4gPiA+ ID4gY2xhc3Nlcwo+ID4gPiA+IHRoZW4gd2UgY2FuIGVhc2lseSBjaGFuZ2UgbWVjaGFuaXNtIChv ZiBjb3Vyc2Ugd2hhdGV2ZXIgY29kZSBpcyBub3QKPiA+ID4gPiB1c2luZwo+ID4gPiA+IGl0Cj4g PiA+ID4gY2FuIGJlIGVhc2lseSBjb252ZXJ0ZWQgdG8gdXNlIHRoZSBtZWNoYW5pc20pCj4gPiA+ IAo+ID4gCj4gCgo+ID4gPiA+IEZvciBleGFtcGxlIGEgc2ltcGxlIGVudW0gY291bGQgZG8gdGhl IHRyaWNrOgo+ID4gPiAKPiA+IAo+IAo+ID4gPiA+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0gRVhBTVBMRQo+ID4gPiA+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KPiA+ID4gCj4gPiAKPiAKPiA+ID4gPiAvKioKPiA+ID4gCj4gPiAKPiAKPiA+ID4g PiAqIENvbnZlbmllbmNlIGNsYXNzIHRvIGNoZWNrIGlmIGEgZ2x1c3RlciBmZWF0dXJlIGlzIHN1 cHBvcnRlZCBvciBub3QKPiA+ID4gPiBpbgo+ID4gPiA+IGFueQo+ID4gPiA+IGdpdmVuIHZlcnNp b24uPGJyPgo+ID4gPiAKPiA+IAo+IAo+ID4gPiA+ICogTWV0aG9kcyBzaG91bGQgYmUgbmFtZWQg YnkgZmVhdHVyZSBhbmQgYWNjZXB0IHZlcnNpb24gdG8gY2hlY2sKPiA+ID4gPiBhZ2FpbnN0Lgo+ ID4gPiAKPiA+IAo+IAo+ID4gPiA+ICovCj4gPiA+IAo+ID4gCj4gCj4gPiA+ID4gcHVibGljIGNs YXNzIEdsdXN0ZXJGZWF0dXJlU3VwcG9ydGVkIHsKPiA+ID4gCj4gPiAKPiAKPiA+ID4gPiAvKioK PiA+ID4gCj4gPiAKPiAKPiA+ID4gPiAqIEBwYXJhbSB2ZXJzaW9uCj4gPiA+IAo+ID4gCj4gCj4g PiA+ID4gKiBDb21wYXRpYmlsaXR5IHZlcnNpb24gdG8gY2hlY2sgZm9yLgo+ID4gPiAKPiA+IAo+ IAo+ID4gPiA+ICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBnbHVzdGVyIHN1cHBvcnQg aXMgZW5hYmxlZCwKPiA+ID4gPiA8Y29kZT5mYWxzZTwvY29kZT4KPiA+ID4gPiBpZiBpdCdzIG5v dC4KPiA+ID4gCj4gPiAKPiAKPiA+ID4gPiAqLwo+ID4gPiAKPiA+IAo+IAo+ID4gPiA+IHB1Ymxp YyBzdGF0aWMgYm9vbGVhbiBnbHVzdGVyKFZlcnNpb24gdmVyc2lvbikgewo+ID4gPiAKPiA+IAo+ IAo+ID4gPiA+IHJldHVybiBTdXBwb3J0ZWRGZWF0dXJlcy5HTFVTVEVSLmlzU3VwcG9ydGVkT24o dmVyc2lvbik7Cj4gPiA+IAo+ID4gCj4gCj4gPiA+ID4gfQo+ID4gPiAKPiA+IAo+IAoKPiA+ID4g PiAvKioKPiA+ID4gCj4gPiAKPiAKPiA+ID4gPiAqIEBwYXJhbSB2ZXJzaW9uCj4gPiA+IAo+ID4g Cj4gCj4gPiA+ID4gKiBDb21wYXRpYmlsaXR5IHZlcnNpb24gdG8gY2hlY2sgZm9yLgo+ID4gPiAK PiA+IAo+IAo+ID4gPiA+ICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBnbHVzdGVyIGhl YXZ5d2VpZ2h0IHJlZnJlc2ggaXMgZW5hYmxlZCwKPiA+ID4gPiA8Y29kZT5mYWxzZTwvY29kZT4g aWYgaXQncyBub3QuCj4gPiA+IAo+ID4gCj4gCj4gPiA+ID4gKi8KPiA+ID4gCj4gPiAKPiAKPiA+ ID4gPiBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVmcmVzaEhlYXZ5V2VpZ2h0KFZlcnNpb24gdmVy c2lvbikgewo+ID4gPiAKPiA+IAo+IAo+ID4gPiA+IHJldHVybiBTdXBwb3J0ZWRGZWF0dXJlcy5S RUZSRVNIX0hFQVZZV0VJR0hULmlzU3VwcG9ydGVkT24odmVyc2lvbik7Cj4gPiA+IAo+ID4gCj4g Cj4gPiA+ID4gfQo+ID4gPiAKPiA+IAo+IAoKPiA+ID4gPiAvKiBNb3JlIG1ldGhvZHMuLi4gKi8K PiA+ID4gCj4gPiAKPiAKCj4gPiA+ID4gZW51bSBTdXBwb3J0ZWRGZWF0dXJlcyB7Cj4gPiA+IAo+ ID4gCj4gCj4gPiA+ID4gR0xVU1RFUihWZXJzaW9uLnYzXzApLAo+ID4gPiAKPiA+IAo+IAo+ID4g PiA+IFJFRlJFU0hfSEVBVllXRUlHSFQoVmVyc2lvbi52M18wLCBWZXJzaW9uLnYzXzEpLAo+ID4g PiAKPiA+IAo+IAo+ID4gPiA+IC8qIE1vcmUgbWVtYmVycyAqLzsKPiA+ID4gCj4gPiAKPiAKCj4g PiA+ID4gcHJpdmF0ZSBTZXQ8VmVyc2lvbj4gdW5zdXBwb3J0ZWRWZXJzaW9ucyA9IG5ldyBIYXNo U2V0PFZlcnNpb24+KCk7Cj4gPiA+IAo+ID4gCj4gCgo+ID4gPiA+IHByaXZhdGUgU3VwcG9ydGVk RmVhdHVyZXMoVmVyc2lvbi4uLiB2ZXJzaW9ucykgewo+ID4gPiAKPiA+IAo+IAo+ID4gPiA+IHVu c3VwcG9ydGVkVmVyc2lvbnMuYWRkQWxsKEFycmF5cy5hc0xpc3QodmVyc2lvbnMpKTsKPiA+ID4g Cj4gPiAKPiAKPiA+ID4gPiB9Cj4gPiA+IAo+ID4gCj4gCgo+ID4gPiA+IHB1YmxpYyBib29sZWFu IGlzU3VwcG9ydGVkT24oVmVyc2lvbiB2ZXJzaW9uKSB7Cj4gPiA+IAo+ID4gCj4gCj4gPiA+ID4g cmV0dXJuICF1bnN1cHBvcnRlZFZlcnNpb25zLmNvbnRhaW5zKHZlcnNpb24pOwo+ID4gPiAKPiA+ IAo+IAo+ID4gPiA+IH0KPiA+ID4gCj4gPiAKPiAKPiA+ID4gPiB9Cj4gPiA+IAo+ID4gCj4gCj4g PiA+ID4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFTkQgRVhBTVBMRQo+ ID4gPiA+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiA+ID4gCj4gPiAK PiAKCj4gPiA+ID4gVGhvdWdodHM/Cj4gPiA+IAo+ID4gCj4gCgo+ID4gPiB1bmxlc3MgaSBkaWRu J3QgdW5kZXJzdGFuZCBzb21ldGhpbmcsIHRoaXMgaXMgbm90IGdvb2QsCj4gPiAKPiAKPiA+ID4g dGhpcyBzaG91bGQgc3RheSBjb25maWd1cmFibGUgYnkgdGhlIHVzZXJzLAo+ID4gCj4gCj4gPiA+ IGZvciBleGFtcGxlIGlmIHNvbWUgdXNlciBleHBlcmllbmNlIHNvbWUgaXNzdWVzIHdpdGggYSBm ZWF0dXJlIGFuZCB3YW50Cj4gPiA+IHRvCj4gPiA+IHR1cm4gaXQgb2ZmL2NoYW5nZSB0aGUgdmFs dWVzLi4KPiA+IAo+IAo+ID4gPiAobm90IGFsbCB2ZXJzaW9uIGNvbmZpZ3VyYXRpb24gYXJlIGJv b2xlYW4sIHNvbWUgYXJlIGRpZmZlcmVudCB2YWx1ZXMgdG8KPiA+ID4gZGlmZmVyZW50IHZlcnNp b25zLCBsaWtlIGNwdS1saXN0KQo+ID4gCj4gCgo+ID4gVGhpcyBpcyBmb3IgQVBJIGxldmVsIGNv bXBhdGliaWxpdHkuCj4gCj4gPiBJZiBWRFNNIGRvZXNuJ3Qgc3VwcG9ydCBmb3IgZXhhbXBsZSBo b3QgcGx1ZyBpbiAzLjEgdGhlbiB0aGUgdXNlciBjYW4ndAo+ID4ganVzdAo+ID4gZGVjaWRlIHRo YXQgaXQgZG9lcyBhbmQgY2hhbmdlIGl0Lgo+IAo+ID4gQWxzbywgdGhpcyBpcyBub3QgY2hhbmdl YWJsZSBieSB1c2VyIHNpbmNlIGl0J3Mgbm90IGV4cG9zZWQgYnkKPiA+IGVuZ2luZS1jb25maWcK PiA+IChub3Igc2hvdWxkIGl0IGJlKS4KPiAKCj4gc29tZSBhcmUgZXhwb3NlZAoKSWYgdGhlcmUg aXMgc3VjaCBhIHRoaW5nIHRoZW4gaXRzIGEgZGVzaWduIGZsYXcuIAoKVGhlIG9ubHkgb25lIEkg c2VlIGluIEZlYXR1cmVTdXBwb3J0ZWQgY2xhc3MgaXMgRW5hYmxlTUFDQW50aVNwb29maW5nRmls dGVyUnVsZXMgClRoaXMgc2hvdWxkIGJlIHNwbGl0IGludG8gMjogCk1BQ0FudGlTcG9vZmluZ0Zp bHRlclJ1bGVzU3VwcG9ydGVkIC0gd2hpY2ggaXMgdXNlZCB0byBkZXRlcm1pbmUgQVBJIGNvbXBh dGliaWxpdHkgCkVuYWJsZU1BQ0FudGlTcG9vZmluZ0ZpbHRlclJ1bGVzIC0gd2hpY2ggdGhlIHVz ZXIgY2FuIHNldCB0byBkZXRlcm1pbmUgc3lzdGVtIGJlaGF2aW91ciAKCkkgc2VlIG5vIHJlYXNv biB3aHkgdG8gYWxsb3cgdXNlciB0byBzZXQgRW5hYmxlTUFDQW50aVNwb29maW5nRmlsdGVyUnVs ZXM9dHJ1ZSBmb3IgMy4wIHNpbmNlIGl0IHdpbGwgbm90IHdvcmsgc28gaXQncyBqdXN0IGNvbmZ1 c2luZyB0byBoaW0gCgo+ID4gVGhpcyBpcyBzdHJpY3RseSBmb3IgdGhlIGVuZ2luZS1WRFNNIEFQ SSBjb21wYXRpYmlsaXR5LCBub3QgZm9yIG90aGVyCj4gPiBjb25maWdzCj4gPiB3aGljaCBhcmUg dmVyc2lvbiBzcGVjaWZpYy4KPiAKCj4gcmlnaHQsIGJ1dCBzdGlsbCB1c2VyIHNob3VsZCBiZSBh YmxlIHRvIHR1cm4gZmVhdHVyZXMgb2ZmIGluIGNhc2Ugb2YKPiBwcm9ibGVtcywKPiBvciBjaGFu Z2UgaW4gc29tZSBjYXNlcyAoZm9yIGV4YW1wbGUgaXQgaXMgcG9zc2libGUgdG8gYWRkIHN1cHBv cnQgZm9yIG1vcmUKPiBwb3dlciBtYW5hZ2VtZW50IGRldmljZXMsIGkga25vdyBpdCB3YXMgZG9u ZSBieSB1c2VycykKPiBubyByZWFzb24gdG8gYmxvY2sgdGhpcwoKQWdhaW4gbm90IHRhbGtpbmcg YWJvdXQgYWxsIHRoZSBjb25maWcgdmFsdWVzLCBzdHJpY3RseSB0aGUgb25lcyB0aGF0IGFyZSAo b3Igc2hvdWxkIGJlKSBpbiBGZWF0dXJlU3VwcG9ydGVkIGNsYXNzLiAKCkluIGNhc2Ugd2Ugd2Fu dCB0byBhbGxvdyB1c2VyIHRvIHR3ZWFrIGJlaGF2aW9yIHRoZXJlLCB3ZSBjYW4gYWx3YXlzIGRv IGFzIEkgc3VnZ2VzdGVkIGZvciBFbmFibGVNQUNBbnRpU3Bvb2ZpbmdGaWx0ZXJSdWxlcyAKCj4g PiA+ID4gUmVnYXJkcywKPiA+ID4gCj4gPiAKPiAKPiA+ID4gPiBNaWtlCj4gPiA+IAo+ID4gCj4g Cgo+ID4gPiA+ID4gUGxlYXNlIHNoYXJlIHlvdXIgdGhvdWdodHMgb24gdGhpcy4KPiA+ID4gPiAK PiA+ID4gCj4gPiAKPiAKCj4gPiA+ID4gPiBUaGFua3MsCj4gPiA+ID4gCj4gPiA+IAo+ID4gCj4g Cj4gPiA+ID4gPiBLYW5hZ2FyYWoKPiA+ID4gPiAKPiA+ID4gCj4gPiAKPiAKCj4gPiA+ID4gX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KPiA+ID4gCj4gPiAK PiAKPiA+ID4gPiBFbmdpbmUtZGV2ZWwgbWFpbGluZyBsaXN0Cj4gPiA+IAo+ID4gCj4gCj4gPiA+ ID4gRW5naW5lLWRldmVsQG92aXJ0Lm9yZwo+ID4gPiAKPiA+IAo+IAo+ID4gPiA+IGh0dHA6Ly9s aXN0cy5vdmlydC5vcmcvbWFpbG1hbi9saXN0aW5mby9lbmdpbmUtZGV2ZWwKPiA+ID4gCj4gPiAK PiAKCi0tLS0tLT1fUGFydF80MzIwODUwNF8xMzA0MzA2MzUwLjEzODU4ODk5OTE5ODIKQ29udGVu dC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGlu ZzogcXVvdGVkLXByaW50YWJsZQoKPGh0bWw+PGJvZHk+PGRpdiBzdHlsZT0zRCJmb250LWZhbWls eTogdGltZXMgbmV3IHJvbWFuLCBuZXcgeW9yaywgdGltZXMsIHNlPQpyaWY7IGZvbnQtc2l6ZTog MTJwdDsgY29sb3I6ICMwMDAwMDAiPjxkaXY+PGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+ PHM9CnBhbiBuYW1lPTNEIngiPjwvc3Bhbj5SZWdhcmRzLDxicj5NaWtlPHNwYW4gbmFtZT0zRCJ4 Ij48L3NwYW4+PGJyPjwvZGl2PjxkaT0Kdj48YnI+PC9kaXY+PGhyIGlkPTNEInp3Y2hyIj48Ymxv Y2txdW90ZSBzdHlsZT0zRCJib3JkZXItbGVmdDoycHggc29saWQgIzEwPQoxMEZGO21hcmdpbi1s ZWZ0OjVweDtwYWRkaW5nLWxlZnQ6NXB4O2NvbG9yOiMwMDA7Zm9udC13ZWlnaHQ6bm9ybWFsO2Zv bnQtc3Q9CnlsZTpub3JtYWw7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Zm9udC1mYW1pbHk6SGVsdmV0 aWNhLEFyaWFsLHNhbnMtc2VyaWY7Zm9udD0KLXNpemU6MTJwdDsiPjxkaXYgc3R5bGU9M0QiZm9u dC1mYW1pbHk6IHRpbWVzIG5ldyByb21hbiwgbmV3IHlvcmssIHRpbWVzLCBzPQplcmlmOyBmb250 LXNpemU6IDEycHQ7IGNvbG9yOiAjMDAwMDAwIj48ZGl2Pjxicj48L2Rpdj48ZGl2Pjxicj48L2Rp dj48aHIgaWQ9Cj0zRCJ6d2NociI+PGJsb2NrcXVvdGUgc3R5bGU9M0QiYm9yZGVyLWxlZnQ6MnB4 IHNvbGlkICMxMDEwRkY7bWFyZ2luLWxlZnQ6NT0KcHg7cGFkZGluZy1sZWZ0OjVweDtjb2xvcjoj MDAwO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0eWxlOm5vcm1hbDt0ZXh0LWRlPQpjb3JhdGlv bjpub25lO2ZvbnQtZmFtaWx5OkhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZTox MnB0OyI+PGI+RnI9Cm9tOiA8L2I+Ik1pa2UgS29sZXNuaWsiICZsdDtta29sZXNuaUByZWRoYXQu Y29tJmd0Ozxicj48Yj5UbzogPC9iPiJPbWVyIEZyZT0KbmtlbCIgJmx0O29mcmVua2VsQHJlZGhh dC5jb20mZ3Q7PGJyPjxiPkNjOiA8L2I+IkthbmFnYXJhaiIgJmx0O2ttYXlpbHNhQHJlPQpkaGF0 LmNvbSZndDssICJlbmdpbmUtZGV2ZWwiICZsdDtlbmdpbmUtZGV2ZWxAb3ZpcnQub3JnJmd0Ozxi cj48Yj5TZW50OiA8L2I9Cj5TdW5kYXksIERlY2VtYmVyIDEsIDIwMTMgMTE6MDE6NTAgQU08YnI+ PGI+U3ViamVjdDogPC9iPlJlOiBbRW5naW5lLWRldmVsXT0KIFVzaW5nIGNvbmZpZyB2YWx1ZXM8 YnI+PGRpdj48YnI+PC9kaXY+PGRpdiBzdHlsZT0zRCJmb250LWZhbWlseTogdGltZXMgbmV3PQog cm9tYW4sIG5ldyB5b3JrLCB0aW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6ICMw MDAwMDAiPjxociBpZD0zRCI9Cnp3Y2hyIj48YmxvY2txdW90ZSBzdHlsZT0zRCJib3JkZXItbGVm dDoycHggc29saWQgIzEwMTBGRjttYXJnaW4tbGVmdDo1cHg7cD0KYWRkaW5nLWxlZnQ6NXB4O2Nv bG9yOiMwMDA7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3R5bGU6bm9ybWFsO3RleHQtZGVjb3Jh PQp0aW9uOm5vbmU7Zm9udC1mYW1pbHk6SGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7Zm9udC1z aXplOjEycHQ7Ij48ZGl2IHN0eWw9CmU9M0QiZm9udC1mYW1pbHk6IHRpbWVzIG5ldyByb21hbiwg bmV3IHlvcmssIHRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiAxMnB0Oz0KIGNvbG9yOiAjMDAwMDAw Ij48ZGl2Pjxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48aHIgaWQ9M0QiendjaHIiPjxibG9ja3F1 b3RlPQogc3R5bGU9M0QiYm9yZGVyLWxlZnQ6MnB4IHNvbGlkICMxMDEwRkY7bWFyZ2luLWxlZnQ6 NXB4O3BhZGRpbmctbGVmdDo1cHg7Y289CmxvcjojMDAwO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250 LXN0eWxlOm5vcm1hbDt0ZXh0LWRlY29yYXRpb246bm9uZTtmb250LWZhbT0KaWx5OkhlbHZldGlj YSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB0OyI+PGI+RnJvbTogPC9iPiJNaWtlIEtv bGVzbmlrPQoiICZsdDtta29sZXNuaUByZWRoYXQuY29tJmd0Ozxicj48Yj5UbzogPC9iPiJLYW5h Z2FyYWoiICZsdDtrbWF5aWxzYUByZWRoYXQ9Ci5jb20mZ3Q7PGJyPjxiPkNjOiA8L2I+ImVuZ2lu ZS1kZXZlbCIgJmx0O2VuZ2luZS1kZXZlbEBvdmlydC5vcmcmZ3Q7PGJyPjxiPj0KU2VudDogPC9i PlN1bmRheSwgRGVjZW1iZXIgMSwgMjAxMyA4OjA4OjQyIEFNPGJyPjxiPlN1YmplY3Q6IDwvYj5S ZTogW0VuZ2luPQplLWRldmVsXSBVc2luZyBjb25maWcgdmFsdWVzPGJyPjxkaXY+PGJyPjwvZGl2 PjxkaXYgc3R5bGU9M0QiZm9udC1mYW1pbHk6IHQ9CmltZXMgbmV3IHJvbWFuLCBuZXcgeW9yaywg dGltZXMsIHNlcmlmOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiAjMDAwMDAwIj48aD0KciBpZD0z RCJ6d2NociI+PGJsb2NrcXVvdGUgc3R5bGU9M0QiYm9yZGVyLWxlZnQ6MnB4IHNvbGlkICMxMDEw RkY7bWFyZ2luLWxlPQpmdDo1cHg7cGFkZGluZy1sZWZ0OjVweDtjb2xvcjojMDAwO2ZvbnQtd2Vp Z2h0Om5vcm1hbDtmb250LXN0eWxlOm5vcm1hbDt0ZXg9CnQtZGVjb3JhdGlvbjpub25lO2ZvbnQt ZmFtaWx5OkhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB0OyI+SD0KaSBB bGwsPC9ibG9ja3F1b3RlPjxkaXY+PGJyPjwvZGl2PjxkaXY+SGkgS2FuYWdhcmFqLDxicj48L2Rp dj48ZGl2Pjxicj48L2RpPQp2PjxibG9ja3F1b3RlIHN0eWxlPTNEImJvcmRlci1sZWZ0OjJweCBz b2xpZCAjMTAxMEZGO21hcmdpbi1sZWZ0OjVweDtwYWRkaW49CmctbGVmdDo1cHg7Y29sb3I6IzAw MDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHlsZTpub3JtYWw7dGV4dC1kZWNvcmF0aW9uOj0K bm9uZTtmb250LWZhbWlseTpIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjtmb250LXNpemU6MTJw dDsiPjxicj4gVGhlIGFyZSBzPQpvbWUgaXNzdWVzIGFyaXNpbmcgaW4gY29uZmlndXJhdGlvbnMg d2hlbmV2ZXIgd2UgbW92ZSB1cCBvbiB0aGUgdmVyc2lvbnMoMy49CjMgPTNEJmd0OyAzLjQpLCBi ZWNhdXNlIG9mIHRoZSB3YXkgd2Ugc3RvcmUgYW5kIGludGVycHJldCB0aGVtLjxicj48ZGl2Pjxi cj0KPjwvZGl2PldoZW5ldmVyIHRoZXJlIGlzIGEgbmV3IGNsdXN0ZXIgbGV2ZWwsIHlvdSB3aWxs IG5lZWQgdG8gYWRkIGEgbmV3IGVuPQp0cnkgZm9yIGFsbChtb3N0KSBvZiB0aGUgY29uZmlndXJh dGlvbi4gTW9zdGx5IGEgY29weSBwYXN0ZSBpZiB5b3Ugc2VlIGZyb209CiAzLjIgdG8gMy4zLCBl eGNlcHQgc29tZSBDUFUvUE0gdHlwZSByZWxhdGVkIGNvbmZpZ3VyYXRpb25zLjxicj4gQmV0dGVy IG9wdD0KaW9uIHdvdWxkIGJlIHRvIGhhdmUgdGhlIGRlZmF1bCBjb25maWcgdmFsdWUgaW4gQ29u ZmlnVmFsdWVzLmphdmEgYW5kIHRoZSBvPQp2ZXJyaWRlcyB3aWxsIGdvIHRvIGNvbmZpZy5zcWwu IEluIHRoaXMgYXBwcm9hY2ggeW91IGRvbid0IG5lZWQgYSBuZXcgZW50cmk9CmVzIHRvIGNvbmZp Zy5zcWwgd2hlbiB0aGVyZSBpcyBhIG5ldyBjbHVzdGVyIGxldmVsLjxicj48ZGl2Pjxicj48L2Rp dj5MZXRzID0KdGFrZSBhbiBleG1hcGxlLCAiU3VwcG9ydEZvcmNlQ3JlYXRlVkciIC0gVGhpcyBp cyBzdXBwb3J0ZWQgZnJvbSAzLjEgb253YXJkPQpzLDxicj48ZGl2Pjxicj48L2Rpdj5JZiB5b3Ug bG9vayBhdCBjb25maWcuc3FsLCB5b3Ugd2lsbCBzZWUgZm9sbG93aW5nIGVudHI9CmllcyA8YnI+ IHNlbGVjdCBmbl9kYl9hZGRfY29uZmlnX3ZhbHVlKCdTdXBwb3J0Rm9yY2VDcmVhdGVWRycsJ2Zh bHNlJywnMy4wJz0KKTsgPGJyPiBzZWxlY3QgZm5fZGJfYWRkX2NvbmZpZ192YWx1ZSgnU3VwcG9y dEZvcmNlQ3JlYXRlVkcnLCd0cnVlJywnMy4xJyk7PQogPGJyPiBzZWxlY3QgZm5fZGJfYWRkX2Nv bmZpZ192YWx1ZSgnU3VwcG9ydEZvcmNlQ3JlYXRlVkcnLCd0cnVlJywnMy4yJyk7IDw9CmJyPiBz ZWxlY3QgZm5fZGJfYWRkX2NvbmZpZ192YWx1ZSgnU3VwcG9ydEZvcmNlQ3JlYXRlVkcnLCd0cnVl JywnMy4zJyk7PGJyPj0KPGRpdj48YnI+PC9kaXY+QW5kIGluIENvbmZpZ1ZhbHVlcy5qYXZhPGJy PjxkaXY+PGJyPjwvZGl2PiZuYnNwOyZuYnNwOyZuYnNwPQo7IEBUeXBlQ29udmVydGVyQXR0cmli dXRlKEJvb2xlYW4uY2xhc3MpPGJyPiAmbmJzcDsmbmJzcDsmbmJzcDsgQERlZmF1bHRWYWw9CnVl QXR0cmlidXRlKCJmYWxzZSIpPGJyPiAmbmJzcDsmbmJzcDsmbmJzcDsgU3VwcG9ydEZvcmNlQ3Jl YXRlVkcsPGJyPjxkaXY+PD0KYnI+PC9kaXY+Tm93IGlmIHRoZXJlIGlzIDMuNCBhbmQgMy41LCB0 aGUgdXNlciBuZWVkcyB0byBhZGQgMiBtb3JlIGVudHJpZXMsPQogd2hpY2ggaSBmZWVsIGlzIHJl ZHVuZGFudC48YnI+PGRpdj48YnI+PC9kaXY+SW5zdGVhZCB3ZSBjYW4gbWFrZSA8YnI+PGRpdj49 Cjxicj48L2Rpdj4mbmJzcDsmbmJzcDsmbmJzcDsgQFR5cGVDb252ZXJ0ZXJBdHRyaWJ1dGUoQm9v bGVhbi5jbGFzcyk8YnI+ICZuYj0Kc3A7Jm5ic3A7Jm5ic3A7IEBEZWZhdWx0VmFsdWVBdHRyaWJ1 dGUoInRydWUiKTxicj4gJm5ic3A7Jm5ic3A7Jm5ic3A7IFN1cHBvPQpydEZvcmNlQ3JlYXRlVkcs PGJyPjxkaXY+PGJyPjwvZGl2PmFuZCBoYXZlIG9ubHkgdGhlIGZvbGxvd2luZyBpbiBjb25maWcu c3E9Cmw8YnI+IHNlbGVjdCBmbl9kYl9hZGRfY29uZmlnX3ZhbHVlKCdTdXBwb3J0Rm9yY2VDcmVh dGVWRycsJ2ZhbHNlJywnMy4wJyk7PD0KYnI+PGRpdj48YnI+PC9kaXY+aWYgYSBwYXJ0aWN1bGFy IHZhbHVlKGZvciBhIHNwZWNpZmljIGNsdXN0ZXIgbGV2ZWwpIGlzIG5vPQp0IGZvdW5kIGluIENv bmZpZy5zcWwsIHRoZSBmYWxsYmFjayBpcyB0byB1c2UgdGhlIHZhbHVlIGF2YWlsYWJsZSBpbiBD b25maWc9ClZhbHVlcy5qYXZhLjwvYmxvY2txdW90ZT48ZGl2Pjxicj48L2Rpdj48ZGl2PlRoaXMg aGFzIGFscmVhZHkgYmVlbiBpbXBsZW1lbj0KdGVkLCB0aGVyZSBhcmUgbWFueSAiZmVhdHVyZSBz dXBwb3J0ZWQiIGNvbmZpZ3VyYXRpb25zIHdvcmtpbmcgbGlrZSB0aGlzIChmPQpvciBleGFtcGxl IEdsdXN0ZXJTdXBwb3J0KS48YnI+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5JIHRoaW5rIGEg bW9yZSBpbnQ9CmVyZXN0aW5nIGFwcHJvYWNoIHdvdWxkIGJlIHRvIG1vdmUgdGhlc2Ugb3V0IG9m IHRoZSBEQiBzaW5jZSB0aGVzZSB2YWx1ZXMgZD0Kb24ndCByZWFsbHkgaGF2IGUgYSByZXNvbiB0 byBiZSB0aGVyZS48YnI+PC9kaXY+PGRpdj5TaW5jZSB0aGUgZW50aXJlIHRoaW5nPQogaXMgYWJz dHJhY3RlZCBieSAiR2x1c3Rlci9GZWF0dXJlU3VwcG9ydGVkIiBjbGFzc2VzIHRoZW4gd2UgY2Fu IGVhc2lseSBjaGE9Cm5nZSBtZWNoYW5pc20gKG9mIGNvdXJzZSB3aGF0ZXZlciBjb2RlIGlzIG5v dCB1c2luZyBpdCBjYW4gYmUgZWFzaWx5IGNvbnZlcj0KdGVkIHRvIHVzZSB0aGUgbWVjaGFuaXNt KTxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PkZvciBleGFtcGxlIGEgc2ltcGxlPQogZW51 bSBjb3VsZCBkbyB0aGUgdHJpY2s6PGJyPjwvZGl2PjxkaXY+LS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS09Ci0tIEVYQU1QTEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLTxicj48L2Rpdj48ZGl2Pi8qKjxicj4mbmJzcD0KOyogQ29udmVuaWVuY2UgY2xhc3Mg dG8gY2hlY2sgaWYgYSBnbHVzdGVyIGZlYXR1cmUgaXMgc3VwcG9ydGVkIG9yIG5vdCBpbiBhPQpu eSBnaXZlbiB2ZXJzaW9uLiZsdDticiZndDs8YnI+Jm5ic3A7KiBNZXRob2RzIHNob3VsZCBiZSBu YW1lZCBieSBmZWF0dXJlIGE9Cm5kIGFjY2VwdCB2ZXJzaW9uIHRvIGNoZWNrIGFnYWluc3QuPGJy PiZuYnNwOyovPGJyPnB1YmxpYyBjbGFzcyBHbHVzdGVyRmVhdD0KdXJlU3VwcG9ydGVkIHs8L2Rp dj48ZGl2PiZuYnNwOyZuYnNwOyZuYnNwOyAvKio8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 PQogKiBAcGFyYW0gdmVyc2lvbjxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgKiZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnM9CnA7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7IENvbXBhdGliaWxpdHkgdmVyc2lvbiB0byBjaGVjayBmb3IuPD0KYnI+Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7ICogQHJldHVybiAmbHQ7Y29kZSZndDt0cnVlJmx0Oy9jb2RlJmd0OyBpZiBn bHVzPQp0ZXIgc3VwcG9ydCBpcyBlbmFibGVkLCAmbHQ7Y29kZSZndDtmYWxzZSZsdDsvY29kZSZn dDsgaWYgaXQncyBub3QuPGJyPiZuYnM9CnA7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICovPGJyPiZuYnNw OyZuYnNwOyZuYnNwOyBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2x1c3Rlcj0KKFZlcnNpb24gdmVy c2lvbikgezxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcmV0 dXJuIFN1PQpwcG9ydGVkRmVhdHVyZXMuR0xVU1RFUi5pc1N1cHBvcnRlZE9uKHZlcnNpb24pOzxi cj4mbmJzcDsmbmJzcDsmbmJzcDsgfTxicj49CjxkaXY+PGJyPjwvZGl2PiZuYnNwOyZuYnNwOyZu YnNwOyAvKio8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICogQHBhcmFtID0KdmVyc2lvbjxi cj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgKiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuPQpic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IENvbXBhdGliaWxpdHkgdmVy c2lvbiB0byBjaGVjayBmb3IuPGJyPiZuYnNwOyY9Cm5ic3A7Jm5ic3A7Jm5ic3A7ICogQHJldHVy biAmbHQ7Y29kZSZndDt0cnVlJmx0Oy9jb2RlJmd0OyBpZiBnbHVzdGVyIGhlYXZ5dz0KZWlnaHQg cmVmcmVzaCBpcyBlbmFibGVkLCAmbHQ7Y29kZSZndDtmYWxzZSZsdDsvY29kZSZndDsgaWYgaXQn cyBub3QuPGJyPiZuPQpic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICovPGJyPiZuYnNwOyZuYnNwOyZu YnNwOyBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVmcmU9CnNoSGVhdnlXZWlnaHQoVmVyc2lvbiB2 ZXJzaW9uKSB7PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYj0Kc3A7 IHJldHVybiBTdXBwb3J0ZWRGZWF0dXJlcy5SRUZSRVNIX0hFQVZZV0VJR0hULmlzU3VwcG9ydGVk T24odmVyc2lvbik7PGJyPQo+Jm5ic3A7Jm5ic3A7Jm5ic3A7IH08YnI+PC9kaXY+PGRpdj48YnI+ PC9kaXY+PGRpdj4mbmJzcDsmbmJzcDsmbmJzcDsgLyogTW89CnJlIG1ldGhvZHMuLi4gKi88L2Rp dj48ZGl2Pjxicj4mbmJzcDsmbmJzcDsmbmJzcDsgZW51bSBTdXBwb3J0ZWRGZWF0dXJlcyB7PD0K YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEdMVVNURVIoVmVy c2lvbi52M18wKSw8YnI+Jm5iPQpzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsgUkVGUkVTSF9IRUFWWVdFSUdIVChWZXJzaW9uLnYzXzAsIFY9CmVyc2lvbi52M18xKSw8L2Rp dj48ZGl2PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvKiBNb3Jl ID0KbWVtYmVycyAqLzs8YnI+PGRpdj48YnI+PC9kaXY+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7IHByPQppdmF0ZSBTZXQmbHQ7VmVyc2lvbiZndDsgdW5zdXBwb3J0 ZWRWZXJzaW9ucyA9M0QgbmV3IEhhc2hTZXQmbHQ7VmVyc2lvbiZndDs9CigpOzxicj48ZGl2Pjxi cj48L2Rpdj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcHJpdmF0 ZSBTdT0KcHBvcnRlZEZlYXR1cmVzKFZlcnNpb24uLi4gdmVyc2lvbnMpIHs8YnI+Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5iPQpzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsgdW5zdXBwb3J0ZWRWZXJzaW9ucy5hZGRBbGwoQXJyYXlzLmFzTGlzdCg9CnZlcnNpb25zKSk7 PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB9PGJyPjxkaXY+ PGJyPjwvZD0KaXY+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1 YmxpYyBib29sZWFuIGlzU3VwcG9ydGVkT24oPQpWZXJzaW9uIHZlcnNpb24pIHs8YnI+Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A9CjsmbmJzcDsm bmJzcDsgcmV0dXJuICF1bnN1cHBvcnRlZFZlcnNpb25zLmNvbnRhaW5zKHZlcnNpb24pOzxicj4m bmJzcDsmbmJzcD0KOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB9PGJyPiZuYnNwOyZu YnNwOyZuYnNwOyB9PC9kaXY+PGRpdj4tLS0tLS0tPQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0gRU5EIEVYQU1QTEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09Ci0tLS0t PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5UaG91Z2h0cz88L2Rpdj48L2Rpdj48L2Jsb2NrcXVv dGU+PGRpdj48YnI+dT0Kbmxlc3MgaSBkaWRuJ3QgdW5kZXJzdGFuZCBzb21ldGhpbmcsIHRoaXMg aXMgbm90IGdvb2QsPGJyPjwvZGl2PjxkaXY+dGhpcyBzPQpob3VsZCBzdGF5IGNvbmZpZ3VyYWJs ZSBieSB0aGUgdXNlcnMsPGJyPjwvZGl2PjxkaXY+Zm9yIGV4YW1wbGUgaWYgc29tZSB1c2U9CnIg ZXhwZXJpZW5jZSBzb21lIGlzc3VlcyB3aXRoIGEgZmVhdHVyZSBhbmQgd2FudCB0byB0dXJuIGl0 IG9mZi9jaGFuZ2UgdGhlID0KdmFsdWVzLi48L2Rpdj48ZGl2Pihub3QgYWxsIHZlcnNpb24gY29u ZmlndXJhdGlvbiBhcmUgYm9vbGVhbiwgc29tZSBhcmUgZGlmPQpmZXJlbnQgdmFsdWVzIHRvIGRp ZmZlcmVudCB2ZXJzaW9ucywgbGlrZSBjcHUtbGlzdCk8L2Rpdj48L2Rpdj48L2Jsb2NrcXVvdGU9 Cj48ZGl2Pjxicj48L2Rpdj48ZGl2PlRoaXMgaXMgZm9yIEFQSSBsZXZlbCBjb21wYXRpYmlsaXR5 Ljxicj48L2Rpdj48ZGl2PklmID0KVkRTTSBkb2Vzbid0IHN1cHBvcnQgZm9yIGV4YW1wbGUgaG90 IHBsdWcgaW4gMy4xIHRoZW4gdGhlIHVzZXIgY2FuJ3QganVzdCBkPQplY2lkZSB0aGF0IGl0IGRv ZXMgYW5kIGNoYW5nZSBpdC48YnI+PC9kaXY+PGRpdj5BbHNvLCB0aGlzIGlzIG5vdCBjaGFuZ2Vh Ymw9CmUgYnkgdXNlciBzaW5jZSBpdCdzIG5vdCBleHBvc2VkIGJ5IGVuZ2luZS1jb25maWcgKG5v ciBzaG91bGQgaXQgYmUpLjxicj48Lz0KZGl2PjwvZGl2PjwvYmxvY2txdW90ZT48ZGl2PnNvbWUg YXJlIGV4cG9zZWQ8L2Rpdj48L2Rpdj48L2Jsb2NrcXVvdGU+PGRpdj5JPQpmIHRoZXJlIGlzIHN1 Y2ggYSB0aGluZyB0aGVuIGl0cyBhIGRlc2lnbiBmbGF3Ljxicj48L2Rpdj48ZGl2Pjxicj48L2Rp dj48ZGk9CnY+VGhlIG9ubHkgb25lIEkgc2VlIGluIEZlYXR1cmVTdXBwb3J0ZWQgY2xhc3MgaXMg RW5hYmxlTUFDQW50aVNwb29maW5nRmlsdD0KZXJSdWxlczxicj48L2Rpdj48ZGl2PlRoaXMgc2hv dWxkIGJlIHNwbGl0IGludG8gMjo8YnI+PC9kaXY+PGRpdj5NQUNBbnRpU3BvPQpvZmluZ0ZpbHRl clJ1bGVzU3VwcG9ydGVkIC0gd2hpY2ggaXMgdXNlZCB0byBkZXRlcm1pbmUgQVBJIGNvbXBhdGli aWxpdHk8YnI9Cj48L2Rpdj48ZGl2PkVuYWJsZU1BQ0FudGlTcG9vZmluZ0ZpbHRlclJ1bGVzIC0g d2hpY2ggdGhlIHVzZXIgY2FuIHNldCB0byBkZT0KdGVybWluZSBzeXN0ZW0gYmVoYXZpb3VyPGJy PjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+SSBzZWUgbm8gcmVhc29uIHdoeSB0PQpvIGFsbG93 IHVzZXIgdG8gc2V0IEVuYWJsZU1BQ0FudGlTcG9vZmluZ0ZpbHRlclJ1bGVzPTNEdHJ1ZSBmb3Ig My4wIHNpbmNlIGk9CnQgd2lsbCBub3Qgd29yayBzbyBpdCdzIGp1c3QgY29uZnVzaW5nIHRvIGhp bTxicj48L2Rpdj48YmxvY2txdW90ZSBzdHlsZT0zRD0KImJvcmRlci1sZWZ0OjJweCBzb2xpZCAj MTAxMEZGO21hcmdpbi1sZWZ0OjVweDtwYWRkaW5nLWxlZnQ6NXB4O2NvbG9yOiMwMDA7PQpmb250 LXdlaWdodDpub3JtYWw7Zm9udC1zdHlsZTpub3JtYWw7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Zm9u dC1mYW1pbHk6SGVsdmU9CnRpY2EsQXJpYWwsc2Fucy1zZXJpZjtmb250LXNpemU6MTJwdDsiPjxk aXYgc3R5bGU9M0QiZm9udC1mYW1pbHk6IHRpbWVzIG5ldz0KIHJvbWFuLCBuZXcgeW9yaywgdGlt ZXMsIHNlcmlmOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiAjMDAwMDAwIj48ZGl2Pjxicj48PQov ZGl2PjxibG9ja3F1b3RlIHN0eWxlPTNEImJvcmRlci1sZWZ0OjJweCBzb2xpZCAjMTAxMEZGO21h cmdpbi1sZWZ0OjVweDtwYWQ9CmRpbmctbGVmdDo1cHg7Y29sb3I6IzAwMDtmb250LXdlaWdodDpu b3JtYWw7Zm9udC1zdHlsZTpub3JtYWw7dGV4dC1kZWNvcmF0aT0Kb246bm9uZTtmb250LWZhbWls eTpIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjtmb250LXNpemU6MTJwdDsiPjxkaXYgc3R5bGU9 Cj0zRCJmb250LWZhbWlseTogdGltZXMgbmV3IHJvbWFuLCBuZXcgeW9yaywgdGltZXMsIHNlcmlm OyBmb250LXNpemU6IDEycHQ7ID0KY29sb3I6ICMwMDAwMDAiPjxkaXY+VGhpcyBpcyBzdHJpY3Rs eSBmb3IgdGhlIGVuZ2luZS1WRFNNIEFQSSBjb21wYXRpYmlsaXR5PQosIG5vdCBmb3Igb3RoZXIg Y29uZmlncyB3aGljaCBhcmUgdmVyc2lvbiBzcGVjaWZpYy48YnI+PC9kaXY+PC9kaXY+PC9ibG9j a3E9CnVvdGU+PGRpdj5yaWdodCwgYnV0IHN0aWxsIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gdHVy biBmZWF0dXJlcyBvZmYgaW4gY2FzZT0KIG9mIHByb2JsZW1zLDxicj48L2Rpdj48ZGl2Pm9yIGNo YW5nZSBpbiBzb21lIGNhc2VzIChmb3IgZXhhbXBsZSBpdCBpcyBwb3NzPQppYmxlIHRvIGFkZCBz dXBwb3J0IGZvciBtb3JlIHBvd2VyIG1hbmFnZW1lbnQgZGV2aWNlcywgaSBrbm93IGl0IHdhcyBk b25lIGI9CnkgdXNlcnMpPGJyPjwvZGl2PjxkaXY+bm8gcmVhc29uIHRvIGJsb2NrIHRoaXM8L2Rp dj48L2Rpdj48L2Jsb2NrcXVvdGU+PGRpdj0KPkFnYWluIG5vdCB0YWxraW5nIGFib3V0IGFsbCB0 aGUgY29uZmlnIHZhbHVlcywgc3RyaWN0bHkgdGhlIG9uZXMgdGhhdCBhcmUgPQoob3Igc2hvdWxk IGJlKSBpbiBGZWF0dXJlU3VwcG9ydGVkIGNsYXNzLjxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48 ZGl2PkluIGM9CmFzZSB3ZSB3YW50IHRvIGFsbG93IHVzZXIgdG8gdHdlYWsgYmVoYXZpb3IgdGhl cmUsIHdlIGNhbiBhbHdheXMgZG8gYXMgSSBzdT0KZ2dlc3RlZCBmb3IgRW5hYmxlTUFDQW50aVNw b29maW5nRmlsdGVyUnVsZXM8YnI+PC9kaXY+PGJsb2NrcXVvdGUgc3R5bGU9M0QiPQpib3JkZXIt bGVmdDoycHggc29saWQgIzEwMTBGRjttYXJnaW4tbGVmdDo1cHg7cGFkZGluZy1sZWZ0OjVweDtj b2xvcjojMDAwO2Y9Cm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3R5bGU6bm9ybWFsO3RleHQtZGVj b3JhdGlvbjpub25lO2ZvbnQtZmFtaWx5OkhlbHZldD0KaWNhLEFyaWFsLHNhbnMtc2VyaWY7Zm9u dC1zaXplOjEycHQ7Ij48ZGl2IHN0eWxlPTNEImZvbnQtZmFtaWx5OiB0aW1lcyBuZXcgPQpyb21h biwgbmV3IHlvcmssIHRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogIzAwMDAw MCI+PGRpdj48YnI+PC89CmRpdj48YmxvY2txdW90ZSBzdHlsZT0zRCJib3JkZXItbGVmdDoycHgg c29saWQgIzEwMTBGRjttYXJnaW4tbGVmdDo1cHg7cGFkZD0KaW5nLWxlZnQ6NXB4O2NvbG9yOiMw MDA7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3R5bGU6bm9ybWFsO3RleHQtZGVjb3JhdGlvPQpu Om5vbmU7Zm9udC1mYW1pbHk6SGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjEy cHQ7Ij48ZGl2IHN0eWxlPQo9M0QiZm9udC1mYW1pbHk6IHRpbWVzIG5ldyByb21hbiwgbmV3IHlv cmssIHRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiAxMnB0OyA9CmNvbG9yOiAjMDAwMDAwIj48Ymxv Y2txdW90ZSBzdHlsZT0zRCJib3JkZXItbGVmdDoycHggc29saWQgIzEwMTBGRjttYXJnaW4tbD0K ZWZ0OjVweDtwYWRkaW5nLWxlZnQ6NXB4O2NvbG9yOiMwMDA7Zm9udC13ZWlnaHQ6bm9ybWFsO2Zv bnQtc3R5bGU6bm9ybWFsO3RlPQp4dC1kZWNvcmF0aW9uOm5vbmU7Zm9udC1mYW1pbHk6SGVsdmV0 aWNhLEFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHQ7Ij49CjxkaXYgc3R5bGU9M0QiZm9u dC1mYW1pbHk6IHRpbWVzIG5ldyByb21hbiwgbmV3IHlvcmssIHRpbWVzLCBzZXJpZjsgZm9udC1z aT0KemU6IDEycHQ7IGNvbG9yOiAjMDAwMDAwIj48ZGl2Pjxicj48L2Rpdj48YmxvY2txdW90ZSBz dHlsZT0zRCJib3JkZXItbGVmdDoyPQpweCBzb2xpZCAjMTAxMEZGO21hcmdpbi1sZWZ0OjVweDtw YWRkaW5nLWxlZnQ6NXB4O2NvbG9yOiMwMDA7Zm9udC13ZWlnaHQ6bm89CnJtYWw7Zm9udC1zdHls ZTpub3JtYWw7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Zm9udC1mYW1pbHk6SGVsdmV0aWNhLEFyaWFs LHNhbj0Kcy1zZXJpZjtmb250LXNpemU6MTJwdDsiPjxkaXYgc3R5bGU9M0QiZm9udC1mYW1pbHk6 IHRpbWVzIG5ldyByb21hbiwgbmV3IHlvPQpyaywgdGltZXMsIHNlcmlmOyBmb250LXNpemU6IDEy cHQ7IGNvbG9yOiAjMDAwMDAwIj48ZGl2Pjxicj48L2Rpdj48ZGl2Pjxicj49CjwvZGl2PjxkaXY+ UmVnYXJkcyw8YnI+PC9kaXY+PGRpdj5NaWtlPGJyPjwvZGl2PjxibG9ja3F1b3RlIHN0eWxlPTNE ImJvcmRlcj0KLWxlZnQ6MnB4IHNvbGlkICMxMDEwRkY7bWFyZ2luLWxlZnQ6NXB4O3BhZGRpbmct bGVmdDo1cHg7Y29sb3I6IzAwMDtmb250LXdlPQppZ2h0Om5vcm1hbDtmb250LXN0eWxlOm5vcm1h bDt0ZXh0LWRlY29yYXRpb246bm9uZTtmb250LWZhbWlseTpIZWx2ZXRpY2EsQXI9CmlhbCxzYW5z LXNlcmlmO2ZvbnQtc2l6ZToxMnB0OyI+PGJyPiBQbGVhc2Ugc2hhcmUgeW91ciB0aG91Z2h0cyBv biB0aGlzLjxicj0KPjxkaXY+PGJyPjwvZGl2PlRoYW5rcyw8YnI+IEthbmFnYXJhajxicj48ZGl2 Pjxicj48L2Rpdj48L2Jsb2NrcXVvdGU+PC9kaXY+PQo8YnI+X19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX188YnI+RW5naW5lLWRldmVsIG1haWxpbmc9CiBsaXN0 PGJyPkVuZ2luZS1kZXZlbEBvdmlydC5vcmc8YnI+aHR0cDovL2xpc3RzLm92aXJ0Lm9yZy9tYWls bWFuL2xpc3RpbmZvLz0KZW5naW5lLWRldmVsPGJyPjwvYmxvY2txdW90ZT48ZGl2Pjxicj48L2Rp dj48L2Rpdj48L2Jsb2NrcXVvdGU+PGRpdj48YnI+PC9kPQppdj48L2Rpdj48L2Jsb2NrcXVvdGU+ PGRpdj48YnI+PC9kaXY+PC9kaXY+PC9ibG9ja3F1b3RlPjxkaXY+PGJyPjwvZGl2PjwvZGk9CnY+ PC9ib2R5PjwvaHRtbD4KLS0tLS0tPV9QYXJ0XzQzMjA4NTA0XzEzMDQzMDYzNTAuMTM4NTg4OTk5 MTk4Mi0tCg== --===============5210880528237370469==-- From emesika at redhat.com Sun Dec 1 04:59:00 2013 Content-Type: multipart/mixed; boundary="===============4276956224154408342==" MIME-Version: 1.0 From: Eli Mesika To: devel at ovirt.org Subject: Re: [Engine-devel] Using config values Date: Sun, 01 Dec 2013 04:58:54 -0500 Message-ID: <1044736237.33757114.1385891934497.JavaMail.root@redhat.com> In-Reply-To: 496533960.21093647.1385888566815.JavaMail.root@redhat.com --===============4276956224154408342== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable ----- Original Message ----- > From: "Omer Frenkel" > To: "Eli Mesika" > Cc: "Dusmant Kumar Pati" , "engine-devel" > Sent: Sunday, December 1, 2013 11:02:46 AM > Subject: Re: [Engine-devel] Using config values > = > = > = > ----- Original Message ----- > > From: "Eli Mesika" > > To: "Dusmant Kumar Pati" > > Cc: "engine-devel" > > Sent: Saturday, November 30, 2013 10:58:35 PM > > Subject: Re: [Engine-devel] Using config values > > = > > = > > = > > ----- Original Message ----- > > > From: "Dusmant Kumar Pati" > > > To: "Kanagaraj" , "engine-devel" > > > > > > Sent: Friday, November 29, 2013 1:40:09 PM > > > Subject: Re: [Engine-devel] Using config values > > > = > > > On 11/29/2013 01:46 PM, Kanagaraj wrote: > > > = > > > = > > > Hi All, > > > = > > > The are some issues arising in configurations whenever we move up on = the > > > versions(3.3 =3D> 3.4), because of the way we store and interpret the= m. > > > = > > > Whenever there is a new cluster level, you will need to add a new ent= ry > > > for > > > all(most) of the configuration. Mostly a copy paste if you see from 3= .2 > > > to > > > 3.3, except some CPU/PM type related configurations. > > > Better option would be to have the defaul config value in > > > ConfigValues.java > > > and the overrides will go to config.sql. In this approach you don't n= eed > > > a > > > new entries to config.sql when there is a new cluster level. > > > = > > > Lets take an exmaple, "SupportForceCreateVG" - This is supported from= 3.1 > > > onwards, > > > = > > > If you look at config.sql, you will see following entries > > > select fn_db_add_config_value('SupportForceCreateVG','false','3.0'); > > > select fn_db_add_config_value('SupportForceCreateVG','true','3.1'); > > > select fn_db_add_config_value('SupportForceCreateVG','true','3.2'); > > > select fn_db_add_config_value('SupportForceCreateVG','true','3.3'); > > > = > > > And in ConfigValues.java > > > = > > > @TypeConverterAttribute(Boolean.class) > > > @DefaultValueAttribute("false") > > > SupportForceCreateVG, > > > = > > > Now if there is 3.4 and 3.5, the user needs to add 2 more entries, wh= ich > > > i > > > feel is redundant. > > > = > > > Instead we can make > > > = > > > @TypeConverterAttribute(Boolean.class) > > > @DefaultValueAttribute("true") > > > SupportForceCreateVG, > > > = > > > and have only the following in config.sql > > > select fn_db_add_config_value('SupportForceCreateVG','false','3.0'); > > > = > > > if a particular value(for a specific cluster level) is not found in > > > Config.sql, the fallback is to use the value available in > > > ConfigValues.java. > > > = > > > Please share your thoughts on this. > > = > > Hi > > = > > First of all I think its a good idea > > I have 2 questions > > = > > 1) Which value will be stored as default in the java class for > > configuration > > values that are not a boolean, that represents if a feature is active or > > not. > > Is that the latest version value ? sounds not obvious to me > > = > = > i guess this will have to have a configuration values for each version in= the > db. > = > > 2) There are some configuration values that are exposed to the user via= the > > engine-config tool, how this will work, we can not remove the entries t= heir > > since the user may change and override those values. > > = > = > in your suggestion below, there is the same issue, > if user want to change the 3.3 value, engine config will fail with "No su= ch > entry" > because 3.3 will not be in the db.. > so if we are not fixing this, i think using the current implementation is > good enough, In this case engine-config will add this key with the given value for that = version, so , I see no problem in that... In addition the getConfigValue will lookup for version matching only the fi= rst time, so , if it was given a 3.4 version for key K and found a matching= only for 3.2 , it will add to the cache K with the same value for version = 3.4 > no need to add logic, just to convert current options that are not in this > format, to use this logic. > = > > I have a different suggestion: > > Default value will stay as is , meaning , it will reflect the value that > > should be used to keep the application running correctly if a value is = not > > found in DB (which should not occur) > > = > > Code of getting configuration value (getConfigValue(,) wi= ll > > be > > changed to get the closest version value to the given one. > > For example , if a 3.4 version is given for a given and we have i= n DB > > just values for 3.0 and 3.1 , the 3.1 value is returned. > > I prefer this solution since it makes the config.sql file self document= ed , > > showing only value changes and in which version each change occurred. > > = > > To implement that, we should add this mechanism to the current code that > > caches the DB content and as I see that it should be a simple change. > > engine-config should be modified such that if the user change a value, = this > > value will be inserted to the database with the current release if not > > exists and then the mechanism described above will get this value > > = > > Example: > > = > > VdsFenceType lists all the supported fencing agents for power managemen= t , > > it > > currently has the following settings > > = > > option_value > > | > > version > > -----------------------------------------------------------------------= ----------------------+--------- > > alom,apc,bladecenter,drac5,eps,ilo,ilo3,ipmilan,rsa,rsb,wti,cisco_ucs > > | 3.0 > > alom,apc,bladecenter,drac5,eps,ilo,ilo3,ipmilan,rsa,rsb,wti,cisco_ucs > > | 3.1 > > apc,apc_snmp,bladecenter,cisco_ucs,drac5,eps,ilo,ilo2,ilo3,ilo4,ipmila= n,rsa,rsb,wti > > | 3.2 > > apc,apc_snmp,bladecenter,cisco_ucs,drac5,eps,ilo,ilo2,ilo3,ilo4,ipmila= n,rsa,rsb,wti > > | 3.3 > > = > > In the proposed solution, we will have > > = > > option_value > > | > > version > > -----------------------------------------------------------------------= ----------------------+--------- > > alom,apc,bladecenter,drac5,eps,ilo,ilo3,ipmilan,rsa,rsb,wti,cisco_ucs > > | 3.0 > > apc,apc_snmp,bladecenter,cisco_ucs,drac5,eps,ilo,ilo2,ilo3,ilo4,ipmila= n,rsa,rsb,wti > > | 3.2 > > = > > This is clear and documents only the changes done between versions and > > serve > > all values: boolean , string and complex type (those which requires any > > kind > > of parsing) > > = > > What do you think? > > = > > Eli > > = > > = > > = > > = > > = > > = > > = > > = > > = > > = > > = > > = > > = > > = > > > = > > > Thanks, > > > Kanagaraj > > > = > > > = > > > = > > > _______________________________________________ > > > Engine-devel mailing list Engine-devel(a)ovirt.org > > > http://lists.ovirt.org/mailman/listinfo/engine-devel > > > I think, this is a good suggestion... > > > = > > > = > > > _______________________________________________ > > > Engine-devel mailing list > > > Engine-devel(a)ovirt.org > > > http://lists.ovirt.org/mailman/listinfo/engine-devel > > > = > > _______________________________________________ > > Engine-devel mailing list > > Engine-devel(a)ovirt.org > > http://lists.ovirt.org/mailman/listinfo/engine-devel > > = >=20 --===============4276956224154408342==-- From iheim at redhat.com Wed Dec 4 11:33:56 2013 Content-Type: multipart/mixed; boundary="===============5583553949870446242==" MIME-Version: 1.0 From: Itamar Heim To: devel at ovirt.org Subject: Re: [Engine-devel] Using config values Date: Wed, 04 Dec 2013 18:33:54 +0200 Message-ID: <529F5972.6040802@redhat.com> In-Reply-To: 1728493072.3569411.1385889804043.JavaMail.root@redhat.com --===============5583553949870446242== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable On 12/01/2013 11:23 AM, Moti Asayag wrote: > > > ----- Original Message ----- >> From: "Omer Frenkel" >> To: "Mike Kolesnik" >> Cc: "engine-devel" >> Sent: Sunday, December 1, 2013 11:09:32 AM >> Subject: Re: [Engine-devel] Using config values >> >> >> >> >> >> >> From: "Mike Kolesnik" >> To: "Omer Frenkel" >> Cc: "Kanagaraj" , "engine-devel" >> >> Sent: Sunday, December 1, 2013 11:01:50 AM >> Subject: Re: [Engine-devel] Using config values >> >> >> >> >> >> >> >> >> >> >> From: "Mike Kolesnik" >> To: "Kanagaraj" >> Cc: "engine-devel" >> Sent: Sunday, December 1, 2013 8:08:42 AM >> Subject: Re: [Engine-devel] Using config values >> >> >> >> >> Hi All, >> >> Hi Kanagaraj, >> >> >> >> >> The are some issues arising in configurations whenever we move up on the >> versions(3.3 =3D> 3.4), because of the way we store and interpret them. >> >> Whenever there is a new cluster level, you will need to add a new entry = for >> all(most) of the configuration. Mostly a copy paste if you see from 3.2 = to >> 3.3, except some CPU/PM type related configurations. >> Better option would be to have the defaul config value in ConfigValues.j= ava >> and the overrides will go to config.sql. In this approach you don't need= a >> new entries to config.sql when there is a new cluster level. >> >> Lets take an exmaple, "SupportForceCreateVG" - This is supported from 3.1 >> onwards, >> >> If you look at config.sql, you will see following entries >> select fn_db_add_config_value('SupportForceCreateVG','false','3.0'); >> select fn_db_add_config_value('SupportForceCreateVG','true','3.1'); >> select fn_db_add_config_value('SupportForceCreateVG','true','3.2'); >> select fn_db_add_config_value('SupportForceCreateVG','true','3.3'); >> >> And in ConfigValues.java >> >> @TypeConverterAttribute(Boolean.class) >> @DefaultValueAttribute("false") >> SupportForceCreateVG, >> >> Now if there is 3.4 and 3.5, the user needs to add 2 more entries, which= i >> feel is redundant. >> >> Instead we can make >> >> @TypeConverterAttribute(Boolean.class) >> @DefaultValueAttribute("true") >> SupportForceCreateVG, >> >> and have only the following in config.sql >> select fn_db_add_config_value('SupportForceCreateVG','false','3.0'); >> >> if a particular value(for a specific cluster level) is not found in >> Config.sql, the fallback is to use the value available in ConfigValues.j= ava. >> >> This has already been implemented, there are many "feature supported" >> configurations working like this (for example GlusterSupport). >> >> I think a more interesting approach would be to move these out of the DB >> since these values don't really hav e a reson to be there. >> Since the entire thing is abstracted by "Gluster/FeatureSupported" class= es >> then we can easily change mechanism (of course whatever code is not usin= g it >> can be easily converted to use the mechanism) >> >> For example a simple enum could do the trick: >> ------------------------------------- EXAMPLE >> ------------------------------------- >> /** >> * Convenience class to check if a gluster feature is supported or not in= any >> given version.
>> * Methods should be named by feature and accept version to check against. >> */ >> public class GlusterFeatureSupported { >> /** >> * @param version >> * Compatibility version to check for. >> * @return true if gluster support is enabled, false >> if it's not. >> */ >> public static boolean gluster(Version version) { >> return SupportedFeatures.GLUSTER.isSupportedOn(version); >> } >> >> /** >> * @param version >> * Compatibility version to check for. >> * @return true if gluster heavyweight refresh is enabled, >> false if it's not. >> */ >> public static boolean refreshHeavyWeight(Version version) { >> return SupportedFeatures.REFRESH_HEAVYWEIGHT.isSupportedOn(version); >> } >> >> /* More methods... */ >> >> enum SupportedFeatures { >> GLUSTER(Version.v3_0), >> REFRESH_HEAVYWEIGHT(Version.v3_0, Version.v3_1), >> /* More members */; >> >> private Set unsupportedVersions =3D new HashSet(); >> >> private SupportedFeatures(Version... versions) { >> unsupportedVersions.addAll(Arrays.asList(versions)); >> } >> >> public boolean isSupportedOn(Version version) { >> return !unsupportedVersions.contains(version); >> } >> } >> ------------------------------------- END EXAMPLE >> ------------------------------------- >> >> Thoughts? >> >> unless i didn't understand something, this is not good, >> this should stay configurable by the users, >> for example if some user experience some issues with a feature and want = to >> turn it off/change the values.. >> (not all version configuration are boolean, some are different values to >> different versions, like cpu-list) >> >> This is for API level compatibility. >> If VDSM doesn't support for example hot plug in 3.1 then the user can't = just >> decide that it does and change it. >> Also, this is not changeable by user since it's not exposed by engine-co= nfig >> (nor should it be). >> some are exposed >> >> >> >> This is strictly for the engine-VDSM API compatibility, not for other co= nfigs >> which are version specific. >> right, but still user should be able to turn features off in case of >> problems, >> or change in some cases (for example it is possible to add support for m= ore >> power management devices, i know it was done by users) >> no reason to block this >> > > In this case you add additional protection level to block user from enabl= ing features > for unsupported cluster levels. > > However it sounds more reasonable than requiring the user to use a lower = cluster level > which enforces him to give up on other features. lowering the cluster level is not supported. there is a difference between the configs we expose to users, and the = configs we prefer to not be changed, but are used to workaround issues = in some cases. --===============5583553949870446242==-- From iheim at redhat.com Wed Dec 4 11:35:15 2013 Content-Type: multipart/mixed; boundary="===============3192214070576645591==" MIME-Version: 1.0 From: Itamar Heim To: devel at ovirt.org Subject: Re: [Engine-devel] Using config values Date: Wed, 04 Dec 2013 18:35:12 +0200 Message-ID: <529F59C0.1030603@redhat.com> In-Reply-To: 1044736237.33757114.1385891934497.JavaMail.root@redhat.com --===============3192214070576645591== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable On 12/01/2013 11:58 AM, Eli Mesika wrote: > > > ----- Original Message ----- >> From: "Omer Frenkel" >> To: "Eli Mesika" >> Cc: "Dusmant Kumar Pati" , "engine-devel" >> Sent: Sunday, December 1, 2013 11:02:46 AM >> Subject: Re: [Engine-devel] Using config values >> >> >> >> ----- Original Message ----- >>> From: "Eli Mesika" >>> To: "Dusmant Kumar Pati" >>> Cc: "engine-devel" >>> Sent: Saturday, November 30, 2013 10:58:35 PM >>> Subject: Re: [Engine-devel] Using config values >>> >>> >>> >>> ----- Original Message ----- >>>> From: "Dusmant Kumar Pati" >>>> To: "Kanagaraj" , "engine-devel" >>>> >>>> Sent: Friday, November 29, 2013 1:40:09 PM >>>> Subject: Re: [Engine-devel] Using config values >>>> >>>> On 11/29/2013 01:46 PM, Kanagaraj wrote: >>>> >>>> >>>> Hi All, >>>> >>>> The are some issues arising in configurations whenever we move up on t= he >>>> versions(3.3 =3D> 3.4), because of the way we store and interpret them. >>>> >>>> Whenever there is a new cluster level, you will need to add a new entry >>>> for >>>> all(most) of the configuration. Mostly a copy paste if you see from 3.2 >>>> to >>>> 3.3, except some CPU/PM type related configurations. >>>> Better option would be to have the defaul config value in >>>> ConfigValues.java >>>> and the overrides will go to config.sql. In this approach you don't ne= ed >>>> a >>>> new entries to config.sql when there is a new cluster level. >>>> >>>> Lets take an exmaple, "SupportForceCreateVG" - This is supported from = 3.1 >>>> onwards, >>>> >>>> If you look at config.sql, you will see following entries >>>> select fn_db_add_config_value('SupportForceCreateVG','false','3.0'); >>>> select fn_db_add_config_value('SupportForceCreateVG','true','3.1'); >>>> select fn_db_add_config_value('SupportForceCreateVG','true','3.2'); >>>> select fn_db_add_config_value('SupportForceCreateVG','true','3.3'); >>>> >>>> And in ConfigValues.java >>>> >>>> @TypeConverterAttribute(Boolean.class) >>>> @DefaultValueAttribute("false") >>>> SupportForceCreateVG, >>>> >>>> Now if there is 3.4 and 3.5, the user needs to add 2 more entries, whi= ch >>>> i >>>> feel is redundant. >>>> >>>> Instead we can make >>>> >>>> @TypeConverterAttribute(Boolean.class) >>>> @DefaultValueAttribute("true") >>>> SupportForceCreateVG, >>>> >>>> and have only the following in config.sql >>>> select fn_db_add_config_value('SupportForceCreateVG','false','3.0'); >>>> >>>> if a particular value(for a specific cluster level) is not found in >>>> Config.sql, the fallback is to use the value available in >>>> ConfigValues.java. >>>> >>>> Please share your thoughts on this. >>> >>> Hi >>> >>> First of all I think its a good idea >>> I have 2 questions >>> >>> 1) Which value will be stored as default in the java class for >>> configuration >>> values that are not a boolean, that represents if a feature is active or >>> not. >>> Is that the latest version value ? sounds not obvious to me >>> >> >> i guess this will have to have a configuration values for each version i= n the >> db. >> >>> 2) There are some configuration values that are exposed to the user via= the >>> engine-config tool, how this will work, we can not remove the entries t= heir >>> since the user may change and override those values. >>> >> >> in your suggestion below, there is the same issue, >> if user want to change the 3.3 value, engine config will fail with "No s= uch >> entry" >> because 3.3 will not be in the db.. >> so if we are not fixing this, i think using the current implementation is >> good enough, > > In this case engine-config will add this key with the given value for tha= t version, so , I see no problem in that... > In addition the getConfigValue will lookup for version matching only the = first time, so , if it was given a 3.4 version for key K and found a matchi= ng only for 3.2 , it will add to the cache K with the same value for versio= n 3.4 I don't think 3.4 should inherit from 3.2, only from the default value. i do think the code knowing if it should ask by cluster or dc level, or = at 'general' level is wrong, and asking by cluster level should fetch = the 'general' level before going to code level default. --===============3192214070576645591==--