Cjxib2R5IGxhbmc9ImVuLVVTIj4KPGgyPjUgQmlibGlvZ3JhcGh5LXN0eWxlIGhhY2tpbmc8L2gyPgoKPHAgYWxpZ249InJpZ2h0Ij48ZW0+QSBwcmludGVyIGZyaWVuZGx5IFBERiB2ZXJzaW9uIG9mIHRoaXMgcGFnZSBpcyBhdmFpbGFibGUKPGFocmVmPSJpbmRleC5wZGYiPjxhIGhyZWY9ImJ0aGFjay5wZGYiPmJ0aGFjay5wZGYgKDg0S2IpPC9hPjwvZW0+PC9wPgoKPHA+VGhpcyBkb2N1bWVudCBzdGFydHMgKGFuZCBlbmRzKSB3aXRoIFNlY3Rpb24mbmJzcDs8YQpocmVmPSJidGhhY2suaHRtbCNzdHlsZSI+NTwvYT4sIGJlY2F1c2UgaW4gcmVhbGl0eSBpdCBpcyB0aGUgZmluYWwgc2VjdGlvbiBvZgoiQmliVGVYaW5nJycmbmJzcDtbPGEgaHJlZj0iYnRoYWNrLmh0bWwjYnR4ZG9jIj40PC9hPl0sIHRoZSBnZW5lcmFsCmRvY3VtZW50YXRpb24gZm9yIC4gQnV0IHRoYXQgZG9jdW1lbnQgd2FzIG1lYW50IGZvciBhbGwgdXNlcnMsIHdoaWxlIHRoaXMgb25lCmlzIGp1c3QgZm9yIHN0eWxlIGRlc2lnbmVycywgc28gdGhlIHR3byBhcmUgcGh5c2ljYWxseSBzZXBhcmF0ZS4gU3RpbGwsIHlvdQpzaG91bGQgYmUgY29tcGxldGVseSBmYW1pbGlhciB3aXRoICYjeDIwMWM7QmliVGVYaW5nJycsIGFuZCBhbGwgcmVmZXJlbmNlcyBpbgp0aGlzIGRvY3VtZW50IHRvIHNlY3Rpb25zIGFuZCBzZWN0aW9uIG51bWJlcnMgYXNzdW1lIHRoYXQgdGhlIHR3byBkb2N1bWVudHMKYXJlIG9uZS48L3A+Cgo8cD5UaGlzIHNlY3Rpb24sIGFsb25nIHdpdGggdGhlIHN0YW5kYXJkLXN0eWxlIGRvY3VtZW50YXRpb24gZmlsZQo8dHQ+YnR4YnN0LmRvYzwvdHQ+LCBzaG91bGQgZXhwbGFpbiBob3cgdG8gbW9kaWZ5IGV4aXN0aW5nIHN0eWxlIGZpbGVzIGFuZCB0bwpwcm9kdWNlIG5ldyBvbmVzLiBJZiB5b3UncmUgYSBzZXJpb3VzIHN0eWxlIGhhY2tlciB5b3Ugc2hvdWxkIGJlIGZhbWlsaWFyCndpdGggdmFuJm5ic3A7TGV1bmVuJm5ic3A7WzxhIGhyZWY9ImJ0aGFjay5odG1sI3Zhbi1sZXVuZW4iPjc8L2E+XSBmb3IgcG9pbnRzCm9mIHN0eWxlLCB3aXRoIExhbXBvcnQmbmJzcDtbPGEgaHJlZj0iYnRoYWNrLmh0bWwjbGF0ZXgiPjM8L2E+XSBhbmQKS251dGgmbmJzcDtbPGEgaHJlZj0iYnRoYWNrLmh0bWwjdGV4Ym9vayI+MjwvYT5dIGZvciBmb3JtYXR0aW5nIG1hdHRlcnMsIGFuZApwZXJoYXBzIHdpdGggPGk+U2NyaWJlPC9pPiZuYnNwO1s8YSBocmVmPSJidGhhY2suaHRtbCNzY3JpYmUiPjY8L2E+XSBmb3IKY29tcGF0aWJpbGl0eSBkZXRhaWxzLiBBbmQgd2hpbGUgeW91J3JlIGF0IGl0LCBpZiB5b3UgZG9uJ3QgcmVhZCB0aGUgZ3JlYXQKbGl0dGxlIGJvb2sgYnkgU3RydW5rIGFuZCBXaGl0ZSZuYnNwO1s8YQpocmVmPSJidGhhY2suaHRtbCNzdHJ1bmstYW5kLXdoaXRlIj41PC9hPl0sIHlvdSBzaG91bGQgYXQgbGVhc3QgbG9vayBhdCBpdHMKZW50cmllcyBpbiB0aGUgZGF0YWJhc2UgYW5kIHRoZSByZWZlcmVuY2UgbGlzdCB0byBzZWUgaG93IGhhbmRsZXMgbXVsdGlwbGUKbmFtZXMuPC9wPgoKPHA+VG8gY3JlYXRlIGEgbmV3IHN0eWxlLCBpdCdzIGJlc3QgdG8gc3RhcnQgd2l0aCBhbiBleGlzdGluZyBzdHlsZSB0aGF0J3MKY2xvc2UgdG8geW91cnMsIGFuZCB0aGVuIG1vZGlmeSB0aGF0LiBUaGlzIGlzIHRydWUgZXZlbiBpZiB5b3UncmUgc2ltcGx5CnVwZGF0aW5nIGFuIG9sZCBzdHlsZSBmb3IgdmVyc2lvbiAwLjk5IChJJ3ZlIHVwZGF0ZWQgZm91ciBub25zdGFuZGFyZCBzdHlsZXMsCnNvIEkgc2F5IHRoaXMgd2l0aCBzb21lIGV4cGVyaWVuY2UpLiBJZiB5b3Ugd2FudCB0byBpbnNlcnQgaW50byBhIG5ldyBzdHlsZQpzb21lIGZ1bmN0aW9uIHlvdSdkIHdyaXR0ZW4gZm9yIGFuIG9sZCAodmVyc2lvbiAwLjk4aSkgc3R5bGUsIGtlZXAgaW4gbWluZAp0aGF0IHRoZSBvcmRlciBvZiB0aGUgYXJndW1lbnRzIHRvIHRoZSBhc3NpZ25tZW50ICg8dHQ+Oj08L3R0PikgZnVuY3Rpb24gaGFzCmJlZW4gcmV2ZXJzZWQuIFdoZW4geW91J3JlIGZpbmlzaGVkIHdpdGggeW91ciBzdHlsZSwgeW91IG1heSB3YW50IHRvIHRyeQpydW5uaW5nIGl0IG9uIHRoZSBlbnRpcmUgPHR0PlhBTVBMLkJJQjwvdHQ+IGRhdGFiYXNlIHRvIG1ha2Ugc3VyZSBpdCBoYW5kbGVzCmFsbCB0aGUgc3RhbmRhcmQgZW50cnkgdHlwZXMuPC9wPgoKPHA+SWYgeW91IGZpbmQgYW55IGJ1Z3MgaW4gdGhlIHN0YW5kYXJkIHN0eWxlcywgb3IgaWYgdGhlcmUgYXJlIHRoaW5ncyB5b3UnZApsaWtlIHRvIGRvIHdpdGggYmlibGlvZ3JhcGh5LXN0eWxlIGZpbGVzIGJ1dCBjYW4ndCwgcGxlYXNlIGNvbXBsYWluIHRvIE9yZW4KUGF0YXNobmlrLjwvcD4KCjxoMz41LjEgR2VuZXJhbCBkZXNjcmlwdGlvbjwvaDM+Cgo8cD5Zb3Ugd3JpdGUgYmlibGlvZ3JhcGh5IHN0eWxlcyBpbiBhIHBvc3RmaXggc3RhY2sgbGFuZ3VhZ2UuIEl0J3Mgbm90IHRvbwpoYXJkIHRvIGZpZ3VyZSBvdXQgaG93IGJ5IGxvb2tpbmcgYXQgdGhlIHN0YW5kYXJkLXN0eWxlIGRvY3VtZW50YXRpb24sIGJ1dAp0aGlzIGRlc2NyaXB0aW9uIGZpbGxzIGluIGEgZmV3IGRldGFpbHMgKGl0IHdpbGwgZmlsbCBpbiBtb3JlIGRldGFpbHMgaWYKdGhlcmUncyBhIGRlbWFuZCBmb3IgaXQpLjwvcD4KCjxwPkJhc2ljYWxseSB0aGUgc3R5bGUgZmlsZSBpcyBhIHByb2dyYW0sIHdyaXR0ZW4gaW4gYW4gdW5uYW1lZCBsYW5ndWFnZSwKdGhhdCB0ZWxscyBob3cgdG8gZm9ybWF0IHRoZSBlbnRyaWVzIHRoYXQgd2lsbCBnbyBpbiB0aGUgcmVmZXJlbmNlIGxpc3QKKGhlbmNlZm9ydGggYGB0aGUgZW50cmllcycnIHdpbGwgYmUgYGB0aGUgZW50cnkgbGlzdCcnIG9yIHNpbXBseSBgYHRoZQpsaXN0JycsIGNvbnRleHQgcGVybWl0dGluZykuIFRoaXMgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgaGFzIHRlbiBjb21tYW5kcywKZGVzY3JpYmVkIGluIHRoZSBuZXh0IHN1YnNlY3Rpb24uIFRoZXNlIGNvbW1hbmRzIG1hbmlwdWxhdGUgdGhlIGxhbmd1YWdlJ3MKb2JqZWN0czogY29uc3RhbnRzLCB2YXJpYWJsZXMsIGZ1bmN0aW9ucywgdGhlIHN0YWNrLCBhbmQgdGhlIGVudHJ5IGxpc3QuCihXYXJuaW5nOiBUaGUgdGVybWlub2xvZ3kgaW4gdGhpcyBkb2N1bWVudGF0aW9uLCBjaG9zZW4gZm9yIGVhc2Ugb2YKZXhwbGFuYXRpb24sIGlzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tICdzLiBGb3IgZXhhbXBsZSwgdGhpcyBkb2N1bWVudGF0aW9uJ3MKYGB2YXJpYWJsZXMnJyBhbmQgYGBmdW5jdGlvbnMnJyBhcmUgYm90aCBgYGZ1bmN0aW9ucycnIHRvIC4gS2VlcCB0aGlzIGluIG1pbmQKd2hlbiBpbnRlcnByZXRpbmcgJ3MgZXJyb3IgbWVzc2FnZXMuKTwvcD4KCjxwPlRoZXJlIGFyZSB0d28gdHlwZXMgb2YgZnVuY3Rpb25zOiA8aT5idWlsdC1pbjwvaT4gb25lcyB0aGF0IHByb3ZpZGVzCih0aGVzZSBhcmUgZGVzY3JpYmVkIGluIFNlY3Rpb24mbmJzcDs8YQpocmVmPSJidGhhY2suaHRtbCNidWlsdC1pbi1mbnMiPjUuMzwvYT4pLCBhbmQgb25lcyB5b3UgZGVmaW5lIHVzaW5nIGVpdGhlcgp0aGUgPHR0Pk1BQ1JPPC90dD4gb3IgPHR0PkZVTkNUSU9OPC90dD4gY29tbWFuZC48L3A+Cgo8cD5Zb3VyIG1vc3QgdGltZS1jb25zdW1pbmcgdGFzaywgYXMgYSBzdHlsZSBkZXNpZ25lciwgd2lsbCBiZSBjcmVhdGluZyBvcgptb2RpZnlpbmcgZnVuY3Rpb25zIHVzaW5nIHRoZSA8dHQ+RlVOQ1RJT048L3R0PiBjb21tYW5kIChhY3R1YWxseSwgYmVjb21pbmcKZmFtaWxpYXIgd2l0aCB0aGUgcmVmZXJlbmNlcyBsaXN0ZWQgYWJvdmUgd2lsbCBiZSBtb3JlIHRpbWUgY29uc3VtaW5nLCBidXQKYXNzdW1lIGZvciB0aGUgbW9tZW50IHRoYXQgdGhhdCdzIGRvbmUpLjwvcD4KCjxwPkxldCdzIGxvb2sgYXQgYSBzYW1wbGUgZnVuY3Rpb24gZnJhZ21lbnQuIFN1cHBvc2UgeW91IGhhdmUgYSBzdHJpbmcKdmFyaWFibGUgbmFtZWQgPHR0PmxhYmVsPC90dD4gYW5kIGFuIGludGVnZXIgdmFyaWFibGUgbmFtZWQKPHR0PmxhYi53aWR0aDwvdHQ+LCBhbmQgc3VwcG9zZSB5b3Ugd2FudCB0byBhcHBlbmQgdGhlIGNoYXJhY3RlciBgPHR0PmE8L3R0PicKdG8gPHR0PmxhYmVsPC90dD4gYW5kIHRvIGluY3JlbWVudCA8dHQ+bGFiLndpZHRoPC90dD46PC9wPgo8cHJlPiAgICAuICAuICAuCiAgICBsYWJlbCAiYSIgKiAnbGFiZWwgOj0gICAgICAgICAgJSBsYWJlbCA6PSBsYWJlbCAqICJhIgogICAgbGFiLndpZHRoICMxICsgJ2xhYi53aWR0aCA6PSAgICUgbGFiLndpZHRoIDo9IGxhYi53aWR0aCArIDEKICAgIC4gIC4gIC48L3ByZT4KCjxwPkluIHRoZSBmaXJzdCBsaW5lLCA8dHQ+bGFiZWw8L3R0PiBwdXNoZXMgdGhhdCB2YXJpYWJsZSdzIHZhbHVlIG9udG8gdGhlCnN0YWNrLiBOZXh0LCB0aGUgPHR0PiJhIjwvdHQ+IHB1c2hlcyB0aGUgc3RyaW5nIGNvbnN0YW50IGA8dHQ+YTwvdHQ+JyBvbnRvCnRoZSBzdGFjay4gVGhlbiB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gPHR0Pio8L3R0PiBwb3BzIHRoZSB0b3AgdHdvIHN0cmluZ3MgYW5kCnB1c2hlcyB0aGVpciBjb25jYXRlbmF0aW9uLiBUaGUgPHR0PidsYWJlbDwvdHQ+IHB1c2hlcyB0aGF0IHZhcmlhYmxlJ3MgbmFtZQpvbnRvIHRoZSBzdGFjay4gQW5kIGZpbmFsbHksIHRoZSBidWlsdC1pbiBmdW5jdGlvbiA8dHQ+Oj08L3R0PiBwb3BzIHRoZQp2YXJpYWJsZSBuYW1lIGFuZCB0aGUgY29uY2F0ZW5hdGlvbiBhbmQgcGVyZm9ybXMgdGhlIGFzc2lnbm1lbnQgdHJlYXRzIHRoZQpzdHVmZiBmb2xsb3dpbmcgdGhlIDx0dD4lPC90dD4gYXMgYSBjb21tZW50IGluIHRoZSBzdHlsZSBmaWxlLiBUaGUgc2Vjb25kCmxpbmUgaXMgc2ltaWxhciBleGNlcHQgdGhhdCBpdCB1c2VzIDx0dD4jMTwvdHQ+LCB3aXRoIG5vIHNwYWNlcyBpbnRlcnZlbmluZwpiZXR3ZWVuIHRoZSBgPHR0PiM8L3R0PicgYW5kIHRoZSBgPHR0PjE8L3R0PicsIHRvIHB1c2ggdGhpcyBpbnRlZ2VyCmNvbnN0YW50LjwvcD4KCjxwPlRoZSBub25udWxsIHNwYWNpbmcgaGVyZSBpcyBhcmJpdHJhcnk6IG11bHRpcGxlIHNwYWNlcywgdGFicywgb3IgbmV3bGluZXMKYXJlIGVxdWl2YWxlbnQgdG8gYSBzaW5nbGUgb25lIChleGNlcHQgdGhhdCB5b3UncmUgcHJvYmFibHkgYmV0dGVyIG9mZiBub3QKaGF2aW5nIGJsYW5rIGxpbmVzIHdpdGhpbiBjb21tYW5kcywgYXMgZXhwbGFpbmVkIHNob3J0bHkpLjwvcD4KCjxwPkZvciBzdHJpbmcgY29uc3RhbnRzLCBhYnNvbHV0ZWx5IGFueSBwcmludGluZyBjaGFyYWN0ZXIgaXMgbGVnYWwgYmV0d2Vlbgp0d28gY29uc2VjdXRpdmUgZG91YmxlIHF1b3RlcywgYnV0IGhlcmUgKGFuZCBvbmx5IGhlcmUpIHRyZWF0cyB1cHBlci0gYW5kCmxvd2VyLWNhc2UgZXF1aXZhbGVudHMgYXMgZGlmZmVyZW50LiBGdXJ0aGVybW9yZSwgc3BhY2luZyA8aT5pczwvaT4gcmVsZXZhbnQKd2l0aGluIGEgc3RyaW5nIGNvbnN0YW50LCBhbmQgeW91IG11c3RuJ3Qgc3BsaXQgYSBzdHJpbmcgY29uc3RhbnQgYWNyb3NzCmxpbmVzICh0aGF0IGlzLCB0aGUgYmVnaW5uaW5nIGFuZCBlbmRpbmcgZG91YmxlIHF1b3RlcyBtdXN0IGJlIG9uIHRoZSBzYW1lCmxpbmUpLjwvcD4KCjxwPlZhcmlhYmxlIGFuZCBmdW5jdGlvbiBuYW1lcyBtYXkgbm90IGJlZ2luIHdpdGggYSBudW1lcmFsIGFuZCBtYXkgbm90CmNvbnRhaW4gYW55IG9mIHRoZSB0ZW4gcmVzdHJpY3RlZCBjaGFyYWN0ZXJzIG9uIHBhZ2UmbmJzcDsxNDMgb2YgdGhlCkw8c3VwPkE8L3N1cD5URVggYm9vaywgYnV0IG1heSBvdGhlcndpc2UgY29udGFpbiBhbnkgcHJpbnRpbmcgY2hhcmFjdGVycy4KQWxzbywgY29uc2lkZXJzIHVwcGVyLSBhbmQgbG93ZXItY2FzZSBlcXVpdmFsZW50cyB0byBiZSB0aGUgc2FtZS48L3A+Cgo8cD5JbnRlZ2VycyBhbmQgc3RyaW5ncyBhcmUgdGhlIG9ubHkgdmFsdWUgdHlwZXMgZm9yIGNvbnN0YW50cyBhbmQgdmFyaWFibGVzCihib29sZWFucyBhcmUgaW1wbGVtZW50ZWQgc2ltcGx5IGFzIDAtb3ItMSBpbnRlZ2VycykuIFRoZXJlIGFyZSB0aHJlZSBraW5kcwpvZiB2YXJpYWJsZXM6PC9wPgo8ZGw+CiAgPGR0PjxzdHJvbmc+Z2xvYmFsJm5ic3A7dmFyaWFibGVzPC9zdHJvbmc+PC9kdD4KICAgIDxkZD5UaGVzZSBhcmUgZWl0aGVyIGludGVnZXItIG9yIHN0cmluZy12YWx1ZWQsIGRlY2xhcmVkIHVzaW5nIGFuCiAgICAgIDx0dD5JTlRFR0VSUzwvdHQ+IG9yIDx0dD5TVFJJTkdTPC90dD4gY29tbWFuZC48L2RkPgogIDxkdD48c3Ryb25nPmVudHJ5Jm5ic3A7dmFyaWFibGVzPC9zdHJvbmc+PC9kdD4KICAgIDxkZD5UaGVzZSBhcmUgZWl0aGVyIGludGVnZXItIG9yIHN0cmluZy12YWx1ZWQsIGRlY2xhcmVkIHVzaW5nIHRoZQogICAgICA8dHQ+RU5UUlk8L3R0PiBjb21tYW5kLiBFYWNoIGhhcyBhIHZhbHVlIGZvciBlYWNoIGVudHJ5IG9uIHRoZSBsaXN0CiAgICAgIChleGFtcGxlOiBhIHZhcmlhYmxlIDx0dD5sYWJlbDwvdHQ+IG1pZ2h0IHN0b3JlIHRoZSBsYWJlbCBzdHJpbmcgeW91J2xsCiAgICAgIHVzZSBmb3IgdGhlIGVudHJ5KS48L2RkPgogIDxkdD48c3Ryb25nPmZpZWxkczwvc3Ryb25nPjwvZHQ+CiAgICA8ZGQ+PHA+VGhlc2UgYXJlIHN0cmluZy12YWx1ZWQsIHJlYWQtb25seSB2YXJpYWJsZXMgdGhhdCBzdG9yZSB0aGUKICAgICAgaW5mb3JtYXRpb24gZnJvbSB0aGUgZGF0YWJhc2UgZmlsZTsgdGhlaXIgdmFsdWVzIGFyZSBzZXQgYnkgdGhlCiAgICAgIDx0dD5SRUFEPC90dD4gY29tbWFuZC4gQXMgd2l0aCBlbnRyeSB2YXJpYWJsZXMsIGVhY2ggaGFzIGEgdmFsdWUgZm9yCiAgICAgIGVhY2ggZW50cnkuPC9wPgogICAgPC9kZD4KPC9kbD4KCjxoMz41LjIgQ29tbWFuZHM8L2gzPgoKPHA+VGhlcmUgYXJlIHRlbiBzdHlsZS1maWxlIGNvbW1hbmRzOiBGaXZlICg8dHQ+RU5UUlk8L3R0PiwKPHR0PkZVTkNUSU9OPC90dD4sIDx0dD5JTlRFR0VSUzwvdHQ+LCA8dHQ+TUFDUk88L3R0PiwgYW5kIDx0dD5TVFJJTkdTPC90dD4pCmRlY2xhcmUgYW5kIGRlZmluZSB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9uczsgb25lICg8dHQ+UkVBRDwvdHQ+KSByZWFkcyBpbiB0aGUKZGF0YWJhc2UgaW5mb3JtYXRpb247IGFuZCBmb3VyICg8dHQ+RVhFQ1VURTwvdHQ+LCA8dHQ+SVRFUkFURTwvdHQ+LAo8dHQ+UkVWRVJTRTwvdHQ+LCBhbmQgPHR0PlNPUlQ8L3R0PikgbWFuaXB1bGF0ZSB0aGUgZW50cmllcyBhbmQgcHJvZHVjZQpvdXRwdXQuIEFsdGhvdWdoIHRoZSBjb21tYW5kIG5hbWVzIGFwcGVhciBoZXJlIGluIHVwcGVyIGNhc2UsIGlnbm9yZXMgY2FzZQpkaWZmZXJlbmNlcy48L3A+Cgo8cD5Tb21lIHJlc3RyaWN0aW9uczogVGhlcmUgbXVzdCBiZSBleGFjdGx5IG9uZSA8dHQ+RU5UUlk8L3R0PiBhbmQgb25lCjx0dD5SRUFEPC90dD4gY29tbWFuZDsgdGhlIDx0dD5FTlRSWTwvdHQ+IGNvbW1hbmQsIGFsbCA8dHQ+TUFDUk88L3R0Pgpjb21tYW5kcywgYW5kIGNlcnRhaW4gPHR0PkZVTkNUSU9OPC90dD4gY29tbWFuZHMgKHNlZSBuZXh0IHN1YnNlY3Rpb24ncwpkZXNjcmlwdGlvbiBvZiA8dHQ+Y2FsbC50eXBlJDwvdHQ+KSBtdXN0IHByZWNlZGUgdGhlIDx0dD5SRUFEPC90dD4gY29tbWFuZDsKYW5kIHRoZSA8dHQ+UkVBRDwvdHQ+IGNvbW1hbmQgbXVzdCBwcmVjZWRlIHRoZSBmb3VyIHRoYXQgbWFuaXB1bGF0ZSB0aGUKZW50cmllcyBhbmQgcHJvZHVjZSBvdXRwdXQuPC9wPgoKPHA+QWxzbyBpdCdzIGJlc3QgKGJ1dCBub3QgZXNzZW50aWFsKSB0byBsZWF2ZSBhdCBsZWFzdCBvbmUgYmxhbmsgbGluZQpiZXR3ZWVuIGNvbW1hbmRzIGFuZCB0byBsZWF2ZSBubyBibGFuayBsaW5lcyB3aXRoaW4gYSBjb21tYW5kOyB0aGlzIGhlbHBzCnJlY292ZXIgZnJvbSBhbnkgc3ludGF4IGVycm9ycyB5b3UgbWFrZS48L3A+Cgo8cD5Zb3UgbXVzdCBlbmNsb3NlIGVhY2ggYXJndW1lbnQgb2YgZXZlcnkgY29tbWFuZCBpbiBicmFjZXMuIExvb2sgYXQgdGhlCnN0YW5kYXJkLXN0eWxlIGRvY3VtZW50YXRpb24gZm9yIHN5bnRhY3RpYyBpc3N1ZXMgbm90IGRlc2NyaWJlZCBpbiB0aGlzCnNlY3Rpb24uIEhlcmUgYXJlIHRoZSB0ZW4gY29tbWFuZHM6PC9wPgo8ZGw+CiAgPGR0Pjx0dD48c3Ryb25nPkVOVFJZPC9zdHJvbmc+PC90dD48L2R0PgogICAgPGRkPjxwPkRlY2xhcmVzIHRoZSBmaWVsZHMgYW5kIGVudHJ5IHZhcmlhYmxlcy4gSXQgaGFzIHRocmVlIGFyZ3VtZW50cywKICAgICAgZWFjaCBhIChwb3NzaWJseSBlbXB0eSkgbGlzdCBvZiB2YXJpYWJsZSBuYW1lcy4gVGhlIHRocmVlIGxpc3RzIGFyZSBvZjoKICAgICAgZmllbGRzLCBpbnRlZ2VyIGVudHJ5IHZhcmlhYmxlcywgYW5kIHN0cmluZyBlbnRyeSB2YXJpYWJsZXMuIFRoZXJlIGlzCiAgICAgIGFuIGFkZGl0aW9uYWwgZmllbGQgdGhhdDwvcD4KICAgIDwvZGQ+CiAgICA8ZGQ+PHA+YXV0b21hdGljYWxseSBkZWNsYXJlcywgPHR0PmNyb3NzcmVmPC90dD4sIHVzZWQgZm9yIGNyb3NzCiAgICAgIHJlZmVyZW5jaW5nLiBBbmQgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBzdHJpbmcgZW50cnkgdmFyaWFibGUKICAgICAgYXV0b21hdGljYWxseSBkZWNsYXJlZCwgPHR0PnNvcnQua2V5JDwvdHQ+LCB1c2VkIGJ5IHRoZSA8dHQ+U09SVDwvdHQ+CiAgICAgIGNvbW1hbmQuIEVhY2ggb2YgdGhlc2UgdmFyaWFibGVzIGhhcyBhIHZhbHVlIGZvciBlYWNoIGVudHJ5IG9uIHRoZQogICAgICBsaXN0LjwvcD4KICAgIDwvZGQ+CiAgPGR0PjxzdHJvbmc+PHR0PkVYRUNVVEU8L3R0Pjwvc3Ryb25nPjwvZHQ+CiAgICA8ZGQ+RXhlY3V0ZXMgYSBzaW5nbGUgZnVuY3Rpb24uIEl0IGhhcyBvbmUgYXJndW1lbnQsIHRoZSBmdW5jdGlvbgogICAgbmFtZS48L2RkPgogIDxkdD48c3Ryb25nPjx0dD5GVU5DVElPTjwvdHQ+PC9zdHJvbmc+PC9kdD4KICAgIDxkZD5EZWZpbmVzIGEgbmV3IGZ1bmN0aW9uLiBJdCBoYXMgdHdvIGFyZ3VtZW50czsgdGhlIGZpcnN0IGlzIHRoZQogICAgICBmdW5jdGlvbidzIG5hbWUgYW5kIHRoZSBzZWNvbmQgaXMgaXRzIGRlZmluaXRpb24uIFlvdSBtdXN0IGRlZmluZSBhCiAgICAgIGZ1bmN0aW9uIGJlZm9yZSB1c2luZyBpdDsgcmVjdXJzaXZlIGZ1bmN0aW9ucyBhcmUgdGh1cyBpbGxlZ2FsLjwvZGQ+CiAgPGR0PjxzdHJvbmc+PHR0PklOVEVHRVJTPC90dD48L3N0cm9uZz48L2R0PgogICAgPGRkPkRlY2xhcmVzIGdsb2JhbCBpbnRlZ2VyIHZhcmlhYmxlcy4gSXQgaGFzIG9uZSBhcmd1bWVudCwgYSBsaXN0IG9mCiAgICAgIHZhcmlhYmxlIG5hbWVzLiBUaGVyZSBhcmUgdHdvIHN1Y2ggYXV0b21hdGljYWxseS1kZWNsYXJlZCB2YXJpYWJsZXMsCiAgICAgIDx0dD5lbnRyeS5tYXgkPC90dD4gYW5kIDx0dD5nbG9iYWwubWF4JDwvdHQ+LCB1c2VkIGZvciBsaW1pdGluZyB0aGUKICAgICAgbGVuZ3RocyBvZiBzdHJpbmcgdmFyaWFibGVzLiBZb3UgbWF5IGhhdmUgYW55IG51bWJlciBvZiB0aGVzZSBjb21tYW5kcywKICAgICAgYnV0IGEgdmFyaWFibGUncyBkZWNsYXJhdGlvbiBtdXN0IHByZWNlZGUgaXRzIHVzZS48L2RkPgogIDxkdD48dHQ+PHN0cm9uZz5JVEVSQVRFPC9zdHJvbmc+PC90dD48L2R0PgogICAgPGRkPkV4ZWN1dGVzIGEgc2luZ2xlIGZ1bmN0aW9uLCBvbmNlIGZvciBlYWNoIGVudHJ5IGluIHRoZSBsaXN0LCBpbiB0aGUKICAgICAgbGlzdCdzIGN1cnJlbnQgb3JkZXIgKGluaXRpYWxseSB0aGUgbGlzdCBpcyBpbiBjaXRhdGlvbiBvcmRlciwgYnV0IHRoZQogICAgICA8dHQ+U09SVDwvdHQ+IGNvbW1hbmQgbWF5IGNoYW5nZSB0aGlzKS4gSXQgaGFzIG9uZSBhcmd1bWVudCwgdGhlCiAgICAgIGZ1bmN0aW9uIG5hbWUuPC9kZD4KICA8ZHQ+PHN0cm9uZz48dHQ+TUFDUk88L3R0Pjwvc3Ryb25nPjwvZHQ+CiAgICA8ZGQ+RGVmaW5lcyBhIHN0cmluZyBtYWNyby4gSXQgaGFzIHR3byBhcmd1bWVudHM7IHRoZSBmaXJzdCBpcyB0aGUKICAgICAgbWFjcm8ncyBuYW1lLCB3aGljaCBpcyB0cmVhdGVkIGxpa2UgYW55IG90aGVyIHZhcmlhYmxlIG9yIGZ1bmN0aW9uCiAgICAgIG5hbWUsIGFuZCB0aGUgc2Vjb25kIGlzIGl0cyBkZWZpbml0aW9uLCB3aGljaCBtdXN0IGJlCiAgICAgIGRvdWJsZS1xdW90ZS1kZWxpbWl0ZWQuIFlvdSBtdXN0IGhhdmUgb25lIGZvciBlYWNoIHRocmVlLWxldHRlciBtb250aAogICAgICBhYmJyZXZpYXRpb247IGluIGFkZGl0aW9uLCB5b3Ugc2hvdWxkIGhhdmUgb25lIGZvciBjb21tb24gam91cm5hbAogICAgICBuYW1lcy4gVGhlIHVzZXIncyBkYXRhYmFzZSBtYXkgb3ZlcnJpZGUgYW55IGRlZmluaXRpb24geW91IGRlZmluZSB1c2luZwogICAgICB0aGlzIGNvbW1hbmQuIElmIHlvdSB3YW50IHRvIGRlZmluZSBhIHN0cmluZyB0aGUgdXNlciBjYW4ndCB0b3VjaCwgdXNlCiAgICAgIHRoZSA8dHQ+RlVOQ1RJT048L3R0PiBjb21tYW5kLCB3aGljaCBoYXMgYSBjb21wYXRpYmxlIHN5bnRheC48L2RkPgogIDxkdD48c3Ryb25nPjx0dD5SRUFEPC90dD48L3N0cm9uZz48L2R0PgogICAgPGRkPkRyZWRnZXMgdXAgZnJvbSB0aGUgZGF0YWJhc2UgZmlsZSB0aGUgZmllbGQgdmFsdWVzIGZvciBlYWNoIGVudHJ5IGluCiAgICAgIHRoZSBsaXN0LiBJdCBoYXMgbm8gYXJndW1lbnRzLiBJZiBhIGRhdGFiYXNlIGVudHJ5IGRvZXNuJ3QgaGF2ZSBhIHZhbHVlCiAgICAgIGZvciBhIGZpZWxkIChhbmQgcHJvYmFibHkgbm8gZGF0YWJhc2UgZW50cnkgd2lsbCBoYXZlIGEgdmFsdWUgZm9yIGV2ZXJ5CiAgICAgIGZpZWxkKSwgdGhhdCBmaWVsZCB2YXJpYWJsZSBpcyBtYXJrZWQgYXMgbWlzc2luZyBmb3IgdGhlIGVudHJ5LjwvZGQ+CiAgPGR0Pjx0dD48c3Ryb25nPlJFVkVSU0U8L3N0cm9uZz48L3R0PjwvZHQ+CiAgICA8ZGQ+RXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgPHR0PklURVJBVEU8L3R0PiBjb21tYW5kIGV4Y2VwdCB0aGF0IGl0CiAgICAgIGV4ZWN1dGVzIHRoZSBmdW5jdGlvbiBvbiB0aGUgZW50cnkgbGlzdCBpbiByZXZlcnNlIG9yZGVyLjwvZGQ+CiAgPGR0Pjx0dD48c3Ryb25nPlNPUlQ8L3N0cm9uZz48L3R0PjwvZHQ+CiAgICA8ZGQ+U29ydHMgdGhlIGVudHJ5IGxpc3QgdXNpbmcgdGhlIHZhbHVlcyBvZiB0aGUgc3RyaW5nIGVudHJ5IHZhcmlhYmxlCiAgICAgIDx0dD5zb3J0LmtleSQ8L3R0Pi4gSXQgaGFzIG5vIGFyZ3VtZW50cy48L2RkPgogIDxkdD48dHQ+PHN0cm9uZz5TVFJJTkdTPC9zdHJvbmc+PC90dD48L2R0PgogICAgPGRkPjxwPkRlY2xhcmVzIGdsb2JhbCBzdHJpbmcgdmFyaWFibGVzLiBJdCBoYXMgb25lIGFyZ3VtZW50LCBhIGxpc3Qgb2YKICAgICAgdmFyaWFibGUgbmFtZXMuIFlvdSBtYXkgaGF2ZSBhbnkgbnVtYmVyIG9mIHRoZXNlIGNvbW1hbmRzLCBidXQgYQogICAgICB2YXJpYWJsZSdzIGRlY2xhcmF0aW9uIG11c3QgcHJlY2VkZSBpdHMgdXNlLjwvcD4KICAgIDwvZGQ+CjwvZGw+Cgo8aDM+NS4zIFRoZSBidWlsdC1pbiBmdW5jdGlvbnM8L2gzPgoKPHA+QmVmb3JlIHdlIGdldCB0byB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zLCBhIGZldyB3b3JkcyBhYm91dCBzb21lIG90aGVyCmJ1aWx0LWluIG9iamVjdHMuIFRoZXJlIGlzIG9uZSBidWlsdC1pbiBzdHJpbmcgZW50cnkgdmFyaWFibGUsCjx0dD5zb3J0LmtleSQ8L3R0Piwgd2hpY2ggdGhlIHN0eWxlIHByb2dyYW0gbXVzdCBzZXQgaWYgdGhlIHN0eWxlIGlzIHRvIGRvCnNvcnRpbmcuIFRoZXJlIGlzIG9uZSBidWlsdC1pbiBmaWVsZCwgPHR0PmNyb3NzcmVmPC90dD4sIHVzZWQgZm9yIHRoZSBjcm9zcwpyZWZlcmVuY2luZyBmZWF0dXJlIGRlc2NyaWJlZCBpbiBTZWN0aW9uJm5ic3A7NC4gQW5kIHRoZXJlIGFyZSB0d28gYnVpbHQtaW4KaW50ZWdlciBnbG9iYWwgdmFyaWFibGVzLCA8dHQ+ZW50cnkubWF4JDwvdHQ+IGFuZCA8dHQ+Z2xvYmFsLm1heCQ8L3R0Piwgd2hpY2gKYXJlIHNldCBieSBkZWZhdWx0IHRvIHNvbWUgaW50ZXJuYWwgY29uc3RhbnRzOyB5b3Ugc2hvdWxkIHRydW5jYXRlIHN0cmluZ3MgdG8KdGhlc2UgbGVuZ3RocyBiZWZvcmUgeW91IGFzc2lnbiB0byBzdHJpbmcgdmFyaWFibGVzLCBzbyBhcyB0byBub3QgZ2VuZXJhdGUKYW55IHdhcm5pbmcgbWVzc2FnZXMuPC9wPgoKPHA+VGhlcmUgYXJlIGN1cnJlbnRseSAzNyBidWlsdC1pbiBmdW5jdGlvbnMuIEV2ZXJ5IGJ1aWx0LWluIGZ1bmN0aW9uIHdpdGggYQpsZXR0ZXIgaW4gaXRzIG5hbWUgZW5kcyB3aXRoIGEgYDx0dD4kPC90dD4nLiBJbiB3aGF0IGZvbGxvd3MsIGBgZmlyc3QnJywKYGBzZWNvbmQnJywgYW5kIHNvIG9uIHJlZmVyIHRvIHRoZSBvcmRlciBwb3BwZWQuIEEgYGBsaXRlcmFsJycgaXMgYW4gZWxlbWVudApvbiB0aGUgc3RhY2ssIGFuZCBpdCB3aWxsIGJlIGVpdGhlciBhbiBpbnRlZ2VyIHZhbHVlLCBhIHN0cmluZyB2YWx1ZSwgYQp2YXJpYWJsZSBvciBmdW5jdGlvbiBuYW1lLCBvciBhIHNwZWNpYWwgdmFsdWUgZGVub3RpbmcgYSBtaXNzaW5nIGZpZWxkLiBJZgphbnkgcG9wcGVkIGxpdGVyYWwgaGFzIGFuIGluY29ycmVjdCB0eXBlLDwvcD4KCjxwPmNvbXBsYWlucyBhbmQgcHVzaGVzIHRoZSBpbnRlZ2VyIDAgb3IgdGhlIG51bGwgc3RyaW5nLCBkZXBlbmRpbmcgb24Kd2hldGhlciB0aGUgZnVuY3Rpb24gd2FzIHN1cHBvc2VkIHRvIHB1c2ggYW4gaW50ZWdlciBvciBzdHJpbmcuPC9wPgo8ZGw+CiAgPGR0PjxzdHJvbmc+PHR0PiZndDs8L3R0Pjwvc3Ryb25nPjwvZHQ+CiAgICA8ZGQ+UG9wcyB0aGUgdG9wIHR3byAoaW50ZWdlcikgbGl0ZXJhbHMsIGNvbXBhcmVzIHRoZW0sIGFuZCBwdXNoZXMgdGhlCiAgICAgIGludGVnZXIgMSBpZiB0aGUgc2Vjb25kIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZmlyc3QsIDAgb3RoZXJ3aXNlLjwvZGQ+CiAgPGR0PjxzdHJvbmc+PHR0PiZsdDs8L3R0Pjwvc3Ryb25nPjwvZHQ+CiAgICA8ZGQ+QW5hbG9nb3VzLjwvZGQ+CiAgPGR0Pjx0dD48c3Ryb25nPj08L3N0cm9uZz48L3R0PjwvZHQ+CiAgICA8ZGQ+UG9wcyB0aGUgdG9wIHR3byAoYm90aCBpbnRlZ2VyIG9yIGJvdGggc3RyaW5nKSBsaXRlcmFscywgY29tcGFyZXMKICAgICAgdGhlbSwgYW5kIHB1c2hlcyB0aGUgaW50ZWdlciAxIGlmIHRoZXkncmUgZXF1YWwsIDAgb3RoZXJ3aXNlLjwvZGQ+CiAgPGR0PjxzdHJvbmc+PHR0Pis8L3R0Pjwvc3Ryb25nPjwvZHQ+CiAgICA8ZGQ+UG9wcyB0aGUgdG9wIHR3byAoaW50ZWdlcikgbGl0ZXJhbHMgYW5kIHB1c2hlcyB0aGVpciBzdW0uPC9kZD4KICA8ZHQ+PHR0PjxzdHJvbmc+LTwvc3Ryb25nPjwvdHQ+PC9kdD4KICAgIDxkZD5Qb3BzIHRoZSB0b3AgdHdvIChpbnRlZ2VyKSBsaXRlcmFscyBhbmQgcHVzaGVzIHRoZWlyIGRpZmZlcmVuY2UgKHRoZQogICAgICBmaXJzdCBzdWJ0cmFjdGVkIGZyb20gdGhlIHNlY29uZCkuPC9kZD4KICA8ZHQ+PHN0cm9uZz48dHQ+KjwvdHQ+PC9zdHJvbmc+PC9kdD4KICAgIDxkZD5Qb3BzIHRoZSB0b3AgdHdvIChzdHJpbmcpIGxpdGVyYWxzLCBjb25jYXRlbmF0ZXMgdGhlbSAoaW4gcmV2ZXJzZQogICAgICBvcmRlciwgdGhhdCBpcywgdGhlIG9yZGVyIGluIHdoaWNoIHB1c2hlZCksIGFuZCBwdXNoZXMgdGhlIHJlc3VsdGluZwogICAgICBzdHJpbmcuPC9kZD4KICA8ZHQ+PHN0cm9uZz48dHQ+Oj08L3R0Pjwvc3Ryb25nPjwvZHQ+CiAgICA8ZGQ+UG9wcyB0aGUgdG9wIHR3byBsaXRlcmFscyBhbmQgYXNzaWducyB0byB0aGUgZmlyc3QgKHdoaWNoIG11c3QgYmUgYQogICAgICBnbG9iYWwgb3IgZW50cnkgdmFyaWFibGUpIHRoZSB2YWx1ZSBvZiB0aGUgc2Vjb25kLjwvZGQ+CiAgPGR0Pjx0dD48c3Ryb25nPmFkZC5wZXJpb2QkPC9zdHJvbmc+PC90dD48L2R0PgogICAgPGRkPlBvcHMgdGhlIHRvcCAoc3RyaW5nKSBsaXRlcmFsLCBhZGRzIGEgYDx0dD4uPC90dD4nIHRvIGl0IGlmIHRoZSBsYXN0CiAgICAgIG5vbmA8dHQ+fTwvdHQ+JyBjaGFyYWN0ZXIgaXNuJ3QgYSBgPHR0Pi48L3R0PicsIGA8dHQ+PzwvdHQ+Jywgb3IKICAgICAgYDx0dD4hPC90dD4nLCBhbmQgcHVzaGVzIHRoaXMgcmVzdWx0aW5nIHN0cmluZy48L2RkPgogIDxkdD48c3Ryb25nPjx0dD5jYWxsLnR5cGUkPC90dD48L3N0cm9uZz48L2R0PgogICAgPGRkPkV4ZWN1dGVzIHRoZSBmdW5jdGlvbiB3aG9zZSBuYW1lIGlzIHRoZSBlbnRyeSB0eXBlIG9mIGFuIGVudHJ5LiBGb3IKICAgICAgZXhhbXBsZSBpZiBhbiBlbnRyeSBpcyBvZiB0eXBlIDx0dD5ib29rPC90dD4sIHRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMKICAgICAgdGhlIDx0dD5ib29rPC90dD4gZnVuY3Rpb24uIFdoZW4gZ2l2ZW4gYXMgYW4gYXJndW1lbnQgdG8gdGhlCiAgICAgIDx0dD5JVEVSQVRFPC90dD4gY29tbWFuZCwgPHR0PmNhbGwudHlwZSQ8L3R0PiBhY3R1YWxseSBwcm9kdWNlcyB0aGUKICAgICAgb3V0cHV0IGZvciB0aGUgZW50cmllcy4gRm9yIGFuIGVudHJ5IHdpdGggYW4gdW5rbm93biB0eXBlLCBpdCBleGVjdXRlcwogICAgICB0aGUgZnVuY3Rpb24gPHR0PmRlZmF1bHQudHlwZTwvdHQ+LiBUaHVzIHlvdSBzaG91bGQgZGVmaW5lIChiZWZvcmUgdGhlCiAgICAgIDx0dD5SRUFEPC90dD4gY29tbWFuZCkgb25lIGZ1bmN0aW9uIGZvciBlYWNoIHN0YW5kYXJkIGVudHJ5IHR5cGUgYXMKICAgICAgd2VsbCBhcyBhIDx0dD5kZWZhdWx0LnR5cGU8L3R0PiBmdW5jdGlvbi48L2RkPgogIDxkdD48dHQ+PHN0cm9uZz5jaGFuZ2UuY2FzZSQ8L3N0cm9uZz48L3R0PjwvZHQ+CiAgICA8ZGQ+UG9wcyB0aGUgdG9wIHR3byAoc3RyaW5nKSBsaXRlcmFsczsgaXQgY2hhbmdlcyB0aGUgY2FzZSBvZiB0aGUgc2Vjb25kCiAgICAgIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbnMgb2YgdGhlIGZpcnN0LCBhcyBmb2xsb3dzLiAoTm90ZTogVGhlCiAgICAgIHdvcmQgYGxldHRlcnMnIGluIHRoZSBuZXh0IHNlbnRlbmNlIHJlZmVycyBvbmx5IHRvIHRob3NlIGF0CiAgICAgIGJyYWNlLWxldmVsJm5ic3A7MCwgdGhlIHRvcC1tb3N0IGJyYWNlIGxldmVsOyBubyBvdGhlciBjaGFyYWN0ZXJzIGFyZQogICAgICBjaGFuZ2VkLCBleGNlcHQgcGVyaGFwcyBmb3IgYGBzcGVjaWFsIGNoYXJhY3RlcnMnJywgZGVzY3JpYmVkIGluCiAgICAgIFNlY3Rpb24mbmJzcDs0LikgSWYgdGhlIGZpcnN0IGxpdGVyYWwgaXMgdGhlIHN0cmluZyZuYnNwO2A8dHQ+dDwvdHQ+JywKICAgICAgaXQgY29udmVydHMgdG8gbG93ZXIgY2FzZSBhbGwgbGV0dGVycyBleGNlcHQgdGhlIHZlcnkgZmlyc3QgY2hhcmFjdGVyCiAgICAgIGluIHRoZSBzdHJpbmcsIHdoaWNoIGl0IGxlYXZlcyBhbG9uZSwgYW5kIGV4Y2VwdCB0aGUgZmlyc3QgY2hhcmFjdGVyCiAgICAgIGZvbGxvd2luZyBhbnkgY29sb24gYW5kIHRoZW4gbm9ubnVsbCB3aGl0ZSBzcGFjZSwgd2hpY2ggaXQgYWxzbyBsZWF2ZXMKICAgICAgYWxvbmU7IGlmIGl0J3MgdGhlIHN0cmluZyZuYnNwO2A8dHQ+bDwvdHQ+JywgaXQgY29udmVydHMgYWxsIGxldHRlcnMgdG8KICAgICAgbG93ZXIgY2FzZTsgYW5kIGlmIGl0J3MgdGhlIHN0cmluZyZuYnNwO2A8dHQ+dTwvdHQ+JywgaXQgY29udmVydHMgYWxsCiAgICAgIGxldHRlcnMgdG8gdXBwZXIgY2FzZS4gSXQgdGhlbiBwdXNoZXMgdGhpcyByZXN1bHRpbmcgc3RyaW5nLiBJZiBlaXRoZXIKICAgICAgdHlwZSBpcyBpbmNvcnJlY3QsIGl0IGNvbXBsYWlucyBhbmQgcHVzaGVzIHRoZSBudWxsIHN0cmluZzsgaG93ZXZlciwgaWYKICAgICAgYm90aCB0eXBlcyBhcmUgY29ycmVjdCBidXQgdGhlIHNwZWNpZmljYXRpb24gc3RyaW5nIChpLmUuLCB0aGUgZmlyc3QKICAgICAgc3RyaW5nKSBpc24ndCBvbmUgb2YgdGhlIGxlZ2FsIG9uZXMsIGl0IG1lcmVseSBwdXNoZXMgdGhlIHNlY29uZCBiYWNrCiAgICAgIG9udG8gdGhlIHN0YWNrLCBhZnRlciBjb21wbGFpbmluZy4gKEFub3RoZXIgbm90ZTogSXQgaWdub3JlcyBjYXNlCiAgICAgIGRpZmZlcmVuY2VzIGluIHRoZSBzcGVjaWZpY2F0aW9uIHN0cmluZzsgZm9yIGV4YW1wbGUsIHRoZSBzdHJpbmdzCiAgICAgIDx0dD50PC90dD4gYW5kIDx0dD5UPC90dD4gYXJlIGVxdWl2YWxlbnQgZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzCiAgICAgIGJ1aWx0LWluIGZ1bmN0aW9uLik8L2RkPgogIDxkdD48dHQ+PHN0cm9uZz5jaHIudG8uaW50JDwvc3Ryb25nPjwvdHQ+PC9kdD4KICAgIDxkZD5Qb3BzIHRoZSB0b3AgKHN0cmluZykgbGl0ZXJhbCwgbWFrZXMgc3VyZSBpdCdzIGEgc2luZ2xlIGNoYXJhY3RlciwKICAgICAgY29udmVydHMgaXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgQVNDSUkgaW50ZWdlciwgYW5kIHB1c2hlcyB0aGlzCiAgICBpbnRlZ2VyLjwvZGQ+CiAgPGR0PjxzdHJvbmc+PHR0PmNpdGUkPC90dD48L3N0cm9uZz48L2R0PgogICAgPGRkPlB1c2hlcyB0aGUgc3RyaW5nIHRoYXQgd2FzIHRoZSA8Y29kZT5cY2l0ZTwvY29kZT4tY29tbWFuZCBhcmd1bWVudAogICAgICBmb3IgdGhpcyBlbnRyeS48L2RkPgogIDxkdD48c3Ryb25nPjx0dD5kdXBsaWNhdGUkPC90dD48L3N0cm9uZz48L2R0PgogICAgPGRkPlBvcHMgdGhlIHRvcCBsaXRlcmFsIGZyb20gdGhlIHN0YWNrIGFuZCBwdXNoZXMgdHdvIGNvcGllcyBvZiBpdC48L2RkPgogIDxkdD48c3Ryb25nPjx0dD5lbXB0eSQ8L3R0Pjwvc3Ryb25nPjwvZHQ+CiAgICA8ZGQ+UG9wcyB0aGUgdG9wIGxpdGVyYWwgYW5kIHB1c2hlcyB0aGUgaW50ZWdlciAxIGlmIGl0J3MgYSBtaXNzaW5nIGZpZWxkCiAgICAgIG9yIGEgc3RyaW5nIGhhdmluZyBubyBub24td2hpdGUtc3BhY2UgY2hhcmFjdGVycywgMCBvdGhlcndpc2UuPC9kZD4KICA8ZHQ+PHN0cm9uZz48dHQ+Zm9ybWF0Lm5hbWUkPC90dD48L3N0cm9uZz48L2R0PgogICAgPGRkPlBvcHMgdGhlIHRvcCB0aHJlZSBsaXRlcmFscyAodGhleSBhcmUgYSBzdHJpbmcsIGFuIGludGVnZXIsIGFuZCBhCiAgICAgIHN0cmluZyBsaXRlcmFsKS4gVGhlIGxhc3Qgc3RyaW5nIGxpdGVyYWwgcmVwcmVzZW50cyBhIG5hbWUgbGlzdCAoZWFjaAogICAgICBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gYSBwZXJzb24pLCB0aGUgaW50ZWdlciBsaXRlcmFsIHNwZWNpZmllcyB3aGljaAogICAgICBuYW1lIHRvIHBpY2sgZnJvbSB0aGlzIGxpc3QsIGFuZCB0aGUgZmlyc3Qgc3RyaW5nIGxpdGVyYWwgc3BlY2lmaWVzIGhvdwogICAgICB0byBmb3JtYXQgdGhpcyBuYW1lLCBhcyBleHBsYWluZWQgaW4gdGhlIG5leHQgc3Vic2VjdGlvbi4gRmluYWxseSwgdGhpcwogICAgICBmdW5jdGlvbiBwdXNoZXMgdGhlIGZvcm1hdHRlZCBuYW1lLjwvZGQ+CiAgPGR0Pjx0dD48c3Ryb25nPmlmJDwvc3Ryb25nPjwvdHQ+PC9kdD4KICAgIDxkZD5Qb3BzIHRoZSB0b3AgdGhyZWUgbGl0ZXJhbHMgKHRoZXkgYXJlIHR3byBmdW5jdGlvbiBsaXRlcmFscyBhbmQgYW4KICAgICAgaW50ZWdlciBsaXRlcmFsLCBpbiB0aGF0IG9yZGVyKTsgaWYgdGhlIGludGVnZXIgaXMgZ3JlYXRlciB0aGFuIDAsIGl0CiAgICAgIGV4ZWN1dGVzIHRoZSBzZWNvbmQgbGl0ZXJhbCwgZWxzZSBpdCBleGVjdXRlcyB0aGUgZmlyc3QuPC9kZD4KICA8ZHQ+PHR0PjxzdHJvbmc+aW50LnRvLmNociQ8L3N0cm9uZz48L3R0PjwvZHQ+CiAgICA8ZGQ+UG9wcyB0aGUgdG9wIChpbnRlZ2VyKSBsaXRlcmFsLCBpbnRlcnByZXRlZCBhcyB0aGUgQVNDSUkgaW50ZWdlcgogICAgICB2YWx1ZSBvZiBhIHNpbmdsZSBjaGFyYWN0ZXIsIGNvbnZlcnRzIGl0IHRvIHRoZSBjb3JyZXNwb25kaW5nCiAgICAgIHNpbmdsZS1jaGFyYWN0ZXIgc3RyaW5nLCBhbmQgcHVzaGVzIHRoaXMgc3RyaW5nLjwvZGQ+CiAgPGR0PjxzdHJvbmc+PHR0PmludC50by5zdHIkPC90dD48L3N0cm9uZz48L2R0PgogICAgPGRkPlBvcHMgdGhlIHRvcCAoaW50ZWdlcikgbGl0ZXJhbCwgY29udmVydHMgaXQgdG8gaXRzICh1bmlxdWUpIHN0cmluZwogICAgICBlcXVpdmFsZW50LCBhbmQgcHVzaGVzIHRoaXMgc3RyaW5nLjwvZGQ+CiAgPGR0PjxzdHJvbmc+PHR0Pm1pc3NpbmckPC90dD48L3N0cm9uZz48L2R0PgogICAgPGRkPlBvcHMgdGhlIHRvcCBsaXRlcmFsIGFuZCBwdXNoZXMgdGhlIGludGVnZXIgMSBpZiBpdCdzIGEgbWlzc2luZwogICAgICBmaWVsZCwgMCZuYnNwO290aGVyd2lzZS48L2RkPgogIDxkdD48c3Ryb25nPjx0dD5uZXdsaW5lJDwvdHQ+PC9zdHJvbmc+PC9kdD4KICAgIDxkZD5Xcml0ZXMgb250byB0aGUgPHR0PmJibDwvdHQ+IGZpbGUgd2hhdCdzIGFjY3VtdWxhdGVkIGluIHRoZSBvdXRwdXQKICAgICAgYnVmZmVyLiBJdCB3cml0ZXMgYSBibGFuayBsaW5lIGlmIGFuZCBvbmx5IGlmIHRoZSBvdXRwdXQgYnVmZmVyIGlzCiAgICAgIGVtcHR5LiBTaW5jZSA8dHQ+d3JpdGUkPC90dD4gZG9lcyByZWFzb25hYmxlIGxpbmUgYnJlYWtpbmcsIHlvdSBzaG91bGQKICAgICAgdXNlIHRoaXMgZnVuY3Rpb24gb25seSB3aGVuIHlvdSB3YW50IGEgYmxhbmsgbGluZSBvciBhbiBleHBsaWNpdCBsaW5lCiAgICAgIGJyZWFrLjwvZGQ+CiAgPGR0Pjx0dD48c3Ryb25nPm51bS5uYW1lcyQ8L3N0cm9uZz48L3R0PjwvZHQ+CiAgICA8ZGQ+UG9wcyB0aGUgdG9wIChzdHJpbmcpIGxpdGVyYWwgYW5kIHB1c2hlcyB0aGUgbnVtYmVyIG9mIG5hbWVzIHRoZQogICAgICBzdHJpbmcgcmVwcmVzZW50cy0tb25lIHBsdXMgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiB0aGUgc3Vic3RyaW5nCiAgICAgIGBgYW5kJycgKGlnbm9yaW5nIGNhc2UgZGlmZmVyZW5jZXMpIHN1cnJvdW5kZWQgYnkgbm9ubnVsbCB3aGl0ZS1zcGFjZQogICAgICBhdCB0aGUgdG9wIGJyYWNlIGxldmVsLjwvZGQ+CiAgPGR0PjxzdHJvbmc+PHR0PnBvcCQ8L3R0Pjwvc3Ryb25nPjwvZHQ+CiAgICA8ZGQ+UG9wcyB0aGUgdG9wIG9mIHRoZSBzdGFjayBidXQgZG9lc24ndCBwcmludCBpdDsgdGhpcyBnZXRzIHJpZCBvZiBhbgogICAgICB1bndhbnRlZCBzdGFjayBsaXRlcmFsLjwvZGQ+CiAgPGR0PjxzdHJvbmc+PHR0PnByZWFtYmxlJDwvdHQ+PC9zdHJvbmc+PC9kdD4KICAgIDxkZD5QdXNoZXMgb250byB0aGUgc3RhY2sgdGhlIGNvbmNhdGVuYXRpb24gb2YgYWxsIHRoZSA8dHQ+QFBSRUFNQkxFPC90dD4KICAgICAgc3RyaW5ncyByZWFkIGZyb20gdGhlIGRhdGFiYXNlIGZpbGVzLjwvZGQ+CiAgPGR0PjxzdHJvbmc+PHR0PnB1cmlmeSQ8L3R0Pjwvc3Ryb25nPjwvZHQ+CiAgICA8ZGQ+UG9wcyB0aGUgdG9wIChzdHJpbmcpIGxpdGVyYWwsIHJlbW92ZXMgbm9uYWxwaGFudW1lcmljIGNoYXJhY3RlcnMKICAgICAgZXhjZXB0IGZvciB3aGl0ZS1zcGFjZSBjaGFyYWN0ZXJzIGFuZCBoeXBoZW5zIGFuZCB0aWVzICh0aGVzZSBhbGwgZ2V0CiAgICAgIGNvbnZlcnRlZCB0byBhIHNwYWNlKSwgcmVtb3ZlcyBjZXJ0YWluIGFscGhhYmV0aWMgY2hhcmFjdGVycyBjb250YWluZWQKICAgICAgaW4gdGhlIGNvbnRyb2wgc2VxdWVuY2VzIGFzc29jaWF0ZWQgd2l0aCBhIGBgc3BlY2lhbCBjaGFyYWN0ZXInJywgYW5kCiAgICAgIHB1c2hlcyB0aGUgcmVzdWx0aW5nIHN0cmluZy48L2RkPgogIDxkdD48c3Ryb25nPjx0dD5xdW90ZSQ8L3R0Pjwvc3Ryb25nPjwvZHQ+CiAgICA8ZGQ+UHVzaGVzIHRoZSBzdHJpbmcgY29uc2lzdGluZyBvZiB0aGUgZG91YmxlLXF1b3RlIGNoYXJhY3Rlci48L2RkPgogIDxkdD48dHQ+PHN0cm9uZz5za2lwJDwvc3Ryb25nPjwvdHQ+PC9kdD4KICAgIDxkZD5JcyBhIG5vLW9wLjwvZGQ+CiAgPGR0PjxzdHJvbmc+PHR0PnN0YWNrJDwvdHQ+PC9zdHJvbmc+PC9kdD4KICAgIDxkZD5Qb3BzIGFuZCBwcmludHMgdGhlIHdob2xlIHN0YWNrOyBpdCdzIG1lYW50IHRvIGJlIHVzZWQgZm9yIHN0eWxlCiAgICAgIGRlc2lnbmVycyB3aGlsZSBkZWJ1Z2dpbmcuPC9kZD4KICA8ZHQ+PHR0PjxzdHJvbmc+c3Vic3RyaW5nJDwvc3Ryb25nPjwvdHQ+PC9kdD4KICAgIDxkZD5Qb3BzIHRoZSB0b3AgdGhyZWUgbGl0ZXJhbHMgKHRoZXkgYXJlIHRoZSB0d28gaW50ZWdlcnMgbGl0ZXJhbHMKICAgICAgPGk+bGVuPC9pPiBhbmQgPGk+c3RhcnQ8L2k+LCBhbmQgYSBzdHJpbmcgbGl0ZXJhbCwgaW4gdGhhdCBvcmRlcikuIEl0CiAgICAgIHB1c2hlcyB0aGUgc3Vic3RyaW5nIG9mIHRoZSAoYXQgbW9zdCkgPGk+bGVuPC9pPiBjb25zZWN1dGl2ZSBjaGFyYWN0ZXJzCiAgICAgIHN0YXJ0aW5nIGF0IHRoZSA8aT5zdGFydDwvaT50aCBjaGFyYWN0ZXIgKGFzc3VtaW5nIDEtYmFzZWQgaW5kZXhpbmcpIGlmCiAgICAgIDxpPnN0YXJ0PC9pPiBpcyBwb3NpdGl2ZSwgYW5kIGVuZGluZyBhdCB0aGU8aT4gc3RhcnQ8L2k+dGggY2hhcmFjdGVyCiAgICAgIGZyb20gdGhlIGVuZCBpZiA8aT5zdGFydDwvaT4gaXMgbmVnYXRpdmUgKHdoZXJlIHRoZSBmaXJzdCBjaGFyYWN0ZXIKICAgICAgZnJvbSB0aGUgZW5kIGlzIHRoZSBsYXN0IGNoYXJhY3RlcikuPC9kZD4KICA8ZHQ+PHR0PjxzdHJvbmc+c3dhcCQ8L3N0cm9uZz48L3R0PjwvZHQ+CiAgICA8ZGQ+U3dhcHMgdGhlIHRvcCB0d28gbGl0ZXJhbHMgb24gdGhlIHN0YWNrLjwvZGQ+CiAgPGR0PjxzdHJvbmc+PHR0PnRleHQubGVuZ3RoJDwvdHQ+PC9zdHJvbmc+PC9kdD4KICAgIDxkZD5Qb3BzIHRoZSB0b3AgKHN0cmluZykgbGl0ZXJhbCwgYW5kIHB1c2hlcyB0aGUgbnVtYmVyIG9mIHRleHQKICAgICAgY2hhcmFjdGVycyBpdCBjb250YWlucywgd2hlcmUgYW4gYWNjZW50ZWQgY2hhcmFjdGVyIChtb3JlIHByZWNpc2VseSwgYQogICAgICBgYHNwZWNpYWwgY2hhcmFjdGVyJycsIGRlZmluZWQgaW4gU2VjdGlvbiZuYnNwOzQpIGNvdW50cyBhcyBhIHNpbmdsZQogICAgICB0ZXh0IGNoYXJhY3RlciwgZXZlbiBpZiBpdCdzIG1pc3NpbmcgaXRzIG1hdGNoaW5nIHJpZ2h0IGJyYWNlLCBhbmQKICAgICAgd2hlcmUgYnJhY2VzIGRvbid0IGNvdW50IGFzIHRleHQgY2hhcmFjdGVycy48L2RkPgogIDxkdD48c3Ryb25nPjx0dD50ZXh0LnByZWZpeCQ8L3R0Pjwvc3Ryb25nPjwvZHQ+CiAgICA8ZGQ+UG9wcyB0aGUgdG9wIHR3byBsaXRlcmFscyAodGhlIGludGVnZXIgbGl0ZXJhbCA8aT5sZW48L2k+IGFuZCBhCiAgICAgIHN0cmluZyBsaXRlcmFsLCBpbiB0aGF0IG9yZGVyKS4gSXQgcHVzaGVzIHRoZSBzdWJzdHJpbmcgb2YgdGhlIChhdAogICAgICBtb3N0KSA8aT5sZW48L2k+IGNvbnNlY3V0aXZlIHRleHQgY2hhcmFjdGVycyBzdGFydGluZyBmcm9tIHRoZQogICAgICBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZy4gVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvCiAgICAgIDx0dD5zdWJzdHJpbmckPC90dD4sIGJ1dCB0aGlzIG9uZSBjb25zaWRlcnMgYSBgYHNwZWNpYWwgY2hhcmFjdGVyJycsCiAgICAgIGV2ZW4gaWYgaXQncyBtaXNzaW5nIGl0cyBtYXRjaGluZyByaWdodCBicmFjZSwgdG8gYmUgYSBzaW5nbGUgdGV4dAogICAgICBjaGFyYWN0ZXIgKHJhdGhlciB0aGFuIGhvd2V2ZXIgbWFueSBBU0NJSSBjaGFyYWN0ZXJzIGl0IGFjdHVhbGx5CiAgICAgIGNvbXByaXNlcyksIGFuZCB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY29uc2lkZXIgYnJhY2VzIHRvIGJlIHRleHQKICAgICAgY2hhcmFjdGVyczsgZnVydGhlcm1vcmUsIHRoaXMgZnVuY3Rpb24gYXBwZW5kcyBhbnkgbmVlZGVkIG1hdGNoaW5nCiAgICAgIHJpZ2h0IGJyYWNlcy48L2RkPgogIDxkdD48dHQ+PHN0cm9uZz50b3AkPC9zdHJvbmc+PC90dD48L2R0PgogICAgPGRkPlBvcHMgYW5kIHByaW50cyB0aGUgdG9wIG9mIHRoZSBzdGFjayBvbiB0aGUgdGVybWluYWwgYW5kIGxvZyBmaWxlLgogICAgICBJdCdzIHVzZWZ1bCBmb3IgZGVidWdnaW5nLjwvZGQ+CiAgPGR0PjxzdHJvbmc+PHR0PnR5cGUkPC90dD48L3N0cm9uZz48L2R0PgogICAgPGRkPlB1c2hlcyB0aGUgY3VycmVudCBlbnRyeSdzIHR5cGUgKGJvb2ssIGFydGljbGUsIGV0Yy4pLCBidXQgcHVzaGVzIHRoZQogICAgICBudWxsIHN0cmluZyBpZiB0aGUgdHlwZSBpcyBlaXRoZXIgdW5rbm93biBvciB1bmRlZmluZWQuPC9kZD4KICA8ZHQ+PHR0PjxzdHJvbmc+d2FybmluZyQ8L3N0cm9uZz48L3R0PjwvZHQ+CiAgICA8ZGQ+UG9wcyB0aGUgdG9wIChzdHJpbmcpIGxpdGVyYWwgYW5kIHByaW50cyBpdCBmb2xsb3dpbmcgYSB3YXJuaW5nCiAgICAgIG1lc3NhZ2UuIFRoaXMgYWxzbyBpbmNyZW1lbnRzIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiB3YXJuaW5nIG1lc3NhZ2VzCiAgICAgIGlzc3VlZC48L2RkPgogIDxkdD48c3Ryb25nPjx0dD53aGlsZSQ8L3R0Pjwvc3Ryb25nPjwvZHQ+CiAgICA8ZGQ+UG9wcyB0aGUgdG9wIHR3byAoZnVuY3Rpb24pIGxpdGVyYWxzLCBhbmQga2VlcHMgZXhlY3V0aW5nIHRoZSBzZWNvbmQKICAgICAgYXMgbG9uZyBhcyB0aGUgKGludGVnZXIpIGxpdGVyYWwgbGVmdCBvbiB0aGUgc3RhY2sgYnkgZXhlY3V0aW5nIHRoZQogICAgICBmaXJzdCBpcyBncmVhdGVyIHRoYW4gMC48L2RkPgogIDxkdD48c3Ryb25nPjx0dD53aWR0aCQ8L3R0Pjwvc3Ryb25nPjwvZHQ+CiAgICA8ZGQ+UG9wcyB0aGUgdG9wIChzdHJpbmcpIGxpdGVyYWwgYW5kIHB1c2hlcyB0aGUgaW50ZWdlciB0aGF0IHJlcHJlc2VudHMKICAgICAgaXRzIHdpZHRoIGluIHNvbWUgcmVsYXRpdmUgdW5pdHMgKGN1cnJlbnRseSwgaHVuZHJlZHRocyBvZiBhIHBvaW50LCBhcwogICAgICBzcGVjaWZpZWQgYnkgdGhlIEp1bmUgMTk4NyB2ZXJzaW9uIG9mIHRoZSAgZm9udDsgdGhlIG9ubHkgd2hpdGUtc3BhY2UKICAgICAgY2hhcmFjdGVyIHdpdGggbm9uemVybyB3aWR0aCBpcyB0aGUgc3BhY2UpLiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZQogICAgICBsaXRlcmFsIGxpdGVyYWxseTsgdGhhdCBpcywgaXQgYXNzdW1lcyBlYWNoIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nIGlzCiAgICAgIHRvIGJlIHByaW50ZWQgYXMgaXMsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgY2hhcmFjdGVyIGhhcyBhIHNwZWNpYWwKICAgICAgbWVhbmluZyB0byBURVgsIGV4Y2VwdCB0aGF0IGBgc3BlY2lhbCBjaGFyYWN0ZXJzJycgKGV2ZW4gd2l0aG91dCB0aGVpcgogICAgICByaWdodCBicmFjZXMpIGFyZSBoYW5kbGVkIHNwZWNpYWxseS4gVGhpcyBpcyBtZWFudCB0byBiZSB1c2VkIGZvcgogICAgICBjb21wYXJpbmcgd2lkdGhzIG9mIGxhYmVsIHN0cmluZ3MuPC9kZD4KICA8ZHQ+PHN0cm9uZz48dHQ+d3JpdGUkPC90dD48L3N0cm9uZz48L2R0PgogICAgPGRkPjxwPlBvcHMgdGhlIHRvcCAoc3RyaW5nKSBsaXRlcmFsIGFuZCB3cml0ZXMgaXQgb24gdGhlIG91dHB1dCBidWZmZXIKICAgICAgKHdoaWNoIHdpbGwgcmVzdWx0IGluIHN0dWZmIGJlaW5nIHdyaXR0ZW4gb250byB0aGUgPHR0PmJibDwvdHQ+IGZpbGUKICAgICAgd2hlbiB0aGUgYnVmZmVyIGZpbGxzIHVwKS48L3A+CiAgICA8L2RkPgo8L2RsPgoKPHA+Tm90ZSB0aGF0IHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgPHR0PndoaWxlJDwvdHQ+IGFuZCA8dHQ+aWYkPC90dD4gcmVxdWlyZQp0d28gZnVuY3Rpb24gbGl0ZXJhbHMgb24gdGhlIHN0YWNrLiBZb3UgZ2V0IHRoZW0gdGhlcmUgZWl0aGVyIGJ5IGltbWVkaWF0ZWx5CnByZWNlZGluZyB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIGJ5IGEgc2luZ2xlIHF1b3RlLCBvciwgaWYgeW91IGRvbid0IGZlZWwKbGlrZSBkZWZpbmluZyBhIG5ldyBmdW5jdGlvbiB3aXRoIHRoZSA8dHQ+RlVOQ1RJT048L3R0PiBjb21tYW5kLCBieSBzaW1wbHkKZ2l2aW5nIGl0cyBkZWZpbml0aW9uICh0aGF0IGlzLCBnaXZpbmcgd2hhdCB3b3VsZCBiZSB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvCnRoZSA8dHQ+RlVOQ1RJT048L3R0PiBjb21tYW5kLCBpbmNsdWRpbmcgdGhlIHN1cnJvdW5kaW5nIGJyYWNlcykuIEZvciBleGFtcGxlCnRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gZnJhZ21lbnQgYXBwZW5kcyB0aGUgY2hhcmFjdGVyIGA8dHQ+YTwvdHQ+JyBpZiB0aGUKc3RyaW5nIHZhcmlhYmxlIG5hbWVkIDx0dD5sYWJlbDwvdHQ+IGlzIG5vbm51bGw6PC9wPgo8cHJlPiAgICAuICAuICAuCiAgICBsYWJlbCAiIiA9CiAgICAgICdza2lwJAogICAgICB7IGxhYmVsICJhIiAqICdsYWJlbCA6PSB9CiAgICBpZiQKICAgIC4gIC4gIC48L3ByZT4KCjxwPkEgZnVuY3Rpb24gd2hvc2UgbmFtZSB5b3UgcXVvdGUgbmVlZG4ndCBiZSBidWlsdCBpbiBsaWtlIDx0dD5za2lwJDwvdHQ+CmFib3ZlLS1pdCBtYXksIGZvciBleGFtcGxlLCBiZSBhIGZpZWxkIG5hbWUgb3IgYSBmdW5jdGlvbiB5b3UndmUgZGVmaW5lZAplYXJsaWVyLjwvcD4KCjxoMz41LjQgTmFtZSBmb3JtYXR0aW5nPC9oMz4KCjxwPldoYXQncyBpbiBhIG5hbWU/IFNlY3Rpb24mbmJzcDs0IHByZXR0eSBtdWNoIGRlc2NyaWJlcyB0aGlzLiBFYWNoIG5hbWUKY29uc2lzdHMgb2YgZm91ciBwYXJ0czogRmlyc3QsIHZvbiwgTGFzdCwgYW5kIEpyOyBlYWNoIGNvbnNpc3RzIG9mIGEgbGlzdCBvZgpuYW1lLXRva2VucywgYW5kIGFueSBsaXN0IGJ1dCBMYXN0J3MgbWF5IGJlIGVtcHR5IGZvciBhIG5vbm51bGwgbmFtZS4gVGhpcwpzdWJzZWN0aW9uIGRlc2NyaWJlcyB0aGUgZm9ybWF0IHN0cmluZyB5b3UgbXVzdCBzdXBwbHkgdG8gdGhlIGJ1aWx0LWluCmZ1bmN0aW9uIDx0dD5mb3JtYXQubmFtZSQ8L3R0Pi48L3A+Cgo8cD5MZXQncyBsb29rIGF0IGFuIGV4YW1wbGUgb2YgYSB2ZXJ5IGxvbmcgbmFtZS4gU3VwcG9zZSBhIGRhdGFiYXNlCmVudHJ5Jm5ic3A7WzxhIGhyZWY9ImJ0aGFjay5odG1sI3ByaW1lLW51bWJlci10aGVvcmVtIj4xPC9hPl0gaGFzIHRoZQpmaWVsZDwvcD4KPHByZT4gIGF1dGhvciA9ICJDaGFybGVzIExvdWlzIFhhdmllciBKb3NlcGggZGUgbGEgVmFsbHtcJ2V9ZSBQb3Vzc2luIjwvcHJlPgoKPHA+YW5kIHN1cHBvc2UgeW91IHdhbnQgdGhpcyBmb3JtYXR0ZWQgYGBsYXN0IG5hbWUgY29tbWEgaW5pdGlhbHMnJy4gSWYgeW91CnVzZSB0aGUgZm9ybWF0IHN0cmluZzwvcD4KPHByZT4gICAgInt2dn59e2xsfXssIGpqfXssIGZ9PyI8L3ByZT4KCjxwPndpbGwgcHJvZHVjZTwvcD4KPHByZT4gICAgZGV+bGEgVmFsbHtcJ2V9ZX5Qb3Vzc2luLCBDLn5MLiBYLn5KPzwvcHJlPgoKPHA+YXMgdGhlIGZvcm1hdHRlZCBzdHJpbmcuPC9wPgoKPHA+TGV0J3MgbG9vayBhdCB0aGlzIGV4YW1wbGUgaW4gZGV0YWlsLiBUaGVyZSBhcmUgZm91ciBicmFjZS1sZXZlbCZuYnNwOzEKPGk+cGllY2VzPC9pPiB0byB0aGlzIGZvcm1hdCBzdHJpbmcsIG9uZSBmb3IgZWFjaCBwYXJ0IG9mIGEgbmFtZS4gSWYgdGhlCmNvcnJlc3BvbmRpbmcgcGFydCBvZiBhIG5hbWUgaXNuJ3QgcHJlc2VudCAodGhlIEpyIHBhcnQgZm9yIHRoaXMgbmFtZSksCmV2ZXJ5dGhpbmcgaW4gdGhhdCBwaWVjZSBpcyBpZ25vcmVkLiBBbnl0aGluZyBhdCBicmFjZS1sZXZlbCZuYnNwOzAgaXMgb3V0cHV0CnZlcmJhdGltICh0aGUgcHJlc3VtZWQgdHlwbyBgPHR0Pj88L3R0PicgZm9yIHRoaXMgbmFtZSBpcyBhdApicmFjZS1sZXZlbCZuYnNwOzApLCBidXQgeW91IHByb2JhYmx5IHdvbid0IHVzZSB0aGlzIGZlYXR1cmUgbXVjaC48L3A+Cgo8cD5XaXRoaW4gZWFjaCBwaWVjZSBhIGRvdWJsZSBsZXR0ZXIgdGVsbHMgdG8gdXNlIHdob2xlIHRva2VucywgYW5kIGEgc2luZ2xlCmxldHRlciwgdG8gYWJicmV2aWF0ZSB0aGVtICh0aGVzZSBsZXR0ZXJzIG11c3QgYmUgYXQgYnJhY2UtbGV2ZWwmbmJzcDsxKTsKZXZlcnl0aGluZyBlbHNlIHdpdGhpbiB0aGUgcGllY2UgaXMgdXNlZCB2ZXJiYXRpbSAod2VsbCwgYWxtb3N0CmV2ZXJ5dGhpbmctLXJlYWQgb24pLiBUaGUgdGllIGF0IHRoZSBlbmQgb2YgdGhlIHZvbiBwYXJ0IChpbgo8Y29kZT57dnZ+fTwvY29kZT4pIGlzIGEgZGlzY3JldGlvbmFyeSB0aWUtLSB3aWxsIG91dHB1dCBhIHRpZSBhdCB0aGF0IHBvaW50CmlmIGl0IHRoaW5rcyB0aGVyZSdzIGEgbmVlZCBmb3Igb25lOyBvdGhlcndpc2UgaXQgd2lsbCBvdXRwdXQgYSBzcGFjZS4gSWYgeW91CnJlYWxseSwgcmVhbGx5LCB3YW50IGEgdGllIHRoZXJlLCByZWdhcmRsZXNzIG9mIHdoYXQgdGhpbmtzLCB1c2UgdHdvIG9mIHRoZW0KKG9ubHkgb25lIHdpbGwgYmUgb3V0cHV0KTsgdGhhdCBpcywgdXNlIDxjb2RlPnt2dn5+fTwvY29kZT4uIEEgdGllIGlzCmRpc2NyZXRpb25hcnkgb25seSBpZiBpdCdzIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUgcGllY2U7IGFueXdoZXJlIGVsc2UKaXQncyB0cmVhdGVkIGFzIGFuIG9yZGluYXJ5IGNoYXJhY3Rlci48L3A+Cgo8cD5wdXRzIGRlZmF1bHQgc3RyaW5ncyA8aT5iZXR3ZWVuPC9pPiB0b2tlbnMgb2YgYSBuYW1lIHBhcnQ6IEZvciB3aG9sZQp0b2tlbnMgaXQgdXNlcyBlaXRoZXIgYSBzcGFjZSBvciBhIHRpZSwgZGVwZW5kaW5nIG9uIHdoaWNoIG9uZSBpdCB0aGlua3MgaXMKYmVzdCwgYW5kIGZvciBhYmJyZXZpYXRlZCB0b2tlbnMgaXQgdXNlcyBhIHBlcmlvZCBmb2xsb3dlZCBieSBlaXRoZXIgYSBzcGFjZQpvciBhIHRpZS4gSG93ZXZlciBpdCBkb2Vzbid0IHVzZSB0aGlzIGRlZmF1bHQgc3RyaW5nIGFmdGVyIHRoZSBsYXN0IHRva2VuIGluCmEgbGlzdDsgaGVuY2UgdGhlcmUncyBubyBwZXJpb2QgZm9sbG93aW5nIHRoZSBgSicgZm9yIG91ciBleGFtcGxlLiBZb3Ugc2hvdWxkCmhhdmUgdXNlZDwvcD4KPHByZT4gICAgInt2dn59e2xsfXssIGpqfXssIGYufSIgdG8gZ2V0IHRvIHByb2R1Y2UgdGhlIHNhbWUgZm9ybWF0dGVkIHN0cmluZyBidXQgd2l0aCB0aGUgcXVlc3Rpb24gbWFyayByZXBsYWNlZCBieSBhIHBlcmlvZC4gTm90ZSB0aGF0IHRoZSBwZXJpb2Qgc2hvdWxkIGdvIGluc2lkZSB0aGUgRmlyc3QtbmFtZSBwaWVjZSwgcmF0aGVyIHRoYW4gd2hlcmUgdGhlIHF1ZXN0aW9uIG1hcmsgd2FzLCBpbiBjYXNlIGEgbmFtZSBoYXMgbm8gRmlyc3QgcGFydC48L3ByZT4KCjxwPklmIHlvdSB3YW50IHRvIG92ZXJyaWRlICdzIGRlZmF1bHQgYmV0d2Vlbi10b2tlbiBzdHJpbmdzLCB5b3UgbXVzdApleHBsaWNpdGx5IHNwZWNpZnkgYSBzdHJpbmcuIEZvciBleGFtcGxlIHN1cHBvc2UgeW91IHdhbnQgYSBsYWJlbCB0byBjb250YWluCnRoZSBmaXJzdCBsZXR0ZXIgZnJvbSBlYWNoIHRva2VuIGluIHRoZSB2b24gYW5kIExhc3QgcGFydHMsIHdpdGggbm8gc3BhY2VzOwp5b3Ugc2hvdWxkIHVzZSB0aGUgZm9ybWF0IHN0cmluZzwvcD4KPHByZT4gICAgInt2e319e2x7fX0iPC9wcmU+Cgo8cD5zbyB0aGF0IHdpbGwgcHJvZHVjZSBgPHR0PmRsVlA8L3R0PicgYXMgdGhlIGZvcm1hdHRlZCBzdHJpbmcuIFlvdSBtdXN0CmdpdmUgYSBzdHJpbmcgZm9yIGVhY2ggcGllY2Ugd2hvc2UgZGVmYXVsdCB5b3Ugd2FudCBvdmVycmlkZGVuICh0aGUgZXhhbXBsZQpoZXJlIHVzZXMgdGhlIG51bGwgc3RyaW5nIGZvciBib3RoIHBpZWNlcyksIGFuZCB0aGlzIHN0cmluZyBtdXN0IGltbWVkaWF0ZWx5CmZvbGxvdyBlaXRoZXIgdGhlIHNpbmdsZSBvciBkb3VibGUgbGV0dGVyIGZvciB0aGUgcGllY2UuIFlvdSBtYXkgbm90IGhhdmUgYW55Cm90aGVyIGxldHRlcnMgYXQgYnJhY2UtbGV2ZWwmbmJzcDsxIGluIHRoZSBmb3JtYXQgc3RyaW5nLjwvcD4KCjxoMz5CaWJsaW9ncmFwaHk8L2gzPgo8ZGw+CiAgPGR0PjE8L2R0PgogICAgPGRkPkNoYXJsZXMgTG91aXMgWGF2aWVyJm5ic3A7Sm9zZXBoIGRlJm5ic3A7bGEgVmFsbOllJm5ic3A7UG91c3Npbi48YnI+CiAgICAgIEEgc3Ryb25nIGZvcm0gb2YgdGhlIHByaW1lIG51bWJlciB0aGVvcmVtLCAxOXRoIGNlbnR1cnkuPC9kZD4KICA8ZHQ+PGEgbmFtZT0idGV4Ym9vayI+PC9hPjI8L2R0PgogICAgPGRkPkRvbmFsZCZuYnNwO0UuIEtudXRoLjxicj4KICAgICAgPGVtPlRoZSBURVhib29rPC9lbT4uPGJyPgogICAgICBBZGRpc29uLVdlc2xleSwgMTk4NC48L2RkPgogIDxkdD48YSBuYW1lPSJsYXRleCI+PC9hPjM8L2R0PgogICAgPGRkPkxlc2xpZSBMYW1wb3J0Ljxicj4KICAgICAgTDxzdXA+QTwvc3VwPlRFWDogPGVtPkEgRG9jdW1lbnQgUHJlcGFyYXRpb24gU3lzdGVtPC9lbT4uPGJyPgogICAgICBBZGRpc29uLVdlc2xleSwgMTk4Ni48L2RkPgogIDxkdD48YSBuYW1lPSJidHhkb2MiPjwvYT40PC9kdD4KICAgIDxkZD5PcmVuIFBhdGFzaG5pay48YnI+CiAgICAgIGluZy48YnI+CiAgICAgIERvY3VtZW50YXRpb24gZm9yIGdlbmVyYWwgdXNlcnMsIDgmbmJzcDtGZWJydWFyeSAxOTg4LjwvZGQ+CiAgPGR0PjxhIG5hbWU9InN0cnVuay1hbmQtd2hpdGUiPjwvYT41PC9kdD4KICAgIDxkZD5XaWxsaWFtIFN0cnVuaywgSnIuIGFuZCBFLiZuYnNwO0IuIFdoaXRlLjxicj4KICAgICAgPGVtPlRoZSBFbGVtZW50cyBvZiBTdHlsZTwvZW0+Ljxicj4KICAgICAgTWFjbWlsbGFuLCB0aGlyZCBlZGl0aW9uLCAxOTc5LjwvZGQ+CiAgPGR0PjxhIG5hbWU9InNjcmliZSI+PC9hPjY8L2R0PgogICAgPGRkPlVuaWxvZ2ljLCBMdGQuLCBQaXR0c2J1cmdoLjxicj4KICAgICAgPGVtPlNjcmliZSBEb2N1bWVudCBQcm9kdWN0aW9uIFN5c3RlbSBVc2VyIE1hbnVhbDwvZW0+LCBBcHJpbCAxOTg0Ljxicj4KICAgICAgQ2hhcHRlciB0d2VsdmUgYW5kIGFwcGVuZGljZXMgRTggdGhyb3VnaCBFMTAgZGVhbCB3aXRoCiAgICBiaWJsaW9ncmFwaGllcy48L2RkPgogIDxkdD48YSBuYW1lPSJ2YW4tbGV1bmVuIj48L2E+NzwvZHQ+CiAgICA8ZGQ+PHA+TWFyeS1DbGFpcmUgdmFuIExldW5lbi48YnI+CiAgICAgIDxlbT5BIEhhbmRib29rIGZvciBTY2hvbGFyczwvZW0+Ljxicj4KICAgICAgS25vcGYsIDE5NzkuPC9wPgogICAgPC9kZD4KPC9kbD4KCjxoMz48YSBuYW1lPSJTRUNUSU9OMDAwNzAwMDAwMDAwMDAwMDAwMDAiPjwvYT5BYm91dCB0aGlzIGRvY3VtZW50IC4uLjwvaDM+Cgo8cD5UaGlzIGRvY3VtZW50IHdhcyBnZW5lcmF0ZWQgdXNpbmcgdGhlIDxhCmhyZWY9Imh0dHA6Ly93d3cubGF0ZXgyaHRtbC5vcmcvIj48c3Ryb25nPkxhVGVYPC9zdHJvbmc+Mjx0dD5IVE1MPC90dD48L2E+CnRyYW5zbGF0b3IgVmVyc2lvbiAyMDAyLTEgKDEuNjgpPC9wPgoKPHA+Q29weXJpZ2h0IKkgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgPGEKaHJlZj0iaHR0cDovL2NibC5sZWVkcy5hYy51ay9uaWtvcy9wZXJzb25hbC5odG1sIj5OaWtvcyBEcmFrb3M8L2E+LCBDb21wdXRlcgpCYXNlZCBMZWFybmluZyBVbml0LCBVbml2ZXJzaXR5IG9mIExlZWRzLjxicj4KQ29weXJpZ2h0IKkgMTk5NywgMTk5OCwgMTk5OSwgPGEKaHJlZj0iaHR0cDovL3d3dy5tYXRocy5tcS5lZHUuYXUvfnJvc3MvIj5Sb3NzIE1vb3JlPC9hPiwgTWF0aGVtYXRpY3MKRGVwYXJ0bWVudCwgTWFjcXVhcmllIFVuaXZlcnNpdHksIFN5ZG5leS48L3A+Cgo8cD5UaGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB3ZXJlOjxicj4KPHN0cm9uZz5sYXRleDJodG1sPC9zdHJvbmc+IDx0dD4tbm9fc3ViZGlyIC1zcGxpdCAwIC1zaG93X3NlY3Rpb25fbnVtYmVycwovdG1wL2x5eF90bXBkaXIxNjc1MGc4OTlDTC9seXhfdG1wYnVmMS9idGhhY2sudGV4PC90dD48L3A+Cgo8cD5UaGUgdHJhbnNsYXRpb24gd2FzIGluaXRpYXRlZCBieSByb290IG9uIDIwMDItMTItMjI8L3A+Cjxocj4KPC9ib2R5Pgo8L2h0bWw+Cg==