From sanjal at redhat.com Tue Jan 22 09:28:47 2013 Content-Type: multipart/mixed; boundary="===============2274094884898901697==" MIME-Version: 1.0 From: Shireesh Anjal To: devel at ovirt.org Subject: Re: [Engine-devel] RFE: Actions on tasks (jobs) Date: Tue, 22 Jan 2013 19:58:40 +0530 Message-ID: <50FEA218.5060608@redhat.com> In-Reply-To: 50FD5C74.1020301@redhat.com --===============2274094884898901697== 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. --------------060200060105000303080109 Content-Type: text/plain; charset=3DISO-8859-1; format=3Dflowed Content-Transfer-Encoding: 7bit On Monday 21 January 2013 08:49 PM, Moti Asayag wrote: > On 01/21/2013 02:08 PM, Shireesh Anjal wrote: >> Hi, >> >> We plan to introduce support for gluster tasks in oVirt, using the >> current Jobs/steps framework. Which means, any gluster async task >> started on a cluster will be shown as a Job in the "Tasks" tab. While >> this helps in listing and monitoring the status of all gluster tasks, we >> have a requirement to support a set of actions on such tasks. One should >> be able to select a task, and then, if supported for that task, perform >> one or more of the following actions on it: >> >> - pause >> - resume >> - abort >> - commit > Could you explain what is the meaning of 'commit' in this context? The "replace brick" task in gluster migrates all data from an existing = brick to the new brick which is replacing it. After all the data is = migrated, user needs to perform a "commit" for the new brick to come = into effect. http://gluster.org/community/documentation/index.php/Gluster_3.1:_Migrating= _Volumes > In addition, is there a need for a 'restart' action ? At present, we don't need such an action as far as gluster is concerned. > Generally, a command (user-action / internal action) is mapped to a Job > when it's monitored. > > The job may contain several steps where each step might represent an > async-task (i.e task running on a node, vdsm task). > > There are two levels of control: controlling a specific vdsm task/step > or controlling the entire job. > > I think that the granularity of the action should be on Job level, since > a step's result (assuming cancelled step is considered failed) will > determine the job's status as failed/aborted - therefore the rest of > running steps should also be aborted. +1 > If needed, supporting 'restart' operation could also be relatively > easily support for job level (requires saving the action's parameters > for a re-run). > > The Jobs cleanup manager should take care of cleaning cancelled jobs and > to keep paused jobs. > > Does the suggested actions supported by the AsyncTaskManager and by VDSM ? No. These are not vdsm tasks. They'll be managed completely by = glusterfs. We plan to introduce gluster specific verbs in vdsm for = starting/managing/monitoring these tasks. http://gerrit.ovirt.org/10200 And then have a background periodic job in engine to fetch and update = the status of the same in the Job repository. > >> I think this can probably be achieved by introducing a generic mechanism >> for performing actions on task, allowing each type of task to define >> what actions are allowed on it in it's current state. >> >> Requesting opinions/suggestions on possible ways to achieve this >> requirement. >> >> Thanks, >> Shireesh >> _______________________________________________ >> 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 --------------060200060105000303080109 Content-Type: text/html; charset=3DISO-8859-1 Content-Transfer-Encoding: 7bit
On Monday 21 January 2013 08:49 PM, Moti Asayag wrote:
On 01/21/2013 02:08 PM, Shireesh Anjal wrote:
Hi,

We plan to introduce support for gluster tasks in oVirt, using the
current Jobs/steps framework. Which means, any gluster async task
started on a cluster will be shown as a Job in the "Tasks" tab. While
this helps in listing and monitoring the status of all gluster tasks, we
have a requirement to support a set of actions on such tasks. One should
be able to select a task, and then, if supported for that task, perform
one or more of the following actions on it:

- pause
- resume
- abort
- commit
Could you explain what is the meaning of 'commit' in this context?

The "replace brick" task in gluster migrates all data from an existing brick to the new brick which is replacing it. After all the data is migrated, user needs to perform a "commit" for the new brick to come into effect.
http://gluster.org/community/documentation/index.php/Glus= ter_3.1:_Migrating_Volumes

In addition, is there a need for a 'restart' action ?<=
/pre>
    

At present, we don't need such an action as far as gluster is concerned.

Generally, a command (user-action / internal action) i=
s mapped to a Job
when it's monitored.

The job may contain several steps where each step might represent an
async-task (i.e task running on a node, vdsm task).

There are two levels of control: controlling a specific vdsm task/step
or controlling the entire job.

I think that the granularity of the action should be on Job level, since
a step's result (assuming cancelled step is considered failed) will
determine the job's status as failed/aborted - therefore the rest of
running steps should also be aborted.

+1

If needed, supporting 'restart' operation could also b=
e relatively
easily support for job level (requires saving the action's parameters
for a re-run).

The Jobs cleanup manager should take care of cleaning cancelled jobs and
to keep paused jobs.

Does the suggested actions supported by the AsyncTaskManager and by VDSM ?<=
/pre>
    

No. These are not vdsm tasks. They'll be managed completely by glusterfs. We plan to introduce gluster specific verbs in vdsm for starting/managing/monitoring these tasks. http://gerrit.ovirt.org/10200

And then have a background periodic job in engine to fetch and update the status of the same in the Job repository.

I think this can probably be achieved by introducing=
 a generic mechanism
for performing actions on task, allowing each type of task to define
what actions are allowed on it in it's current state.

Requesting opinions/suggestions on possible ways to achieve this
requirement.

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

--------------060200060105000303080109-- --===============2274094884898901697== Content-Type: multipart/alternative MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.bin" VGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KLS0tLS0tLS0tLS0t LS0wNjAyMDAwNjAxMDUwMDAzMDMwODAxMDkKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFy c2V0PUlTTy04ODU5LTE7IGZvcm1hdD1mbG93ZWQKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzog N2JpdAoKT24gTW9uZGF5IDIxIEphbnVhcnkgMjAxMyAwODo0OSBQTSwgTW90aSBBc2F5YWcgd3Jv dGU6Cj4gT24gMDEvMjEvMjAxMyAwMjowOCBQTSwgU2hpcmVlc2ggQW5qYWwgd3JvdGU6Cj4+IEhp LAo+Pgo+PiBXZSBwbGFuIHRvIGludHJvZHVjZSBzdXBwb3J0IGZvciBnbHVzdGVyIHRhc2tzIGlu IG9WaXJ0LCB1c2luZyB0aGUKPj4gY3VycmVudCBKb2JzL3N0ZXBzIGZyYW1ld29yay4gV2hpY2gg bWVhbnMsIGFueSBnbHVzdGVyIGFzeW5jIHRhc2sKPj4gc3RhcnRlZCBvbiBhIGNsdXN0ZXIgd2ls bCBiZSBzaG93biBhcyBhIEpvYiBpbiB0aGUgIlRhc2tzIiB0YWIuIFdoaWxlCj4+IHRoaXMgaGVs cHMgaW4gbGlzdGluZyBhbmQgbW9uaXRvcmluZyB0aGUgc3RhdHVzIG9mIGFsbCBnbHVzdGVyIHRh c2tzLCB3ZQo+PiBoYXZlIGEgcmVxdWlyZW1lbnQgdG8gc3VwcG9ydCBhIHNldCBvZiBhY3Rpb25z IG9uIHN1Y2ggdGFza3MuIE9uZSBzaG91bGQKPj4gYmUgYWJsZSB0byBzZWxlY3QgYSB0YXNrLCBh bmQgdGhlbiwgaWYgc3VwcG9ydGVkIGZvciB0aGF0IHRhc2ssIHBlcmZvcm0KPj4gb25lIG9yIG1v cmUgb2YgdGhlIGZvbGxvd2luZyBhY3Rpb25zIG9uIGl0Ogo+Pgo+PiAtIHBhdXNlCj4+IC0gcmVz dW1lCj4+IC0gYWJvcnQKPj4gLSBjb21taXQKPiBDb3VsZCB5b3UgZXhwbGFpbiB3aGF0IGlzIHRo ZSBtZWFuaW5nIG9mICdjb21taXQnIGluIHRoaXMgY29udGV4dD8KClRoZSAicmVwbGFjZSBicmlj ayIgdGFzayBpbiBnbHVzdGVyIG1pZ3JhdGVzIGFsbCBkYXRhIGZyb20gYW4gZXhpc3RpbmcgCmJy aWNrIHRvIHRoZSBuZXcgYnJpY2sgd2hpY2ggaXMgcmVwbGFjaW5nIGl0LiBBZnRlciBhbGwgdGhl IGRhdGEgaXMgCm1pZ3JhdGVkLCB1c2VyIG5lZWRzIHRvIHBlcmZvcm0gYSAiY29tbWl0IiBmb3Ig dGhlIG5ldyBicmljayB0byBjb21lIAppbnRvIGVmZmVjdC4KaHR0cDovL2dsdXN0ZXIub3JnL2Nv bW11bml0eS9kb2N1bWVudGF0aW9uL2luZGV4LnBocC9HbHVzdGVyXzMuMTpfTWlncmF0aW5nX1Zv bHVtZXMKCj4gSW4gYWRkaXRpb24sIGlzIHRoZXJlIGEgbmVlZCBmb3IgYSAncmVzdGFydCcgYWN0 aW9uID8KCkF0IHByZXNlbnQsIHdlIGRvbid0IG5lZWQgc3VjaCBhbiBhY3Rpb24gYXMgZmFyIGFz IGdsdXN0ZXIgaXMgY29uY2VybmVkLgoKPiBHZW5lcmFsbHksIGEgY29tbWFuZCAodXNlci1hY3Rp b24gLyBpbnRlcm5hbCBhY3Rpb24pIGlzIG1hcHBlZCB0byBhIEpvYgo+IHdoZW4gaXQncyBtb25p dG9yZWQuCj4KPiBUaGUgam9iIG1heSBjb250YWluIHNldmVyYWwgc3RlcHMgd2hlcmUgZWFjaCBz dGVwIG1pZ2h0IHJlcHJlc2VudCBhbgo+IGFzeW5jLXRhc2sgKGkuZSB0YXNrIHJ1bm5pbmcgb24g YSBub2RlLCB2ZHNtIHRhc2spLgo+Cj4gVGhlcmUgYXJlIHR3byBsZXZlbHMgb2YgY29udHJvbDog Y29udHJvbGxpbmcgYSBzcGVjaWZpYyB2ZHNtIHRhc2svc3RlcAo+IG9yIGNvbnRyb2xsaW5nIHRo ZSBlbnRpcmUgam9iLgo+Cj4gSSB0aGluayB0aGF0IHRoZSBncmFudWxhcml0eSBvZiB0aGUgYWN0 aW9uIHNob3VsZCBiZSBvbiBKb2IgbGV2ZWwsIHNpbmNlCj4gYSBzdGVwJ3MgcmVzdWx0IChhc3N1 bWluZyBjYW5jZWxsZWQgc3RlcCBpcyBjb25zaWRlcmVkIGZhaWxlZCkgd2lsbAo+IGRldGVybWlu ZSB0aGUgam9iJ3Mgc3RhdHVzIGFzIGZhaWxlZC9hYm9ydGVkIC0gdGhlcmVmb3JlIHRoZSByZXN0 IG9mCj4gcnVubmluZyBzdGVwcyBzaG91bGQgYWxzbyBiZSBhYm9ydGVkLgoKKzEKCj4gSWYgbmVl ZGVkLCBzdXBwb3J0aW5nICdyZXN0YXJ0JyBvcGVyYXRpb24gY291bGQgYWxzbyBiZSByZWxhdGl2 ZWx5Cj4gZWFzaWx5IHN1cHBvcnQgZm9yIGpvYiBsZXZlbCAocmVxdWlyZXMgc2F2aW5nIHRoZSBh Y3Rpb24ncyBwYXJhbWV0ZXJzCj4gZm9yIGEgcmUtcnVuKS4KPgo+IFRoZSBKb2JzIGNsZWFudXAg bWFuYWdlciBzaG91bGQgdGFrZSBjYXJlIG9mIGNsZWFuaW5nIGNhbmNlbGxlZCBqb2JzIGFuZAo+ IHRvIGtlZXAgcGF1c2VkIGpvYnMuCj4KPiBEb2VzIHRoZSBzdWdnZXN0ZWQgYWN0aW9ucyBzdXBw b3J0ZWQgYnkgdGhlIEFzeW5jVGFza01hbmFnZXIgYW5kIGJ5IFZEU00gPwoKTm8uIFRoZXNlIGFy ZSBub3QgdmRzbSB0YXNrcy4gVGhleSdsbCBiZSBtYW5hZ2VkIGNvbXBsZXRlbHkgYnkgCmdsdXN0 ZXJmcy4gV2UgcGxhbiB0byBpbnRyb2R1Y2UgZ2x1c3RlciBzcGVjaWZpYyB2ZXJicyBpbiB2ZHNt IGZvciAKc3RhcnRpbmcvbWFuYWdpbmcvbW9uaXRvcmluZyB0aGVzZSB0YXNrcy4gaHR0cDovL2dl cnJpdC5vdmlydC5vcmcvMTAyMDAKCkFuZCB0aGVuIGhhdmUgYSBiYWNrZ3JvdW5kIHBlcmlvZGlj IGpvYiBpbiBlbmdpbmUgdG8gZmV0Y2ggYW5kIHVwZGF0ZSAKdGhlIHN0YXR1cyBvZiB0aGUgc2Ft ZSBpbiB0aGUgSm9iIHJlcG9zaXRvcnkuCgo+Cj4+IEkgdGhpbmsgdGhpcyBjYW4gcHJvYmFibHkg YmUgYWNoaWV2ZWQgYnkgaW50cm9kdWNpbmcgYSBnZW5lcmljIG1lY2hhbmlzbQo+PiBmb3IgcGVy Zm9ybWluZyBhY3Rpb25zIG9uIHRhc2ssIGFsbG93aW5nIGVhY2ggdHlwZSBvZiB0YXNrIHRvIGRl ZmluZQo+PiB3aGF0IGFjdGlvbnMgYXJlIGFsbG93ZWQgb24gaXQgaW4gaXQncyBjdXJyZW50IHN0 YXRlLgo+Pgo+PiBSZXF1ZXN0aW5nIG9waW5pb25zL3N1Z2dlc3Rpb25zIG9uIHBvc3NpYmxlIHdh eXMgdG8gYWNoaWV2ZSB0aGlzCj4+IHJlcXVpcmVtZW50Lgo+Pgo+PiBUaGFua3MsCj4+IFNoaXJl ZXNoCj4+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCj4+ IEVuZ2luZS1kZXZlbCBtYWlsaW5nIGxpc3QKPj4gRW5naW5lLWRldmVsQG92aXJ0Lm9yZwo+PiBo dHRwOi8vbGlzdHMub3ZpcnQub3JnL21haWxtYW4vbGlzdGluZm8vZW5naW5lLWRldmVsCj4gX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KPiBFbmdpbmUtZGV2 ZWwgbWFpbGluZyBsaXN0Cj4gRW5naW5lLWRldmVsQG92aXJ0Lm9yZwo+IGh0dHA6Ly9saXN0cy5v dmlydC5vcmcvbWFpbG1hbi9saXN0aW5mby9lbmdpbmUtZGV2ZWwKCgotLS0tLS0tLS0tLS0tLTA2 MDIwMDA2MDEwNTAwMDMwMzA4MDEwOQpDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1J U08tODg1OS0xCkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKCjxodG1sPgogIDxoZWFk PgogICAgPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiCiAgICAg IGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSI+CiAgPC9oZWFkPgogIDxib2R5IHRleHQ9IiMwMDAw MDAiIGJnY29sb3I9IiNGRkZGRkYiPgogICAgPGRpdiBjbGFzcz0ibW96LWNpdGUtcHJlZml4Ij5P biBNb25kYXkgMjEgSmFudWFyeSAyMDEzIDA4OjQ5IFBNLAogICAgICBNb3RpIEFzYXlhZyB3cm90 ZTo8YnI+CiAgICA8L2Rpdj4KICAgIDxibG9ja3F1b3RlIGNpdGU9Im1pZDo1MEZENUM3NC4xMDIw MzAxQHJlZGhhdC5jb20iIHR5cGU9ImNpdGUiPgogICAgICA8cHJlIHdyYXA9IiI+T24gMDEvMjEv MjAxMyAwMjowOCBQTSwgU2hpcmVlc2ggQW5qYWwgd3JvdGU6CjwvcHJlPgogICAgICA8YmxvY2tx dW90ZSB0eXBlPSJjaXRlIj4KICAgICAgICA8cHJlIHdyYXA9IiI+SGksCgpXZSBwbGFuIHRvIGlu dHJvZHVjZSBzdXBwb3J0IGZvciBnbHVzdGVyIHRhc2tzIGluIG9WaXJ0LCB1c2luZyB0aGUKY3Vy cmVudCBKb2JzL3N0ZXBzIGZyYW1ld29yay4gV2hpY2ggbWVhbnMsIGFueSBnbHVzdGVyIGFzeW5j IHRhc2sKc3RhcnRlZCBvbiBhIGNsdXN0ZXIgd2lsbCBiZSBzaG93biBhcyBhIEpvYiBpbiB0aGUg IlRhc2tzIiB0YWIuIFdoaWxlCnRoaXMgaGVscHMgaW4gbGlzdGluZyBhbmQgbW9uaXRvcmluZyB0 aGUgc3RhdHVzIG9mIGFsbCBnbHVzdGVyIHRhc2tzLCB3ZQpoYXZlIGEgcmVxdWlyZW1lbnQgdG8g c3VwcG9ydCBhIHNldCBvZiBhY3Rpb25zIG9uIHN1Y2ggdGFza3MuIE9uZSBzaG91bGQKYmUgYWJs ZSB0byBzZWxlY3QgYSB0YXNrLCBhbmQgdGhlbiwgaWYgc3VwcG9ydGVkIGZvciB0aGF0IHRhc2ss IHBlcmZvcm0Kb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBhY3Rpb25zIG9uIGl0OgoKLSBw YXVzZQotIHJlc3VtZQotIGFib3J0Ci0gY29tbWl0CjwvcHJlPgogICAgICA8L2Jsb2NrcXVvdGU+ CiAgICAgIDxwcmUgd3JhcD0iIj4KQ291bGQgeW91IGV4cGxhaW4gd2hhdCBpcyB0aGUgbWVhbmlu ZyBvZiAnY29tbWl0JyBpbiB0aGlzIGNvbnRleHQ/PC9wcmU+CiAgICA8L2Jsb2NrcXVvdGU+CiAg ICA8YnI+CiAgICBUaGUgInJlcGxhY2UgYnJpY2siIHRhc2sgaW4gZ2x1c3RlciBtaWdyYXRlcyBh bGwgZGF0YSBmcm9tIGFuCiAgICBleGlzdGluZyBicmljayB0byB0aGUgbmV3IGJyaWNrIHdoaWNo IGlzIHJlcGxhY2luZyBpdC4gQWZ0ZXIgYWxsIHRoZQogICAgZGF0YSBpcyBtaWdyYXRlZCwgdXNl ciBuZWVkcyB0byBwZXJmb3JtIGEgImNvbW1pdCIgZm9yIHRoZSBuZXcgYnJpY2sKICAgIHRvIGNv bWUgaW50byBlZmZlY3QuPGJyPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBj b250ZW50PSJ0ZXh0L2h0bWw7CiAgICAgIGNoYXJzZXQ9SVNPLTg4NTktMSI+CiAgICA8YQpocmVm PSJodHRwOi8vZ2x1c3Rlci5vcmcvY29tbXVuaXR5L2RvY3VtZW50YXRpb24vaW5kZXgucGhwL0ds dXN0ZXJfMy4xOl9NaWdyYXRpbmdfVm9sdW1lcyI+aHR0cDovL2dsdXN0ZXIub3JnL2NvbW11bml0 eS9kb2N1bWVudGF0aW9uL2luZGV4LnBocC9HbHVzdGVyXzMuMTpfTWlncmF0aW5nX1ZvbHVtZXM8 L2E+PGJyPgogICAgPGJyPgogICAgPGJsb2NrcXVvdGUgY2l0ZT0ibWlkOjUwRkQ1Qzc0LjEwMjAz MDFAcmVkaGF0LmNvbSIgdHlwZT0iY2l0ZSI+CiAgICAgIDxwcmUgd3JhcD0iIj5JbiBhZGRpdGlv biwgaXMgdGhlcmUgYSBuZWVkIGZvciBhICdyZXN0YXJ0JyBhY3Rpb24gPzwvcHJlPgogICAgPC9i bG9ja3F1b3RlPgogICAgPGJyPgogICAgQXQgcHJlc2VudCwgd2UgZG9uJ3QgbmVlZCBzdWNoIGFu IGFjdGlvbiBhcyBmYXIgYXMgZ2x1c3RlciBpcwogICAgY29uY2VybmVkLjxicj4KICAgIDxicj4K ICAgIDxibG9ja3F1b3RlIGNpdGU9Im1pZDo1MEZENUM3NC4xMDIwMzAxQHJlZGhhdC5jb20iIHR5 cGU9ImNpdGUiPgogICAgICA8cHJlIHdyYXA9IiI+R2VuZXJhbGx5LCBhIGNvbW1hbmQgKHVzZXIt YWN0aW9uIC8gaW50ZXJuYWwgYWN0aW9uKSBpcyBtYXBwZWQgdG8gYSBKb2IKd2hlbiBpdCdzIG1v bml0b3JlZC4KClRoZSBqb2IgbWF5IGNvbnRhaW4gc2V2ZXJhbCBzdGVwcyB3aGVyZSBlYWNoIHN0 ZXAgbWlnaHQgcmVwcmVzZW50IGFuCmFzeW5jLXRhc2sgKGkuZSB0YXNrIHJ1bm5pbmcgb24gYSBu b2RlLCB2ZHNtIHRhc2spLgoKVGhlcmUgYXJlIHR3byBsZXZlbHMgb2YgY29udHJvbDogY29udHJv bGxpbmcgYSBzcGVjaWZpYyB2ZHNtIHRhc2svc3RlcApvciBjb250cm9sbGluZyB0aGUgZW50aXJl IGpvYi4KCkkgdGhpbmsgdGhhdCB0aGUgZ3JhbnVsYXJpdHkgb2YgdGhlIGFjdGlvbiBzaG91bGQg YmUgb24gSm9iIGxldmVsLCBzaW5jZQphIHN0ZXAncyByZXN1bHQgKGFzc3VtaW5nIGNhbmNlbGxl ZCBzdGVwIGlzIGNvbnNpZGVyZWQgZmFpbGVkKSB3aWxsCmRldGVybWluZSB0aGUgam9iJ3Mgc3Rh dHVzIGFzIGZhaWxlZC9hYm9ydGVkIC0gdGhlcmVmb3JlIHRoZSByZXN0IG9mCnJ1bm5pbmcgc3Rl cHMgc2hvdWxkIGFsc28gYmUgYWJvcnRlZC48L3ByZT4KICAgIDwvYmxvY2txdW90ZT4KICAgIDxi cj4KICAgICsxPGJyPgogICAgPGJyPgogICAgPGJsb2NrcXVvdGUgY2l0ZT0ibWlkOjUwRkQ1Qzc0 LjEwMjAzMDFAcmVkaGF0LmNvbSIgdHlwZT0iY2l0ZSI+CiAgICAgIDxwcmUgd3JhcD0iIj5JZiBu ZWVkZWQsIHN1cHBvcnRpbmcgJ3Jlc3RhcnQnIG9wZXJhdGlvbiBjb3VsZCBhbHNvIGJlIHJlbGF0 aXZlbHkKZWFzaWx5IHN1cHBvcnQgZm9yIGpvYiBsZXZlbCAocmVxdWlyZXMgc2F2aW5nIHRoZSBh Y3Rpb24ncyBwYXJhbWV0ZXJzCmZvciBhIHJlLXJ1bikuCgpUaGUgSm9icyBjbGVhbnVwIG1hbmFn ZXIgc2hvdWxkIHRha2UgY2FyZSBvZiBjbGVhbmluZyBjYW5jZWxsZWQgam9icyBhbmQKdG8ga2Vl cCBwYXVzZWQgam9icy4KCkRvZXMgdGhlIHN1Z2dlc3RlZCBhY3Rpb25zIHN1cHBvcnRlZCBieSB0 aGUgQXN5bmNUYXNrTWFuYWdlciBhbmQgYnkgVkRTTSA/PC9wcmU+CiAgICA8L2Jsb2NrcXVvdGU+ CiAgICA8YnI+CiAgICBOby4gVGhlc2UgYXJlIG5vdCB2ZHNtIHRhc2tzLiBUaGV5J2xsIGJlIG1h bmFnZWQgY29tcGxldGVseSBieQogICAgZ2x1c3RlcmZzLiBXZSBwbGFuIHRvIGludHJvZHVjZSBn bHVzdGVyIHNwZWNpZmljIHZlcmJzIGluIHZkc20gZm9yCiAgICBzdGFydGluZy9tYW5hZ2luZy9t b25pdG9yaW5nIHRoZXNlIHRhc2tzLgogICAgPGEgY2xhc3M9Im1vei10eHQtbGluay1mcmVldGV4 dCIgaHJlZj0iaHR0cDovL2dlcnJpdC5vdmlydC5vcmcvMTAyMDAiPmh0dHA6Ly9nZXJyaXQub3Zp cnQub3JnLzEwMjAwPC9hPjxicj4KICAgIDxicj4KICAgIEFuZCB0aGVuIGhhdmUgYSBiYWNrZ3Jv dW5kIHBlcmlvZGljIGpvYiBpbiBlbmdpbmUgdG8gZmV0Y2ggYW5kCiAgICB1cGRhdGUgdGhlIHN0 YXR1cyBvZiB0aGUgc2FtZSBpbiB0aGUgSm9iIHJlcG9zaXRvcnkuPGJyPgogICAgPGJyPgogICAg PGJsb2NrcXVvdGUgY2l0ZT0ibWlkOjUwRkQ1Qzc0LjEwMjAzMDFAcmVkaGF0LmNvbSIgdHlwZT0i Y2l0ZSI+PGJyPgogICAgICA8YmxvY2txdW90ZSB0eXBlPSJjaXRlIj4KICAgICAgICA8cHJlIHdy YXA9IiI+SSB0aGluayB0aGlzIGNhbiBwcm9iYWJseSBiZSBhY2hpZXZlZCBieSBpbnRyb2R1Y2lu ZyBhIGdlbmVyaWMgbWVjaGFuaXNtCmZvciBwZXJmb3JtaW5nIGFjdGlvbnMgb24gdGFzaywgYWxs b3dpbmcgZWFjaCB0eXBlIG9mIHRhc2sgdG8gZGVmaW5lCndoYXQgYWN0aW9ucyBhcmUgYWxsb3dl ZCBvbiBpdCBpbiBpdCdzIGN1cnJlbnQgc3RhdGUuCgpSZXF1ZXN0aW5nIG9waW5pb25zL3N1Z2dl c3Rpb25zIG9uIHBvc3NpYmxlIHdheXMgdG8gYWNoaWV2ZSB0aGlzCnJlcXVpcmVtZW50LgoKVGhh bmtzLApTaGlyZWVzaApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXwpFbmdpbmUtZGV2ZWwgbWFpbGluZyBsaXN0CjxhIGNsYXNzPSJtb3otdHh0LWxpbmstYWJi cmV2aWF0ZWQiIGhyZWY9Im1haWx0bzpFbmdpbmUtZGV2ZWxAb3ZpcnQub3JnIj5FbmdpbmUtZGV2 ZWxAb3ZpcnQub3JnPC9hPgo8YSBjbGFzcz0ibW96LXR4dC1saW5rLWZyZWV0ZXh0IiBocmVmPSJo dHRwOi8vbGlzdHMub3ZpcnQub3JnL21haWxtYW4vbGlzdGluZm8vZW5naW5lLWRldmVsIj5odHRw Oi8vbGlzdHMub3ZpcnQub3JnL21haWxtYW4vbGlzdGluZm8vZW5naW5lLWRldmVsPC9hPgo8L3By ZT4KICAgICAgPC9ibG9ja3F1b3RlPgogICAgICA8cHJlIHdyYXA9IiI+Cl9fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkVuZ2luZS1kZXZlbCBtYWlsaW5nIGxp c3QKPGEgY2xhc3M9Im1vei10eHQtbGluay1hYmJyZXZpYXRlZCIgaHJlZj0ibWFpbHRvOkVuZ2lu ZS1kZXZlbEBvdmlydC5vcmciPkVuZ2luZS1kZXZlbEBvdmlydC5vcmc8L2E+CjxhIGNsYXNzPSJt b3otdHh0LWxpbmstZnJlZXRleHQiIGhyZWY9Imh0dHA6Ly9saXN0cy5vdmlydC5vcmcvbWFpbG1h bi9saXN0aW5mby9lbmdpbmUtZGV2ZWwiPmh0dHA6Ly9saXN0cy5vdmlydC5vcmcvbWFpbG1hbi9s aXN0aW5mby9lbmdpbmUtZGV2ZWw8L2E+CjwvcHJlPgogICAgPC9ibG9ja3F1b3RlPgogICAgPGJy PgogIDwvYm9keT4KPC9odG1sPgoKLS0tLS0tLS0tLS0tLS0wNjAyMDAwNjAxMDUwMDAzMDMwODAx MDktLQo= --===============2274094884898901697==--