rO0ABXNyADBvcmcuZWNsaXBzZS5saW51eHRvb2xzLmNkdC5saWJob3Zlci5MaWJIb3ZlckluZm8AAAAAAAAAAQIAA0wAB2NsYXNzZXN0ABNMamF2YS91dGlsL0hhc2hNYXA7TAAJZnVuY3Rpb25zdAATTGphdmEvdXRpbC9UcmVlTWFwO0wACHR5cGVkZWZzcQB+AAF4cHNyABFqYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKbG9hZEZhY3RvckkACXRocmVzaG9sZHhwP0AAAAAAAAx3CAAAABAAAAAAeHNyABFqYXZhLnV0aWwuVHJlZU1hcAzB9j4tJWrmAwABTAAKY29tcGFyYXRvcnQAFkxqYXZhL3V0aWwvQ29tcGFyYXRvcjt4cHB3BAAAAe10AAVfRXhpdHNyADBvcmcuZWNsaXBzZS5saW51eHRvb2xzLmNkdC5saWJob3Zlci5GdW5jdGlvbkluZm8AAAAAAAAAAQIABkwACGNoaWxkcmVudAAVTGphdmEvdXRpbC9BcnJheUxpc3Q7TAAEZGVzY3QAEkxqYXZhL2xhbmcvU3RyaW5nO0wAB2hlYWRlcnNxAH4AC0wABG5hbWVxAH4ADEwACXByb3RvdHlwZXEAfgAMTAAKcmV0dXJuVHlwZXEAfgAMeHBwdAPZCiAgICAgICAgVXNlIDxDT0RFPl9FeGl0PC9DT0RFPiB0byByZXR1cm4gY29udHJvbCBmcm9tIGEgcHJvZ3JhbSB0byB0aGUgaG9zdCBvcGVyYXRpbmcKICAgICAgICAgZW52aXJvbm1lbnQuICBVc2UgdGhlIGFyZ3VtZW50IDxWQVI+Y29kZTwvVkFSPiB0byBwYXNzIGFuIGV4aXQgc3RhdHVzIHRvIHRoZQogICAgICAgICBvcGVyYXRpbmcgZW52aXJvbm1lbnQ6IHR3byBwYXJ0aWN1bGFyIHZhbHVlcywgPENPREU+RVhJVF9TVUNDRVNTPC9DT0RFPiBhbmQKICAgICAgICAgPENPREU+RVhJVF9GQUlMVVJFPC9DT0RFPiwgYXJlIGRlZmluZWQgaW4gYDxDT0RFPnN0ZGxpYi5oPC9DT0RFPicgdG8gaW5kaWNhdGUgc3VjY2VzcyBvcgogICAgICAgICBmYWlsdXJlIGluIGEgcG9ydGFibGUgZmFzaGlvbi4KICAgICAgICAgPGJyPjxicj4gPENPREU+X0V4aXQ8L0NPREU+IGRpZmZlcnMgZnJvbSA8Q09ERT5leGl0PC9DT0RFPiBpbiB0aGF0IGl0IGRvZXMgbm90IHJ1biBhbnkKICAgICAgICAgYXBwbGljYXRpb24tZGVmaW5lZCBjbGVhbnVwIGZ1bmN0aW9ucyByZWdpc3RlcmVkIHdpdGggPENPREU+YXRleGl0PC9DT0RFPiBhbmQKICAgICAgICAgaXQgZG9lcyBub3QgY2xlYW4gdXAgZmlsZXMgYW5kIHN0cmVhbXMuICBJdCBpcyBpZGVudGljYWwgdG8gPENPREU+X2V4aXQ8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgPENPREU+X0V4aXQ8L0NPREU+IGRvZXMgbm90IHJldHVybiB0byBpdHMgY2FsbGVyLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIDxDT0RFPl9FeGl0PC9DT0RFPiBpcyBkZWZpbmVkIGJ5IHRoZSBDOTkgc3RhbmRhcmQuCiAgICAgICAgIDxicj48YnI+IFN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMgcmVxdWlyZWQ6IDxDT0RFPl9leGl0PC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNyABNqYXZhLnV0aWwuQXJyYXlMaXN0eIHSHZnHYZ0DAAFJAARzaXpleHAAAAABdwQAAAAKdAAIc3RkbGliLmh4cQB+AAl0AAhpbnQgY29kZXQABXZvaWQgdAAKX19lbnZfbG9ja3NxAH4ACnB0A9IKICAgICAgICBUaGUgPENPREU+c2V0ZW52PC9DT0RFPiBmYW1pbHkgb2Ygcm91dGluZXMgY2FsbCB0aGVzZSBmdW5jdGlvbnMgd2hlbiB0aGV5IG5lZWQgdG8KICAgICAgICAgbW9kaWZ5IHRoZSBlbnZpcm9uIHZhcmlhYmxlLiAgVGhlIHZlcnNpb24gb2YgdGhlc2Ugcm91dGluZXMgc3VwcGxpZWQgaW4gdGhlCiAgICAgICAgIGxpYnJhcnkgdXNlIHRoZSBsb2NrIEFQSSBkZWZpbmVkIGluIHN5cy9sb2NrLmguICBJZiBtdWx0aXBsZSB0aHJlYWRzIG9mCiAgICAgICAgIGV4ZWN1dGlvbiBjYW4gY2FsbCA8Q09ERT5zZXRlbnY8L0NPREU+LCBvciBpZiA8Q09ERT5zZXRlbnY8L0NPREU+IGNhbiBiZSBjYWxsZWQgcmVlbnRyYW50bHksCiAgICAgICAgIHRoZW4geW91IG5lZWQgdG8gZGVmaW5lIHlvdXIgb3duIHZlcnNpb25zIG9mIHRoZXNlIGZ1bmN0aW9ucyBpbiBvcmRlciB0bwogICAgICAgICBzYWZlbHkgbG9jayB0aGUgbWVtb3J5IHBvb2wgZHVyaW5nIGEgY2FsbC4gIElmIHlvdSBkbyBub3QsIHRoZSBtZW1vcnkgcG9vbAogICAgICAgICBtYXkgYmVjb21lIGNvcnJ1cHRlZC4KICAgICAgICAgPGJyPjxicj4gQSBjYWxsIHRvIDxDT0RFPnNldGVudjwvQ09ERT4gbWF5IGNhbGwgPENPREU+X19lbnZfbG9jazwvQ09ERT4gcmVjdXJzaXZlbHk7IHRoYXQgaXMsCiAgICAgICAgIHRoZSBzZXF1ZW5jZSBvZiBjYWxscyBtYXkgZ28gPENPREU+X19lbnZfbG9jazwvQ09ERT4sIDxDT0RFPl9fZW52X2xvY2s8L0NPREU+LAogICAgICAgICA8Q09ERT5fX2Vudl91bmxvY2s8L0NPREU+LCA8Q09ERT5fX2Vudl91bmxvY2s8L0NPREU+LiAgQW55IGltcGxlbWVudGF0aW9uIG9mIHRoZXNlCiAgICAgICAgIHJvdXRpbmVzIG11c3QgYmUgY2FyZWZ1bCB0byBhdm9pZCBjYXVzaW5nIGEgdGhyZWFkIHRvIHdhaXQgZm9yIGEgbG9jawogICAgICAgICB0aGF0IGl0IGFscmVhZHkgaG9sZHMuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAJZW52bG9jay5oeHEAfgAUdAAUc3RydWN0IF9yZWVudCAqcmVlbnR0AAV2b2lkIHQADF9fZW52X3VubG9ja3NxAH4ACnBxAH4AFnNxAH4ADwAAAAF3BAAAAAp0AAllbnZsb2NrLmh4cQB+ABt0ABRzdHJ1Y3QgX3JlZW50ICpyZWVudHQABXZvaWQgdAANX19tYWxsb2NfbG9ja3NxAH4ACnB0A9oKICAgICAgICBUaGUgPENPREU+bWFsbG9jPC9DT0RFPiBmYW1pbHkgb2Ygcm91dGluZXMgY2FsbCB0aGVzZSBmdW5jdGlvbnMgd2hlbiB0aGV5IG5lZWQgdG8gbG9jawogICAgICAgICB0aGUgbWVtb3J5IHBvb2wuICBUaGUgdmVyc2lvbiBvZiB0aGVzZSByb3V0aW5lcyBzdXBwbGllZCBpbiB0aGUgbGlicmFyeSB1c2UKICAgICAgICAgdGhlIGxvY2sgQVBJIGRlZmluZWQgaW4gc3lzL2xvY2suaC4gIElmIG11bHRpcGxlIHRocmVhZHMgb2YgZXhlY3V0aW9uIGNhbgogICAgICAgICBjYWxsIDxDT0RFPm1hbGxvYzwvQ09ERT4sIG9yIGlmIDxDT0RFPm1hbGxvYzwvQ09ERT4gY2FuIGJlIGNhbGxlZCByZWVudHJhbnRseSwgdGhlbiB5b3UgbmVlZCB0bwogICAgICAgICBkZWZpbmUgeW91ciBvd24gdmVyc2lvbnMgb2YgdGhlc2UgZnVuY3Rpb25zIGluIG9yZGVyIHRvIHNhZmVseSBsb2NrIHRoZQogICAgICAgICBtZW1vcnkgcG9vbCBkdXJpbmcgYSBjYWxsLiAgSWYgeW91IGRvIG5vdCwgdGhlIG1lbW9yeSBwb29sIG1heSBiZWNvbWUKICAgICAgICAgY29ycnVwdGVkLgogICAgICAgICA8YnI+PGJyPiBBIGNhbGwgdG8gPENPREU+bWFsbG9jPC9DT0RFPiBtYXkgY2FsbCA8Q09ERT5fX21hbGxvY19sb2NrPC9DT0RFPiByZWN1cnNpdmVseTsgdGhhdCBpcywKICAgICAgICAgdGhlIHNlcXVlbmNlIG9mIGNhbGxzIG1heSBnbyA8Q09ERT5fX21hbGxvY19sb2NrPC9DT0RFPiwgPENPREU+X19tYWxsb2NfbG9jazwvQ09ERT4sCiAgICAgICAgIDxDT0RFPl9fbWFsbG9jX3VubG9jazwvQ09ERT4sIDxDT0RFPl9fbWFsbG9jX3VubG9jazwvQ09ERT4uICBBbnkgaW1wbGVtZW50YXRpb24gb2YgdGhlc2UKICAgICAgICAgcm91dGluZXMgbXVzdCBiZSBjYXJlZnVsIHRvIGF2b2lkIGNhdXNpbmcgYSB0aHJlYWQgdG8gd2FpdCBmb3IgYSBsb2NrCiAgICAgICAgIHRoYXQgaXQgYWxyZWFkeSBob2xkcy4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAhtYWxsb2MuaHhxAH4AIXQAFHN0cnVjdCBfcmVlbnQgKnJlZW50dAAFdm9pZCB0AA9fX21hbGxvY191bmxvY2tzcQB+AApwcQB+ACNzcQB+AA8AAAABdwQAAAAKdAAIbWFsbG9jLmh4cQB+ACh0ABRzdHJ1Y3QgX3JlZW50ICpyZWVudHQABXZvaWQgdAAJX190el9sb2Nrc3EAfgAKcHQDwQogICAgICAgIFRoZSA8Q09ERT50enNldDwvQ09ERT4gZmFjaWxpdHkgZnVuY3Rpb25zIGNhbGwgdGhlc2UgZnVuY3Rpb25zIHdoZW4gdGhleSBuZWVkIHRvCiAgICAgICAgIGVuc3VyZSB0aGUgdmFsdWVzIG9mIGdsb2JhbCB2YXJpYWJsZXMuICBUaGUgdmVyc2lvbiBvZiB0aGVzZSByb3V0aW5lcwogICAgICAgICBzdXBwbGllZCBpbiB0aGUgbGlicmFyeSB1c2UgdGhlIGxvY2sgQVBJIGRlZmluZWQgaW4gc3lzL2xvY2suaC4gIElmIG11bHRpcGxlCiAgICAgICAgIHRocmVhZHMgb2YgZXhlY3V0aW9uIGNhbiBjYWxsIHRoZSB0aW1lIGZ1bmN0aW9ucyBhbmQgZ2l2ZSB1cCBzY2hlZHVsaW5nIGluCiAgICAgICAgIHRoZSBtaWRkbGUsIHRoZW4geW91IHlvdSBuZWVkIHRvIGRlZmluZSB5b3VyIG93biB2ZXJzaW9ucyBvZiB0aGVzZSBmdW5jdGlvbnMKICAgICAgICAgaW4gb3JkZXIgdG8gc2FmZWx5IGxvY2sgdGhlIHRpbWUgem9uZSB2YXJpYWJsZXMgZHVyaW5nIGEgY2FsbC4gIElmIHlvdSBkbwogICAgICAgICBub3QsIHRoZSByZXN1bHRzIG9mIDxDT0RFPmxvY2FsdGltZTwvQ09ERT4sIDxDT0RFPm1rdGltZTwvQ09ERT4sIDxDT0RFPmN0aW1lPC9DT0RFPiwgYW5kIDxDT0RFPnN0cmZ0aW1lPC9DT0RFPgogICAgICAgICBhcmUgdW5kZWZpbmVkLgogICAgICAgICA8YnI+PGJyPiBUaGUgbG9jayA8Q09ERT5fX3R6X2xvY2s8L0NPREU+IG1heSBub3QgYmUgY2FsbGVkIHJlY3Vyc2l2ZWx5OyB0aGF0IGlzLAogICAgICAgICBhIGNhbGwgPENPREU+X190el9sb2NrPC9DT0RFPiB3aWxsIGFsd2F5cyBsb2NrIGFsbCBzdWJzZXF1ZW50IDxDT0RFPl9fdHpfbG9jazwvQ09ERT4gY2FsbHMKICAgICAgICAgdW50aWwgdGhlIGNvcnJlc3BvbmRpbmcgPENPREU+X190el91bmxvY2s8L0NPREU+IGNhbGwgb24gdGhlIHNhbWUgdGhyZWFkIGlzIG1hZGUuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAAAdwQAAAAKeHEAfgAudAAEdm9pZHQABXZvaWQgdAALX190el91bmxvY2tzcQB+AApwcQB+ADBzcQB+AA8AAAAAdwQAAAAKeHEAfgA0dAAEdm9pZHQABXZvaWQgdAAKX2FzY3RpbWVfcnNxAH4ACnB0AmoKICAgICAgICBGb3JtYXQgdGhlIHRpbWUgdmFsdWUgYXQgPFZBUj5jbG9jazwvVkFSPiBpbnRvIGEgc3RyaW5nIG9mIHRoZSBmb3JtCiAgICAgICAgIDxwcmU+PGJyPgogICAgICAgICAgV2VkIEp1biAxNSAxMTozODowNyAxOTg4XG5cMDxicj4KICAgICAgICAgPC9wcmU+CiAgICAgICAgIFRoZSBzdHJpbmcgaXMgZ2VuZXJhdGVkIGluIGEgc3RhdGljIGJ1ZmZlcjsgZWFjaCBjYWxsIHRvIDxDT0RFPmFzY3RpbWU8L0NPREU+CiAgICAgICAgIG92ZXJ3cml0ZXMgdGhlIHN0cmluZyBnZW5lcmF0ZWQgYnkgcHJldmlvdXMgY2FsbHMuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIHN0cmluZyBjb250YWluaW5nIGEgZm9ybWF0dGVkIHRpbWVzdGFtcC4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICBBTlNJIEMgcmVxdWlyZXMgPENPREU+YXNjdGltZTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxDT0RFPmFzY3RpbWU8L0NPREU+IHJlcXVpcmVzIG5vIHN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAGdGltZS5oeHEAfgA5dAAhY29uc3Qgc3RydWN0IHRtICpjbG9jaywgY2hhciAqYnVmdAAGY2hhciAqdAAMX2FzaXByaW50Zl9yc3EAfgAKcHQFTgogICAgICAgIDxDT0RFPmlwcmludGY8L0NPREU+LCA8Q09ERT5maXByaW50ZjwvQ09ERT4sIDxDT0RFPnNpcHJpbnRmPC9DT0RFPiwgPENPREU+c25pcHJpbnRmPC9DT0RFPiwKICAgICAgICAgPENPREU+YXNpcHJpbnRmPC9DT0RFPiwgYW5kIDxDT0RFPmFzbmlwcmludGY8L0NPREU+IGFyZSB0aGUgc2FtZSBhcyA8Q09ERT5wcmludGY8L0NPREU+LAogICAgICAgICA8Q09ERT5mcHJpbnRmPC9DT0RFPiwgPENPREU+c3ByaW50ZjwvQ09ERT4sIDxDT0RFPnNucHJpbnRmPC9DT0RFPiwgPENPREU+YXNwcmludGY8L0NPREU+LCBhbmQKICAgICAgICAgPENPREU+YXNucHJpbnRmPC9DT0RFPiwgcmVzcGVjdGl2ZWx5LCBleGNlcHQgdGhhdCB0aGV5IHJlc3RyaWN0IHVzYWdlCiAgICAgICAgIHRvIG5vbi1mbG9hdGluZy1wb2ludCBmb3JtYXQgc3BlY2lmaWVycy4KICAgICAgICAgPGJyPjxicj4gPENPREU+X2lwcmludGZfcjwvQ09ERT4sIDxDT0RFPl9maXByaW50Zl9yPC9DT0RFPiwgPENPREU+X2FzaXByaW50Zl9yPC9DT0RFPiwKICAgICAgICAgPENPREU+X3NpcHJpbnRmX3I8L0NPREU+LCA8Q09ERT5fc25pcHJpbnRmX3I8L0NPREU+LCA8Q09ERT5fYXNuaXByaW50Zl9yPC9DT0RFPiBhcmUKICAgICAgICAgc2ltcGx5IHJlZW50cmFudCB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgU2ltaWxhciB0byA8Q09ERT5wcmludGY8L0NPREU+LCA8Q09ERT5mcHJpbnRmPC9DT0RFPiwgPENPREU+c3ByaW50ZjwvQ09ERT4sIDxDT0RFPnNucHJpbnRmPC9DT0RFPiwgPENPREU+YXNwcmludGY8L0NPREU+LAogICAgICAgICBhbmQgPENPREU+YXNucHJpbnRmPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICA8Q09ERT5pcHJpbnRmPC9DT0RFPiwgPENPREU+ZmlwcmludGY8L0NPREU+LCA8Q09ERT5zaXByaW50ZjwvQ09ERT4sIDxDT0RFPnNuaXByaW50ZjwvQ09ERT4sIDxDT0RFPmFzaXByaW50ZjwvQ09ERT4sCiAgICAgICAgIGFuZCA8Q09ERT5hc25pcHJpbnRmPC9DT0RFPiBhcmUgbmV3bGliIGV4dGVuc2lvbnMuCiAgICAgICAgIDxicj48YnI+IFN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMgcmVxdWlyZWQ6IDxDT0RFPmNsb3NlPC9DT0RFPiwgPENPREU+ZnN0YXQ8L0NPREU+LCA8Q09ERT5pc2F0dHk8L0NPREU+LAogICAgICAgICA8Q09ERT5sc2VlazwvQ09ERT4sIDxDT0RFPnJlYWQ8L0NPREU+LCA8Q09ERT5zYnJrPC9DT0RFPiwgPENPREU+d3JpdGU8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+AEB0ADdzdHJ1Y3QgX3JlZW50ICpwdHIsIGNoYXIgKipzdHJwLGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4udAAEaW50IHQADV9hc25pcHJpbnRmX3JzcQB+AApwcQB+AEJzcQB+AA8AAAABdwQAAAAKdAAHc3RkaW8uaHhxAH4AR3QAQ3N0cnVjdCBfcmVlbnQgKnB0ciwgY2hhciAqc3RyLHNpemVfdCAqc2l6ZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi50AAZjaGFyICp0AAxfYXNucHJpbnRmX3JzcQB+AApwdFmtCiAgICAgICAgPENPREU+cHJpbnRmPC9DT0RFPiBhY2NlcHRzIGEgc2VyaWVzIG9mIGFyZ3VtZW50cywgYXBwbGllcyB0byBlYWNoIGEKICAgICAgICAgZm9ybWF0IHNwZWNpZmllciBmcm9tIDxDT0RFPio8VkFSPmZvcm1hdDwvVkFSPjwvQ09ERT4sIGFuZCB3cml0ZXMgdGhlCiAgICAgICAgIGZvcm1hdHRlZCBkYXRhIHRvIDxDT0RFPnN0ZG91dDwvQ09ERT4sIHdpdGhvdXQgYSB0ZXJtaW5hdGluZyBOVUwKICAgICAgICAgY2hhcmFjdGVyLiAgVGhlIGJlaGF2aW9yIG9mIDxDT0RFPnByaW50ZjwvQ09ERT4gaXMgdW5kZWZpbmVkIGlmIHRoZXJlCiAgICAgICAgIGFyZSBub3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgdGhlIGZvcm1hdC4gIDxDT0RFPnByaW50ZjwvQ09ERT4gcmV0dXJucwogICAgICAgICB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgZm9ybWF0IHN0cmluZy4gIElmIHRoZXJlIGFyZQogICAgICAgICBtb3JlIGFyZ3VtZW50cyB0aGFuIHRoZSBmb3JtYXQgcmVxdWlyZXMsIGV4Y2VzcyBhcmd1bWVudHMgYXJlCiAgICAgICAgIGlnbm9yZWQuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPmZwcmludGY8L0NPREU+IGlzIGxpa2UgPENPREU+cHJpbnRmPC9DT0RFPiwgZXhjZXB0IHRoYXQgb3V0cHV0IGlzIGRpcmVjdGVkCiAgICAgICAgIHRvIHRoZSBzdHJlYW0gPFZBUj5mZDwvVkFSPiByYXRoZXIgdGhhbiA8Q09ERT5zdGRvdXQ8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5zcHJpbnRmPC9DT0RFPiBpcyBsaWtlIDxDT0RFPnByaW50ZjwvQ09ERT4sIGV4Y2VwdCB0aGF0IG91dHB1dCBpcyBkaXJlY3RlZAogICAgICAgICB0byB0aGUgYnVmZmVyIDxWQVI+c3RyPC9WQVI+LCBhbmQgYSB0ZXJtaW5hdGluZyBOVUwgaXMgb3V0cHV0LgogICAgICAgICBCZWhhdmlvciBpcyB1bmRlZmluZWQgaWYgbW9yZSBvdXRwdXQgaXMgZ2VuZXJhdGVkIHRoYW4gdGhlCiAgICAgICAgIGJ1ZmZlciBjYW4gaG9sZC4KICAgICAgICAgPGJyPjxicj4gPENPREU+c25wcmludGY8L0NPREU+IGlzIGxpa2UgPENPREU+c3ByaW50ZjwvQ09ERT4sIGV4Y2VwdCB0aGF0IG91dHB1dCBpcwogICAgICAgICBsaW1pdGVkIHRvIGF0IG1vc3QgPFZBUj5zaXplPC9WQVI+IGJ5dGVzLCBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nCiAgICAgICAgIDxDT0RFPk5VTDwvQ09ERT4uICBBcyBhIHNwZWNpYWwgY2FzZSwgaWYgPFZBUj5zaXplPC9WQVI+IGlzIDAsIDxWQVI+c3RyPC9WQVI+IGNhbiBiZQogICAgICAgICBOVUxMLCBhbmQgPENPREU+c25wcmludGY8L0NPREU+IG1lcmVseSBjYWxjdWxhdGVzIGhvdyBtYW55IGJ5dGVzIHdvdWxkCiAgICAgICAgIGJlIHByaW50ZWQuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPmFzcHJpbnRmPC9DT0RFPiBpcyBsaWtlIDxDT0RFPnNwcmludGY8L0NPREU+LCBleGNlcHQgdGhhdCB0aGUgb3V0cHV0IGlzCiAgICAgICAgIHN0b3JlZCBpbiBhIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBidWZmZXIsIDxWQVI+cHN0cjwvVkFSPiwgd2hpY2gKICAgICAgICAgc2hvdWxkIGJlIGZyZWVkIGxhdGVyIHdpdGggPENPREU+ZnJlZTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxDT0RFPmFzbnByaW50ZjwvQ09ERT4gaXMgbGlrZSA8Q09ERT5zcHJpbnRmPC9DT0RFPiwgZXhjZXB0IHRoYXQgdGhlIHJldHVybiB0eXBlCiAgICAgICAgIGlzIGVpdGhlciB0aGUgb3JpZ2luYWwgPFZBUj5zdHI8L1ZBUj4gaWYgaXQgd2FzIGxhcmdlIGVub3VnaCwgb3IgYQogICAgICAgICBkeW5hbWljYWxseSBhbGxvY2F0ZWQgc3RyaW5nIGlmIHRoZSBvdXRwdXQgZXhjZWVkcyAqPFZBUj5zaXplPC9WQVI+OwogICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSByZXN1bHQgaXMgcmV0dXJuZWQgaW4gKjxWQVI+c2l6ZTwvVkFSPi4gIFdoZW4KICAgICAgICAgZHluYW1pYyBhbGxvY2F0aW9uIG9jY3VycywgdGhlIGNvbnRlbnRzIG9mIHRoZSBvcmlnaW5hbAogICAgICAgICA8VkFSPnN0cjwvVkFSPiBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkLgogICAgICAgICA8YnI+PGJyPiBGb3IgPENPREU+c3ByaW50ZjwvQ09ERT4sIDxDT0RFPnNucHJpbnRmPC9DT0RFPiwgYW5kIDxDT0RFPmFzbnByaW50ZjwvQ09ERT4sIHRoZSBiZWhhdmlvcgogICAgICAgICBpcyB1bmRlZmluZWQgaWYgdGhlIG91dHB1dCA8Q09ERT4qPFZBUj5zdHI8L1ZBUj48L0NPREU+IG92ZXJsYXBzIHdpdGggb25lIG9mCiAgICAgICAgIHRoZSBhcmd1bWVudHMuICBCZWhhdmlvciBpcyBhbHNvIHVuZGVmaW5lZCBpZiB0aGUgYXJndW1lbnQgZm9yCiAgICAgICAgIDxDT0RFPiVuPC9DT0RFPiB3aXRoaW4gPENPREU+KjxWQVI+Zm9ybWF0PC9WQVI+PC9DT0RFPiBvdmVybGFwcyBhbm90aGVyIGFyZ3VtZW50LgogICAgICAgICA8YnI+PGJyPiA8VkFSPmZvcm1hdDwvVkFSPiBpcyBhIHBvaW50ZXIgdG8gYSBjaGFyYWN0ZXIgc3RyaW5nIGNvbnRhaW5pbmcgdHdvCiAgICAgICAgIHR5cGVzIG9mIG9iamVjdHM6IG9yZGluYXJ5IGNoYXJhY3RlcnMgKG90aGVyIHRoYW4gPENPREU+JTwvQ09ERT4pLAogICAgICAgICB3aGljaCBhcmUgY29waWVkIHVuY2hhbmdlZCB0byB0aGUgb3V0cHV0LCBhbmQgY29udmVyc2lvbgogICAgICAgICBzcGVjaWZpY2F0aW9ucywgZWFjaCBvZiB3aGljaCBpcyBpbnRyb2R1Y2VkIGJ5IDxDT0RFPiU8L0NPREU+LiAoVG8KICAgICAgICAgaW5jbHVkZSA8Q09ERT4lPC9DT0RFPiBpbiB0aGUgb3V0cHV0LCB1c2UgPENPREU+JSU8L0NPREU+IGluIHRoZSBmb3JtYXQgc3RyaW5nLikKICAgICAgICAgQSBjb252ZXJzaW9uIHNwZWNpZmljYXRpb24gaGFzIHRoZSBmb2xsb3dpbmcgZm9ybToKICAgICAgICAgPGJyPjxicj4gPHByZT48YnI+CiAgICAgICAgICAgICAgICAlWzxWQVI+cG9zPC9WQVI+XVs8VkFSPmZsYWdzPC9WQVI+XVs8VkFSPndpZHRoPC9WQVI+XVsuPFZBUj5wcmVjPC9WQVI+XVs8VkFSPnNpemU8L1ZBUj5dPFZBUj50eXBlPC9WQVI+PGJyPgogICAgICAgICA8L3ByZT4KICAgICAgICAgPGJyPjxicj4gVGhlIGZpZWxkcyBvZiB0aGUgY29udmVyc2lvbiBzcGVjaWZpY2F0aW9uIGhhdmUgdGhlIGZvbGxvd2luZwogICAgICAgICBtZWFuaW5nczoKICAgICAgICAgPGJyPjxicj4gPE9MPgogICAgICAgICA8YnI+PGJyPiA8TEk+IDxWQVI+cG9zPC9WQVI+CiAgICAgICAgIDxicj48YnI+IENvbnZlcnNpb25zIG5vcm1hbGx5IGNvbnN1bWUgYXJndW1lbnRzIGluIHRoZSBvcmRlciB0aGF0IHRoZXkKICAgICAgICAgYXJlIHByZXNlbnRlZC4gIEhvd2V2ZXIsIGl0IGlzIHBvc3NpYmxlIHRvIGNvbnN1bWUgYXJndW1lbnRzCiAgICAgICAgIG91dCBvZiBvcmRlciwgYW5kIHJldXNlIGFuIGFyZ3VtZW50IGZvciBtb3JlIHRoYW4gb25lCiAgICAgICAgIGNvbnZlcnNpb24gc3BlY2lmaWNhdGlvbiAoYWx0aG91Z2ggdGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZAogICAgICAgICBpZiB0aGUgc2FtZSBhcmd1bWVudCBpcyByZXF1ZXN0ZWQgd2l0aCBkaWZmZXJlbnQgdHlwZXMpLCBieQogICAgICAgICBzcGVjaWZ5aW5nIDxWQVI+cG9zPC9WQVI+LCB3aGljaCBpcyBhIGRlY2ltYWwgaW50ZWdlciBmb2xsb3dlZCBieQogICAgICAgICAnJCcuICBUaGUgaW50ZWdlciBtdXN0IGJlIGJldHdlZW4gMSBhbmQgPE5MX0FSR01BWD4gZnJvbQogICAgICAgICBsaW1pdHMuaCwgYW5kIGlmIGFyZ3VtZW50IDxDT0RFPiVuJDwvQ09ERT4gaXMgcmVxdWVzdGVkLCBhbGwgZWFybGllcgogICAgICAgICBhcmd1bWVudHMgbXVzdCBiZSByZXF1ZXN0ZWQgc29tZXdoZXJlIHdpdGhpbiA8VkFSPmZvcm1hdDwvVkFSPi4gIElmCiAgICAgICAgIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBhcmUgdXNlZCwgdGhlbiBhbGwgY29udmVyc2lvbgogICAgICAgICBzcGVjaWZpY2F0aW9ucyBleGNlcHQgZm9yIDxDT0RFPiUlPC9DT0RFPiBtdXN0IHNwZWNpZnkgYSBwb3NpdGlvbi4KICAgICAgICAgPGJyPjxicj4gPExJPiA8VkFSPmZsYWdzPC9WQVI+CiAgICAgICAgIDxicj48YnI+IDxWQVI+ZmxhZ3M8L1ZBUj4gaXMgYW4gb3B0aW9uYWwgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB3aGljaCBjb250cm9sCiAgICAgICAgIG91dHB1dCBqdXN0aWZpY2F0aW9uLCBudW1lcmljIHNpZ25zLCBkZWNpbWFsIHBvaW50cywgdHJhaWxpbmcKICAgICAgICAgemVyb3MsIGFuZCBvY3RhbCBhbmQgaGV4IHByZWZpeGVzLiAgVGhlIGZsYWcgY2hhcmFjdGVycyBhcmUKICAgICAgICAgbWludXMgKDxDT0RFPi08L0NPREU+KSwgcGx1cyAoPENPREU+KzwvQ09ERT4pLCBzcGFjZSAoICksIHplcm8gKDxDT0RFPjA8L0NPREU+KSwgc2hhcnAKICAgICAgICAgKDxDT0RFPiM8L0NPREU+KSwgYW5kIHF1b3RlICg8Q09ERT4nPC9DT0RFPikuICBUaGV5IGNhbiBhcHBlYXIgaW4gYW55CiAgICAgICAgIGNvbWJpbmF0aW9uLCBhbHRob3VnaCBub3QgYWxsIGZsYWdzIGNhbiBiZSB1c2VkIGZvciBhbGwKICAgICAgICAgY29udmVyc2lvbiBzcGVjaWZpY2F0aW9uIHR5cGVzLgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+JzwvQ09ERT4KPEREPgogICAgICAgICBTaW5jZSBuZXdsaWIgb25seSBzdXBwb3J0cyB0aGUgQyBsb2NhbGUsIHRoaXMKICAgICAgICAgZmxhZyBoYXMgbm8gZWZmZWN0IGluIHRoaXMgaW1wbGVtZW50YXRpb24uCiAgICAgICAgIEJ1dCBpbiBvdGhlciBsb2NhbGVzLCB3aGVuIDxWQVI+dHlwZTwvVkFSPiBpcyA8Q09ERT5pPC9DT0RFPiwKICAgICAgICAgPENPREU+ZDwvQ09ERT4sIDxDT0RFPnU8L0NPREU+LCA8Q09ERT5mPC9DT0RFPiwgPENPREU+RjwvQ09ERT4sIDxDT0RFPmc8L0NPREU+LCBvciA8Q09ERT5HPC9DT0RFPiwKICAgICAgICAgdGhlIGxvY2FsZS1kZXBlbmRlbnQgdGhvdXNhbmQncyBzZXBhcmF0b3IgaXMKICAgICAgICAgaW5zZXJ0ZWQgcHJpb3IgdG8gemVybyBwYWRkaW5nLgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+LTwvQ09ERT4KPEREPgogICAgICAgICBUaGUgcmVzdWx0IG9mIHRoZSBjb252ZXJzaW9uIGlzIGxlZnQKICAgICAgICAganVzdGlmaWVkLCBhbmQgdGhlIHJpZ2h0IGlzIHBhZGRlZCB3aXRoCiAgICAgICAgIGJsYW5rcy4gIElmIHlvdSBkbyBub3QgdXNlIHRoaXMgZmxhZywgdGhlCiAgICAgICAgIHJlc3VsdCBpcyByaWdodCBqdXN0aWZpZWQsIGFuZCBwYWRkZWQgb24gdGhlCiAgICAgICAgIGxlZnQuCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT4rPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSByZXN1bHQgb2YgYSBzaWduZWQgY29udmVyc2lvbiAoYXMKICAgICAgICAgZGV0ZXJtaW5lZCBieSA8VkFSPnR5cGU8L1ZBUj4gb2YgPENPREU+ZDwvQ09ERT4sIDxDT0RFPmk8L0NPREU+LCA8Q09ERT5hPC9DT0RFPiwKICAgICAgICAgPENPREU+QTwvQ09ERT4sIDxDT0RFPmU8L0NPREU+LCA8Q09ERT5FPC9DT0RFPiwgPENPREU+ZjwvQ09ERT4sIDxDT0RFPkY8L0NPREU+LCA8Q09ERT5nPC9DT0RFPiwgb3IKICAgICAgICAgPENPREU+RzwvQ09ERT4pIHdpbGwgYWx3YXlzIGJlZ2luIHdpdGggYSBwbHVzIG9yIG1pbnVzCiAgICAgICAgIHNpZ24uICAoSWYgeW91IGRvIG5vdCB1c2UgdGhpcyBmbGFnLCBwb3NpdGl2ZQogICAgICAgICB2YWx1ZXMgZG8gbm90IGJlZ2luIHdpdGggYSBwbHVzIHNpZ24uKQogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+IiAiIChzcGFjZSk8L0NPREU+CjxERD4KICAgICAgICAgSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhIHNpZ25lZCBjb252ZXJzaW9uCiAgICAgICAgIHNwZWNpZmljYXRpb24gaXMgbm90IGEgc2lnbiwgb3IgaWYgYSBzaWduZWQKICAgICAgICAgY29udmVyc2lvbiByZXN1bHRzIGluIG5vIGNoYXJhY3RlcnMsIHRoZQogICAgICAgICByZXN1bHQgd2lsbCBiZWdpbiB3aXRoIGEgc3BhY2UuICBJZiB0aGUgc3BhY2UKICAgICAgICAgKCApIGZsYWcgYW5kIHRoZSBwbHVzICg8Q09ERT4rPC9DT0RFPikgZmxhZyBib3RoCiAgICAgICAgIGFwcGVhciwgdGhlIHNwYWNlIGZsYWcgaXMgaWdub3JlZC4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPjA8L0NPREU+CjxERD4KICAgICAgICAgSWYgdGhlIDxWQVI+dHlwZTwvVkFSPiBjaGFyYWN0ZXIgaXMgPENPREU+ZDwvQ09ERT4sIDxDT0RFPmk8L0NPREU+LAogICAgICAgICA8Q09ERT5vPC9DT0RFPiwgPENPREU+dTwvQ09ERT4sIDxDT0RFPng8L0NPREU+LCA8Q09ERT5YPC9DT0RFPiwgPENPREU+YTwvQ09ERT4sIDxDT0RFPkE8L0NPREU+LAogICAgICAgICA8Q09ERT5lPC9DT0RFPiwgPENPREU+RTwvQ09ERT4sIDxDT0RFPmY8L0NPREU+LCA8Q09ERT5nPC9DT0RFPiwgb3IgPENPREU+RzwvQ09ERT46IGxlYWRpbmcKICAgICAgICAgemVyb3MgYXJlIHVzZWQgdG8gcGFkIHRoZSBmaWVsZCB3aWR0aAogICAgICAgICAoZm9sbG93aW5nIGFueSBpbmRpY2F0aW9uIG9mIHNpZ24gb3IgYmFzZSk7IG5vCiAgICAgICAgIHNwYWNlcyBhcmUgdXNlZCBmb3IgcGFkZGluZy4gIElmIHRoZSB6ZXJvCiAgICAgICAgICg8Q09ERT4wPC9DT0RFPikgYW5kIG1pbnVzICg8Q09ERT4tPC9DT0RFPikgZmxhZ3MgYm90aCBhcHBlYXIsCiAgICAgICAgIHRoZSB6ZXJvICg8Q09ERT4wPC9DT0RFPikgZmxhZyB3aWxsIGJlIGlnbm9yZWQuICBGb3IKICAgICAgICAgPENPREU+ZDwvQ09ERT4sIDxDT0RFPmk8L0NPREU+LCA8Q09ERT5vPC9DT0RFPiwgPENPREU+dTwvQ09ERT4sIDxDT0RFPng8L0NPREU+LCBhbmQgPENPREU+WDwvQ09ERT4KICAgICAgICAgY29udmVyc2lvbnMsIGlmIGEgcHJlY2lzaW9uIDxWQVI+cHJlYzwvVkFSPiBpcwogICAgICAgICBzcGVjaWZpZWQsIHRoZSB6ZXJvICg8Q09ERT4wPC9DT0RFPikgZmxhZyBpcyBpZ25vcmVkLgogICAgICAgICA8YnI+PGJyPiBOb3RlIHRoYXQgPENPREU+MDwvQ09ERT4gaXMgaW50ZXJwcmV0ZWQgYXMgYSBmbGFnLCBub3QKICAgICAgICAgYXMgdGhlIGJlZ2lubmluZyBvZiBhIGZpZWxkIHdpZHRoLgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+IzwvQ09ERT4KPEREPgogICAgICAgICBUaGUgcmVzdWx0IGlzIHRvIGJlIGNvbnZlcnRlZCB0byBhbgogICAgICAgICBhbHRlcm5hdGl2ZSBmb3JtLCBhY2NvcmRpbmcgdG8gdGhlIDxWQVI+dHlwZTwvVkFSPgogICAgICAgICBjaGFyYWN0ZXI6CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5vPC9DT0RFPgo8REQ+CiAgICAgICAgIEluY3JlYXNlcyBwcmVjaXNpb24gdG8gZm9yY2UgdGhlIGZpcnN0CiAgICAgICAgIGRpZ2l0IG9mIHRoZSByZXN1bHQgdG8gYmUgYSB6ZXJvLgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+eDwvQ09ERT4KPEREPgogICAgICAgICBBIG5vbi16ZXJvIHJlc3VsdCB3aWxsIGhhdmUgYSA8Q09ERT4weDwvQ09ERT4KICAgICAgICAgcHJlZml4LgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+WDwvQ09ERT4KPEREPgogICAgICAgICBBIG5vbi16ZXJvIHJlc3VsdCB3aWxsIGhhdmUgYSA8Q09ERT4wWDwvQ09ERT4KICAgICAgICAgcHJlZml4LgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+YSwgQSwgZSwgRSwgZiwgb3IgRjwvQ09ERT4KPEREPgogICAgICAgICBUaGUgcmVzdWx0IHdpbGwgYWx3YXlzIGNvbnRhaW4gYQogICAgICAgICBkZWNpbWFsIHBvaW50IGV2ZW4gaWYgbm8gZGlnaXRzIGZvbGxvdwogICAgICAgICB0aGUgcG9pbnQuICAoTm9ybWFsbHksIGEgZGVjaW1hbCBwb2ludAogICAgICAgICBhcHBlYXJzIG9ubHkgaWYgYSBkaWdpdCBmb2xsb3dzIGl0LikKICAgICAgICAgVHJhaWxpbmcgemVyb3MgYXJlIHJlbW92ZWQuCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5nIG9yIEc8L0NPREU+CjxERD4KICAgICAgICAgVGhlIHJlc3VsdCB3aWxsIGFsd2F5cyBjb250YWluIGEKICAgICAgICAgZGVjaW1hbCBwb2ludCBldmVuIGlmIG5vIGRpZ2l0cyBmb2xsb3cKICAgICAgICAgdGhlIHBvaW50LiAgVHJhaWxpbmcgemVyb3MgYXJlIG5vdAogICAgICAgICByZW1vdmVkLgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+YWxsIG90aGVyczwvQ09ERT4KPEREPgogICAgICAgICBVbmRlZmluZWQuCiAgICAgICAgIDxicj48YnI+IAo8L0RMPgogICAgICAgICA8YnI+PGJyPiAKPC9ETD4KICAgICAgICAgPGJyPjxicj4gPGJyPjxicj4gPExJPiA8VkFSPndpZHRoPC9WQVI+CiAgICAgICAgIDxicj48YnI+IDxWQVI+d2lkdGg8L1ZBUj4gaXMgYW4gb3B0aW9uYWwgbWluaW11bSBmaWVsZCB3aWR0aC4gIFlvdSBjYW4KICAgICAgICAgZWl0aGVyIHNwZWNpZnkgaXQgZGlyZWN0bHkgYXMgYSBkZWNpbWFsIGludGVnZXIsIG9yCiAgICAgICAgIGluZGlyZWN0bHkgYnkgdXNpbmcgaW5zdGVhZCBhbiBhc3RlcmlzayAoPENPREU+KjwvQ09ERT4pLCBpbgogICAgICAgICB3aGljaCBjYXNlIGFuIDxDT0RFPmludDwvQ09ERT4gYXJndW1lbnQgaXMgdXNlZCBhcyB0aGUgZmllbGQKICAgICAgICAgd2lkdGguICBJZiBwb3NpdGlvbmFsIGFyZ3VtZW50cyBhcmUgdXNlZCwgdGhlbiB0aGUKICAgICAgICAgd2lkdGggbXVzdCBhbHNvIGJlIHNwZWNpZmllZCBwb3NpdGlvbmFsbHkgYXMgPENPREU+Km0kPC9DT0RFPiwKICAgICAgICAgd2l0aCBtIGFzIGEgZGVjaW1hbCBpbnRlZ2VyLiAgTmVnYXRpdmUgZmllbGQgd2lkdGhzCiAgICAgICAgIGFyZSB0cmVhdGVkIGFzIHNwZWNpZnlpbmcgdGhlIG1pbnVzICg8Q09ERT4tPC9DT0RFPikgZmxhZyBmb3IKICAgICAgICAgbGVmdCBqdXN0ZmljYXRpb24sIGFsb25nIHdpdGggYSBwb3NpdGl2ZSBmaWVsZCB3aWR0aC4KICAgICAgICAgVGhlIHJlc3VsdGluZyBmb3JtYXQgbWF5IGJlIHdpZGVyIHRoYW4gdGhlIHNwZWNpZmllZAogICAgICAgICB3aWR0aC4KICAgICAgICAgPGJyPjxicj4gPExJPiA8VkFSPnByZWM8L1ZBUj4KICAgICAgICAgPGJyPjxicj4gPFZBUj5wcmVjPC9WQVI+IGlzIGFuIG9wdGlvbmFsIGZpZWxkOyBpZiBwcmVzZW50LCBpdCBpcwogICAgICAgICBpbnRyb2R1Y2VkIHdpdGggYDxDT0RFPi48L0NPREU+JyAoYSBwZXJpb2QpLiBZb3UgY2FuIHNwZWNpZnkKICAgICAgICAgdGhlIHByZWNpc2lvbiBlaXRoZXIgZGlyZWN0bHkgYXMgYSBkZWNpbWFsIGludGVnZXIgb3IKICAgICAgICAgaW5kaXJlY3RseSBieSB1c2luZyBhbiBhc3RlcmlzayAoPENPREU+KjwvQ09ERT4pLCBpbiB3aGljaCBjYXNlCiAgICAgICAgIGFuIDxDT0RFPmludDwvQ09ERT4gYXJndW1lbnQgaXMgdXNlZCBhcyB0aGUgcHJlY2lzaW9uLiAgSWYKICAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHMgYXJlIHVzZWQsIHRoZW4gdGhlIHByZWNpc2lvbiBtdXN0CiAgICAgICAgIGFsc28gYmUgc3BlY2lmaWVkIHBvc2l0aW9uYWxseSBhcyA8Q09ERT4qbSQ8L0NPREU+LCB3aXRoIG0gYXMgYQogICAgICAgICBkZWNpbWFsIGludGVnZXIuICBTdXBwbHlpbmcgYSBuZWdhdGl2ZSBwcmVjaXNpb24gaXMKICAgICAgICAgZXF1aXZhbGVudCB0byBvbWl0dGluZyB0aGUgcHJlY2lzaW9uLiAgSWYgb25seSBhCiAgICAgICAgIHBlcmlvZCBpcyBzcGVjaWZpZWQgdGhlIHByZWNpc2lvbiBpcyB6ZXJvLiBUaGUgZWZmZWN0CiAgICAgICAgIGRlcGVuZHMgb24gdGhlIGNvbnZlcnNpb24gPFZBUj50eXBlPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+ZCwgaSwgbywgdSwgeCwgb3IgWDwvQ09ERT4KPEREPgogICAgICAgICBNaW5pbXVtIG51bWJlciBvZiBkaWdpdHMgdG8gYXBwZWFyLiAgSWYgbm8KICAgICAgICAgcHJlY2lzaW9uIGlzIGdpdmVuLCBkZWZhdWx0cyB0byAxLgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+YSBvciBBPC9DT0RFPgo8REQ+CiAgICAgICAgIE51bWJlciBvZiBkaWdpdHMgdG8gYXBwZWFyIGFmdGVyIHRoZSBkZWNpbWFsCiAgICAgICAgIHBvaW50LiAgSWYgbm8gcHJlY2lzaW9uIGlzIGdpdmVuLCB0aGUKICAgICAgICAgcHJlY2lzaW9uIGRlZmF1bHRzIHRvIHRoZSBtaW5pbXVtIG5lZWRlZCBmb3IKICAgICAgICAgYW4gZXhhY3QgcmVwcmVzZW50YXRpb24uCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5lLCBFLCBmIG9yIEY8L0NPREU+CjxERD4KICAgICAgICAgTnVtYmVyIG9mIGRpZ2l0cyB0byBhcHBlYXIgYWZ0ZXIgdGhlIGRlY2ltYWwKICAgICAgICAgcG9pbnQuICBJZiBubyBwcmVjaXNpb24gaXMgZ2l2ZW4sIHRoZQogICAgICAgICBwcmVjaXNpb24gZGVmYXVsdHMgdG8gNi4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPmcgb3IgRzwvQ09ERT4KPEREPgogICAgICAgICBNYXhpbXVtIG51bWJlciBvZiBzaWduaWZpY2FudCBkaWdpdHMuICBBCiAgICAgICAgIHByZWNpc2lvbiBvZiAwIGlzIHRyZWF0ZWQgdGhlIHNhbWUgYXMgYQogICAgICAgICBwcmVjaXNpb24gb2YgMS4gIElmIG5vIHByZWNpc2lvbiBpcyBnaXZlbiwgdGhlCiAgICAgICAgIHByZWNpc2lvbiBkZWZhdWx0cyB0byA2LgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+cyBvciBTPC9DT0RFPgo8REQ+CiAgICAgICAgIE1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcHJpbnQgZnJvbSB0aGUKICAgICAgICAgc3RyaW5nLiAgSWYgbm8gcHJlY2lzaW9uIGlzIGdpdmVuLCB0aGUgZW50aXJlCiAgICAgICAgIHN0cmluZyBpcyBwcmludGVkLgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+YWxsIG90aGVyczwvQ09ERT4KPEREPgogICAgICAgICB1bmRlZmluZWQuCiAgICAgICAgIDxicj48YnI+IAo8L0RMPgogICAgICAgICA8YnI+PGJyPiA8YnI+PGJyPiA8TEk+IDxWQVI+c2l6ZTwvVkFSPgogICAgICAgICA8YnI+PGJyPiA8VkFSPnNpemU8L1ZBUj4gaXMgYW4gb3B0aW9uYWwgbW9kaWZpZXIgdGhhdCBjaGFuZ2VzIHRoZSBkYXRhCiAgICAgICAgIHR5cGUgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBhcmd1bWVudCBoYXMuICBCZWhhdmlvciBpcwogICAgICAgICB1bnNwZWNpZmllZCBpZiBhIHNpemUgaXMgZ2l2ZW4gdGhhdCBkb2VzIG5vdCBtYXRjaCB0aGUKICAgICAgICAgPFZBUj50eXBlPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+aGg8L0NPREU+CjxERD4KICAgICAgICAgV2l0aCA8Q09ERT5kPC9DT0RFPiwgPENPREU+aTwvQ09ERT4sIDxDT0RFPm88L0NPREU+LCA8Q09ERT51PC9DT0RFPiwgPENPREU+eDwvQ09ERT4sIG9yCiAgICAgICAgIDxDT0RFPlg8L0NPREU+LCBzcGVjaWZpZXMgdGhhdCB0aGUgYXJndW1lbnQgc2hvdWxkIGJlCiAgICAgICAgIGNvbnZlcnRlZCB0byBhIDxDT0RFPnNpZ25lZCBjaGFyPC9DT0RFPiBvciA8Q09ERT51bnNpZ25lZAogICAgICAgICBjaGFyPC9DT0RFPiBiZWZvcmUgcHJpbnRpbmcuCiAgICAgICAgIDxicj48YnI+IFdpdGggPENPREU+bjwvQ09ERT4sIHNwZWNpZmllcyB0aGF0IHRoZSBhcmd1bWVudCBpcyBhCiAgICAgICAgIHBvaW50ZXIgdG8gYSA8Q09ERT5zaWduZWQgY2hhcjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5oPC9DT0RFPgo8REQ+CiAgICAgICAgIFdpdGggPENPREU+ZDwvQ09ERT4sIDxDT0RFPmk8L0NPREU+LCA8Q09ERT5vPC9DT0RFPiwgPENPREU+dTwvQ09ERT4sIDxDT0RFPng8L0NPREU+LCBvcgogICAgICAgICA8Q09ERT5YPC9DT0RFPiwgc3BlY2lmaWVzIHRoYXQgdGhlIGFyZ3VtZW50IHNob3VsZCBiZQogICAgICAgICBjb252ZXJ0ZWQgdG8gYSA8Q09ERT5zaG9ydDwvQ09ERT4gb3IgPENPREU+dW5zaWduZWQgc2hvcnQ8L0NPREU+CiAgICAgICAgIGJlZm9yZSBwcmludGluZy4KICAgICAgICAgPGJyPjxicj4gV2l0aCA8Q09ERT5uPC9DT0RFPiwgc3BlY2lmaWVzIHRoYXQgdGhlIGFyZ3VtZW50IGlzIGEKICAgICAgICAgcG9pbnRlciB0byBhIDxDT0RFPnNob3J0PC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPmw8L0NPREU+CjxERD4KICAgICAgICAgV2l0aCA8Q09ERT5kPC9DT0RFPiwgPENPREU+aTwvQ09ERT4sIDxDT0RFPm88L0NPREU+LCA8Q09ERT51PC9DT0RFPiwgPENPREU+eDwvQ09ERT4sIG9yCiAgICAgICAgIDxDT0RFPlg8L0NPREU+LCBzcGVjaWZpZXMgdGhhdCB0aGUgYXJndW1lbnQgaXMgYQogICAgICAgICA8Q09ERT5sb25nPC9DT0RFPiBvciA8Q09ERT51bnNpZ25lZCBsb25nPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gV2l0aCA8Q09ERT5jPC9DT0RFPiwgc3BlY2lmaWVzIHRoYXQgdGhlIGFyZ3VtZW50IGhhcwogICAgICAgICB0eXBlIDxDT0RFPndpbnRfdDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFdpdGggPENPREU+czwvQ09ERT4sIHNwZWNpZmllcyB0aGF0IHRoZSBhcmd1bWVudCBpcyBhCiAgICAgICAgIHBvaW50ZXIgdG8gPENPREU+d2NoYXJfdDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFdpdGggPENPREU+bjwvQ09ERT4sIHNwZWNpZmllcyB0aGF0IHRoZSBhcmd1bWVudCBpcyBhCiAgICAgICAgIHBvaW50ZXIgdG8gYSA8Q09ERT5sb25nPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gV2l0aCA8Q09ERT5hPC9DT0RFPiwgPENPREU+QTwvQ09ERT4sIDxDT0RFPmU8L0NPREU+LCA8Q09ERT5FPC9DT0RFPiwgPENPREU+ZjwvQ09ERT4sIDxDT0RFPkY8L0NPREU+LAogICAgICAgICA8Q09ERT5nPC9DT0RFPiwgb3IgPENPREU+RzwvQ09ERT4sIGhhcyBubyBlZmZlY3QgKGJlY2F1c2Ugb2YKICAgICAgICAgdmFyYXJnIHByb21vdGlvbiBydWxlcywgdGhlcmUgaXMgbm8gbmVlZCB0bwogICAgICAgICBkaXN0aW5ndWlzaCBiZXR3ZWVuIDxDT0RFPmZsb2F0PC9DT0RFPiBhbmQgPENPREU+ZG91YmxlPC9DT0RFPikuCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5sbDwvQ09ERT4KPEREPgogICAgICAgICBXaXRoIDxDT0RFPmQ8L0NPREU+LCA8Q09ERT5pPC9DT0RFPiwgPENPREU+bzwvQ09ERT4sIDxDT0RFPnU8L0NPREU+LCA8Q09ERT54PC9DT0RFPiwgb3IKICAgICAgICAgPENPREU+WDwvQ09ERT4sIHNwZWNpZmllcyB0aGF0IHRoZSBhcmd1bWVudCBpcyBhCiAgICAgICAgIDxDT0RFPmxvbmcgbG9uZzwvQ09ERT4gb3IgPENPREU+dW5zaWduZWQgbG9uZyBsb25nPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gV2l0aCA8Q09ERT5uPC9DT0RFPiwgc3BlY2lmaWVzIHRoYXQgdGhlIGFyZ3VtZW50IGlzIGEKICAgICAgICAgcG9pbnRlciB0byBhIDxDT0RFPmxvbmcgbG9uZzwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5qPC9DT0RFPgo8REQ+CiAgICAgICAgIFdpdGggPENPREU+ZDwvQ09ERT4sIDxDT0RFPmk8L0NPREU+LCA8Q09ERT5vPC9DT0RFPiwgPENPREU+dTwvQ09ERT4sIDxDT0RFPng8L0NPREU+LCBvcgogICAgICAgICA8Q09ERT5YPC9DT0RFPiwgc3BlY2lmaWVzIHRoYXQgdGhlIGFyZ3VtZW50IGlzIGFuCiAgICAgICAgIDxDT0RFPmludG1heF90PC9DT0RFPiBvciA8Q09ERT51aW50bWF4X3Q8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBXaXRoIDxDT0RFPm48L0NPREU+LCBzcGVjaWZpZXMgdGhhdCB0aGUgYXJndW1lbnQgaXMgYQogICAgICAgICBwb2ludGVyIHRvIGFuIDxDT0RFPmludG1heF90PC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPno8L0NPREU+CjxERD4KICAgICAgICAgV2l0aCA8Q09ERT5kPC9DT0RFPiwgPENPREU+aTwvQ09ERT4sIDxDT0RFPm88L0NPREU+LCA8Q09ERT51PC9DT0RFPiwgPENPREU+eDwvQ09ERT4sIG9yCiAgICAgICAgIDxDT0RFPlg8L0NPREU+LCBzcGVjaWZpZXMgdGhhdCB0aGUgYXJndW1lbnQgaXMgYQogICAgICAgICA8Q09ERT5zc2l6ZV90PC9DT0RFPiBvciA8Q09ERT5zaXplX3Q8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBXaXRoIDxDT0RFPm48L0NPREU+LCBzcGVjaWZpZXMgdGhhdCB0aGUgYXJndW1lbnQgaXMgYQogICAgICAgICBwb2ludGVyIHRvIGEgPENPREU+c3NpemVfdDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT50PC9DT0RFPgo8REQ+CiAgICAgICAgIFdpdGggPENPREU+ZDwvQ09ERT4sIDxDT0RFPmk8L0NPREU+LCA8Q09ERT5vPC9DT0RFPiwgPENPREU+dTwvQ09ERT4sIDxDT0RFPng8L0NPREU+LCBvcgogICAgICAgICA8Q09ERT5YPC9DT0RFPiwgc3BlY2lmaWVzIHRoYXQgdGhlIGFyZ3VtZW50IGlzIGEKICAgICAgICAgPENPREU+cHRyZGlmZl90PC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gV2l0aCA8Q09ERT5uPC9DT0RFPiwgc3BlY2lmaWVzIHRoYXQgdGhlIGFyZ3VtZW50IGlzIGEKICAgICAgICAgcG9pbnRlciB0byBhIDxDT0RFPnB0cmRpZmZfdDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5MPC9DT0RFPgo8REQ+CiAgICAgICAgIFdpdGggPENPREU+YTwvQ09ERT4sIDxDT0RFPkE8L0NPREU+LCA8Q09ERT5lPC9DT0RFPiwgPENPREU+RTwvQ09ERT4sIDxDT0RFPmY8L0NPREU+LCA8Q09ERT5GPC9DT0RFPiwKICAgICAgICAgPENPREU+ZzwvQ09ERT4sIG9yIDxDT0RFPkc8L0NPREU+LCBzcGVjaWZpZXMgdGhhdCB0aGUgYXJndW1lbnQKICAgICAgICAgaXMgYSA8Q09ERT5sb25nIGRvdWJsZTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IAo8L0RMPgogICAgICAgICA8YnI+PGJyPiA8YnI+PGJyPiA8TEk+ICAgPFZBUj50eXBlPC9WQVI+CiAgICAgICAgIDxicj48YnI+IDxWQVI+dHlwZTwvVkFSPiBzcGVjaWZpZXMgd2hhdCBraW5kIG9mIGNvbnZlcnNpb24gPENPREU+cHJpbnRmPC9DT0RFPgogICAgICAgICBwZXJmb3Jtcy4gIEhlcmUgaXMgYSB0YWJsZSBvZiB0aGVzZToKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPiU8L0NPREU+CjxERD4KICAgICAgICAgUHJpbnRzIHRoZSBwZXJjZW50IGNoYXJhY3RlciAoPENPREU+JTwvQ09ERT4pLgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+YzwvQ09ERT4KPEREPgogICAgICAgICBQcmludHMgPFZBUj5hcmc8L1ZBUj4gYXMgc2luZ2xlIGNoYXJhY3Rlci4gIElmIHRoZQogICAgICAgICA8Q09ERT5sPC9DT0RFPiBzaXplIHNwZWNpZmllciBpcyBpbiBlZmZlY3QsIGEgbXVsdGlieXRlCiAgICAgICAgIGNoYXJhY3RlciBpcyBwcmludGVkLgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+QzwvQ09ERT4KPEREPgogICAgICAgICBTaG9ydCBmb3IgPENPREU+JWxjPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPnM8L0NPREU+CjxERD4KICAgICAgICAgUHJpbnRzIHRoZSBlbGVtZW50cyBvZiBhIHBvaW50ZXIgdG8gPENPREU+Y2hhcjwvQ09ERT4KICAgICAgICAgdW50aWwgdGhlIHByZWNpc2lvbiBvciBhIG51bGwgY2hhcmFjdGVyIGlzCiAgICAgICAgIHJlYWNoZWQuICBJZiB0aGUgPENPREU+bDwvQ09ERT4gc2l6ZSBzcGVjaWZpZXIgaXMgaW4KICAgICAgICAgZWZmZWN0LCB0aGUgcG9pbnRlciBpcyB0byBhbiBhcnJheSBvZgogICAgICAgICA8Q09ERT53Y2hhcl90PC9DT0RFPiwgYW5kIHRoZSBzdHJpbmcgaXMgY29udmVydGVkIHRvCiAgICAgICAgIG11bHRpYnl0ZSBjaGFyYWN0ZXJzIGJlZm9yZSBwcmludGluZy4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPlM8L0NPREU+CjxERD4KICAgICAgICAgU2hvcnQgZm9yIDxDT0RFPiVsczwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5kIG9yIGk8L0NPREU+CjxERD4KICAgICAgICAgUHJpbnRzIGEgc2lnbmVkIGRlY2ltYWwgaW50ZWdlcjsgdGFrZXMgYW4KICAgICAgICAgPENPREU+aW50PC9DT0RFPi4gIExlYWRpbmcgemVyb3MgYXJlIGluc2VydGVkIGFzCiAgICAgICAgIG5lY2Vzc2FyeSB0byByZWFjaCB0aGUgcHJlY2lzaW9uLiAgQSBwcmVjaXNpb24KICAgICAgICAgb2YgMCBwcm9kdWNlcyBhbiBlbXB0eSBzdHJpbmcuCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5EPC9DT0RFPgo8REQ+CiAgICAgICAgIE5ld2xpYiBleHRlbnNpb24sIHNob3J0IGZvciA8Q09ERT4lbGQ8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+bzwvQ09ERT4KPEREPgogICAgICAgICBQcmludHMgYW4gdW5zaWduZWQgb2N0YWwgaW50ZWdlcjsgdGFrZXMgYW4KICAgICAgICAgPENPREU+dW5zaWduZWQ8L0NPREU+LiAgTGVhZGluZyB6ZXJvcyBhcmUgaW5zZXJ0ZWQgYXMKICAgICAgICAgbmVjZXNzYXJ5IHRvIHJlYWNoIHRoZSBwcmVjaXNpb24uICBBIHByZWNpc2lvbgogICAgICAgICBvZiAwIHByb2R1Y2VzIGFuIGVtcHR5IHN0cmluZy4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPk88L0NPREU+CjxERD4KICAgICAgICAgTmV3bGliIGV4dGVuc2lvbiwgc2hvcnQgZm9yIDxDT0RFPiVsbzwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT51PC9DT0RFPgo8REQ+CiAgICAgICAgIFByaW50cyBhbiB1bnNpZ25lZCBkZWNpbWFsIGludGVnZXI7IHRha2VzIGFuCiAgICAgICAgIDxDT0RFPnVuc2lnbmVkPC9DT0RFPi4gIExlYWRpbmcgemVyb3MgYXJlIGluc2VydGVkIGFzCiAgICAgICAgIG5lY2Vzc2FyeSB0byByZWFjaCB0aGUgcHJlY2lzaW9uLiAgQSBwcmVjaXNpb24KICAgICAgICAgb2YgMCBwcm9kdWNlcyBhbiBlbXB0eSBzdHJpbmcuCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5VPC9DT0RFPgo8REQ+CiAgICAgICAgIE5ld2xpYiBleHRlbnNpb24sIHNob3J0IGZvciA8Q09ERT4lbHU8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+eDwvQ09ERT4KPEREPgogICAgICAgICBQcmludHMgYW4gdW5zaWduZWQgaGV4YWRlY2ltYWwgaW50ZWdlciAodXNpbmcKICAgICAgICAgPENPREU+YWJjZGVmPC9DT0RFPiBhcyBkaWdpdHMgYmV5b25kIDxDT0RFPjk8L0NPREU+KTsgdGFrZXMgYW4KICAgICAgICAgPENPREU+dW5zaWduZWQ8L0NPREU+LiAgTGVhZGluZyB6ZXJvcyBhcmUgaW5zZXJ0ZWQgYXMKICAgICAgICAgbmVjZXNzYXJ5IHRvIHJlYWNoIHRoZSBwcmVjaXNpb24uICBBIHByZWNpc2lvbgogICAgICAgICBvZiAwIHByb2R1Y2VzIGFuIGVtcHR5IHN0cmluZy4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPlg8L0NPREU+CjxERD4KICAgICAgICAgTGlrZSA8Q09ERT54PC9DT0RFPiwgYnV0IHVzZXMgPENPREU+QUJDREVGPC9DT0RFPiBhcyBkaWdpdHMKICAgICAgICAgYmV5b25kIDxDT0RFPjk8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+ZjwvQ09ERT4KPEREPgogICAgICAgICBQcmludHMgYSBzaWduZWQgdmFsdWUgb2YgdGhlIGZvcm0KICAgICAgICAgPENPREU+Wy1dOTk5OS45OTk5PC9DT0RFPiwgd2l0aCB0aGUgcHJlY2lzaW9uCiAgICAgICAgIGRldGVybWluaW5nIGhvdyBtYW55IGRpZ2l0cyBmb2xsb3cgdGhlIGRlY2ltYWwKICAgICAgICAgcG9pbnQ7IHRha2VzIGEgPENPREU+ZG91YmxlPC9DT0RFPiAocmVtZW1iZXIgdGhhdAogICAgICAgICA8Q09ERT5mbG9hdDwvQ09ERT4gcHJvbW90ZXMgdG8gPENPREU+ZG91YmxlPC9DT0RFPiBhcyBhIHZhcmFyZykuCiAgICAgICAgIFRoZSBsb3cgb3JkZXIgZGlnaXQgaXMgcm91bmRlZCB0byBldmVuLiAgSWYKICAgICAgICAgdGhlIHByZWNpc2lvbiByZXN1bHRzIGluIGF0IG1vc3QgREVDSU1BTF9ESUcKICAgICAgICAgZGlnaXRzLCB0aGUgcmVzdWx0IGlzIHJvdW5kZWQgY29ycmVjdGx5OyBpZgogICAgICAgICBtb3JlIHRoYW4gREVDSU1BTF9ESUcgZGlnaXRzIGFyZSBwcmludGVkLCB0aGUKICAgICAgICAgcmVzdWx0IGlzIG9ubHkgZ3VhcmFudGVlZCB0byByb3VuZCBiYWNrIHRvIHRoZQogICAgICAgICBvcmlnaW5hbCB2YWx1ZS4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIHZhbHVlIGlzIGluZmluaXRlLCB0aGUgcmVzdWx0IGlzCiAgICAgICAgIDxDT0RFPmluZjwvQ09ERT4sIGFuZCBubyB6ZXJvIHBhZGRpbmcgaXMgcGVyZm9ybWVkLiAgSWYKICAgICAgICAgdGhlIHZhbHVlIGlzIG5vdCBhIG51bWJlciwgdGhlIHJlc3VsdCBpcwogICAgICAgICA8Q09ERT5uYW48L0NPREU+LCBhbmQgbm8gemVybyBwYWRkaW5nIGlzIHBlcmZvcm1lZC4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkY8L0NPREU+CjxERD4KICAgICAgICAgTGlrZSA8Q09ERT5mPC9DT0RFPiwgYnV0IHVzZXMgPENPREU+SU5GPC9DT0RFPiBhbmQgPENPREU+TkFOPC9DT0RFPiBmb3IKICAgICAgICAgbm9uLWZpbml0ZSBudW1iZXJzLgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+ZTwvQ09ERT4KPEREPgogICAgICAgICBQcmludHMgYSBzaWduZWQgdmFsdWUgb2YgdGhlIGZvcm0KICAgICAgICAgPENPREU+Wy1dOS45OTk5ZVsrfC1dOTk5PC9DT0RFPjsgdGFrZXMgYSA8Q09ERT5kb3VibGU8L0NPREU+LgogICAgICAgICBUaGUgZGlnaXQgYmVmb3JlIHRoZSBkZWNpbWFsIHBvaW50IGlzIG5vbi16ZXJvCiAgICAgICAgIGlmIHRoZSB2YWx1ZSBpcyBub24temVyby4gIFRoZSBwcmVjaXNpb24KICAgICAgICAgZGV0ZXJtaW5lcyBob3cgbWFueSBkaWdpdHMgYXBwZWFyIGJldHdlZW4KICAgICAgICAgPENPREU+LjwvQ09ERT4gYW5kIDxDT0RFPmU8L0NPREU+LCBhbmQgdGhlIGV4cG9uZW50IGFsd2F5cwogICAgICAgICBjb250YWlucyBhdCBsZWFzdCB0d28gZGlnaXRzLiAgVGhlIHZhbHVlIHplcm8KICAgICAgICAgaGFzIGFuIGV4cG9uZW50IG9mIHplcm8uICBJZiB0aGUgdmFsdWUgaXMgbm90CiAgICAgICAgIGZpbml0ZSwgaXQgaXMgcHJpbnRlZCBsaWtlIDxDT0RFPmY8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RTwvQ09ERT4KPEREPgogICAgICAgICBMaWtlIDxDT0RFPmU8L0NPREU+LCBidXQgdXNpbmcgPENPREU+RTwvQ09ERT4gdG8gaW50cm9kdWNlIHRoZQogICAgICAgICBleHBvbmVudCwgYW5kIGxpa2UgPENPREU+RjwvQ09ERT4gZm9yIG5vbi1maW5pdGUKICAgICAgICAgdmFsdWVzLgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+ZzwvQ09ERT4KPEREPgogICAgICAgICBQcmludHMgYSBzaWduZWQgdmFsdWUgaW4gZWl0aGVyIDxDT0RFPmY8L0NPREU+IG9yIDxDT0RFPmU8L0NPREU+CiAgICAgICAgIGZvcm0sIGJhc2VkIG9uIHRoZSBnaXZlbiB2YWx1ZSBhbmQKICAgICAgICAgcHJlY2lzaW9uLS0tYW4gZXhwb25lbnQgbGVzcyB0aGFuIC00IG9yCiAgICAgICAgIGdyZWF0ZXIgdGhhbiB0aGUgcHJlY2lzaW9uIHNlbGVjdHMgdGhlIDxDT0RFPmU8L0NPREU+CiAgICAgICAgIGZvcm0uICBUcmFpbGluZyB6ZXJvcyBhbmQgdGhlIGRlY2ltYWwgcG9pbnQKICAgICAgICAgYXJlIHByaW50ZWQgb25seSBpZiBuZWNlc3Nhcnk7IHRha2VzIGEKICAgICAgICAgPENPREU+ZG91YmxlPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkc8L0NPREU+CjxERD4KICAgICAgICAgTGlrZSA8Q09ERT5nPC9DT0RFPiwgZXhjZXB0IHVzZSA8Q09ERT5GPC9DT0RFPiBvciA8Q09ERT5FPC9DT0RFPiBmb3JtLgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+YTwvQ09ERT4KPEREPgogICAgICAgICBQcmludHMgYSBzaWduZWQgdmFsdWUgb2YgdGhlIGZvcm0KICAgICAgICAgPENPREU+Wy1dMHgxLmZmZmZwWyt8LV05PC9DT0RFPjsgdGFrZXMgYSA8Q09ERT5kb3VibGU8L0NPREU+LgogICAgICAgICBUaGUgbGV0dGVycyA8Q09ERT5hYmNkZWY8L0NPREU+IGFyZSB1c2VkIGZvciBkaWdpdHMKICAgICAgICAgYmV5b25kIDxDT0RFPjk8L0NPREU+LiAgVGhlIHByZWNpc2lvbiBkZXRlcm1pbmVzIGhvdwogICAgICAgICBtYW55IGRpZ2l0cyBhcHBlYXIgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuCiAgICAgICAgIFRoZSBleHBvbmVudCBjb250YWlucyBhdCBsZWFzdCBvbmUgZGlnaXQsIGFuZAogICAgICAgICBpcyBhIGRlY2ltYWwgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBwb3dlciBvZgogICAgICAgICAyOyBhIHZhbHVlIG9mIDAgaGFzIGFuIGV4cG9uZW50IG9mIDAuCiAgICAgICAgIE5vbi1maW5pdGUgdmFsdWVzIGFyZSBwcmludGVkIGxpa2UgPENPREU+ZjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5BPC9DT0RFPgo8REQ+CiAgICAgICAgIExpa2UgPENPREU+YTwvQ09ERT4sIGV4Y2VwdCB1c2VzIDxDT0RFPlg8L0NPREU+LCA8Q09ERT5QPC9DT0RFPiwgYW5kCiAgICAgICAgIDxDT0RFPkFCQ0RFRjwvQ09ERT4gaW5zdGVhZCBvZiBsb3dlciBjYXNlLgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+bjwvQ09ERT4KPEREPgogICAgICAgICBUYWtlcyBhIHBvaW50ZXIgdG8gPENPREU+aW50PC9DT0RFPiwgYW5kIHN0b3JlcyBhIGNvdW50CiAgICAgICAgIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBzbyBmYXIuICBObwogICAgICAgICBvdXRwdXQgaXMgY3JlYXRlZC4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPnA8L0NPREU+CjxERD4KICAgICAgICAgVGFrZXMgYSBwb2ludGVyIHRvIDxDT0RFPnZvaWQ8L0NPREU+LCBhbmQgcHJpbnRzIGl0IGluCiAgICAgICAgIGFuIGltcGxlbWVudGF0aW9uLWRlZmluZWQgZm9ybWF0LiAgVGhpcwogICAgICAgICBpbXBsZW1lbnRhdGlvbiBpcyBzaW1pbGFyIHRvIDxDT0RFPiUjdHg8L0NPREU+KSwgZXhjZXB0CiAgICAgICAgIHRoYXQgPENPREU+MHg8L0NPREU+IGFwcGVhcnMgZXZlbiBmb3IgdGhlIE5VTEwgcG9pbnRlci4KICAgICAgICAgPGJyPjxicj4gPC9ETD4KICAgICAgICAgPGJyPjxicj4gPC9PTD4KICAgICAgICAgPGJyPjxicj4gPGJyPjxicj4gPENPREU+X3ByaW50Zl9yPC9DT0RFPiwgPENPREU+X2ZwcmludGZfcjwvQ09ERT4sIDxDT0RFPl9hc3ByaW50Zl9yPC9DT0RFPiwKICAgICAgICAgPENPREU+X3NwcmludGZfcjwvQ09ERT4sIDxDT0RFPl9zbnByaW50Zl9yPC9DT0RFPiwgPENPREU+X2FzbnByaW50Zl9yPC9DT0RFPiBhcmUgc2ltcGx5CiAgICAgICAgIHJlZW50cmFudCB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgT24gc3VjY2VzcywgPENPREU+c3ByaW50ZjwvQ09ERT4gYW5kIDxDT0RFPmFzcHJpbnRmPC9DT0RFPiByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBpbgogICAgICAgICB0aGUgb3V0cHV0IHN0cmluZywgZXhjZXB0IHRoZSBjb25jbHVkaW5nIDxDT0RFPk5VTDwvQ09ERT4gaXMgbm90IGNvdW50ZWQuCiAgICAgICAgIDxDT0RFPnNucHJpbnRmPC9DT0RFPiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBpbiB0aGUgb3V0cHV0CiAgICAgICAgIHN0cmluZywgZXhjZXB0IHRoZSBjb25jbHVkaW5nIDxDT0RFPk5VTDwvQ09ERT4gaXMgbm90IGNvdW50ZWQuICA8Q09ERT5wcmludGY8L0NPREU+IGFuZAogICAgICAgICA8Q09ERT5mcHJpbnRmPC9DT0RFPiByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRyYW5zbWl0dGVkLgogICAgICAgICA8Q09ERT5hc25wcmludGY8L0NPREU+IHJldHVybnMgdGhlIG9yaWdpbmFsIDxWQVI+c3RyPC9WQVI+IGlmIHRoZXJlIHdhcyBlbm91Z2ggcm9vbSwKICAgICAgICAgb3RoZXJ3aXNlIGl0IHJldHVybnMgYW4gYWxsb2NhdGVkIHN0cmluZy4KICAgICAgICAgPGJyPjxicj4gSWYgYW4gZXJyb3Igb2NjdXJzLCB0aGUgcmVzdWx0IG9mIDxDT0RFPnByaW50ZjwvQ09ERT4sIDxDT0RFPmZwcmludGY8L0NPREU+LAogICAgICAgICA8Q09ERT5zbnByaW50ZjwvQ09ERT4sIGFuZCA8Q09ERT5hc3ByaW50ZjwvQ09ERT4gaXMgYSBuZWdhdGl2ZSB2YWx1ZSwgYW5kIHRoZSByZXN1bHQgb2YKICAgICAgICAgPENPREU+YXNucHJpbnRmPC9DT0RFPiBpcyBOVUxMLiAgTm8gZXJyb3IgcmV0dXJucyBvY2N1ciBmb3IgPENPREU+c3ByaW50ZjwvQ09ERT4uICBGb3IKICAgICAgICAgPENPREU+cHJpbnRmPC9DT0RFPiBhbmQgPENPREU+ZnByaW50ZjwvQ09ERT4sIDxDT0RFPmVycm5vPC9DT0RFPiBtYXkgYmUgc2V0IGFjY29yZGluZyB0bwogICAgICAgICA8Q09ERT5mcHV0YzwvQ09ERT4uICBGb3IgPENPREU+YXNwcmludGY8L0NPREU+IGFuZCA8Q09ERT5hc25wcmludGY8L0NPREU+LCA8Q09ERT5lcnJubzwvQ09ERT4gbWF5IGJlIHNldAogICAgICAgICB0byBFTk9NRU0gaWYgYWxsb2NhdGlvbiBmYWlscywgYW5kIGZvciA8Q09ERT5zbnByaW50ZjwvQ09ERT4sIDxDT0RFPmVycm5vPC9DT0RFPiBtYXkgYmUKICAgICAgICAgc2V0IHRvIEVPVkVSRkxPVyBpZiA8VkFSPnNpemU8L1ZBUj4gb3IgdGhlIG91dHB1dCBsZW5ndGggZXhjZWVkcyBJTlRfTUFYLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIEFOU0kgQyByZXF1aXJlcyA8Q09ERT5wcmludGY8L0NPREU+LCA8Q09ERT5mcHJpbnRmPC9DT0RFPiwgPENPREU+c3ByaW50ZjwvQ09ERT4sIGFuZAogICAgICAgICA8Q09ERT5zbnByaW50ZjwvQ09ERT4uICA8Q09ERT5hc3ByaW50ZjwvQ09ERT4gYW5kIDxDT0RFPmFzbnByaW50ZjwvQ09ERT4gYXJlIG5ld2xpYiBleHRlbnNpb25zLgogICAgICAgICA8YnI+PGJyPiBUaGUgQU5TSSBDIHN0YW5kYXJkIHNwZWNpZmllcyB0aGF0IGltcGxlbWVudGF0aW9ucyBtdXN0IHN1cHBvcnQgYXQKICAgICAgICAgbGVhc3QgZm9ybWF0dGVkIG91dHB1dCBvZiB1cCB0byA1MDkgY2hhcmFjdGVycy4gIFRoaXMgaW1wbGVtZW50YXRpb24KICAgICAgICAgaGFzIG5vIGluaGVyZW50IGxpbWl0LgogICAgICAgICA8YnI+PGJyPiBEZXBlbmRpbmcgb24gaG93IG5ld2xpYiB3YXMgY29uZmlndXJlZCwgbm90IGFsbCBmb3JtYXQgc3BlY2lmaWVycyBhcmUKICAgICAgICAgc3VwcG9ydGVkLgogICAgICAgICA8YnI+PGJyPiBTdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzIHJlcXVpcmVkOiA8Q09ERT5jbG9zZTwvQ09ERT4sIDxDT0RFPmZzdGF0PC9DT0RFPiwgPENPREU+aXNhdHR5PC9DT0RFPiwKICAgICAgICAgPENPREU+bHNlZWs8L0NPREU+LCA8Q09ERT5yZWFkPC9DT0RFPiwgPENPREU+c2JyazwvQ09ERT4sIDxDT0RFPndyaXRlPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAdzdGRpby5oeHEAfgBNdABDc3RydWN0IF9yZWVudCAqcHRyLCBjaGFyICpzdHIsc2l6ZV90ICpzaXplLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLnQABmNoYXIgKnQAC19hc3ByaW50Zl9yc3EAfgAKcHEAfgBPc3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+AFR0ADdzdHJ1Y3QgX3JlZW50ICpwdHIsIGNoYXIgKipzdHJwLGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4udAAEaW50IHQAB19hdG9pX3JzcQB+AApwdAOWCiAgICAgICAgPENPREU+YXRvaTwvQ09ERT4gY29udmVydHMgdGhlIGluaXRpYWwgcG9ydGlvbiBvZiBhIHN0cmluZyB0byBhbiA8Q09ERT5pbnQ8L0NPREU+LgogICAgICAgICA8Q09ERT5hdG9sPC9DT0RFPiBjb252ZXJ0cyB0aGUgaW5pdGlhbCBwb3J0aW9uIG9mIGEgc3RyaW5nIHRvIGEgPENPREU+bG9uZzwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxDT0RFPmF0b2kocyk8L0NPREU+IGlzIGltcGxlbWVudGVkIGFzIDxDT0RFPihpbnQpc3RydG9sKHMsIE5VTEwsIDEwKS48L0NPREU+CiAgICAgICAgIDxDT0RFPmF0b2wocyk8L0NPREU+IGlzIGltcGxlbWVudGVkIGFzIDxDT0RFPnN0cnRvbChzLCBOVUxMLCAxMCkuPC9DT0RFPgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5fYXRvaV9yPC9DT0RFPiBhbmQgPENPREU+X2F0b2xfcjwvQ09ERT4gYXJlIHJlZW50cmFudCB2ZXJzaW9ucyBvZiA8Q09ERT5hdG9pPC9DT0RFPiBhbmQKICAgICAgICAgPENPREU+YXRvbDwvQ09ERT4gcmVzcGVjdGl2ZWx5LCBwYXNzaW5nIHRoZSByZWVudHJhbmN5IHN0cnVjdCBwb2ludGVyLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgVGhlIGZ1bmN0aW9ucyByZXR1cm4gdGhlIGNvbnZlcnRlZCB2YWx1ZSwgaWYgYW55LiBJZiBubyBjb252ZXJzaW9uIHdhcwogICAgICAgICBtYWRlLCA8Q09ERT4wPC9DT0RFPiBpcyByZXR1cm5lZC4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICA8Q09ERT5hdG9pPC9DT0RFPiwgPENPREU+YXRvbDwvQ09ERT4gYXJlIEFOU0kuCiAgICAgICAgIDxicj48YnI+IE5vIHN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMgYXJlIHJlcXVpcmVkLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAXcEAAAA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ICAgIDxicj48YnI+IElmIHVuc3VjY2Vzc2Z1bCwgPENPREU+TlVMTDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgPENPREU+Y2FsbG9jPC9DT0RFPiBpcyBBTlNJLgogICAgICAgICA8YnI+PGJyPiBTdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzIHJlcXVpcmVkOiA8Q09ERT5jbG9zZTwvQ09ERT4sIDxDT0RFPmZzdGF0PC9DT0RFPiwgPENPREU+aXNhdHR5PC9DT0RFPiwKICAgICAgICAgPENPREU+bHNlZWs8L0NPREU+LCA8Q09ERT5yZWFkPC9DT0RFPiwgPENPREU+c2JyazwvQ09ERT4sIDxDT0RFPndyaXRlPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAhzdGRsaWIuaHhxAH4AbnQAH3ZvaWQgKnJlZW50LCBzaXplX3Qgbiwgc2l6ZV90IHN0AAZ2b2lkICp0AAtfZGlwcmludGZfcnNxAH4ACnB0AsEKICAgICAgICA8Q09ERT5kaXByaW50ZjwvQ09ERT4gYW5kIDxDT0RFPnZkaXByaW50ZjwvQ09ERT4gYXJlIHNpbWlsYXIgdG8gPENPREU+ZHByaW50ZjwvQ09ERT4gYW5kIDxDT0RFPnZkcHJpbnRmPC9DT0RFPiwKICAgICAgICAgZXhjZXB0IHRoYXQgb25seSBpbnRlZ2VyIGZvcm1hdCBzcGVjaWZpZXJzIGFyZSBwcm9jZXNzZWQuCiAgICAgICAgIDxicj48YnI+IFRoZSBmdW5jdGlvbnMgPENPREU+X2RpcHJpbnRmX3I8L0NPREU+IGFuZCA8Q09ERT5fdmRpcHJpbnRmX3I8L0NPREU+IGFyZSBzaW1wbHkKICAgICAgICAgcmVlbnRyYW50IHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICBTaW1pbGFyIHRvIDxDT0RFPmRwcmludGY8L0NPREU+IGFuZCA8Q09E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IGlmIDxWQVI+ZnA8L1ZBUj4gaXMgYSBzZWVrYWJsZSBpbnB1dCBzdHJlYW0gdmlzaXRpbmcgYSBmaWxlCiAgICAgICAgIGRlc2NyaXB0b3IsIHNldCB0aGUgcG9zaXRpb24gb2YgdGhlIGZpbGUgZGVzY3JpcHRvciB0byBtYXRjaCBuZXh0CiAgICAgICAgIHVucmVhZCBieXRlLCB1c2VmdWwgZm9yIG9iZXlpbmcgUE9TSVggc2VtYW50aWNzIHdoZW4gZW5kaW5nIGEgcHJvY2VzcwogICAgICAgICB3aXRob3V0IGNvbnN1bWluZyBhbGwgaW5wdXQgZnJvbSB0aGUgc3RyZWFtLgogICAgICAgICA8YnI+PGJyPiBUaGUgYWx0ZXJuYXRlIGZ1bmN0aW9uIDxDT0RFPl9mZmx1c2hfcjwvQ09ERT4gaXMgYSByZWVudHJhbnQgdmVyc2lvbiwgd2hlcmUgdGhlCiAgICAgICAgIGV4dHJhIGFyZ3VtZW50IDxWQVI+cmVlbnQ8L1ZBUj4gaXMgYSBwb2ludGVyIHRvIGEgcmVlbnRyYW5jeSBzdHJ1Y3R1cmUsIGFuZAogICAgICAgICA8VkFSPmZwPC9WQVI+IG11c3Qgbm90IGJlIE5VTEwuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICA8Q09ERT5mZmx1c2g8L0NPREU+IHJldHVybnMgPENPREU+MDwvQ09ERT4gdW5sZXNzIGl0IGVuY291bnRlcnMgYSB3cml0ZSBlcnJvcjsgaW4gdGhhdAogICAgICAgICBzaXR1YXRpb24sIGl0IHJldHVybnMgPENPREU+RU9GPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICBBTlNJIEMgcmVxdWlyZXMgPENPREU+ZmZsdXNoPC9DT0RFPi4gIFRoZSBiZWhhdmlvciBvbiBpbnB1dCBzdHJlYW1zIGlzIG9ubHkKICAgICAgICAgc3BlY2lmaWVkIGJ5IFBPU0lYLCBhbmQgbm90IGFsbCBpbXBsZW1lbnRhdGlvbnMgZm9sbG93IFBPU0lYIHJ1bGVzLgogICAgICAgICA8YnI+PGJyPiBObyBzdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzIGFyZSByZXF1aXJlZC4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAdzdGRpby5oeHEAfgCadAAec3RydWN0IF9yZWVudCAqcmVlbnQsIEZJTEUgKmZwdAAEaW50IHQACF9mZ2V0Y19yc3EAfgAKcHQFIQogICAgICAgIFVzZSA8Q09ERT5mZ2V0YzwvQ09ERT4gdG8gZ2V0IHRoZSBuZXh0IHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSB0aGUgZmlsZSBvciBzdHJlYW0KICAgICAgICAgaWRlbnRpZmllZCBieSA8VkFSPmZwPC9WQVI+LiAgQXMgYSBzaWRlIGVmZmVjdCwgPENPREU+ZmdldGM8L0NPREU+IGFkdmFuY2VzIHRoZSBmaWxlJ3MKICAgICAgICAgY3VycmVudCBwb3NpdGlvbiBpbmRpY2F0b3IuCiAgICAgICAgIDxicj48YnI+IEZvciBhIG1hY3JvIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbiwgc2VlIDxDT0RFPmdldGM8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBUaGUgZnVuY3Rpb24gPENPREU+X2ZnZXRjX3I8L0NPREU+IGlzIHNpbXBseSBhIHJlZW50cmFudCB2ZXJzaW9uIG9mCiAgICAgICAgIDxDT0RFPmZnZXRjPC9DT0RFPiB0aGF0IGlzIHBhc3NlZCB0aGUgYWRkaXRpb25hbCByZWVudHJhbnQgc3RydWN0dXJlCiAgICAgICAgIHBvaW50ZXIgYXJndW1lbnQ6IDxWQVI+cHRyPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgVGhlIG5leHQgY2hhcmFjdGVyIChyZWFkIGFzIGFuIDxDT0RFPnVuc2lnbmVkIGNoYXI8L0NPREU+LCBhbmQgY2FzdCB0bwogICAgICAgICA8Q09ERT5pbnQ8L0NPREU+KSwgdW5sZXNzIHRoZXJlIGlzIG5vIG1vcmUgZGF0YSwgb3IgdGhlIGhvc3Qgc3lzdGVtIHJlcG9ydHMgYQogICAgICAgICByZWFkIGVycm9yOyBpbiBlaXRoZXIgb2YgdGhlc2Ugc2l0dWF0aW9ucywgPENPREU+ZmdldGM8L0NPREU+IHJldHVybnMgPENPREU+RU9GPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gWW91IGNhbiBkaXN0aW5ndWlzaCB0aGUgdHdvIHNpdHVhdGlvbnMgdGhhdCBjYXVzZSBhbiA8Q09ERT5FT0Y8L0NPREU+IHJlc3VsdCBieQogICAgICAgICB1c2luZyB0aGUgPENPREU+ZmVycm9yPC9DT0RFPiBhbmQgPENPREU+ZmVvZjwvQ09ERT4gZnVuY3Rpb25zLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIEFOU0kgQyByZXF1aXJlcyA8Q09ERT5mZ2V0YzwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMgcmVxdWlyZWQ6IDxDT0RFPmNsb3NlPC9DT0RFPiwgPENPREU+ZnN0YXQ8L0NPREU+LCA8Q09ERT5pc2F0dHk8L0NPREU+LAogICAgICAgICA8Q09ERT5sc2VlazwvQ09ERT4sIDxDT0RFPnJlYWQ8L0NPREU+LCA8Q09ERT5zYnJrPC9DT0RFPiwgPENPREU+d3JpdGU8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+AKF0ABxzdHJ1Y3QgX3JlZW50ICpwdHIsIEZJTEUgKmZwdAAEaW50IHQADF9mZ2V0cG9zNjRfcnNxAH4ACnB0BcoKICAgICAgICBPYmplY3RzIG9mIHR5cGUgPENPREU+RklMRTwvQ09ERT4gY2FuIGhhdmUgYSBgYHBvc2l0aW9uJycgdGhhdCByZWNvcmRzIGhvdyBtdWNoCiAgICAgICAgIG9mIHRoZSBmaWxlIHlvdXIgcHJvZ3JhbSBoYXMgYWxyZWFkeSByZWFkLiAgTWFueSBvZiB0aGUgPENPREU+c3RkaW88L0NPREU+IGZ1bmN0aW9ucwogICAgICAgICBkZXBlbmQgb24gdGhpcyBwb3NpdGlvbiwgYW5kIG1hbnkgY2hhbmdlIGl0IGFzIGEgc2lkZSBlZmZlY3QuCiAgICAgICAgIDxicj48YnI+IFlvdSBjYW4gdXNlIDxDT0RFPmZnZXRwb3M2NDwvQ09ERT4gdG8gcmVwb3J0IG9uIHRoZSBjdXJyZW50IHBvc2l0aW9uIGZvciBhIGZpbGUKICAgICAgICAgaWRlbnRpZmllZCBieSA8VkFSPmZwPC9WQVI+IHRoYXQgd2FzIG9wZW5lZCBieSA8Q09ERT5mb3BlbjY0PC9DT0RFPjsgPENPREU+ZmdldHBvczwvQ09ERT4gd2lsbCB3cml0ZSAKICAgICAgICAgYSB2YWx1ZSByZXByZXNlbnRpbmcgdGhhdCBwb3NpdGlvbiBhdCA8Q09ERT4qPFZBUj5wb3M8L1ZBUj48L0NPREU+LiAgTGF0ZXIsIHlvdSBjYW4KICAgICAgICAgdXNlIHRoaXMgdmFsdWUgd2l0aCA8Q09ERT5mc2V0cG9zNjQ8L0NPREU+IHRvIHJldHVybiB0aGUgZmlsZSB0byB0aGlzCiAgICAgICAgIHBvc2l0aW9uLgogICAgICAgICA8YnI+PGJyPiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgPENPREU+ZmdldHBvczY0PC9DT0RFPiBzaW1wbHkgdXNlcyBhIGNoYXJhY3RlcgogICAgICAgICBjb3VudCB0byByZXByZXNlbnQgdGhlIGZpbGUgcG9zaXRpb247IHRoaXMgaXMgdGhlIHNhbWUgbnVtYmVyIHRoYXQKICAgICAgICAgd291bGQgYmUgcmV0dXJuZWQgYnkgPENPREU+ZnRlbGxvNjQ8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgPENPREU+ZmdldHBvczY0PC9DT0RFPiByZXR1cm5zIDxDT0RFPjA8L0NPREU+IHdoZW4gc3VjY2Vzc2Z1bC4gIElmIDxDT0RFPmZnZXRwb3M2NDwvQ09ERT4gZmFpbHMsIHRoZQogICAgICAgICByZXN1bHQgaXMgPENPREU+MTwvQ09ERT4uICBGYWlsdXJlIG9jY3VycyBvbiBzdHJlYW1zIHRoYXQgZG8gbm90IHN1cHBvcnQKICAgICAgICAgcG9zaXRpb25pbmcgb3Igc3RyZWFtcyBub3Qgb3BlbmVkIHZpYSA8Q09ERT5mb3BlbjY0PC9DT0RFPjsgdGhlIGdsb2JhbCA8Q09ERT5lcnJubzwvQ09ERT4gCiAgICAgICAgIGluZGljYXRlcyB0aGVzZSBjb25kaXRpb25zIHdpdGggdGhlIHZhbHVlIDxDT0RFPkVTUElQRTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgPENPREU+ZmdldHBvczY0PC9DT0RFPiBpcyBhIGdsaWJjIGV4dGVuc2lvbi4KICAgICAgICAgPGJyPjxicj4gTm8gc3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcyBhcmUgcmVxdWlyZWQuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAHc3RkaW8uaHhxAH4AqHQAK3N0cnVjdCBfcmVlbnQgKnB0ciwgRklMRSAqZnAsX2Zwb3M2NF90ICpwb3N0AARpbnQgdAAKX2ZnZXRwb3NfcnNxAH4ACnB0BsoKICAgICAgICBPYmplY3RzIG9mIHR5cGUgPENPREU+RklMRTwvQ09ERT4gY2FuIGhhdmUgYSBgYHBvc2l0aW9uJycgdGhhdCByZWNvcmRzIGhvdyBtdWNoCiAgICAgICAgIG9mIHRoZSBmaWxlIHlvdXIgcHJvZ3JhbSBoYXMgYWxyZWFkeSByZWFkLiAgTWFueSBvZiB0aGUgPENPREU+c3RkaW88L0NPREU+IGZ1bmN0aW9ucwogICAgICAgICBkZXBlbmQgb24gdGhpcyBwb3NpdGlvbiwgYW5kIG1hbnkgY2hhbmdlIGl0IGFzIGEgc2lkZSBlZmZlY3QuCiAgICAgICAgIDxicj48YnI+IFlvdSBjYW4gdXNlIDxDT0RFPmZnZXRwb3M8L0NPREU+IHRvIHJlcG9ydCBvbiB0aGUgY3VycmVudCBwb3NpdGlvbiBmb3IgYSBmaWxlCiAgICAgICAgIGlkZW50aWZpZWQgYnkgPFZBUj5mcDwvVkFSPjsgPENPREU+ZmdldHBvczwvQ09ERT4gd2lsbCB3cml0ZSBhIHZhbHVlCiAgICAgICAgIHJlcHJlc2VudGluZyB0aGF0IHBvc2l0aW9uIGF0IDxDT0RFPio8VkFSPnBvczwvVkFSPjwvQ09ERT4uICBMYXRlciwgeW91IGNhbgogICAgICAgICB1c2UgdGhpcyB2YWx1ZSB3aXRoIDxDT0RFPmZzZXRwb3M8L0NPREU+IHRvIHJldHVybiB0aGUgZmlsZSB0byB0aGlzCiAgICAgICAgIHBvc2l0aW9uLgogICAgICAgICA8YnI+PGJyPiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgPENPREU+ZmdldHBvczwvQ09ERT4gc2ltcGx5IHVzZXMgYSBjaGFyYWN0ZXIKICAgICAgICAgY291bnQgdG8gcmVwcmVzZW50IHRoZSBmaWxlIHBvc2l0aW9uOyB0aGlzIGlzIHRoZSBzYW1lIG51bWJlciB0aGF0CiAgICAgICAgIHdvdWxkIGJlIHJldHVybmVkIGJ5IDxDT0RFPmZ0ZWxsPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIDxDT0RFPmZnZXRwb3M8L0NPREU+IHJldHVybnMgPENPREU+MDwvQ09ERT4gd2hlbiBzdWNjZXNzZnVsLiAgSWYgPENPREU+ZmdldHBvczwvQ09ERT4gZmFpbHMsIHRoZQogICAgICAgICByZXN1bHQgaXMgPENPREU+MTwvQ09ERT4uICBGYWlsdXJlIG9jY3VycyBvbiBzdHJlYW1zIHRoYXQgZG8gbm90IHN1cHBvcnQKICAgICAgICAgcG9zaXRpb25pbmc7IHRoZSBnbG9iYWwgPENPREU+ZXJybm88L0NPREU+IGluZGljYXRlcyB0aGlzIGNvbmRpdGlvbiB3aXRoIHRoZQogICAgICAgICB2YWx1ZSA8Q09ERT5FU1BJUEU8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIDxDT0RFPmZnZXRwb3M8L0NPREU+IGlzIHJlcXVpcmVkIGJ5IHRoZSBBTlNJIEMgc3RhbmRhcmQsIGJ1dCB0aGUgbWVhbmluZyBvZiB0aGUKICAgICAgICAgdmFsdWUgaXQgcmVjb3JkcyBpcyBub3Qgc3BlY2lmaWVkIGJleW9uZCByZXF1aXJpbmcgdGhhdCBpdCBiZQogICAgICAgICBhY2NlcHRhYmxlIGFzIGFuIGFyZ3VtZW50IHRvIDxDT0RFPmZzZXRwb3M8L0NPREU+LiAgSW4gcGFydGljdWxhciwgb3RoZXIKICAgICAgICAgY29uZm9ybWluZyBDIGltcGxlbWVudGF0aW9ucyBtYXkgcmV0dXJuIGEgZGlmZmVyZW50IHJlc3VsdCBmcm9tCiAgICAgICAgIDxDT0RFPmZ0ZWxsPC9DT0RFPiB0aGFuIHdoYXQgPENPREU+ZmdldHBvczwvQ09ERT4gd3JpdGVzIGF0IDxDT0RFPio8VkFSPnBvczwvVkFSPjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IE5vIHN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMgYXJlIHJlcXVpcmVkLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+AK90AClzdHJ1Y3QgX3JlZW50ICpwdHIsIEZJTEUgKmZwLCBmcG9zX3QgKnBvc3QABGludCB0AAhfZmdldHNfcnNxAH4ACnB0BOgKICAgICAgICBSZWFkcyBhdCBtb3N0IDxWQVI+bi0xPC9WQVI+IGNoYXJhY3RlcnMgZnJvbSA8VkFSPmZwPC9WQVI+IHVudGlsIGEgbmV3bGluZQogICAgICAgICBpcyBmb3VuZC4gVGhlIGNoYXJhY3RlcnMgaW5jbHVkaW5nIHRvIHRoZSBuZXdsaW5lIGFyZSBzdG9yZWQKICAgICAgICAgaW4gPFZBUj5idWY8L1ZBUj4uIFRoZSBidWZmZXIgaXMgdGVybWluYXRlZCB3aXRoIGEgMC4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPl9mZ2V0c19yPC9DT0RFPiBmdW5jdGlvbiBpcyBzaW1wbHkgdGhlIHJlZW50cmFudCB2ZXJzaW9uIG9mCiAgICAgICAgIDxDT0RFPmZnZXRzPC9DT0RFPiBhbmQgaXMgcGFzc2VkIGFuIGFkZGl0aW9uYWwgcmVlbnRyYW5jeSBzdHJ1Y3R1cmUKICAgICAgICAgcG9pbnRlcjogPFZBUj5wdHI8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICA8Q09ERT5mZ2V0czwvQ09ERT4gcmV0dXJucyB0aGUgYnVmZmVyIHBhc3NlZCB0byBpdCwgd2l0aCB0aGUgZGF0YQogICAgICAgICBmaWxsZWQgaW4uIElmIGVuZCBvZiBmaWxlIG9jY3VycyB3aXRoIHNvbWUgZGF0YSBhbHJlYWR5CiAgICAgICAgIGFjY3VtdWxhdGVkLCB0aGUgZGF0YSBpcyByZXR1cm5lZCB3aXRoIG5vIG90aGVyIGluZGljYXRpb24uIElmCiAgICAgICAgIG5vIGRhdGEgYXJlIHJlYWQsIE5VTEwgaXMgcmV0dXJuZWQgaW5zdGVhZC4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICA8Q09ERT5mZ2V0czwvQ09ERT4gc2hvdWxkIHJlcGxhY2UgYWxsIHVzZXMgb2YgPENPREU+Z2V0czwvQ09ERT4uIE5vdGUgaG93ZXZlcgogICAgICAgICB0aGF0IDxDT0RFPmZnZXRzPC9DT0RFPiByZXR1cm5zIGFsbCBvZiB0aGUgZGF0YSwgd2hpbGUgPENPREU+Z2V0czwvQ09ERT4gcmVtb3ZlcwogICAgICAgICB0aGUgdHJhaWxpbmcgbmV3bGluZSAod2l0aCBubyBpbmRpY2F0aW9uIHRoYXQgaXQgaGFzIGRvbmUgc28uKQogICAgICAgICA8YnI+PGJyPiBTdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzIHJlcXVpcmVkOiA8Q09ERT5jbG9zZTwvQ09ERT4sIDxDT0RFPmZzdGF0PC9DT0RFPiwgPENPREU+aXNhdHR5PC9DT0RFPiwKICAgICAgICAgPENPREU+bHNlZWs8L0NPREU+LCA8Q09ERT5yZWFkPC9DT0RFPiwgPENPREU+c2JyazwvQ09ERT4sIDxDT0RFPndyaXRlPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAdzdGRpby5oeHEAfgC2dAAuc3RydWN0IF9yZWVudCAqcHRyLCBjaGFyICpidWYsIGludCBuLCBGSUxFICpmcHQABmNoYXIgKnQAC19maXByaW50Zl9yc3EAfgAKcHEAfgBCc3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+AL10ADRzdHJ1Y3QgX3JlZW50ICpwdHIsIEZJTEUgKmZkLGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4udAAEaW50IHQACl9maXNjYW5mX3JzcQB+AApwdAV+CiAgICAgICAgPENPREU+aXNjYW5mPC9DT0RFPiwgPENPREU+ZmlzY2FuZjwvQ09ERT4sIGFuZCA8Q09ERT5zaXNjYW5mPC9DT0RFPiBhcmUgdGhlIHNhbWUgYXMKICAgICAgICAgPENPREU+c2NhbmY8L0NPREU+LCA8Q09ERT5mc2NhbmY8L0NPREU+LCBhbmQgPENPREU+c3NjYW5mPC9DT0RFPiByZXNwZWN0aXZlbHksIG9ubHkgdGhhdAogICAgICAgICB0aGV5IHJlc3RyaWN0IHRoZSBhdmFpbGFibGUgZm9ybWF0cyB0byBub24tZmxvYXRpbmctcG9pbnQKICAgICAgICAgZm9ybWF0IHNwZWNpZmllcnMuCiAgICAgICAgIDxicj48YnI+IFRoZSByb3V0aW5lcyA8Q09ERT5faXNjYW5mX3I8L0NPREU+LCA8Q09ERT5fZmlzY2FuZl9yPC9DT0RFPiwgYW5kIDxDT0RFPl9zaXNjYW5mX3I8L0NPREU+IGFyZSByZWVudHJhbnQKICAgICAgICAgdmVyc2lvbnMgb2YgPENPREU+aXNjYW5mPC9DT0RFPiwgPENPREU+ZmlzY2FuZjwvQ09ERT4sIGFuZCA8Q09ERT5zaXNjYW5mPC9DT0RFPiB0aGF0IHRha2UgYW4gYWRkaXRpb25hbAogICAgICAgICBmaXJzdCBhcmd1bWVudCBwb2ludGluZyB0byBhIHJlZW50cmFuY3kgc3RydWN0dXJlLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgPENPREU+aXNjYW5mPC9DT0RFPiByZXR1cm5zIHRoZSBudW1iZXIgb2YgaW5wdXQgZmllbGRzIHN1Y2Nlc3NmdWxseQogICAgICAgICBzY2FubmVkLCBjb252ZXJ0ZWQgYW5kIHN0b3JlZDsgdGhlIHJldHVybiB2YWx1ZSBkb2VzCiAgICAgICAgIG5vdCBpbmNsdWRlIHNjYW5uZWQgZmllbGRzIHdoaWNoIHdlcmUgbm90IHN0b3JlZC4KICAgICAgICAgPGJyPjxicj4gSWYgPENPREU+aXNjYW5mPC9DT0RFPiBhdHRlbXB0cyB0byByZWFkIGF0IGVuZC1vZi1maWxlLCB0aGUgcmV0dXJuCiAgICAgICAgIHZhbHVlIGlzIDxDT0RFPkVPRjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IElmIG5vIGZpZWxkcyB3ZXJlIHN0b3JlZCwgdGhlIHJldHVybiB2YWx1ZSBpcyA8Q09ERT4wPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICA8Q09ERT5pc2NhbmY8L0NPREU+LCA8Q09ERT5maXNjYW5mPC9DT0RFPiwgYW5kIDxDT0RFPnNpc2NhbmY8L0NPREU+IGFyZSBuZXdsaWIgZXh0ZW5zaW9ucy4KICAgICAgICAgPGJyPjxicj4gU3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcyByZXF1aXJlZDogPENPREU+Y2xvc2U8L0NPREU+LCA8Q09ERT5mc3RhdDwvQ09ERT4sIDxDT0RFPmlzYXR0eTwvQ09ERT4sCiAgICAgICAgIDxDT0RFPmxzZWVrPC9DT0RFPiwgPENPREU+cmVhZDwvQ09ERT4sIDxDT0RFPnNicms8L0NPREU+LCA8Q09ERT53cml0ZTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAHc3RkaW8uaHhxAH4Aw3QANHN0cnVjdCBfcmVlbnQgKnB0ciwgRklMRSAqZmQsY29uc3QgY2hhciAqZm9ybWF0LCAuLi50AARpbnQgdAAKX2ZvcGVuNjRfcnNxAH4ACnB0A6MKICAgICAgICA8Q09ERT5mb3BlbjY0PC9DT0RFPiBpcyBpZGVudGljYWwgdG8gPENPREU+Zm9wZW48L0NPREU+IGV4Y2VwdCBpdCBvcGVucyBhIGxhcmdlIGZpbGUgdGhhdAogICAgICAgICBpcyBwb3RlbnRpYWxseSA+MkdCIGluIHNpemUuICBTZWUgPENPREU+Zm9wZW48L0NPREU+IGZvciBmdXJ0aGVyIGRldGFpbHMuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICA8Q09ERT5mb3BlbjY0PC9DT0RFPiByZXR1cm4gYSBmaWxlIHBvaW50ZXIgd2hpY2ggeW91IGNhbiB1c2UgZm9yIG90aGVyIGZpbGUKICAgICAgICAgb3BlcmF0aW9ucywgdW5sZXNzIHRoZSBmaWxlIHlvdSByZXF1ZXN0ZWQgY291bGQgbm90IGJlIG9wZW5lZDsgaW4gdGhhdAogICAgICAgICBzaXR1YXRpb24sIHRoZSByZXN1bHQgaXMgPENPREU+TlVMTDwvQ09ERT4uICBJZiB0aGUgcmVhc29uIGZvciBmYWlsdXJlIHdhcyBhbgogICAgICAgICBpbnZhbGlkIHN0cmluZyBhdCA8VkFSPm1vZGU8L1ZBUj4sIDxDT0RFPmVycm5vPC9DT0RFPiBpcyBzZXQgdG8gPENPREU+RUlOVkFMPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICA8Q09ERT5mb3BlbjY0PC9DT0RFPiBpcyBhIGdsaWJjIGV4dGVuc2lvbi4KICAgICAgICAgPGJyPjxicj4gU3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcyByZXF1aXJlZDogPENPREU+Y2xvc2U8L0NPREU+LCA8Q09ERT5mc3RhdDY0PC9DT0RFPiwgPENPREU+aXNhdHR5PC9DT0RFPiwKICAgICAgICAgPENPREU+bHNlZWs2NDwvQ09ERT4sIDxDT0RFPm9wZW42NDwvQ09ERT4sIDxDT0RFPnJlYWQ8L0NPREU+LCA8Q09ERT5zYnJrPC9DT0RFPiwgPENPREU+d3JpdGU8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+AMp0AC52b2lkICpyZWVudCxjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICptb2RldAAGRklMRSAqdAAIX2ZvcGVuX3JzcQB+AApwdA8ICiAgICAgICAgPENPREU+Zm9wZW48L0NPREU+IGluaXRpYWxpemVzIHRoZSBkYXRhIHN0cnVjdHVyZXMgbmVlZGVkIHRvIHJlYWQgb3Igd3JpdGUgYQogICAgICAgICBmaWxlLiAgU3BlY2lmeSB0aGUgZmlsZSdzIG5hbWUgYXMgdGhlIHN0cmluZyBhdCA8VkFSPmZpbGU8L1ZBUj4sIGFuZCB0aGUga2luZAogICAgICAgICBvZiBhY2Nlc3MgeW91IG5lZWQgdG8gdGhlIGZpbGUgd2l0aCB0aGUgc3RyaW5nIGF0IDxWQVI+bW9kZTwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gVGhlIGFsdGVybmF0ZSBmdW5jdGlvbiA8Q09ERT5fZm9wZW5fcjwvQ09ERT4gaXMgYSByZWVudHJhbnQgdmVyc2lvbi4KICAgICAgICAgVGhlIGV4dHJhIGFyZ3VtZW50IDxWQVI+cmVlbnQ8L1ZBUj4gaXMgYSBwb2ludGVyIHRvIGEgcmVlbnRyYW5jeSBzdHJ1Y3R1cmUuCiAgICAgICAgIDxicj48YnI+IFRocmVlIGZ1bmRhbWVudGFsIGtpbmRzIG9mIGFjY2VzcyBhcmUgYXZhaWxhYmxlOiByZWFkLCB3cml0ZSwgYW5kIGFwcGVuZC4KICAgICAgICAgPENPREU+KjxWQVI+bW9kZTwvVkFSPjwvQ09ERT4gbXVzdCBiZWdpbiB3aXRoIG9uZSBvZiB0aGUgdGhyZWUgY2hhcmFjdGVycyBgPENPREU+cjwvQ09ERT4nLAogICAgICAgICBgPENPREU+dzwvQ09ERT4nLCBvciBgPENPREU+YTwvQ09ERT4nLCB0byBzZWxlY3Qgb25lIG9mIHRoZXNlOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+cjwvQ09ERT4KPEREPgogICAgICAgICBPcGVuIHRoZSBmaWxlIGZvciByZWFkaW5nOyB0aGUgb3BlcmF0aW9uIHdpbGwgZmFpbCBpZiB0aGUgZmlsZSBkb2VzCiAgICAgICAgIG5vdCBleGlzdCwgb3IgaWYgdGhlIGhvc3Qgc3lzdGVtIGRvZXMgbm90IHBlcm1pdCB5b3UgdG8gcmVhZCBpdC4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPnc8L0NPREU+CjxERD4KICAgICAgICAgT3BlbiB0aGUgZmlsZSBmb3Igd3JpdGluZyA8RU0+ZnJvbSB0aGUgYmVnaW5uaW5nPC9FTT4gb2YgdGhlIGZpbGU6CiAgICAgICAgIGVmZmVjdGl2ZWx5LCB0aGlzIGFsd2F5cyBjcmVhdGVzIGEgbmV3IGZpbGUuICBJZiB0aGUgZmlsZSB3aG9zZSBuYW1lIHlvdQogICAgICAgICBzcGVjaWZpZWQgYWxyZWFkeSBleGlzdGVkLCBpdHMgb2xkIGNvbnRlbnRzIGFyZSBkaXNjYXJkZWQuCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5hPC9DT0RFPgo8REQ+CiAgICAgICAgIE9wZW4gdGhlIGZpbGUgZm9yIGFwcGVuZGluZyBkYXRhLCB0aGF0IGlzIHdyaXRpbmcgZnJvbSB0aGUgZW5kIG9mCiAgICAgICAgIGZpbGUuICBXaGVuIHlvdSBvcGVuIGEgZmlsZSB0aGlzIHdheSwgYWxsIGRhdGEgYWx3YXlzIGdvZXMgdG8gdGhlCiAgICAgICAgIGN1cnJlbnQgZW5kIG9mIGZpbGU7IHlvdSBjYW5ub3QgY2hhbmdlIHRoaXMgdXNpbmcgPENPREU+ZnNlZWs8L0NPREU+LgogICAgICAgICA8L0RMPgogICAgICAgICA8YnI+PGJyPiA8YnI+PGJyPiBTb21lIGhvc3Qgc3lzdGVtcyBkaXN0aW5ndWlzaCBiZXR3ZWVuIGBgYmluYXJ5JycgYW5kIGBgdGV4dCcnIGZpbGVzLgogICAgICAgICBTdWNoIHN5c3RlbXMgbWF5IHBlcmZvcm0gZGF0YSB0cmFuc2Zvcm1hdGlvbnMgb24gZGF0YSB3cml0dGVuIHRvLCBvcgogICAgICAgICByZWFkIGZyb20sIGZpbGVzIG9wZW5lZCBhcyBgYHRleHQnJy4KICAgICAgICAgSWYgeW91ciBzeXN0ZW0gaXMgb25lIG9mIHRoZXNlLCB0aGVuIHlvdSBjYW4gYXBwZW5kIGEgYDxDT0RFPmI8L0NPREU+JyB0byBhbnkKICAgICAgICAgb2YgdGhlIHRocmVlIG1vZGVzIGFib3ZlLCB0byBzcGVjaWZ5IHRoYXQgeW91IGFyZSBvcGVuaW5nIHRoZSBmaWxlIGFzCiAgICAgICAgIGEgYmluYXJ5IGZpbGUgKHRoZSBkZWZhdWx0IGlzIHRvIG9wZW4gdGhlIGZpbGUgYXMgYSB0ZXh0IGZpbGUpLgogICAgICAgICA8YnI+PGJyPiBgPENPREU+cmI8L0NPREU+JywgdGhlbiwgbWVhbnMgYGByZWFkIGJpbmFyeScnOyBgPENPREU+d2I8L0NPREU+JywgYGB3cml0ZSBiaW5hcnknJzsgYW5kCiAgICAgICAgIGA8Q09ERT5hYjwvQ09ERT4nLCBgYGFwcGVuZCBiaW5hcnknJy4KICAgICAgICAgPGJyPjxicj4gVG8gbWFrZSBDIHByb2dyYW1zIG1vcmUgcG9ydGFibGUsIHRoZSBgPENPREU+YjwvQ09ERT4nIGlzIGFjY2VwdGVkIG9uIGFsbAogICAgICAgICBzeXN0ZW1zLCB3aGV0aGVyIG9yIG5vdCBpdCBtYWtlcyBhIGRpZmZlcmVuY2UuCiAgICAgICAgIDxicj48YnI+IEZpbmFsbHksIHlvdSBtaWdodCBuZWVkIHRvIGJvdGggcmVhZCBhbmQgd3JpdGUgZnJvbSB0aGUgc2FtZSBmaWxlLgogICAgICAgICBZb3UgY2FuIGFsc28gYXBwZW5kIGEgYDxDT0RFPis8L0NPREU+JyB0byBhbnkgb2YgdGhlIHRocmVlIG1vZGVzLCB0byBwZXJtaXQKICAgICAgICAgdGhpcy4gIChJZiB5b3Ugd2FudCB0byBhcHBlbmQgYm90aCBgPENPREU+YjwvQ09ERT4nIGFuZCBgPENPREU+KzwvQ09ERT4nLCB5b3UgY2FuIGRvIGl0CiAgICAgICAgIGluIGVpdGhlciBvcmRlcjogZm9yIGV4YW1wbGUsIDxDT0RFPiJyYisiPC9DT0RFPiBtZWFucyB0aGUgc2FtZSB0aGluZyBhcwogICAgICAgICA8Q09ERT4icitiIjwvQ09ERT4gd2hlbiB1c2VkIGFzIGEgbW9kZSBzdHJpbmcuKQogICAgICAgICA8YnI+PGJyPiBVc2UgPENPREU+InIrIjwvQ09ERT4gKG9yIDxDT0RFPiJyYisiPC9DT0RFPikgdG8gcGVybWl0IHJlYWRpbmcgYW5kIHdyaXRpbmcgYW55d2hlcmUgaW4KICAgICAgICAgYW4gZXhpc3RpbmcgZmlsZSwgd2l0aG91dCBkaXNjYXJkaW5nIGFueSBkYXRhOyA8Q09ERT4idysiPC9DT0RFPiAob3IgPENPREU+IndiKyI8L0NPREU+KQogICAgICAgICB0byBjcmVhdGUgYSBuZXcgZmlsZSAob3IgYmVnaW4gYnkgZGlzY2FyZGluZyBhbGwgZGF0YSBmcm9tIGFuIG9sZCBvbmUpCiAgICAgICAgIHRoYXQgcGVybWl0cyByZWFkaW5nIGFuZCB3cml0aW5nIGFueXdoZXJlIGluIGl0OyBhbmQgPENPREU+ImErIjwvQ09ERT4gKG9yCiAgICAgICAgIDxDT0RFPiJhYisiPC9DT0RFPikgdG8gcGVybWl0IHJlYWRpbmcgYW55d2hlcmUgaW4gYW4gZXhpc3RpbmcgZmlsZSwgYnV0IHdyaXRpbmcKICAgICAgICAgb25seSBhdCB0aGUgZW5kLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgPENPREU+Zm9wZW48L0NPREU+IHJldHVybnMgYSBmaWxlIHBvaW50ZXIgd2hpY2ggeW91IGNhbiB1c2UgZm9yIG90aGVyIGZpbGUKICAgICAgICAgb3BlcmF0aW9ucywgdW5sZXNzIHRoZSBmaWxlIHlvdSByZXF1ZXN0ZWQgY291bGQgbm90IGJlIG9wZW5lZDsgaW4gdGhhdAogICAgICAgICBzaXR1YXRpb24sIHRoZSByZXN1bHQgaXMgPENPREU+TlVMTDwvQ09ERT4uICBJZiB0aGUgcmVhc29uIGZvciBmYWlsdXJlIHdhcyBhbgogICAgICAgICBpbnZhbGlkIHN0cmluZyBhdCA8VkFSPm1vZGU8L1ZBUj4sIDxDT0RFPmVycm5vPC9DT0RFPiBpcyBzZXQgdG8gPENPREU+RUlOVkFMPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICA8Q09ERT5mb3BlbjwvQ09ERT4gaXMgcmVxdWlyZWQgYnkgQU5TSSBDLgogICAgICAgICA8YnI+PGJyPiBTdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzIHJlcXVpcmVkOiA8Q09ERT5jbG9zZTwvQ09ERT4sIDxDT0RFPmZzdGF0PC9DT0RFPiwgPENPREU+aXNhdHR5PC9DT0RFPiwKICAgICAgICAgPENPREU+bHNlZWs8L0NPREU+LCA8Q09ERT5vcGVuPC9DT0RFPiwgPENPREU+cmVhZDwvQ09ERT4sIDxDT0RFPnNicms8L0NPREU+LCA8Q09ERT53cml0ZTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAHc3RkaW8uaHhxAH4A0XQAN3N0cnVjdCBfcmVlbnQgKnJlZW50LGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKm1vZGV0AAZGSUxFICp0AApfZnByaW50Zl9yc3EAfgAKcHEAfgBPc3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+ANh0ADRzdHJ1Y3QgX3JlZW50ICpwdHIsIEZJTEUgKmZkLGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4udAAEaW50IHQACF9mcHV0Y19yc3EAfgAKcHQFggogICAgICAgIDxDT0RFPmZwdXRjPC9DT0RFPiBjb252ZXJ0cyB0aGUgYXJndW1lbnQgPFZBUj5jaDwvVkFSPiBmcm9tIGFuIDxDT0RFPmludDwvQ09ERT4gdG8gYW4KICAgICAgICAgPENPREU+dW5zaWduZWQgY2hhcjwvQ09ERT4sIHRoZW4gd3JpdGVzIGl0IHRvIHRoZSBmaWxlIG9yIHN0cmVhbSBpZGVudGlmaWVkIGJ5CiAgICAgICAgIDxWQVI+ZnA8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBmaWxlIHdhcyBvcGVuZWQgd2l0aCBhcHBlbmQgbW9kZSAob3IgaWYgdGhlIHN0cmVhbSBjYW5ub3QKICAgICAgICAgc3VwcG9ydCBwb3NpdGlvbmluZyksIHRoZW4gdGhlIG5ldyBjaGFyYWN0ZXIgZ29lcyBhdCB0aGUgZW5kIG9mIHRoZQogICAgICAgICBmaWxlIG9yIHN0cmVhbS4gIE90aGVyd2lzZSwgdGhlIG5ldyBjaGFyYWN0ZXIgaXMgd3JpdHRlbiBhdCB0aGUKICAgICAgICAgY3VycmVudCB2YWx1ZSBvZiB0aGUgcG9zaXRpb24gaW5kaWNhdG9yLCBhbmQgdGhlIHBvc2l0aW9uIGluZGljYXRvcgogICAgICAgICBvYWR2YW5jZXMgYnkgb25lLgogICAgICAgICA8YnI+PGJyPiBGb3IgYSBtYWNybyB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24sIHNlZSA8Q09ERT5wdXRjPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPl9mcHV0Y19yPC9DT0RFPiBmdW5jdGlvbiBpcyBzaW1wbHkgYSByZWVudHJhbnQgdmVyc2lvbiBvZiA8Q09ERT5mcHV0YzwvQ09ERT4KICAgICAgICAgdGhhdCB0YWtlcyBhbiBhZGRpdGlvbmFsIHJlZW50cmFudCBzdHJ1Y3R1cmUgYXJndW1lbnQ6IDxWQVI+cHRyPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgSWYgc3VjY2Vzc2Z1bCwgPENPREU+ZnB1dGM8L0NPREU+IHJldHVybnMgaXRzIGFyZ3VtZW50IDxWQVI+Y2g8L1ZBUj4uICBJZiBhbiBlcnJvcgogICAgICAgICBpbnRlcnZlbmVzLCB0aGUgcmVzdWx0IGlzIDxDT0RFPkVPRjwvQ09ERT4uICBZb3UgY2FuIHVzZSBgPENPREU+ZmVycm9yKDxWQVI+ZnA8L1ZBUj4pPC9DT0RFPicgdG8KICAgICAgICAgcXVlcnkgZm9yIGVycm9ycy4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICA8Q09ERT5mcHV0YzwvQ09ERT4gaXMgcmVxdWlyZWQgYnkgQU5TSSBDLgogICAgICAgICA8YnI+PGJyPiBTdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzIHJlcXVpcmVkOiA8Q09ERT5j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YW4gb2JqZWN0IHdpdGggYXQgbGVhc3QKICAgICAgICAgPFZBUj5uYnl0ZXM8L1ZBUj4gYnl0ZXMgb2Ygc3RvcmFnZSBhdmFpbGFibGUuICBJZiB0aGUgc3BhY2UgaXMgYXZhaWxhYmxlLAogICAgICAgICA8Q09ERT5tYWxsb2M8L0NPREU+IHJldHVybnMgYSBwb2ludGVyIHRvIGEgbmV3bHkgYWxsb2NhdGVkIGJsb2NrIGFzIGl0cyByZXN1bHQuCiAgICAgICAgIDxicj48YnI+IElmIHlvdSBhbHJlYWR5IGhhdmUgYSBibG9jayBvZiBzdG9yYWdlIGFsbG9jYXRlZCBieSA8Q09ERT5tYWxsb2M8L0NPREU+LCBidXQKICAgICAgICAgeW91IG5vIGxvbmdlciBuZWVkIGFsbCB0aGUgc3BhY2UgYWxsb2NhdGVkIHRvIGl0LCB5b3UgY2FuIG1ha2UgaXQKICAgICAgICAgc21hbGxlciBieSBjYWxsaW5nIDxDT0RFPnJlYWxsb2M8L0NPREU+IHdpdGggYm90aCB0aGUgb2JqZWN0IHBvaW50ZXIgYW5kIHRoZQogICAgICAgICBuZXcgZGVzaXJlZCBzaXplIGFzIGFyZ3VtZW50cy4gIDxDT0RFPnJlYWxsb2M8L0NPREU+IGd1YXJhbnRlZXMgdGhhdCB0aGUKICAgICAgICAgY29udGVudHMgb2YgdGhlIHNtYWxsZXIgb2JqZWN0IG1hdGNoIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9yaWdpbmFsIG9iamVjdC4KICAgICAgICAgPGJyPjxicj4gU2ltaWxhcmx5LCBpZiB5b3UgbmVlZCBtb3JlIHNwYWNlIGZvciBhbiBvYmplY3QsIHVzZSA8Q09ERT5yZWFsbG9jPC9DT0RFPiB0bwogICAgICAgICByZXF1ZXN0IHRoZSBsYXJnZXIgc2l6ZTsgYWdhaW4sIDxDT0RFPnJlYWxsb2M8L0NPREU+IGd1YXJhbnRlZXMgdGhhdCB0aGUKICAgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBuZXcsIGxhcmdlciBvYmplY3QgbWF0Y2hlcyB0aGUgY29udGVudHMgb2YgdGhlCiAgICAgICAgIG9yaWdpbmFsIG9iamVjdC4KICAgICAgICAgPGJyPjxicj4gV2hlbiB5b3Ugbm8gbG9uZ2VyIG5lZWQgYW4gb2JqZWN0IG9yaWdpbmFsbHkgYWxsb2NhdGVkIGJ5IDxDT0RFPm1hbGxvYzwvQ09ERT4KICAgICAgICAgb3IgPENPREU+cmVhbGxvYzwvQ09ERT4gKG9yIHRoZSByZWxhdGVkIGZ1bmN0aW9uIDxDT0RFPmNhbGxvYzwvQ09ERT4pLCByZXR1cm4gaXQgdG8gdGhlCiAgICAgICAgIG1lbW9yeSBzdG9yYWdlIHBvb2wgYnkgY2FsbGluZyA8Q09ERT5mcmVlPC9DT0RFPiB3aXRoIHRoZSBhZGRyZXNzIG9mIHRoZSBvYmplY3QKICAgICAgICAgYXMgdGhlIGFyZ3VtZW50LiAgWW91IGNhbiBhbHNvIHVzZSA8Q09ERT5yZWFsbG9jPC9DT0RFPiBmb3IgdGhpcyBwdXJwb3NlIGJ5CiAgICAgICAgIGNhbGxpbmcgaXQgd2l0aCA8Q09ERT4wPC9DT0RFPiBhcyB0aGUgPFZBUj5uYnl0ZXM8L1ZBUj4gYXJndW1lbnQuCiAgICAgICAgIDxicj48YnI+IFRoZSA8Q09ERT5tZW1hbGlnbjwvQ09ERT4gZnVuY3Rpb24gcmV0dXJucyBhIGJsb2NrIG9mIHNpemUgPFZBUj5uYnl0ZXM8L1ZBUj4gYWxpZ25lZAogICAgICAgICB0byBhIDxWQVI+YWxpZ248L1ZBUj4gYm91bmRhcnkuICBUaGUgPFZBUj5hbGlnbjwvVkFSPiBhcmd1bWVudCBtdXN0IGJlIGEgcG93ZXIgb2YKICAgICAgICAgdHdvLgogICAgICAgICA8YnI+PGJyPiBUaGUgPENPREU+bWFsbG9jX3VzYWJsZV9zaXplPC9DT0RFPiBmdW5jdGlvbiB0YWtlcyBhIHBvaW50ZXIgdG8gYSBibG9jawogICAgICAgICBhbGxvY2F0ZWQgYnkgPENPREU+bWFsbG9jPC9DT0RFPi4gIEl0IHJldHVybnMgdGhlIGFtb3VudCBvZiBzcGFjZSB0aGF0IGlzCiAgICAgICAgIGF2YWlsYWJsZSBpbiB0aGUgYmxvY2suICBUaGlzIG1heSBvciBtYXkgbm90IGJlIG1vcmUgdGhhbiB0aGUgc2l6ZQogICAgICAgICByZXF1ZXN0ZWQgZnJvbSA8Q09ERT5tYWxsb2M8L0NPREU+LCBkdWUgdG8gYWxpZ25tZW50IG9yIG1pbmltdW0gc2l6ZQogICAgICAgICBjb25zdHJhaW50cy4KICAgICAgICAgPGJyPjxicj4gVGhlIGFsdGVybmF0ZSBmdW5jdGlvbnMgPENPREU+X21hbGxvY19yPC9DT0RFPiwgPENPREU+X3JlYWxsb2NfcjwvQ09ERT4sIDxDT0RFPl9mcmVlX3I8L0NPREU+LAogICAgICAgICA8Q09ERT5fbWVtYWxpZ25fcjwvQ09ERT4sIGFuZCA8Q09ERT5fbWFsbG9jX3VzYWJsZV9zaXplX3I8L0NPREU+IGFyZSByZWVudHJhbnQgdmVyc2lvbnMuCiAgICAgICAgIFRoZSBleHRyYSBhcmd1bWVudCA8VkFSPnJlZW50PC9WQVI+IGlzIGEgcG9pbnRlciB0byBhIHJlZW50cmFuY3kgc3RydWN0dXJlLgogICAgICAgICA8YnI+PGJyPiBJZiB5b3UgaGF2ZSBtdWx0aXBsZSB0aHJlYWRzIG9mIGV4ZWN1dGlvbiB3aGljaCBtYXkgY2FsbCBhbnkgb2YgdGhlc2UKICAgICAgICAgcm91dGluZXMsIG9yIGlmIGFueSBvZiB0aGVzZSByb3V0aW5lcyBtYXkgYmUgY2FsbGVkIHJlZW50cmFudGx5LCB0aGVuCiAgICAgICAgIHlvdSBtdXN0IHByb3ZpZGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSA8Q09ERT5fX21hbGxvY19sb2NrPC9DT0RFPiBhbmQKICAgICAgICAgPENPREU+X19tYWxsb2NfdW5sb2NrPC9DT0RFPiBmdW5jdGlvbnMgZm9yIHlvdXIgc3lzdGVtLiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uCiAgICAgICAgIGZvciB0aG9zZSBmdW5jdGlvbnMuCiAgICAgICAgIDxicj48YnI+IFRoZXNlIGZ1bmN0aW9ucyBvcGVyYXRlIGJ5IGNhbGxpbmcgdGhlIGZ1bmN0aW9uIDxDT0RFPl9zYnJrX3I8L0NPREU+IG9yCiAgICAgICAgIDxDT0RFPnNicms8L0NPREU+LCB3aGljaCBhbGxvY2F0ZXMgc3BhY2UuICBZb3UgbWF5IG5lZWQgdG8gcHJvdmlkZSBvbmUgb2YgdGhlc2UKICAgICAgICAgZnVuY3Rpb25zIGZvciB5b3VyIHN5c3RlbS4gIDxDT0RFPl9zYnJrX3I8L0NPREU+IGlzIGNhbGxlZCB3aXRoIGEgcG9zaXRpdmUKICAgICAgICAgdmFsdWUgdG8gYWxsb2NhdGUgbW9yZSBzcGFjZSwgYW5kIHdpdGggYSBuZWdhdGl2ZSB2YWx1ZSB0byByZWxlYXNlCiAgICAgICAgIHByZXZpb3VzbHkgYWxsb2NhdGVkIHNwYWNlIGlmIGl0IGlzIG5vIGxvbmdlciByZXF1aXJlZC4KICAgICAgICAgLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgPENPREU+bWFsbG9jPC9DT0RFPiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmV3bHkgYWxsb2NhdGVkIHNwYWNlLCBpZgogICAgICAgICBzdWNjZXNzZnVsOyBvdGhlcndpc2UgaXQgcmV0dXJucyA8Q09ERT5OVUxMPC9DT0RFPi4gIElmIHlvdXIgYXBwbGljYXRpb24gbmVlZHMKICAgICAgICAgdG8gZ2VuZXJhdGUgZW1wdHkgb2JqZWN0cywgeW91IG1heSB1c2UgPENPREU+bWFsbG9jKDApPC9DT0RFPiBmb3IgdGhpcyBwdXJwb3NlLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5yZWFsbG9jPC9DT0RFPiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmV3IGJsb2NrIG9mIG1lbW9yeSwgb3IgPENPREU+TlVMTDwvQ09ERT4KICAgICAgICAgaWYgYSBuZXcgYmxvY2sgY291bGQgbm90IGJlIGFsbG9jYXRlZC4gIDxDT0RFPk5VTEw8L0NPREU+IGlzIGFsc28gdGhlIHJlc3VsdAogICAgICAgICB3aGVuIHlvdSB1c2UgYDxDT0RFPnJlYWxsb2MoPFZBUj5hcHRyPC9WQVI+LDApPC9DT0RFPicgKHdoaWNoIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMKICAgICAgICAgYDxDT0RFPmZyZWUoPFZBUj5hcHRyPC9WQVI+KTwvQ09ERT4nKS4gIFlvdSBzaG91bGQgYWx3YXlzIGNoZWNrIHRoZSByZXN1bHQgb2YKICAgICAgICAgPENPREU+cmVhbGxvYzwvQ09ERT47IHN1Y2Nlc3NmdWwgcmVhbGxvY2F0aW9uIGlzIG5vdCBndWFyYW50ZWVkIGV2ZW4gd2hlbgogICAgICAgICB5b3UgcmVxdWVzdCBhIHNtYWxsZXIgb2JqZWN0LgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5mcmVlPC9DT0RFPiBkb2VzIG5vdCByZXR1cm4gYSByZXN1bHQuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPm1lbWFsaWduPC9DT0RFPiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmV3bHkgYWxsb2NhdGVkIHNwYWNlLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5tYWxsb2NfdXNhYmxlX3NpemU8L0NPREU+IHJldHVybnMgdGhlIHVzYWJsZSBzaXplLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIDxDT0RFPm1hbGxvYzwvQ09ERT4sIDxDT0RFPnJlYWxsb2M8L0NPREU+LCBhbmQgPENPREU+ZnJlZTwvQ09ERT4gYXJlIHNwZWNpZmllZCBieSB0aGUgQU5TSSBDCiAgICAgICAgIHN0YW5kYXJkLCBidXQgb3RoZXIgY29uZm9ybWluZyBpbXBsZW1lbnRhdGlvbnMgb2YgPENPREU+bWFsbG9jPC9DT0RFPiBtYXkKICAgICAgICAgYmVoYXZlIGRpZmZlcmVudGx5IHdoZW4gPFZBUj5uYnl0ZXM8L1ZBUj4gaXMgemVyby4KICAgICAgICAgPGJyPjxicj4gPENPREU+bWVtYWxpZ248L0NPREU+IGlzIHBhcnQgb2YgU1ZSNC4KICAgICAgICAgPGJyPjxicj4gPENPREU+bWFsbG9jX3VzYWJsZV9zaXplPC9DT0RFPiBpcyBub3QgcG9ydGFibGUuCiAgICAgICAgIDxicj48YnI+IFN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMgcmVxdWlyZWQ6IDxDT0RFPnNicms8L0NPREU+LiAgCiAgICAgICAgICoKICAg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b3IgPFZBUj5mcDwvVkFSPiAobm90YWJseSA8Q09ERT5zdGRpbjwvQ09ERT4sIDxDT0RFPnN0ZG91dDwvQ09ERT4sIG9yIDxDT0RFPnN0ZGVycjwvQ09ERT4pIGZvcgogICAgICAgICB0aGUgZmlsZS4KICAgICAgICAgPGJyPjxicj4gSWYgPFZBUj5mcDwvVkFSPiB3YXMgYXNzb2NpYXRlZCB3aXRoIGFub3RoZXIgZmlsZSBvciBzdHJlYW0sIDxDT0RFPmZyZW9wZW48L0NPREU+CiAgICAgICAgIGNsb3NlcyB0aGF0IG90aGVyIGZpbGUgb3Igc3RyZWFtIChidXQgaWdub3JlcyBhbnkgZXJyb3JzIHdoaWxlIGNsb3NpbmcKICAgICAgICAgaXQpLgogICAgICAgICA8YnI+PGJyPiA8VkFSPmZpbGU8L1ZBUj4gYW5kIDxWQVI+bW9kZTwvVkFSPiBhcmUgdXNlZCBqdXN0IGFzIGluIDxDT0RFPmZvcGVuPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gSWYgPFZBUj5maWxlPC9WQVI+IGlzIDxDT0RFPk5VTEw8L0NPREU+LCB0aGUgdW5kZXJseWluZyBzdHJlYW0gaXMgbW9kaWZpZWQgcmF0aGVyIHRoYW4KICAgICAgICAgY2xvc2VkLiAgVGhlIGZpbGUgY2Fubm90IGJlIGdpdmVuIGEgbW9yZSBwZXJtaXNzaXZlIGFjY2VzcyBtb2RlIChmb3IKICAgICAgICAgZXhhbXBsZSwgYSA8VkFSPm1vZGU8L1ZBUj4gb2YgInciIHdpbGwgZmFpbCBvbiBhIHJlYWQtb25seSBmaWxlIGRlc2NyaXB0b3IpLAogICAgICAgICBidXQgY2FuIGNoYW5nZSBzdGF0dXMgc3VjaCBhcyBhcHBlbmQgb3IgYmluYXJ5IG1vZGUuICBJZiBtb2RpZmljYXRpb24KICAgICAgICAgaXMgbm90IHBvc3NpYmxlLCBmYWlsdXJlIG9jY3Vycy4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIElmIHN1Y2Nlc3NmdWwsIHRoZSByZXN1bHQgaXMgdGhlIHNhbWUgYXMgdGhlIGFyZ3VtZW50IDxWQVI+ZnA8L1ZBUj4uICBJZiB0aGUKICAgICAgICAgZmlsZSBjYW5ub3QgYmUgb3BlbmVkIGFzIHNwZWNpZmllZCwgdGhlIHJlc3VsdCBpcyA8Q09ERT5OVUxMPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICBBTlNJIEMgcmVxdWlyZXMgPENPREU+ZnJlb3BlbjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMgcmVxdWlyZWQ6IDxDT0RFPmNsb3NlPC9DT0RFPiwgPENPREU+ZnN0YXQ8L0NPREU+LCA8Q09ERT5pc2F0dHk8L0NPREU+LAogICAgICAgICA8Q09ERT5sc2VlazwvQ09ERT4sIDxDT0RFPm9wZW48L0NPREU+LCA8Q09ERT5yZWFkPC9DT0RFPiwgPENPREU+c2JyazwvQ09ERT4sIDxDT0RFPndyaXRlPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAdzdGRpby5oeHEAfgEBdAA/c3RydWN0IF9yZWVudCAqcHRyLCBjb25zdCBjaGFyICpmaWxlLGNvbnN0IGNoYXIgKm1vZGUsIEZJTEUgKmZwdAAGRklMRSAqdAAJX2ZzY2FuZl9yc3EAfgAKcHQ7bwogICAgICAgIDxDT0RFPnNjYW5mPC9DT0RFPiBzY2FucyBhIHNlcmllcyBvZiBpbnB1dCBmaWVsZHMgZnJvbSBzdGFuZGFyZCBpbnB1dCwKICAgICAgICAgb25lIGNoYXJhY3RlciBhdCBhIHRpbWUuICBFYWNoIGZpZWxkIGlzIGludGVycHJldGVkIGFjY29yZGluZyB0bwogICAgICAgICBhIGZvcm1hdCBzcGVjaWZpZXIgcGFzc2VkIHRvIDxDT0RFPnNjYW5mPC9DT0RFPiBpbiB0aGUgZm9ybWF0IHN0cmluZyBhdAogICAgICAgICA8Q09ERT4qPFZBUj5mb3JtYXQ8L1ZBUj48L0NPREU+LiAgPENPREU+c2NhbmY8L0NPREU+IHN0b3JlcyB0aGUgaW50ZXJwcmV0ZWQgaW5wdXQgZnJvbQogICAgICAgICBlYWNoIGZpZWxkIGF0IHRoZSBhZGRyZXNzIHBhc3NlZCB0byBpdCBhcyB0aGUgY29ycmVzcG9uZGluZyBhcmd1bWVudAogICAgICAgICBmb2xsb3dpbmcgPFZBUj5mb3JtYXQ8L1ZBUj4uICBZb3UgbXVzdCBzdXBwbHkgdGhlIHNhbWUgbnVtYmVyIG9mCiAgICAgICAgIGZvcm1hdCBzcGVjaWZpZXJzIGFuZCBhZGRyZXNzIGFyZ3VtZW50cyBhcyB0aGVyZSBhcmUgaW5wdXQgZmllbGRzLgogICAgICAgICA8YnI+PGJyPiBUaGVyZSBtdXN0IGJlIHN1ZmZpY2llbnQgYWRkcmVzcyBhcmd1bWVudHMgZm9yIHRoZSBnaXZlbiBmb3JtYXQKICAgICAgICAgc3BlY2lmaWVyczsgaWYgbm90IHRoZSByZXN1bHRzIGFyZSB1bnByZWRpY3RhYmxlIGFuZCBsaWtlbHkKICAgICAgICAgZGlzYXN0ZXJvdXMuICBFeGNlc3MgYWRkcmVzcyBhcmd1bWVudHMgYXJlIG1lcmVseSBpZ25vcmVkLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5zY2FuZjwvQ09ERT4gb2Z0ZW4gcHJvZHVjZXMgdW5leHBlY3RlZCByZXN1bHRzIGlmIHRoZSBpbnB1dCBkaXZlcmdlcyBmcm9tCiAgICAgICAgIGFuIGV4cGVjdGVkIHBhdHRlcm4uIFNpbmNlIHRoZSBjb21iaW5hdGlvbiBvZiA8Q09ERT5nZXRzPC9DT0RFPiBvciA8Q09ERT5mZ2V0czwvQ09ERT4KICAgICAgICAgZm9sbG93ZWQgYnkgPENPREU+c3NjYW5mPC9DT0RFPiBpcyBzYWZlIGFuZCBlYXN5LCB0aGF0IGlzIHRoZSBwcmVmZXJyZWQgd2F5CiAgICAgICAgIHRvIGJlIGNlcnRhaW4gdGhhdCBhIHByb2dyYW0gaXMgc3luY2hyb25pemVkIHdpdGggaW5wdXQgYXQgdGhlIGVuZAogICAgICAgICBvZiBhIGxpbmUuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPmZzY2FuZjwvQ09ERT4gYW5kIDxDT0RFPnNzY2FuZjwvQ09ERT4gYXJlIGlkZW50aWNhbCB0byA8Q09ERT5zY2FuZjwvQ09ERT4sIG90aGVyIHRoYW4gdGhlCiAgICAgICAgIHNvdXJjZSBvZiBpbnB1dDogPENPREU+ZnNjYW5mPC9DT0RFPiByZWFkcyBmcm9tIGEgZmlsZSwgYW5kIDxDT0RFPnNzY2FuZjwvQ09ERT4KICAgICAgICAgZnJvbSBhIHN0cmluZy4KICAgICAgICAgPGJyPjxicj4gVGhlIHJvdXRpbmVzIDxDT0RFPl9zY2FuZl9yPC9DT0RFPiwgPENPREU+X2ZzY2FuZl9yPC9DT0RFPiwgYW5kIDxDT0RFPl9zc2NhbmZfcjwvQ09ERT4gYXJlIHJlZW50cmFudAogICAgICAgICB2ZXJzaW9ucyBvZiA8Q09ERT5zY2FuZjwvQ09ERT4sIDxDT0RFPmZzY2FuZjwvQ09ERT4sIGFuZCA8Q09ERT5zc2NhbmY8L0NPREU+IHRoYXQgdGFrZSBhbiBhZGRpdGlvbmFsCiAgICAgICAgIGZpcnN0IGFyZ3VtZW50IHBvaW50aW5nIHRvIGEgcmVlbnRyYW5jeSBzdHJ1Y3R1cmUuCiAgICAgICAgIDxicj48YnI+IFRoZSBzdHJpbmcgYXQgPENPREU+KjxWQVI+Zm9ybWF0PC9WQVI+PC9DT0RFPiBpcyBhIGNoYXJhY3RlciBzZXF1ZW5jZSBjb21wb3NlZAogICAgICAgICBvZiB6ZXJvIG9yIG1vcmUgZGlyZWN0aXZlcy4gRGlyZWN0aXZlcyBhcmUgY29tcG9zZWQgb2YKICAgICAgICAgb25lIG9yIG1vcmUgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzLAogICAgICAgICBhbmQgZm9ybWF0IHNwZWNpZmljYXRpb25zLgogICAgICAgICA8YnI+PGJyPiBXaGl0ZXNwYWNlIGNoYXJhY3RlcnMgYXJlIGJsYW5rICg8Q09ERT4gPC9DT0RFPiksIHRhYiAoPENPREU+XHQ8L0NPREU+KSwgb3IKICAgICAgICAgbmV3bGluZSAoPENPREU+XG48L0NPREU+KS4KICAgICAgICAgV2hlbiA8Q09ERT5zY2FuZjwvQ09ERT4gZW5jb3VudGVycyBhIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGluIHRoZSBmb3JtYXQgc3RyaW5nCiAgICAgICAgIGl0IHdpbGwgcmVhZCAoYnV0IG5vdCBzdG9yZSkgYWxsIGNvbnNlY3V0aXZlIHdoaXRlc3BhY2UgY2hhcmFjdGVycwogICAgICAgICB1cCB0byB0aGUgbmV4dCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaW4gdGhlIGlucHV0LgogICAgICAgICA8YnI+PGJyPiBOb24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGFyZSBhbGwgb3RoZXIgQVNDSUkgY2hhcmFjdGVycyBleGNlcHQgdGhlCiAgICAgICAgIHBlcmNlbnQgc2lnbiAoPENPREU+JTwvQ09ERT4pLiAgV2hlbiA8Q09ERT5zY2FuZjwvQ09ERT4gZW5jb3VudGVycyBhIG5vbi13aGl0ZXNwYWNlCiAgICAgICAgIGNoYXJhY3RlciBpbiB0aGUgZm9ybWF0IHN0cmluZyBpdCB3aWxsIHJlYWQsIGJ1dCBub3Qgc3RvcmUKICAgICAgICAgYSBtYXRjaGluZyBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIuCiAgICAgICAgIDxicj48YnI+IEZvcm1hdCBzcGVjaWZpY2F0aW9ucyB0ZWxsIDxDT0RFPnNjYW5mPC9DT0RFPiB0byByZWFkIGFuZCBjb252ZXJ0IGNoYXJhY3RlcnMKICAgICAgICAgZnJvbSB0aGUgaW5wdXQgZmllbGQgaW50byBzcGVjaWZpYyB0eXBlcyBvZiB2YWx1ZXMsIGFuZCBzdG9yZSB0aGVuCiAgICAgICAgIGluIHRoZSBsb2NhdGlvbnMgc3BlY2lmaWVkIGJ5IHRoZSBhZGRyZXNzIGFyZ3VtZW50cy4KICAgICAgICAgPGJyPjxicj4gVHJhaWxpbmcgd2hpdGVzcGFjZSBpcyBsZWZ0IHVucmVhZCB1bmxlc3MgZXhwbGljaXRseQogICAgICAgICBtYXRjaGVkIGluIHRoZSBmb3JtYXQgc3RyaW5nLgogICAgICAgICA8YnI+PGJyPiBUaGUgZm9ybWF0IHNwZWNpZmllcnMgbXVzdCBiZWdpbiB3aXRoIGEgcGVyY2VudCBzaWduICg8Q09ERT4lPC9DT0RFPikKICAgICAgICAgYW5kIGhhdmUgdGhlIGZvbGxvd2luZyBmb3JtOgogICAgICAgICA8YnI+PGJyPiA8cHJlPjxicj4KICAgICAgICAgICAgICAgICVbKl1bPFZBUj53aWR0aDwvVkFSPl1bPFZBUj5zaXplPC9WQVI+XTxWQVI+dHlwZTwvVkFSPjxicj4KICAgICAgICAgPC9wcmU+PGJyPgogICAgICAgICA8YnI+PGJyPiBFYWNoIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGJlZ2lucyB3aXRoIHRoZSBwZXJjZW50IGNoYXJhY3RlciAoPENPREU+JTwvQ09ERT4pLjxicj4KICAgICAgICAgVGhlIG90aGVyIGZpZWxkcyBhcmU6PGJyPgogICAgICAgICA8REw+Cjxicj4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPio8YnI+PC9DT0RFPgo8REQ+CiAgICAgICAgIGFuIG9wdGlvbmFsIG1hcmtlcjsgaWYgcHJlc2VudCwgaXQgc3VwcHJlc3NlcyBpbnRlcnByZXRhdGlvbiBhbmQ8YnI+CiAgICAgICAgIGFzc2lnbm1lbnQgb2YgdGhpcyBpbnB1dCBmaWVsZC48YnI+CiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT48VkFSPndpZHRoPC9WQVI+PGJyPjwvQ09ERT4KPEREPgogICAgICAgICBhbiBvcHRpb25hbCBtYXhpbXVtIGZpZWxkIHdpZHRoOiBhIGRlY2ltYWwgaW50ZWdlciw8YnI+CiAgICAgICAgIHdoaWNoIGNvbnRyb2xzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQ8YnI+CiAgICAgICAgIHdpbGwgYmUgcmVhZCBiZWZvcmUgY29udmVydGluZyB0aGUgY3VycmVudCBpbnB1dCBmaWVsZC4gIElmIHRoZTxicj4KICAgICAgICAgaW5wdXQgZmllbGQgaGFzIGZld2VyIHRoYW4gPFZBUj53aWR0aDwvVkFSPiBjaGFyYWN0ZXJzLCA8Q09ERT5zY2FuZjwvQ09ERT48YnI+CiAgICAgICAgIHJlYWRzIGFsbCB0aGUgY2hhcmFjdGVycyBpbiB0aGUgZmllbGQsIGFuZCB0aGVuPGJyPgogICAgICAgICBwcm9jZWVkcyB3aXRoIHRoZSBuZXh0IGZpZWxkIGFuZCBpdHMgZm9ybWF0IHNwZWNpZmljYXRpb24uPGJyPgogICAgICAgICA8YnI+PGJyPiBJZiBhIHdoaXRlc3BhY2Ugb3IgYSBub24tY29udmVydGFibGUgY2hhcmFjdGVyIG9jY3Vyczxicj4KICAgICAgICAgYmVmb3JlIDxWQVI+d2lkdGg8L1ZBUj4gY2hhcmFjdGVyIGFyZSByZWFkLCB0aGUgY2hhcmFjdGVycyB1cDxicj4KICAgICAgICAgdG8gdGhhdCBjaGFyYWN0ZXIgYXJlIHJlYWQsIGNvbnZlcnRlZCwgYW5kIHN0b3JlZC48YnI+CiAgICAgICAgIFRoZW4gPENPREU+c2NhbmY8L0NPREU+IHByb2NlZWRzIHRvIHRoZSBuZXh0IGZvcm1hdCBzcGVjaWZpY2F0aW9uLjxicj4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPnNpemU8YnI+PC9DT0RFPgo8REQ+CiAgICAgICAgIDxDT0RFPmg8L0NPREU+LCA8Q09ERT5qPC9DT0RFPiwgPENPREU+bDwvQ09ERT4sIDxDT0RFPkw8L0NPREU+LCA8Q09ERT50PC9DT0RFPiwgYW5kIDxDT0RFPno8L0NPREU+IGFyZSBvcHRpb25hbCBzaXplPGJyPgogICAgICAgICBjaGFyYWN0ZXJzIHdoaWNoIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHdheSB0aGF0IDxDT0RFPnNjYW5mPC9DT0RFPjxicj4KICAgICAgICAgaW50ZXJwcmV0cyB0aGUgZGF0YSB0eXBlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50Ljxicj4KICAgICAgICAgPGJyPjxicj4gPHByZT48YnI+CiAgICAgICAgIE1vZGlmaWVyICAgVHlwZShzKTxicj4KICAgICAgICAgICAgaGggICAgICBkLCBpLCBvLCB1LCB4LCBuICBjb252ZXJ0IGlucHV0IHRvIGNoYXIsPGJyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlIGluIGNoYXIgb2JqZWN0PGJyPgogICAgICAgICA8YnI+PGJyPiAgICBoICAgICAgIGQsIGksIG8sIHUsIHgsIG4gIGNvbnZlcnQgaW5wdXQgdG8gc2hvcnQsPGJyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlIGluIHNob3J0IG9iamVjdDxicj4KICAgICAgICAgPGJyPjxicj4gICAgaCAgICAgICBELCBJLCBPLCBVLCBYICAgICBubyBlZmZlY3Q8YnI+CiAgICAgICAgICAgICAgICAgICAgZSwgZiwgYywgcywgcDxicj4KICAgICAgICAgPGJyPjxicj4gICAgaiAgICAgICBkLCBpLCBvLCB1LCB4LCBuICBjb252ZXJ0IGlucHV0IHRvIGludG1heF90LDxicj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZSBpbiBpbnRtYXhfdCBvYmplY3Q8YnI+CiAgICAgICAgIDxicj48YnI+ICAgIGogICAgICAgYWxsIG90aGVycyAgICAgICAgbm8gZWZmZWN0PGJyPgogICAgICAgICA8YnI+PGJyPiAgICBsICAgICAgIGQsIGksIG8sIHUsIHgsIG4gIGNvbnZlcnQgaW5wdXQgdG8gbG9uZyw8YnI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUgaW4gbG9uZyBvYmplY3Q8YnI+CiAgICAgICAgIDxicj48YnI+ICAgIGwgICAgICAgZSwgZiwgZyAgICAgICAgICAgY29udmVydCBpbnB1dCB0byBkb3VibGU8YnI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUgaW4gYSBkb3VibGUgb2JqZWN0PGJyPgogICAgICAgICA8YnI+PGJyPiAgICBsICAgICAgIEQsIEksIE8sIFUsIFggICAgIG5vIGVmZmVjdDxicj4KICAgICAgICAgICAgICAgICAgICBjLCBzLCBwPGJyPgogICAgICAgICA8YnI+PGJyPiAgICBsbCAgICAgIGQsIGksIG8sIHUsIHgsIG4gIGNvbnZlcnQgdG8gbG9uZyBsb25nLDxicj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZSBpbiBsb25nIGxvbmc8YnI+CiAgICAgICAgIDxicj48YnI+ICAgIEwgICAgICAgZCwgaSwgbywgdSwgeCwgbiAgY29udmVydCB0byBsb25nIGxvbmcsPGJyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlIGluIGxvbmcgbG9uZzxicj4KICAgICAgICAgPGJyPjxicj4gICAgTCAgICAgICBlLCBmLCBnLCBFLCBHICAgICBjb252ZXJ0IHRvIGxvbmcgZG91YmxlLDxicj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZSBpbiBsb25nIGRvdWJsZTxicj4KICAgICAgICAgPGJyPjxicj4gICAgTCAgICAgICBhbGwgb3RoZXJzICAgICAgICBubyBlZmZlY3Q8YnI+CiAgICAgICAgIDxicj48YnI+ICAgIHQgICAgICAgZCwgaSwgbywgdSwgeCwgbiAgY29udmVydCBpbnB1dCB0byBwdHJkaWZmX3QsPGJyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlIGluIHB0cmRpZmZfdCBvYmplY3Q8YnI+CiAgICAgICAgIDxicj48YnI+ICAgIHQgICAgICAgYWxsIG90aGVycyAgICAgICAgbm8gZWZmZWN0PGJyPgogICAgICAgICA8YnI+PGJyPiAgICB6ICAgICAgIGQsIGksIG8sIHUsIHgsIG4gIGNvbnZlcnQgaW5wdXQgdG8gc2l6ZV90LDxicj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZSBpbiBzaXplX3Qgb2JqZWN0PGJyPgogICAgICAgICA8YnI+PGJyPiAgICB6ICAgICAgIGFsbCBvdGhlcnMgICAgICAgIG5vIGVmZmVjdDxicj4KICAgICAgICAgPGJyPjxicj4gPC9wcmU+PGJyPgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+PFZBUj50eXBlPC9WQVI+PGJyPjwvQ09ERT4KPEREPgogICAgICAgICA8YnI+PGJyPiBBIGNoYXJhY3RlciB0byBzcGVjaWZ5IHdoYXQga2luZCBvZiBjb252ZXJzaW9uPGJyPgogICAgICAgICA8Q09ERT5zY2FuZjwvQ09ERT4gcGVyZm9ybXMuICBIZXJlIGlzIGEgdGFibGUgb2YgdGhlIGNvbnZlcnNpb248YnI+CiAgICAgICAgIGNoYXJhY3RlcnM6PGJyPgogICAgICAgICA8YnI+PGJyPiA8REw+Cjxicj4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPiU8YnI+PC9DT0RFPgo8REQ+CiAgICAgICAgIE5vIGNvbnZlcnNpb24gaXMgZG9uZTsgdGhlIHBlcmNlbnQgY2hhcmFjdGVyICg8Q09ERT4lPC9DT0RFPikgaXMgc3RvcmVkLjxicj4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPmM8YnI+PC9DT0RFPgo8REQ+CiAgICAgICAgIFNjYW5zIG9uZSBjaGFyYWN0ZXIuICBDb3JyZXNwb25kaW5nIDxWQVI+YXJnPC9WQVI+OiA8Q09ERT4oY2hhciAqYXJnKTwvQ09ERT4uPGJyPgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+czxicj48L0NPREU+CjxERD4KICAgICAgICAgUmVhZHMgYSBjaGFyYWN0ZXIgc3RyaW5nIGludG8gdGhlIGFycmF5IHN1cHBsaWVkLjxicj4KICAgICAgICAgQ29ycmVzcG9uZGluZyA8VkFSPmFyZzwvVkFSPjogPENPREU+KGNoYXIgYXJnW10pPC9DT0RFPi48YnI+CiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5bPFZBUj5wYXR0ZXJuPC9WQVI+XTxicj48L0NPREU+CjxERD4KICAgICAgICAgUmVhZHMgYSBub24tZW1wdHkgY2hhcmFjdGVyIHN0cmluZyBpbnRvIG1lbW9yeTxicj4KICAgICAgICAgc3RhcnRpbmcgYXQgPFZBUj5hcmc8L1ZBUj4uICBUaGlzIGFyZWEgbXVzdCBiZSBsYXJnZTxicj4KICAgICAgICAgZW5vdWdoIHRvIGFjY2VwdCB0aGUgc2VxdWVuY2UgYW5kIGE8YnI+CiAgICAgICAgIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyIHdoaWNoIHdpbGwgYmUgYWRkZWQ8YnI+CiAgICAgICAgIGF1dG9tYXRpY2FsbHkuICAoPFZBUj5wYXR0ZXJuPC9WQVI+IGlzIGRpc2N1c3NlZCBpbiB0aGUgcGFyYWdyYXBoIGZvbGxvd2luZzxicj4KICAgICAgICAgdGhpcyB0YWJsZSkuIENvcnJlc3BvbmRpbmcgPFZBUj5hcmc8L1ZBUj46IDxDT0RFPihjaGFyICphcmcpPC9DT0RFPi48YnI+CiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5kPGJyPjwvQ09ERT4KPEREPgogICAgICAgICBSZWFkcyBhIGRlY2ltYWwgaW50ZWdlciBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIDxWQVI+YXJnPC9WQVI+OiA8Q09ERT4oaW50ICphcmcpPC9DT0RFPi48YnI+CiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5EPGJyPjwvQ09ERT4KPEREPgogICAgICAgICBSZWFkcyBhIGRlY2ltYWwgaW50ZWdlciBpbnRvIHRoZSBjb3JyZXNwb25kaW5nPGJyPgogICAgICAgICA8VkFSPmFyZzwvVkFSPjogPENPREU+KGxvbmcgKmFyZyk8L0NPREU+Ljxicj4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPm88YnI+PC9DT0RFPgo8REQ+CiAgICAgICAgIFJlYWRzIGFuIG9jdGFsIGludGVnZXIgaW50byB0aGUgY29ycmVzcG9uZGluZyA8VkFSPmFyZzwvVkFSPjogPENPREU+KGludCAqYXJnKTwvQ09ERT4uPGJyPgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+Tzxicj48L0NPREU+CjxERD4KICAgICAgICAgUmVhZHMgYW4gb2N0YWwgaW50ZWdlciBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIDxWQVI+YXJnPC9WQVI+OiA8Q09ERT4obG9uZyAqYXJnKTwvQ09ERT4uPGJyPgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+dTxicj48L0NPREU+CjxERD4KICAgICAgICAgUmVhZHMgYW4gdW5zaWduZWQgZGVjaW1hbCBpbnRlZ2VyIGludG8gdGhlIGNvcnJlc3BvbmRpbmc8YnI+CiAgICAgICAgIDxWQVI+YXJnPC9WQVI+OiA8Q09ERT4odW5zaWduZWQgaW50ICphcmcpPC9DT0RFPi48YnI+CiAgICAgICAgIDxEVD48Q09ERT5VPGJyPjwvQ09ERT4KPEREPgogICAgICAgICBSZWFkcyBhbiB1bnNpZ25lZCBkZWNpbWFsIGludGVnZXIgaW50byB0aGUgY29ycmVzcG9uZGluZyA8VkFSPmFyZzwvVkFSPjo8YnI+CiAgICAgICAgIDxDT0RFPih1bnNpZ25lZCBsb25nICphcmcpPC9DT0RFPi48YnI+CiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT54LFg8YnI+PC9DT0RFPgo8REQ+CiAgICAgICAgIFJlYWQgYSBoZXhhZGVjaW1hbCBpbnRlZ2VyIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgPFZBUj5hcmc8L1ZBUj46PGJyPgogICAgICAgICA8Q09ERT4oaW50ICphcmcpPC9DT0RFPi48YnI+CiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5lLCBmLCBnPGJyPjwvQ09ERT4KPEREPgogICAgICAgICBSZWFkIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgPFZBUj5hcmc8L1ZBUj46PGJyPgogICAgICAgICA8Q09ERT4oZmxvYXQgKmFyZyk8L0NPREU+Ljxicj4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkUsIEYsIEc8YnI+PC9DT0RFPgo8REQ+CiAgICAgICAgIFJlYWQgYSBmbG9hdGluZy1wb2ludCBudW1iZXIgaW50byB0aGUgY29ycmVzcG9uZGluZyA8VkFSPmFyZzwvVkFSPjo8YnI+CiAgICAgICAgIDxDT0RFPihkb3VibGUgKmFyZyk8L0NPREU+Ljxicj4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPmk8YnI+PC9DT0RFPgo8REQ+CiAgICAgICAgIFJlYWRzIGEgZGVjaW1hbCwgb2N0YWwgb3IgaGV4YWRlY2ltYWwgaW50ZWdlciBpbnRvIHRoZTxicj4KICAgICAgICAgY29ycmVzcG9uZGluZyA8VkFSPmFyZzwvVkFSPjogPENPREU+KGludCAqYXJnKTwvQ09ERT4uPGJyPgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+STxicj48L0NPREU+CjxERD4KICAgICAgICAgUmVhZHMgYSBkZWNpbWFsLCBvY3RhbCBvciBoZXhhZGVjaW1hbCBpbnRlZ2VyIGludG8gdGhlPGJyPgogICAgICAgICBjb3JyZXNwb25kaW5nIDxWQVI+YXJnPC9WQVI+OiA8Q09ERT4obG9uZyAqYXJnKTwvQ09ERT4uPGJyPgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+bjxicj48L0NPREU+CjxERD4KICAgICAgICAgU3RvcmVzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkIGluIHRoZSBjb3JyZXNwb25kaW5nPGJyPgogICAgICAgICA8VkFSPmFyZzwvVkFSPjogPENPREU+KGludCAqYXJnKTwvQ09ERT4uPGJyPgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+cDxicj48L0NPREU+CjxERD4KICAgICAgICAgU3RvcmVzIGEgc2Nhbm5lZCBwb2ludGVyLiAgQU5TSSBDIGxlYXZlcyB0aGUgZGV0YWlsczxicj4KICAgICAgICAgdG8gZWFjaCBpbXBsZW1lbnRhdGlvbjsgdGhpcyBpbXBsZW1lbnRhdGlvbiB0cmVhdHM8YnI+CiAgICAgICAgIDxDT0RFPiVwPC9DT0RFPiBleGFjdGx5IHRoZSBzYW1lIGFzIDxDT0RFPiVVPC9DT0RFPi4gIENvcnJlc3BvbmRpbmc8YnI+CiAgICAgICAgIDxWQVI+YXJnPC9WQVI+OiA8Q09ERT4odm9pZCAqKmFyZyk8L0NPREU+LiAgPGJyPgogICAgICAgICAKPC9ETD48YnI+CiAgICAgICAgIDxicj48YnI+IDxicj48YnI+IEEgPFZBUj5wYXR0ZXJuPC9WQVI+IG9mIGNoYXJhY3RlcnMgc3Vycm91bmRlZCBieSBzcXVhcmUgYnJhY2tldHMgY2FuIGJlIHVzZWQ8YnI+CiAgICAgICAgIGluc3RlYWQgb2YgdGhlIDxDT0RFPnM8L0NPREU+IHR5cGUgY2hhcmFjdGVyLiAgPFZBUj5wYXR0ZXJuPC9WQVI+IGlzIGEgc2V0IG9mPGJyPgogICAgICAgICBjaGFyYWN0ZXJzIHdoaWNoIGRlZmluZSBhIHNlYXJjaCBzZXQgb2YgcG9zc2libGUgY2hhcmFjdGVycyBtYWtpbmcgdXA8YnI+CiAgICAgICAgIHRoZSA8Q09ERT5zY2FuZjwvQ09ERT4gaW5wdXQgZmllbGQuICBJZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBicmFja2V0cyBpcyBhPGJyPgogICAgICAgICBjYXJldCAoPENPREU+XjwvQ09ERT4pLCB0aGUgc2VhcmNoIHNldCBpcyBpbnZlcnRlZCB0byBpbmNsdWRlIGFsbCBBU0NJSSBjaGFyYWN0ZXJzPGJyPgogICAgICAgICBleGNlcHQgdGhvc2UgYmV0d2VlbiB0aGUgYnJhY2tldHMuICBUaGVyZSBpcyBhbHNvIGEgcmFuZ2UgZmFjaWxpdHk8YnI+CiAgICAgICAgIHdoaWNoIHlvdSBjYW4gdXNlIGFzIGEgc2hvcnRjdXQuIDxDT0RFPiVbMC05XSA8L0NPREU+IG1hdGNoZXMgYWxsIGRlY2ltYWwgZGlnaXRzLjxicj4KICAgICAgICAgVGhlIGh5cGhlbiBtdXN0IG5vdCBiZSB0aGUgZmlyc3Qgb3IgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIHNldC48YnI+CiAgICAgICAgIFRoZSBjaGFyYWN0ZXIgcHJpb3IgdG8gdGhlIGh5cGhlbiBtdXN0IGJlIGxleGljYWxseSBsZXNzIHRoYW4gdGhlPGJyPgogICAgICAgICBjaGFyYWN0ZXIgYWZ0ZXIgaXQuPGJyPgogICAgICAgICA8YnI+PGJyPiBIZXJlIGFyZSBzb21lIDxWQVI+cGF0dGVybjwvVkFSPiBleGFtcGxlczo8YnI+CiAgICAgICAgIDxETD4KPGJyPgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+JVthYmNkXTxicj48L0NPREU+CjxERD4KICAgICAgICAgbWF0Y2hlcyBzdHJpbmdzIGNvbnRhaW5pbmcgb25seSA8Q09ERT5hPC9DT0RFPiwgPENPREU+YjwvQ09ERT4sIDxDT0RFPmM8L0NPREU+LCBhbmQgPENPREU+ZDwvQ09ERT4uPGJyPgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+JVteYWJjZF08YnI+PC9DT0RFPgo8REQ+CiAgICAgICAgIG1hdGNoZXMgc3RyaW5ncyBjb250YWluaW5nIGFueSBjaGFyYWN0ZXJzIGV4Y2VwdCA8Q09ERT5hPC9DT0RFPiwgPENPREU+YjwvQ09ERT4sPGJyPgogICAgICAgICA8Q09ERT5jPC9DT0RFPiwgb3IgPENPREU+ZDwvQ09ERT48YnI+CiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT4lW0EtRFctWl08YnI+PC9DT0RFPgo8REQ+CiAgICAgICAgIG1hdGNoZXMgc3RyaW5ncyBjb250YWluaW5nIDxDT0RFPkE8L0NPREU+LCA8Q09ERT5CPC9DT0RFPiwgPENPREU+QzwvQ09ERT4sIDxDT0RFPkQ8L0NPREU+LCA8Q09ERT5XPC9DT0RFPiw8YnI+CiAgICAgICAgIDxDT0RFPlg8L0NPREU+LCA8Q09ERT5ZPC9DT0RFPiwgPENPREU+WjwvQ09ERT48YnI+CiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT4lW3otYV08YnI+PC9DT0RFPgo8REQ+CiAgICAgICAgIG1hdGNoZXMgdGhlIGNoYXJhY3RlcnMgIDxDT0RFPno8L0NPREU+LCA8Q09ERT4tPC9DT0RFPiwgYW5kIDxDT0RFPmE8L0NPREU+PGJyPgogICAgICAgICA8L0RMPjxicj4KICAgICAgICAgPGJyPjxicj4gPGJyPjxicj4gRmxvYXRpbmcgcG9pbnQgbnVtYmVycyAoZm9yIGZpZWxkIHR5cGVzIDxDT0RFPmU8L0NPREU+LCA8Q09ERT5mPC9DT0RFPiwgPENPREU+ZzwvQ09ERT4sIDxDT0RFPkU8L0NPREU+LDxicj4KICAgICAgICAgPENPREU+RjwvQ09ERT4sIDxDT0RFPkc8L0NPREU+KSBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIGZvbGxvd2luZyBnZW5lcmFsIGZvcm06PGJyPgogICAgICAgICA8YnI+PGJyPiA8cHJlPjxicj4KICAgICAgICAgCQlbKy8tXSBkZGRkZFsuXWRkZCBbRXxlWyt8LV1kZGRdPGJyPgogICAgICAgICA8L3ByZT4KICAgICAgICAgPGJyPjxicj4gd2hlcmUgb2JqZWN0cyBpbmNsb3NlZCBpbiBzcXVhcmUgYnJhY2tldHMgYXJlIG9wdGlvbmFsLCBhbmQgPENPREU+ZGRkPC9DT0RFPgogICAgICAgICByZXByZXNlbnRzIGRlY2ltYWwsIG9jdGFsLCBvciBoZXhhZGVjaW1hbCBkaWdpdHMuCiAgICAgICAgIDwvREw+CiAgICAgICAgIDxicj48YnI+IDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICA8Q09ERT5zY2FuZjwvQ09ERT4gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGlucHV0IGZpZWxkcyBzdWNjZXNzZnVsbHkKICAgICAgICAgc2Nhbm5lZCwgY29udmVydGVkIGFuZCBzdG9yZWQ7IHRoZSByZXR1cm4gdmFsdWUgZG9lcwogICAgICAgICBub3QgaW5jbHVkZSBzY2FubmVkIGZpZWxkcyB3aGljaCB3ZXJlIG5vdCBzdG9yZWQuCiAgICAgICAgIDxicj48YnI+IElmIDxDT0RFPnNjYW5mPC9DT0RFPiBhdHRlbXB0cyB0byByZWFkIGF0IGVuZC1vZi1maWxlLCB0aGUgcmV0dXJuCiAgICAgICAgIHZhbHVlIGlzIDxDT0RFPkVPRjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IElmIG5vIGZpZWxkcyB3ZXJlIHN0b3JlZCwgdGhlIHJldHVybiB2YWx1ZSBpcyA8Q09ERT4wPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gPENPREU+c2NhbmY8L0NPREU+IG1pZ2h0IHN0b3Agc2Nhbm5pbmcgYSBwYXJ0aWN1bGFyIGZpZWxkIGJlZm9yZQogICAgICAgICByZWFjaGluZyB0aGUgbm9ybWFsIGZpZWxkIGVuZCBjaGFyYWN0ZXIsIG9yIG1heQogICAgICAgICB0ZXJtaW5hdGUgZW50aXJlbHkuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPnNjYW5mPC9DT0RFPiBzdG9wcyBzY2FubmluZyBhbmQgc3RvcmluZyB0aGUgY3VycmVudCBmaWVsZAogICAgICAgICBhbmQgbW92ZXMgdG8gdGhlIG5leHQgaW5wdXQgZmllbGQgKGlmIGFueSkKICAgICAgICAgaW4gYW55IG9mIHRoZSBmb2xsb3dpbmcgc2l0dWF0aW9uczoKICAgICAgICAgPGJyPjxicj4gPE9MPgogICAgICAgICA8YnI+PGJyPiA8TEk+ICAgICAgIFRoZSBhc3NpZ25tZW50IHN1cHByZXNzaW5nIGNoYXJhY3RlciAoPENPREU+KjwvQ09ERT4pIGFwcGVhcnMKICAgICAgICAgYWZ0ZXIgdGhlIDxDT0RFPiU8L0NPREU+IGluIHRoZSBmb3JtYXQgc3BlY2lmaWNhdGlvbjsgdGhlIGN1cnJlbnQKICAgICAgICAgaW5wdXQgZmllbGQgaXMgc2Nhbm5lZCBidXQgbm90IHN0b3JlZC4KICAgICAgICAgPGJyPjxicj4gPExJPiAgICAgICA8VkFSPndpZHRoPC9WQVI+IGNoYXJhY3RlcnMgaGF2ZSBiZWVuIHJlYWQgKDxWQVI+d2lkdGg8L1ZBUj4gaXMgYQogICAgICAgICB3aWR0aCBzcGVjaWZpY2F0aW9uLCBhIHBvc2l0aXZlIGRlY2ltYWwgaW50ZWdlcikuCiAgICAgICAgIDxicj48YnI+IDxMST4gICAgICAgVGhlIG5leHQgY2hhcmFjdGVyIHJlYWQgY2Fubm90IGJlIGNvbnZlcnRlZAogICAgICAgICB1bmRlciB0aGUgdGhlIGN1cnJlbnQgZm9ybWF0IChmb3IgZXhhbXBsZSwKICAgICAgICAgaWYgYSA8Q09ERT5aPC9DT0RFPiBpcyByZWFkIHdoZW4gdGhlIGZvcm1hdCBpcyBkZWNpbWFsKS4KICAgICAgICAgPGJyPjxicj4gPExJPiAgICAgICBUaGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIGlucHV0IGZpZWxkIGRvZXMgbm90IGFwcGVhcgogICAgICAgICBpbiB0aGUgc2VhcmNoIHNldCAob3IgZG9lcyBhcHBlYXIgaW4gdGhlIGludmVydGVkIHNlYXJjaCBzZXQpLgogICAgICAgICA8L09MPgogICAgICAgICA8YnI+PGJyPiA8YnI+PGJyPiBXaGVuIDxDT0RFPnNjYW5mPC9DT0RFPiBzdG9wcyBzY2FubmluZyB0aGUgY3VycmVudCBpbnB1dCBmaWVsZCBmb3Igb25lIG9mCiAgICAgICAgIHRoZXNlIHJlYXNvbnMsIHRoZSBuZXh0IGNoYXJhY3RlciBpcyBjb25zaWRlcmVkIHVucmVhZCBhbmQKICAgICAgICAgdXNlZCBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBmb2xsb3dpbmcgaW5wdXQgZmllbGQsIG9yIHRoZQogICAgICAgICBmaXJzdCBjaGFyYWN0ZXIgaW4gYSBzdWJzZXF1ZW50IHJlYWQgb3BlcmF0aW9uIG9uIHRoZSBpbnB1dC4KICAgICAgICAgPGJyPjxicj4gPENPREU+c2NhbmY8L0NPREU+IHdpbGwgdGVybWluYXRlIHVuZGVyIHRoZSBmb2xsb3dpbmcgY2lyY3Vtc3RhbmNlczoKICAgICAgICAgPGJyPjxicj4gPE9MPgogICAgICAgICA8YnI+PGJyPiA8TEk+ICAgICAgIFRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgaW5wdXQgZmllbGQgY29uZmxpY3RzCiAgICAgICAgIHdpdGggYSBjb3JyZXNwb25kaW5nIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBpbiB0aGUKICAgICAgICAgZm9ybWF0IHN0cmluZy4KICAgICAgICAgPGJyPjxicj4gPExJPiAgICAgICBUaGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIGlucHV0IGZpZWxkIGlzIDxDT0RFPkVPRjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxMST4gICAgICAgVGhlIGZvcm1hdCBzdHJpbmcgaGFzIGJlZW4gZXhoYXVzdGVkLgogICAgICAgICA8L09MPgogICAgICAgICA8YnI+PGJyPiA8YnI+PGJyPiBXaGVuIHRoZSBmb3JtYXQgc3RyaW5nIGNvbnRhaW5zIGEgY2hhcmFjdGVyIHNlcXVlbmNlIHRoYXQgaXMKICAgICAgICAgbm90IHBhcnQgb2YgYSBmb3JtYXQgc3BlY2lmaWNhdGlvbiwgdGhlIHNhbWUgY2hhcmFjdGVyCiAgICAgICAgIHNlcXVlbmNlIG11c3QgYXBwZWFyIGluIHRoZSBpbnB1dDsgPENPREU+c2NhbmY8L0NPREU+IHdpbGwKICAgICAgICAgc2NhbiBidXQgbm90IHN0b3JlIHRoZSBtYXRjaGVkIGNoYXJhY3RlcnMuICBJZiBhCiAgICAgICAgIGNvbmZsaWN0IG9jY3VycywgdGhlIGZpcnN0IGNvbmZsaWN0aW5nIGNoYXJhY3RlciByZW1haW5zIGluIHRoZSBpbnB1dAogICAgICAgICBhcyBpZiBpdCBoYWQgbmV2ZXIgYmVlbiByZWFkLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIDxDT0RFPnNjYW5mPC9DT0RFPiBpcyBBTlNJIEMuCiAgICAgICAgIDxicj48YnI+IFN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMgcmVxdWlyZWQ6IDxDT0RFPmNsb3NlPC9DT0RFPiwgPENPREU+ZnN0YXQ8L0NPREU+LCA8Q09ERT5pc2F0dHk8L0NPREU+LAogICAgICAgICA8Q09ERT5sc2VlazwvQ09ERT4sIDxDT0RFPnJlYWQ8L0NPREU+LCA8Q09ERT5zYnJrPC9DT0RFPiwgPENPREU+d3JpdGU8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+AQh0ADRzdHJ1Y3QgX3JlZW50ICpwdHIsIEZJTEUgKmZkLGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4udAAEaW50IHQACF9mc2Vla19yc3EAfgAKcHQIKgogICAgICAgIE9iamVjdHMgb2YgdHlwZSA8Q09ERT5GSUxFPC9DT0RFPiBjYW4gaGF2ZSBhIGBgcG9zaXRpb24nJyB0aGF0IHJlY29yZHMgaG93IG11Y2gKICAgICAgICAgb2YgdGhlIGZpbGUgeW91ciBwcm9ncmFtIGhhcyBhbHJlYWR5IHJlYWQuICBNYW55IG9mIHRoZSA8Q09ERT5zdGRpbzwvQ09ERT4gZnVuY3Rpb25zCiAgICAgICAgIGRlcGVuZCBvbiB0aGlzIHBvc2l0aW9uLCBhbmQgbWFueSBjaGFuZ2UgaXQgYXMgYSBzaWRlIGVmZmVjdC4KICAgICAgICAgPGJyPjxicj4gWW91IGNhbiB1c2UgPENPREU+ZnNlZWs8L0NPREU+LzxDT0RFPmZzZWVrbzwvQ09ERT4gdG8gc2V0IHRoZSBwb3NpdGlvbiBmb3IgdGhlIGZpbGUgaWRlbnRpZmllZCBieQogICAgICAgICA8VkFSPmZwPC9WQVI+LiAgVGhlIHZhbHVlIG9mIDxWQVI+b2Zmc2V0PC9WQVI+IGRldGVybWluZXMgdGhlIG5ldyBwb3NpdGlvbiwgaW4gb25lCiAgICAgICAgIG9mIHRocmVlIHdheXMgc2VsZWN0ZWQgYnkgdGhlIHZhbHVlIG9mIDxWQVI+d2hlbmNlPC9WQVI+IChkZWZpbmVkIGFzIG1hY3JvcwogICAgICAgICBpbiBgPENPREU+c3RkaW8uaDwvQ09ERT4nKToKICAgICAgICAgPGJyPjxicj4gPENPREU+U0VFS19TRVQ8L0NPREU+LS0tPFZBUj5vZmZzZXQ8L1ZBUj4gaXMgdGhlIGFic29sdXRlIGZpbGUgcG9zaXRpb24gKGFuIG9mZnNldAogICAgICAgICBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUpIGRlc2lyZWQuICA8VkFSPm9mZnNldDwvVkFSPiBtdXN0IGJlIHBvc2l0aXZlLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5TRUVLX0NVUjwvQ09ERT4tLS08VkFSPm9mZnNldDwvVkFSPiBpcyByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uLgogICAgICAgICA8VkFSPm9mZnNldDwvVkFSPiBjYW4gbWVhbmluZ2Z1bGx5IGJlIGVpdGhlciBwb3NpdGl2ZSBvciBuZWdhdGl2ZS4KICAgICAgICAgPGJyPjxicj4gPENPREU+U0VFS19FTkQ8L0NPREU+LS0tPFZBUj5vZmZzZXQ8L1ZBUj4gaXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZW5kIG9mIGZpbGUuCiAgICAgICAgIDxWQVI+b2Zmc2V0PC9WQVI+IGNhbiBtZWFuaW5nZnVsbHkgYmUgZWl0aGVyIHBvc2l0aXZlICh0byBpbmNyZWFzZSB0aGUgc2l6ZQogICAgICAgICBvZiB0aGUgZmlsZSkgb3IgbmVnYXRpdmUuCiAgICAgICAgIDxicj48YnI+IFNlZSA8Q09ERT5mdGVsbDwvQ09ERT4vPENPREU+ZnRlbGxvPC9DT0RFPiB0byBkZXRlcm1pbmUgdGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIDxDT0RFPmZzZWVrPC9DT0RFPi88Q09ERT5mc2Vla288L0NPREU+IHJldHVybiA8Q09ERT4wPC9DT0RFPiB3aGVuIHN1Y2Nlc3NmdWwuICBPbiBmYWlsdXJlLCB0aGUKICAgICAgICAgcmVzdWx0IGlzIDxDT0RFPkVPRjwvQ09ERT4uICBUaGUgcmVhc29uIGZvciBmYWlsdXJlIGlzIGluZGljYXRlZCBpbiA8Q09ERT5lcnJubzwvQ09ERT46CiAgICAgICAgIGVpdGhlciA8Q09ERT5FU1BJUEU8L0NPREU+ICh0aGUgc3RyZWFtIGlkZW50aWZpZWQgYnkgPFZBUj5mcDwvVkFSPiBkb2Vzbid0IHN1cHBvcnQKICAgICAgICAgcmVwb3NpdGlvbmluZykgb3IgPENPREU+RUlOVkFMPC9DT0RFPiAoaW52YWxpZCBmaWxlIHBvc2l0aW9uKS4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICBBTlNJIEMgcmVxdWlyZXMgPENPREU+ZnNlZWs8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5mc2Vla288L0NPREU+IGlzIGRlZmluZWQgYnkgdGhlIFNpbmdsZSBVbml4IHNwZWNpZmljYXRpb24uCiAgICAgICAgIDxicj48YnI+IFN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMgcmVxdWlyZWQ6IDxDT0RFPmNsb3NlPC9DT0RFPiwgPENPREU+ZnN0YXQ8L0NPREU+LCA8Q09ERT5pc2F0dHk8L0NPREU+LAogICAgICAgICA8Q09ERT5sc2VlazwvQ09ERT4sIDxDT0RFPnJlYWQ8L0NPREU+LCA8Q09ERT5zYnJrPC9DT0RFPiwgPENPREU+d3JpdGU8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+AQ90ADRzdHJ1Y3QgX3JlZW50ICpwdHIsIEZJTEUgKmZwLGxvbmcgb2Zmc2V0LCBpbnQgd2hlbmNldAAEaW50IHQAC19mc2Vla282NF9yc3EAfgAKcHQIDQogICAgICAgIE9iamVjdHMgb2YgdHlwZSA8Q09ERT5GSUxFPC9DT0RFPiBjYW4gaGF2ZSBhIGBgcG9zaXRpb24nJyB0aGF0IHJlY29yZHMgaG93IG11Y2gKICAgICAgICAgb2YgdGhlIGZpbGUgeW91ciBwcm9ncmFtIGhhcyBhbHJlYWR5IHJlYWQuICBNYW55IG9mIHRoZSA8Q09ERT5zdGRpbzwvQ09ERT4gZnVuY3Rpb25zCiAgICAgICAgIGRlcGVuZCBvbiB0aGlzIHBvc2l0aW9uLCBhbmQgbWFueSBjaGFuZ2UgaXQgYXMgYSBzaWRlIGVmZmVjdC4KICAgICAgICAgPGJyPjxicj4gWW91IGNhbiB1c2UgPENPREU+ZnNlZWtvNjQ8L0NPREU+IHRvIHNldCB0aGUgcG9zaXRpb24gZm9yIHRoZSBmaWxlIGlkZW50aWZpZWQgYnkKICAgICAgICAgPFZBUj5mcDwvVkFSPiB0aGF0IHdhcyBvcGVuZWQgdmlhIDxDT0RFPmZvcGVuNjQ8L0NPREU+LiAgVGhlIHZhbHVlIG9mIDxWQVI+b2Zmc2V0PC9WQVI+IGRldGVybWluZXMKICAgICAgICAgdGhlIG5ldyBwb3NpdGlvbiwgaW4gb25lIG9mIHRocmVlIHdheXMgc2VsZWN0ZWQgYnkgdGhlIHZhbHVlIG9mIDxWQVI+d2hlbmNlPC9WQVI+CiAgICAgICAgIChkZWZpbmVkIGFzIG1hY3JvcyBpbiBgPENPREU+c3RkaW8uaDwvQ09ERT4nKToKICAgICAgICAgPGJyPjxicj4gPENPREU+U0VFS19TRVQ8L0NPREU+LS0tPFZBUj5vZmZzZXQ8L1ZBUj4gaXMgdGhlIGFic29sdXRlIGZpbGUgcG9zaXRpb24gKGFuIG9mZnNldAogICAgICAgICBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUpIGRlc2lyZWQuICA8VkFSPm9mZnNldDwvVkFSPiBtdXN0IGJlIHBvc2l0aXZlLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5TRUVLX0NVUjwvQ09ERT4tLS08VkFSPm9mZnNldDwvVkFSPiBpcyByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uLgogICAgICAgICA8VkFSPm9mZnNldDwvVkFSPiBjYW4gbWVhbmluZ2Z1bGx5IGJlIGVpdGhlciBwb3NpdGl2ZSBvciBuZWdhdGl2ZS4KICAgICAgICAgPGJyPjxicj4gPENPREU+U0VFS19FTkQ8L0NPREU+LS0tPFZBUj5vZmZzZXQ8L1ZBUj4gaXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZW5kIG9mIGZpbGUuCiAgICAgICAgIDxWQVI+b2Zmc2V0PC9WQVI+IGNhbiBtZWFuaW5nZnVsbHkgYmUgZWl0aGVyIHBvc2l0aXZlICh0byBpbmNyZWFzZSB0aGUgc2l6ZQogICAgICAgICBvZiB0aGUgZmlsZSkgb3IgbmVnYXRpdmUuCiAgICAgICAgIDxicj48YnI+IFNlZSA8Q09ERT5mdGVsbG82NDwvQ09ERT4gdG8gZGV0ZXJtaW5lIHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICA8Q09ERT5mc2Vla282NDwvQ09ERT4gcmV0dXJucyA8Q09ERT4wPC9DT0RFPiB3aGVuIHN1Y2Nlc3NmdWwuICBPbiBmYWlsdXJlLCB0aGUKICAgICAgICAgcmVzdWx0IGlzIDxDT0RFPkVPRjwvQ09ERT4uICBUaGUgcmVhc29uIGZvciBmYWlsdXJlIGlzIGluZGljYXRlZCBpbiA8Q09ERT5lcnJubzwvQ09ERT46CiAgICAgICAgIGVpdGhlciA8Q09ERT5FU1BJUEU8L0NPREU+ICh0aGUgc3RyZWFtIGlkZW50aWZpZWQgYnkgPFZBUj5mcDwvVkFSPiBkb2Vzbid0IHN1cHBvcnQKICAgICAgICAgcmVwb3NpdGlvbmluZyBvciB3YXNuJ3Qgb3BlbmVkIHZpYSA8Q09ERT5mb3BlbjY0PC9DT0RFPikgb3IgPENPREU+RUlOVkFMPC9DT0RFPgogICAgICAgICAoaW52YWxpZCBmaWxlIHBvc2l0aW9uKS4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICA8Q09ERT5mc2Vla282NDwvQ09ERT4gaXMgYSBnbGliYyBleHRlbnNpb24uCiAgICAgICAgIDxicj48YnI+IFN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMgcmVxdWlyZWQ6IDxDT0RFPmNsb3NlPC9DT0RFPiwgPENPREU+ZnN0YXQ2NDwvQ09ERT4sIDxDT0RFPmlzYXR0eTwvQ09ERT4sCiAgICAgICAgIDxDT0RFPmxzZWVrNjQ8L0NPREU+LCA8Q09ERT5yZWFkPC9DT0RFPiwgPENPREU+c2JyazwvQ09ERT4sIDxDT0RFPndyaXRlPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAdzdGRpby5oeHEAfgEWdAA4c3RydWN0IF9yZWVudCAqcHRyLCBGSUxFICpmcCxfb2ZmNjRfdCBvZmZzZXQsIGludCB3aGVuY2V0AARpbnQgdAAJX2ZzZWVrb19yc3EAfgAKcHEAfgERc3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+AR10ADVzdHJ1Y3QgX3JlZW50ICpwdHIsIEZJTEUgKmZwLG9mZl90IG9mZnNldCwgaW50IHdoZW5jZXQABGludCB0AAxfZnNldHBvczY0X3JzcQB+AApwdAUYCiAgICAgICAgT2JqZWN0cyBvZiB0eXBlIDxDT0RFPkZJTEU8L0NPREU+IGNhbiBoYXZlIGEgYGBwb3NpdGlvbicnIHRoYXQgcmVjb3JkcyBob3cgbXVjaAogICAgICAgICBvZiB0aGUgZmlsZSB5b3VyIHByb2dyYW0gaGFzIGFscmVhZHkgcmVhZC4gIE1hbnkgb2YgdGhlIDxDT0RFPnN0ZGlvPC9DT0RFPiBmdW5jdGlvbnMKICAgICAgICAgZGVwZW5kIG9uIHRoaXMgcG9zaXRpb24sIGFuZCBtYW55IGNoYW5nZSBpdCBhcyBhIHNpZGUgZWZmZWN0LgogICAgICAgICA8YnI+PGJyPiBZb3UgY2FuIHVzZSA8Q09ERT5mc2V0cG9zNjQ8L0NPREU+IHRvIHJldHVybiB0aGUgbGFyZ2UgZmlsZSBpZGVudGlmaWVkIGJ5IDxWQVI+ZnA8L1ZBUj4gdG8gYSAKICAgICAgICAgcHJldmlvdXMgcG9zaXRpb24gPENPREU+KjxWQVI+cG9zPC9WQVI+PC9DT0RFPiAoYWZ0ZXIgZmlyc3QgcmVjb3JkaW5nIGl0IHdpdGggPENPREU+ZmdldHBvczY0PC9DT0RFPikuCiAgICAgICAgIDxicj48YnI+IFNlZSA8Q09ERT5mc2Vla282NDwvQ09ERT4gZm9yIGEgc2ltaWxhciBmYWNpbGl0eS4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIDxDT0RFPmZnZXRwb3M2NDwvQ09ERT4gcmV0dXJucyA8Q09ERT4wPC9DT0RFPiB3aGVuIHN1Y2Nlc3NmdWwuICBJZiA8Q09ERT5mZ2V0cG9zNjQ8L0NPREU+IGZhaWxzLCB0aGUKICAgICAgICAgcmVzdWx0IGlzIDxDT0RFPjE8L0NPREU+LiAgVGhlIHJlYXNvbiBmb3IgZmFpbHVyZSBpcyBpbmRpY2F0ZWQgaW4gPENPREU+ZXJybm88L0NPREU+OgogICAgICAgICBlaXRoZXIgPENPREU+RVNQSVBFPC9DT0RFPiAodGhlIHN0cmVhbSBpZGVudGlmaWVkIGJ5IDxWQVI+ZnA8L1ZBUj4gZG9lc24ndCBzdXBwb3J0CiAgICAgICAgIDY0LWJpdCByZXBvc2l0aW9uaW5nKSBvciA8Q09ERT5FSU5WQUw8L0NPREU+IChpbnZhbGlkIGZpbGUgcG9zaXRpb24pLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIDxDT0RFPmZzZXRwb3M2NDwvQ09ERT4gaXMgYSBnbGliYyBleHRlbnNpb24uCiAgICAgICAgIDxicj48YnI+IFN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMgcmVxdWlyZWQ6IDxDT0RFPmNsb3NlPC9DT0RFPiwgPENPREU+ZnN0YXQ8L0NPREU+LCA8Q09ERT5pc2F0dHk8L0NP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YGBwb3NpdGlvbicnIHRoYXQgcmVjb3JkcyBob3cgbXVjaAogICAgICAgICBvZiB0aGUgZmlsZSB5b3VyIHByb2dyYW0gaGFzIGFscmVhZHkgcmVhZC4gIE1hbnkgb2YgdGhlIDxDT0RFPnN0ZGlvPC9DT0RFPiBmdW5jdGlvbnMKICAgICAgICAgZGVwZW5kIG9uIHRoaXMgcG9zaXRpb24sIGFuZCBtYW55IGNoYW5nZSBpdCBhcyBhIHNpZGUgZWZmZWN0LgogICAgICAgICA8YnI+PGJyPiBUaGUgcmVzdWx0IG9mIDxDT0RFPmZ0ZWxsPC9DT0RFPi88Q09ERT5mdGVsbG88L0NPREU+IGlzIHRoZSBjdXJyZW50IHBvc2l0aW9uIGZvciBhIGZpbGUKICAgICAgICAgaWRlbnRpZmllZCBieSA8VkFSPmZwPC9WQVI+LiAgSWYgeW91IHJlY29yZCB0aGlzIHJlc3VsdCwgeW91IGNhbiBsYXRlcgogICAgICAgICB1c2UgaXQgd2l0aCA8Q09ERT5mc2VlazwvQ09ERT4vPENPREU+ZnNlZWtvPC9DT0RFPiB0byByZXR1cm4gdGhlIGZpbGUgdG8gdGhpcwogICAgICAgICBwb3NpdGlvbi4gIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gPENPREU+ZnRlbGw8L0NPREU+IGFuZCA8Q09ERT5mdGVsbG88L0NPREU+IGlzIHRoYXQKICAgICAgICAgPENPREU+ZnRlbGw8L0NPREU+IHJldHVybnMgPENPREU+bG9uZzwvQ09ERT4gYW5kIDxDT0RFPmZ0ZWxsbzwvQ09ERT4gcmV0dXJucyA8Q09ERT5vZmZfdDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCA8Q09ERT5mdGVsbDwvQ09ERT4vPENPREU+ZnRlbGxvPC9DT0RFPiBzaW1wbHkgdXNlcyBhIGNoYXJhY3RlcgogICAgICAgICBjb3VudCB0byByZXByZXNlbnQgdGhlIGZpbGUgcG9zaXRpb247IHRoaXMgaXMgdGhlIHNhbWUgbnVtYmVyIHRoYXQKICAgICAgICAgd291bGQgYmUgcmVjb3JkZWQgYnkgPENPREU+ZmdldHBvczwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICA8Q09ERT5mdGVsbDwvQ09ERT4vPENPREU+ZnRlbGxvPC9DT0RFPiByZXR1cm4gdGhlIGZpbGUgcG9zaXRpb24sIGlmIHBvc3NpYmxlLiAgSWYgdGhleSBjYW5ub3QgZG8KICAgICAgICAgdGhpcywgdGhleSByZXR1cm4gPENPREU+LTFMPC9DT0RFPi4gIEZhaWx1cmUgb2NjdXJzIG9uIHN0cmVhbXMgdGhhdCBkbyBub3Qgc3VwcG9ydAogICAgICAgICBwb3NpdGlvbmluZzsgdGhlIGdsb2JhbCA8Q09ERT5lcnJubzwvQ09ERT4gaW5kaWNhdGVzIHRoaXMgY29uZGl0aW9uIHdpdGggdGhlCiAgICAgICAgIHZhbHVlIDxDT0RFPkVTUElQRTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgPENPREU+ZnRlbGw8L0NPREU+IGlzIHJlcXVpcmVkIGJ5IHRoZSBBTlNJIEMgc3RhbmRhcmQsIGJ1dCB0aGUgbWVhbmluZyBvZiBpdHMKICAgICAgICAgcmVzdWx0ICh3aGVuIHN1Y2Nlc3NmdWwpIGlzIG5vdCBzcGVjaWZpZWQgYmV5b25kIHJlcXVpcmluZyB0aGF0IGl0IGJlCiAgICAgICAgIGFjY2VwdGFibGUgYXMgYW4gYXJndW1lbnQgdG8gPENPREU+ZnNlZWs8L0NPREU+LiAgSW4gcGFydGljdWxhciwgb3RoZXIKICAgICAgICAgY29uZm9ybWluZyBDIGltcGxlbWVudGF0aW9ucyBtYXkgcmV0dXJuIGEgZGlmZmVyZW50IHJlc3VsdCBmcm9tCiAgICAgICAgIDxDT0RFPmZ0ZWxsPC9DT0RFPiB0aGFuIHdoYXQgPENPREU+ZmdldHBvczwvQ09ERT4gcmVjb3Jkcy4KICAgICAgICAgPGJyPjxicj4gPENPREU+ZnRlbGxvPC9DT0RFPiBpcyBkZWZpbmVkIGJ5IHRoZSBTaW5nbGUgVW5peCBzcGVjaWZpY2F0aW9uLgogICAgICAgICA8YnI+PGJyPiBObyBzdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzIGFyZSByZXF1aXJlZC4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAdzdGRpby5oeHEAfgExdAAcc3RydWN0IF9yZWVudCAqcHRyLCBGSUxFICpmcHQABWxvbmcgdAALX2Z0ZWxsbzY0X3JzcQB+AApwdAbJCiAgICAgICAgT2JqZWN0cyBvZiB0eXBlIDxDT0RFPkZJTEU8L0NPREU+IGNhbiBoYXZlIGEgYGBwb3NpdGlvbicnIHRoYXQgcmVjb3JkcyBob3cgbXVjaAogICAgICAgICBvZiB0aGUgZmlsZSB5b3VyIHByb2dyYW0gaGFzIGFscmVhZHkgcmVhZC4gIE1hbnkgb2YgdGhlIDxDT0RFPnN0ZGlvPC9DT0RFPiBmdW5jdGlvbnMKICAgICAgICAgZGVwZW5kIG9uIHRoaXMgcG9zaXRpb24sIGFuZCBtYW55IGNoYW5nZSBpdCBhcyBhIHNpZGUgZWZmZWN0LgogICAgICAgICA8YnI+PGJyPiBUaGUgcmVzdWx0IG9mIDxDT0RFPmZ0ZWxsbzY0PC9DT0RFPiBpcyB0aGUgY3VycmVudCBwb3NpdGlvbiBmb3IgYSBsYXJnZSBmaWxlCiAgICAgICAgIGlkZW50aWZpZWQgYnkgPFZBUj5mcDwvVkFSPi4gIElmIHlvdSByZWNvcmQgdGhpcyByZXN1bHQsIHlvdSBjYW4gbGF0ZXIKICAgICAgICAgdXNlIGl0IHdpdGggPENPREU+ZnNlZWtvNjQ8L0NPREU+IHRvIHJldHVybiB0aGUgZmlsZSB0byB0aGlzCiAgICAgICAgIHBvc2l0aW9uLiAgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiA8Q09ERT5mdGVsbG88L0NPREU+IGFuZCA8Q09ERT5mdGVsbG82NDwvQ09ERT4gaXMgdGhhdAogICAgICAgICA8Q09ERT5mdGVsbG88L0NPREU+IHJldHVybnMgPENPREU+b2ZmX3Q8L0NPREU+IGFuZCA8Q09ERT5mdGVsbG82NDwvQ09ERT4gaXMgZGVzaWduZWQgdG8gd29yawogICAgICAgICBmb3IgbGFyZ2UgZmlsZXMgKD4yR0IpIGFuZCByZXR1cm5zIDxDT0RFPl9vZmY2NF90PC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIDxDT0RFPmZ0ZWxsbzY0PC9DT0RFPiBzaW1wbHkgdXNlcyBhIGNoYXJhY3RlcgogICAgICAgICBjb3VudCB0byByZXByZXNlbnQgdGhlIGZpbGUgcG9zaXRpb247IHRoaXMgaXMgdGhlIHNhbWUgbnVtYmVyIHRoYXQKICAgICAgICAgd291bGQgYmUgcmVjb3JkZWQgYnkgPENPREU+ZmdldHBvczY0PC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhlIGZ1bmN0aW9uIGV4aXN0cyBvbmx5IGlmIHRoZSBfX0xBUkdFNjRfRklMRVMgZmxhZyBpcyBkZWZpbmVkLgogICAgICAgICBBbiBlcnJvciBvY2N1cnMgaWYgdGhlIDxWQVI+ZnA8L1ZBUj4gd2FzIG5vdCBvcGVuZWQgdmlhIDxDT0RFPmZvcGVuNjQ8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgPENPREU+ZnRlbGxvNjQ8L0NPREU+IHJldHVybnMgdGhlIGZpbGUgcG9zaXRpb24sIGlmIHBvc3NpYmxlLiAgSWYgaXQgY2Fubm90IGRvCiAgICAgICAgIHRoaXMsIGl0IHJldHVybnMgPENPREU+LTE8L0NPREU+LiAgRmFpbHVyZSBvY2N1cnMgb24gc3RyZWFtcyB0aGF0IGRvIG5vdCBzdXBwb3J0CiAgICAgICAgIHBvc2l0aW9uaW5nIG9yIG5vdCBvcGVuZWQgdmlhIDxDT0RFPmZvcGVuNjQ8L0NPREU+OyB0aGUgZ2xvYmFsIDxDT0RFPmVycm5vPC9DT0RFPiBpbmRpY2F0ZXMKICAgICAgICAgdGhpcyBjb25kaXRpb24gd2l0aCB0aGUgdmFsdWUgPENPREU+RVNQSVBFPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICA8Q09ERT5mdGVsbG82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cm8sIGRlZmluZWQgaW4gPENPREU+c3RkaW8uaDwvQ09ERT4uICBZb3UgY2FuIHVzZSA8Q09ERT5nZXRjPC9DT0RFPgogICAgICAgICB0byBnZXQgdGhlIG5leHQgc2luZ2xlIGNoYXJhY3RlciBmcm9tIHRoZSBmaWxlIG9yIHN0cmVhbQogICAgICAgICBpZGVudGlmaWVkIGJ5IDxWQVI+ZnA8L1ZBUj4uICBBcyBhIHNpZGUgZWZmZWN0LCA8Q09ERT5nZXRjPC9DT0RFPiBhZHZhbmNlcyB0aGUgZmlsZSdzCiAgICAgICAgIGN1cnJlbnQgcG9zaXRpb24gaW5kaWNhdG9yLgogICAgICAgICA8YnI+PGJyPiBGb3IgYSBzdWJyb3V0aW5lIHZlcnNpb24gb2YgdGhpcyBtYWNybywgc2VlIDxDT0RFPmZnZXRjPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPl9nZXRjX3I8L0NPREU+IGZ1bmN0aW9uIGlzIHNpbXBseSB0aGUgcmVlbnRyYW50IHZlcnNpb24gb2YgPENPREU+Z2V0YzwvQ09ERT4KICAgICAgICAgd2hpY2ggcGFzc2VzIGFuIGFkZGl0aW9uYWwgcmVlbnRyYW5jeSBzdHJ1Y3R1cmUgcG9pbnRlciBhcmd1bWVudDogPFZBUj5wdHI8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICBUaGUgbmV4dCBjaGFyYWN0ZXIgKHJlYWQgYXMgYW4gPENPREU+dW5zaWduZWQgY2hhcjwvQ09ERT4sIGFuZCBjYXN0IHRvCiAgICAgICAgIDxDT0RFPmludDwvQ09ERT4pLCB1bmxlc3MgdGhlcmUgaXMgbm8gbW9yZSBkYXRhLCBvciB0aGUgaG9zdCBzeXN0ZW0gcmVwb3J0cyBhCiAgICAgICAgIHJlYWQgZXJyb3I7IGluIGVpdGhlciBvZiB0aGVzZSBzaXR1YXRpb25zLCA8Q09ERT5nZXRjPC9DT0RFPiByZXR1cm5zIDxDT0RFPkVPRjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFlvdSBjYW4gZGlzdGluZ3Vpc2ggdGhlIHR3byBzaXR1YXRpb25zIHRoYXQgY2F1c2UgYW4gPENPREU+RU9GPC9DT0RFPiByZXN1bHQgYnkKICAgICAgICAgdXNpbmcgdGhlIDxDT0RFPmZlcnJvcjwvQ09ERT4gYW5kIDxDT0RFPmZlb2Y8L0NPREU+IGZ1bmN0aW9ucy4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICBBTlNJIEMgcmVxdWlyZXMgPENPREU+Z2V0YzwvQ09ERT47IGl0IHN1Z2dlc3RzLCBidXQgZG9lcyBub3QgcmVxdWlyZSwgdGhhdAogICAgICAgICA8Q09ERT5nZXRjPC9DT0RFPiBiZSBpbXBsZW1lbnRlZCBhcyBhIG1hY3JvLiAgVGhlIHN0YW5kYXJkIGV4cGxpY2l0bHkgcGVybWl0cwogICAgICAgICBtYWNybyBpbXBsZW1lbnRhdGlvbnMgb2YgPENPREU+Z2V0YzwvQ09ERT4gdG8gdXNlIHRoZSBhcmd1bWVudCBtb3JlIHRoYW4gb25jZTsKICAgICAgICAgdGhlcmVmb3JlLCBpbiBhIHBvcnRhYmxlIHByb2dyYW0sIHlvdSBzaG91bGQgbm90IHVzZSBhbiBleHByZXNzaW9uCiAgICAgICAgIHdpdGggc2lkZSBlZmZlY3RzIGFzIHRoZSA8Q09ERT5nZXRjPC9DT0RFPiBhcmd1bWVudC4KICAgICAgICAgPGJyPjxicj4gU3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcyByZXF1aXJlZDogPENPREU+Y2xvc2U8L0NPREU+LCA8Q09ERT5mc3RhdDwvQ09ERT4sIDxDT0RFPmlzYXR0eTwvQ09ERT4sCiAgICAgICAgIDxDT0RFPmxzZWVrPC9DT0RFPiwgPENPREU+cmVhZDwvQ09ERT4sIDxDT0RFPnNicms8L0NPREU+LCA8Q09ERT53cml0ZTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAHc3RkaW8uaHhxAH4BTHQAHHN0cnVjdCBfcmVlbnQgKnB0ciwgRklMRSAqZnB0AARpbnQgdAAQX2dldGNfdW5sb2NrZWRfcnNxAH4ACnB0BWoKICAgICAgICA8Q09ERT5nZXRjX3VubG9ja2VkPC9DT0RFPiBpcyBhIG5vbi10aHJlYWQtc2FmZSB2ZXJzaW9uIG9mIDxDT0RFPmdldGM8L0NPREU+IGRlY2xhcmVkIGluCiAgICAgICAgIDxDT0RFPnN0ZGlvLmg8L0NPREU+LiAgPENPREU+Z2V0Y191bmxvY2tlZDwvQ09ERT4gbWF5IG9ubHkgc2FmZWx5IGJlIHVzZWQgd2l0aGluIGEgc2NvcGUKICAgICAgICAgcHJvdGVjdGVkIGJ5IGZsb2NrZmlsZSgpIChvciBmdHJ5bG9ja2ZpbGUoKSkgYW5kIGZ1bmxvY2tmaWxlKCkuICBUaGVzZQogICAgICAgICBmdW5jdGlvbnMgbWF5IHNhZmVseSBiZSB1c2VkIGluIGEgbXVsdGktdGhyZWFkZWQgcHJvZ3JhbSBpZiBhbmQgb25seQogICAgICAgICBpZiB0aGV5IGFyZSBjYWxsZWQgd2hpbGUgdGhlIGludm9raW5nIHRocmVhZCBvd25zIHRoZSAoIEZJTEUgKikKICAgICAgICAgb2JqZWN0LCBhcyBpcyB0aGUgY2FzZSBhZnRlciBhIHN1Y2Nlc3NmdWwgY2FsbCB0byB0aGUgZmxvY2tmaWxlKCkgb3IKICAgICAgICAgZnRyeWxvY2tmaWxlKCkgZnVuY3Rpb25zLiAgSWYgdGhyZWFkcyBhcmUgZGlzYWJsZWQsIHRoZW4KICAgICAgICAgPENPREU+Z2V0Y191bmxvY2tlZDwvQ09ERT4gaXMgZXF1aXZhbGVudCB0byA8Q09ERT5nZXRjPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPl9nZXRjX3VubG9ja2VkX3I8L0NPREU+IGZ1bmN0aW9uIGlzIHNpbXBseSB0aGUgcmVlbnRyYW50IHZlcnNpb24gb2YKICAgICAgICAgPENPREU+Z2V0X3VubG9ja2VkPC9DT0RFPiB3aGljaCBwYXNzZXMgYW4gYWRkaXRpb25hbCByZWVudHJhbmN5IHN0cnVjdHVyZSBwb2ludGVyCiAgICAgICAgIGFyZ3VtZW50OiA8VkFSPnB0cjwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIFNlZSA8Q09ERT5nZXRjPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICBQT1NJWCAxMDAzLjEgcmVxdWlyZXMgPENPREU+Z2V0Y191bmxvY2tlZDwvQ09ERT4uICA8Q09ERT5nZXRjX3VubG9ja2VkPC9DT0RFPiBtYXkgYmUKICAgICAgICAgaW1wbGVtZW50ZWQgYXMgYSBtYWNybywgc28gYXJndW1lbnRzIHNob3VsZCBub3QgaGF2ZSBzaWRlLWVmZmVjdHMuCiAgICAgICAgIDxicj48YnI+IFN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMgcmVxdWlyZWQ6IDxDT0RFPmNsb3NlPC9DT0RFPiwgPENPREU+ZnN0YXQ8L0NPREU+LCA8Q09ERT5pc2F0dHk8L0NPREU+LAogICAgICAgICA8Q09ERT5sc2VlazwvQ09ERT4sIDxDT0RFPnJlYWQ8L0NPREU+LCA8Q09ERT5zYnJrPC9DT0RFPiwgPENPREU+d3JpdGU8L0NPREU+LiAgCiAgICAgICAgICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAHc3RkaW8uaHhxAH4BU3QACEZJTEUgKmZwdAAEaW50IHQACl9nZXRjaGFyX3JzcQB+AApwdAVnCiAgICAgICAgPENPREU+Z2V0Y2hhcjwvQ09ERT4gaXMgYSBtYWNybywgZGVmaW5lZCBpbiA8Q09ERT5zdGRpby5oPC9DT0RFPi4gIFlvdSBjYW4gdXNlIDxDT0RFPmdldGNoYXI8L0NPREU+CiAgICAgICAgIHRvIGdldCB0aGUgbmV4dCBzaW5nbGUgY2hhcmFjdGVyIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0IHN0cmVhbS4KICAgICAgICAgQXMgYSBzaWRlIGVmZmVjdCwgPENPREU+Z2V0Y2hhcjwvQ09ERT4gYWR2YW5jZXMgdGhlIHN0YW5kYXJkIGlucHV0J3MKICAgICAgICAgY3VycmVudCBwb3NpdGlvbiBpbmRpY2F0b3IuCiAgICAgICAgIDxicj48YnI+IFRoZSBhbHRlcm5hdGUgZnVuY3Rpb24gPENPREU+X2dldGNoYXJfcjwvQ09ERT4gaXMgYSByZWVudHJhbnQgdmVyc2lvbi4gIFRoZQogICAgICAgICBleHRyYSBhcmd1bWVudCA8VkFSPnJlZW50PC9WQVI+IGlzIGEgcG9pbnRlciB0byBhIHJlZW50cmFuY3kgc3RydWN0dXJlLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgVGhlIG5leHQgY2hhcmFjdGVyIChyZWFkIGFzIGFuIDxDT0RFPnVuc2lnbmVkIGNoYXI8L0NPREU+LCBhbmQgY2FzdCB0bwogICAgICAgICA8Q09ERT5pbnQ8L0NPREU+KSwgdW5sZXNzIHRoZXJlIGlzIG5vIG1vcmUgZGF0YSwgb3IgdGhlIGhvc3Qgc3lzdGVtIHJlcG9ydHMgYQogICAgICAgICByZWFkIGVycm9yOyBpbiBlaXRoZXIgb2YgdGhlc2Ugc2l0dWF0aW9ucywgPENPREU+Z2V0Y2hhcjwvQ09ERT4gcmV0dXJucyA8Q09ERT5FT0Y8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBZb3UgY2FuIGRpc3Rpbmd1aXNoIHRoZSB0d28gc2l0dWF0aW9ucyB0aGF0IGNhdXNlIGFuIDxDT0RFPkVPRjwvQ09ERT4gcmVzdWx0IGJ5CiAgICAgICAgIHVzaW5nIGA8Q09ERT5mZXJyb3Ioc3RkaW4pPC9DT0RFPicgYW5kIGA8Q09ERT5mZW9mKHN0ZGluKTwvQ09ERT4nLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIEFOU0kgQyByZXF1aXJlcyA8Q09ERT5nZXRjaGFyPC9DT0RFPjsgaXQgc3VnZ2VzdHMsIGJ1dCBkb2VzIG5vdCByZXF1aXJlLCB0aGF0CiAgICAgICAgIDxDT0RFPmdldGNoYXI8L0NPREU+IGJlIGltcGxlbWVudGVkIGFzIGEgbWFjcm8uCiAgICAgICAgIDxicj48YnI+IFN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMgcmVxdWlyZWQ6IDxDT0RFPmNsb3NlPC9DT0RFPiwgPENPREU+ZnN0YXQ8L0NPREU+LCA8Q09ERT5pc2F0dHk8L0NPREU+LAogICAgICAgICA8Q09ERT5sc2VlazwvQ09ERT4sIDxDT0RFPnJlYWQ8L0NPREU+LCA8Q09ERT5zYnJrPC9DT0RFPiwgPENPREU+d3JpdGU8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+AVp0ABRzdHJ1Y3QgX3JlZW50ICpyZWVudHQABGludCB0ABNfZ2V0Y2hhcl91bmxvY2tlZF9yc3EAfgAKcHQFXQogICAgICAgIDxDT0RFPmdldGNoYXJfdW5sb2NrZWQ8L0NPREU+IGlzIGEgbm9uLXRocmVhZC1zYWZlIHZlcnNpb24gb2YgPENPREU+Z2V0Y2hhcjwvQ09ERT4KICAgICAgICAgZGVjbGFyZWQgaW4gPENPREU+c3RkaW8uaDwvQ09ERT4uICA8Q09ERT5nZXRjaGFyX3VubG9ja2VkPC9DT0RFPiBtYXkgb25seSBzYWZlbHkgYmUgdXNlZAogICAgICAgICB3aXRoaW4gYSBzY29wZSBwcm90ZWN0ZWQgYnkgZmxvY2tmaWxlKCkgKG9yIGZ0cnlsb2NrZmlsZSgpKSBhbmQKICAgICAgICAgZnVubG9ja2ZpbGUoKS4gIFRoZXNlIGZ1bmN0aW9ucyBtYXkgc2FmZWx5IGJlIHVzZWQgaW4gYSBtdWx0aS10aHJlYWRlZAogICAgICAgICBwcm9ncmFtIGlmIGFuZCBvbmx5IGlmIHRoZXkgYXJlIGNhbGxlZCB3aGlsZSB0aGUgaW52b2tpbmcgdGhyZWFkIG93bnMKICAgICAgICAgdGhlICggRklMRSAqKSBvYmplY3QsIGFzIGlzIHRoZSBjYXNlIGFmdGVyIGEgc3VjY2Vzc2Z1bCBjYWxsIHRvIHRoZQogICAgICAgICBmbG9ja2ZpbGUoKSBvciBmdHJ5bG9ja2ZpbGUoKSBmdW5jdGlvbnMuICBJZiB0aHJlYWRzIGFyZSBkaXNhYmxlZCwKICAgICAgICAgdGhlbiA8Q09ERT5nZXRjaGFyX3VubG9ja2VkPC9DT0RFPiBpcyBlcXVpdmFsZW50IHRvIDxDT0RFPmdldGNoYXI8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBUaGUgPENPREU+X2dldGNoYXJfdW5sb2NrZWRfcjwvQ09ERT4gZnVuY3Rpb24gaXMgc2ltcGx5IHRoZSByZWVudHJhbnQgdmVyc2lvbiBvZgogICAgICAgICA8Q09ERT5nZXRjaGFyX3VubG9ja2VkPC9DT0RFPiB3aGljaCBwYXNzZXMgYW4gYWRkdGlvbmFsIHJlZW50cmFuY3kgc3RydWN0dXJlIHBvaW50ZXIKICAgICAgICAgYXJndW1lbnQ6IDxWQVI+cHRyPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgU2VlIDxDT0RFPmdldGNoYXI8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIFBPU0lYIDEwMDMuMSByZXF1aXJlcyA8Q09ERT5nZXRjaGFyX3VubG9ja2VkPC9DT0RFPi4gIDxDT0RFPmdldGNoYXJfdW5sb2NrZWQ8L0NPREU+IG1heQogICAgICAgICBiZSBpbXBsZW1lbnRlZCBhcyBhIG1hY3JvLgogICAgICAgICA8YnI+PGJyPiBTdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzIHJlcXVpcmVkOiA8Q09ERT5jbG9zZTwvQ09ERT4sIDxDT0RFPmZzdGF0PC9DT0RFPiwgPENPREU+aXNhdHR5PC9DT0RFPiwKICAgICAgICAgPENPREU+bHNlZWs8L0NPREU+LCA8Q09ERT5yZWFkPC9DT0RFPiwgPENPREU+c2JyazwvQ09ERT4sIDxDT0RFPndyaXRlPC9DT0RFPi4gIAogICAgICAgICAqCiAgICAgICAgc3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+AWF0ABJzdHJ1Y3QgX3JlZW50ICpwdHJ0AARpbnQgdAAHX2dldHNfcnNxAH4ACnB0BVcKICAgICAgICBSZWFkcyBjaGFyYWN0ZXJzIGZyb20gc3RhbmRhcmQgaW5wdXQgdW50aWwgYSBuZXdsaW5lIGlzIGZvdW5kLgogICAgICAgICBUaGUgY2hhcmFjdGVycyB1cCB0byB0aGUgbmV3bGluZSBhcmUgc3RvcmVkIGluIDxWQVI+YnVmPC9WQVI+LiBUaGUKICAgICAgICAgbmV3bGluZSBpcyBkaXNjYXJkZWQsIGFuZCB0aGUgYnVmZmVyIGlzIHRlcm1pbmF0ZWQgd2l0aCBhIDAuCiAgICAgICAgIDxicj48YnI+IFRoaXMgaXMgYSA8RU0+ZGFuZ2Vyb3VzPC9FTT4gZnVuY3Rpb24sIGFzIGl0IGhhcyBubyB3YXkgb2YgY2hlY2tpbmcKICAgICAgICAgdGhlIGFtb3VudCBvZiBzcGFjZSBhdmFpbGFibGUgaW4gPFZBUj5idWY8L1ZBUj4uIE9uZSBvZiB0aGUgYXR0YWNrcwogICAgICAgICB1c2VkIGJ5IHRoZSBJbnRlcm5ldCBXb3JtIG9mIDE5ODggdXNlZCB0aGlzIHRvIG92ZXJydW4gYQogICAgICAgICBidWZmZXIgYWxsb2NhdGVkIG9uIHRoZSBzdGFjayBvZiB0aGUgZmluZ2VyIGRhZW1vbiBhbmQKICAgICAgICAgb3ZlcndyaXRlIHRoZSByZXR1cm4gYWRkcmVzcywgY2F1c2luZyB0aGUgZGFlbW9uIHRvIGV4ZWN1dGUKICAgICAgICAgY29kZSBkb3dubG9hZGVkIGludG8gaXQgb3ZlciB0aGUgY29ubmVjdGlvbi4KICAgICAgICAgPGJyPjxicj4gVGhlIGFsdGVybmF0ZSBmdW5jdGlvbiA8Q09ERT5fZ2V0c19yPC9DT0RFPiBpcyBhIHJlZW50cmFudCB2ZXJzaW9uLiAgVGhlIGV4dHJhCiAgICAgICAgIGFyZ3VtZW50IDxWQVI+cmVlbnQ8L1ZBUj4gaXMgYSBwb2ludGVyIHRvIGEgcmVlbnRyYW5jeSBzdHJ1Y3R1cmUuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICA8Q09ERT5nZXRzPC9DT0RFPiByZXR1cm5zIHRoZSBidWZmZXIgcGFzc2VkIHRvIGl0LCB3aXRoIHRoZSBkYXRhIGZpbGxlZAogICAgICAgICBpbi4gSWYgZW5kIG9mIGZpbGUgb2NjdXJzIHdpdGggc29tZSBkYXRhIGFscmVhZHkgYWNjdW11bGF0ZWQsCiAgICAgICAgIHRoZSBkYXRhIGlzIHJldHVybmVkIHdpdGggbm8gb3RoZXIgaW5kaWNhdGlvbi4gSWYgZW5kIG9mIGZpbGUKICAgICAgICAgb2NjdXJzIHdpdGggbm8gZGF0YSBpbiB0aGUgYnVmZmVyLCBOVUxMIGlzIHJldHVybmVkLgogICAgICAgICA8YnI+PGJyPiBTdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzIHJlcXVpcmVkOiA8Q09ERT5jbG9zZTwvQ09ERT4sIDxDT0RFPmZzdGF0PC9DT0RFPiwgPENPREU+aXNhdHR5PC9DT0RFPiwKICAgICAgICAgPENPREU+bHNlZWs8L0NPREU+LCA8Q09ERT5yZWFkPC9DT0RFPiwgPENPREU+c2JyazwvQ09ERT4sIDxDT0RFPndyaXRlPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAdzdGRpby5oeHEAfgFodAAfc3RydWN0IF9yZWVudCAqcmVlbnQsIGNoYXIgKmJ1ZnQABmNoYXIgKnQAC19pbXB1cmVfcHRyc3EAfgAKcHQBqwogICAgICAgIDxicj48YnI+IDxDT0RFPmZmczwvQ09ERT4gcmV0dXJucyB0aGUgZmlyc3QgYml0IHNldCBpbiBhIHdvcmQuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICA8Q09ERT5mZnM8L0NPREU+IHJldHVybnMgMCBpZiA8VkFSPmM8L1ZBUj4gaXMgMCwgMSBpZiA8VkFSPmM8L1ZBUj4gaXMgb2RkLCAyIGlmIDxWQVI+YzwvVkFSPiBpcyBhIG11bHRpcGxlIG9mCiAgICAgICAgIDIsIGV0Yy4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICA8Q09ERT5mZnM8L0NPREU+IGlzIG5vdCBBTlNJIEMuCiAgICAgICAgIDxicj48YnI+IE5vIHN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMgYXJlIHJlcXVpcmVkLiAgCiAgICAgICAgICoKICAgICAgICBzcQB+AA8AAAAAdwQAAAAKeHEAfgFvcHQABG51bGx0AApfaXByaW50Zl9yc3EAfgAKcHEAfgBCc3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+AXR0ACtzdHJ1Y3QgX3JlZW50ICpwdHIsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4udAAEaW50IHQACV9pc2NhbmZfcnNxAH4ACnBxAH4AxXNxAH4ADwAAAAF3BAAAAAp0AAdzdGRpby5oeHEAfgF6dAArc3RydWN0IF9yZWVudCAqcHRyLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLnQABGludCB0AA1fbG9jYWxlY29udl9yc3EAfgAKcHQKGwogICAgICAgIDxDT0RFPnNldGxvY2FsZTwvQ09ERT4gaXMgdGhlIGZhY2lsaXR5IGRlZmluZWQgYnkgQU5TSSBDIHRvIGNvbmRpdGlvbiB0aGUKICAgICAgICAgZXhlY3V0aW9uIGVudmlyb25tZW50IGZvciBpbnRlcm5hdGlvbmFsIGNvbGxhdGluZyBhbmQgZm9ybWF0dGluZwogICAgICAgICBpbmZvcm1hdGlvbjsgPENPREU+bG9jYWxlY29udjwvQ09ERT4gcmVwb3J0cyBvbiB0aGUgc2V0dGluZ3Mgb2YgdGhlIGN1cnJlbnQKICAgICAgICAgbG9jYWxlLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGlzIGEgbWluaW1hbCBpbXBsZW1lbnRhdGlvbiwgc3VwcG9ydGluZyBvbmx5IHRoZSByZXF1aXJlZCA8Q09ERT4iQyI8L0NPREU+CiAgICAgICAgIHZhbHVlIGZvciA8VkFSPmxvY2FsZTwvVkFSPjsgc3RyaW5ncyByZXByZXNlbnRpbmcgb3RoZXIgbG9jYWxlcyBhcmUgbm90CiAgICAgICAgIGhvbm9yZWQgdW5sZXNzIF9NQl9DQVBBQkxFIGlzIGRlZmluZWQgaW4gd2hpY2ggY2FzZSB0aHJlZSBuZXcKICAgICAgICAgZXh0ZW5zaW9ucyBhcmUgYWxsb3dlZCBmb3IgTENfQ1RZUEUgb3IgTENfTUVTU0FHRVMgb25seTogPENPREU+IkMtSklTIjwvQ09ERT4sIAogICAgICAgICA8Q09ERT4iQy1FVUNKUCI8L0NPREU+LCA8Q09ERT4iQy1TSklTIjwvQ09ERT4sIG9yIDxDT0RFPiJDLUlTTy04ODU5LTEiPC9DT0RFPi4gICg8Q09ERT4iIjwvQ09ERT4gaXMgCiAgICAgICAgIGFsc28gYWNjZXB0ZWQ7IGl0IHJlcHJlc2VudHMgdGhlIGRlZmF1bHQgbG9jYWxlCiAgICAgICAgIGZvciBhbiBpbXBsZW1lbnRhdGlvbiwgaGVyZSBlcXVpdmFsZW50IHRvIDxDT0RFPiJDIjwvQ09ERT4uKQogICAgICAgICA8YnI+PGJyPiBJZiB5b3UgdXNlIDxDT0RFPk5VTEw8L0NPREU+IGFzIHRoZSA8VkFSPmxvY2FsZTwvVkFSPiBhcmd1bWVudCwgPENPREU+c2V0bG9jYWxlPC9DT0RFPiByZXR1cm5zCiAgICAgICAgIGEgcG9pbnRlciB0byB0aGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBsb2NhbGUgKGFsd2F5cwogICAgICAgICA8Q09ERT4iQyI8L0NPREU+IGluIHRoaXMgaW1wbGVtZW50YXRpb24pLiAgVGhlIGFjY2VwdGFibGUgdmFsdWVzIGZvcgogICAgICAgICA8VkFSPmNhdGVnb3J5PC9WQVI+IGFyZSBkZWZpbmVkIGluIGA8Q09ERT5sb2NhbGUuaDwvQ09ERT4nIGFzIG1hY3JvcyBiZWdpbm5pbmcgd2l0aAogICAgICAgICA8Q09ERT4iTENfIjwvQ09ERT4sIGJ1dCB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGNoZWNrIHRoZSB2YWx1ZXMgeW91IHBhc3MKICAgICAgICAgaW4gdGhlIDxWQVI+Y2F0ZWdvcnk8L1ZBUj4gYXJndW1lbnQuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPmxvY2FsZWNvbnY8L0NPREU+IHJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RydWN0dXJlIChhbHNvIGRlZmluZWQgaW4KICAgICAgICAgYDxDT0RFPmxvY2FsZS5oPC9DT0RFPicpIGRlc2NyaWJpbmcgdGhlIGxvY2FsZS1zcGVjaWZpYyBjb252ZW50aW9ucyBjdXJyZW50bHkKICAgICAgICAgaW4gZWZmZWN0LiAgCiAgICAgICAgIDxicj48YnI+IDxDT0RFPl9sb2NhbGVjb252X3I8L0NPREU+IGFuZCA8Q09ERT5fc2V0bG9jYWxlX3I8L0NPREU+IGFyZSByZWVudHJhbnQgdmVyc2lvbnMgb2YKICAgICAgICAgPENPREU+bG9jYWxlY29udjwvQ09ERT4gYW5kIDxDT0RFPnNldGxvY2FsZTwvQ09ERT4gcmVzcGVjdGl2ZWx5LiAgVGhlIGV4dHJhIGFyZ3VtZW50CiAgICAgICAgIDxWQVI+cmVlbnQ8L1ZBUj4gaXMgYSBwb2ludGVyIHRvIGEgcmVlbnRyYW5jeSBzdHJ1Y3R1cmUuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICA8Q09ERT5zZXRsb2NhbGU8L0NPREU+IHJldHVybnMgZWl0aGVyIGEgcG9pbnRlciB0byBhIHN0cmluZyBuYW1pbmcgdGhlIGxvY2FsZQogICAgICAgICBjdXJyZW50bHkgaW4gZWZmZWN0IChhbHdheXMgPENPREU+IkMiPC9DT0RFPiBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbiwgb3IsIGlmCiAgICAgICAgIHRoZSBsb2NhbGUgcmVxdWVzdCBjYW5ub3QgYmUgaG9ub3JlZCwgPENPREU+TlVMTDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxDT0RFPmxvY2FsZWNvbnY8L0NPREU+IHJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RydWN0dXJlIG9mIHR5cGUgPENPREU+bGNvbnY8L0NPREU+LAogICAgICAgICB3aGljaCBkZXNjcmliZXMgdGhlIGZvcm1hdHRpbmcgYW5kIGNvbGxhdGluZyBjb252ZW50aW9ucyBpbiBlZmZlY3QgKGluCiAgICAgICAgIHRoaXMgaW1wbGVtZW50YXRpb24sIGFsd2F5cyB0aG9zZSBvZiB0aGUgQyBsb2NhbGUpLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIEFOU0kgQyByZXF1aXJlcyA8Q09ERT5zZXRsb2NhbGU8L0NPREU+LCBidXQgdGhlIG9ubHkgbG9jYWxlIHJlcXVpcmVkIGFjcm9zcyBhbGwKICAgICAgICAgaW1wbGVtZW50YXRpb25zIGlzIHRoZSBDIGxvY2FsZS4KICAgICAgICAgPGJyPjxicj4gTm8gc3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcyBhcmUgcmVxdWlyZWQuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAIbG9jYWxlLmh4cQB+AYB0AAt2b2lkICpyZWVudHQAB2xjb252ICp0AAtfbWFsbGluZm9fcnNxAH4ACnB0CF8KICAgICAgICA8Q09ERT5tYWxsaW5mbzwvQ09ERT4gcmV0dXJucyBhIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mCiAgICAgICAgIG1lbW9yeSBhbGxvY2F0aW9uLiAgVGhlIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluIG1hbGxvYy5oLiAgVGhlCiAgICAgICAgIGZvbGxvd2luZyBmaWVsZHMgYXJlIGRlZmluZWQ6IDxDT0RFPmFyZW5hPC9DT0RFPiBpcyB0aGUgdG90YWwgYW1vdW50IG9mIHNwYWNlCiAgICAgICAgIGluIHRoZSBoZWFwOyA8Q09ERT5vcmRibGtzPC9DT0RFPiBpcyB0aGUgbnVtYmVyIG9mIGNodW5rcyB3aGljaCBhcmUgbm90IGluIHVzZTsKICAgICAgICAgPENPREU+dW9yZGJsa3M8L0NPREU+IGlzIHRoZSB0b3RhbCBhbW91bnQgb2Ygc3BhY2UgYWxsb2NhdGVkIGJ5IDxDT0RFPm1hbGxvYzwvQ09ERT47CiAgICAgICAgIDxDT0RFPmZvcmRibGtzPC9DT0RFPiBpcyB0aGUgdG90YWwgYW1vdW50IG9mIHNwYWNlIG5vdCBpbiB1c2U7IDxDT0RFPmtlZXBjb3N0PC9DT0RFPiBpcwogICAgICAgICB0aGUgc2l6ZSBvZiB0aGUgdG9wIG1vc3QgbWVtb3J5IGJsb2NrLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5tYWxsb2Nfc3RhdHM8L0NPREU+IHByaW50IHNvbWUgc3RhdGlzdGljcyBhYm91dCBtZW1vcnkgYWxsb2NhdGlvbiBvbgogICAgICAgICBzdGFuZGFyZCBlcnJvci4KICAgICAgICAgPGJyPjxicj4gPENPREU+bWFsbG9wdDwvQ09ERT4gdGFrZXMgYSBwYXJhbWV0ZXIgYW5kIGEgdmFsdWUuICBUaGUgcGFyYW1ldGVycyBhcmUgZGVmaW5lZAogICAgICAgICBpbiBtYWxsb2MuaCwgYW5kIG1heSBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzogPENPREU+TV9UUklNX1RIUkVTSE9MRDwvQ09ERT4KICAgICAgICAgc2V0cyB0aGUgbWF4aW11bSBhbW91bnQgb2YgdW51c2VkIHNwYWNlIGluIHRoZSB0b3AgbW9zdCBibG9jayBiZWZvcmUKICAgICAgICAgcmVsZWFzaW5nIGl0IGJhY2sgdG8gdGhlIHN5c3RlbSBpbiA8Q09ERT5mcmVlPC9DT0RFPiAodGhlIHNwYWNlIGlzIHJlbGVhc2VkIGJ5CiAgICAgICAgIGNhbGxpbmcgPENPREU+X3NicmtfcjwvQ09ERT4gd2l0aCBhIG5lZ2F0aXZlIGFyZ3VtZW50KTsgPENPREU+TV9UT1BfUEFEPC9DT0RFPiBpcyB0aGUKICAgICAgICAgYW1vdW50IG9mIHBhZGRpbmcgdG8gYWxsb2NhdGUgd2hlbmV2ZXIgPENPREU+X3NicmtfcjwvQ09ERT4gaXMgY2FsbGVkIHRvCiAgICAgICAgIGFsbG9jYXRlIG1vcmUgc3BhY2UuCiAgICAgICAgIDxicj48YnI+IFRoZSBhbHRlcm5hdGUgZnVuY3Rpb25zIDxDT0RFPl9tYWxsaW5mb19yPC9DT0RFPiwgPENPREU+X21hbGxvY19zdGF0c19yPC9DT0RFPiwgYW5kCiAgICAgICAgIDxDT0RFPl9tYWxsb3B0X3I8L0NPREU+IGFyZSByZWVudHJhbnQgdmVyc2lvbnMuICBUaGUgZXh0cmEgYXJndW1lbnQgPFZBUj5yZWVudDwvVkFSPgogICAgICAgICBpcyBhIHBvaW50ZXIgdG8gYSByZWVudHJhbmN5IHN0cnVjdHVyZS4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIDxDT0RFPm1hbGxpbmZvPC9DT0RFPiByZXR1cm5zIGEgbWFsbGluZm8gc3RydWN0dXJlLiAgVGhlIHN0cnVjdHVyZSBpcyBkZWZpbmVkCiAgICAgICAgIGluIG1hbGxvYy5oLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5tYWxsb2Nfc3RhdHM8L0NPREU+IGRvZXMgbm90IHJldHVybiBhIHJlc3VsdC4KICAgICAgICAgPGJyPjxicj4gPENPREU+bWFsbG9wdDwvQ09ERT4gcmV0dXJucyB6ZXJvIGlmIHRoZSBwYXJhbWV0ZXIgY291bGQgbm90IGJlIHNldCwgb3IKICAgICAgICAgbm9uLXplcm8gaWYgaXQgY291bGQgYmUgc2V0LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIDxDT0RFPm1hbGxpbmZvPC9DT0RFPiBhbmQgPENPREU+bWFsbG9wdDwvQ09ERT4gYXJlIHByb3ZpZGVkIGJ5IFNWUjQsIGJ1dCA8Q09ERT5tYWxsb3B0PC9DT0RFPgogICAgICAgICB0YWtlcyBkaWZmZXJlbnQgcGFyYW1ldGVycyBvbiBkaWZmZXJlbnQgc3lzdGVtcy4gIDxDT0RFPm1hbGxvY19zdGF0czwvQ09ERT4gaXMKICAgICAgICAgbm90IHBvcnRhYmxlLgogICAgICAgICA8YnI+PGJyPiA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAXcEAAAACnQACG1hbGxvYy5oeHEAfgGHdAALdm9pZCAqcmVlbnR0ABBzdHJ1Y3QgbWFsbGluZm8gdAAJX21hbGxvY19yc3EAfgAKcHEAfgD1c3EAfgAPAAAAAXcEAAAACnQACHN0ZGxpYi5oeHEAfgGOdAAadm9pZCAqcmVlbnQsIHNpemVfdCBuYnl0ZXN0AAZ2b2lkICp0AA9fbWFsbG9jX3N0YXRzX3JzcQB+AApwcQB+AYlzcQB+AA8AAAABdwQAAAAKdAAIbWFsbG9jLmh4cQB+AZR0AAt2b2lkICpyZWVudHQABXZvaWQgdAAVX21hbGxvY191c2FibGVfc2l6ZV9yc3EAfgAKcHEAfgD1c3EAfgAPAAAAAXcEAAAACnQACHN0ZGxpYi5oeHEAfgGadAAXdm9pZCAqcmVlbnQsIHZvaWQgKmFwdHJ0AAdzaXplX3QgdAAKX21hbGxvcHRfcnNxAH4ACnBxAH4BiXNxAH4ADwAAAAF3BAAAAAp0AAhtYWxsb2MuaHhxAH4BoHQAIXZvaWQgKnJlZW50LCBpbnQgcGFyYW1ldGVyLCB2YWx1ZXQABGludCB0AAtfbWVtYWxpZ25fcnNxAH4ACnBxAH4A9XNxAH4ADwAAAAF3BAAAAAp0AAhzdGRsaWIuaHhxAH4BpnQAJ3ZvaWQgKnJlZW50LHNpemVfdCBhbGlnbiwgc2l6ZV90IG5ieXRlc3QABnZvaWQgKnQACl9ta3N0ZW1wX3JzcQB+AApwdAeBCiAgICAgICAgPENPREU+bWt0ZW1wPC9DT0RFPiBhbmQgPENPREU+bWtzdGVtcDwvQ09ERT4gYXR0ZW1wdCB0byBnZW5lcmF0ZSBhIGZpbGUgbmFtZSB0aGF0IGlzIG5vdAogICAgICAgICB5ZXQgaW4gdXNlIGZvciBhbnkgZXhpc3RpbmcgZmlsZS4gIDxDT0RFPm1rc3RlbXA8L0NPREU+IGNyZWF0ZXMgdGhlIGZpbGUgYW5kCiAgICAgICAgIG9wZW5zIGl0IGZvciByZWFkaW5nIGFuZCB3cml0aW5nOyA8Q09ERT5ta3RlbXA8L0NPREU+IHNpbXBseSBnZW5lcmF0ZXMgdGhlIGZpbGUgbmFtZS4KICAgICAgICAgPGJyPjxicj4gWW91IHN1cHBseSBhIHNpbXBsZSBwYXR0ZXJuIGZvciB0aGUgZ2VuZXJhdGVkIGZpbGUgbmFtZSwgYXMgdGhlIHN0cmluZwogICAgICAgICBhdCA8VkFSPnBhdGg8L1ZBUj4uICBUaGUgcGF0dGVybiBzaG91bGQgYmUgYSB2YWxpZCBmaWxlbmFtZSAoaW5jbHVkaW5nIHBhdGgKICAgICAgICAgaW5mb3JtYXRpb24gaWYgeW91IHdpc2gpIGVuZGluZyB3aXRoIHNvbWUgbnVtYmVyIG9mIGA8Q09ERT5YPC9DT0RFPicKICAgICAgICAgY2hhcmFjdGVycy4gIFRoZSBnZW5lcmF0ZWQgZmlsZW5hbWUgd2lsbCBtYXRjaCB0aGUgbGVhZGluZyBwYXJ0IG9mIHRoZQogICAgICAgICBuYW1lIHlvdSBzdXBwbHksIHdpdGggdGhlIHRyYWlsaW5nIGA8Q09ERT5YPC9DT0RFPicgY2hhcmFjdGVycyByZXBsYWNlZCBieSBzb21lCiAgICAgICAgIGNvbWJpbmF0aW9uIG9mIGRpZ2l0cyBhbmQgbGV0dGVycy4KICAgICAgICAgPGJyPjxicj4gVGhlIGFsdGVybmF0ZSBmdW5jdGlvbnMgPENPREU+X21rdGVtcF9yPC9DT0RFPiBhbmQgPENPREU+X21rc3RlbXBfcjwvQ09ERT4gYXJlIHJlZW50cmFudAogICAgICAgICB2ZXJzaW9ucy4gIFRoZSBleHRyYSBhcmd1bWVudCA8VkFSPnJlZW50PC9WQVI+IGlzIGEgcG9pbnRlciB0byBhIHJlZW50cmFuY3kKICAgICAgICAgc3RydWN0dXJlLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgPENPREU+bWt0ZW1wPC9DT0RFPiByZXR1cm5zIHRoZSBwb2ludGVyIDxWQVI+cGF0aDwvVkFSPiB0byB0aGUgbW9kaWZpZWQgc3RyaW5nCiAgICAgICAgIHJlcHJlc2VudGluZyBhbiB1bnVzZWQgZmlsZW5hbWUsIHVubGVzcyBpdCBjb3VsZCBub3QgZ2VuZXJhdGUgb25lLCBvcgogICAgICAgICB0aGUgcGF0dGVybiB5b3UgcHJvdmlkZWQgaXMgbm90IHN1aXRhYmxlIGZvciBhIGZpbGVuYW1lOyBpbiB0aGF0IGNhc2UsCiAgICAgICAgIGl0IHJldHVybnMgPENPREU+TlVMTDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxDT0RFPm1rc3RlbXA8L0NPREU+IHJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3IgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgZmlsZSwKICAgICAgICAgdW5sZXNzIGl0IGNvdWxkIG5vdCBnZW5lcmF0ZSBhbiB1bnVzZWQgZmlsZW5hbWUsIG9yIHRoZSBwYXR0ZXJuIHlvdQogICAgICAgICBwcm92aWRlZCBpcyBub3Qgc3VpdGFibGUgZm9yIGEgZmlsZW5hbWU7IGluIHRoYXQgY2FzZSwgaXQgcmV0dXJucwogICAgICAgICA8Q09ERT4t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cmFudCB2ZXJzaW9uIG9mCiAgICAgICAgIDxDT0RFPnB1dGM8L0NPREU+IHRoYXQgdGFrZXMgYW4gYWRkaXRpb25hbCByZWVudHJhbnQgc3RydWN0dXJlIGFyZ3VtZW50OiA8VkFSPnB0cjwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIElmIHN1Y2Nlc3NmdWwsIDxDT0RFPnB1dGM8L0NPREU+IHJldHVybnMgaXRzIGFyZ3VtZW50IDxWQVI+Y2g8L1ZBUj4uICBJZiBhbiBlcnJvcgogICAgICAgICBpbnRlcnZlbmVzLCB0aGUgcmVzdWx0IGlzIDxDT0RFPkVPRjwvQ09ERT4uICBZb3UgY2FuIHVzZSBgPENPREU+ZmVycm9yKDxWQVI+ZnA8L1ZBUj4pPC9DT0RFPicgdG8KICAgICAgICAgcXVlcnkgZm9yIGVycm9ycy4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICBBTlNJIEMgcmVxdWlyZXMgPENPREU+cHV0YzwvQ09ERT47IGl0IHN1Z2dlc3RzLCBidXQgZG9lcyBub3QgcmVxdWlyZSwgdGhhdAogICAgICAgICA8Q09ERT5wdXRjPC9DT0RFPiBiZSBpbXBsZW1lbnRlZCBhcyBhIG1hY3JvLiAgVGhlIHN0YW5kYXJkIGV4cGxpY2l0bHkgcGVybWl0cwogICAgICAgICBtYWNybyBpbXBsZW1lbnRhdGlvbnMgb2YgPENPREU+cHV0YzwvQ09ERT4gdG8gdXNlIHRoZSA8VkFSPmZwPC9WQVI+IGFyZ3VtZW50IG1vcmUgdGhhbiBvbmNlOwogICAgICAgICB0aGVyZWZvcmUsIGluIGEgcG9ydGFibGUgcHJvZ3JhbSwgeW91IHNob3VsZCBub3QgdXNlIGFuIGV4cHJlc3Npb24KICAgICAgICAgd2l0aCBzaWRlIGVmZmVjdHMgYXMgdGhpcyBhcmd1bWVudC4KICAgICAgICAgPGJyPjxicj4gU3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcyByZXF1aXJlZDogPENPREU+Y2xvc2U8L0NPREU+LCA8Q09ERT5mc3RhdDwvQ09ERT4sIDxDT0RFPmlzYXR0eTwvQ09ERT4sCiAgICAgICAgIDxDT0RFPmxzZWVrPC9DT0RFPiwgPENPREU+cmVhZDwvQ09ERT4sIDxDT0RFPnNicms8L0NPREU+LCA8Q09ERT53cml0ZTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAHc3RkaW8uaHhxAH4BxnQAJHN0cnVjdCBfcmVlbnQgKnB0ciwgaW50IGNoLCBGSUxFICpmcHQABGludCB0ABBfcHV0Y191bmxvY2tlZF9yc3EAfgAKcHQFbwogICAgICAgIDxDT0RFPnB1dGNfdW5sb2NrZWQ8L0NPREU+IGlzIGEgbm9uLXRocmVhZC1zYWZlIHZlcnNpb24gb2YgPENPREU+cHV0YzwvQ09ERT4gZGVjbGFyZWQgaW4KICAgICAgICAgPENPREU+c3RkaW8uaDwvQ09ERT4uICA8Q09ERT5wdXRjX3VubG9ja2VkPC9DT0RFPiBtYXkgb25seSBzYWZlbHkgYmUgdXNlZCB3aXRoaW4gYSBzY29wZQogICAgICAgICBwcm90ZWN0ZWQgYnkgZmxvY2tmaWxlKCkgKG9yIGZ0cnlsb2NrZmlsZSgpKSBhbmQgZnVubG9ja2ZpbGUoKS4gIFRoZXNlCiAgICAgICAgIGZ1bmN0aW9ucyBtYXkgc2FmZWx5IGJlIHVzZWQgaW4gYSBtdWx0aS10aHJlYWRlZCBwcm9ncmFtIGlmIGFuZCBvbmx5CiAgICAgICAgIGlmIHRoZXkgYXJlIGNhbGxlZCB3aGlsZSB0aGUgaW52b2tpbmcgdGhyZWFkIG93bnMgdGhlICggRklMRSAqKQogICAgICAgICBvYmplY3QsIGFzIGlzIHRoZSBjYXNlIGFmdGVyIGEgc3VjY2Vzc2Z1bCBjYWxsIHRvIHRoZSBmbG9ja2ZpbGUoKSBvcgogICAgICAgICBmdHJ5bG9ja2ZpbGUoKSBmdW5jdGlvbnMuICBJZiB0aHJlYWRzIGFyZSBkaXNhYmxlZCwgdGhlbgogICAgICAgICA8Q09ERT5wdXRjX3VubG9ja2VkPC9DT0RFPiBpcyBlcXVpdmFsZW50IHRvIDxDT0RFPnB1dGM8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBUaGUgZnVuY3Rpb24gPENPREU+X3B1dGNfdW5sb2NrZWRfcjwvQ09ERT4gaXMgc2ltcGx5IHRoZSByZWVudHJhbnQgdmVyc2lvbiBvZgogICAgICAgICA8Q09ERT5wdXRjX3VubG9ja2VkPC9DT0RFPiB0aGF0IHRha2VzIGFuIGFkZGl0aW9uYWwgcmVlbnRyYW50IHN0cnVjdHVyZSBwb2ludGVyCiAgICAgICAgIGFyZ3VtZW50OiA8VkFSPnB0cjwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIFNlZSA8Q09ERT5wdXRjPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICBQT1NJWCAxMDAzLjEgcmVxdWlyZXMgPENPREU+cHV0Y191bmxvY2tlZDwvQ09ERT4uICA8Q09ERT5wdXRjX3VubG9ja2VkPC9DT0RFPiBtYXkgYmUKICAgICAgICAgaW1wbGVtZW50ZWQgYXMgYSBtYWNybywgc28gYXJndW1lbnRzIHNob3VsZCBub3QgaGF2ZSBzaWRlLWVmZmVjdHMuCiAgICAgICAgIDxicj48YnI+IFN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMgcmVxdWlyZWQ6IDxDT0RFPmNsb3NlPC9DT0RFPiwgPENPREU+ZnN0YXQ8L0NPREU+LCA8Q09ERT5pc2F0dHk8L0NPREU+LAogICAgICAgICA8Q09ERT5sc2VlazwvQ09ERT4sIDxDT0RFPnJlYWQ8L0NPREU+LCA8Q09ERT5zYnJrPC9DT0RFPiwgPENPREU+d3JpdGU8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+Ac10ACRzdHJ1Y3QgX3JlZW50ICpwdHIsIGludCBjaCwgRklMRSAqZnB0AARpbnQgdAAKX3B1dGNoYXJfcnNxAH4ACnB0BFUKICAgICAgICA8Q09ERT5wdXRjaGFyPC9DT0RFPiBpcyBhIG1hY3JvLCBkZWZpbmVkIGluIDxDT0RFPnN0ZGlvLmg8L0NPREU+LiAgPENPREU+cHV0Y2hhcjwvQ09ERT4KICAgICAgICAgd3JpdGVzIGl0cyBhcmd1bWVudCB0byB0aGUgc3RhbmRhcmQgb3V0cHV0IHN0cmVhbSwKICAgICAgICAgYWZ0ZXIgY29udmVydGluZyBpdCBmcm9tIGFuIDxDT0RFPmludDwvQ09ERT4gdG8gYW4gPENPREU+dW5zaWduZWQgY2hhcjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFRoZSBhbHRlcm5hdGUgZnVuY3Rpb24gPENPREU+X3B1dGNoYXJfcjwvQ09ERT4gaXMgYSByZWVudHJhbnQgdmVyc2lvbi4gIFRoZQogICAgICAgICBleHRyYSBhcmd1bWVudCA8VkFSPnJlZW50PC9WQVI+IGlzIGEgcG9pbnRlciB0byBhIHJlZW50cmFuY3kgc3RydWN0dXJlLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgSWYgc3VjY2Vzc2Z1bCwgPENPREU+cHV0Y2hhcjwvQ09ERT4gcmV0dXJucyBpdHMgYXJndW1lbnQgPFZBUj5jaDwvVkFSPi4gIElmIGFuIGVycm9yCiAgICAgICAgIGludGVydmVuZXMsIHRoZSByZXN1bHQgaXMgPENPREU+RU9GPC9DT0RFPi4gIFlvdSBjYW4gdXNlIGA8Q09ERT5mZXJyb3Ioc3RkaW4pPC9DT0RFPicgdG8KICAgICAgICAgcXVlcnkgZm9yIGVycm9ycy4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICBBTlNJIEMgcmVxdWlyZXMgPENPREU+cHV0Y2hhcjwvQ09ERT47IGl0IHN1Z2dlc3RzLCBidXQgZG9lcyBub3QgcmVxdWlyZSwgdGhhdAogICAgICAgICA8Q09ERT5wdXRjaGFyPC9DT0RFPiBiZSBpbXBsZW1lbnRlZCBhcyBhIG1hY3JvLgogICAgICAgICA8YnI+PGJyPiBTdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzIHJlcXVpcmVkOiA8Q09ERT5jbG9zZTwvQ09ERT4sIDxDT0RFPmZzdGF0PC9DT0RFPiwgPENPREU+aXNhdHR5PC9DT0RFPiwKICAgICAgICAgPENPREU+bHNlZWs8L0NPREU+LCA8Q09ERT5yZWFkPC9DT0RFPiwgPENPREU+c2JyazwvQ09ERT4sIDxDT0RFPndyaXRlPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAdzdGRpby5oeHEAfgHUdAAcc3RydWN0IF9yZWVudCAqcmVlbnQsIGludCBjaHQABGludCB0AAdfcHV0c19yc3EAfgAKcHQDoAogICAgICAgIDxDT0RFPnB1dHM8L0NPREU+IHdyaXRlcyB0aGUgc3RyaW5nIGF0IDxWQVI+czwvVkFSPiAoZm9sbG93ZWQgYnkgYSBuZXdsaW5lLCBpbnN0ZWFkIG9mCiAgICAgICAgIHRoZSB0cmFpbGluZyBudWxsKSB0byB0aGUgc3RhbmRhcmQgb3V0cHV0IHN0cmVhbS4KICAgICAgICAgPGJyPjxicj4gVGhlIGFsdGVybmF0ZSBmdW5jdGlvbiA8Q09ERT5fcHV0c19yPC9DT0RFPiBpcyBhIHJlZW50cmFudCB2ZXJzaW9uLiAgVGhlIGV4dHJhCiAgICAgICAgIGFyZ3VtZW50IDxWQVI+cmVlbnQ8L1ZBUj4gaXMgYSBwb2ludGVyIHRvIGEgcmVlbnRyYW5jeSBzdHJ1Y3R1cmUuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICBJZiBzdWNjZXNzZnVsLCB0aGUgcmVzdWx0IGlzIGEgbm9ubmVnYXRpdmUgaW50ZWdlcjsgb3RoZXJ3aXNlLCB0aGUKICAgICAgICAgcmVzdWx0IGlzIDxDT0RFPkVPRjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgQU5TSSBDIHJlcXVpcmVzIDxDT0RFPnB1dHM8L0NPREU+LCBidXQgZG9lcyBub3Qgc3BlY2lmeSB0aGF0IHRoZSByZXN1bHQgb24KICAgICAgICAgc3VjY2VzcyBtdXN0IGJlIDxDT0RFPjA8L0NPREU+OyBhbnkgbm9uLW5lZ2F0aXZlIHZhbHVlIGlzIHBlcm1pdHRlZC4KICAgICAgICAgPGJyPjxicj4gU3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcyByZXF1aXJlZDogPENPREU+Y2xvc2U8L0NPREU+LCA8Q09ERT5mc3RhdDwvQ09ERT4sIDxDT0RFPmlzYXR0eTwvQ09ERT4sCiAgICAgICAgIDxDT0RFPmxzZWVrPC9DT0RFPiwgPENPREU+cmVhZDwvQ09ERT4sIDxDT0RFPnNicms8L0NPREU+LCA8Q09ERT53cml0ZTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAHc3RkaW8uaHhxAH4B23QAI3N0cnVjdCBfcmVlbnQgKnJlZW50LCBjb25zdCBjaGFyICpzdAAEaW50IHQACF9yYWlzZV9yc3EAfgAKcHQEkgogICAgICAgIFNlbmQgdGhlIHNpZ25hbCA8VkFSPnNpZzwvVkFSPiAob25lIG9mIHRoZSBtYWNyb3MgZnJvbSBgPENPREU+c3lzL3NpZ25hbC5oPC9DT0RFPicpLgogICAgICAgICBUaGlzIGludGVycnVwdHMgeW91ciBwcm9ncmFtJ3Mgbm9ybWFsIGZsb3cgb2YgZXhlY3V0aW9uLCBhbmQgYWxsb3dzIGEgc2lnbmFsCiAgICAgICAgIGhhbmRsZXIgKGlmIHlvdSd2ZSBkZWZpbmVkIG9uZSwgdXNpbmcgPENPREU+c2lnbmFsPC9DT0RFPikgdG8gdGFrZSBjb250cm9sLgogICAgICAgICA8YnI+PGJyPiBUaGUgYWx0ZXJuYXRlIGZ1bmN0aW9uIDxDT0RFPl9yYWlzZV9yPC9DT0RFPiBpcyBhIHJlZW50cmFudCB2ZXJzaW9uLiAgVGhlIGV4dHJhCiAgICAgICAgIGFyZ3VtZW50IDxWQVI+cmVlbnQ8L1ZBUj4gaXMgYSBwb2ludGVyIHRvIGEgcmVlbnRyYW5jeSBzdHJ1Y3R1cmUuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICBUaGUgcmVzdWx0IGlzIDxDT0RFPjA8L0NPREU+IGlmIDxWQVI+c2lnPC9WQVI+IHdhcyBzdWNjZXNzZnVsbHkgcmFpc2VkLCA8Q09ERT4xPC9DT0RFPgogICAgICAgICBvdGhlcndpc2UuICBIb3dldmVyLCB0aGUgcmV0dXJuIHZhbHVlIChzaW5jZSBpdCBkZXBlbmRzIG9uIHRoZSBub3JtYWwKICAgICAgICAgZmxvdyBvZiBleGVjdXRpb24pIG1heSBub3QgYmUgdmlzaWJsZSwgdW5sZXNzIHRoZSBzaWduYWwgaGFuZGxlciBmb3IKICAgICAgICAgPFZBUj5zaWc8L1ZBUj4gdGVybWluYXRlcyB3aXRoIGEgPENPREU+cmV0dXJuPC9DT0RFPiBvciB1bmxlc3MgPENPREU+U0lHX0lHTjwvQ09ERT4gaXMgaW4KICAgICAgICAgZWZmZWN0IGZvciB0aGlzIHNpZ25hbC4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICBBTlNJIEMgcmVxdWlyZXMgPENPREU+cmFpc2U8L0NPREU+LCBidXQgYWxsb3dzIHRoZSBmdWxsIHNldCBvZiBzaWduYWwgbnVtYmVycwogICAgICAgICB0byB2YXJ5IGZyb20gb25lIGltcGxlbWVudGF0aW9uIHRvIGFub3RoZXIuCiAgICAgICAgIDxicj48YnI+IFJlcXVpcmVkIE9TIHN1YnJvdXRpbmVzOiA8Q09ERT5nZXRwaWQ8L0NPREU+LCA8Q09ERT5raWxsPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAhzaWduYWwuaHhxAH4B4nQAFHZvaWQgKnJlZW50LCBpbnQgc2lndAAEaW50IHQACl9yZWFsbG9jX3JzcQB+AApwcQB+APVzcQB+AA8AAAABdwQAAAAKdAAIc3RkbGliLmh4cQB+Ael0ACV2b2lkICpyZWVudCx2b2lkICphcHRyLCBzaXplX3QgbmJ5dGVzdAAGdm9pZCAqdAAGX3JlZW50c3EAfgAKcHEAfgFxc3EAfgAPAAAAAHcEAAAACnhxAH4B73B0AARudWxsdAAJX3JlbW92ZV9yc3EAfgAKcHQE2wogICAgICAgIFVzZSA8Q09ERT5yZW1vdmU8L0NPREU+IHRvIGRpc3NvbHZlIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIGEgcGFydGljdWxhcgogICAgICAgICBmaWxlbmFtZSAodGhlIHN0cmluZyBhdCA8VkFSPmZpbGVuYW1lPC9WQVI+KSBhbmQgdGhlIGZpbGUgaXQgcmVwcmVzZW50cy4KICAgICAgICAgQWZ0ZXIgY2FsbGluZyA8Q09ERT5yZW1vdmU8L0NPREU+IHdpdGggYSBwYXJ0aWN1bGFyIGZpbGVuYW1lLCB5b3Ugd2lsbCBubwogICAgICAgICBsb25nZXIgYmUgYWJsZSB0byBvcGVuIHRoZSBmaWxlIGJ5IHRoYXQgbmFtZS4KICAgICAgICAgPGJyPjxicj4gSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgeW91IG1heSB1c2UgPENPREU+cmVtb3ZlPC9DT0RFPiBvbiBhbiBvcGVuIGZpbGUgd2l0aG91dAogICAgICAgICBlcnJvcjsgZXhpc3RpbmcgZmlsZSBkZXNjcmlwdG9ycyBmb3IgdGhlIGZpbGUgd2lsbCBjb250aW51ZSB0byBhY2Nlc3MKICAgICAgICAgdGhlIGZpbGUncyBkYXRhIHVudGlsIHRoZSBwcm9ncmFtIHVzaW5nIHRoZW0gY2xvc2VzIHRoZSBmaWxlLgogICAgICAgICA8YnI+PGJyPiBUaGUgYWx0ZXJuYXRlIGZ1bmN0aW9uIDxDT0RFPl9yZW1vdmVfcjwvQ09ERT4gaXMgYSByZWVudHJhbnQgdmVyc2lvbi4gIFRoZQogICAgICAgICBleHRyYSBhcmd1bWVudCA8VkFSPnJlZW50PC9WQVI+IGlzIGEgcG9pbnRlciB0byBhIHJlZW50cmFuY3kgc3RydWN0dXJlLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgPENPREU+cmVtb3ZlPC9DT0RFPiByZXR1cm5zIDxDT0RFPjA8L0NPREU+IGlmIGl0IHN1Y2NlZWRzLCA8Q09ERT4tMTwvQ09ERT4gaWYgaXQgZmFpbHMuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgQU5TSSBDIHJlcXVpcmVzIDxDT0RFPnJlbW92ZTwvQ09ERT4sIGJ1dCBvbmx5IHNwZWNpZmllcyB0aGF0IHRoZSByZXN1bHQgb24KICAgICAgICAgZmFpbHVyZSBiZSBub256ZXJvLiAgVGhlIGJlaGF2aW9yIG9mIDxDT0RFPnJlbW92ZTwvQ09ERT4gd2hlbiB5b3UgY2FsbCBpdCBvbiBhbgogICAgICAgICBvcGVuIGZpbGUgbWF5IHZhcnkgYW1vbmcgaW1wbGVtZW50YXRpb25zLgogICAgICAgICA8YnI+PGJyPiBTdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmUgcmVxdWlyZWQ6IDxDT0RFPnVubGluazwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAHc3RkaW8uaHhxAH4B83QAJHN0cnVjdCBfcmVlbnQgKnJlZW50LCBjaGFyICpmaWxlbmFtZXQABGludCB0AAlfcmV3aW5kX3JzcQB+AApwdAIPCiAgICAgICAgPENPREU+cmV3aW5kPC9DT0RFPiByZXR1cm5zIHRoZSBmaWxlIHBvc2l0aW9uIGluZGljYXRvciAoaWYgYW55KSBmb3IgdGhlIGZpbGUKICAgICAgICAgb3Igc3RyZWFtIGlkZW50aWZpZWQgYnkgPFZBUj5mcDwvVkFSPiB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLiAgSXQgYWxzbwogICAgICAgICBjbGVhcnMgYW55IGVycm9yIGluZGljYXRvciBhbmQgZmx1c2hlcyBhbnkgcGVuZGluZyBvdXRwdXQuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICA8Q09ERT5yZXdpbmQ8L0NPREU+IGRvZXMgbm90IHJldHVybiBhIHJlc3VsdC4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICBBTlNJIEMgcmVxdWlyZXMgPENPREU+cmV3aW5kPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gTm8gc3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcyBhcmUgcmVxdWlyZWQuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAHc3RkaW8uaHhxAH4B+nQAHHN0cnVjdCBfcmVlbnQgKnB0ciwgRklMRSAqZnB0AAV2b2lkIHQACF9zY2FuZl9yc3EAfgAKcHEAfgEKc3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+AgF0ACtzdHJ1Y3QgX3JlZW50ICpwdHIsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4udAAEaW50IHQADF9zZXRsb2NhbGVfcnNxAH4ACnBxAH4BgnNxAH4ADwAAAAF3BAAAAAp0AAhsb2NhbGUuaHhxAH4CB3QALHZvaWQgKnJlZW50LGludCBjYXRlZ29yeSwgY29uc3QgY2hhciAqbG9jYWxldAAGY2hhciAqdAAJX3NpZ25hbF9yc3EAfgAKcHQJpQogICAgICAgIDxDT0RFPnNpZ25hbDwvQ09ERT4gcHJvdmlkZXMgYSBzaW1wbGUgc2lnbmFsLWhhbmRsaW5nIGltcGxlbWVudGF0aW9uIGZvciBlbWJlZGRlZAogICAgICAgICB0YXJnZXRzLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5zaWduYWw8L0NPREU+IGFsbG93cyB5b3UgdG8gcmVxdWVzdCBjaGFuZ2VkIHRyZWF0bWVudCBmb3IgYSBwYXJ0aWN1bGFyCiAgICAgICAgIHNpZ25hbCA8VkFSPnNpZzwvVkFSPi4gIFlvdSBjYW4gdXNlIG9uZSBvZiB0aGUgcHJlZGVmaW5lZCBtYWNyb3MgPENPREU+U0lHX0RGTDwvQ09ERT4KICAgICAgICAgKHNlbGVjdCBzeXN0ZW0gZGVmYXVsdCBoYW5kbGluZykgb3IgPENPREU+U0lHX0lHTjwvQ09ERT4gKGlnbm9yZSB0aGlzIHNpZ25hbCkKICAgICAgICAgYXMgdGhlIHZhbHVlIG9mIDxWQVI+ZnVuYzwvVkFSPjsgb3RoZXJ3aXNlLCA8VkFSPmZ1bmM8L1ZBUj4gaXMgYSBmdW5jdGlvbiBwb2ludGVyCiAgICAgICAgIHRoYXQgaWRlbnRpZmllcyBhIHN1YnJvdXRpbmUgaW4geW91ciBwcm9ncmFtIGFzIHRoZSBoYW5kbGVyIGZvciB0aGlzIHNpZ25hbC4KICAgICAgICAgPGJyPjxicj4gU29tZSBvZiB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50IGZvciBzaWduYWwgaGFuZGxlcnMgaXMKICAgICAgICAgdW5wcmVkaWN0YWJsZTsgbm90YWJseSwgdGhlIG9ubHkgbGlicmFyeSBmdW5jdGlvbiByZXF1aXJlZCB0byB3b3JrCiAgICAgICAgIGNvcnJlY3RseSBmcm9tIHdpdGhpbiBhIHNpZ25hbCBoYW5kbGVyIGlzIDxDT0RFPnNpZ25hbDwvQ09ERT4gaXRzZWxmLCBhbmQKICAgICAgICAgb25seSB3aGVuIHVzZWQgdG8gcmVkZWZpbmUgdGhlIGhhbmRsZXIgZm9yIHRoZSBjdXJyZW50IHNpZ25hbCB2YWx1ZS4KICAgICAgICAgPGJyPjxicj4gU3RhdGljIHN0b3JhZ2UgaXMgbGlrZXdpc2UgdW5yZWxpYWJsZSBmb3Igc2lnbmFsIGhhbmRsZXJzLCB3aXRoIG9uZQogICAgICAgICBleGNlcHRpb246IGlmIHlvdSBkZWNsYXJlIGEgc3RhdGljIHN0b3JhZ2UgbG9jYXRpb24gYXMgYDxDT0RFPnZvbGF0aWxlCiAgICAgICAgIHNpZ19hdG9taWNfdDwvQ09ERT4nLCB0aGVuIHlvdSBtYXkgdXNlIHRoYXQgbG9jYXRpb24gaW4gYSBzaWduYWwgaGFuZGxlciB0bwogICAgICAgICBzdG9yZSBzaWduYWwgdmFsdWVzLgogICAgICAgICA8YnI+PGJyPiBJZiB5b3VyIHNpZ25hbCBoYW5kbGVyIHRlcm1pbmF0ZXMgdXNpbmcgPENPREU+cmV0dXJuPC9DT0RFPiAob3IgaW1wbGljaXQKICAgICAgICAgcmV0dXJuKSwgeW91ciBwcm9ncmFtJ3MgZXhlY3V0aW9uIGNvbnRpbnVlcyBhdCB0aGUgcG9pbnQKICAgICAgICAgd2hlcmUgaXQgd2FzIHdoZW4gdGhlIHNpZ25hbCB3YXMgcmFpc2VkICh3aGV0aGVyIGJ5IHlvdXIgcHJvZ3JhbQogICAgICAgICBpdHNlbGYsIG9yIGJ5IGFuIGV4dGVybmFsIGV2ZW50KS4gIFNpZ25hbCBoYW5kbGVycyBjYW4gYWxzbwogICAgICAgICB1c2UgZnVuY3Rpb25zIHN1Y2ggYXMgPENPREU+ZXhpdDwvQ09ERT4gYW5kIDxDT0RFPmFib3J0PC9DT0RFPiB0byBhdm9pZCByZXR1cm5pbmcuCiAgICAgICAgIDxicj48YnI+IFRoZSBhbHRlcm5hdGUgZnVuY3Rpb24gPENPREU+X3NpZ25hbF9yPC9DT0RFPiBpcyB0aGUgcmVlbnRyYW50IHZlcnNpb24uCiAgICAgICAgIFRoZSBleHRyYSBhcmd1bWVudCA8VkFSPnJlZW50PC9WQVI+IGlzIGEgcG9pbnRlciB0byBhIHJlZW50cmFuY3kgc3RydWN0dXJlLgogICAgICAgICA8YnI+PGJyPiAKICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIElmIHlvdXIgcmVxdWVzdCBmb3IgYSBzaWduYWwgaGFuZGxlciBjYW5ub3QgYmUgaG9ub3JlZCwgdGhlIHJlc3VsdCBpcwogICAgICAgICA8Q09ERT5TSUdfRVJSPC9DT0RFPjsgYSBzcGVjaWZpYyBlcnJvciBudW1iZXIgaXMgYWxzbyByZWNvcmRlZCBpbiA8Q09ERT5lcnJubzwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IE90aGVyd2lzZSwgdGhlIHJlc3VsdCBpcyB0aGUgcHJldmlvdXMgaGFuZGxlciAoYSBmdW5jdGlvbiBwb2ludGVyIG9yCiAgICAgICAgIG9uZSBvZiB0aGUgcHJlZGVmaW5lZCBtYWNyb3MpLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIEFOU0kgQyByZXF1aXJlcyA8Q09ERT5zaWduYWw8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBObyBzdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzIGFyZSByZXF1aXJlZCB0byBsaW5rIHdpdGggPENPREU+c2lnbmFsPC9DT0RFPiwgYnV0CiAgICAgICAgIGl0IHdpbGwgbm90IGhhdmUgYW55IHVzZWZ1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dHM8L1ZBUj5bKHB8UClbK3wtXTxWQVI+ZGlnaXRzPC9WQVI+XTxicj4KICAgICAgICAgPC9wcmU+CiAgICAgICAgIFRoZSBzdWJzdHJpbmcgY29udGFpbnMgbm8gY2hhcmFjdGVycyBpZiA8VkFSPnN0cjwvVkFSPiBpcyBlbXB0eSwgY29uc2lzdHMKICAgICAgICAgZW50aXJlbHkgb2Ygd2hpdGVzcGFjZSwgb3IgaWYgdGhlIGZpcnN0IG5vbi13aGl0ZXNwYWNlCiAgICAgICAgIGNoYXJhY3RlciBpcyBzb21ldGhpbmcgb3RoZXIgdGhhbiA8Q09ERT4rPC9DT0RFPiwgPENPREU+LTwvQ09ERT4sIDxDT0RFPi48L0NPREU+LCBvciBhCiAgICAgICAgIGRpZ2l0LCBhbmQgY2Fubm90IGJlIHBhcnNlZCBhcyBpbmZpbml0eSBvciBOYU4uIElmIHRoZSBwbGF0Zm9ybQogICAgICAgICBkb2VzIG5vdCBzdXBwb3J0IE5hTiwgdGhlbiBOYU4gaXMgdHJlYXRlZCBhcyBhbiBlbXB0eSBzdWJzdHJpbmcuCiAgICAgICAgIElmIHRoZSBzdWJzdHJpbmcgaXMgZW1wdHksIG5vIGNvbnZlcnNpb24gaXMgZG9uZSwgYW5kCiAgICAgICAgIHRoZSB2YWx1ZSBvZiA8VkFSPnN0cjwvVkFSPiBpcyBzdG9yZWQgaW4gPENPREU+KjxWQVI+dGFpbDwvVkFSPjwvQ09ERT4uICBPdGhlcndpc2UsCiAgICAgICAgIHRoZSBzdWJzdHJpbmcgaXMgY29udmVydGVkLCBhbmQgYSBwb2ludGVyIHRvIHRoZSBmaW5hbCBzdHJpbmcKICAgICAgICAgKHdoaWNoIHdpbGwgY29udGFpbiBhdCBsZWFzdCB0aGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIgb2YKICAgICAgICAgPFZBUj5zdHI8L1ZBUj4pIGlzIHN0b3JlZCBpbiA8Q09ERT4qPFZBUj50YWlsPC9WQVI+PC9DT0RFPi4gIElmIHlvdSB3YW50IG5vCiAgICAgICAgIGFzc2lnbm1lbnQgdG8gPENPREU+KjxWQVI+dGFpbDwvVkFSPjwvQ09ERT4sIHBhc3MgYSBudWxsIHBvaW50ZXIgYXMgPFZBUj50YWlsPC9WQVI+LgogICAgICAgICA8Q09ERT5zdHJ0b2Y8L0NPREU+IGlzIGlkZW50aWNhbCB0byA8Q09ERT5zdHJ0b2Q8L0NPREU+IGV4Y2VwdCBmb3IgaXRzIHJldHVybiB0eXBlLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgdGhlIG5lYXJlc3QgbWFjaGluZSBudW1iZXIgdG8gdGhlCiAgICAgICAgIGlucHV0IGRlY2ltYWwgc3RyaW5nLiAgVGllcyBhcmUgYnJva2VuIGJ5IHVzaW5nIHRoZSBJRUVFCiAgICAgICAgIHJvdW5kLWV2ZW4gcnVsZS4gIEhvd2V2ZXIsIDxDT0RFPnN0cnRvZjwvQ09ERT4gaXMgY3VycmVudGx5IHN1YmplY3QgdG8KICAgICAgICAgZG91YmxlIHJvdW5kaW5nIGVycm9ycy4KICAgICAgICAgPGJyPjxicj4gVGhlIGFsdGVybmF0ZSBmdW5jdGlvbiA8Q09ERT5fc3RydG9kX3I8L0NPREU+IGlzIGEgcmVlbnRyYW50IHZlcnNpb24uCiAgICAgICAgIFRoZSBleHRyYSBhcmd1bWVudCA8VkFSPnJlZW50PC9WQVI+IGlzIGEgcG9pbnRlciB0byBhIHJlZW50cmFuY3kgc3RydWN0dXJlLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgPENPREU+c3RydG9kPC9DT0RFPiByZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3Vic3RyaW5nIHZhbHVlLCBpZiBhbnkuICBJZgogICAgICAgICBubyBjb252ZXJzaW9uIGNvdWxkIGJlIHBlcmZvcm1lZCwgMCBpcyByZXR1cm5lZC4gIElmIHRoZQogICAgICAgICBjb3JyZWN0IHZhbHVlIGlzIG91dCBvZiB0aGUgcmFuZ2Ugb2YgcmVwcmVzZW50YWJsZSB2YWx1ZXMsCiAgICAgICAgIHBsdXMgb3IgbWludXMgPENPREU+SFVHRV9WQUw8L0NPREU+IGlzIHJldHVybmVkLCBhbmQgPENPREU+RVJBTkdFPC9DT0RFPiBpcwogICAgICAgICBzdG9yZWQgaW4gZXJybm8uIElmIHRoZSBjb3JyZWN0IHZhbHVlIHdvdWxkIGNhdXNlIHVuZGVyZmxvdywgMAogICAgICAgICBpcyByZXR1cm5lZCBhbmQgPENPREU+RVJBTkdFPC9DT0RFPiBpcyBzdG9yZWQgaW4gZXJybm8uCiAgICAgICAgIDxicj48YnI+IFN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMgcmVxdWlyZWQ6IDxDT0RFPmNsb3NlPC9DT0RFPiwgPENPREU+ZnN0YXQ8L0NPREU+LCA8Q09ERT5pc2F0dHk8L0NPREU+LAogICAgICAgICA8Q09ERT5sc2VlazwvQ09ERT4sIDxDT0RFPnJlYWQ8L0NPREU+LCA8Q09ERT5zYnJrPC9DT0RFPiwgPENPREU+d3JpdGU8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAXcEAAAACnQACHN0ZGxpYi5oeHEAfgI4dAAodm9pZCAqcmVlbnQsY29uc3QgY2hhciAqc3RyLCBjaGFyICoqdGFpbHQAB2RvdWJsZSB0AAlfc3RydG9sX3JzcQB+AApwdA17CiAgICAgICAgVGhlIGZ1bmN0aW9uIDxDT0RFPnN0cnRvbDwvQ09ERT4gY29udmVydHMgdGhlIHN0cmluZyA8Q09ERT4qPFZBUj5zPC9WQVI+PC9DT0RFPiB0bwogICAgICAgICBhIDxDT0RFPmxvbmc8L0NPREU+LiBGaXJzdCwgaXQgYnJlYWtzIGRvd24gdGhlIHN0cmluZyBpbnRvIHRocmVlIHBhcnRzOgogICAgICAgICBsZWFkaW5nIHdoaXRlc3BhY2UsIHdoaWNoIGlzIGlnbm9yZWQ7IGEgc3ViamVjdCBzdHJpbmcgY29uc2lzdGluZwogICAgICAgICBvZiBjaGFyYWN0ZXJzIHJlc2VtYmxpbmcgYW4gaW50ZWdlciBpbiB0aGUgcmFkaXggc3BlY2lmaWVkIGJ5IDxWQVI+YmFzZTwvVkFSPjsKICAgICAgICAgYW5kIGEgdHJhaWxpbmcgcG9ydGlvbiBjb25zaXN0aW5nIG9mIHplcm8gb3IgbW9yZSB1bnBhcnNlYWJsZSBjaGFyYWN0ZXJzLAogICAgICAgICBhbmQgYWx3YXlzIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIuIFRoZW4sIGl0IGF0dGVtcHRzCiAgICAgICAgIHRvIGNvbnZlcnQgdGhlIHN1YmplY3Qgc3RyaW5nIGludG8gYSA8Q09ERT5sb25nPC9DT0RFPiBhbmQgcmV0dXJucyB0aGUKICAgICAgICAgcmVzdWx0LgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgdmFsdWUgb2YgPFZBUj5iYXNlPC9WQVI+IGlzIDAsIHRoZSBzdWJqZWN0IHN0cmluZyBpcyBleHBlY3RlZCB0byBsb29rCiAgICAgICAgIGxpa2UgYSBub3JtYWwgQyBpbnRlZ2VyIGNvbnN0YW50OiBhbiBvcHRpb25hbCBzaWduLCBhIHBvc3NpYmxlIGA8Q09ERT4weDwvQ09ERT4nCiAgICAgICAgIGluZGljYXRpbmcgYSBoZXhhZGVjaW1hbCBiYXNlLCBhbmQgYSBudW1iZXIuIElmIDxWQVI+YmFzZTwvVkFSPiBpcyBiZXR3ZWVuCiAgICAgICAgIDIgYW5kIDM2LCB0aGUgZXhwZWN0ZWQgZm9ybSBvZiB0aGUgc3ViamVjdCBpcyBhIHNlcXVlbmNlIG9mIGxldHRlcnMKICAgICAgICAgYW5kIGRpZ2l0cyByZXByZXNlbnRpbmcgYW4gaW50ZWdlciBpbiB0aGUgcmFkaXggc3BlY2lmaWVkIGJ5IDxWQVI+YmFzZTwvVkFSPiwKICAgICAgICAgd2l0aCBhbiBvcHRpb25hbCBwbHVzIG9yIG1pbnVzIHNpZ24uIFRoZSBsZXR0ZXJzIDxDT0RFPmE8L0NPREU+LS08Q09ERT56PC9DT0RFPiAob3IsCiAgICAgICAgIGVxdWl2YWxlbnRseSwgPENPREU+QTwvQ09ERT4tLTxDT0RFPlo8L0NPREU+KSBhcmUgdXNlZCB0byBzaWduaWZ5IHZhbHVlcyBmcm9tIDEwIHRvIDM1OwogICAgICAgICBvbmx5IGxldHRlcnMgd2hvc2UgYXNjcmliZWQgdmFsdWVzIGFyZSBsZXNzIHRoYW4gPFZBUj5iYXNlPC9WQVI+IGFyZQogICAgICAgICBwZXJtaXR0ZWQuIElmIDxWQVI+YmFzZTwvVkFSPiBpcyAxNiwgYSBsZWFkaW5nIDxDT0RFPjB4PC9DT0RFPiBpcyBwZXJtaXR0ZWQuCiAgICAgICAgIDxicj48YnI+IFRoZSBzdWJqZWN0IHNlcXVlbmNlIGlzIHRoZSBsb25nZXN0IGluaXRpYWwgc2VxdWVuY2Ugb2YgdGhlIGlucHV0CiAgICAgICAgIHN0cmluZyB0aGF0IGhhcyB0aGUgZXhwZWN0ZWQgZm9ybSwgc3RhcnRpbmcgd2l0aCB0aGUgZmlyc3QKICAgICAgICAgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLiAgSWYgdGhlIHN0cmluZyBpcyBlbXB0eSBvciBjb25zaXN0cyBlbnRpcmVseQogICAgICAgICBvZiB3aGl0ZXNwYWNlLCBvciBpZiB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIG5vdCBhCiAgICAgICAgIHBlcm1pc3NpYmxlIGxldHRlciBvciBkaWdpdCwgdGhlIHN1YmplY3Qgc3RyaW5nIGlzIGVtcHR5LgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgc3ViamVjdCBzdHJpbmcgaXMgYWNjZXB0YWJsZSwgYW5kIHRoZSB2YWx1ZSBvZiA8VkFSPmJhc2U8L1ZBUj4gaXMgemVybywKICAgICAgICAgPENPREU+c3RydG9sPC9DT0RFPiBhdHRlbXB0cyB0byBkZXRlcm1pbmUgdGhlIHJhZGl4IGZyb20gdGhlIGlucHV0IHN0cmluZy4gQQogICAgICAgICBzdHJpbmcgd2l0aCBhIGxlYWRpbmcgPENPREU+MHg8L0NPREU+IGlzIHRyZWF0ZWQgYXMgYSBoZXhhZGVjaW1hbCB2YWx1ZTsgYSBzdHJpbmcgd2l0aAogICAgICAgICBhIGxlYWRpbmcgMCBhbmQgbm8gPENPREU+eDwvQ09ERT4gaXMgdHJlYXRlZCBhcyBvY3RhbDsgYWxsIG90aGVyIHN0cmluZ3MgYXJlCiAgICAgICAgIHRyZWF0ZWQgYXMgZGVjaW1hbC4gSWYgPFZBUj5iYXNlPC9WQVI+IGlzIGJldHdlZW4gMiBhbmQgMzYsIGl0IGlzIHVzZWQgYXMgdGhlCiAgICAgICAgIGNvbnZlcnNpb24gcmFkaXgsIGFzIGRlc2NyaWJlZCBhYm92ZS4gSWYgdGhlIHN1YmplY3Qgc3RyaW5nIGJlZ2lucyB3aXRoCiAgICAgICAgIGEgbWludXMgc2lnbiwgdGhlIHZhbHVlIGlzIG5lZ2F0ZWQuIEZpbmFsbHksIGEgcG9pbnRlciB0byB0aGUgZmlyc3QKICAgICAgICAgY2hhcmFjdGVyIHBhc3QgdGhlIGNvbnZlcnRlZCBzdWJqZWN0IHN0cmluZyBpcyBzdG9yZWQgaW4gPFZBUj5wdHI8L1ZBUj4sIGlmCiAgICAgICAgIDxWQVI+cHRyPC9WQVI+IGlzIG5vdCA8Q09ERT5OVUxMPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIHN1YmplY3Qgc3RyaW5nIGlzIGVtcHR5IChvciBub3QgaW4gYWNjZXB0YWJsZSBmb3JtKSwgbm8gY29udmVyc2lvbgogICAgICAgICBpcyBwZXJmb3JtZWQgYW5kIHRoZSB2YWx1ZSBvZiA8VkFSPnM8L1ZBUj4gaXMgc3RvcmVkIGluIDxWQVI+cHRyPC9WQVI+IChpZiA8VkFSPnB0cjwvVkFSPiBpcwogICAgICAgICBub3QgPENPREU+TlVMTDwvQ09ERT4pLgogICAgICAgICA8YnI+PGJyPiBUaGUgYWx0ZXJuYXRlIGZ1bmN0aW9uIDxDT0RFPl9zdHJ0b2xfcjwvQ09ERT4gaXMgYSByZWVudHJhbnQgdmVyc2lvbi4gIFRoZQogICAgICAgICBleHRyYSBhcmd1bWVudCA8VkFSPnJlZW50PC9WQVI+IGlzIGEgcG9pbnRlciB0byBhIHJlZW50cmFuY3kgc3RydWN0dXJlLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgPENPREU+c3RydG9sPC9DT0RFPiByZXR1cm5zIHRoZSBjb252ZXJ0ZWQgdmFsdWUsIGlmIGFueS4gSWYgbm8gY29udmVyc2lvbiB3YXMKICAgICAgICAgbWFkZSwgMCBpcyByZXR1cm5lZC4KICAgICAgICAgPGJyPjxicj4gPENPREU+c3RydG9sPC9DT0RFPiByZXR1cm5zIDxDT0RFPkxPTkdfTUFYPC9DT0RFPiBvciA8Q09ERT5MT05HX01JTjwvQ09ERT4gaWYgdGhlIG1hZ25pdHVkZSBvZgogICAgICAgICB0aGUgY29udmVydGVkIHZhbHVlIGlzIHRvbyBsYXJnZSwgYW5kIHNldHMgPENPREU+ZXJybm88L0NPREU+IHRvIDxDT0RFPkVSQU5HRTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgPENPREU+c3RydG9sPC9DT0RFPiBpcyBBTlNJLgogICAgICAgICA8YnI+PGJyPiBObyBzdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzIGFyZSByZXF1aXJlZC4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAhzdGRsaWIuaHhxAH4CP3QALnZvaWQgKnJlZW50LGNvbnN0IGNoYXIgKnMsIGNoYXIgKipwdHIsaW50IGJhc2V0AAVsb25nIHQACl9zdHJ0b2xsX3JzcQB+AApwdA2VCiAgICAgICAgVGhlIGZ1bmN0aW9uIDxDT0RFPnN0cnRvbGw8L0NPREU+IGNvbnZlcnRzIHRoZSBzdHJpbmcgPENPREU+KjxWQVI+czwvVkFSPjwvQ09ERT4gdG8KICAgICAgICAgYSA8Q09ERT5sb25nIGxvbmc8L0NPREU+LiBGaXJzdCwgaXQgYnJlYWtzIGRvd24gdGhlIHN0cmluZyBpbnRvIHRocmVlIHBhcnRzOgogICAgICAgICBsZWFkaW5nIHdoaXRlc3BhY2UsIHdoaWNoIGlzIGlnbm9yZWQ7IGEgc3ViamVjdCBzdHJpbmcgY29uc2lzdGluZwogICAgICAgICBvZiBjaGFyYWN0ZXJzIHJlc2VtYmxpbmcgYW4gaW50ZWdlciBpbiB0aGUgcmFkaXggc3BlY2lmaWVkIGJ5IDxWQVI+YmFzZTwvVkFSPjsKICAgICAgICAgYW5kIGEgdHJhaWxpbmcgcG9ydGlvbiBjb25zaXN0aW5nIG9mIHplcm8gb3IgbW9yZSB1bnBhcnNlYWJsZSBjaGFyYWN0ZXJzLAogICAgICAgICBhbmQgYWx3YXlzIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIuIFRoZW4sIGl0IGF0dGVtcHRzCiAgICAgICAgIHRvIGNvbnZlcnQgdGhlIHN1YmplY3Qgc3RyaW5nIGludG8gYSA8Q09ERT5sb25nIGxvbmc8L0NPREU+IGFuZCByZXR1cm5zIHRoZQogICAgICAgICByZXN1bHQuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSB2YWx1ZSBvZiA8VkFSPmJhc2U8L1ZBUj4gaXMgMCwgdGhlIHN1YmplY3Qgc3RyaW5nIGlzIGV4cGVjdGVkIHRvIGxvb2sKICAgICAgICAgbGlrZSBhIG5vcm1hbCBDIGludGVnZXIgY29uc3RhbnQ6IGFuIG9wdGlvbmFsIHNpZ24sIGEgcG9zc2libGUgYDxDT0RFPjB4PC9DT0RFPicKICAgICAgICAgaW5kaWNhdGluZyBhIGhleGFkZWNpbWFsIGJhc2UsIGFuZCBhIG51bWJlci4gSWYgPFZBUj5iYXNlPC9WQVI+IGlzIGJldHdlZW4KICAgICAgICAgMiBhbmQgMzYsIHRoZSBleHBlY3RlZCBmb3JtIG9mIHRoZSBzdWJqZWN0IGlzIGEgc2VxdWVuY2Ugb2YgbGV0dGVycwogICAgICAgICBhbmQgZGlnaXRzIHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyIGluIHRoZSByYWRpeCBzcGVjaWZpZWQgYnkgPFZBUj5iYXNlPC9WQVI+LAogICAgICAgICB3aXRoIGFuIG9wdGlvbmFsIHBsdXMgb3IgbWludXMgc2lnbi4gVGhlIGxldHRlcnMgPENPREU+YTwvQ09ERT4tLTxDT0RFPno8L0NPREU+IChvciwKICAgICAgICAgZXF1aXZhbGVudGx5LCA8Q09ERT5BPC9DT0RFPi0tPENPREU+WjwvQ09ERT4pIGFyZSB1c2VkIHRvIHNpZ25pZnkgdmFsdWVzIGZyb20gMTAgdG8gMzU7CiAgICAgICAgIG9ubHkgbGV0dGVycyB3aG9zZSBhc2NyaWJlZCB2YWx1ZXMgYXJlIGxlc3MgdGhhbiA8VkFSPmJhc2U8L1ZBUj4gYXJlCiAgICAgICAgIHBlcm1pdHRlZC4gSWYgPFZBUj5iYXNlPC9WQVI+IGlzIDE2LCBhIGxlYWRpbmcgPENPREU+MHg8L0NPREU+IGlzIHBlcm1pdHRlZC4KICAgICAgICAgPGJyPjxicj4gVGhlIHN1YmplY3Qgc2VxdWVuY2UgaXMgdGhlIGxvbmdlc3QgaW5pdGlhbCBzZXF1ZW5jZSBvZiB0aGUgaW5wdXQKICAgICAgICAgc3RyaW5nIHRoYXQgaGFzIHRoZSBleHBlY3RlZCBmb3JtLCBzdGFydGluZyB3aXRoIHRoZSBmaXJzdAogICAgICAgICBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIuICBJZiB0aGUgc3RyaW5nIGlzIGVtcHR5IG9yIGNvbnNpc3RzIGVudGlyZWx5CiAgICAgICAgIG9mIHdoaXRlc3BhY2UsIG9yIGlmIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgbm90IGEKICAgICAgICAgcGVybWlzc2libGUgbGV0dGVyIG9yIGRpZ2l0LCB0aGUgc3ViamVjdCBzdHJpbmcgaXMgZW1wdHkuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBzdWJqZWN0IHN0cmluZyBpcyBhY2NlcHRhYmxlLCBhbmQgdGhlIHZhbHVlIG9mIDxWQVI+YmFzZTwvVkFSPiBpcyB6ZXJvLAogICAgICAgICA8Q09ERT5zdHJ0b2xsPC9DT0RFPiBhdHRlbXB0cyB0byBkZXRlcm1pbmUgdGhlIHJhZGl4IGZyb20gdGhlIGlucHV0IHN0cmluZy4gQQogICAgICAgICBzdHJpbmcgd2l0aCBhIGxlYWRpbmcgPENPREU+MHg8L0NPREU+IGlzIHRyZWF0ZWQgYXMgYSBoZXhhZGVjaW1hbCB2YWx1ZTsgYSBzdHJpbmcgd2l0aAogICAgICAgICBhIGxlYWRpbmcgMCBhbmQgbm8gPENPREU+eDwvQ09ERT4gaXMgdHJlYXRlZCBhcyBvY3RhbDsgYWxsIG90aGVyIHN0cmluZ3MgYXJlCiAgICAgICAgIHRyZWF0ZWQgYXMgZGVjaW1hbC4gSWYgPFZBUj5iYXNlPC9WQVI+IGlzIGJldHdlZW4gMiBhbmQgMzYsIGl0IGlzIHVzZWQgYXMgdGhlCiAgICAgICAgIGNvbnZlcnNpb24gcmFkaXgsIGFzIGRlc2NyaWJlZCBhYm92ZS4gSWYgdGhlIHN1YmplY3Qgc3RyaW5nIGJlZ2lucyB3aXRoCiAgICAgICAgIGEgbWludXMgc2lnbiwgdGhlIHZhbHVlIGlzIG5lZ2F0ZWQuIEZpbmFsbHksIGEgcG9pbnRlciB0byB0aGUgZmlyc3QKICAgICAgICAgY2hhcmFjdGVyIHBhc3QgdGhlIGNvbnZlcnRlZCBzdWJqZWN0IHN0cmluZyBpcyBzdG9yZWQgaW4gPFZBUj5wdHI8L1ZBUj4sIGlmCiAgICAgICAgIDxWQVI+cHRyPC9WQVI+IGlzIG5vdCA8Q09ERT5OVUxMPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIHN1YmplY3Qgc3RyaW5nIGlzIGVtcHR5IChvciBub3QgaW4gYWNjZXB0YWJsZSBmb3JtKSwgbm8gY29udmVyc2lvbgogICAgICAgICBpcyBwZXJmb3JtZWQgYW5kIHRoZSB2YWx1ZSBvZiA8VkFSPnM8L1ZBUj4gaXMgc3RvcmVkIGluIDxWQVI+cHRyPC9WQVI+IChpZiA8VkFSPnB0cjwvVkFSPiBpcwogICAgICAgICBub3QgPENPREU+TlVMTDwvQ09ERT4pLgogICAgICAgICA8YnI+PGJyPiBUaGUgYWx0ZXJuYXRlIGZ1bmN0aW9uIDxDT0RFPl9zdHJ0b2xsX3I8L0NPREU+IGlzIGEgcmVlbnRyYW50IHZlcnNpb24uICBUaGUKICAgICAgICAgZXh0cmEgYXJndW1lbnQgPFZBUj5yZWVudDwvVkFSPiBpcyBhIHBvaW50ZXIgdG8gYSByZWVudHJhbmN5IHN0cnVjdHVyZS4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIDxDT0RFPnN0cnRvbGw8L0NPREU+IHJldHVybnMgdGhlIGNvbnZlcnRlZCB2YWx1ZSwgaWYgYW55LiBJZiBubyBjb252ZXJzaW9uIHdhcwogICAgICAgICBtYWRlLCAwIGlzIHJldHVybmVkLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5zdHJ0b2xsPC9DT0RFPiByZXR1cm5zIDxDT0RFPkxPTkdfTE9OR19NQVg8L0NPREU+IG9yIDxDT0RFPkxPTkdfTE9OR19NSU48L0NPREU+IGlmIHRoZSBtYWduaXR1ZGUgb2YKICAgICAgICAgdGhlIGNvbnZlcnRlZCB2YWx1ZSBpcyB0b28gbGFyZ2UsIGFuZCBzZXRzIDxDT0RFPmVycm5vPC9DT0RFPiB0byA8Q09ERT5FUkFOR0U8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIDxDT0RFPnN0cnRvbGw8L0NPREU+IGlzIEFOU0kuCiAgICAgICAgIDxicj48YnI+IE5vIHN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMgYXJlIHJlcXVpcmVkLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAXcEAAAACnQACHN0ZGxpYi5oeHEAfgJGdAAudm9pZCAqcmVlbnQsY29uc3QgY2hhciAqcywgY2hhciAqKnB0cixpbnQgYmFzZXQACmxvbmcgbG9uZyB0AApfc3RydG91bF9yc3EAfgAKcHQNnQogICAgICAgIFRoZSBmdW5jdGlvbiA8Q09ERT5zdHJ0b3VsPC9DT0RFPiBjb252ZXJ0cyB0aGUgc3RyaW5nIDxDT0RFPio8VkFSPnM8L1ZBUj48L0NPREU+IHRvCiAgICAgICAgIGFuIDxDT0RFPnVuc2lnbmVkIGxvbmc8L0NPREU+LiBGaXJzdCwgaXQgYnJlYWtzIGRvd24gdGhlIHN0cmluZyBpbnRvIHRocmVlIHBhcnRzOgogICAgICAgICBsZWFkaW5nIHdoaXRlc3BhY2UsIHdoaWNoIGlzIGlnbm9yZWQ7IGEgc3ViamVjdCBzdHJpbmcgY29uc2lzdGluZwogICAgICAgICBvZiB0aGUgZGlnaXRzIG1lYW5pbmdmdWwgaW4gdGhlIHJhZGl4IHNwZWNpZmllZCBieSA8VkFSPmJhc2U8L1ZBUj4KICAgICAgICAgKGZvciBleGFtcGxlLCA8Q09ERT4wPC9DT0RFPiB0aHJvdWdoIDxDT0RFPjc8L0NPREU+IGlmIHRoZSB2YWx1ZSBvZiA8VkFSPmJhc2U8L1ZBUj4gaXMgOCk7CiAgICAgICAgIGFuZCBhIHRyYWlsaW5nIHBvcnRpb24gY29uc2lzdGluZyBvZiBvbmUgb3IgbW9yZSB1bnBhcnNlYWJsZSBjaGFyYWN0ZXJzLAogICAgICAgICB3aGljaCBhbHdheXMgaW5jbHVkZXMgdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyLiBUaGVuLCBpdCBhdHRlbXB0cwogICAgICAgICB0byBjb252ZXJ0IHRoZSBzdWJqZWN0IHN0cmluZyBpbnRvIGFuIHVuc2lnbmVkIGxvbmcgaW50ZWdlciwgYW5kIHJldHVybnMgdGhlCiAgICAgICAgIHJlc3VsdC4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIHZhbHVlIG9mIDxWQVI+YmFzZTwvVkFSPiBpcyB6ZXJvLCB0aGUgc3ViamVjdCBzdHJpbmcgaXMgZXhwZWN0ZWQgdG8gbG9vawogICAgICAgICBsaWtlIGEgbm9ybWFsIEMgaW50ZWdlciBjb25zdGFudCAoc2F2ZSB0aGF0IG5vIG9wdGlvbmFsIHNpZ24gaXMgcGVybWl0dGVkKToKICAgICAgICAgYSBwb3NzaWJsZSA8Q09ERT4weDwvQ09ERT4gaW5kaWNhdGluZyBoZXhhZGVjaW1hbCByYWRpeCwgYW5kIGEgbnVtYmVyLgogICAgICAgICBJZiA8VkFSPmJhc2U8L1ZBUj4gaXMgYmV0d2VlbiAyIGFuZCAzNiwgdGhlIGV4cGVjdGVkIGZvcm0gb2YgdGhlIHN1YmplY3QgaXMgYQogICAgICAgICBzZXF1ZW5jZSBvZiBkaWdpdHMgKHdoaWNoIG1heSBpbmNsdWRlIGxldHRlcnMsIGRlcGVuZGluZyBvbiB0aGUKICAgICAgICAgYmFzZSkgcmVwcmVzZW50aW5nIGFuIGludGVnZXIgaW4gdGhlIHJhZGl4IHNwZWNpZmllZCBieSA8VkFSPmJhc2U8L1ZBUj4uCiAgICAgICAgIFRoZSBsZXR0ZXJzIDxDT0RFPmE8L0NPREU+LS08Q09ERT56PC9DT0RFPiAob3IgPENPREU+QTwvQ09ERT4tLTxDT0RFPlo8L0NPREU+KSBhcmUgdXNlZCBhcyBkaWdpdHMgdmFsdWVkIGZyb20KICAgICAgICAgMTAgdG8gMzUuIElmIDxWQVI+YmFzZTwvVkFSPiBpcyAxNiwgYSBsZWFkaW5nIDxDT0RFPjB4PC9DT0RFPiBpcyBwZXJtaXR0ZWQuCiAgICAgICAgIDxicj48YnI+IFRoZSBzdWJqZWN0IHNlcXVlbmNlIGlzIHRoZSBsb25nZXN0IGluaXRpYWwgc2VxdWVuY2Ugb2YgdGhlIGlucHV0CiAgICAgICAgIHN0cmluZyB0aGF0IGhhcyB0aGUgZXhwZWN0ZWQgZm9ybSwgc3RhcnRpbmcgd2l0aCB0aGUgZmlyc3QKICAgICAgICAgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLiAgSWYgdGhlIHN0cmluZyBpcyBlbXB0eSBvciBjb25zaXN0cyBlbnRpcmVseQogICAgICAgICBvZiB3aGl0ZXNwYWNlLCBvciBpZiB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIG5vdCBhCiAgICAgICAgIHBlcm1pc3NpYmxlIGRpZ2l0LCB0aGUgc3ViamVjdCBzdHJpbmcgaXMgZW1wdHkuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBzdWJqZWN0IHN0cmluZyBpcyBhY2NlcHRhYmxlLCBhbmQgdGhlIHZhbHVlIG9mIDxWQVI+YmFzZTwvVkFSPiBpcyB6ZXJvLAogICAgICAgICA8Q09ERT5zdHJ0b3VsPC9DT0RFPiBhdHRlbXB0cyB0byBkZXRlcm1pbmUgdGhlIHJhZGl4IGZyb20gdGhlIGlucHV0IHN0cmluZy4gQQogICAgICAgICBzdHJpbmcgd2l0aCBhIGxlYWRpbmcgPENPREU+MHg8L0NPREU+IGlzIHRyZWF0ZWQgYXMgYSBoZXhhZGVjaW1hbCB2YWx1ZTsgYSBzdHJpbmcgd2l0aAogICAgICAgICBhIGxlYWRpbmcgPENPREU+MDwvQ09ERT4gYW5kIG5vIDxDT0RFPng8L0NPREU+IGlzIHRyZWF0ZWQgYXMgb2N0YWw7IGFsbCBvdGhlciBzdHJpbmdzIGFyZQogICAgICAgICB0cmVhdGVkIGFzIGRlY2ltYWwuIElmIDxWQVI+YmFzZTwvVkFSPiBpcyBiZXR3ZWVuIDIgYW5kIDM2LCBpdCBpcyB1c2VkIGFzIHRoZQogICAgICAgICBjb252ZXJzaW9uIHJhZGl4LCBhcyBkZXNjcmliZWQgYWJvdmUuIEZpbmFsbHksIGEgcG9pbnRlciB0byB0aGUgZmlyc3QKICAgICAgICAgY2hhcmFjdGVyIHBhc3QgdGhlIGNvbnZlcnRlZCBzdWJqZWN0IHN0cmluZyBpcyBzdG9yZWQgaW4gPFZBUj5wdHI8L1ZBUj4sIGlmCiAgICAgICAgIDxWQVI+cHRyPC9WQVI+IGlzIG5vdCA8Q09ERT5OVUxMPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIHN1YmplY3Qgc3RyaW5nIGlzIGVtcHR5ICh0aGF0IGlzLCBpZiA8Q09ERT4qPC9DT0RFPjxWQVI+czwvVkFSPiBkb2VzIG5vdCBzdGFydAogICAgICAgICB3aXRoIGEgc3Vic3RyaW5nIGluIGFjY2VwdGFibGUgZm9ybSksIG5vIGNvbnZlcnNpb24KICAgICAgICAgaXMgcGVyZm9ybWVkIGFuZCB0aGUgdmFsdWUgb2YgPFZBUj5zPC9WQVI+IGlzIHN0b3JlZCBpbiA8VkFSPnB0cjwvVkFSPiAoaWYgPFZBUj5wdHI8L1ZBUj4gaXMKICAgICAgICAgbm90IDxDT0RFPk5VTEw8L0NPREU+KS4KICAgICAgICAgPGJyPjxicj4gVGhlIGFsdGVybmF0ZSBmdW5jdGlvbiA8Q09ERT5fc3RydG91bF9yPC9DT0RFPiBpcyBhIHJlZW50cmFudCB2ZXJzaW9uLiAgVGhlCiAgICAgICAgIGV4dHJhIGFyZ3VtZW50IDxWQVI+cmVlbnQ8L1ZBUj4gaXMgYSBwb2ludGVyIHRvIGEgcmVlbnRyYW5jeSBzdHJ1Y3R1cmUuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICA8Q09ERT5zdHJ0b3VsPC9DT0RFPiByZXR1cm5zIHRoZSBjb252ZXJ0ZWQgdmFsdWUsIGlmIGFueS4gSWYgbm8gY29udmVyc2lvbiB3YXMKICAgICAgICAgbWFkZSwgPENPREU+MDwvQ09ERT4gaXMgcmV0dXJuZWQuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPnN0cnRvdWw8L0NPREU+IHJldHVybnMgPENPREU+VUxPTkdfTUFYPC9DT0RFPiBpZiB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb252ZXJ0ZWQKICAgICAgICAgdmFsdWUgaXMgdG9vIGxhcmdlLCBhbmQgc2V0cyA8Q09ERT5lcnJubzwvQ09ERT4gdG8gPENPREU+RVJBTkdFPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICA8Q09ERT5zdHJ0b3VsPC9DT0RFPiBpcyBBTlNJLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5zdHJ0b3VsPC9DT0RFPiByZXF1aXJlcyBubyBzdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAXcEAAAACnQACHN0ZGxpYi5oeHEAfgJNdAAvdm9pZCAqcmVlbnQsIGNvbnN0IGNoYXIgKnMsY2hhciAqKnB0ciwgaW50IGJhc2V0AA51bnNpZ25lZCBsb25nIHQAC19zdHJ0b3VsbF9yc3EAfgAKcHQNswogICAgICAgIFRoZSBmdW5jdGlvbiA8Q09ERT5zdHJ0b3VsbDwvQ09ERT4gY29udmVydHMgdGhlIHN0cmluZyA8Q09ERT4qPFZBUj5zPC9WQVI+PC9DT0RFPiB0bwogICAgICAgICBhbiA8Q09ERT51bnNpZ25lZCBsb25nIGxvbmc8L0NPREU+LiBGaXJzdCwgaXQgYnJlYWtzIGRvd24gdGhlIHN0cmluZyBpbnRvIHRocmVlIHBhcnRzOgogICAgICAgICBsZWFkaW5nIHdoaXRlc3BhY2UsIHdoaWNoIGlzIGlnbm9yZWQ7IGEgc3ViamVjdCBzdHJpbmcgY29uc2lzdGluZwogICAgICAgICBvZiB0aGUgZGlnaXRzIG1lYW5pbmdmdWwgaW4gdGhlIHJhZGl4IHNwZWNpZmllZCBieSA8VkFSPmJhc2U8L1ZBUj4KICAgICAgICAgKGZvciBleGFtcGxlLCA8Q09ERT4wPC9DT0RFPiB0aHJvdWdoIDxDT0RFPjc8L0NPREU+IGlmIHRoZSB2YWx1ZSBvZiA8VkFSPmJhc2U8L1ZBUj4gaXMgOCk7CiAgICAgICAgIGFuZCBhIHRyYWlsaW5nIHBvcnRpb24gY29uc2lzdGluZyBvZiBvbmUgb3IgbW9yZSB1bnBhcnNlYWJsZSBjaGFyYWN0ZXJzLAogICAgICAgICB3aGljaCBhbHdheXMgaW5jbHVkZXMgdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyLiBUaGVuLCBpdCBhdHRlbXB0cwogICAgICAgICB0byBjb252ZXJ0IHRoZSBzdWJqZWN0IHN0cmluZyBpbnRvIGFuIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnRlZ2VyLCBhbmQgcmV0dXJucyB0aGUKICAgICAgICAgcmVzdWx0LgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgdmFsdWUgb2YgPFZBUj5iYXNlPC9WQVI+IGlzIHplcm8sIHRoZSBzdWJqZWN0IHN0cmluZyBpcyBleHBlY3RlZCB0byBsb29rCiAgICAgICAgIGxpa2UgYSBub3JtYWwgQyBpbnRlZ2VyIGNvbnN0YW50IChzYXZlIHRoYXQgbm8gb3B0aW9uYWwgc2lnbiBpcyBwZXJtaXR0ZWQpOgogICAgICAgICBhIHBvc3NpYmxlIDxDT0RFPjB4PC9DT0RFPiBpbmRpY2F0aW5nIGhleGFkZWNpbWFsIHJhZGl4LCBhbmQgYSBudW1iZXIuCiAgICAgICAgIElmIDxWQVI+YmFzZTwvVkFSPiBpcyBiZXR3ZWVuIDIgYW5kIDM2LCB0aGUgZXhwZWN0ZWQgZm9ybSBvZiB0aGUgc3ViamVjdCBpcyBhCiAgICAgICAgIHNlcXVlbmNlIG9mIGRpZ2l0cyAod2hpY2ggbWF5IGluY2x1ZGUgbGV0dGVycywgZGVwZW5kaW5nIG9uIHRoZQogICAgICAgICBiYXNlKSByZXByZXNlbnRpbmcgYW4gaW50ZWdlciBpbiB0aGUgcmFkaXggc3BlY2lmaWVkIGJ5IDxWQVI+YmFzZTwvVkFSPi4KICAgICAgICAgVGhlIGxldHRlcnMgPENPREU+YTwvQ09ERT4tLTxDT0RFPno8L0NPREU+IChvciA8Q09ERT5BPC9DT0RFPi0tPENPREU+WjwvQ09ERT4pIGFyZSB1c2VkIGFzIGRpZ2l0cyB2YWx1ZWQgZnJvbQogICAgICAgICAxMCB0byAzNS4gSWYgPFZBUj5iYXNlPC9WQVI+IGlzIDE2LCBhIGxlYWRpbmcgPENPREU+MHg8L0NPREU+IGlzIHBlcm1pdHRlZC4KICAgICAgICAgPGJyPjxicj4gVGhlIHN1YmplY3Qgc2VxdWVuY2UgaXMgdGhlIGxvbmdlc3QgaW5pdGlhbCBzZXF1ZW5jZSBvZiB0aGUgaW5wdXQKICAgICAgICAgc3RyaW5nIHRoYXQgaGFzIHRoZSBleHBlY3RlZCBmb3JtLCBzdGFydGluZyB3aXRoIHRoZSBmaXJzdAogICAgICAgICBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIuICBJZiB0aGUgc3RyaW5nIGlzIGVtcHR5IG9yIGNvbnNpc3RzIGVudGlyZWx5CiAgICAgICAgIG9mIHdoaXRlc3BhY2UsIG9yIGlmIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgbm90IGEKICAgICAgICAgcGVybWlzc2libGUgZGlnaXQsIHRoZSBzdWJqZWN0IHN0cmluZyBpcyBlbXB0eS4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIHN1YmplY3Qgc3RyaW5nIGlzIGFjY2VwdGFibGUsIGFuZCB0aGUgdmFsdWUgb2YgPFZBUj5iYXNlPC9WQVI+IGlzIHplcm8sCiAgICAgICAgIDxDT0RFPnN0cnRvdWxsPC9DT0RFPiBhdHRlbXB0cyB0byBkZXRlcm1pbmUgdGhlIHJhZGl4IGZyb20gdGhlIGlucHV0IHN0cmluZy4gQQogICAgICAgICBzdHJpbmcgd2l0aCBhIGxlYWRpbmcgPENPREU+MHg8L0NPREU+IGlzIHRyZWF0ZWQgYXMgYSBoZXhhZGVjaW1hbCB2YWx1ZTsgYSBzdHJpbmcgd2l0aAogICAgICAgICBhIGxlYWRpbmcgPENPREU+MDwvQ09ERT4gYW5kIG5vIDxDT0RFPng8L0NPREU+IGlzIHRyZWF0ZWQgYXMgb2N0YWw7IGFsbCBvdGhlciBzdHJpbmdzIGFyZQogICAgICAgICB0cmVhdGVkIGFzIGRlY2ltYWwuIElmIDxWQVI+YmFzZTwvVkFSPiBpcyBiZXR3ZWVuIDIgYW5kIDM2LCBpdCBpcyB1c2VkIGFzIHRoZQogICAgICAgICBjb252ZXJzaW9uIHJhZGl4LCBhcyBkZXNjcmliZWQgYWJvdmUuIEZpbmFsbHksIGEgcG9pbnRlciB0byB0aGUgZmlyc3QKICAgICAgICAgY2hhcmFjdGVyIHBhc3QgdGhlIGNvbnZlcnRlZCBzdWJqZWN0IHN0cmluZyBpcyBzdG9yZWQgaW4gPFZBUj5wdHI8L1ZBUj4sIGlmCiAgICAgICAgIDxWQVI+cHRyPC9WQVI+IGlzIG5vdCA8Q09ERT5OVUxMPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIHN1YmplY3Qgc3RyaW5nIGlzIGVtcHR5ICh0aGF0IGlzLCBpZiA8Q09ERT4qPC9DT0RFPjxWQVI+czwvVkFSPiBkb2VzIG5vdCBzdGFydAogICAgICAgICB3aXRoIGEgc3Vic3RyaW5nIGluIGFjY2VwdGFibGUgZm9ybSksIG5vIGNvbnZlcnNpb24KICAgICAgICAgaXMgcGVyZm9ybWVkIGFuZCB0aGUgdmFsdWUgb2YgPFZBUj5zPC9WQVI+IGlzIHN0b3JlZCBpbiA8VkFSPnB0cjwvVkFSPiAoaWYgPFZBUj5wdHI8L1ZBUj4gaXMKICAgICAgICAgbm90IDxDT0RFPk5VTEw8L0NPREU+KS4KICAgICAgICAgPGJyPjxicj4gVGhlIGFsdGVybmF0ZSBmdW5jdGlvbiA8Q09ERT5fc3RydG91bGxfcjwvQ09ERT4gaXMgYSByZWVudHJhbnQgdmVyc2lvbi4gIFRoZQogICAgICAgICBleHRyYSBhcmd1bWVudCA8VkFSPnJlZW50PC9WQVI+IGlzIGEgcG9pbnRlciB0byBhIHJlZW50cmFuY3kgc3RydWN0dXJlLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgPENPREU+c3RydG91bGw8L0NPREU+IHJldHVybnMgdGhlIGNvbnZlcnRlZCB2YWx1ZSwgaWYgYW55LiBJZiBubyBjb252ZXJzaW9uIHdhcwogICAgICAgICBtYWRlLCA8Q09ERT4wPC9DT0RFPiBpcyByZXR1cm5lZC4KICAgICAgICAgPGJyPjxicj4gPENPREU+c3RydG91bGw8L0NPREU+IHJldHVybnMgPENPREU+VUxPTkdfTE9OR19NQVg8L0NPREU+IGlmIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvbnZlcnRlZAogICAgICAgICB2YWx1ZSBpcyB0b28gbGFyZ2UsIGFuZCBzZXRzIDxDT0RFPmVycm5vPC9DT0RFPiB0byA8Q09ERT5FUkFOR0U8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIDxDT0RFPnN0cnRvdWxsPC9DT0RFPiBpcyBBTlNJLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5zdHJ0b3VsbDwvQ09ERT4gcmVxdWlyZXMgbm8gc3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcy4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAhzdGRsaWIuaHhxAH4CVHQAL3ZvaWQgKnJlZW50LCBjb25zdCBjaGFyICpzLGNoYXIgKipwdHIsIGludCBiYXNldAATdW5zaWduZWQgbG9uZyBsb25nIHQACV9zeXN0ZW1fcnNxAH4ACnB0BcAKICAgICAgICA8YnI+PGJyPiBVc2UgPENPREU+c3lzdGVtPC9DT0RFPiB0byBwYXNzIGEgY29tbWFuZCBzdHJpbmcgPENPREU+KjxWQVI+czwvVkFSPjwvQ09ERT4gdG8gPENPREU+L2Jpbi9zaDwvQ09ERT4gb24KICAgICAgICAgeW91ciBzeXN0ZW0sIGFuZCB3YWl0IGZvciBpdCB0byBmaW5pc2ggZXhlY3V0aW5nLgogICAgICAgICA8YnI+PGJyPiBVc2UgYGA8Q09ERT5zeXN0ZW0oTlVMTCk8L0NPREU+JycgdG8gdGVzdCB3aGV0aGVyIHlvdXIgc3lzdGVtIGhhcyA8Q09ERT4vYmluL3NoPC9DT0RFPgogICAgICAgICBhdmFpbGFibGUuCiAgICAgICAgIDxicj48YnI+IFRoZSBhbHRlcm5hdGUgZnVuY3Rpb24gPENPREU+X3N5c3RlbV9yPC9DT0RFPiBpcyBhIHJlZW50cmFudCB2ZXJzaW9uLiAgVGhlCiAgICAgICAgIGV4dHJhIGFyZ3VtZW50IDxWQVI+cmVlbnQ8L1ZBUj4gaXMgYSBwb2ludGVyIHRvIGEgcmVlbnRyYW5jeSBzdHJ1Y3R1cmUuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICA8Q09ERT5zeXN0ZW0oTlVMTCk8L0NPREU+IHJldHVybnMgYSBub24temVybyB2YWx1ZSBpZiA8Q09ERT4vYmluL3NoPC9DT0RFPiBpcyBhdmFpbGFibGUsIGFuZAogICAgICAgICA8Q09ERT4wPC9DT0RFPiBpZiBpdCBpcyBub3QuCiAgICAgICAgIDxicj48YnI+IFdpdGggYSBjb21tYW5kIGFyZ3VtZW50LCB0aGUgcmVzdWx0IG9mIDxDT0RFPnN5c3RlbTwvQ09ERT4gaXMgdGhlIGV4aXQgc3RhdHVzCiAgICAgICAgIHJldHVybmVkIGJ5IDxDT0RFPi9iaW4vc2g8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIEFOU0kgQyByZXF1aXJlcyA8Q09ERT5zeXN0ZW08L0NPREU+LCBidXQgbGVhdmVzIHRoZSBuYXR1cmUgYW5kIGVmZmVjdHMgb2YgYQogICAgICAgICBjb21tYW5kIHByb2Nlc3NvciB1bmRlZmluZWQuICBBTlNJIEMgZG9lcywgaG93ZXZlciwgc3BlY2lmeSB0aGF0CiAgICAgICAgIDxDT0RFPnN5c3RlbShOVUxMKTwvQ09ERT4gcmV0dXJuIHplcm8gb3Igbm9uemVybyB0byByZXBvcnQgb24gdGhlIGV4aXN0ZW5jZSBvZgogICAgICAgICBhIGNvbW1hbmQgcHJvY2Vzc29yLgogICAgICAgICA8YnI+PGJyPiBQT1NJWC4yIHJlcXVpcmVzIDxDT0RFPnN5c3RlbTwvQ09ERT4sIGFuZCByZXF1aXJlcyB0aGF0IGl0IGludm9rZSBhIDxDT0RFPnNoPC9DT0RFPi4KICAgICAgICAgV2hlcmUgPENPREU+c2g8L0NPREU+IGlzIGZvdW5kIGlzIGxlZnQgdW5zcGVjaWZpZWQuCiAgICAgICAgIDxicj48YnI+IFN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMgcmVxdWlyZWQ6IDxDT0RFPl9leGl0PC9DT0RFPiwgPENPREU+X2V4ZWN2ZTwvQ09ERT4sIDxDT0RFPl9mb3JrX3I8L0NPREU+LAogICAgICAgICA8Q09ERT5fd2FpdF9yPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAhzdGRsaWIuaHhxAH4CW3QAFHZvaWQgKnJlZW50LCBjaGFyICpzdAAEaW50IHQACl90ZW1wbmFtX3JzcQB+AApwdAuQCiAgICAgICAgVXNlIGVpdGhlciBvZiB0aGVzZSBmdW5jdGlvbnMgdG8gZ2VuZXJhdGUgYSBuYW1lIGZvciBhIHRlbXBvcmFyeSBmaWxlLgogICAgICAgICBUaGUgZ2VuZXJhdGVkIG5hbWUgaXMgZ3VhcmFudGVlZCB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBvdGhlciBmaWxlcwogICAgICAgICAoZm9yIHVwIHRvIDxDT0RFPlRNUF9NQVg8L0NPREU+IGNhbGxzIG9mIGVpdGhlciBmdW5jdGlvbikuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPnRtcG5hbTwvQ09ERT4gZ2VuZXJhdGVzIGZpbGUgbmFtZXMgd2l0aCB0aGUgdmFsdWUgb2YgPENPREU+UF90bXBkaXI8L0NPREU+CiAgICAgICAgIChkZWZpbmVkIGluIGA8Q09ERT5zdGRpby5oPC9DT0RFPicpIGFzIHRoZSBsZWFkaW5nIGRpcmVjdG9yeSBjb21wb25lbnQgb2YgdGhlIHBhdGguCiAgICAgICAgIDxicj48YnI+IFlvdSBjYW4gdXNlIHRoZSA8Q09ERT50bXBuYW08L0NPREU+IGFyZ3VtZW50IDxWQVI+czwvVkFSPiB0byBzcGVjaWZ5IGEgc3VpdGFibGUgYXJlYQogICAgICAgICBvZiBtZW1vcnkgZm9yIHRoZSBnZW5lcmF0ZWQgZmlsZW5hbWU7IG90aGVyd2lzZSwgeW91IGNhbiBjYWxsCiAgICAgICAgIDxDT0RFPnRtcG5hbShOVUxMKTwvQ09ERT4gdG8gdXNlIGFuIGludGVybmFsIHN0YXRpYyBidWZmZXIuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPnRlbXBuYW08L0NPREU+IGFsbG93cyB5b3UgbW9yZSBjb250cm9sIG92ZXIgdGhlIGdlbmVyYXRlZCBmaWxlbmFtZTogeW91CiAgICAgICAgIGNhbiB1c2UgdGhlIGFyZ3VtZW50IDxWQVI+ZGlyPC9WQVI+IHRvIHNwZWNpZnkgdGhlIHBhdGggdG8gYSBkaXJlY3RvcnkgZm9yCiAgICAgICAgIHRlbXBvcmFyeSBmaWxlcywgYW5kIHlvdSBjYW4gdXNlIHRoZSBhcmd1bWVudCA8VkFSPnBmeDwvVkFSPiB0byBzcGVjaWZ5IGEKICAgICAgICAgcHJlZml4IGZvciB0aGUgYmFzZSBmaWxlbmFtZS4KICAgICAgICAgPGJyPjxicj4gSWYgPFZBUj5kaXI8L1ZBUj4gaXMgPENPREU+TlVMTDwvQ09ERT4sIDxDT0RFPnRlbXBuYW08L0NPREU+IHdpbGwgYXR0ZW1wdCB0byB1c2UgdGhlIHZhbHVlIG9mCiAgICAgICAgIGVudmlyb25tZW50IHZhcmlhYmxlIDxDT0RFPlRNUERJUjwvQ09ERT4gaW5zdGVhZDsgaWYgdGhlcmUgaXMgbm8gc3VjaCB2YWx1ZSwKICAgICAgICAgPENPREU+dGVtcG5hbTwvQ09ERT4gdXNlcyB0aGUgdmFsdWUgb2YgPENPREU+UF90bXBkaXI8L0NPREU+IChkZWZpbmVkIGluIGA8Q09ERT5zdGRpby5oPC9DT0RFPicpLgogICAgICAgICA8YnI+PGJyPiBJZiB5b3UgZG9uJ3QgbmVlZCBhbnkgcGFydGljdWxhciBwcmVmaXggdG8gdGhlIGJhc2VuYW1lIG9mIHRlbXBvcmFyeQogICAgICAgICBmaWxlcywgeW91IGNhbiBwYXNzIDxDT0RFPk5VTEw8L0NPREU+IGFzIHRoZSA8VkFSPnBmeDwvVkFSPiBhcmd1bWVudCB0byA8Q09ERT50ZW1wbmFtPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gPENPREU+X3RtcG5hbV9yPC9DT0RFPiBhbmQgPENPREU+X3RlbXBuYW1fcjwvQ09ERT4gYXJlIHJlZW50cmFudCB2ZXJzaW9ucyBvZiA8Q09ERT50bXBuYW08L0NPREU+CiAgICAgICAgIGFuZCA8Q09ERT50ZW1wbmFtPC9DT0RFPiByZXNwZWN0aXZlbHkuICBUaGUgZXh0cmEgYXJndW1lbnQgPFZBUj5yZWVudDwvVkFSPiBpcyBhCiAgICAgICAgIHBvaW50ZXIgdG8gYSByZWVudHJhbmN5IHN0cnVjdHVyZS4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+V2FybmluZ3M8L2gzPgogICAgICAgICBUaGUgZ2VuZXJhdGVkIGZpbGVuYW1lcyBhcmUgc3VpdGFibGUgZm9yIHRlbXBvcmFyeSBmaWxlcywgYnV0IGRvIG5vdAogICAgICAgICBpbiB0aGVtc2VsdmVzIG1ha2UgZmlsZXMgdGVtcG9yYXJ5LiAgRmlsZXMgd2l0aCB0aGVzZSBuYW1lcyBtdXN0IHN0aWxsCiAgICAgICAgIGJlIGV4cGxpY2l0bHkgcmVtb3ZlZCB3aGVuIHlvdSBubyBsb25nZXIgd2FudCB0aGVtLgogICAgICAgICA8YnI+PGJyPiBJZiB5b3Ugc3VwcGx5IHlvdXIgb3duIGRhdGEgYXJlYSA8VkFSPnM8L1ZBUj4gZm9yIDxDT0RFPnRtcG5hbTwvQ09ERT4sIHlvdSBtdXN0IGVuc3VyZQogICAgICAgICB0aGF0IGl0IGhhcyByb29tIGZvciBhdCBsZWFzdCA8Q09ERT5MX3RtcG5hbTwvQ09ERT4gZWxlbWVudHMgb2YgdHlwZSA8Q09ERT5jaGFyPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIEJvdGggPENPREU+dG1wbmFtPC9DT0RFPiBhbmQgPENPREU+dGVtcG5hbTwvQ09ERT4gcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbmV3bHkKICAgICAgICAgZ2VuZXJhdGVkIGZpbGVuYW1lLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIEFOU0kgQyByZXF1aXJlcyA8Q09ERT50bXBuYW08L0NPREU+LCBidXQgZG9lcyBub3Qgc3BlY2lmeSB0aGUgdXNlIG9mCiAgICAgICAgIDxDT0RFPlBfdG1wZGlyPC9DT0RFPi4gIFRoZSBTeXN0ZW0gViBJbnRlcmZhY2UgRGVmaW5pdGlvbiAoSXNzdWUgMikgcmVxdWlyZXMKICAgICAgICAgYm90aCA8Q09ERT50bXBuYW08L0NPREU+IGFuZCA8Q09ERT50ZW1wbmFtPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gU3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcyByZXF1aXJlZDogPENPREU+Y2xvc2U8L0NPREU+LCAgPENPREU+ZnN0YXQ8L0NPREU+LCA8Q09ERT5nZXRwaWQ8L0NPREU+LAogICAgICAgICA8Q09ERT5pc2F0dHk8L0NPREU+LCA8Q09ERT5sc2VlazwvQ09ERT4sIDxDT0RFPm9wZW48L0NPREU+LCA8Q09ERT5yZWFkPC9DT0RFPiwgPENPREU+c2JyazwvQ09ERT4sIDxDT0RFPndyaXRlPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhlIGdsb2JhbCBwb2ludGVyIDxDT0RFPmVudmlyb248L0NPREU+IGlzIGFsc28gcmVxdWlyZWQuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAHc3RkaW8uaHhxAH4CYnQAKnN0cnVjdCBfcmVlbnQgKnJlZW50LCBjaGFyICpkaXIsIGNoYXIgKnBmeHQABmNoYXIgKnQADF90bXBmaWxlNjRfcnNxAH4ACnB0BakKICAgICAgICBDcmVhdGUgYSBsYXJnZSB0ZW1wb3JhcnkgZmlsZSAoYSBmaWxlIHdoaWNoIHdpbGwgYmUgZGVsZXRlZCBhdXRvbWF0aWNhbGx5KSwKICAgICAgICAgdXNpbmcgYSBuYW1lIGdlbmVyYXRlZCBieSA8Q09ERT50bXBuYW08L0NPREU+LiAgVGhlIHRlbXBvcmFyeSBmaWxlIGlzIG9wZW5lZCB3aXRoCiAgICAgICAgIHRoZSBtb2RlIDxDT0RFPiJ3YisiPC9DT0RFPiwgcGVybWl0dGluZyB5b3UgdG8gcmVhZCBhbmQgd3JpdGUgYW55d2hlcmUgaW4gaXQKICAgICAgICAgYXMgYSBiaW5hcnkgZmlsZSAod2l0aG91dCBhbnkgZGF0YSB0cmFuc2Zvcm1hdGlvbnMgdGhlIGhvc3Qgc3lzdGVtIG1heQogICAgICAgICBwZXJmb3JtIGZvciB0ZXh0IGZpbGVzKS4gIFRoZSBmaWxlIG1heSBiZSBsYXJnZXIgdGhhbiAyR0IuCiAgICAgICAgIDxicj48YnI+IFRoZSBhbHRlcm5hdGUgZnVuY3Rpb24gPENPREU+X3RtcGZpbGU2NF9yPC9DT0RFPiBpcyBhIHJlZW50cmFudCB2ZXJzaW9uLiAgVGhlCiAgICAgICAgIGFyZ3VtZW50IDxWQVI+cmVlbnQ8L1ZBUj4gaXMgYSBwb2ludGVyIHRvIGEgcmVlbnRyYW5jeSBzdHJ1Y3R1cmUuCiAgICAgICAgIDxicj48YnI+IEJvdGggPENPREU+dG1wZmlsZTY0PC9DT0RFPiBhbmQgPENPREU+X3RtcGZpbGU2NF9yPC9DT0RFPiBhcmUgb25seSBkZWZpbmVkIGlmIF9fTEFSR0U2NF9GSUxFUwogICAgICAgICBpcyBkZWZpbmVkLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgPENPREU+dG1wZmlsZTY0PC9DT0RFPiBub3JtYWxseSByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgdGVtcG9yYXJ5IGZpbGUuICBJZiBubwogICAgICAgICB0ZW1wb3JhcnkgZmlsZSBjb3VsZCBiZSBjcmVhdGVkLCB0aGUgcmVzdWx0IGlzIE5VTEwsIGFuZCA8Q09ERT5lcnJubzwvQ09ERT4KICAgICAgICAgcmVjb3JkcyB0aGUgcmVhc29uIGZvciBmYWlsdXJlLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIDxDT0RFPnRtcGZpbGU2NDwvQ09ERT4gaXMgYSBnbGliYyBleHRlbnNpb24uCiAgICAgICAgIDxicj48YnI+IFN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMgcmVxdWlyZWQ6IDxDT0RFPmNsb3NlPC9DT0RFPiwgPENPREU+ZnN0YXQ8L0NPREU+LCA8Q09ERT5nZXRwaWQ8L0NPREU+LAogICAgICAgICA8Q09ERT5pc2F0dHk8L0NPREU+LCA8Q09ERT5sc2VlazY0PC9DT0RFPiwgPENPREU+b3BlbjY0PC9DT0RFPiwgPENPREU+cmVhZDwvQ09ERT4sIDxDT0RFPnNicms8L0NPREU+LCA8Q09ERT53cml0ZTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxDT0RFPnRtcGZpbGU2NDwvQ09ERT4gYWxzbyByZXF1aXJlcyB0aGUgZ2xvYmFsIHBvaW50ZXIgPENPREU+ZW52aXJvbjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAHc3RkaW8uaHhxAH4CaXQAC3ZvaWQgKnJlZW50dAAGRklMRSAqdAAKX3RtcGZpbGVfcnNxAH4ACnB0BSgKICAgICAgICBDcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSAoYSBmaWxlIHdoaWNoIHdpbGwgYmUgZGVsZXRlZCBhdXRvbWF0aWNhbGx5KSwKICAgICAgICAgdXNpbmcgYSBuYW1lIGdlbmVyYXRlZCBieSA8Q09ERT50bXBuYW08L0NPREU+LiAgVGhlIHRlbXBvcmFyeSBmaWxlIGlzIG9wZW5lZCB3aXRoCiAgICAgICAgIHRoZSBtb2RlIDxDT0RFPiJ3YisiPC9DT0RFPiwgcGVybWl0dGluZyB5b3UgdG8gcmVhZCBhbmQgd3JpdGUgYW55d2hlcmUgaW4gaXQKICAgICAgICAgYXMgYSBiaW5hcnkgZmlsZSAod2l0aG91dCBhbnkgZGF0YSB0cmFuc2Zvcm1hdGlvbnMgdGhlIGhvc3Qgc3lzdGVtIG1heQogICAgICAgICBwZXJmb3JtIGZvciB0ZXh0IGZpbGVzKS4KICAgICAgICAgPGJyPjxicj4gVGhlIGFsdGVybmF0ZSBmdW5jdGlvbiA8Q09ERT5fdG1wZmlsZV9yPC9DT0RFPiBpcyBhIHJlZW50cmFudCB2ZXJzaW9uLiAgVGhlCiAgICAgICAgIGFyZ3VtZW50IDxWQVI+cmVlbnQ8L1ZBUj4gaXMgYSBwb2ludGVyIHRvIGEgcmVlbnRyYW5jeSBzdHJ1Y3R1cmUuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICA8Q09ERT50bXBmaWxlPC9DT0RFPiBub3JtYWxseSByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgdGVtcG9yYXJ5IGZpbGUuICBJZiBubwogICAgICAgICB0ZW1wb3JhcnkgZmlsZSBjb3VsZCBiZSBjcmVhdGVkLCB0aGUgcmVzdWx0IGlzIE5VTEwsIGFuZCA8Q09ERT5lcnJubzwvQ09ERT4KICAgICAgICAgcmVjb3JkcyB0aGUgcmVhc29uIGZvciBmYWlsdXJlLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIEJvdGggQU5TSSBDIGFuZCB0aGUgU3lzdGVtIFYgSW50ZXJmYWNlIERlZmluaXRpb24gKElzc3VlIDIpIHJlcXVpcmUKICAgICAgICAgPENPREU+dG1wZmlsZTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMgcmVxdWlyZWQ6IDxDT0RFPmNsb3NlPC9DT0RFPiwgPENPREU+ZnN0YXQ8L0NPREU+LCA8Q09ERT5nZXRwaWQ8L0NPREU+LAogICAgICAgICA8Q09ERT5pc2F0dHk8L0NPREU+LCA8Q09ERT5sc2VlazwvQ09ERT4sIDxDT0RFPm9wZW48L0NPREU+LCA8Q09ERT5yZWFkPC9DT0RFPiwgPENPREU+c2JyazwvQ09ERT4sIDxDT0RFPndyaXRlPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gPENPREU+dG1wZmlsZTwvQ09ERT4gYWxzbyByZXF1aXJlcyB0aGUgZ2xvYmFsIHBvaW50ZXIgPENPREU+ZW52aXJvbjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAHc3RkaW8uaHhxAH4CcHQAFHN0cnVjdCBfcmVlbnQgKnJlZW50dAAGRklMRSAqdAAJX3RtcG5hbV9yc3EAfgAKcHEAfgJkc3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+And0AB1zdHJ1Y3QgX3JlZW50ICpyZWVudCwgY2hhciAqc3QABmNoYXIgKnQACF90b2xvd2Vyc3EAfgAKcHQFZQogICAgICAgIDxDT0RFPnRvbG93ZXI8L0NPREU+IGlzIGEgbWFjcm8gd2hpY2ggY29udmVydHMgdXBwZXJjYXNlIGNoYXJhY3RlcnMgdG8gbG93ZXJjYXNlLAogICAgICAgICBsZWF2aW5nIGFsbCBvdGhlciBjaGFyYWN0ZXJzIHVuY2hhbmdlZC4gIEl0IGlzIG9ubHkgZGVmaW5lZCB3aGVuCiAgICAgICAgIDxWQVI+YzwvVkFSPiBpcyBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSA8Q09ERT5FT0Y8L0NPREU+IHRvIDxDT0RFPjI1NTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFlvdSBjYW4gdXNlIGEgY29tcGlsZWQgc3Vicm91dGluZSBpbnN0ZWFkIG9mIHRoZSBtYWNybyBkZWZpbml0aW9uIGJ5CiAgICAgICAgIHVuZGVmaW5pbmcgdGhpcyBtYWNybyB1c2luZyBgPENPREU+I3VuZGVmIHRvbG93ZXI8L0NPREU+Jy4KICAgICAgICAgPGJyPjxicj4gPENPREU+X3RvbG93ZXI8L0NPREU+IHBlcmZvcm1zIHRoZSBzYW1lIGNvbnZlcnNpb24gYXMgPENPREU+dG9sb3dlcjwvQ09ERT4sIGJ1dCBzaG91bGQKICAgICAgICAgb25seSBiZSB1c2VkIHdoZW4gPFZBUj5jPC9WQVI+IGlzIGtub3duIHRvIGJlIGFuIHVwcGVyY2FzZSBjaGFyYWN0ZXIgKDxDT0RFPkE8L0NPREU+LS08Q09ERT5aPC9DT0RFPikuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICA8Q09ERT50b2xvd2VyPC9DT0RFPiByZXR1cm5zIHRoZSBsb3dlcmNhc2UgZXF1aXZhbGVudCBvZiA8VkFSPmM8L1ZBUj4gd2hlbiBpdCBpcyBhCiAgICAgICAgIGNoYXJhY3RlciBiZXR3ZWVuIDxDT0RFPkE8L0NPREU+IGFuZCA8Q09ERT5aPC9DT0RFPiwgYW5kIDxWQVI+YzwvVkFSPiBvdGhlcndpc2UuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPl90b2xvd2VyPC9DT0RFPiByZXR1cm5zIHRoZSBsb3dlcmNhc2UgZXF1aXZhbGVudCBvZiA8VkFSPmM8L1ZBUj4gd2hlbiBpdCBpcyBhCiAgICAgICAgIGNoYXJhY3RlciBiZXR3ZWVuIDxDT0RFPkE8L0NPREU+IGFuZCA8Q09ERT5aPC9DT0RFPi4gIElmIDxWQVI+YzwvVkFSPiBpcyBub3Qgb25lIG9mIHRoZXNlCiAgICAgICAgIGNoYXJhY3RlcnMsIHRoZSBiZWhhdmlvdXIgb2YgPENPREU+X3RvbG93ZXI8L0NPREU+IGlzIHVuZGVmaW5lZC4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICA8Q09ERT50b2xvd2VyPC9DT0RFPiBpcyBBTlNJIEMuICA8Q09ERT5fdG9sb3dlcjwvQ09ERT4gaXMgbm90IHJlY29tbWVuZGVkIGZvciBwb3J0YWJsZQogICAgICAgICBwcm9ncmFtcy4KICAgICAgICAgPGJyPjxicj4gTm8gc3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcyBhcmUgcmVxdWlyZWQuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAHY3R5cGUuaHhxAH4CfXQABWludCBjdAAEaW50IHQACF90b3VwcGVyc3EAfgAKcHQFWwogICAgICAgIDxDT0RFPnRvdXBwZXI8L0NPREU+IGlzIGEgbWFjcm8gd2hpY2ggY29udmVydHMgbG93ZXJjYXNlIGNoYXJhY3RlcnMgdG8gdXBwZXJjYXNlLAogICAgICAgICBsZWF2aW5nIGFsbCBvdGhlciBjaGFyYWN0ZXJzIHVuY2hhbmdlZC4gIEl0IGlzIG9ubHkgZGVmaW5lZCB3aGVuCiAgICAgICAgIDxWQVI+YzwvVkFSPiBpcyBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSA8Q09ERT5FT0Y8L0NPREU+IHRvIDxDT0RFPjI1NTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFlvdSBjYW4gdXNlIGEgY29tcGlsZWQgc3Vicm91dGluZSBpbnN0ZWFkIG9mIHRoZSBtYWNybyBkZWZpbml0aW9uIGJ5CiAgICAgICAgIHVuZGVmaW5pbmcgdGhpcyBtYWNybyB1c2luZyBgPENPREU+I3VuZGVmIHRvdXBwZXI8L0NPREU+Jy4KICAgICAgICAgPGJyPjxicj4gPENPREU+X3RvdXBwZXI8L0NPREU+IHBlcmZvcm1zIHRoZSBzYW1lIGNvbnZlcnNpb24gYXMgPENPREU+dG91cHBlcjwvQ09ERT4sIGJ1dCBzaG91bGQKICAgICAgICAgb25seSBiZSB1c2VkIHdoZW4gPFZBUj5jPC9WQVI+IGlzIGtub3duIHRvIGJlIGEgbG93ZXJjYXNlIGNoYXJhY3RlciAoPENPREU+YTwvQ09ERT4tLTxDT0RFPno8L0NPREU+KS4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIDxDT0RFPnRvdXBwZXI8L0NPREU+IHJldHVybnMgdGhlIHVwcGVyY2FzZSBlcXVpdmFsZW50IG9mIDxWQVI+YzwvVkFSPiB3aGVuIGl0IGlzIGEKICAgICAgICAgY2hhcmFjdGVyIGJldHdlZW4gPENPREU+YTwvQ09ERT4gYW5kIDxDT0RFPno8L0NPREU+LCBhbmQgPFZBUj5jPC9WQVI+IG90aGVyd2lzZS4KICAgICAgICAgPGJyPjxicj4gPENPREU+X3RvdXBwZXI8L0NPREU+IHJldHVybnMgdGhlIHVwcGVyY2FzZSBlcXVpdmFsZW50IG9mIDxWQVI+YzwvVkFSPiB3aGVuIGl0IGlzIGEKICAgICAgICAgY2hhcmFjdGVyIGJldHdlZW4gPENPREU+YTwvQ09ERT4gYW5kIDxDT0RFPno8L0NPREU+LiAgSWYgPFZBUj5jPC9WQVI+IGlzIG5vdCBvbmUgb2YgdGhlc2UKICAgICAgICAgY2hhcmFjdGVycywgdGhlIGJlaGF2aW91ciBvZiA8Q09ERT5fdG91cHBlcjwvQ09ERT4gaXMgdW5kZWZpbmVkLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIDxDT0RFPnRvdXBwZXI8L0NPREU+IGlzIEFOU0kgQy4gIDxDT0RFPl90b3VwcGVyPC9DT0RFPiBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHBvcnRhYmxlIHByb2dyYW1zLgogICAgICAgICA8YnI+PGJyPiBObyBzdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzIGFyZSByZXF1aXJlZC4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAdjdHlwZS5oeHEAfgKEdAAFaW50IGN0AARpbnQgdAAIX3R6c2V0X3JzcQB+AApwdAkICiAgICAgICAgPENPREU+dHpzZXQ8L0NPREU+IGV4YW1pbmVzIHRoZSBUWiBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgc2V0cyB1cCB0aGUgdGhyZWUKICAgICAgICAgZXh0ZXJuYWwgdmFyaWFibGVzOiA8Q09ERT5fdGltZXpvbmU8L0NPREU+LCA8Q09ERT5fZGF5bGlnaHQ8L0NPREU+LCBhbmQgPENPREU+dHpuYW1lPC9DT0RFPi4gIFRoZQogICAgICAgICB2YWx1ZSBvZiA8Q09ERT5fdGltZXpvbmU8L0NPREU+IHNoYWxsIGJlIHRoZSBvZmZzZXQgZnJvbSB0aGUgY3VycmVudCB0aW1lIHpvbmUKICAgICAgICAgdG8gR01ULiAgVGhlIHZhbHVlIG9mIDxDT0RFPl9kYXlsaWdodDwvQ09ERT4gc2hhbGwgYmUgMCBpZiB0aGVyZSBpcyBubyBkYXlsaWdodAogICAgICAgICBzYXZpbmdzIHRpbWUgZm9yIHRoZSBjdXJyZW50IHRpbWUgem9uZSwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgbm9uLXplcm8uCiAgICAgICAgIFRoZSA8Q09ERT50em5hbWU8L0NPREU+IGFycmF5IGhhcyB0d28gZW50cmllczogdGhlIGZpcnN0IGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICBzdGFuZGFyZCB0aW1lIHpvbmUsIHRoZSBzZWNvbmQgaXMgdGhlIG5hbWUgb2YgdGhlIGRheWxpZ2h0LXNhdmluZ3MgdGltZQogICAgICAgICB6b25lLgogICAgICAgICA8YnI+PGJyPiBUaGUgVFogZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gdGhlIGZvbGxvd2luZyBQT1NJWAogICAgICAgICBmb3JtYXQ6CiAgICAgICAgIDxicj48YnI+IHN0ZG9mZnNldDFbZHN0W29mZnNldDJdWyxzdGFydFsvdGltZTFdLGVuZFsvdGltZTJdXV0KICAgICAgICAgPGJyPjxicj4gd2hlcmU6IHN0ZCBpcyB0aGUgbmFtZSBvZiB0aGUgc3RhbmRhcmQgdGltZS16b25lIChtaW5pbXVtIDMgY2hhcnMpCiAgICAgICAgIG9mZnNldDEgaXMgdGhlIHZhbHVlIHRvIGFkZCB0byBsb2NhbCB0aW1lIHRvIGFycml2ZSBhdCBVbml2ZXJzYWwgdGltZQogICAgICAgICBpdCBoYXMgdGhlIGZvcm06ICBoaFs6bW1bOnNzXV0KICAgICAgICAgZHN0IGlzIHRoZSBuYW1lIG9mIHRoZSBhbHRlcm5hdGUgKGRheWxpZ2h0LXNhdmluZ3MpIHRpbWUtem9uZSAobWluIDMgY2hhcnMpCiAgICAgICAgIG9mZnNldDIgaXMgdGhlIHZhbHVlIHRvIGFkZCB0byBsb2NhbCB0aW1lIHRvIGFycml2ZSBhdCBVbml2ZXJzYWwgdGltZQogICAgICAgICBpdCBoYXMgdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBzdGQgb2Zmc2V0CiAgICAgICAgIHN0YXJ0IGlzIHRoZSBkYXkgdGhhdCB0aGUgYWx0ZXJuYXRlIHRpbWUtem9uZSBzdGFydHMKICAgICAgICAgdGltZTEgaXMgdGhlIG9wdGlvbmFsIHRpbWUgdGhhdCB0aGUgYWx0ZXJuYXRlIHRpbWUtem9uZSBzdGFydHMKICAgICAgICAgKHRoaXMgaXMgaW4gbG9jYWwgdGltZSBhbmQgZGVmYXVsdHMgdG8gMDI6MDA6MDAgaWYgbm90IHNwZWNpZmllZCkKICAgICAgICAgZW5kIGlzIHRoZSBkYXkgdGhhdCB0aGUgYWx0ZXJuYXRlIHRpbWUtem9uZSBlbmRzCiAgICAgICAgIHRpbWUyIGlzIHRoZSB0aW1lIHRoYXQgdGhlIGFsdGVybmF0ZSB0aW1lLXpvbmUgZW5kcwogICAgICAgICAoaXQgaXMgaW4gbG9jYWwgdGltZSBhbmQgZGVmYXVsdHMgdG8gMDI6MDA6MDAgaWYgbm90IHNwZWNpZmllZCkKICAgICAgICAgPGJyPjxicj4gTm90ZSB0aGF0IHRoZXJlIGlzIG5vIHdoaXRlLXNwYWNlIHBhZGRpbmcgYmV0d2VlbiBmaWVsZHMuICBBbHNvIG5vdGUgdGhhdAogICAgICAgICBpZiBUWiBpcyBudWxsLCB0aGUgZGVmYXVsdCBpcyBVbml2ZXJzYWwgR01UIHdoaWNoIGhhcyBubyBkYXlsaWdodC1zYXZpbmdzCiAgICAgICAgIHRpbWUuICBJZiBUWiBpcyBlbXB0eSwgdGhlIGRlZmF1bHQgRVNUNUVEVCBpcyB1c2VkLgogICAgICAgICA8YnI+PGJyPiBUaGUgZnVuY3Rpb24gPENPREU+X3R6c2V0X3I8L0NPREU+IGlzIGlkZW50aWNhbCB0byA8Q09ERT50enNldDwvQ09ERT4gb25seSBpdCBpcyByZWVudHJhbnQKICAgICAgICAgYW5kIGlzIHVzZWQgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IHVzZSBtdWx0aXBsZSB0aHJlYWRzLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIDxDT0RFPnR6c2V0PC9DT0RFPiBpcyBwYXJ0IG9mIHRoZSBQT1NJWCBzdGFuZGFyZC4KICAgICAgICAgPGJyPjxicj4gU3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lIHJlcXVpcmVkOiBOb25lCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAGdGltZS5oeHEAfgKLdAAPc3RydWN0IF9yZWVudCAqdAAFdm9pZCB0AAlfdW5nZXRjX3JzcQB+AApwdAXOCiAgICAgICAgPENPREU+dW5nZXRjPC9DT0RFPiBpcyB1c2VkIHRvIHJldHVybiBieXRlcyBiYWNrIHRvIDxWQVI+c3RyZWFtPC9WQVI+IHRvIGJlIHJlYWQgYWdhaW4uCiAgICAgICAgIElmIDxWQVI+YzwvVkFSPiBpcyBFT0YsIHRoZSBzdHJlYW0gaXMgdW5jaGFuZ2VkLiAgT3RoZXJ3aXNlLCB0aGUgdW5zaWduZWQKICAgICAgICAgY2hhciA8VkFSPmM8L1ZBUj4gaXMgcHV0IGJhY2sgb24gdGhlIHN0cmVhbSwgYW5kIHN1YnNlcXVlbnQgcmVhZHMgd2lsbCBzZWUKICAgICAgICAgdGhlIGJ5dGVzIHB1c2hlZCBiYWNrIGluIHJldmVyc2Ugb3JkZXIuICBQdXNoZWQgYnllcyBhcmUgbG9zdCBpZiB0aGUKICAgICAgICAgc3RyZWFtIGlzIHJlcG9zaXRpb25lZCwgc3VjaCBhcyBieSA8Q09ERT5mc2VlazwvQ09ERT4sIDxDT0RFPmZzZXRwb3M8L0NPREU+LCBvcgogICAgICAgICA8Q09ERT5yZXdpbmQ8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBUaGUgdW5kZXJseWluZyBmaWxlIGlzIG5vdCBjaGFuZ2VkLCBidXQgaXQgaXMgcG9zc2libGUgdG8gcHVzaCBiYWNrCiAgICAgICAgIHNvbWV0aGluZyBkaWZmZXJlbnQgdGhhbiB3aGF0IHdhcyBvcmlnaW5hbGx5IHJlYWQuICBVbmdldHRpbmcgYQogICAgICAgICBjaGFyYWN0ZXIgd2lsbCBjbGVhciB0aGUgZW5kLW9mLXN0cmVhbSBtYXJrZXIsIGFuZCBkZWNyZW1lbnQgdGhlIGZpbGUKICAgICAgICAgcG9zaXRpb24gaW5kaWNhdG9yLiAgUHVzaGluZyBiYWNrIGJleW9uZCB0aGUgYmVnaW5uaW5nIG9mIGEgZmlsZSBnaXZlcwogICAgICAgICB1bnNwZWNpZmllZCBiZWhhdmlvci4KICAgICAgICAgPGJyPjxicj4gVGhlIGFsdGVybmF0ZSBmdW5jdGlvbiA8Q09ERT5fdW5nZXRjX3I8L0NPREU+IGlzIGEgcmVlbnRyYW50IHZlcnNpb24uICBUaGUKICAgICAgICAgZXh0cmEgYXJndW1lbnQgPFZBUj5yZWVudDwvVkFSPiBpcyBhIHBvaW50ZXIgdG8gYSByZWVudHJhbmN5IHN0cnVjdHVyZS4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIFRoZSBjaGFyYWN0ZXIgcHVzaGVkIGJhY2ssIG9yIDxDT0RFPkVPRjwvQ09ERT4gb24gZXJyb3IuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgQU5TSSBDIHJlcXVpcmVzIDxDT0RFPnVuZ2V0YzwvQ09ERT4sIGJ1dCBvbmx5IHJlcXVpcmVzIGEgcHVzaGJhY2sgYnVmZmVyIG9mIG9uZQogICAgICAgICBieXRlOyBhbHRob3VnaCB0aGlzIGltcGxlbWVudGF0aW9uIGNhbiBoYW5kbGUgbXVsdGlwbGUgYnl0ZXMsIG5vdCBhbGwKICAgICAgICAgY2FuLiAgUHVzaGluZyBiYWNrIGEgc2lnbmVkIGNoYXIgaXMgYSBjb21tb24gYXBwbGljYXRpb24gYnVnLgogICAgICAgICA8YnI+PGJyPiBTdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzIHJlcXVpcmVkOiA8Q09ERT5zYnJrPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAdzdGRpby5oeHEAfgKSdAApc3RydWN0IF9yZWVudCAqcmVlbnQsIGludCBjLCBGSUxFICpzdHJlYW10AARpbnQgdAANX3Zhc2lwcmludGZfcnNxAH4ACnB0BVAKICAgICAgICA8Q09ERT52aXByaW50ZjwvQ09ERT4sIDxDT0RFPnZmaXByaW50ZjwvQ09ERT4sIDxDT0RFPnZhc2lwcmludGY8L0NPREU+LCA8Q09ERT52c2lwcmludGY8L0NPREU+LAogICAgICAgICA8Q09ERT52c25pcHJpbnRmPC9DT0RFPiwgYW5kIDxDT0RFPnZhc25pcHJpbnRmPC9DT0RFPiBhcmUgKHJlc3BlY3RpdmVseSkgdmFyaWFudHMgb2YKICAgICAgICAgPENPREU+aXByaW50ZjwvQ09ERT4sIDxDT0RFPmZpcHJpbnRmPC9DT0RFPiwgPENPREU+YXNpcHJpbnRmPC9DT0RFPiwgPENPREU+c2lwcmludGY8L0NPREU+LCA8Q09ERT5zbmlwcmludGY8L0NPREU+LAogICAgICAgICBhbmQgPENPREU+YXNuaXByaW50ZjwvQ09ERT4uICBUaGV5IGRpZmZlciBvbmx5IGluIGFsbG93aW5nIHRoZWlyIGNhbGxlciB0byBwYXNzCiAgICAgICAgIHRoZSB2YXJpYWJsZSBhcmd1bWVudCBsaXN0IGFzIGEgPENPREU+dmFfbGlzdDwvQ09ERT4gb2JqZWN0IChpbml0aWFsaXplZCBieQogICAgICAgICA8Q09ERT52YV9zdGFydDwvQ09ERT4pIHJhdGhlciB0aGFuIGRpcmVjdGx5IGFjY2VwdGluZyBhIHZhcmlhYmxlIG51bWJlciBvZgogICAgICAgICBhcmd1bWVudHMuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIDxDT0RFPnZhX2VuZDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxDT0RFPl92aXByaW50Zl9yPC9DT0RFPiwgPENPREU+X3ZmaXByaW50Zl9yPC9DT0RFPiwgPENPREU+X3Zhc2lwcmludGZfcjwvQ09ERT4sCiAgICAgICAgIDxDT0RFPl92c2lwcmludGZfcjwvQ09ERT4sIDxDT0RFPl92c25pcHJpbnRmX3I8L0NPREU+LCBhbmQgPENPREU+X3Zhc25pcHJpbnRmX3I8L0NPREU+IGFyZQogICAgICAgICByZWVudHJhbnQgdmVyc2lvbnMgb2YgdGhlIGFib3ZlLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgVGhlIHJldHVybiB2YWx1ZXMgYXJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbnM6CiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgQWxsIG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgbmV3bGliIGV4dGVuc2lvbnMuCiAgICAgICAgIDxicj48YnI+IFN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMgcmVxdWlyZWQ6IDxDT0RFPmNsb3NlPC9DT0RFPiwgPENPREU+ZnN0YXQ8L0NPREU+LCA8Q09ERT5pc2F0dHk8L0NPREU+LAogICAgICAgICA8Q09ERT5sc2VlazwvQ09ERT4sIDxDT0RFPnJlYWQ8L0NPREU+LCA8Q09ERT5zYnJrPC9DT0RFPiwgPENPREU+d3JpdGU8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAncEAAAACnQAB3N0ZGlvLmh0AAhzdGRhcmcuaHhxAH4CmXQAPnN0cnVjdCBfcmVlbnQgKnJlZW50LCBjaGFyICoqc3RyLGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBsaXN0dAAEaW50IHQADl92YXNuaXByaW50Zl9yc3EAfgAKcHEAfgKbc3EAfgAPAAAAAncEAAAACnQAB3N0ZGlvLmh0AAhzdGRhcmcuaHhxAH4CoXQAS3N0cnVjdCBfcmVlbnQgKnJlZW50LCBjaGFyICpzdHIsc2l6ZV90ICpzaXplLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgbGlzdHQABmNoYXIgKnQADV92YXNucHJpbnRmX3JzcQB+AApwdAW5CiAgICAgICAgPENPREU+dnByaW50ZjwvQ09ERT4sIDxDT0RFPnZmcHJpbnRmPC9DT0RFPiwgPENPREU+dmFzcHJpbnRmPC9DT0RFPiwgPENPREU+dnNwcmludGY8L0NPREU+LCA8Q09ERT52c25wcmludGY8L0NPREU+LAogICAgICAgICBhbmQgPENPREU+dmFzbnByaW50ZjwvQ09ERT4gYXJlIChyZXNwZWN0aXZlbHkpIHZhcmlhbnRzIG9mIDxDT0RFPnByaW50ZjwvQ09ERT4sCiAgICAgICAgIDxDT0RFPmZwcmludGY8L0NPREU+LCA8Q09ERT5hc3ByaW50ZjwvQ09ERT4sIDxDT0RFPnNwcmludGY8L0NPREU+LCA8Q09ERT5zbnByaW50ZjwvQ09ERT4sIGFuZAogICAgICAgICA8Q09ERT5hc25wcmludGY8L0NPREU+LiAgVGhleSBkaWZmZXIgb25seSBpbiBhbGxvd2luZyB0aGVpciBjYWxsZXIgdG8gcGFzcyB0aGUKICAgICAgICAgdmFyaWFibGUgYXJndW1lbnQgbGlzdCBhcyBhIDxDT0RFPnZhX2xpc3Q8L0NPREU+IG9iamVjdCAoaW5pdGlhbGl6ZWQgYnkKICAgICAgICAgPENPREU+dmFfc3RhcnQ8L0NPREU+KSByYXRoZXIgdGhhbiBkaXJlY3RseSBhY2NlcHRpbmcgYSB2YXJpYWJsZSBudW1iZXIgb2YKICAgICAgICAgYXJndW1lbnRzLiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyA8Q09ERT52YV9lbmQ8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5fdnByaW50Zl9yPC9DT0RFPiwgPENPREU+X3ZmcHJpbnRmX3I8L0NPREU+LCA8Q09ERT5fdmFzcHJpbnRmX3I8L0NPREU+LCA8Q09ERT5fdnNwcmludGZfcjwvQ09ERT4sCiAgICAgICAgIDxDT0RFPl92c25wcmludGZfcjwvQ09ERT4sIGFuZCA8Q09ERT5fdmFzbnByaW50Zl9yPC9DT0RFPiBhcmUgcmVlbnRyYW50IHZlcnNpb25zIG9mIHRoZQogICAgICAgICBhYm92ZS4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIFRoZSByZXR1cm4gdmFsdWVzIGFyZSBjb25zaXN0ZW50IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb25zLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIEFOU0kgQyByZXF1aXJlcyA8Q09ERT52cHJpbnRmPC9DT0RFPiwgPENPREU+dmZwcmludGY8L0NPREU+LCA8Q09ERT52c3ByaW50ZjwvQ09ERT4sIGFuZAogICAgICAgICA8Q09ERT52c25wcmludGY8L0NPREU+LiAgVGhlIHJlbWFpbmluZyBmdW5jdGlvbnMgYXJlIG5ld2xpYiBleHRlbnNpb25zLgogICAgICAgICA8YnI+PGJyPiBTdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzIHJlcXVpcmVkOiA8Q09ERT5jbG9zZTwvQ09ERT4sIDxDT0RFPmZzdGF0PC9DT0RFPiwgPENPREU+aXNhdHR5PC9DT0RFPiwKICAgICAgICAgPENPREU+bHNlZWs8L0NPREU+LCA8Q09ERT5yZWFkPC9DT0RFPiwgPENPREU+c2JyazwvQ09ERT4sIDxDT0RFPndyaXRlPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAJ3BAAAAAp0AAdzdGRpby5odAAIc3RkYXJnLmh4cQB+Aqh0AEtzdHJ1Y3QgX3JlZW50ICpyZWVudCwgY2hhciAqc3RyLHNpemVfdCAqc2l6ZSwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGxpc3R0AAZjaGFyICp0AAxfdmFzcHJpbnRmX3JzcQB+AApwcQB+AqpzcQB+AA8AAAACdwQAAAAKdAAHc3RkaW8uaHQACHN0ZGFyZy5oeHEAfgKwdAA+c3RydWN0IF9yZWVudCAqcmVlbnQsIGNoYXIgKipzdHIsY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGxpc3R0AARpbnQgdAAMX3ZkaXByaW50Zl9yc3EAfgAKcHEAfgB3c3EAfgAPAAAAAncEAAAACnQAB3N0ZGlvLmh0AAhzdGRhcmcuaHhxAH4Ct3QAOXN0cnVjdCBfcmVlbnQgKnB0ciwgaW50IGZkLGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcHQABGludCB0AAtfdmRwcmludGZfcnNxAH4ACnBxAH4Af3NxAH4ADwAAAAJ3BAAAAAp0AAdzdGRpby5odAAIc3RkYXJnLmh4cQB+Ar50ADlzdHJ1Y3QgX3JlZW50ICpwdHIsIGludCBmZCxjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXB0AARpbnQgdAAMX3ZmaXByaW50Zl9yc3EAfgAKcHEAfgKbc3EAfgAPAAAAAncEAAAACnQAB3N0ZGlvLmh0AAhzdGRhcmcuaHhxAH4CxXQAPHN0cnVjdCBfcmVlbnQgKnJlZW50LCBGSUxFICpmcCxjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgbGlzdHQABGludCB0AAtfdmZpc2NhbmZfcnNxAH4ACnB0BVQKICAgICAgICA8Q09ERT52aXNjYW5mPC9DT0RFPiwgPENPREU+dmZpc2NhbmY8L0NPREU+LCBhbmQgPENPREU+dnNpc2NhbmY8L0NPREU+IGFyZSAocmVzcGVjdGl2ZWx5KSB2YXJpYW50cwogICAgICAgICBvZiA8Q09ERT5pc2NhbmY8L0NPREU+LCA8Q09ERT5maXNjYW5mPC9DT0RFPiwgYW5kIDxDT0RFPnNpc2NhbmY8L0NPREU+LiAgVGhleSBkaWZmZXIgb25seSBpbiAKICAgICAgICAgYWxsb3dpbmcgdGhlaXIgY2FsbGVyIHRvIHBhc3MgdGhlIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3QgYXMgYSAKICAgICAgICAgPENPREU+dmFfbGlzdDwvQ09ERT4gb2JqZWN0IChpbml0aWFsaXplZCBieSA8Q09ERT52YV9zdGFydDwvQ09ERT4pIHJhdGhlciB0aGFuIAogICAgICAgICBkaXJlY3RseSBhY2NlcHRpbmcgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgVGhlIHJldHVybiB2YWx1ZXMgYXJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbnM6CiAgICAgICAgIDxDT0RFPnZpc2NhbmY8L0NPREU+IHJldHVybnMgdGhlIG51bWJlciBvZiBpbnB1dCBmaWVsZHMgc3VjY2Vzc2Z1bGx5IHNjYW5uZWQsCiAgICAgICAgIGNvbnZlcnRlZCwgYW5kIHN0b3JlZDsgdGhlIHJldHVybiB2YWx1ZSBkb2VzIG5vdCBpbmNsdWRlIHNjYW5uZWQKICAgICAgICAgZmllbGRzIHdoaWNoIHdlcmUgbm90IHN0b3JlZC4gIAogICAgICAgICA8YnI+PGJyPiBJZiA8Q09ERT52aXNjYW5mPC9DT0RFPiBhdHRlbXB0cyB0byByZWFkIGF0IGVuZC1vZi1maWxlLCB0aGUgcmV0dXJuIHZhbHVlIAogICAgICAgICBpcyA8Q09ERT5FT0Y8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBJZiBubyBmaWVsZHMgd2VyZSBzdG9yZWQsIHRoZSByZXR1cm4gdmFsdWUgaXMgPENPREU+MDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFRoZSByb3V0aW5lcyA8Q09ERT5fdmlzY2FuZl9yPC9DT0RFPiwgPENPREU+X3ZmaXNjYW5mX2Y8L0NPREU+LCBhbmQgPENPREU+X3ZzaXNjYW5mX3I8L0NPREU+IGFyZQogICAgICAgICByZWVudHJhbnQgdmVyc2lvbnMgd2hpY2ggdGFrZSBhbiBhZGRpdGlvbmFsIGZpcnN0IHBhcmFtZXRlciB3aGljaCBwb2ludHMgdG8gdGhlCiAgICAgICAgIHJlZW50cmFuY3kgc3RydWN0dXJlLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIFRoZXNlIGFyZSBuZXdsaWIgZXh0ZW5zaW9ucy4KICAgICAgICAgPGJyPjxicj4gU3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcyByZXF1aXJlZDoKICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAJ3BAAAAAp0AAdzdGRpby5odAAIc3RkYXJnLmh4cQB+Asx0ADxzdHJ1Y3QgX3JlZW50ICpyZWVudCwgRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZtdCx2YV9saXN0IGxpc3R0AARpbnQgdAALX3ZmcHJpbnRmX3JzcQB+AApwcQB+AqpzcQB+AA8AAAACdwQAAAAKdAAHc3RkaW8uaHQACHN0ZGFyZy5oeHEAfgLUdAA8c3RydWN0IF9yZWVudCAqcmVlbnQsIEZJTEUgKmZwLGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBsaXN0dAAEaW50IHQACl92ZnNjYW5mX3JzcQB+AApwdAVACiAgICAgICAgPENPREU+dnNjYW5mPC9DT0RFPiwgPENPREU+dmZzY2FuZjwvQ09ERT4sIGFuZCA8Q09ERT52c3NjYW5mPC9DT0RFPiBhcmUgKHJlc3BlY3RpdmVseSkgdmFyaWFudHMKICAgICAgICAgb2YgPENPREU+c2NhbmY8L0NPREU+LCA8Q09ERT5mc2NhbmY8L0NPREU+LCBhbmQgPENPREU+c3NjYW5mPC9DT0RFPi4gIFRoZXkgZGlmZmVyIG9ubHkgaW4KICAgICAgICAgYWxsb3dpbmcgdGhlaXIgY2FsbGVyIHRvIHBhc3MgdGhlIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3QgYXMgYQogICAgICAgICA8Q09ERT52YV9saXN0PC9DT0RFPiBvYmplY3QgKGluaXRpYWxpemVkIGJ5IDxDT0RFPnZhX3N0YXJ0PC9DT0RFPikgcmF0aGVyIHRoYW4KICAgICAgICAgZGlyZWN0bHkgYWNjZXB0aW5nIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIFRoZSByZXR1cm4gdmFsdWVzIGFyZSBjb25zaXN0ZW50IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb25zOgogICAgICAgICA8Q09ERT52c2NhbmY8L0NPREU+IHJldHVybnMgdGhlIG51bWJlciBvZiBpbnB1dCBmaWVsZHMgc3VjY2Vzc2Z1bGx5IHNjYW5uZWQsCiAgICAgICAgIGNvbnZlcnRlZCwgYW5kIHN0b3JlZDsgdGhlIHJldHVybiB2YWx1ZSBkb2VzIG5vdCBpbmNsdWRlIHNjYW5uZWQKICAgICAgICAgZmllbGRzIHdoaWNoIHdlcmUgbm90IHN0b3JlZC4KICAgICAgICAgPGJyPjxicj4gSWYgPENPREU+dnNjYW5mPC9DT0RFPiBhdHRlbXB0cyB0byByZWFkIGF0IGVuZC1vZi1maWxlLCB0aGUgcmV0dXJuIHZhbHVlCiAgICAgICAgIGlzIDxDT0RFPkVPRjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IElmIG5vIGZpZWxkcyB3ZXJlIHN0b3JlZCwgdGhlIHJldHVybiB2YWx1ZSBpcyA8Q09ERT4wPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gVGhlIHJvdXRpbmVzIDxDT0RFPl92c2NhbmZfcjwvQ09ERT4sIDxDT0RFPl92ZnNjYW5mX2Y8L0NPREU+LCBhbmQgPENPREU+X3Zzc2NhbmZfcjwvQ09ERT4gYXJlCiAgICAgICAgIHJlZW50cmFudCB2ZXJzaW9ucyB3aGljaCB0YWtlIGFuIGFkZGl0aW9uYWwgZmlyc3QgcGFyYW1ldGVyIHdoaWNoIHBvaW50cyB0byB0aGUKICAgICAgICAgcmVlbnRyYW5jeSBzdHJ1Y3R1cmUuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgVGhlc2UgYXJlIEdOVSBleHRlbnNpb25zLgogICAgICAgICA8YnI+PGJyPiBTdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzIHJlcXVpcmVkOgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAncEAAAACnQAB3N0ZGlvLmh0AAhzdGRhcmcuaHhxAH4C23QAPHN0cnVjdCBfcmVlbnQgKnJlZW50LCBGSUxFICpmcCwgY29uc3QgY2hhciAqZm10LHZhX2xpc3QgbGlzdHQABGludCB0AAtfdmlwcmludGZfcnNxAH4ACnBxAH4Cm3NxAH4ADwAAAAJ3BAAAAAp0AAdzdGRpby5odAAIc3RkYXJnLmh4cQB+AuN0ADJzdHJ1Y3QgX3JlZW50ICpyZWVudCwgY29uc3QgY2hhciAqZm10LHZhX2xpc3QgbGlzdHQABGludCB0AApfdmlzY2FuZl9yc3EAfgAKcHEAfgLOc3EAfgAPAAAAAncEAAAACnQAB3N0ZGlvLmh0AAhzdGRhcmcuaHhxAH4C6nQAMnN0cnVjdCBfcmVlbnQgKnJlZW50LCBjb25zdCBjaGFyICpmbXQsdmFfbGlzdCBsaXN0dAAEaW50IHQACl92cHJpbnRmX3JzcQB+AApwcQB+AqpzcQB+AA8AAAACdwQAAAAKdAAHc3RkaW8uaHQACHN0ZGFyZy5oeHEAfgLxdAAyc3RydWN0IF9yZWVudCAqcmVlbnQsIGNvbnN0IGNoYXIgKmZtdCx2YV9saXN0IGxpc3R0AARpbnQgdAAJX3ZzY2FuZl9yc3EAfgAKcHEAfgLdc3EAfgAPAAAAAncEAAAACnQAB3N0ZGlvLmh0AAhzdGRhcmcuaHhxAH4C+HQAMnN0cnVjdCBfcmVlbnQgKnJlZW50LCBjb25zdCBjaGFyICpmbXQsdmFfbGlzdCBsaXN0dAAEaW50IHQADF92c2lwcmludGZfcnNxAH4ACnBxAH4Cm3NxAH4ADwAAAAJ3BAAAAAp0AAdzdGRpby5odAAIc3RkYXJnLmh4cQB+Av90AD1zdHJ1Y3QgX3JlZW50ICpyZWVudCwgY2hhciAqc3RyLGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBsaXN0dAAEaW50IHQAC192c2lzY2FuZl9yc3EAfgAKcHEAfgLOc3EAfgAPAAAAAncEAAAACnQAB3N0ZGlvLmh0AAhzdGRhcmcuaHhxAH4DBnQAQ3N0cnVjdCBfcmVlbnQgKnJlZW50LCBjb25zdCBjaGFyICpzdHIsY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGxpc3R0AARpbnQgdAANX3ZzbmlwcmludGZfcnNxAH4ACnBxAH4Cm3NxAH4ADwAAAAJ3BAAAAAp0AAdzdGRpby5odAAIc3RkYXJnLmh4cQB+Aw10AEpzdHJ1Y3QgX3JlZW50ICpyZWVudCwgY2hhciAqc3RyLHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgbGlzdHQABGludCB0AAxfdnNucHJpbnRmX3JzcQB+AApwcQB+AqpzcQB+AA8AAAACdwQAAAAKdAAHc3RkaW8uaHQACHN0ZGFyZy5oeHEAfgMUdABKc3RydWN0IF9yZWVudCAqcmVlbnQsIGNoYXIgKnN0cixzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGxpc3R0AARpbnQgdAALX3ZzcHJpbnRmX3JzcQB+AApwcQB+AqpzcQB+AA8AAAACdwQAAAAKdAAHc3RkaW8uaHQACHN0ZGFyZy5oeHEAfgMbdAA9c3RydWN0IF9yZWVudCAqcmVlbnQsIGNoYXIgKnN0cixjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgbGlzdHQABGludCB0AApfdnNzY2FuZl9yc3EAfgAKcHEAfgLdc3EAfgAPAAAAAncEAAAACnQAB3N0ZGlvLmh0AAhzdGRhcmcuaHhxAH4DInQAQ3N0cnVjdCBfcmVlbnQgKnJlZW50LCBjb25zdCBjaGFyICpzdHIsY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGxpc3R0AARpbnQgdAAJX3djc3RvbF9yc3EAfgAKcHQNgAogICAgICAgIFRoZSBmdW5jdGlvbiA8Q09ERT53Y3N0b2w8L0NPREU+IGNvbnZlcnRzIHRoZSB3aWRlIHN0cmluZyA8Q09ERT4qPFZBUj5zPC9WQVI+PC9DT0RFPiB0bwogICAgICAgICBhIDxDT0RFPmxvbmc8L0NPREU+LiBGaXJzdCwgaXQgYnJlYWtzIGRvd24gdGhlIHN0cmluZyBpbnRvIHRocmVlIHBhcnRzOgogICAgICAgICBsZWFkaW5nIHdoaXRlc3BhY2UsIHdoaWNoIGlzIGlnbm9yZWQ7IGEgc3ViamVjdCBzdHJpbmcgY29uc2lzdGluZwogICAgICAgICBvZiBjaGFyYWN0ZXJzIHJlc2VtYmxpbmcgYW4gaW50ZWdlciBpbiB0aGUgcmFkaXggc3BlY2lmaWVkIGJ5IDxWQVI+YmFzZTwvVkFSPjsKICAgICAgICAgYW5kIGEgdHJhaWxpbmcgcG9ydGlvbiBjb25zaXN0aW5nIG9mIHplcm8gb3IgbW9yZSB1bnBhcnNlYWJsZSBjaGFyYWN0ZXJzLAogICAgICAgICBhbmQgYWx3YXlzIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIuIFRoZW4sIGl0IGF0dGVtcHRzCiAgICAgICAgIHRvIGNvbnZlcnQgdGhlIHN1YmplY3Qgc3RyaW5nIGludG8gYSA8Q09ERT5sb25nPC9DT0RFPiBhbmQgcmV0dXJucyB0aGUKICAgICAgICAgcmVzdWx0LgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgdmFsdWUgb2YgPFZBUj5iYXNlPC9WQVI+IGlzIDAsIHRoZSBzdWJqZWN0IHN0cmluZyBpcyBleHBlY3RlZCB0byBsb29rCiAgICAgICAgIGxpa2UgYSBub3JtYWwgQyBpbnRlZ2VyIGNvbnN0YW50OiBhbiBvcHRpb25hbCBzaWduLCBhIHBvc3NpYmxlIGA8Q09ERT4weDwvQ09ERT4nCiAgICAgICAgIGluZGljYXRpbmcgYSBoZXhhZGVjaW1hbCBiYXNlLCBhbmQgYSBudW1iZXIuIElmIDxWQVI+YmFzZTwvVkFSPiBpcyBiZXR3ZWVuCiAgICAgICAgIDIgYW5kIDM2LCB0aGUgZXhwZWN0ZWQgZm9ybSBvZiB0aGUgc3ViamVjdCBpcyBhIHNlcXVlbmNlIG9mIGxldHRlcnMKICAgICAgICAgYW5kIGRpZ2l0cyByZXByZXNlbnRpbmcgYW4gaW50ZWdlciBpbiB0aGUgcmFkaXggc3BlY2lmaWVkIGJ5IDxWQVI+YmFzZTwvVkFSPiwKICAgICAgICAgd2l0aCBhbiBvcHRpb25hbCBwbHVzIG9yIG1pbnVzIHNpZ24uIFRoZSBsZXR0ZXJzIDxDT0RFPmE8L0NPREU+LS08Q09ERT56PC9DT0RFPiAob3IsCiAgICAgICAgIGVxdWl2YWxlbnRseSwgPENPREU+QTwvQ09ERT4tLTxDT0RFPlo8L0NPREU+KSBhcmUgdXNlZCB0byBzaWduaWZ5IHZhbHVlcyBmcm9tIDEwIHRvIDM1OwogICAgICAgICBvbmx5IGxldHRlcnMgd2hvc2UgYXNjcmliZWQgdmFsdWVzIGFyZSBsZXNzIHRoYW4gPFZBUj5iYXNlPC9WQVI+IGFyZQogICAgICAgICBwZXJtaXR0ZWQuIElmIDxWQVI+YmFzZTwvVkFSPiBpcyAxNiwgYSBsZWFkaW5nIDxDT0RFPjB4PC9DT0RFPiBpcyBwZXJtaXR0ZWQuCiAgICAgICAgIDxicj48YnI+IFRoZSBzdWJqZWN0IHNlcXVlbmNlIGlzIHRoZSBsb25nZXN0IGluaXRpYWwgc2VxdWVuY2Ugb2YgdGhlIGlucHV0CiAgICAgICAgIHN0cmluZyB0aGF0IGhhcyB0aGUgZXhwZWN0ZWQgZm9ybSwgc3RhcnRpbmcgd2l0aCB0aGUgZmlyc3QKICAgICAgICAgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLiAgSWYgdGhlIHN0cmluZyBpcyBlbXB0eSBvciBjb25zaXN0cyBlbnRpcmVseQogICAgICAgICBvZiB3aGl0ZXNwYWNlLCBvciBpZiB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIG5vdCBhCiAgICAgICAgIHBlcm1pc3NpYmxlIGxldHRlciBvciBkaWdpdCwgdGhlIHN1YmplY3Qgc3RyaW5nIGlzIGVtcHR5LgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgc3ViamVjdCBzdHJpbmcgaXMgYWNjZXB0YWJsZSwgYW5kIHRoZSB2YWx1ZSBvZiA8VkFSPmJhc2U8L1ZBUj4gaXMgemVybywKICAgICAgICAgPENPREU+d2NzdG9sPC9DT0RFPiBhdHRlbXB0cyB0byBkZXRlcm1pbmUgdGhlIHJhZGl4IGZyb20gdGhlIGlucHV0IHN0cmluZy4gQQogICAgICAgICBzdHJpbmcgd2l0aCBhIGxlYWRpbmcgPENPREU+MHg8L0NPREU+IGlzIHRyZWF0ZWQgYXMgYSBoZXhhZGVjaW1hbCB2YWx1ZTsgYSBzdHJpbmcgd2l0aAogICAgICAgICBhIGxlYWRpbmcgMCBhbmQgbm8gPENPREU+eDwvQ09ERT4gaXMgdHJlYXRlZCBhcyBvY3RhbDsgYWxsIG90aGVyIHN0cmluZ3MgYXJlCiAgICAgICAgIHRyZWF0ZWQgYXMgZGVjaW1hbC4gSWYgPFZBUj5iYXNlPC9WQVI+IGlzIGJldHdlZW4gMiBhbmQgMzYsIGl0IGlzIHVzZWQgYXMgdGhlCiAgICAgICAgIGNvbnZlcnNpb24gcmFkaXgsIGFzIGRlc2NyaWJlZCBhYm92ZS4gSWYgdGhlIHN1YmplY3Qgc3RyaW5nIGJlZ2lucyB3aXRoCiAgICAgICAgIGEgbWludXMgc2lnbiwgdGhlIHZhbHVlIGlzIG5lZ2F0ZWQuIEZpbmFsbHksIGEgcG9pbnRlciB0byB0aGUgZmlyc3QKICAgICAgICAgY2hhcmFjdGVyIHBhc3QgdGhlIGNvbnZlcnRlZCBzdWJqZWN0IHN0cmluZyBpcyBzdG9yZWQgaW4gPFZBUj5wdHI8L1ZBUj4sIGlmCiAgICAgICAgIDxWQVI+cHRyPC9WQVI+IGlzIG5vdCA8Q09ERT5OVUxMPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIHN1YmplY3Qgc3RyaW5nIGlzIGVtcHR5IChvciBub3QgaW4gYWNjZXB0YWJsZSBmb3JtKSwgbm8gY29udmVyc2lvbgogICAgICAgICBpcyBwZXJmb3JtZWQgYW5kIHRoZSB2YWx1ZSBvZiA8VkFSPnM8L1ZBUj4gaXMgc3RvcmVkIGluIDxWQVI+cHRyPC9WQVI+IChpZiA8VkFSPnB0cjwvVkFSPiBpcwogICAgICAgICBub3QgPENPREU+TlVMTDwvQ09ERT4pLgogICAgICAgICA8YnI+PGJyPiBUaGUgYWx0ZXJuYXRlIGZ1bmN0aW9uIDxDT0RFPl93Y3N0b2xfcjwvQ09ERT4gaXMgYSByZWVudHJhbnQgdmVyc2lvbi4gIFRoZQogICAgICAgICBleHRyYSBhcmd1bWVudCA8VkFSPnJlZW50PC9WQVI+IGlzIGEgcG9pbnRlciB0byBhIHJlZW50cmFuY3kgc3RydWN0dXJlLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgPENPREU+d2NzdG9sPC9DT0RFPiByZXR1cm5zIHRoZSBjb252ZXJ0ZWQgdmFsdWUsIGlmIGFueS4gSWYgbm8gY29udmVyc2lvbiB3YXMKICAgICAgICAgbWFkZSwgMCBpcyByZXR1cm5lZC4KICAgICAgICAgPGJyPjxicj4gPENPREU+d2NzdG9sPC9DT0RFPiByZXR1cm5zIDxDT0RFPkxPTkdfTUFYPC9DT0RFPiBvciA8Q09ERT5MT05HX01JTjwvQ09ERT4gaWYgdGhlIG1hZ25pdHVkZSBvZgogICAgICAgICB0aGUgY29udmVydGVkIHZhbHVlIGlzIHRvbyBsYXJnZSwgYW5kIHNldHMgPENPREU+ZXJybm88L0NPREU+IHRvIDxDT0RFPkVSQU5HRTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgPENPREU+d2NzdG9sPC9DT0RFPiBpcyBBTlNJLgogICAgICAgICA8YnI+PGJyPiBObyBzdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzIGFyZSByZXF1aXJlZC4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAd3Y2hhci5oeHEAfgMpdAA0dm9pZCAqcmVlbnQsY29uc3Qgd2NoYXJfdCAqcywgd2NoYXJfdCAqKnB0cixpbnQgYmFzZXQABWxvbmcgdAAKX3djc3RvbGxfcnNxAH4ACnB0DZoKICAgICAgICBUaGUgZnVuY3Rpb24gPENPREU+d2NzdG9sbDwvQ09ERT4gY29udmVydHMgdGhlIHdpZGUgc3RyaW5nIDxDT0RFPio8VkFSPnM8L1ZBUj48L0NPREU+IHRvCiAgICAgICAgIGEgPENPREU+bG9uZyBsb25nPC9DT0RFPi4gRmlyc3QsIGl0IGJyZWFrcyBkb3duIHRoZSBzdHJpbmcgaW50byB0aHJlZSBwYXJ0czoKICAgICAgICAgbGVhZGluZyB3aGl0ZXNwYWNlLCB3aGljaCBpcyBpZ25vcmVkOyBhIHN1YmplY3Qgc3RyaW5nIGNvbnNpc3RpbmcKICAgICAgICAgb2YgY2hhcmFjdGVycyByZXNlbWJsaW5nIGFuIGludGVnZXIgaW4gdGhlIHJhZGl4IHNwZWNpZmllZCBieSA8VkFSPmJhc2U8L1ZBUj47CiAgICAgICAgIGFuZCBhIHRyYWlsaW5nIHBvcnRpb24gY29uc2lzdGluZyBvZiB6ZXJvIG9yIG1vcmUgdW5wYXJzZWFibGUgY2hhcmFjdGVycywKICAgICAgICAgYW5kIGFsd2F5cyBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyLiBUaGVuLCBpdCBhdHRlbXB0cwogICAgICAgICB0byBjb252ZXJ0IHRoZSBzdWJqZWN0IHN0cmluZyBpbnRvIGEgPENPREU+bG9uZyBsb25nPC9DT0RFPiBhbmQgcmV0dXJucyB0aGUKICAgICAgICAgcmVzdWx0LgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgdmFsdWUgb2YgPFZBUj5iYXNlPC9WQVI+IGlzIDAsIHRoZSBzdWJqZWN0IHN0cmluZyBpcyBleHBlY3RlZCB0byBsb29rCiAgICAgICAgIGxpa2UgYSBub3JtYWwgQyBpbnRlZ2VyIGNvbnN0YW50OiBhbiBvcHRpb25hbCBzaWduLCBhIHBvc3NpYmxlIGA8Q09ERT4weDwvQ09ERT4nCiAgICAgICAgIGluZGljYXRpbmcgYSBoZXhhZGVjaW1hbCBiYXNlLCBhbmQgYSBudW1iZXIuIElmIDxWQVI+YmFzZTwvVkFSPiBpcyBiZXR3ZWVuCiAgICAgICAgIDIgYW5kIDM2LCB0aGUgZXhwZWN0ZWQgZm9ybSBvZiB0aGUgc3ViamVjdCBpcyBhIHNlcXVlbmNlIG9mIGxldHRlcnMKICAgICAgICAgYW5kIGRpZ2l0cyByZXByZXNlbnRpbmcgYW4gaW50ZWdlciBpbiB0aGUgcmFkaXggc3BlY2lmaWVkIGJ5IDxWQVI+YmFzZTwvVkFSPiwKICAgICAgICAgd2l0aCBhbiBvcHRpb25hbCBwbHVzIG9yIG1pbnVzIHNpZ24uIFRoZSBsZXR0ZXJzIDxDT0RFPmE8L0NPREU+LS08Q09ERT56PC9DT0RFPiAob3IsCiAgICAgICAgIGVxdWl2YWxlbnRseSwgPENPREU+QTwvQ09ERT4tLTxDT0RFPlo8L0NPREU+KSBhcmUgdXNlZCB0byBzaWduaWZ5IHZhbHVlcyBmcm9tIDEwIHRvIDM1OwogICAgICAgICBvbmx5IGxldHRlcnMgd2hvc2UgYXNjcmliZWQgdmFsdWVzIGFyZSBsZXNzIHRoYW4gPFZBUj5iYXNlPC9WQVI+IGFyZQogICAgICAgICBwZXJtaXR0ZWQuIElmIDxWQVI+YmFzZTwvVkFSPiBpcyAxNiwgYSBsZWFkaW5nIDxDT0RFPjB4PC9DT0RFPiBpcyBwZXJtaXR0ZWQuCiAgICAgICAgIDxicj48YnI+IFRoZSBzdWJqZWN0IHNlcXVlbmNlIGlzIHRoZSBsb25nZXN0IGluaXRpYWwgc2VxdWVuY2Ugb2YgdGhlIGlucHV0CiAgICAgICAgIHN0cmluZyB0aGF0IGhhcyB0aGUgZXhwZWN0ZWQgZm9ybSwgc3RhcnRpbmcgd2l0aCB0aGUgZmlyc3QKICAgICAgICAgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLiAgSWYgdGhlIHN0cmluZyBpcyBlbXB0eSBvciBjb25zaXN0cyBlbnRpcmVseQogICAgICAgICBvZiB3aGl0ZXNwYWNlLCBvciBpZiB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIG5vdCBhCiAgICAgICAgIHBlcm1pc3NpYmxlIGxldHRlciBvciBkaWdpdCwgdGhlIHN1YmplY3Qgc3RyaW5nIGlzIGVtcHR5LgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgc3ViamVjdCBzdHJpbmcgaXMgYWNjZXB0YWJsZSwgYW5kIHRoZSB2YWx1ZSBvZiA8VkFSPmJhc2U8L1ZBUj4gaXMgemVybywKICAgICAgICAgPENPREU+d2NzdG9sbDwvQ09ERT4gYXR0ZW1wdHMgdG8gZGV0ZXJtaW5lIHRoZSByYWRpeCBmcm9tIHRoZSBpbnB1dCBzdHJpbmcuIEEKICAgICAgICAgc3RyaW5nIHdpdGggYSBsZWFkaW5nIDxDT0RFPjB4PC9DT0RFPiBpcyB0cmVhdGVkIGFzIGEgaGV4YWRlY2ltYWwgdmFsdWU7IGEgc3RyaW5nIHdpdGgKICAgICAgICAgYSBsZWFkaW5nIDAgYW5kIG5vIDxDT0RFPng8L0NPREU+IGlzIHRyZWF0ZWQgYXMgb2N0YWw7IGFsbCBvdGhlciBzdHJpbmdzIGFyZQogICAgICAgICB0cmVhdGVkIGFzIGRlY2ltYWwuIElmIDxWQVI+YmFzZTwvVkFSPiBpcyBiZXR3ZWVuIDIgYW5kIDM2LCBpdCBpcyB1c2VkIGFzIHRoZQogICAgICAgICBjb252ZXJzaW9uIHJhZGl4LCBhcyBkZXNjcmliZWQgYWJvdmUuIElmIHRoZSBzdWJqZWN0IHN0cmluZyBiZWdpbnMgd2l0aAogICAgICAgICBhIG1pbnVzIHNpZ24sIHRoZSB2YWx1ZSBpcyBuZWdhdGVkLiBGaW5hbGx5LCBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0CiAgICAgICAgIGNoYXJhY3RlciBwYXN0IHRoZSBjb252ZXJ0ZWQgc3ViamVjdCBzdHJpbmcgaXMgc3RvcmVkIGluIDxWQVI+cHRyPC9WQVI+LCBpZgogICAgICAgICA8VkFSPnB0cjwvVkFSPiBpcyBub3QgPENPREU+TlVMTDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IElmIHRoZSBzdWJqZWN0IHN0cmluZyBpcyBlbXB0eSAob3Igbm90IGluIGFjY2VwdGFibGUgZm9ybSksIG5vIGNvbnZlcnNpb24KICAgICAgICAgaXMgcGVyZm9ybWVkIGFuZCB0aGUgdmFsdWUgb2YgPFZBUj5zPC9WQVI+IGlzIHN0b3JlZCBpbiA8VkFSPnB0cjwvVkFSPiAoaWYgPFZBUj5wdHI8L1ZBUj4gaXMKICAgICAgICAgbm90IDxDT0RFPk5VTEw8L0NPREU+KS4KICAgICAgICAgPGJyPjxicj4gVGhlIGFsdGVybmF0ZSBmdW5jdGlvbiA8Q09ERT5fd2NzdG9sbF9yPC9DT0RFPiBpcyBhIHJlZW50cmFudCB2ZXJzaW9uLiAgVGhlCiAgICAgICAgIGV4dHJhIGFyZ3VtZW50IDxWQVI+cmVlbnQ8L1ZBUj4gaXMgYSBwb2ludGVyIHRvIGEgcmVlbnRyYW5jeSBzdHJ1Y3R1cmUuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICA8Q09ERT53Y3N0b2xsPC9DT0RFPiByZXR1cm5zIHRoZSBjb252ZXJ0ZWQgdmFsdWUsIGlmIGFueS4gSWYgbm8gY29udmVyc2lvbiB3YXMKICAgICAgICAgbWFkZSwgMCBpcyByZXR1cm5lZC4KICAgICAgICAgPGJyPjxicj4gPENPREU+d2NzdG9sbDwvQ09ERT4gcmV0dXJucyA8Q09ERT5MT05HX0xPTkdfTUFYPC9DT0RFPiBvciA8Q09ERT5MT05HX0xPTkdfTUlOPC9DT0RFPiBpZiB0aGUgbWFnbml0dWRlIG9mCiAgICAgICAgIHRoZSBjb252ZXJ0ZWQgdmFsdWUgaXMgdG9vIGxhcmdlLCBhbmQgc2V0cyA8Q09ERT5lcnJubzwvQ09ERT4gdG8gPENPREU+RVJBTkdFPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICA8Q09ERT53Y3N0b2xsPC9DT0RFPiBpcyBBTlNJLgogICAgICAgICA8YnI+PGJyPiBObyBzdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzIGFyZSByZXF1aXJlZC4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAd3Y2hhci5oeHEAfgMwdAA0dm9pZCAqcmVlbnQsY29uc3Qgd2NoYXJfdCAqcywgd2NoYXJfdCAqKnB0cixpbnQgYmFzZXQACmxvbmcgbG9uZyB0AApfd2NzdG91bF9yc3EAfgAKcHQNogogICAgICAgIFRoZSBmdW5jdGlvbiA8Q09ERT53Y3N0b3VsPC9DT0RFPiBjb252ZXJ0cyB0aGUgd2lkZSBzdHJpbmcgPENPREU+KjxWQVI+czwvVkFSPjwvQ09ERT4gdG8KICAgICAgICAgYW4gPENPREU+dW5zaWduZWQgbG9uZzwvQ09ERT4uIEZpcnN0LCBpdCBicmVha3MgZG93biB0aGUgc3RyaW5nIGludG8gdGhyZWUgcGFydHM6CiAgICAgICAgIGxlYWRpbmcgd2hpdGVzcGFjZSwgd2hpY2ggaXMgaWdub3JlZDsgYSBzdWJqZWN0IHN0cmluZyBjb25zaXN0aW5nCiAgICAgICAgIG9mIHRoZSBkaWdpdHMgbWVhbmluZ2Z1bCBpbiB0aGUgcmFkaXggc3BlY2lmaWVkIGJ5IDxWQVI+YmFzZTwvVkFSPgogICAgICAgICAoZm9yIGV4YW1wbGUsIDxDT0RFPjA8L0NPREU+IHRocm91Z2ggPENPREU+NzwvQ09ERT4gaWYgdGhlIHZhbHVlIG9mIDxWQVI+YmFzZTwvVkFSPiBpcyA4KTsKICAgICAgICAgYW5kIGEgdHJhaWxpbmcgcG9ydGlvbiBjb25zaXN0aW5nIG9mIG9uZSBvciBtb3JlIHVucGFyc2VhYmxlIGNoYXJhY3RlcnMsCiAgICAgICAgIHdoaWNoIGFsd2F5cyBpbmNsdWRlcyB0aGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIuIFRoZW4sIGl0IGF0dGVtcHRzCiAgICAgICAgIHRvIGNvbnZlcnQgdGhlIHN1YmplY3Qgc3RyaW5nIGludG8gYW4gdW5zaWduZWQgbG9uZyBpbnRlZ2VyLCBhbmQgcmV0dXJucyB0aGUKICAgICAgICAgcmVzdWx0LgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgdmFsdWUgb2YgPFZBUj5iYXNlPC9WQVI+IGlzIHplcm8sIHRoZSBzdWJqZWN0IHN0cmluZyBpcyBleHBlY3RlZCB0byBsb29rCiAgICAgICAgIGxpa2UgYSBub3JtYWwgQyBpbnRlZ2VyIGNvbnN0YW50IChzYXZlIHRoYXQgbm8gb3B0aW9uYWwgc2lnbiBpcyBwZXJtaXR0ZWQpOgogICAgICAgICBhIHBvc3NpYmxlIDxDT0RFPjB4PC9DT0RFPiBpbmRpY2F0aW5nIGhleGFkZWNpbWFsIHJhZGl4LCBhbmQgYSBudW1iZXIuCiAgICAgICAgIElmIDxWQVI+YmFzZTwvVkFSPiBpcyBiZXR3ZWVuIDIgYW5kIDM2LCB0aGUgZXhwZWN0ZWQgZm9ybSBvZiB0aGUgc3ViamVjdCBpcyBhCiAgICAgICAgIHNlcXVlbmNlIG9mIGRpZ2l0cyAod2hpY2ggbWF5IGluY2x1ZGUgbGV0dGVycywgZGVwZW5kaW5nIG9uIHRoZQogICAgICAgICBiYXNlKSByZXByZXNlbnRpbmcgYW4gaW50ZWdlciBpbiB0aGUgcmFkaXggc3BlY2lmaWVkIGJ5IDxWQVI+YmFzZTwvVkFSPi4KICAgICAgICAgVGhlIGxldHRlcnMgPENPREU+YTwvQ09ERT4tLTxDT0RFPno8L0NPREU+IChvciA8Q09ERT5BPC9DT0RFPi0tPENPREU+WjwvQ09ERT4pIGFyZSB1c2VkIGFzIGRpZ2l0cyB2YWx1ZWQgZnJvbQogICAgICAgICAxMCB0byAzNS4gSWYgPFZBUj5iYXNlPC9WQVI+IGlzIDE2LCBhIGxlYWRpbmcgPENPREU+MHg8L0NPREU+IGlzIHBlcm1pdHRlZC4KICAgICAgICAgPGJyPjxicj4gVGhlIHN1YmplY3Qgc2VxdWVuY2UgaXMgdGhlIGxvbmdlc3QgaW5pdGlhbCBzZXF1ZW5jZSBvZiB0aGUgaW5wdXQKICAgICAgICAgc3RyaW5nIHRoYXQgaGFzIHRoZSBleHBlY3RlZCBmb3JtLCBzdGFydGluZyB3aXRoIHRoZSBmaXJzdAogICAgICAgICBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIuICBJZiB0aGUgc3RyaW5nIGlzIGVtcHR5IG9yIGNvbnNpc3RzIGVudGlyZWx5CiAgICAgICAgIG9mIHdoaXRlc3BhY2UsIG9yIGlmIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgbm90IGEKICAgICAgICAgcGVybWlzc2libGUgZGlnaXQsIHRoZSBzdWJqZWN0IHN0cmluZyBpcyBlbXB0eS4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIHN1YmplY3Qgc3RyaW5nIGlzIGFjY2VwdGFibGUsIGFuZCB0aGUgdmFsdWUgb2YgPFZBUj5iYXNlPC9WQVI+IGlzIHplcm8sCiAgICAgICAgIDxDT0RFPndjc3RvdWw8L0NPREU+IGF0dGVtcHRzIHRvIGRldGVybWluZSB0aGUgcmFkaXggZnJvbSB0aGUgaW5wdXQgc3RyaW5nLiBBCiAgICAgICAgIHN0cmluZyB3aXRoIGEgbGVhZGluZyA8Q09ERT4weDwvQ09ERT4gaXMgdHJlYXRlZCBhcyBhIGhleGFkZWNpbWFsIHZhbHVlOyBhIHN0cmluZyB3aXRoCiAgICAgICAgIGEgbGVhZGluZyA8Q09ERT4wPC9DT0RFPiBhbmQgbm8gPENPREU+eDwvQ09ERT4gaXMgdHJlYXRlZCBhcyBvY3RhbDsgYWxsIG90aGVyIHN0cmluZ3MgYXJlCiAgICAgICAgIHRyZWF0ZWQgYXMgZGVjaW1hbC4gSWYgPFZBUj5iYXNlPC9WQVI+IGlzIGJldHdlZW4gMiBhbmQgMzYsIGl0IGlzIHVzZWQgYXMgdGhlCiAgICAgICAgIGNvbnZlcnNpb24gcmFkaXgsIGFzIGRlc2NyaWJlZCBhYm92ZS4gRmluYWxseSwgYSBwb2ludGVyIHRvIHRoZSBmaXJzdAogICAgICAgICBjaGFyYWN0ZXIgcGFzdCB0aGUgY29udmVydGVkIHN1YmplY3Qgc3RyaW5nIGlzIHN0b3JlZCBpbiA8VkFSPnB0cjwvVkFSPiwgaWYKICAgICAgICAgPFZBUj5wdHI8L1ZBUj4gaXMgbm90IDxDT0RFPk5VTEw8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgc3ViamVjdCBzdHJpbmcgaXMgZW1wdHkgKHRoYXQgaXMsIGlmIDxDT0RFPio8L0NPREU+PFZBUj5zPC9WQVI+IGRvZXMgbm90IHN0YXJ0CiAgICAgICAgIHdpdGggYSBzdWJzdHJpbmcgaW4gYWNjZXB0YWJsZSBmb3JtKSwgbm8gY29udmVyc2lvbgogICAgICAgICBpcyBwZXJmb3JtZWQgYW5kIHRoZSB2YWx1ZSBvZiA8VkFSPnM8L1ZBUj4gaXMgc3RvcmVkIGluIDxWQVI+cHRyPC9WQVI+IChpZiA8VkFSPnB0cjwvVkFSPiBpcwogICAgICAgICBub3QgPENPREU+TlVMTDwvQ09ERT4pLgogICAgICAgICA8YnI+PGJyPiBUaGUgYWx0ZXJuYXRlIGZ1bmN0aW9uIDxDT0RFPl93Y3N0b3VsX3I8L0NPREU+IGlzIGEgcmVlbnRyYW50IHZlcnNpb24uICBUaGUKICAgICAgICAgZXh0cmEgYXJndW1lbnQgPFZBUj5yZWVudDwvVkFSPiBpcyBhIHBvaW50ZXIgdG8gYSByZWVudHJhbmN5IHN0cnVjdHVyZS4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIDxDT0RFPndjc3RvdWw8L0NPREU+IHJldHVybnMgdGhlIGNvbnZlcnRlZCB2YWx1ZSwgaWYgYW55LiBJZiBubyBjb252ZXJzaW9uIHdhcwogICAgICAgICBtYWRlLCA8Q09ERT4wPC9DT0RFPiBpcyByZXR1cm5lZC4KICAgICAgICAgPGJyPjxicj4gPENPREU+d2NzdG91bDwvQ09ERT4gcmV0dXJucyA8Q09ERT5VTE9OR19NQVg8L0NPREU+IGlmIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvbnZlcnRlZAogICAgICAgICB2YWx1ZSBpcyB0b28gbGFyZ2UsIGFuZCBzZXRzIDxDT0RFPmVycm5vPC9DT0RFPiB0byA8Q09ERT5FUkFOR0U8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIDxDT0RFPndjc3RvdWw8L0NPREU+IGlzIEFOU0kuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPndjc3RvdWw8L0NPREU+IHJlcXVpcmVzIG5vIHN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAHd2NoYXIuaHhxAH4DN3QANXZvaWQgKnJlZW50LCBjb25zdCB3Y2hhcl90ICpzLHdjaGFyX3QgKipwdHIsIGludCBiYXNldAAOdW5zaWduZWQgbG9uZyB0AAtfd2NzdG91bGxfcnNxAH4ACnB0DbgKICAgICAgICBUaGUgZnVuY3Rpb24gPENPREU+d2NzdG91bGw8L0NPREU+IGNvbnZlcnRzIHRoZSB3aWRlIHN0cmluZyA8Q09ERT4qPFZBUj5zPC9WQVI+PC9DT0RFPiB0bwogICAgICAgICBhbiA8Q09ERT51bnNpZ25lZCBsb25nIGxvbmc8L0NPREU+LiBGaXJzdCwgaXQgYnJlYWtzIGRvd24gdGhlIHN0cmluZyBpbnRvIHRocmVlIHBhcnRzOgogICAgICAgICBsZWFkaW5nIHdoaXRlc3BhY2UsIHdoaWNoIGlzIGlnbm9yZWQ7IGEgc3ViamVjdCBzdHJpbmcgY29uc2lzdGluZwogICAgICAgICBvZiB0aGUgZGlnaXRzIG1lYW5pbmdmdWwgaW4gdGhlIHJhZGl4IHNwZWNpZmllZCBieSA8VkFSPmJhc2U8L1ZBUj4KICAgICAgICAgKGZvciBleGFtcGxlLCA8Q09ERT4wPC9DT0RFPiB0aHJvdWdoIDxDT0RFPjc8L0NPREU+IGlmIHRoZSB2YWx1ZSBvZiA8VkFSPmJhc2U8L1ZBUj4gaXMgOCk7CiAgICAgICAgIGFuZCBhIHRyYWlsaW5nIHBvcnRpb24gY29uc2lzdGluZyBvZiBvbmUgb3IgbW9yZSB1bnBhcnNlYWJsZSBjaGFyYWN0ZXJzLAogICAgICAgICB3aGljaCBhbHdheXMgaW5jbHVkZXMgdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyLiBUaGVuLCBpdCBhdHRlbXB0cwogICAgICAgICB0byBjb252ZXJ0IHRoZSBzdWJqZWN0IHN0cmluZyBpbnRvIGFuIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnRlZ2VyLCBhbmQgcmV0dXJucyB0aGUKICAgICAgICAgcmVzdWx0LgogICAgICAgICA8YnI+PGJyPiBJZiB0aGUgdmFsdWUgb2YgPFZBUj5iYXNlPC9WQVI+IGlzIHplcm8sIHRoZSBzdWJqZWN0IHN0cmluZyBpcyBleHBlY3RlZCB0byBsb29rCiAgICAgICAgIGxpa2UgYSBub3JtYWwgQyBpbnRlZ2VyIGNvbnN0YW50IChzYXZlIHRoYXQgbm8gb3B0aW9uYWwgc2lnbiBpcyBwZXJtaXR0ZWQpOgogICAgICAgICBhIHBvc3NpYmxlIDxDT0RFPjB4PC9DT0RFPiBpbmRpY2F0aW5nIGhleGFkZWNpbWFsIHJhZGl4LCBhbmQgYSBudW1iZXIuCiAgICAgICAgIElmIDxWQVI+YmFzZTwvVkFSPiBpcyBiZXR3ZWVuIDIgYW5kIDM2LCB0aGUgZXhwZWN0ZWQgZm9ybSBvZiB0aGUgc3ViamVjdCBpcyBhCiAgICAgICAgIHNlcXVlbmNlIG9mIGRpZ2l0cyAod2hpY2ggbWF5IGluY2x1ZGUgbGV0dGVycywgZGVwZW5kaW5nIG9uIHRoZQogICAgICAgICBiYXNlKSByZXByZXNlbnRpbmcgYW4gaW50ZWdlciBpbiB0aGUgcmFkaXggc3BlY2lmaWVkIGJ5IDxWQVI+YmFzZTwvVkFSPi4KICAgICAgICAgVGhlIGxldHRlcnMgPENPREU+YTwvQ09ERT4tLTxDT0RFPno8L0NPREU+IChvciA8Q09ERT5BPC9DT0RFPi0tPENPREU+WjwvQ09ERT4pIGFyZSB1c2VkIGFzIGRpZ2l0cyB2YWx1ZWQgZnJvbQogICAgICAgICAxMCB0byAzNS4gSWYgPFZBUj5iYXNlPC9WQVI+IGlzIDE2LCBhIGxlYWRpbmcgPENPREU+MHg8L0NPREU+IGlzIHBlcm1pdHRlZC4KICAgICAgICAgPGJyPjxicj4gVGhlIHN1YmplY3Qgc2VxdWVuY2UgaXMgdGhlIGxvbmdlc3QgaW5pdGlhbCBzZXF1ZW5jZSBvZiB0aGUgaW5wdXQKICAgICAgICAgc3RyaW5nIHRoYXQgaGFzIHRoZSBleHBlY3RlZCBmb3JtLCBzdGFydGluZyB3aXRoIHRoZSBmaXJzdAogICAgICAgICBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIuICBJZiB0aGUgc3RyaW5nIGlzIGVtcHR5IG9yIGNvbnNpc3RzIGVudGlyZWx5CiAgICAgICAgIG9mIHdoaXRlc3BhY2UsIG9yIGlmIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgbm90IGEKICAgICAgICAgcGVybWlzc2libGUgZGlnaXQsIHRoZSBzdWJqZWN0IHN0cmluZyBpcyBlbXB0eS4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIHN1YmplY3Qgc3RyaW5nIGlzIGFjY2VwdGFibGUsIGFuZCB0aGUgdmFsdWUgb2YgPFZBUj5iYXNlPC9WQVI+IGlzIHplcm8sCiAgICAgICAgIDxDT0RFPndjc3RvdWxsPC9DT0RFPiBhdHRlbXB0cyB0byBkZXRlcm1pbmUgdGhlIHJhZGl4IGZyb20gdGhlIGlucHV0IHN0cmluZy4gQQogICAgICAgICBzdHJpbmcgd2l0aCBhIGxlYWRpbmcgPENPREU+MHg8L0NPREU+IGlzIHRyZWF0ZWQgYXMgYSBoZXhhZGVjaW1hbCB2YWx1ZTsgYSBzdHJpbmcgd2l0aAogICAgICAgICBhIGxlYWRpbmcgPENPREU+MDwvQ09ERT4gYW5kIG5vIDxDT0RFPng8L0NPREU+IGlzIHRyZWF0ZWQgYXMgb2N0YWw7IGFsbCBvdGhlciBzdHJpbmdzIGFyZQogICAgICAgICB0cmVhdGVkIGFzIGRlY2ltYWwuIElmIDxWQVI+YmFzZTwvVkFSPiBpcyBiZXR3ZWVuIDIgYW5kIDM2LCBpdCBpcyB1c2VkIGFzIHRoZQogICAgICAgICBjb252ZXJzaW9uIHJhZGl4LCBhcyBkZXNjcmliZWQgYWJvdmUuIEZpbmFsbHksIGEgcG9pbnRlciB0byB0aGUgZmlyc3QKICAgICAgICAgY2hhcmFjdGVyIHBhc3QgdGhlIGNvbnZlcnRlZCBzdWJqZWN0IHN0cmluZyBpcyBzdG9yZWQgaW4gPFZBUj5wdHI8L1ZBUj4sIGlmCiAgICAgICAgIDxWQVI+cHRyPC9WQVI+IGlzIG5vdCA8Q09ERT5OVUxMPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gSWYgdGhlIHN1YmplY3Qgc3RyaW5nIGlzIGVtcHR5ICh0aGF0IGlzLCBpZiA8Q09ERT4qPC9DT0RFPjxWQVI+czwvVkFSPiBkb2VzIG5vdCBzdGFydAogICAgICAgICB3aXRoIGEgc3Vic3RyaW5nIGluIGFjY2VwdGFibGUgZm9ybSksIG5vIGNvbnZlcnNpb24KICAgICAgICAgaXMgcGVyZm9ybWVkIGFuZCB0aGUgdmFsdWUgb2YgPFZBUj5zPC9WQVI+IGlzIHN0b3JlZCBpbiA8VkFSPnB0cjwvVkFSPiAoaWYgPFZBUj5wdHI8L1ZBUj4gaXMKICAgICAgICAgbm90IDxDT0RFPk5VTEw8L0NPREU+KS4KICAgICAgICAgPGJyPjxicj4gVGhlIGFsdGVybmF0ZSBmdW5jdGlvbiA8Q09ERT5fd2NzdG91bGxfcjwvQ09ERT4gaXMgYSByZWVudHJhbnQgdmVyc2lvbi4gIFRoZQogICAgICAgICBleHRyYSBhcmd1bWVudCA8VkFSPnJlZW50PC9WQVI+IGlzIGEgcG9pbnRlciB0byBhIHJlZW50cmFuY3kgc3RydWN0dXJlLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgPENPREU+d2NzdG91bGw8L0NPREU+IHJldHVybnMgdGhlIGNvbnZlcnRlZCB2YWx1ZSwgaWYgYW55LiBJZiBubyBjb252ZXJzaW9uIHdhcwogICAgICAgICBtYWRlLCA8Q09ERT4wPC9DT0RFPiBpcyByZXR1cm5lZC4KICAgICAgICAgPGJyPjxicj4gPENPREU+d2NzdG91bGw8L0NPREU+IHJldHVybnMgPENPREU+VUxPTkdfTE9OR19NQVg8L0NPREU+IGlmIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvbnZlcnRlZAogICAgICAgICB2YWx1ZSBpcyB0b28gbGFyZ2UsIGFuZCBzZXRzIDxDT0RFPmVycm5vPC9DT0RFPiB0byA8Q09ERT5FUkFOR0U8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIDxDT0RFPndjc3RvdWxsPC9DT0RFPiBpcyBBTlNJLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT53Y3N0b3VsbDwvQ09ERT4gcmVxdWlyZXMgbm8gc3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcy4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAd3Y2hhci5oeHEAfgM+dAA1dm9pZCAqcmVlbnQsIGNvbnN0IHdjaGFyX3QgKnMsd2NoYXJfdCAqKnB0ciwgaW50IGJhc2V0ABN1bnNpZ25lZCBsb25nIGxvbmcgdAAEYTY0bHNxAH4ACnB0B0kKICAgICAgICBDb252ZXJzaW9uIGlzIHBlcmZvcm1lZCBiZXR3ZWVuIGxvbmcgYW5kIHJhZGl4LTY0IGNoYXJhY3RlcnMuICBUaGUKICAgICAgICAgPENPREU+bDY0YTwvQ09ERT4gcm91dGluZSB0cmFuc2Zvcm1zIHVwIHRvIDMyIGJpdHMgb2YgaW5wdXQgdmFsdWUgc3RhcnRpbmcgZnJvbQogICAgICAgICBsZWFzdCBzaWduaWZpY2FudCBiaXRzIHRvIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdHMuICBUaGUgaW5wdXQgdmFsdWUKICAgICAgICAgaXMgc3BsaXQgdXAgaW50byBhIG1heGltdW0gb2YgNSBncm91cHMgb2YgNiBiaXRzIGFuZCBwb3NzaWJseSBvbmUKICAgICAgICAgZ3JvdXAgb2YgMiBiaXRzIChiaXRzIDMxIGFuZCAzMCkuCiAgICAgICAgIDxicj48YnI+IEVhY2ggZ3JvdXAgb2YgNiBiaXRzIGZvcm1zIGEgdmFsdWUgZnJvbSAwLS02MyB3aGljaCBpcyB0cmFuc2xhdGVkIGludG8KICAgICAgICAgYSBjaGFyYWN0ZXIgYXMgZm9sbG93czoKICAgICAgICAgPGJyPjxicj4gPE9MPgogICAgICAgICA8YnI+PGJyPiA8TEk+ICAgICAwID0gJy4nCiAgICAgICAgIDxMST4gICAgIDEgPSAnLycKICAgICAgICAgPExJPiAgICAgMi0tMTEgPSAnMCcgdG8gJzknCiAgICAgICAgIDxMST4gICAgIDEyLS0zNyA9ICdBJyB0byAnWicKICAgICAgICAgPExJPiAgICAgMzgtLTYzID0gJ2EnIHRvICd6JwogICAgICAgICA8L09MPgogICAgICAgICA8YnI+PGJyPiA8YnI+PGJyPiBXaGVuIHRoZSByZW1haW5pbmcgYml0cyBhcmUgemVybyBvciBhbGwgYml0cyBoYXZlIGJlZW4gdHJhbnNsYXRlZCwgYQogICAgICAgICBudWxsIHRlcm1pbmF0b3IgaXMgYXBwZW5kZWQgdG8gdGhlIHN0cmluZy4gIEFuIGlucHV0IHZhbHVlIG9mIDAKICAgICAgICAgcmVzdWx0cyBpbiB0aGUgZW1wdHkgc3RyaW5nLgogICAgICAgICA8YnI+PGJyPiBUaGUgPENPREU+YTY0bDwvQ09ERT4gZnVuY3Rpb24gcGVyZm9ybXMgdGhlIHJldmVyc2UgdHJhbnNsYXRpb24uICBFYWNoCiAgICAgICAgIGNoYXJhY3RlciBpcyB1c2VkIHRvIGdlbmVyYXRlIGEgNi1iaXQgdmFsdWUgZm9yIHVwIHRvIDMwIGJpdHMgYW5kIHRoZW4KICAgICAgICAgYSAyLWJpdCB2YWx1ZSB0byBjb21wbGV0ZSBhIDMyLWJpdCByZXN1bHQuICBUaGUgbnVsbCB0ZXJtaW5hdG9yIG1lYW5zCiAgICAgICAgIHRoYXQgdGhlIHJlbWFpbmluZyBkaWdpdHMgYXJlIDAuICBBbiBlbXB0eSBpbnB1dCBzdHJpbmcgb3IgTlVMTCBzdHJpbmcKICAgICAgICAgcmVzdWx0cyBpbiAwTC4gIEFuIGludmFsaWQgc3RyaW5nIHJlc3VsdHMgaW4gdW5kZWZpbmVkIGJlaGF2aW9yLiAgSWYKICAgICAgICAgdGhlIHNpemUgb2YgYSBsb25nIGlzIGdyZWF0ZXIgdGhhbiAzMiBiaXRzLCB0aGUgcmVzdWx0IGlzIHNpZ24tZXh0ZW5kZWQuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICA8Q09ERT5sNjRhPC9DT0RFPiByZXR1cm5zIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBvZiAwIHRvIDYgY2hhcmFjdGVycy4KICAgICAgICAgPENPREU+YTY0bDwvQ09ERT4gcmV0dXJucyB0aGUgMzItYml0IHRyYW5zbGF0ZWQgdmFsdWUgZnJvbSB0aGUgaW5wdXQgY2hhcmFjdGVyIHN0cmluZy4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICA8Q09ERT5sNjRhPC9DT0RFPiBhbmQgPENPREU+YTY0bDwvQ09ERT4gYXJlIG5vbi1BTlNJIGFuZCBhcmUgZGVmaW5lZCBieSB0aGUgU2luZ2xlIFVuaXggU3BlY2lmaWNhdGlvbi4KICAgICAgICAgPGJyPjxicj4gU3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcyByZXF1aXJlZDogTm9uZS4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAhzdGRsaWIuaHhxAH4DRXQAEWNvbnN0IGNoYXIgKmlucHV0dAAFbG9uZyB0AAVhYm9ydHNxAH4ACnB0BIUKICAgICAgICBVc2UgPENPREU+YWJvcnQ8L0NPREU+IHRvIHNpZ25hbCB0aGF0IHlvdXIgcHJvZ3JhbSBoYXMgZGV0ZWN0ZWQgYSBjb25kaXRpb24gaXQKICAgICAgICAgY2Fubm90IGRlYWwgd2l0aC4gIE5vcm1hbGx5LCA8Q09ERT5hYm9ydDwvQ09ERT4gZW5kcyB5b3VyIHByb2dyYW0ncyBleGVjdXRpb24uCiAgICAgICAgIDxicj48YnI+IEJlZm9yZSB0ZXJtaW5hdGluZyB5b3VyIHByb2dyYW0sIDxDT0RFPmFib3J0PC9DT0RFPiByYWlzZXMgdGhlIGV4Y2VwdGlvbiA8Q09ERT5TSUdBQlJUPC9DT0RFPgogICAgICAgICAodXNpbmcgYDxDT0RFPnJhaXNlKFNJR0FCUlQpPC9DT0RFPicpLiAgSWYgeW91IGhhdmUgdXNlZCA8Q09ERT5zaWduYWw8L0NPREU+IHRvIHJlZ2lzdGVyCiAgICAgICAgIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIGZvciB0aGlzIGNvbmRpdGlvbiwgdGhhdCBoYW5kbGVyIGhhcyB0aGUKICAgICAgICAgb3Bwb3J0dW5pdHkgdG8gcmV0YWluIGNvbnRyb2wsIHRoZXJlYnkgYXZvaWRpbmcgcHJvZ3JhbSB0ZXJtaW5hdGlvbi4KICAgICAgICAgPGJyPjxicj4gSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgPENPREU+YWJvcnQ8L0NPREU+IGRvZXMgbm90IHBlcmZvcm0gYW55IHN0cmVhbS0gb3IKICAgICAgICAgZmlsZS1yZWxhdGVkIGNsZWFudXAgKHRoZSBob3N0IGVudmlyb25tZW50IG1heSBkbyBzbzsgaWYgbm90LCB5b3UgY2FuCiAgICAgICAgIGFycmFuZ2UgZm9yIHlvdXIgcHJvZ3JhbSB0byBkbyBpdHMgb3duIGNsZWFudXAgd2l0aCBh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YXNuaXByaW50ZnNxAH4ACnBxAH4AQnNxAH4ADwAAAAF3BAAAAAp0AAdzdGRpby5oeHEAfgOadAAvY2hhciAqc3RyLCBzaXplX3QgKnNpemUsY29uc3QgY2hhciAqZm9ybWF0LCAuLi50AAZjaGFyICp0AAlhc25wcmludGZzcQB+AApwcQB+AE9zcQB+AA8AAAABdwQAAAAKdAAHc3RkaW8uaHhxAH4DoHQAL2NoYXIgKnN0ciwgc2l6ZV90ICpzaXplLCBjb25zdCBjaGFyICpmb3JtYXQsLi4udAAGY2hhciAqdAAIYXNwcmludGZzcQB+AApwcQB+AE9zcQB+AA8AAAABdwQAAAAKdAAHc3RkaW8uaHhxAH4DpnQAJGNoYXIgKipzdHJwLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLnQABGludCB0AAZhc3NlcnRzcQB+AApwdAbNCiAgICAgICAgVXNlIHRoaXMgbWFjcm8gdG8gZW1iZWQgZGVidWdnZ2luZyBkaWFnbm9zdGljIHN0YXRlbWVudHMgaW4KICAgICAgICAgeW91ciBwcm9ncmFtcy4gIFRoZSBhcmd1bWVudCA8VkFSPmV4cHJlc3Npb248L1ZBUj4gc2hvdWxkIGJlIGFuCiAgICAgICAgIGV4cHJlc3Npb24gd2hpY2ggZXZhbHVhdGVzIHRvIHRydWUgKG5vbnplcm8pIHdoZW4geW91ciBwcm9ncmFtCiAgICAgICAgIGlzIHdvcmtpbmcgYXMgeW91IGludGVuZGVkLgogICAgICAgICA8YnI+PGJyPiBXaGVuIDxWQVI+ZXhwcmVzc2lvbjwvVkFSPiBldmFsdWF0ZXMgdG8gZmFsc2UgKHplcm8pLCA8Q09ERT5hc3NlcnQ8L0NPREU+CiAgICAgICAgIGNhbGxzIDxDT0RFPmFib3J0PC9DT0RFPiwgYWZ0ZXIgZmlyc3QgcHJpbnRpbmcgYSBtZXNzYWdlIHNob3dpbmcgd2hhdAogICAgICAgICBmYWlsZWQgYW5kIHdoZXJlOgogICAgICAgICA8YnI+PGJyPiA8cHJlPjxicj4KICAgICAgICAgIEFzc2VydGlvbiBmYWlsZWQ6IDxWQVI+ZXhwcmVzc2lvbjwvVkFSPiwgZmlsZSA8VkFSPmZpbGVuYW1lPC9WQVI+LCBsaW5lIDxWQVI+bGluZW5vPC9WQVI+LCBmdW5jdGlvbjogPFZBUj5mdW5jPC9WQVI+PGJyPgogICAgICAgICA8L3ByZT48YnI+CiAgICAgICAgIDxicj48YnI+IElmIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGlzIG5vdCBrbm93biAoZm9yIGV4YW1wbGUsPGJyPgogICAgICAgICB3aGVuIHVzaW5nIGEgQzg5IGNvbXBpbGVyIHRoYXQgZG9lcyBub3QgdW5kZXJzdGFuZCBfX2Z1bmNfXyksPGJyPgogICAgICAgICB0aGUgZnVuY3Rpb24gbG9jYXRpb24gaXMgb21pdHRlZC48YnI+CiAgICAgICAgIDxicj48YnI+IFRoZSBtYWNybyBpcyBkZWZpbmVkIHRvIHBlcm1pdCB5b3UgdG8gdHVybiBvZmYgYWxsIHVzZXMgb2Y8YnI+CiAgICAgICAgIDxDT0RFPmFzc2VydDwvQ09ERT4gYXQgY29tcGlsZSB0aW1lIGJ5IGRlZmluaW5nIDxDT0RFPk5ERUJVRzwvQ09ERT4gYXMgYTxicj4KICAgICAgICAgcHJlcHJvY2Vzc29yIHZhcmlhYmxlLiAgIElmIHlvdSBkbyB0aGlzLCB0aGUgPENPREU+YXNzZXJ0PC9DT0RFPiBtYWNybzxicj4KICAgICAgICAgZXhwYW5kcyB0bzxicj4KICAgICAgICAgPGJyPjxicj4gPHByZT48YnI+CiAgICAgICAgICAodm9pZCgwKSk8YnI+CiAgICAgICAgIDwvcHJlPgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgPENPREU+YXNzZXJ0PC9DT0RFPiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICBUaGUgPENPREU+YXNzZXJ0PC9DT0RFPiBtYWNybyBpcyByZXF1aXJlZCBieSBBTlNJLCBhcyBpcyB0aGUgYmVoYXZpb3IKICAgICAgICAgd2hlbiA8Q09ERT5OREVCVUc8L0NPREU+IGlzIGRlZmluZWQuCiAgICAgICAgIDxicj48YnI+IFN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMgcmVxdWlyZWQgKG9ubHkgaWYgZW5hYmxlZCk6IDxDT0RFPmNsb3NlPC9DT0RFPiwgPENPREU+ZnN0YXQ8L0NPREU+LAogICAgICAgICA8Q09ERT5nZXRwaWQ8L0NPREU+LCA8Q09ERT5pc2F0dHk8L0NPREU+LCA8Q09ERT5raWxsPC9DT0RFPiwgPENPREU+bHNlZWs8L0NPREU+LCA8Q09ERT5yZWFkPC9DT0RFPiwgPENPREU+c2JyazwvQ09ERT4sIDxDT0RFPndyaXRlPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAhhc3NlcnQuaHhxAH4DrHQADmludCBleHByZXNzaW9udAAFdm9pZCB0AARhdGFuc3EAfgAKcHQCHQogICAgICAgIDxicj48YnI+IDxDT0RFPmF0YW48L0NPREU+IGNvbXB1dGVzIHRoZSBpbnZlcnNlIHRhbmdlbnQgKGFyYyB0YW5nZW50KSBvZiB0aGUgaW5wdXQgdmFsdWUuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPmF0YW5mPC9DT0RFPiBpcyBpZGVudGljYWwgdG8gPENPREU+YXRhbjwvQ09ERT4sIHNhdmUgdGhhdCBpdCBvcGVyYXRlcyBvbiA8Q09ERT5mbG9hdHM8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgCiAgICAgICAgIDxDT0RFPmF0YW48L0NPREU+IHJldHVybnMgYSB2YWx1ZSBpbiByYWRpYW5zLCBpbiB0aGUgcmFuZ2Ugb2YgLXBpLzIgdG8gcGkvMi4KICAgICAgICAgCiAgICAgICAgIAogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIDxDT0RFPmF0YW48L0NPREU+IGlzIEFOU0kgQy4gIDxDT0RFPmF0YW5mPC9DT0RFPiBpcyBhbiBleHRlbnNpb24uCiAgICAgICAgIDxicj48YnI+IDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAGbWF0aC5oeHEAfgOzdAAIZG91YmxlIHh0AAdkb3VibGUgdAAFYXRhbjJzcQB+AApwdANwCiAgICAgICAgPGJyPjxicj4gPENPREU+YXRhbjI8L0NPREU+IGNvbXB1dGVzIHRoZSBpbnZlcnNlIHRhbmdlbnQgKGFyYyB0YW5nZW50KSBvZiA8VkFSPnk8L1ZBUj4vPFZBUj54PC9WQVI+LiAKICAgICAgICAgPENPREU+YXRhbjI8L0NPREU+IHByb2R1Y2VzIHRoZSBjb3JyZWN0IHJlc3VsdCBldmVuIGZvciBhbmdsZXMgbmVhciAKICAgICAgICAgCiAgICAgICAgIHBpLzIgb3IgLXBpLzIgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgKHRoYXQgaXMsIHdoZW4gPFZBUj54PC9WQVI+IGlzIG5lYXIgMCkuIAogICAgICAgICA8YnI+PGJyPiA8Q09ERT5hdGFuMmY8L0NPREU+IGlzIGlkZW50aWNhbCB0byA8Q09ERT5hdGFuMjwvQ09ERT4sIHNhdmUgdGhhdCBpdCB0YWtlcyBhbmQgcmV0dXJucwogICAgICAgICA8Q09ERT5mbG9hdDwvQ09ERT4uIAogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgPENPREU+YXRhbjI8L0NPREU+IGFuZCA8Q09ERT5hdGFuMmY8L0NPREU+IHJldHVybiBhIHZhbHVlIGluIHJhZGlhbnMsIGluIHRoZSByYW5nZSBvZiAKICAgICAgICAgCiAgICAgICAgIC1waSB0byBwaS4KICAgICAgICAgCiAgICAgICAgIAogICAgICAgICA8YnI+PGJyPiBZb3UgY2FuIG1vZGlmeSBlcnJvciBoYW5kbGluZyBmb3IgdGhlc2UgZnVuY3Rpb25zIHVzaW5nIDxDT0RFPm1hdGhlcnI8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIDxDT0RFPmF0YW4yPC9DT0RFPiBpcyBBTlNJIEMuICA8Q09ERT5hdGFuMmY8L0NPREU+IGlzIGFuIGV4dGVuc2lvbi4KICAgICAgICAgPGJyPjxicj4gPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAZtYXRoLmh4cQB+A7p0ABFkb3VibGUgeSxkb3VibGUgeHQAB2RvdWJsZSB0AAZhdGFuMmZzcQB+AApwcQB+A7xzcQB+AA8AAAABdwQAAAAKdAAGbWF0aC5oeHEAfgPBdAAPZmxvYXQgeSxmbG9hdCB4dAAGZmxvYXQgdAAFYXRhbmZzcQB+AApwcQB+A7VzcQB+AA8AAAABdwQAAAAKdAAGbWF0aC5oeHEAfgPHdAAHZmxvYXQgeHQABmZsb2F0IHQABWF0YW5oc3EAfgAKcHQErwogICAgICAgIDxDT0RFPmF0YW5oPC9DT0RFPiBjYWxjdWxhdGVzIHRoZSBpbnZlcnNlIGh5cGVyYm9saWMgdGFuZ2VudCBvZiA8VkFSPng8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IDxDT0RFPmF0YW5oZjwvQ09ERT4gaXMgaWRlbnRpY2FsLCBvdGhlciB0aGFuIHRha2luZyBhbmQgcmV0dXJuaW5nCiAgICAgICAgIDxDT0RFPmZsb2F0PC9DT0RFPiB2YWx1ZXMuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICA8Q09ERT5hdGFuaDwvQ09ERT4gYW5kIDxDT0RFPmF0YW5oZjwvQ09ERT4gcmV0dXJuIHRoZSBjYWxjdWxhdGVkIHZhbHVlLgogICAgICAgICA8YnI+PGJyPiBJZiAKICAgICAgICAgCiAgICAgICAgIDxwcmU+PGJyPgogICAgICAgICA8VkFSPng8L1ZBUj58PGJyPgogICAgICAgICA8L3ByZT48YnI+CiAgICAgICAgIDxicj4KICAgICAgICAgPGJyPgogICAgICAgICBpcyBncmVhdGVyIHRoYW4gMSwgdGhlIGdsb2JhbCA8Q09ERT5lcnJubzwvQ09ERT4gaXMgc2V0IHRvIDxDT0RFPkVET008L0NPREU+IGFuZDxicj4KICAgICAgICAgdGhlIHJlc3VsdCBpcyBhIE5hTi4gIEEgPENPREU+RE9NQUlOIGVycm9yPC9DT0RFPiBpcyByZXBvcnRlZC48YnI+CiAgICAgICAgIDxicj48YnI+IElmIDxicj4KICAgICAgICAgPGJyPgogICAgICAgICA8cHJlPjxicj4KICAgICAgICAgPFZBUj54PC9WQVI+fDxicj4KICAgICAgICAgPC9wcmU+CiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgaXMgMSwgdGhlIGdsb2JhbCA8Q09ERT5lcnJubzwvQ09ERT4gaXMgc2V0IHRvIDxDT0RFPkVET008L0NPREU+OyBhbmQgdGhlIHJlc3VsdCBpcyAKICAgICAgICAgaW5maW5pdHkgd2l0aCB0aGUgc2FtZSBzaWduIGFzIDxDT0RFPng8L0NPREU+LiAgQSA8Q09ERT5TSU5HIGVycm9yPC9DT0RFPiBpcyByZXBvcnRlZC4KICAgICAgICAgPGJyPjxicj4gWW91IGNhbiBtb2RpZnkgdGhlIGVycm9yIGhhbmRsaW5nIGZvciB0aGVzZSByb3V0aW5lcyB1c2luZwogICAgICAgICA8Q09ERT5tYXRoZXJyPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICBOZWl0aGVyIDxDT0RFPmF0YW5oPC9DT0RFPiBub3IgPENPREU+YXRhbmhmPC9DT0RFPiBhcmUgQU5TSSBDLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAXcEAAAACnQABm1hdGguaHhxAH4DzXQACGRvdWJsZSB4dAAHZG91YmxlIHQABmF0YW5oZnNxAH4ACnBxAH4Dz3NxAH4ADwAAAAF3BAAAAAp0AAZtYXRoLmh4cQB+A9R0AAdmbG9hdCB4dAAGZmxvYXQgdAAGYXRleGl0c3EAfgAKcHQGTgogICAgICAgIFlvdSBjYW4gdXNlIDxDT0RFPmF0ZXhpdDwvQ09ERT4gdG8gZW5yb2xsIGZ1bmN0aW9ucyBpbiBhIGxpc3Qgb2YgZnVuY3Rpb25zIHRoYXQKICAgICAgICAgd2lsbCBiZSBjYWxsZWQgd2hlbiB5b3VyIHByb2dyYW0gdGVybWluYXRlcyBub3JtYWxseS4gIFRoZSBhcmd1bWVudCBpcwogICAgICAgICBhIHBvaW50ZXIgdG8gYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gKHdoaWNoIG11c3Qgbm90IHJlcXVpcmUgYXJndW1lbnRzIGFuZAogICAgICAgICBtdXN0IG5vdCByZXR1cm4gYSByZXN1bHQpLgogICAgICAgICA8YnI+PGJyPiBUaGUgZnVuY3Rpb25zIGFyZSBrZXB0IGluIGEgTElGTyBzdGFjazsgdGhhdCBpcywgdGhlIGxhc3QgZnVuY3Rpb24KICAgICAgICAgZW5yb2xsZWQgYnkgPENPREU+YXRleGl0PC9DT0RFPiB3aWxsIGJlIHRoZSBmaXJzdCB0byBleGVjdXRlIHdoZW4geW91ciBwcm9ncmFtCiAgICAgICAgIGV4aXRzLgogICAgICAgICA8YnI+PGJyPiBUaGVyZSBpcyBubyBidWlsdC1pbiBsaW1pdCB0byB0aGUgbnVtYmVyIG9mIGZ1bmN0aW9ucyB5b3UgY2FuIGVucm9sbAogICAgICAgICBpbiB0aGlzIGxpc3Q7IGhvd2V2ZXIsIGFmdGVyIGV2ZXJ5IGdyb3VwIG9mIDMyIGZ1bmN0aW9ucyBpcyBlbnJvbGxlZCwKICAgICAgICAgPENPREU+YXRleGl0PC9DT0RFPiB3aWxsIGNhbGwgPENPREU+bWFsbG9jPC9DT0RFPiB0byBnZXQgc3BhY2UgZm9yIHRoZSBuZXh0IHBhcnQgb2YgdGhlCiAgICAgICAgIGxpc3QuICAgVGhlIGluaXRpYWwgbGlzdCBvZiAzMiBmdW5jdGlvbnMgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQsIHNvCiAgICAgICAgIHlvdSBjYW4gYWx3YXlzIGNvdW50IG9uIGF0IGxlYXN0IHRoYXQgbWFueSBzbG90cyBhdmFpbGFibGUuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICA8Q09ERT5hdGV4aXQ8L0NPREU+IHJldHVybnMgPENPREU+MDwvQ09ERT4gaWYgaXQgc3VjY2VlZHMgaW4gZW5yb2xsaW5nIHlvdXIgZnVuY3Rpb24sCiAgICAgICAgIDxDT0RFPi0xPC9DT0RFPiBpZiBpdCBmYWlscyAocG9zc2libGUgb25seSBpZiBubyBzcGFjZSB3YXMgYXZhaWxhYmxlIGZvcgogICAgICAgICA8Q09ERT5tYWxsb2M8L0NPREU+IHRvIGV4dGVuZCB0aGUgbGlzdCBvZiBmdW5jdGlvbnMpLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIDxDT0RFPmF0ZXhpdDwvQ09ERT4gaXMgcmVxdWlyZWQgYnkgdGhlIEFOU0kgc3RhbmRhcmQsIHdoaWNoIGFsc28gc3BlY2lmaWVzIHRoYXQKICAgICAgICAgaW1wbGVtZW50YXRpb25zIG11c3Qgc3VwcG9ydCBlbnJvbGxpbmcgYXQgbGVhc3QgMzIgZnVuY3Rpb25zLgogICAgICAgICA8YnI+PGJyPiBTdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzIHJlcXVpcmVkOiA8Q09ERT5jbG9zZTwvQ09ERT4sIDxDT0RFPmZzdGF0PC9DT0RFPiwgPENPREU+aXNhdHR5PC9DT0RFPiwKICAgICAgICAgPENPREU+bHNlZWs8L0NPREU+LCA8Q09ERT5yZWFkPC9DT0RFPiwgPENPREU+c2JyazwvQ09ERT4sIDxDT0RFPndyaXRlPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAhzdGRsaWIuaHhxAH4D2nQAFnZvaWQgKCpmdW5jdGlvbikodm9pZCl0AARpbnQgdAAEYXRvZnNxAH4ACnB0CY4KICAgICAgICA8Q09ERT5hdG9mPC9DT0RFPiBjb252ZXJ0cyB0aGUgaW5pdGlhbCBwb3J0aW9uIG9mIGEgc3RyaW5nIHRvIGEgPENPREU+ZG91YmxlPC9DT0RFPi4KICAgICAgICAgPENPREU+YXRvZmY8L0NPREU+IGNvbnZlcnRzIHRoZSBpbml0aWFsIHBvcnRpb24gb2YgYSBzdHJpbmcgdG8gYSA8Q09ERT5mbG9hdDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFRoZSBmdW5jdGlvbnMgcGFyc2UgdGhlIGNoYXJhY3RlciBzdHJpbmcgPFZBUj5zPC9WQVI+LAogICAgICAgICBsb2NhdGluZyBhIHN1YnN0cmluZyB3aGljaCBjYW4gYmUgY29udmVydGVkIHRvIGEgZmxvYXRpbmctcG9pbnQKICAgICAgICAgdmFsdWUuIFRoZSBzdWJzdHJpbmcgbXVzdCBtYXRjaCB0aGUgZm9ybWF0OgogICAgICAgICA8cHJlPjxicj4KICAgICAgICAgIFsrfC1dPFZBUj5kaWdpdHM8L1ZBUj5bLl1bPFZBUj5kaWdpdHM8L1ZBUj5dWyhlfEUpWyt8LV08VkFSPmRpZ2l0czwvVkFSPl08YnI+CiAgICAgICAgIDwvcHJlPgogICAgICAgICBUaGUgc3Vic3RyaW5nIGNvbnZlcnRlZCBpcyB0aGUgbG9uZ2VzdCBpbml0aWFsCiAgICAgICAgIGZyYWdtZW50IG9mIDxWQVI+czwvVkFSPiB0aGF0IGhhcyB0aGUgZXhwZWN0ZWQgZm9ybWF0LCBiZWdpbm5pbmcgd2l0aAogICAgICAgICB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLiAgVGhlIHN1YnN0cmluZwogICAgICAgICBpcyBlbXB0eSBpZiA8Q09ERT5zdHI8L0NPREU+IGlzIGVtcHR5LCBjb25zaXN0cyBlbnRpcmVseQogICAgICAgICBvZiB3aGl0ZXNwYWNlLCBvciBpZiB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzCiAgICAgICAgIHNvbWV0aGluZyBvdGhlciB0aGFuIDxDT0RFPis8L0NPREU+LCA8Q09ERT4tPC9DT0RFPiwgPENPREU+LjwvQ09ERT4sIG9yIGEgZGlnaXQuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPmF0b2YoPFZBUj5zPC9WQVI+KTwvQ09ERT4gaXMgaW1wbGVtZW50ZWQgYXMgPENPREU+c3RydG9kKDxWQVI+czwvVkFSPiwgTlVMTCk8L0NPREU+LgogICAgICAgICA8Q09ERT5hdG9mZig8VkFSPnM8L1ZBUj4pPC9DT0RFPiBpcyBpbXBsZW1lbnRlZCBhcyA8Q09ERT5zdHJ0b2YoPFZBUj5zPC9WQVI+LCBOVUxMKTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICA8Q09ERT5hdG9mPC9DT0RFPiByZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3Vic3RyaW5nIHZhbHVlLCBpZiBhbnksIGFzIGEKICAgICAgICAgPENPREU+ZG91YmxlPC9DT0RFPjsgb3IgPENPREU+MC4wPC9DT0RFPiwgIGlmIG5vIGNvbnZlcnNpb24gY291bGQgYmUgcGVyZm9ybWVkLgogICAgICAgICBJZiB0aGUgY29ycmVjdCB2YWx1ZSBpcyBvdXQgb2YgdGhlIHJhbmdlIG9mIHJlcHJlc2VudGFibGUgdmFsdWVzLCBwbHVzCiAgICAgICAgIG9yIG1pbnVzIDxDT0RFPkhVR0VfVkFMPC9DT0RFPiBpcyByZXR1cm5lZCwgYW5kIDxDT0RFPkVSQU5HRTwvQ09ERT4gaXMgc3RvcmVkIGluCiAgICAgICAgIDxDT0RFPmVycm5vPC9DT0RFPi4KICAgICAgICAgSWYgdGhlIGNvcnJlY3QgdmFsdWUgd291bGQgY2F1c2UgdW5kZXJmbG93LCA8Q09ERT4wLjA8L0NPREU+IGlzIHJldHVybmVkCiAgICAgICAgIGFuZCA8Q09ERT5FUkFOR0U8L0NPREU+IGlzIHN0b3JlZCBpbiA8Q09ERT5lcnJubzwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxDT0RFPmF0b2ZmPC9DT0RFPiBvYmV5cyB0aGUgc2FtZSBydWxlcyBhcyA8Q09ERT5hdG9mPC9DT0RFPiwgZXhjZXB0IHRoYXQgaXQKICAgICAgICAgcmV0dXJucyBhIDxDT0RFPmZsb2F0PC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICA8Q09ERT5hdG9mPC9DT0RFPiBpcyBBTlNJIEMuIDxDT0RFPmF0b2Y8L0NPREU+LCA8Q09ERT5hdG9pPC9DT0RFPiwgYW5kIDxDT0RFPmF0b2w8L0NPREU+IGFyZSBzdWJzdW1lZCBieSA8Q09ERT5zdHJvZDwvQ09ERT4KICAgICAgICAgYW5kIDxDT0RFPnN0cm9sPC9DT0RFPiwgYnV0IGFyZSB1c2VkIGV4dGVuc2l2ZWx5IGluIGV4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dGltZTwvQ09ERT4sIGFuZCBkZWZpbmVzIGl0cyByZXN1bHQgdG8gYmUgaW4gc2Vjb25kcwogICAgICAgICBpbiBhbGwgaW1wbGVtZW50YXRpb25zLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5kaWZmdGltZTwvQ09ERT4gcmVxdWlyZXMgbm8gc3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcy4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAZ0aW1lLmh4cQB+BGN0ABh0aW1lX3QgdGltMSwgdGltZV90IHRpbTJ0AAdkb3VibGUgdAAIZGlwcmludGZzcQB+AApwcQB+AHdzcQB+AA8AAAACdwQAAAAKdAAHc3RkaW8uaHQACHN0ZGFyZy5oeHEAfgRqdAAfaW50IGZkLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLnQABGludCB0AANkaXZzcQB+AApwdAQkCiAgICAgICAgRGl2aWRlCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgPFZBUj5uPC9WQVI+LzxWQVI+ZDwvVkFSPiwKICAgICAgICAgCiAgICAgICAgIHJldHVybmluZyBxdW90aWVudCBhbmQgcmVtYWluZGVyIGFzIHR3byBpbnRlZ2VycyBpbiBhIHN0cnVjdHVyZSA8Q09ERT5kaXZfdDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICBUaGUgcmVzdWx0IGlzIHJlcHJlc2VudGVkIHdpdGggdGhlIHN0cnVjdHVyZQogICAgICAgICA8YnI+PGJyPiA8cHJlPjxicj4KICAgICAgICAgIHR5cGVkZWYgc3RydWN0PGJyPgogICAgICAgICAgezxicj4KICAgICAgICAgICBpbnQgcXVvdDs8YnI+CiAgICAgICAgICAgaW50IHJlbTs8YnI+CiAgICAgICAgICB9IGRpdl90Ozxicj4KICAgICAgICAgPC9wcmU+CiAgICAgICAgIDxicj48YnI+IHdoZXJlIHRoZSA8Q09ERT5xdW90PC9DT0RFPiBmaWVsZCByZXByZXNlbnRzIHRoZSBxdW90aWVudCwgYW5kIDxDT0RFPnJlbTwvQ09ERT4gdGhlCiAgICAgICAgIHJlbWFpbmRlci4gIEZvciBub256ZXJvIDxWQVI+ZDwvVkFSPiwgaWYgYDxDT0RFPjxWQVI+cjwvVkFSPiA9IGRpdig8VkFSPm48L1ZBUj4sPFZBUj5kPC9WQVI+KTs8L0NPREU+JyB0aGVuCiAgICAgICAgIDxWQVI+bjwvVkFSPiBlcXVhbHMgYDxDT0RFPjxWQVI+cjwvVkFSPi5yZW0gKyA8VkFSPmQ8L1ZBUj4qPFZBUj5yPC9WQVI+LnF1b3Q8L0NPREU+Jy4KICAgICAgICAgPGJyPjxicj4gVG8gZGl2aWRlIDxDT0RFPmxvbmc8L0NPREU+IHJhdGhlciB0aGFuIDxDT0RFPmludDwvQ09ERT4gdmFsdWVzLCB1c2UgdGhlIHNpbWlsYXIKICAgICAgICAgZnVuY3Rpb24gPENPREU+bGRpdjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgPENPREU+ZGl2PC9DT0RFPiBpcyBBTlNJLgogICAgICAgICA8YnI+PGJyPiBObyBzdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzIGFyZSByZXF1aXJlZC4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAhzdGRsaWIuaHhxAH4EcXQADGludCBuLCBpbnQgZHQABmRpdl90IHQAB2RwcmludGZzcQB+AApwcQB+AH9zcQB+AA8AAAACdwQAAAAKdAAHc3RkaW8uaHQACHN0ZGFyZy5oeHEAfgR4dAAfaW50IGZkLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLnQABGludCB0AAdkcmFuZDQ4c3EAfgAKcHQQuQogICAgICAgIFRoZSA8Q09ERT5yYW5kNDg8L0NPREU+IGZhbWlseSBvZiBmdW5jdGlvbnMgZ2VuZXJhdGVzIHBzZXVkby1yYW5kb20gbnVtYmVycwogICAgICAgICB1c2luZyBhIGxpbmVhciBjb25ncnVlbnRpYWwgYWxnb3JpdGhtIHdvcmtpbmcgb24gaW50ZWdlcnMgNDggYml0cyBpbiBzaXplLgogICAgICAgICBUaGUgcGFydGljdWxhciBmb3JtdWxhIGVtcGxveWVkIGlzCiAgICAgICAgIHIobisxKSA9IChhICogcihuKSArIGMpIG1vZCBtCiAgICAgICAgIHdoZXJlIHRoZSBkZWZhdWx0IHZhbHVlcyBhcmUKICAgICAgICAgZm9yIHRoZSBtdWx0aXBsaWNhbmQgYSA9IDB4ZmRlZWNlNjZkID0gMjUyMTQ5MDM5MTcgYW5kCiAgICAgICAgIHRoZSBhZGRlbmQgYyA9IDB4YiA9IDExLiBUaGUgbW9kdWxvIGlzIGFsd2F5cyBmaXhlZCBhdCBtID0gMiAqKiA0OC4KICAgICAgICAgcihuKSBpcyBjYWxsZWQgdGhlIHNlZWQgb2YgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgogICAgICAgICA8YnI+PGJyPiBGb3IgYWxsIHRoZSBzaXggZ2VuZXJhdG9yIHJvdXRpbmVzIGRlc2NyaWJlZCBuZXh0LCB0aGUgZmlyc3QKICAgICAgICAgY29tcHV0YXRpb25hbCBzdGVwIGlzIHRvIHBlcmZvcm0gYSBzaW5nbGUgaXRlcmF0aW9uIG9mIHRoZSBhbGdvcml0aG0uCiAgICAgICAgIDxicj48YnI+IDxDT0RFPmRyYW5kNDg8L0NPREU+IGFuZCA8Q09ERT5lcmFuZDQ4PC9DT0RFPgogICAgICAgICByZXR1cm4gdmFsdWVzIG9mIHR5cGUgZG91YmxlLiBUaGUgZnVsbCA0OCBiaXRzIG9mIHIobisxKSBhcmUKICAgICAgICAgbG9hZGVkIGludG8gdGhlIG1hbnRpc3NhIG9mIHRoZSByZXR1cm5lZCB2YWx1ZSwgd2l0aCB0aGUgZXhwb25lbnQgc2V0CiAgICAgICAgIHN1Y2ggdGhhdCB0aGUgdmFsdWVzIHByb2R1Y2VkIGxpZSBpbiB0aGUgaW50ZXJ2YWwgWzAuMCwgMS4wXS4KICAgICAgICAgPGJyPjxicj4gPENPREU+bHJhbmQ0ODwvQ09ERT4gYW5kIDxDT0RFPm5yYW5kNDg8L0NPREU+CiAgICAgICAgIHJldHVybiB2YWx1ZXMgb2YgdHlwZSBsb25nIGluIHRoZSByYW5nZQogICAgICAgICBbMCwgMioqMzEtMV0uIFRoZSBoaWdoLW9yZGVyICgzMSkgYml0cyBvZgogICAgICAgICByKG4rMSkgYXJlIGxvYWRlZCBpbnRvIHRoZSBsb3dlciBiaXRzIG9mIHRoZSByZXR1cm5lZCB2YWx1ZSwgd2l0aAogICAgICAgICB0aGUgdG9wbW9zdCAoc2lnbikgYml0IHNldCB0byB6ZXJvLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5tcmFuZDQ4PC9DT0RFPiBhbmQgPENPREU+anJhbmQ0ODwvQ09ERT4KICAgICAgICAgcmV0dXJuIHZhbHVlcyBvZiB0eXBlIGxvbmcgaW4gdGhlIHJhbmdlCiAgICAgICAgIFstMioqMzEsIDIqKjMxLTFdLiBUaGUgaGlnaC1vcmRlciAoMzIpIGJpdHMgb2YKICAgICAgICAgcihuKzEpIGFyZSBsb2FkZWQgaW50byB0aGUgcmV0dXJuZWQgdmFsdWUuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPmRyYW5kNDg8L0NPREU+LCA8Q09ERT5scmFuZDQ4PC9DT0RFPiwgYW5kIDxDT0RFPm1yYW5kNDg8L0NPREU+CiAgICAgICAgIHVzZSBhbiBpbnRlcm5hbCBidWZmZXIgdG8gc3RvcmUgcihuKS4gRm9yIHRoZXNlIGZ1bmN0aW9ucwogICAgICAgICB0aGUgaW5pdGlhbCB2YWx1ZSBvZiByKDApID0gMHgxMjM0YWJjZDMzMGUgPSAyMDAxNzQyOTk1MTI0Ni4KICAgICAgICAgPGJyPjxicj4gT24gdGhlIG90aGVyIGhhbmQsIDxDT0RFPmVyYW5kNDg8L0NPREU+LCA8Q09ERT5ucmFuZDQ4PC9DT0RFPiwgYW5kIDxDT0RFPmpyYW5kNDg8L0NPREU+CiAgICAgICAgIHVzZSBhIHVzZXItc3VwcGxpZWQgYnVmZmVyIHRvIHN0b3JlIHRoZSBzZWVkIHIobiksCiAgICAgICAgIHdoaWNoIGNvbnNpc3RzIG9mIGFuIGFycmF5IG9mIDMgc2hvcnRzLCB3aGVyZSB0aGUgemVyb3RoIG1lbWJlcgogICAgICAgICBob2xkcyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cy4KICAgICAgICAgPGJyPjxicj4gQWxsIGZ1bmN0aW9ucyBzaGFyZSB0aGUgc2FtZSBtdWx0aXBsaWNhbmQgYW5kIGFkZGVuZC4KICAgICAgICAgPGJyPjxicj4gPENPREU+c3JhbmQ0ODwvQ09ERT4gaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBpbnRlcm5hbCBidWZmZXIgcihuKSBvZgogICAgICAgICA8Q09ERT5kcmFuZDQ4PC9DT0RFPiwgPENPREU+bHJhbmQ0ODwvQ09ERT4sIGFuZCA8Q09ERT5tcmFuZDQ4PC9DT0RFPgogICAgICAgICBzdWNoIHRoYXQgdGhlIDMyIGJpdHMgb2YgdGhlIHNlZWQgdmFsdWUgYXJlIGNvcGllZCBpbnRvIHRoZSB1cHBlciAzMiBiaXRzCiAgICAgICAgIG9mIHIobiksIHdpdGggdGhlIGxvd2VyIDE2IGJpdHMgb2YgcihuKSBhcmJpdHJhcmlseSBiZWluZyBzZXQgdG8gMHgzMzBlLgogICAgICAgICBBZGRpdGlvbmFsbHksIHRoZSBjb25zdGFudCBtdWx0aXBsaWNhbmQgYW5kIGFkZGVuZCBvZiB0aGUgYWxnb3JpdGhtIGFyZQogICAgICAgICByZXNldCB0byB0aGUgZGVmYXVsdCB2YWx1ZXMgZ2l2ZW4gYWJvdmUuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPnNlZWQ0ODwvQ09ERT4gYWxzbyBpbml0aWFsaXplcyB0aGUgaW50ZXJuYWwgYnVmZmVyIHIobikgb2YKICAgICAgICAgPENPREU+ZHJhbmQ0ODwvQ09ERT4sIDxDT0RFPmxyYW5kNDg8L0NPREU+LCBhbmQgPENPREU+bXJhbmQ0ODwvQ09ERT4sCiAgICAgICAgIGJ1dCBoZXJlIGFsbCA0OCBiaXRzIG9mIHRoZSBzZWVkIGNhbiBiZSBzcGVjaWZpZWQgaW4gYW4gYXJyYXkgb2YgMyBzaG9ydHMsCiAgICAgICAgIHdoZXJlIHRoZSB6ZXJvdGggbWVtYmVyIHNwZWNpZmllcyB0aGUgbG93ZXN0IGJpdHMuIEFnYWluLAogICAgICAgICB0aGUgY29uc3RhbnQgbXVsdGlwbGljYW5kIGFuZCBhZGRlbmQgb2YgdGhlIGFsZ29yaXRobSBhcmUKICAgICAgICAgcmVzZXQgdG8gdGhlIGRlZmF1bHQgdmFsdWVzIGdpdmVuIGFib3ZlLgogICAgICAgICA8Q09ERT5zZWVkNDg8L0NPREU+IHJldHVybnMgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIDMgc2hvcnRzIHdoaWNoIGNvbnRhaW5zCiAgICAgICAgIHRoZSBvbGQgc2VlZC4KICAgICAgICAgVGhpcyBhcnJheSBpcyBzdGF0aWNhbGx5IGFsbG9jYXRlZCwgdGh1cyBpdHMgY29udGVudHMgYXJlIGxvc3QgYWZ0ZXIKICAgICAgICAgZWFjaCBuZXcgY2FsbCB0byA8Q09ERT5zZWVkNDg8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBGaW5hbGx5LCA8Q09ERT5sY29uZzQ4PC9DT0RFPiBhbGxvd3MgZnVsbCBjb250cm9sIG92ZXIgdGhlIG11bHRpcGxpY2FuZCBhbmQKICAgICAgICAgYWRkZW5kIHVzZWQgaW4gPENPREU+ZHJhbmQ0ODwvQ09ERT4sIDxDT0RFPmVyYW5kNDg8L0NPREU+LCA8Q09ERT5scmFuZDQ4PC9DT0RFPiwgPENPREU+bnJhbmQ0ODwvQ09ERT4sCiAgICAgICAgIDxDT0RFPm1yYW5kNDg8L0NPREU+LCBhbmQgPENPREU+anJhbmQ0ODwvQ09ERT4sCiAgICAgICAgIGFuZCB0aGUgc2VlZCB1c2VkIGluIDxDT0RFPmRyYW5kNDg8L0NPREU+LCA8Q09ERT5scmFuZDQ4PC9DT0RFPiwgYW5kIDxDT0RFPm1yYW5kNDg8L0NPREU+LgogICAgICAgICBBbiBhcnJheSBvZiA3IHNob3J0cyBpcyBwYXNzZWQgYXMgcGFyYW1ldGVyOyB0aGUgZmlyc3QgdGhyZWUgc2hvcnRzIGFyZQogICAgICAgICB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHNlZWQ7IHRoZSBzZWNvbmQgdGhyZWUgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUKICAgICAgICAgbXVsdGlwbGljYW5kOyBhbmQgdGhlIGxhc3Qgc2hvcnQgaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBhZGRlbmQuCiAgICAgICAgIEl0IGlzIHRodXMgbm90IHBvc3NpYmxlIHRvIHVzZSB2YWx1ZXMgZ3JlYXRlciB0aGFuIDB4ZmZmZiBhcyB0aGUgYWRkZW5kLgogICAgICAgICA8YnI+PGJyPiBOb3RlIHRoYXQgYWxsIHRocmVlIG1ldGhvZHMgb2Ygc2VlZGluZyB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKICAgICAgICAgYWx3YXlzIGFsc28gc2V0IHRoZSBtdWx0aXBsaWNhbmQgYW5kIGFkZGVuZCBmb3IgYW55IG9mIHRoZSBzaXgKICAgICAgICAgZ2VuZXJhdG9yIGNhbGxzLgogICAgICAgICA8YnI+PGJyPiBGb3IgYSBtb3JlIHBvd2VyZnVsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLCBzZWUgPENPREU+cmFuZG9tPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICBTVVMgcmVxdWlyZXMgdGhlc2UgZnVuY3Rpb25zLgogICAgICAgICA8YnI+PGJyPiBObyBzdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzIGFyZSByZXF1aXJlZC4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAhzdGRsaWIuaHhxAH4Ef3QABHZvaWR0AAdkb3VibGUgdAAEZWN2dHNxAH4ACnB0CIgKICAgICAgICA8Q09ERT5lY3Z0PC9DT0RFPiBhbmQgPENPREU+ZmN2dDwvQ09ERT4gcHJvZHVjZSAobnVsbC10ZXJtaW5hdGVkKSBzdHJpbmdzIG9mIGRpZ2l0cwogICAgICAgICByZXByZXNlbnRhdGluZyB0aGUgPENPREU+ZG91YmxlPC9DT0RFPiBudW1iZXIgPFZBUj52YWw8L1ZBUj4uCiAgICAgICAgIDxDT0RFPmVjdnRmPC9DT0RFPiBhbmQgPENPREU+ZmN2dGY8L0NPREU+IHByb2R1Y2UgdGhlIGNvcnJlc3BvbmRpbmcgY2hhcmFjdGVyCiAgICAgICAgIHJlcHJlc2VudGF0aW9ucyBvZiA8Q09ERT5mbG9hdDwvQ09ERT4gbnVtYmVycy4KICAgICAgICAgPGJyPjxicj4gKFRoZSA8Q09ERT5zdGRsaWI8L0NPREU+IGZ1bmN0aW9ucyA8Q09ERT5lY3Z0YnVmPC9DT0RFPiBhbmQgPENPREU+ZmN2dGJ1ZjwvQ09ERT4gYXJlIHJlZW50cmFudAogICAgICAgICB2ZXJzaW9ucyBvZiA8Q09ERT5lY3Z0PC9DT0RFPiBhbmQgPENPREU+ZmN2dDwvQ09ERT4uKQogICAgICAgICA8YnI+PGJyPiBUaGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gPENPREU+ZWN2dDwvQ09ERT4gYW5kIDxDT0RFPmZjdnQ8L0NPREU+IGlzIHRoZQogICAgICAgICBpbnRlcnByZXRhdGlvbiBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50ICg8VkFSPmNoYXJzPC9WQVI+IG9yIDxWQVI+ZGVjaW1hbHM8L1ZBUj4pLgogICAgICAgICBGb3IgPENPREU+ZWN2dDwvQ09ERT4sIHRoZSBzZWNvbmQgYXJndW1lbnQgPFZBUj5jaGFyczwvVkFSPiBzcGVjaWZpZXMgdGhlIHRvdGFsIG51bWJlcgogICAgICAgICBvZiBjaGFyYWN0ZXJzIHRvIHdyaXRlICh3aGljaCBpcyBhbHNvIHRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgZGlnaXRzCiAgICAgICAgIGluIHRoZSBmb3JtYXR0ZWQgc3RyaW5nLCBzaW5jZSB0aGVzZSB0d28gZnVuY3Rpb25zIHdyaXRlIG9ubHkgZGlnaXRzKS4KICAgICAgICAgRm9yIDxDT0RFPmZjdnQ8L0NPREU+LCB0aGUgc2Vjb25kIGFyZ3VtZW50IDxWQVI+ZGVjaW1hbHM8L1ZBUj4gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YKICAgICAgICAgY2hhcmFjdGVycyB0byB3cml0ZSBhZnRlciB0aGUgZGVjaW1hbCBwb2ludDsgYWxsIGRpZ2l0cyBmb3IgdGhlIGludGVnZXIKICAgICAgICAgcGFydCBvZiA8VkFSPnZhbDwvVkFSPiBhcmUgYWx3YXlzIGluY2x1ZGVkLgogICAgICAgICA8YnI+PGJyPiBTaW5jZSA8Q09ERT5lY3Z0PC9DT0RFPiBhbmQgPENPREU+ZmN2dDwvQ09ERT4gd3JpdGUgb25seSBkaWdpdHMgaW4gdGhlIG91dHB1dCBzdHJpbmcsCiAgICAgICAgIHRoZXkgcmVjb3JkIHRoZSBsb2NhdGlvbiBvZiB0aGUgZGVjaW1hbCBwb2ludCBpbiA8Q09ERT4qPFZBUj5kZWNwdDwvVkFSPjwvQ09ERT4sIGFuZAogICAgICAgICB0aGUgc2lnbiBvZiB0aGUgbnVtYmVyIGluIDxDT0RFPio8VkFSPnNnbjwvVkFSPjwvQ09ERT4uICBBZnRlciBmb3JtYXR0aW5nIGEgbnVtYmVyLAogICAgICAgICA8Q09ERT4qPFZBUj5kZWNwdDwvVkFSPjwvQ09ERT4gY29udGFpbnMgdGhlIG51bWJlciBvZiBkaWdpdHMgdG8gdGhlIGxlZnQgb2YgdGhlCiAgICAgICAgIGRlY2ltYWwgcG9pbnQuICA8Q09ERT4qPFZBUj5zZ248L1ZBUj48L0NPREU+IGNvbnRhaW5zIDxDT0RFPjA8L0NPREU+IGlmIHRoZSBudW1iZXIgaXMgcG9zaXRpdmUsCiAgICAgICAgIGFuZCA8Q09ERT4xPC9DT0RFPiBpZiBpdCBpcyBuZWdhdGl2ZS4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIEFsbCBmb3VyIGZ1bmN0aW9ucyByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBuZXcgc3RyaW5nIGNvbnRhaW5pbmcgYQogICAgICAgICBjaGFyYWN0ZXIgcmVwcmVzZW50YXRpb24gb2YgPFZBUj52YWw8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgTm9uZSBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlIEFOU0kgQy4KICAgICAgICAgPGJyPjxicj4gU3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcyByZXF1aXJlZDogPENPREU+Y2xvc2U8L0NPREU+LCA8Q09ERT5mc3RhdDwvQ09ERT4sIDxDT0RFPmlzYXR0eTwvQ09ERT4sCiAgICAgICAgIDxDT0RFPmxzZWVrPC9DT0RFPiwgPENPREU+cmVhZDwvQ09ERT4sIDxDT0RFPnNicms8L0NPREU+LCA8Q09ERT53cml0ZTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAIc3RkbGliLmh4cQB+BIZ0ACtkb3VibGUgdmFsLCBpbnQgY2hhcnMsIGludCAqZGVjcHQsIGludCAqc2dudAAGY2hhciAqdAAHZWN2dGJ1ZnNxAH4ACnB0B+cKICAgICAgICA8Q09ERT5lY3Z0YnVmPC9DT0RFPiBhbmQgPENPREU+ZmN2dGJ1ZjwvQ09ERT4gcHJvZHVjZSAobnVsbC10ZXJtaW5hdGVkKSBzdHJpbmdzCiAgICAgICAgIG9mIGRpZ2l0cyByZXByZXNlbnRhdGluZyB0aGUgPENPREU+ZG91YmxlPC9DT0RFPiBudW1iZXIgPFZBUj52YWw8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IFRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiA8Q09ERT5lY3Z0YnVmPC9DT0RFPiBhbmQgPENPREU+ZmN2dGJ1ZjwvQ09ERT4gaXMgdGhlCiAgICAgICAgIGludGVycHJldGF0aW9uIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQgKDxWQVI+Y2hhcnM8L1ZBUj4gb3IKICAgICAgICAgPFZBUj5kZWNpbWFsczwvVkFSPikuIEZvciA8Q09ERT5lY3Z0YnVmPC9DT0RFPiwgdGhlIHNlY29uZCBhcmd1bWVudCA8VkFSPmNoYXJzPC9WQVI+CiAgICAgICAgIHNwZWNpZmllcyB0aGUgdG90YWwgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gd3JpdGUgKHdoaWNoIGlzCiAgICAgICAgIGFsc28gdGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBkaWdpdHMgaW4gdGhlIGZvcm1hdHRlZCBzdHJpbmcsCiAgICAgICAgIHNpbmNlIHRoZXNlIHR3byBmdW5jdGlvbnMgd3JpdGUgb25seSBkaWdpdHMpLiBGb3IgPENPREU+ZmN2dGJ1ZjwvQ09ERT4sCiAgICAgICAgIHRoZSBzZWNvbmQgYXJndW1lbnQgPFZBUj5kZWNpbWFsczwvVkFSPiBzcGVjaWZpZXMgdGhlIG51bWJlciBvZgogICAgICAgICBjaGFyYWN0ZXJzIHRvIHdyaXRlIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50OyBhbGwgZGlnaXRzIGZvcgogICAgICAgICB0aGUgaW50ZWdlciBwYXJ0IG9mIDxWQVI+dmFsPC9WQVI+IGFyZSBhbHdheXMgaW5jbHVkZWQuCiAgICAgICAgIDxicj48YnI+IFNpbmNlIDxDT0RFPmVjdnRidWY8L0NPREU+IGFuZCA8Q09ERT5mY3Z0YnVmPC9DT0RFPiB3cml0ZSBvbmx5IGRpZ2l0cyBpbiB0aGUKICAgICAgICAgb3V0cHV0IHN0cmluZywgdGhleSByZWNvcmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBkZWNpbWFsIHBvaW50CiAgICAgICAgIGluIDxDT0RFPio8VkFSPmRlY3B0PC9WQVI+PC9DT0RFPiwgYW5kIHRoZSBzaWduIG9mIHRoZSBudW1iZXIgaW4gPENPREU+KjxWQVI+c2duPC9WQVI+PC9DT0RFPi4KICAgICAgICAgQWZ0ZXIgZm9ybWF0dGluZyBhIG51bWJlciwgPENPREU+KjxWQVI+ZGVjcHQ8L1ZBUj48L0NPREU+IGNvbnRhaW5zIHRoZSBudW1iZXIKICAgICAgICAgb2YgZGlnaXRzIHRvIHRoZSBsZWZ0IG9mIHRoZSBkZWNpbWFsIHBvaW50LiAgPENPREU+KjxWQVI+c2duPC9WQVI+PC9DT0RFPgogICAgICAgICBjb250YWlucyA8Q09ERT4wPC9DT0RFPiBpZiB0aGUgbnVtYmVyIGlzIHBvc2l0aXZlLCBhbmQgPENPREU+MTwvQ09ERT4gaWYgaXQgaXMKICAgICAgICAgbmVnYXRpdmUuICBGb3IgYm90aCBmdW5jdGlvbnMsIHlvdSBzdXBwbHkgYSBwb2ludGVyIDxWQVI+YnVmPC9WQVI+IHRvCiAgICAgICAgIGFuIGFyZWEgb2YgbWVtb3J5IHRvIGhvbGQgdGhlIGNvbnZlcnRlZCBzdHJpbmcuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICBCb3RoIGZ1bmN0aW9ucyByZXR1cm4gYSBwb2ludGVyIHRvIDxWQVI+YnVmPC9WQVI+LCB0aGUg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bmcgYSBub3JtYWwKICAgICAgICAgZGlzdHJpYnV0aW9uKS4KICAgICAgICAgCiAgICAgICAgIDxicj48YnI+IDxDT0RFPmVyZmM8L0NPREU+IGNhbGN1bGF0ZXMgdGhlIGNvbXBsZW1lbnRhcnkgcHJvYmFiaWxpdHk7IHRoYXQgaXMsCiAgICAgICAgIDxDT0RFPmVyZmMoPFZBUj54PC9WQVI+KTwvQ09ERT4gaXMgPENPREU+MSAtIGVyZig8VkFSPng8L1ZBUj4pPC9DT0RFPi4gIDxDT0RFPmVyZmM8L0NPREU+IGlzIGNvbXB1dGVkIGRpcmVjdGx5LAogICAgICAgICBzbyB0aGF0IHlvdSBjYW4gdXNlIGl0IHRvIGF2b2lkIHRoZSBsb3NzIG9mIHByZWNpc2lvbiB0aGF0IHdvdWxkCiAgICAgICAgIHJlc3VsdCBmcm9tIHN1YnRyYWN0aW5nIGxhcmdlIHByb2JhYmlsaXRpZXMgKG9uIGxhcmdlIDxWQVI+eDwvVkFSPikgZnJvbSAxLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5lcmZmPC9DT0RFPiBhbmQgPENPREU+ZXJmY2Y8L0NPREU+IGRpZmZlciBmcm9tIDxDT0RFPmVyZjwvQ09ERT4gYW5kIDxDT0RFPmVyZmM8L0NPREU+IG9ubHkgaW4gdGhlCiAgICAgICAgIGFyZ3VtZW50IGFuZCByZXN1bHQgdHlwZXMuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICBGb3IgcG9zaXRpdmUgYXJndW1lbnRzLCA8Q09ERT5lcmY8L0NPREU+IGFuZCBhbGwgaXRzIHZhcmlhbnRzIHJldHVybiBhCiAgICAgICAgIHByb2JhYmlsaXR5LS0tYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIE5vbmUgb2YgdGhlIHZhcmlhbnRzIG9mIDxDT0RFPmVyZjwvQ09ERT4gYXJlIEFOU0kgQy4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAZtYXRoLmh4cQB+BKV0AAhkb3VibGUgeHQAB2RvdWJsZSB0AARlcmZjc3EAfgAKcHEAfgSnc3EAfgAPAAAAAXcEAAAACnQABm1hdGguaHhxAH4ErHQACGRvdWJsZSB4dAAHZG91YmxlIHQABWVyZmNmc3EAfgAKcHEAfgSnc3EAfgAPAAAAAXcEAAAACnQABm1hdGguaHhxAH4EsnQAB2Zsb2F0IHh0AAZmbG9hdCB0AARlcmZmc3EAfgAKcHEAfgSnc3EAfgAPAAAAAXcEAAAACnQABm1hdGguaHhxAH4EuHQAB2Zsb2F0IHh0AAZmbG9hdCB0AARleGl0c3EAfgAKcHQE0QogICAgICAgIFVzZSA8Q09ERT5leGl0PC9DT0RFPiB0byByZXR1cm4gY29udHJvbCBmcm9tIGEgcHJvZ3JhbSB0byB0aGUgaG9zdCBvcGVyYXRpbmcKICAgICAgICAgZW52aXJvbm1lbnQuICBVc2UgdGhlIGFyZ3VtZW50IDxWQVI+Y29kZTwvVkFSPiB0byBwYXNzIGFuIGV4aXQgc3RhdHVzIHRvIHRoZQogICAgICAgICBvcGVyYXRpbmcgZW52aXJvbm1lbnQ6IHR3byBwYXJ0aWN1bGFyIHZhbHVlcywgPENPREU+RVhJVF9TVUNDRVNTPC9DT0RFPiBhbmQKICAgICAgICAgPENPREU+RVhJVF9GQUlMVVJFPC9DT0RFPiwgYXJlIGRlZmluZWQgaW4gYDxDT0RFPnN0ZGxpYi5oPC9DT0RFPicgdG8gaW5kaWNhdGUgc3VjY2VzcyBvcgogICAgICAgICBmYWlsdXJlIGluIGEgcG9ydGFibGUgZmFzaGlvbi4KICAgICAgICAgPGJyPjxicj4gPENPREU+ZXhpdDwvQ09ERT4gZG9lcyB0d28ga2luZHMgb2YgY2xlYW51cCBiZWZvcmUgZW5kaW5nIGV4ZWN1dGlvbiBvZiB5b3VyCiAgICAgICAgIHByb2dyYW0uICBGaXJzdCwgaXQgY2FsbHMgYWxsIGFwcGxpY2F0aW9uLWRlZmluZWQgY2xlYW51cCBmdW5jdGlvbnMKICAgICAgICAgeW91IGhhdmUgZW5yb2xsZWQgd2l0aCA8Q09ERT5hdGV4aXQ8L0NPREU+LiAgU2Vjb25kLCBmaWxlcyBh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IGZ1bmN0aW9ucyBwcm92aWRlIGluZm9ybWF0aW9uIG9uIHRoZSBmbG9hdGluZy1wb2ludAogICAgICAgICBhcmd1bWVudCBzdXBwbGllZC4KICAgICAgICAgPGJyPjxicj4gVGhlcmUgYXJlIGZpdmUgbWFqb3IgbnVtYmVyIGZvcm1hdHM6CiAgICAgICAgIDxETD4KCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT56ZXJvPC9DT0RFPgo8REQ+CiAgICAgICAgIEEgbnVtYmVyIHdoaWNoIGNvbnRhaW5zIGFsbCB6ZXJvIGJpdHMuCiAgICAgICAgIDxEVD48Q09ERT5zdWJub3JtYWw8L0NPREU+CjxERD4KICAgICAgICAgQSBudW1iZXIgd2l0aCBhIHplcm8gZXhwb25lbnQgYnV0IGEgbm9uemVybyBmcmFjdGlvbi4KICAgICAgICAgPERUPjxDT0RFPm5vcm1hbDwvQ09ERT4KPEREPgogICAgICAgICBBIG51bWJlciB3aXRoIGFuIGV4cG9uZW50IGFuZCBhIGZyYWN0aW9uLgogICAgICAgICA8RFQ+PENPREU+aW5maW5pdHk8L0NPREU+CjxERD4KICAgICAgICAgQSBudW1iZXIgd2l0aCBhbiBhbGwgMSdzIGV4cG9uZW50IGFuZCBhIHplcm8gZnJhY3Rpb24uCiAgICAgICAgIDxEVD48Q09ERT5OQU48L0NPREU+CjxERD4KICAgICAgICAgQSBudW1iZXIgd2l0aCBhbiBhbGwgMSdzIGV4cG9uZW50IGFuZCBhIG5vbnplcm8gZnJhY3Rpb24uCiAgICAgICAgIDxicj48YnI+IDwvREw+CiAgICAgICAgIDxicj48YnI+IDxicj48YnI+IDxDT0RFPmlzbmFuPC9DT0RFPiByZXR1cm5zIDEgaWYgdGhlIGFyZ3VtZW50IGlzIGEgbmFuLiA8Q09ERT5pc2luZjwvQ09ERT4KICAgICAgICAgcmV0dXJucyAxIGlmIHRoZSBhcmd1bWVudCBpcyBpbmZpbml0eS4gIDxDT0RFPmZpbml0ZTwvQ09ERT4gcmV0dXJucyAxIGlmIHRoZQogICAgICAgICBhcmd1bWVudCBpcyB6ZXJvLCBzdWJub3JtYWwgb3Igbm9ybWFsLgogICAgICAgICBUaGUgPENPREU+aXNuYW5mPC9DT0RFPiwgPENPREU+aXNpbmZmPC9DT0RFPiBhbmQgPENPREU+ZmluaXRlZjwvQ09ERT4gZnVuY3Rpb25zIHBlcmZvcm0gdGhlIHNhbWUKICAgICAgICAgb3BlcmF0aW9ucyBhcyB0aGVpciA8Q09ERT5pc25hbjwvQ09ERT4sIDxDT0RFPmlzaW5mPC9DT0RFPiBhbmQgPENPREU+ZmluaXRlPC9DT0RFPgogICAgICAgICBjb3VudGVycGFydHMsIGJ1dCBvbiBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuCiAgICAgICAgIDxicj48YnI+IEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoZSBDOTkgc3RhbmRhcmQgZGljdGF0ZXMgdGhhdCA8Q09ERT5pc25hbjwvQ09ERT4KICAgICAgICAgYW5kIDxDT0RFPmlzaW5mPC9DT0RFPiBhcmUgbWFjcm9zIHRoYXQgb3BlcmF0ZSBvbiBtdWx0aXBsZSB0eXBlcyBvZgogICAgICAgICBmbG9hdGluZy1wb2ludC4gIFRoZSBTVVN2MiBzdGFuZGFyZCBkZWNsYXJlcyA8Q09ERT5pc25hbjwvQ09ERT4gYXMKICAgICAgICAgYSBmdW5jdGlvbiB0YWtpbmcgZG91YmxlLiAgTmV3bGliIGhhcyBkZWNpZGVkIHRvIGRlY2xhcmUKICAgICAgICAgdGhlbSBib3RoIGFzIG1hY3JvcyBpbiBtYXRoLmggYW5kIGFzIGZ1bmN0aW9ucyBpbiBpZWVlZnAuaC4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAhpZWVlZnAuaHhxAH4FSHQACmRvdWJsZSBhcmd0AARpbnQgdAAHZmluaXRlZnNxAH4ACnBxAH4FSnNxAH4ADwAAAAF3BAAAAAp0AAhpZWVlZnAuaHhxAH4FT3QACWZsb2F0IGFyZ3QABGludCB0AAhmaXByaW50ZnNxAH4ACnBxAH4AQnNxAH4ADwAAAAF3BAAAAAp0AAdzdGRpby5oeHEAfgVVdAAiRklMRSAqZmQsIGNvbnN0IGNoYXIgKmZvcm1hdCAsIC4uLnQABGludCB0AAdmaXNjYW5mc3EAfgAKcHEAfgDFc3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+BVt0ACFGSUxFICpmZCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi50AARpbnQgdAAFZmxvb3JzcQB+AApwcQB+BCNzcQB+AA8AAAABdwQAAAAKdAAGbWF0aC5oeHEAfgVhdAAIZG91YmxlIHh0AAdkb3VibGUgdAAGZmxvb3Jmc3EAfgAKcHEAfgQjc3EAfgAPAAAAAXcEAAAACnQABm1hdGguaHhxAH4FZ3QAB2Zsb2F0IHh0AAZmbG9hdCB0AAhmbWVtb3BlbnNxAH4ACnB0DDUKICAgICAgICA8Q09ERT5mbWVtb3BlbjwvQ09ERT4gY3JlYXRlcyBhIHNlZWthYmxlIDxDT0RFPkZJTEU8L0NPREU+IHN0cmVhbSB0aGF0IHdyYXBzIGEKICAgICAgICAgZml4ZWQtbGVuZ3RoIGJ1ZmZlciBvZiA8VkFSPnNpemU8L1ZBUj4gYnl0ZXMgc3RhcnRpbmcgYXQgPFZBUj5idWY8L1ZBUj4uICBUaGUgc3RyZWFtCiAgICAgICAgIGlzIG9wZW5lZCB3aXRoIDxWQVI+bW9kZTwvVkFSPiB0cmVhdGVkIGFzIGluIDxDT0RFPmZvcGVuPC9DT0RFPiwgd2hlcmUgYXBwZW5kIG1vZGUKICAgICAgICAgc3RhcnRzIHdyaXRpbmcgYXQgdGhlIGZpcnN0IE5VTCBieXRlLiAgSWYgPFZBUj5idWY8L1ZBUj4gaXMgTlVMTCwgdGhlbgogICAgICAgICA8VkFSPnNpemU8L1ZBUj4gYnl0ZXMgYXJlIGF1dG9tYXRpY2FsbHkgcHJvdmlkZWQgYXMgaWYgYnkgPENPREU+bWFsbG9jPC9DT0RFPiwgd2l0aAogICAgICAgICB0aGUgaW5pdGlhbCBzaXplIG9mIDAsIGFuZCA8VkFSPm1vZGU8L1ZBUj4gbXVzdCBjb250YWluIDxDT0RFPis8L0NPREU+IHNvIHRoYXQgZGF0YQogICAgICAgICBjYW4gYmUgcmVhZCBhZnRlciBpdCBpcyB3cml0dGVuLgogICAgICAgICA8YnI+PGJyPiBUaGUgc3RyZWFtIG1haW50YWlucyBhIGN1cnJlbnQgcG9zaXRpb24sIHdoaWNoIG1vdmVzIGFjY29yZGluZyB0bwogICAgICAgICBieXRlcyByZWFkIG9yIHdyaXR0ZW4sIGFuZCB3aGljaCBjYW4gYmUgb25lIHBhc3QgdGhlIGVuZCBvZiB0aGUgYXJyYXkuCiAgICAgICAgIFRoZSBzdHJlYW0gYWxzbyBtYWludGFpbnMgYSBjdXJyZW50IGZpbGUgc2l6ZSwgd2hpY2ggaXMgbmV2ZXIgZ3JlYXRlcgogICAgICAgICB0aGFuIDxWQVI+c2l6ZTwvVkFSPi4gIElmIDxWQVI+bW9kZTwvVkFSPiBzdGFydHMgd2l0aCA8Q09ERT5yPC9DT0RFPiwgdGhlIHBvc2l0aW9uIHN0YXJ0cyBhdAogICAgICAgICA8Q09ERT4wPC9DT0RFPiwgYW5kIGZpbGUgc2l6ZSBzdGFydHMgYXQgPFZBUj5zaXplPC9WQVI+IGlmIDxWQVI+YnVmPC9WQVI+IHdhcyBwcm92aWRlZC4gIElmCiAgICAgICAgIDxWQVI+bW9kZTwvVkFSPiBzdGFydHMgd2l0aCA8Q09ERT53PC9DT0RFPiwgdGhlIHBvc2l0aW9uIGFuZCBmaWxlIHNpemUgc3RhcnQgYXQgPENPREU+MDwvQ09ERT4sCiAgICAgICAgIGFuZCBpZiA8VkFSPmJ1ZjwvVkFSPiB3YXMgcHJvdmlkZWQsIHRoZSBmaXJzdCBieXRlIGlzIHNldCB0byBOVUwuICBJZgogICAgICAgICA8VkFSPm1vZGU8L1ZBUj4gc3RhcnRzIHdpdGggPENPREU+YTwvQ09ERT4sIHRoZSBwb3NpdGlvbiBhbmQgZmlsZSBzaXplIHN0YXJ0IGF0IHRoZQogICAgICAgICBsb2NhdGlvbiBvZiB0aGUgZmlyc3QgTlVMIGJ5dGUsIG9yIGVsc2UgPFZBUj5zaXplPC9WQVI+IGlmIDxWQVI+YnVmPC9WQVI+IHdhcwogICAgICAgICBwcm92aWRlZC4KICAgICAgICAgPGJyPjxicj4gV2hlbiByZWFkaW5nLCBOVUwgYnl0ZXMgaGF2ZSBubyBzaWduaWZpY2FuY2UsIGFuZCByZWFkcyBjYW5ub3QgZXhjZWVkCiAgICAgICAgIHRoZSBjdXJyZW50IGZpbGUgc2l6ZS4gIFdoZW4gd3JpdGluZywgdGhlIGZpbGUgc2l6ZSBjYW4gaW5jcmVhc2UgdXAgdG8KICAgICAgICAgPFZBUj5zaXplPC9WQVI+IGFzIG5lZWRlZCwgYW5kIE5VTCBieXRlcyBtYXkgYmUgZW1iZWRkZWQgaW4gdGhlIHN0cmVhbSAoc2VlCiAgICAgICAgIDxDT0RFPm9wZW5fbWVtc3RyZWFtPC9DT0RFPiBmb3IgYW4gYWx0ZXJuYXRpdmUgdGhhdCBhdXRvbWF0aWNhbGx5IGVubGFyZ2VzIHRoZQogICAgICAgICBidWZmZXIpLiAgV2hlbiB0aGUgc3RyZWFtIGlzIGZsdXNoZWQgb3IgY2xvc2VkIGFmdGVyIGEgd3JpdGUgdGhhdAogICAgICAgICBjaGFuZ2VkIHRoZSBmaWxlIHNpemUsIGEgTlVMIGJ5dGUgaXMgd3JpdHRlbiBhdCB0aGUgY3VycmVudCBwb3NpdGlvbgogICAgICAgICBpZiB0aGVyZSBpcyBzdGlsbCByb29tOyBpZiB0aGUgc3RyZWFtIGlzIG5vdCBhbHNvIG9wZW4gZm9yIHJlYWRpbmcsIGEKICAgICAgICAgTlVMIGJ5dGUgaXMgYWRkaXRpb25hbGx5IHdyaXR0ZW4gYXQgdGhlIGxhc3QgYnl0ZSBvZiA8VkFSPmJ1ZjwvVkFSPiB3aGVuIHRoZQogICAgICAgICBzdHJlYW0gaGFzIGV4Y2VlZGVkIDxWQVI+c2l6ZTwvVkFSPiwgc28gdGhhdCBhIHdyaXRlLW9ubHkgPFZBUj5idWY8L1ZBUj4gaXMgYWx3YXlzCiAgICAgICAgIE5VTC10ZXJtaW5hdGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBmbHVzaGVkIG9yIGNsb3NlZCAoYW5kIHRoZSBpbml0aWFsCiAgICAgICAgIDxWQVI+c2l6ZTwvVkFSPiBzaG91bGQgdGFrZSB0aGlzIGludG8gYWNjb3VudCkuICBJdCBpcyBub3QgcG9zc2libGUgdG8gc2VlawogICAgICAgICBvdXRzaWRlIHRoZSBib3VuZHMgb2YgPFZBUj5zaXplPC9WQVI+LiAgQSBOVUwgYnl0ZSB3cml0dGVuIGR1cmluZyBhIGZsdXNoIGlzCiAgICAgICAgIHJlc3RvcmVkIHRvIGl0cyBwcmV2aW91cyB2YWx1ZSB3aGVuIHNlZWtpbmcgZWxzZXdoZXJlIGluIHRoZSBzdHJpbmcuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGlzIGFuIG9wZW4gRklMRSBwb2ludGVyIG9uIHN1Y2Nlc3MuICBPbiBlcnJvciwKICAgICAgICAgPENPREU+TlVMTDwvQ09ERT4gaXMgcmV0dXJuZWQsIGFuZCA8Q09ERT5lcnJubzwvQ09ERT4gd2lsbCBiZSBzZXQgdG8gRUlOVkFMIGlmIDxWQVI+c2l6ZTwvVkFSPgogICAgICAgICBpcyB6ZXJvIG9yIDxWQVI+bW9kZTwvVkFSPiBpcyBpbnZhbGlkLCBFTk9NRU0gaWYgPFZBUj5idWY8L1ZBUj4gd2FzIE5VTEwgYW5kIG1lbW9yeQogICAgICAgICBjb3VsZCBub3QgYmUgYWxsb2NhdGVkLCBvciBFTUZJTEUgaWYgdG9vIG1hbnkgc3RyZWFtcyBhcmUgYWxyZWFkeQogICAgICAgICBvcGVuLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgYmVpbmcgYWRkZWQgdG8gUE9TSVggMjAweCwgYnV0IGlzIG5vdCBpbiBQT1NJWCAyMDAxLgogICAgICAgICA8YnI+PGJyPiBTdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzIHJlcXVpcmVkOiA8Q09ERT5zYnJrPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAdzdGRpby5oeHEAfgVtdAA5dm9pZCAqcmVzdHJpY3QgYnVmLCBzaXplX3Qgc2l6ZSxjb25zdCBjaGFyICpyZXN0cmljdCBtb2RldAAGRklMRSAqdAAEZm1vZHNxAH4ACnB0A6AKICAgICAgICBUaGUgPENPREU+Zm1vZDwvQ09ERT4gYW5kIDxDT0RFPmZtb2RmPC9DT0RFPiBmdW5jdGlvbnMgY29tcHV0ZSB0aGUgZmxvYXRpbmctcG9pbnQKICAgICAgICAgcmVtYWluZGVyIG9mIDxWQVI+eDwvVkFSPi88VkFSPnk8L1ZBUj4gKDxWQVI+eDwvVkFSPiBtb2R1bG8gPFZBUj55PC9WQVI+KS4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIFRoZSA8Q09ERT5mbW9kPC9DT0RFPiBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSAKICAgICAgICAgCiAgICAgICAgIDxWQVI+eDwvVkFSPi08VkFSPmk8L1ZBUj4qPFZBUj55PC9WQVI+LCAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICBmb3IgdGhlIGxhcmdlc3QgaW50ZWdlciA8VkFSPmk8L1ZBUj4gc3VjaCB0aGF0LCBpZiA8VkFSPnk8L1ZBUj4gaXMgbm9uemVybywgdGhlCiAgICAgICAgIHJlc3VsdCBoYXMgdGhlIHNhbWUgc2lnbiBhcyA8VkFSPng8L1ZBUj4gYW5kIG1hZ25pdHVkZSBsZXNzIHRoYW4gdGhlCiAgICAgICAgIG1hZ25pdHVkZSBvZiA8VkFSPnk8L1ZBUj4uIAogICAgICAgICA8YnI+PGJyPiA8Q09ERT5mbW9kKDxWQVI+eDwvVkFSPiwwKTwvQ09ERT4gcmV0dXJucyBOYU4sIGFuZCBzZXRzIDxDT0RFPmVycm5vPC9DT0RFPiB0byA8Q09ERT5FRE9NPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gWW91IGNhbiBtb2RpZnkgZXJyb3IgdHJlYXRtZW50IGZvciB0aGVzZSBmdW5jdGlvbnMgdXNpbmcgPENPREU+bWF0aGVycjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgPENPREU+Zm1vZDwvQ09ERT4gaXMgQU5TSSBDLiA8Q09ERT5mbW9kZjwvQ09ERT4gaXMgYW4gZXh0ZW5zaW9uLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAXcEAAAACnQABm1hdGguaHhxAH4FdHQAEmRvdWJsZSB4LCBkb3VibGUgeXQAB2RvdWJsZSB0AAVmbW9kZnNxAH4ACnBxAH4FdnNxAH4ADwAAAAF3BAAAAAp0AAZtYXRoLmh4cQB+BXt0ABBmbG9hdCB4LCBmbG9hdCB5dAAGZmxvYXQgdAAFZm9wZW5zcQB+AApwcQB+ANNzcQB+AA8AAAABdwQAAAAKdAAHc3RkaW8uaHhxAH4FgXQAImNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKm1vZGV0AAZGSUxFICp0AAdmb3BlbjY0c3EAfgAKcHEAfgDMc3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+BYd0ACJjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICptb2RldAAGRklMRSAqdAALZm9wZW5jb29raWVzcQB+AApwdA5KCiAgICAgICAgPENPREU+Zm9wZW5jb29raWU8L0NPREU+IGNyZWF0ZXMgYSA8Q09ERT5GSUxFPC9DT0RFPiBzdHJlYW0gd2hlcmUgSS9PIGlzIHBlcmZvcm1lZCB1c2luZwogICAgICAgICBjdXN0b20gY2FsbGJhY2tzLiAgVGhlIGNhbGxiYWNrcyBhcmUgcmVnaXN0ZXJlZCB2aWEgdGhlIHN0cnVjdHVyZToKICAgICAgICAgPGJyPjxicj4gdHlwZWRlZiBzc2l6ZV90ICgqY29va2llX3JlYWRfZnVuY3Rpb25fdCkodm9pZCAqX2Nvb2tpZSwgY2hhciAqX2J1ZiwKICAgICAgICAgc2l6ZV90IF9uKTsKICAgICAgICAgdHlwZWRlZiBzc2l6ZV90ICgqY29va2llX3dyaXRlX2Z1bmN0aW9uX3QpKHZvaWQgKl9jb29raWUsCiAgICAgICAgIGNvbnN0IGNoYXIgKl9idWYsIHNpemVfdCBfbik7CiAgICAgICAgIHR5cGVkZWYgaW50ICgqY29va2llX3NlZWtfZnVuY3Rpb25fdCkodm9pZCAqX2Nvb2tpZSwgb2ZmX3QgKl9vZmYsCiAgICAgICAgIGludCBfd2hlbmNlKTsKICAgICAgICAgdHlwZWRlZiBpbnQgKCpjb29raWVfY2xvc2VfZnVuY3Rpb25fdCkodm9pZCAqX2Nvb2tpZSk7CiAgICAgICAgIDxicj48YnI+IDxwcmU+PGJyPgogICAgICAgICAJdHlwZWRlZiBzdHJ1Y3Q8YnI+CiAgICAgICAgIAl7PGJyPgogICAgICAgICAJCWNvb2tpZV9yZWFkX2Z1bmN0aW9uX3QJKnJlYWQ7PGJyPgogICAgICAgICAJCWNvb2tpZV93cml0ZV9mdW5jdGlvbl90ICp3cml0ZTs8YnI+CiAgICAgICAgIAkJY29va2llX3NlZWtfZnVuY3Rpb25fdAkqc2Vlazs8YnI+CiAgICAgICAgIAkJY29va2llX2Nsb3NlX2Z1bmN0aW9uX3QgKmNsb3NlOzxicj4KICAgICAgICAgCX0gY29va2llX2lvX2Z1bmN0aW9uc190Ozxicj4KICAgICAgICAgPC9wcmU+CiAgICAgICAgIDxicj48YnI+IFRoZSBzdHJlYW0gaXMgb3BlbmVkIHdpdGggPFZBUj5tb2RlPC9WQVI+IHRyZWF0ZWQgYXMgaW4gPENPREU+Zm9wZW48L0NPREU+LiAgVGhlCiAgICAgICAgIGNhbGxiYWNrcyA8VkFSPmZ1bmN0aW9ucy5yZWFkPC9WQVI+IGFuZCA8VkFSPmZ1bmN0aW9ucy53cml0ZTwvVkFSPiBtYXkgb25seSBiZSBOVUxMCiAgICAgICAgIHdoZW4gPFZBUj5tb2RlPC9WQVI+IGRvZXMgbm90IHJlcXVpcmUgdGhlbS4KICAgICAgICAgPGJyPjxicj4gPFZBUj5mdW5jdGlvbnMucmVhZDwvVkFSPiBzaG91bGQgcmV0dXJuIC0xIG9uIGZhaWx1cmUsIG9yIGVsc2UgdGhlIG51bWJlciBvZgogICAgICAgICBieXRlcyByZWFkICgwIG9uIEVPRikuICBJdCBpcyBzaW1pbGFyIHRvIDxDT0RFPnJlYWQ8L0NPREU+LCBleGNlcHQgdGhhdAogICAgICAgICA8VkFSPmNvb2tpZTwvVkFSPiB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQuCiAgICAgICAgIDxicj48YnI+IDxWQVI+ZnVuY3Rpb25zLndyaXRlPC9WQVI+IHNob3VsZCByZXR1cm4gLTEgb24gZmFpbHVyZSwgb3IgZWxzZSB0aGUgbnVtYmVyIG9mCiAgICAgICAgIGJ5dGVzIHdyaXR0ZW4uICBJdCBpcyBzaW1pbGFyIHRvIDxDT0RFPndyaXRlPC9DT0RFPiwgZXhjZXB0IHRoYXQgPFZBUj5jb29raWU8L1ZBUj4KICAgICAgICAgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LgogICAgICAgICA8YnI+PGJyPiA8VkFSPmZ1bmN0aW9ucy5zZWVrPC9WQVI+IHNob3VsZCByZXR1cm4gLTEgb24gZmFpbHVyZSwgYW5kIDAgb24gc3VjY2Vzcywgd2l0aAogICAgICAgICA8VkFSPl9vZmY8L1ZBUj4gc2V0IHRvIHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24uICBJdCBpcyBhIGNyb3NzIGJldHdlZW4KICAgICAgICAgPENPREU+bHNlZWs8L0NPREU+IGFuZCA8Q09ERT5mc2VlazwvQ09ERT4sIHdpdGggdGhlIDxWQVI+X3doZW5jZTwvVkFSPiBhcmd1bWVudCBpbnRlcnByZXRlZCBpbgogICAgICAgICB0aGUgc2FtZSBtYW5uZXIuICBBIE5VTEwgPFZBUj5mdW5jdGlvbnMuc2VlazwvVkFSPiBtYWtlcyB0aGUgc3RyZWFtIGJlaGF2ZQogICAgICAgICBzaW1pbGFybHkgdG8gYSBwaXBlIGluIHJlbGF0aW9uIHRvIHN0ZGlvIGZ1bmN0aW9ucyB0aGF0IHJlcXVpcmUKICAgICAgICAgcG9zaXRpb25pbmcuCiAgICAgICAgIDxicj48YnI+IDxWQVI+ZnVuY3Rpb25zLmNsb3NlPC9WQVI+IHNob3VsZCByZXR1cm4gLTEgb24gZmFpbHVyZSwgb3IgMCBvbiBzdWNjZXNzLiAgSXQKICAgICAgICAgaXMgc2ltaWxhciB0byA8Q09ERT5jbG9zZTwvQ09ERT4sIGV4Y2VwdCB0aGF0IDxWQVI+Y29va2llPC9WQVI+IHdpbGwgYmUgcGFzc2VkIGFzIHRoZQogICAgICAgICBmaXJzdCBhcmd1bWVudC4gIEEgTlVMTCA8VkFSPmZ1bmN0aW9ucy5jbG9zZTwvVkFSPiBtZXJlbHkgZmx1c2hlcyBhbGwgZGF0YQogICAgICAgICB0aGVuIGxldHMgPENPREU+ZmNsb3NlPC9DT0RFPiBzdWNjZWVkLiAgQSBmYWlsZWQgY2xvc2Ugd2lsbCBzdGlsbCBpbnZhbGlkYXRlCiAgICAgICAgIHRoZSBzdHJlYW0uCiAgICAgICAgIDxicj48YnI+IFJlYWQgYW5kIHdyaXRlIEkvTyBmdW5jdGlvbnMgYXJlIGFsbG93ZWQgdG8gY2hhbmdlIHRoZSB1bmRlcmx5aW5nCiAgICAgICAgIGJ1ZmZlciBvbiBmdWxseSBidWZmZXJlZCBvciBsaW5lIGJ1ZmZlcmVkIHN0cmVhbXMgYnkgY2FsbGluZwogICAgICAgICA8Q09ERT5zZXR2YnVmPC9DT0RFPi4gIFRoZXkgYXJlIGFsc28gbm90IHJlcXVpcmVkIHRvIGNvbXBsZXRlbHkgZmlsbCBvciBlbXB0eQogICAgICAgICB0aGUgYnVmZmVyLiAgVGhleSBhcmUgbm90LCBob3dldmVyLCBhbGxvd2VkIHRvIGNoYW5nZSBzdHJlYW1zIGZyb20KICAgICAgICAgdW5idWZmZXJlZCB0byBidWZmZXJlZCBvciB0byBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSBsaW5lIGJ1ZmZlcmluZwogICAgICAgICBmbGFnLiAgVGhleSBtdXN0IGFsc28gYmUgcHJlcGFyZWQgdG8gaGF2ZSByZWFkIG9yIHdyaXRlIGNhbGxzIG9jY3VyIG9uCiAgICAgICAgIGJ1ZmZlcnMgb3RoZXIgdGhhbiB0aGUgb25lIG1vc3QgcmVjZW50bHkgc3BlY2lmaWVkLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgVGhlIHJldHVybiB2YWx1ZSBpcyBhbiBvcGVuIEZJTEUgcG9pbnRlciBvbiBzdWNjZXNzLiAgT24gZXJyb3IsCiAgICAgICAgIDxDT0RFPk5VTEw8L0NPREU+IGlzIHJldHVybmVkLCBhbmQgPENPREU+ZXJybm88L0NPREU+IHdpbGwgYmUgc2V0IHRvIEVJTlZBTCBpZiBhCiAgICAgICAgIGZ1bmN0aW9uIHBvaW50ZXIgaXMgbWlzc2luZyBvciA8VkFSPm1vZGU8L1ZBUj4gaXMgaW52YWxpZCwgRU5PTUVNIGlmIHRoZQogICAgICAgICBzdHJlYW0gY2Fubm90IGJlIGNyZWF0ZWQsIG9yIEVNRklMRSBpZiB0b28gbWFueSBzdHJlYW1zIGFyZSBhbHJlYWR5CiAgICAgICAgIG9wZW4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBhIG5ld2xpYiBleHRlbnNpb24sIGNvcHlpbmcgdGhlIHByb3RvdHlwZSBmcm9tIExpbnV4LgogICAgICAgICBJdCBpcyBub3QgcG9ydGFibGUuICBTZWUgYWxzbyB0aGUgPENPREU+ZnVub3BlbjwvQ09ERT4gaW50ZXJmYWNlIGZyb20gQlNELgogICAgICAgICA8YnI+PGJyPiBTdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzIHJlcXVpcmVkOiA8Q09ERT5zYnJrPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAdzdGRpby5oeHEAfgWNdABEY29uc3Qgdm9pZCAqY29va2llLCBjb25zdCBjaGFyICptb2RlLGNvb2tpZV9pb19mdW5jdGlvbnNfdCBmdW5jdGlvbnN0AAZGSUxFICp0AAdmcHJpbnRmc3EAfgAKcHEAfgBPc3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+BZR0ACFGSUxFICpmZCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi50AARpbnQgdAAFZnB1dGNzcQB+AApwcQB+AOBzcQB+AA8AAAABdwQAAAAKdAAHc3RkaW8uaHhxAH4FmnQAEGludCBjaCwgRklMRSAqZnB0AARpbnQgdAAFZnB1dHNzcQB+AApwcQB+AOdzcQB+AA8AAAABdwQAAAAKdAAHc3RkaW8uaHhxAH4FoHQAF2NvbnN0IGNoYXIgKnMsIEZJTEUgKmZwdAAEaW50IHQABWZyZWFkc3EAfgAKcHEAfgDuc3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+BaZ0AC12b2lkICpidWYsIHNpemVfdCBzaXplLCBzaXplX3QgY291bnQsRklMRSAqZnB0AAdzaXplX3QgdAAEZnJlZXNxAH4ACnBxAH4A9XNxAH4ADwAAAAF3BAAAAAp0AAhzdGRsaWIuaHhxAH4FrHQACnZvaWQgKmFwdHJ0AAV2b2lkIHQAB2ZyZW9wZW5zcQB+AApwcQB+AQNzcQB+AA8AAAABdwQAAAAKdAAHc3RkaW8uaHhxAH4FsnQAK2NvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKm1vZGUsRklMRSAqZnB0AAZGSUxFICp0AAlmcmVvcGVuNjRzcQB+AApwcQB+APxzcQB+AA8AAAABdwQAAAAKdAAHc3RkaW8uaHhxAH4FuHQAK2NvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKm1vZGUsRklMRSAqZnB0AAZGSUxFICp0AAVmcmV4cHNxAH4ACnB0BMcKICAgICAgICBBbGwgbm9uemVybywgbm9ybWFsIG51bWJlcnMgY2FuIGJlIGRlc2NyaWJlZCBhcyA8VkFSPm08L1ZBUj4gKiAyKio8VkFSPnA8L1ZBUj4uCiAgICAgICAgIDxDT0RFPmZyZXhwPC9DT0RFPiByZXByZXNlbnRzIHRoZSBkb3VibGUgPFZBUj52YWw8L1ZBUj4gYXMgYSBtYW50aXNzYSA8VkFSPm08L1ZBUj4KICAgICAgICAgYW5kIGEgcG93ZXIgb2YgdHdvIDxWQVI+cDwvVkFSPi4gVGhlIHJlc3VsdGluZyBtYW50aXNzYSB3aWxsIGFsd2F5cwogICAgICAgICBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gPENPREU+MC41PC9DT0RFPiwgYW5kIGxlc3MgdGhhbiA8Q09ERT4xLjA8L0NPREU+IChhcwogICAgICAgICBsb25nIGFzIDxWQVI+dmFsPC9WQVI+IGlzIG5vbnplcm8pLiBUaGUgcG93ZXIgb2YgdHdvIHdpbGwgYmUgc3RvcmVkCiAgICAgICAgIGluIDxDT0RFPio8L0NPREU+PFZBUj5leHA8L1ZBUj4uIAogICAgICAgICA8YnI+PGJyPiAKICAgICAgICAgPFZBUj5tPC9WQVI+IGFuZCA8VkFSPnA8L1ZBUj4gYXJlIGNhbGN1bGF0ZWQgc28gdGhhdAogICAgICAgICA8VkFSPnZhbDwvVkFSPiBpcyA8VkFSPm08L1ZBUj4gdGltZXMgPENPREU+MjwvQ09ERT4gdG8gdGhlIHBvd2VyIDxWQVI+cDwvVkFSPi4KICAgICAgICAgCiAgICAgICAgIAogICAgICAgICA8YnI+PGJyPiA8Q09ERT5mcmV4cGY8L0NPREU+IGlzIGlkZW50aWNhbCwgb3RoZXIgdGhhbiB0YWtpbmcgYW5kIHJldHVybmluZwogICAgICAgICBmbG9hdHMgcmF0aGVyIHRoYW4gZG91Ymxlcy4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIDxDT0RFPmZyZXhwPC9DT0RFPiByZXR1cm5zIHRoZSBtYW50aXNzYSA8VkFSPm08L1ZBUj4uIElmIDxWQVI+dmFsPC9WQVI+IGlzIDxDT0RFPjA8L0NPREU+LCBpbmZpbml0eSwKICAgICAgICAgb3IgTmFuLCA8Q09ERT5mcmV4cDwvQ09ERT4gd2lsbCBzZXQgPENPREU+KjwvQ09ERT48VkFSPmV4cDwvVkFSPiB0byA8Q09ERT4wPC9DT0RFPiBhbmQgcmV0dXJuIDxWQVI+dmFsPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIDxDT0RFPmZyZXhwPC9DT0RFPiBpcyBBTlNJLgogICAgICAgICA8Q09ERT5mcmV4cGY8L0NPREU+IGlzIGFuIGV4dGVuc2lvbi4KICAgICAgICAgPGJyPjxicj4gPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAZtYXRoLmh4cQB+Bb50ABRkb3VibGUgdmFsLCBpbnQgKmV4cHQAB2RvdWJsZSB0AAZmcmV4cGZzcQB+AApwcQB+BcBzcQB+AA8AAAABdwQAAAAKdAAGbWF0aC5oeHEAfgXFdAATZmxvYXQgdmFsLCBpbnQgKmV4cHQABmZsb2F0IHQABmZyb3BlbnNxAH4ACnB0DJMKICAgICAgICA8Q09ERT5mdW5vcGVuPC9DT0RFPiBjcmVhdGVzIGEgPENPREU+RklMRTwvQ09ERT4gc3RyZWFtIHdoZXJlIEkvTyBpcyBwZXJmb3JtZWQgdXNpbmcKICAgICAgICAgY3VzdG9tIGNhbGxiYWNrcy4gIEF0IGxlYXN0IG9uZSBvZiA8VkFSPnJlYWRmbjwvVkFSPiBhbmQgPFZBUj53cml0ZWZuPC9WQVI+IG11c3QgYmUKICAgICAgICAgcHJvdmlkZWQsIHdoaWNoIGRldGVybWluZXMgd2hldGhlciB0aGUgc3RyZWFtIGJlaGF2ZXMgd2l0aCBtb2RlIDwiciI+LAogICAgICAgICA8InciPiwgb3IgPCJyKyI+LgogICAgICAgICA8YnI+PGJyPiA8VkFSPnJlYWRmbjwvVkFSPiBzaG91bGQgcmV0dXJuIC0xIG9uIGZhaWx1cmUsIG9yIGVsc2UgdGhlIG51bWJlciBvZiBieXRlcwogICAgICAgICByZWFkICgwIG9uIEVPRikuICBJdCBpcyBzaW1pbGFyIHRvIDxDT0RFPnJlYWQ8L0NPREU+LCBleGNlcHQgdGhhdCA8aW50PiByYXRoZXIKICAgICAgICAgdGhhbiA8c2l6ZV90PiBib3VuZHMgYSB0cmFuc2FjdGlvbiBzaXplLCBhbmQgPFZBUj5jb29raWU8L1ZBUj4gd2lsbCBiZSBwYXNzZWQKICAgICAgICAgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LiAgQSBOVUxMIDxWQVI+cmVhZGZuPC9WQVI+IG1ha2VzIGF0dGVtcHRzIHRvIHJlYWQgdGhlCiAgICAgICAgIHN0cmVhbSBmYWlsLgogICAgICAgICA8YnI+PGJyPiA8VkFSPndyaXRlZm48L1ZBUj4gc2hvdWxkIHJldHVybiAtMSBvbiBmYWlsdXJlLCBvciBlbHNlIHRoZSBudW1iZXIgb2YgYnl0ZXMKICAgICAgICAgd3JpdHRlbi4gIEl0IGlzIHNpbWlsYXIgdG8gPENPREU+d3JpdGU8L0NPREU+LCBleGNlcHQgdGhhdCA8aW50PiByYXRoZXIgdGhhbgogICAgICAgICA8c2l6ZV90PiBib3VuZHMgYSB0cmFuc2FjdGlvbiBzaXplLCBhbmQgPFZBUj5jb29raWU8L1ZBUj4gd2lsbCBiZSBwYXNzZWQgYXMKICAgICAgICAgdGhlIGZpcnN0IGFyZ3VtZW50LiAgQSBOVUxMIDxWQVI+d3JpdGVmbjwvVkFSPiBtYWtlcyBhdHRlbXB0cyB0byB3cml0ZSB0aGUKICAgICAgICAgc3RyZWFtIGZhaWwuCiAgICAgICAgIDxicj48YnI+IDxWQVI+c2Vla2ZuPC9WQVI+IHNob3VsZCByZXR1cm4gKGZwb3NfdCktMSBvbiBmYWlsdXJlLCBvciBlbHNlIHRoZSBjdXJyZW50CiAgICAgICAgIGZpbGUgcG9zaXRpb24uICBJdCBpcyBzaW1pbGFyIHRvIDxDT0RFPmxzZWVrPC9DT0RFPiwgZXhjZXB0IHRoYXQgPFZBUj5jb29raWU8L1ZBUj4KICAgICAgICAgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LiAgQSBOVUxMIDxWQVI+c2Vla2ZuPC9WQVI+IG1ha2VzIHRoZQogICAgICAgICBzdHJlYW0gYmVoYXZlIHNpbWlsYXJseSB0byBhIHBpcGUgaW4gcmVsYXRpb24gdG8gc3RkaW8gZnVuY3Rpb25zIHRoYXQKICAgICAgICAgcmVxdWlyZSBwb3NpdGlvbmluZy4gIFRoaXMgaW1wbGVtZW50YXRpb24gYXNzdW1lcyBmcG9zX3QgYW5kIG9mZl90IGFyZQogICAgICAgICB0aGUgc2FtZSB0eXBlLgogICAgICAgICA8YnI+PGJyPiA8VkFSPmNsb3NlZm48L1ZBUj4gc2hvdWxkIHJldHVybiAtMSBvbiBmYWlsdXJlLCBvciAwIG9uIHN1Y2Nlc3MuICBJdCBpcwogICAgICAgICBzaW1pbGFyIHRvIDxDT0RFPmNsb3NlPC9DT0RFPiwgZXhjZXB0IHRoYXQgPFZBUj5jb29raWU8L1ZBUj4gd2lsbCBiZSBwYXNzZWQgYXMgdGhlCiAgICAgICAgIGZpcnN0IGFyZ3VtZW50LiAgQSBOVUxMIDxWQVI+Y2xvc2VmbjwvVkFSPiBtZXJlbHkgZmx1c2hlcyBhbGwgZGF0YSB0aGVuIGxldHMKICAgICAgICAgPENPREU+ZmNsb3NlPC9DT0RFPiBzdWNjZWVkLiAgQSBmYWlsZWQgY2xvc2Ugd2lsbCBzdGlsbCBpbnZhbGlkYXRlIHRoZSBzdHJlYW0uCiAgICAgICAgIDxicj48YnI+IFJlYWQgYW5kIHdyaXRlIEkvTyBmdW5jdGlvbnMgYXJlIGFsbG93ZWQgdG8gY2hhbmdlIHRoZSB1bmRlcmx5aW5nCiAgICAgICAgIGJ1ZmZlciBvbiBmdWxseSBidWZmZXJlZCBvciBsaW5lIGJ1ZmZlcmVkIHN0cmVhbXMgYnkgY2FsbGluZwogICAgICAgICA8Q09ERT5zZXR2YnVmPC9DT0RFPi4gIFRoZXkgYXJlIGFsc28gbm90IHJlcXVpcmVkIHRvIGNvbXBsZXRlbHkgZmlsbCBvciBlbXB0eQogICAgICAgICB0aGUgYnVmZmVyLiAgVGhleSBhcmUgbm90LCBob3dldmVyLCBhbGxvd2VkIHRvIGNoYW5nZSBzdHJlYW1zIGZyb20KICAgICAgICAgdW5idWZmZXJlZCB0byBidWZmZXJlZCBvciB0byBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSBsaW5lIGJ1ZmZlcmluZwogICAgICAgICBmbGFnLiAgVGhleSBtdXN0IGFsc28gYmUgcHJlcGFyZWQgdG8gaGF2ZSByZWFkIG9yIHdyaXRlIGNhbGxzIG9jY3VyIG9uCiAgICAgICAgIGJ1ZmZlcnMgb3RoZXIgdGhhbiB0aGUgb25lIG1vc3QgcmVjZW50bHkgc3BlY2lmaWVkLgogICAgICAgICA8YnI+PGJyPiBUaGUgZnVuY3Rpb25zIDxDT0RFPmZyb3BlbjwvQ09ERT4gYW5kIDxDT0RFPmZ3b3BlbjwvQ09ERT4gYXJlIGNvbnZlbmllbmNlIG1hY3JvcyBhcm91bmQKICAgICAgICAgPENPREU+ZnVub3BlbjwvQ09ERT4gdGhhdCBvbmx5IHVzZSB0aGUgc3BlY2lmaWVkIGNhbGxiYWNrLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgVGhlIHJldHVybiB2YWx1ZSBpcyBhbiBvcGVuIEZJTEUgcG9pbnRlciBvbiBzdWNjZXNzLiAgT24gZXJyb3IsCiAgICAgICAgIDxDT0RFPk5VTEw8L0NPREU+IGlzIHJldHVybmVkLCBhbmQgPENPREU+ZXJybm88L0NPREU+IHdpbGwgYmUgc2V0IHRvIEVJTlZBTCBpZiBhCiAgICAgICAgIGZ1bmN0aW9uIHBvaW50ZXIgaXMgbWlzc2luZywgRU5PTUVNIGlmIHRoZSBzdHJlYW0gY2Fubm90IGJlIGNyZWF0ZWQsCiAgICAgICAgIG9yIEVNRklM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c3EAfgAKcHQKJgogICAgICAgIDxDT0RFPmdhbW1hPC9DT0RFPiBjYWxjdWxhdGVzIAogICAgICAgICAKICAgICAgICAgdGhlIG5hdHVyYWwgbG9nYXJpdGhtIG9mIHRoZSBnYW1tYSBmdW5jdGlvbiBvZiA8VkFSPng8L1ZBUj4uICBUaGUgZ2FtbWEgZnVuY3Rpb24KICAgICAgICAgKDxDT0RFPmV4cChnYW1tYSg8VkFSPng8L1ZBUj4pKTwvQ09ERT4pIGlzIGEgZ2VuZXJhbGl6YXRpb24gb2YgZmFjdG9yaWFsLCBhbmQgcmV0YWlucwogICAgICAgICB0aGUgcHJvcGVydHkgdGhhdCAgCiAgICAgICAgIAogICAgICAgICA8Q09ERT5leHAoZ2FtbWEoTikpPC9DT0RFPiBpcyBlcXVpdmFsZW50IHRvIDxDT0RFPk4qZXhwKGdhbW1hKE4tMSkpPC9DT0RFPi4KICAgICAgICAgCiAgICAgICAgIAogICAgICAgICBBY2NvcmRpbmdseSwgdGhlIHJlc3VsdHMgb2YgdGhlIGdhbW1hIGZ1bmN0aW9uIGl0c2VsZiBncm93IHZlcnkKICAgICAgICAgcXVpY2tseS4gIDxDT0RFPmdhbW1hPC9DT0RFPiBpcyBkZWZpbmVkIGFzIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIHRoZSBuYXR1cmFsIGxvZyBvZiB0aGUgZ2FtbWEgZnVuY3Rpb24sIHJhdGhlciB0aGFuIHRoZSBnYW1tYSBmdW5jdGlvbgogICAgICAgICBpdHNlbGYsIAogICAgICAgICAKICAgICAgICAgdG8gZXh0ZW5kIHRoZSB1c2VmdWwgcmFuZ2Ugb2YgcmVzdWx0cyByZXByZXNlbnRhYmxlLgogICAgICAgICA8YnI+PGJyPiBUaGUgc2lnbiBvZiB0aGUgcmVzdWx0IGlzIHJldHVybmVkIGluIHRoZSBnbG9iYWwgdmFyaWFibGUgPENPREU+c2lnbmdhbTwvQ09ERT4sCiAgICAgICAgIHdoaWNoIGlzIGRlY2xhcmVkIGluIG1hdGguaC4KICAgICAgICAgPGJyPjxicj4gPENPREU+Z2FtbWFmPC9DT0RFPiBwZXJmb3JtcyB0aGUgc2FtZSBjYWxjdWxhdGlvbiBhcyA8Q09ERT5nYW1tYTwvQ09ERT4sIGJ1dCB1c2VzIGFuZAogICAgICAgICByZXR1cm5zIDxDT0RFPmZsb2F0PC9DT0RFPiB2YWx1ZXMuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPmxnYW1tYTwvQ09ERT4gYW5kIDxDT0RFPmxnYW1tYWY8L0NPREU+IGFyZSBhbHRlcm5hdGUgbmFtZXMgZm9yIDxDT0RFPmdhbW1hPC9DT0RFPiBhbmQKICAgICAgICAgPENPREU+Z2FtbWFmPC9DT0RFPi4gIFRoZSB1c2Ugb2YgPENPREU+bGdhbW1hPC9DT0RFPiBpbnN0ZWFkIG9mIDxDT0RFPmdhbW1hPC9DT0RFPiBpcyBhIHJlbWluZGVyCiAgICAgICAgIHRoYXQgdGhlc2UgZnVuY3Rpb25zIGNvbXB1dGUgdGhlIGxvZyBvZiB0aGUgZ2FtbWEgZnVuY3Rpb24sIHJhdGhlcgogICAgICAgICB0aGFuIHRoZSBnYW1tYSBmdW5jdGlvbiBpdHNlbGYuCiAgICAgICAgIDxicj48YnI+IFRoZSBmdW5jdGlvbnMgPENPREU+Z2FtbWFfcjwvQ09ERT4sIDxDT0RFPmdhbW1hZl9yPC9DT0RFPiwgPENPREU+bGdhbW1hX3I8L0NPREU+LCBhbmQKICAgICAgICAgPENPREU+bGdhbW1hZl9yPC9DT0RFPiBhcmUganVzdCBsaWtlIDxDT0RFPmdhbW1hPC9DT0RFPiwgPENPREU+Z2FtbWFmPC9DT0RFPiwgPENPREU+bGdhbW1hPC9DT0RFPiwgYW5kCiAgICAgICAgIDxDT0RFPmxnYW1tYWY8L0NPREU+LCByZXNwZWN0aXZlbHksIGJ1dCB0YWtlIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQuICBUaGlzCiAgICAgICAgIGFkZGl0aW9uYWwgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIGFuIGludGVnZXIuICBUaGlzIGFkZGl0aW9uYWwKICAgICAgICAgYXJndW1lbnQgaXMgdXNlZCB0byByZXR1cm4gdGhlIHNpZ24gb2YgdGhlIHJlc3VsdCwgYW5kIHRoZSBnbG9iYWwKICAgICAgICAgdmFyaWFibGUgPENPREU+c2lnbmdhbTwvQ09ERT4gaXMgbm90IHVzZWQuICBUaGVzZSBmdW5jdGlvbnMgbWF5IGJlIHVzZWQgZm9yCiAgICAgICAgIHJlZW50cmFudCBjYWxscyAoYnV0IHRoZXkgd2lsbCBzdGlsbCBzZXQgdGhlIGdsb2JhbCB2YXJpYWJsZSA8Q09ERT5lcnJubzwvQ09ERT4KICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzKS4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIE5vcm1hbGx5LCB0aGUgY29tcHV0ZWQgcmVzdWx0IGlzIHJldHVybmVkLiAgCiAgICAgICAgIDxicj48YnI+IFdoZW4gPFZBUj54PC9WQVI+IGlzIGEgbm9ucG9zaXRpdmUgaW50ZWdlciwgPENPREU+Z2FtbWE8L0NPREU+IHJldHVybnMgPENPREU+SFVHRV9WQUw8L0NPREU+CiAgICAgICAgIGFuZCA8Q09ERT5lcnJubzwvQ09ERT4gaXMgc2V0IHRvIDxDT0RFPkVET008L0NPREU+LiAgSWYgdGhlIHJlc3VsdCBvdmVyZmxvd3MsIDxDT0RFPmdhbW1hPC9DT0RFPgogICAgICAgICByZXR1cm5zIDxDT0RFPkhVR0VfVkFMPC9DT0RFPiBhbmQgPENPREU+ZXJybm88L0NPREU+IGlzIHNldCB0byA8Q09ERT5FUkFOR0U8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBZb3UgY2FuIG1vZGlmeSB0aGlzIGVycm9yIHRyZWF0bWVudCB1c2luZyA8Q09ERT5tYXRoZXJyPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICBOZWl0aGVyIDxDT0RFPmdhbW1hPC9DT0RFPiBub3IgPENPREU+Z2FtbWFmPC9DT0RFPiBpcyBBTlNJIEMuICAKICAgICAgICAgKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAZtYXRoLmh4cQB+Bhp0AAhkb3VibGUgeHQAB2RvdWJsZSB0AAdnYW1tYV9yc3EAfgAKcHEAfgYcc3EAfgAPAAAAAXcEAAAACnQABm1hdGguaHhxAH4GIXQAF2RvdWJsZSB4LCBpbnQgKnNpZ25nYW1wdAAHZG91YmxlIHQABmdhbW1hZnNxAH4ACnBxAH4GHHNxAH4ADwAAAAF3BAAAAAp0AAZtYXRoLmh4cQB+Bid0AAdmbG9hdCB4dAAGZmxvYXQgdAAIZ2FtbWFmX3JzcQB+AApwcQB+BhxzcQB+AA8AAAABdwQAAAAKdAAGbWF0aC5oeHEAfgYtdAAWZmxvYXQgeCwgaW50ICpzaWduZ2FtcHQABmZsb2F0IHQABGdjdnRzcQB+AApwdARjCiAgICAgICAgPENPREU+Z2N2dDwvQ09ERT4gd3JpdGVzIGEgZnVsbHkgZm9ybWF0dGVkIG51bWJlciBhcyBhIG51bGwtdGVybWluYXRlZAogICAgICAgICBzdHJpbmcgaW4gdGhlIGJ1ZmZlciA8Q09ERT4qPFZBUj5idWY8L1ZBUj48L0NPREU+LiAgPENPREU+Z2R2dGY8L0NPREU+IHByb2R1Y2VzIGNvcnJlc3BvbmRpbmcKICAgICAgICAgY2hhcmFjdGVyIHJlcHJlc2VudGF0aW9ucyBvZiA8Q09ERT5mbG9hdDwvQ09ERT4gbnVtYmVycy4KICAgICAgICAgPGJyPjxicj4gPENPREU+Z2N2dDwvQ09ERT4gdXNlcyB0aGUgc2FtZSBydWxlcyBhcyB0aGUgPENPREU+cHJpbnRmPC9DT0RFPiBmb3JtYXQKICAgICAgICAgYDxDT0RFPiUuPFZBUj5wcmVjaXNpb248L1ZBUj5nPC9DT0RFPictLS1vbmx5IG5lZ2F0aXZlIHZhbHVlcyBhcmUgc2lnbmVkICh3aXRoCiAgICAgICAgIGA8Q09ERT4tPC9DT0RFPicpLCBhbmQgZWl0aGVyIGV4cG9uZW50aWFsIG9yIG9yZGluYXJ5IGRlY2ltYWwtZnJhY3Rpb24gZm9ybWF0CiAgICAgICAgIGlzIGNob3NlbiBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBkaWdpdHMgKHNwZWNpZmllZCBieQogICAgICAgICA8VkFSPnByZWNpc2lvbjwvVkFSPikuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICBUaGUgcmVzdWx0IGlzIGEgcG9pbnRlciB0byB0aGUgZm9ybWF0dGVkIHJlcHJlc2VudGF0aW9uIG9mIDxWQVI+dmFsPC9WQVI+CiAgICAgICAgICh0aGUgc2FtZSBhcyB0aGUgYXJndW1lbnQgPFZBUj5idWY8L1ZBUj4pLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIE5laXRoZXIgZnVuY3Rpb24gaXMgQU5TSSBDLgogICAgICAgICA8YnI+PGJyPiBTdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzIHJlcXVpcmVkOiA8Q09ERT5jbG9zZTwvQ09ERT4sIDxDT0RFPmZzdGF0PC9DT0RFPiwgPENPREU+aXNhdHR5PC9DT0RFPiwKICAgICAgICAgPENPREU+bHNlZWs8L0NPREU+LCA8Q09ERT5yZWFkPC9DT0RFPiwgPENPREU+c2JyazwvQ09ERT4sIDxDT0RFPndyaXRlPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAhzdGRsaWIuaHhxAH4GM3QAJGRvdWJsZSB2YWwsIGludCBwcmVjaXNpb24sIGNoYXIgKmJ1ZnQABmNoYXIgKnQABWdjdnRmc3EAfgAKcHEAfgY1c3EAfgAPAAAAAXcEAAAACnQACHN0ZGxpYi5oeHEAfgY6dAAjZmxvYXQgdmFsLCBpbnQgcHJlY2lzaW9uLCBjaGFyICpidWZ0AAZjaGFyICp0AARnZXRjc3EAfgAKcHEAfgFOc3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+BkB0AAhGSUxFICpmcHQABGludCB0AA1nZXRjX3VubG9ja2Vkc3EAfgAKcHEAfgFVc3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+BkZ0AAhGSUxFICpmcHQABGludCB0AAdnZXRjaGFyc3EAfgAKcHEAfgFcc3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+Bkx0AAR2b2lkdAAEaW50IHQAEGdldGNoYXJfdW5sb2NrZWRzcQB+AApwcQB+AWNzcQB+AA8AAAABdwQAAAAKdAAHc3RkaW8uaHhxAH4GUnQAAHQABGludCB0AAhnZXRkZWxpbXNxAH4ACnB0A4oKICAgICAgICA8Q09ERT5nZXRkZWxpbTwvQ09ERT4gcmVhZHMgYSBmaWxlIDxWQVI+ZnA8L1ZBUj4gdXAgdG8gYW5kIHBvc3NpYmx5IGluY2x1ZGluZyBhIHNwZWNpZmllZAogICAgICAgICBkZWxpbWl0ZXIgPFZBUj5kZWxpbTwvVkFSPi4gIFRoZSBsaW5lIGlzIHJlYWQgaW50byBhIGJ1ZmZlciBwb2ludGVkIHRvCiAgICAgICAgIGJ5IDxWQVI+YnVmcHRyPC9WQVI+IGFuZCBkZXNpZ25hdGVkIHdpdGggc2l6ZSAqPFZBUj5uPC9WQVI+LiAgSWYgdGhlIGJ1ZmZlciBpcwogICAgICAgICBub3QgbGFyZ2UgZW5vdWdoLCBpdCB3aWxsIGJlIGR5bmFtaWNhbGx5IGdyb3duIGJ5IDxDT0RFPmdldGRlbGltPC9DT0RFPi4KICAgICAgICAgQXMgdGhlIGJ1ZmZlciBpcyBncm93biwgdGhlIHBvaW50ZXIgdG8gdGhlIHNpemUgPFZBUj5uPC9WQVI+IHdpbGwgYmUKICAgICAgICAgdXBkYXRlZC4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIDxDT0RFPmdldGRlbGltPC9DT0RFPiByZXR1cm5zIDxDT0RFPi0xPC9DT0RFPiBpZiBubyBjaGFyYWN0ZXJzIHdlcmUgc3VjY2Vzc2Z1bGx5IHJlYWQ7CiAgICAgICAgIG90aGVyd2lzZSwgaXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHN1Y2Nlc3NmdWxseSByZWFkLgogICAgICAgICBBdCBlbmQgb2YgZmlsZSwgdGhlIHJlc3VsdCBpcyBub256ZXJvLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIDxDT0RFPmdldGRlbGltPC9DT0RFPiBpcyBhIGdsaWJjIGV4dGVuc2lvbi4KICAgICAgICAgPGJyPjxicj4gTm8gc3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcyBhcmUgZGly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ICAgICBDb29yZGluYXRlZCBUaW1lIChVVEMsIGFsc28ga25vd24gaW4gc29tZSBjb3VudHJpZXMgYXMgR01ULAogICAgICAgICBHcmVlbndpY2ggTWVhbiB0aW1lKSBhbmQgY29udmVydHMgaXQgdG8gYSA8Q09ERT5zdHJ1Y3QgdG08L0NPREU+CiAgICAgICAgIHJlcHJlc2VudGF0aW9uLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5nbXRpbWU8L0NPREU+IGNvbnN0cnVjdHMgdGhlIHRyYWRpdGlvbmFsIHRpbWUgcmVwcmVzZW50YXRpb24gaW4gc3RhdGljCiAgICAgICAgIHN0b3JhZ2U7IGVhY2ggY2FsbCB0byA8Q09ERT5nbXRpbWU8L0NPREU+IG9yIDxDT0RFPmxvY2FsdGltZTwvQ09ERT4gd2lsbCBvdmVyd3JpdGUgdGhlCiAgICAgICAgIGluZm9ybWF0aW9uIGdlbmVyYXRlZCBieSBwcmV2aW91cyBjYWxscyB0byBlaXRoZXIgZnVuY3Rpb24uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIHRyYWRpdGlvbmFsIHRpbWUgcmVwcmVzZW50YXRpb24gKDxDT0RFPnN0cnVjdCB0bTwvQ09ERT4pLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIEFOU0kgQyByZXF1aXJlcyA8Q09ERT5nbXRpbWU8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5nbXRpbWU8L0NPREU+IHJlcXVpcmVzIG5vIHN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAGdGltZS5oeHEAfgZ5dAATY29uc3QgdGltZV90ICpjbG9ja3QAC3N0cnVjdCB0bSAqdAAIZ210aW1lX3JzcQB+AApwcQB+BntzcQB+AA8AAAABdwQAAAAKdAAGdGltZS5oeHEAfgaAdAAjY29uc3QgdGltZV90ICpjbG9jaywg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QmVzc2VsIGZ1bmN0aW9ucyBhcmUgYSBmYW1pbHkgb2YgZnVuY3Rpb25zIHRoYXQgc29sdmUgdGhlCiAgICAgICAgIGRpZmZlcmVudGlhbCBlcXVhdGlvbiAKICAgICAgICAgCiAgICAgICAgIDxwcmU+PGJyPgogICAgICAgICAgIDIgICAgICAgICAgICAgICAyICAgIDI8YnI+CiAgICAgICAgICB4ICB5JycgKyB4eScgKyAoeCAgLSBwICl5ICA9IDA8YnI+CiAgICAgICAgIDwvcHJlPgogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIFRoZXNlIGZ1bmN0aW9ucyBoYXZlIG1hbnkgYXBwbGljYXRpb25zIGluIGVuZ2luZWVyaW5nIGFuZCBwaHlzaWNzLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5qbjwvQ09ERT4gY2FsY3VsYXRlcyB0aGUgQmVzc2VsIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBraW5kIG9mIG9yZGVyCiAgICAgICAgIDxWQVI+bjwvVkFSPi4gIDxDT0RFPmowPC9DT0RFPiBhbmQgPENPREU+ajE8L0NPREU+IGFyZSBzcGVjaWFsIGNhc2VzIGZvciBvcmRlciAwIGFuZCBvcmRlcgogICAgICAgICAxIHJlc3BlY3RpdmVseS4KICAgICAgICAgPGJyPjxicj4gU2ltaWxhcmx5LCA8Q09ERT55bjwvQ09ERT4gY2FsY3VsYXRlcyB0aGUgQmVzc2VsIGZ1bmN0aW9uIG9mIHRoZSBzZWNvbmQga2luZCBvZgogICAgICAgICBvcmRlciA8VkFSPm48L1ZBUj4sIGFuZCA8Q09ERT55MDwvQ09ERT4gYW5kIDxDT0RFPnkxPC9DT0RFPiBhcmUgc3BlY2lhbCBjYXNlcyBmb3Igb3JkZXIgMCBhbmQKICAgICAgICAgMS4KICAgICAgICAgPGJyPjxicj4gPENPREU+am5mPC9DT0RFPiwgPENPREU+ajBmPC9DT0RFPiwgPENPREU+ajFmPC9DT0RFPiwgPENPREU+eW5mPC9DT0RFPiwgPENPREU+eTBmPC9DT0RFPiwgYW5kIDxDT0RFPnkxZjwvQ09ERT4gcGVyZm9ybSB0aGUKICAgICAgICAgc2FtZSBjYWxjdWxhdGlvbnMsIGJ1dCBvbiA8Q09ERT5mbG9hdDwvQ09ERT4gcmF0aGVyIHRoYW4gPENPREU+ZG91YmxlPC9DT0RFPiB2YWx1ZXMuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICBUaGUgdmFsdWUgb2YgZWFjaCBCZXNzZWwgZnVuY3Rpb24gYXQgPFZBUj54PC9WQVI+IGlzIHJldHVybmVkLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIE5vbmUgb2YgdGhlIEJlc3NlbCBmdW5jdGlvbnMgYXJlIGluIEFOU0kgQy4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAZtYXRoLmh4cQB+B4Z0AAhkb3VibGUgeHQAB2RvdWJsZSB0AANqMGZzcQB+AApwcQB+B4hzcQB+AA8AAAABdwQAAAAKdAAGbWF0aC5oeHEAfgeNdAAHZmxvYXQgeHQABmZsb2F0IHQAAmoxc3EAfgAKcHEAfgeIc3EAfgAPAAAAAXcEAAAACnQABm1hdGguaHhxAH4Hk3QACGRvdWJsZSB4dAAHZG91YmxlIHQAA2oxZnNxAH4ACnBxAH4HiHNxAH4ADwAAAAF3BAAAAAp0AAZtYXRoLmh4cQB+B5l0AAdmbG9hdCB4dAAGZmxvYXQgdAACam5zcQB+AApwcQB+B4hzcQB+AA8AAAABdwQAAAAKdAAGbWF0aC5oeHEAfgefdAAPaW50IG4sIGRvdWJsZSB4dAAHZG91YmxlIHQAA2puZnNxAH4ACnBxAH4HiHNxAH4ADwAAAAF3BAAAAAp0AAZtYXRoLmh4cQB+B6V0AA5pbnQgbiwgZmxvYXQgeHQABmZsb2F0IHQAB2pyYW5kNDhzcQB+AApwcQB+BIFzcQB+AA8AAAABdwQAAAAKdAAIc3RkbGliLmh4cQB+B6t0ABd1bnNpZ25lZCBzaG9ydCB4c2VlZFszXXQABWxvbmcgdAAEbDY0YXNxAH4ACnBxAH4DR3NxAH4ADwAAAAF3BAAAAAp0AAhzdGRsaWIuaHhxAH4HsXQACmxvbmcgaW5wdXR0AAZjaGFyICp0AARsYWJzc3EAfgAKcHQCyAogICAgICAgIDxDT0RFPmxhYnM8L0NPREU+IHJldHVybnMKICAgICAgICAgCiAgICAgICAgIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiA8VkFSPmk8L1ZBUj4gKGFsc28gY2FsbGVkIHRoZSBtYWduaXR1ZGUKICAgICAgICAgb2YgPFZBUj5pPC9WQVI+KS4gIFRoYXQgaXMsIGlmIDxWQVI+aTwvVkFSPiBpcyBuZWdhdGl2ZSwgdGhlIHJlc3VsdCBpcyB0aGUgb3Bwb3NpdGUKICAgICAgICAgb2YgPFZBUj5pPC9WQVI+LCBidXQgaWYgPFZBUj5pPC9WQVI+IGlzIG5vbm5lZ2F0aXZlIHRoZSByZXN1bHQgaXMgPFZBUj5pPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiBUaGUgc2ltaWxhciBmdW5jdGlvbiA8Q09ERT5hYnM8L0NPREU+IHVzZXMgYW5kIHJldHVybnMgPENPREU+aW50PC9DT0RFPiByYXRoZXIgdGhhbgogICAgICAgICA8Q09ERT5sb25nPC9DT0RFPiB2YWx1ZXMuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICBUaGUgcmVzdWx0IGlzIGEgbm9ubmVnYXRpdmUgbG9uZyBpbnRlZ2VyLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIDxDT0RFPmxhYnM8L0NPREU+IGlzIEFOU0kuCiAgICAgICAgIDxicj48YnI+IE5vIHN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZSBjYWxscyBhcmUgcmVxdWlyZWQuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAIc3RkbGliLmh4cQB+B7d0AAZsb25nIGl0AAVsb25nIHQAB2xjb25nNDhzcQB+AApwcQB+BIFzcQB+AA8AAAABdwQAAAAKdAAIc3RkbGliLmh4cQB+B750ABN1bnNpZ25lZCBzaG9ydCBwWzdddAAFdm9pZCB0AAVsZGV4cHNxAH4ACnB0AxwKICAgICAgICA8Q09ERT5sZGV4cDwvQ09ERT4gY2FsY3VsYXRlcyB0aGUgdmFsdWUgCiAgICAgICAgIAogICAgICAgICA8VkFSPnZhbDwvVkFSPiB0aW1lcyAyIHRvIHRoZSBwb3dlciA8VkFSPmV4cDwvVkFSPi4KICAgICAgICAgCiAgICAgICAgIAogICAgICAgICA8Q09ERT5sZGV4cGY8L0NPREU+IGlzIGlkZW50aWNhbCwgc2F2ZSB0aGF0IGl0IHRha2VzIGFuZCByZXR1cm5zIDxDT0RFPmZsb2F0PC9DT0RFPgogICAgICAgICByYXRoZXIgdGhhbiA8Q09ERT5kb3VibGU8L0NPREU+IHZhbHVlcy4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIDxDT0RFPmxkZXhwPC9DT0RFPiByZXR1cm5zIHRoZSBjYWxjdWxhdGVkIHZhbHVlLgogICAgICAgICA8YnI+PGJyPiBVbmRlcmZsb3cgYW5kIG92ZXJmbG93IGJvdGggc2V0IDxDT0RFPmVycm5vPC9DT0RFPiB0byA8Q09ERT5FUkFOR0U8L0NPREU+LgogICAgICAgICBPbiB1bmRlcmZsb3csIDxDT0RFPmxkZXhwPC9DT0RFPiBhbmQgPENPREU+bGRleHBmPC9DT0RFPiByZXR1cm4gMC4wLgogICAgICAgICBPbiBvdmVyZmxvdywgPENPREU+bGRleHA8L0NPREU+IHJldHVybnMgcGx1cyBvciBtaW51cyA8Q09ERT5IVUdFX1ZBTDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgPENPREU+bGRleHA8L0NPREU+IGlzIEFOU0kuIDxDT0RFPmxkZXhwZjwvQ09ERT4gaXMgYW4gZXh0ZW5zaW9uLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAXcEAAAACnQABm1hdGguaHhxAH4HxHQAE2RvdWJsZSB2YWwsIGludCBleHB0AAdkb3VibGUgdAAGbGRleHBmc3EAfgAKcHEAfgfGc3EAfgAPAAAAAXcEAAAACnQABm1hdGguaHhxAH4Hy3QAEmZsb2F0IHZhbCwgaW50IGV4cHQABmZsb2F0IHQABGxkaXZzcQB+AApwdAQuCiAgICAgICAgRGl2aWRlCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgPFZBUj5uPC9WQVI+LzxWQVI+ZDwvVkFSPiwKICAgICAgICAgCiAgICAgICAgIHJldHVybmluZyBxdW90aWVudCBhbmQgcmVtYWluZGVyIGFzIHR3byBsb25nIGludGVnZXJzIGluIGEgc3RydWN0dXJlIDxDT0RFPmxkaXZfdDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICBUaGUgcmVzdWx0IGlzIHJlcHJlc2VudGVkIHdpdGggdGhlIHN0cnVjdHVyZQogICAgICAgICA8YnI+PGJyPiA8cHJlPjxicj4KICAgICAgICAgIHR5cGVkZWYgc3RydWN0PGJyPgogICAgICAgICAgezxicj4KICAgICAgICAgICBsb25nIHF1b3Q7PGJyPgogICAgICAgICAgIGxvbmcgcmVtOzxicj4KICAgICAgICAgIH0gbGRpdl90Ozxicj4KICAgICAgICAgPC9wcmU+CiAgICAgICAgIDxicj48YnI+IHdoZXJlIHRoZSA8Q09ERT5xdW90PC9DT0RFPiBmaWVsZCByZXByZXNlbnRzIHRoZSBxdW90aWVudCwgYW5kIDxDT0RFPnJlbTwvQ09ERT4gdGhlCiAgICAgICAgIHJlbWFpbmRlci4gIEZvciBub256ZXJvIDxWQVI+ZDwvVkFSPiwgaWYgYDxDT0RFPjxWQVI+cjwvVkFSPiA9IGxkaXYoPFZBUj5uPC9WQVI+LDxWQVI+ZDwvVkFSPik7PC9DT0RFPicgdGhlbgogICAgICAgICA8VkFSPm48L1ZBUj4gZXF1YWxzIGA8Q09ERT48VkFSPnI8L1ZBUj4ucmVtICsgPFZBUj5kPC9WQVI+KjxWQVI+cjwvVkFSPi5xdW90PC9DT0RFPicuCiAgICAgICAgIDxicj48YnI+IFRvIGRpdmlkZSA8Q09ERT5pbnQ8L0NPREU+IHJhdGhlciB0aGFuIDxDT0RFPmxvbmc8L0NPREU+IHZhbHVlcywgdXNlIHRoZSBzaW1pbGFyCiAgICAgICAgIGZ1bmN0aW9uIDxDT0RFPmRpdjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgPENPREU+bGRpdjwvQ09ERT4gaXMgQU5TSS4KICAgICAgICAgPGJyPjxicj4gTm8gc3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcyBhcmUgcmVxdWlyZWQuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAIc3RkbGliLmh4cQB+B9F0AA5sb25nIG4sIGxvbmcgZHQAB2xkaXZfdCB0AAZsZ2FtbWFzcQB+AApwcQB+BhxzcQB+AA8AAAABdwQAAAAKdAAGbWF0aC5oeHEAfgfYdAAIZG91YmxlIHh0AAdkb3VibGUgdAAIbGdhbW1hX3JzcQB+AApwcQB+BhxzcQB+AA8AAAABdwQAAAAKdAAGbWF0aC5oeHEAfgfedAAXZG91YmxlIHgsIGludCAqc2lnbmdhbXB0AAdkb3VibGUgdAAHbGdhbW1hZnNxAH4ACnBxAH4GHHNxAH4ADwAAAAF3BAAAAAp0AAZtYXRoLmh4cQB+B+R0AAdmbG9hdCB4dAAGZmxvYXQgdAAJbGdhbW1hZl9yc3EAfgAKcHEAfgYcc3EAfgAPAAAAAXcEAAAACnQABm1hdGguaHhxAH4H6nQAFmZsb2F0IHgsIGludCAqc2lnbmdhbXB0AAZmbG9hdCB0AAVsbGFic3NxAH4ACnB0AlgKICAgICAgICBUaGUgPENPREU+bGxhYnM8L0NPREU+IGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgbG9uZyBsb25nIGludGVnZXIgCiAgICAgICAgIGFyZ3VtZW50IDxWQVI+ajwvVkFSPiAoYWxzbyBjYWxsZWQgdGhlIG1hZ25pdHVkZSBvZiA8VkFSPmo8L1ZBUj4pLgogICAgICAgICA8YnI+PGJyPiBUaGUgc2ltaWxhciBmdW5jdGlvbiA8Q09ERT5sYWJzPC9DT0RFPiB1c2VzIGFuZCByZXR1cm5zIDxDT0RFPmxvbmc8L0NPREU+IHJhdGhlciB0aGFuCiAgICAgICAgIDxDT0RFPmxvbmcgbG9uZzwvQ09ERT4gdmFsdWVzLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgQSBub25uZWdhdGl2ZSBsb25nIGxvbmcgaW50ZWdlci4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICA8Q09ERT5sbGFiczwvQ09ERT4gaXMgSVNPIDk4OTkgKEM5OSkgY29tcGF0YWJsZS4KICAgICAgICAgPGJyPjxicj4gTm8gc3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcyBhcmUgcmVxdWlyZWQuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAIc3RkbGliLmh4cQB+B/B0AAtsb25nIGxvbmcganQACmxvbmcgbG9uZyB0AAVsbGRpdnNxAH4ACnB0BGYKICAgICAgICBEaXZpZGUKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICA8VkFSPm48L1ZBUj4vPFZBUj5kPC9WQVI+LAogICAgICAgICAKICAgICAgICAgcmV0dXJuaW5nIHF1b3RpZW50IGFuZCByZW1haW5kZXIgYXMgdHdvIGxvbmcgbG9uZyBpbnRlZ2VycyBpbiBhIHN0cnVjdHVyZSAKICAgICAgICAgPENPREU+bGxkaXZfdDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICBUaGUgcmVzdWx0IGlzIHJlcHJlc2VudGVkIHdpdGggdGhlIHN0cnVjdHVyZQogICAgICAgICA8YnI+PGJyPiA8cHJlPjxicj4KICAgICAgICAgIHR5cGVkZWYgc3RydWN0PGJyPgogICAgICAgICAgezxicj4KICAgICAgICAgICBsb25nIGxvbmcgcXVvdDs8YnI+CiAgICAgICAgICAgbG9uZyBsb25nIHJlbTs8YnI+CiAgICAgICAgICB9IGxsZGl2X3Q7PGJyPgogICAgICAgICA8L3ByZT4KICAgICAgICAgPGJyPjxicj4gd2hlcmUgdGhlIDxDT0RFPnF1b3Q8L0NPREU+IGZpZWxkIHJlcHJlc2VudHMgdGhlIHF1b3RpZW50LCBhbmQgPENPREU+cmVtPC9DT0RFPiB0aGUKICAgICAgICAgcmVtYWluZGVyLiAgRm9yIG5vbnplcm8gPFZBUj5kPC9WQVI+LCBpZiBgPENPREU+PFZBUj5yPC9WQVI+ID0gbGRpdig8VkFSPm48L1ZBUj4sPFZBUj5kPC9WQVI+KTs8L0NPREU+JyB0aGVuCiAgICAgICAgIDxWQVI+bjwvVkFSPiBlcXVhbHMgYDxDT0RFPjxWQVI+cjwvVkFSPi5yZW0gKyA8VkFSPmQ8L1ZBUj4qPFZBUj5yPC9WQVI+LnF1b3Q8L0NPREU+Jy4KICAgICAgICAgPGJyPjxicj4gVG8gZGl2aWRlIDxDT0RFPmxvbmc8L0NPREU+IHJhdGhlciB0aGFuIDxDT0RFPmxvbmcgbG9uZzwvQ09ERT4gdmFsdWVzLCB1c2UgdGhlIHNpbWlsYXIKICAgICAgICAgZnVuY3Rpb24gPENPREU+bGRpdjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgPENPREU+bGxkaXY8L0NPREU+IGlzIElTTyA5ODk5IChDOTkpIGNvbXBhdGFibGUuCiAgICAgICAgIDxicj48YnI+IE5vIHN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMgYXJlIHJlcXVpcmVkLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAXcEAAAACnQACHN0ZGxpYi5oeHEAfgf3dAAYbG9uZyBsb25nIG4sIGxvbmcgbG9uZyBkdAAIbGxkaXZfdCB0AApsb2NhbGVjb252c3EAfgAKcHEAfgGCc3EAfgAPAAAAAXcEAAAACnQACGxvY2FsZS5oeHEAfgf+dAAEdm9pZHQAB2xjb252ICp0AAlsb2NhbHRpbWVzcQB+AApwdAOaCiAgICAgICAgPENPREU+bG9jYWx0aW1lPC9DT0RFPiBjb252ZXJ0cyB0aGUgdGltZSBhdCA8VkFSPmNsb2NrPC9WQVI+IGludG8gbG9jYWwgdGltZSwgdGhlbgogICAgICAgICBjb252ZXJ0cyBpdHMgcmVwcmVzZW50YXRpb24gZnJvbSB0aGUgYXJpdGhtZXRpYyByZXByZXNlbnRhdGlvbiB0byB0aGUKICAgICAgICAgdHJhZGl0aW9uYWwgcmVwcmVzZW50YXRpb24gZGVmaW5lZCBieSA8Q09ERT5zdHJ1Y3QgdG08L0NPREU+LgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5sb2NhbHRpbWU8L0NPREU+IGNvbnN0cnVjdHMgdGhlIHRyYWRpdGlvbmFsIHRpbWUgcmVwcmVzZW50YXRpb24gaW4gc3RhdGljCiAgICAgICAgIHN0b3JhZ2U7IGVhY2ggY2FsbCB0byA8Q09ERT5nbXRpbWU8L0NPREU+IG9yIDxDT0RFPmxvY2FsdGltZTwvQ09ERT4gd2lsbCBvdmVyd3JpdGUgdGhlCiAgICAgICAgIGluZm9ybWF0aW9uIGdlbmVyYXRlZCBieSBwcmV2aW91cyBjYWxscyB0byBlaXRoZXIgZnVuY3Rpb24uCiAgICAgICAgIDxicj48YnI+IDxDT0RFPm1rdGltZTwvQ09ERT4gaXMgdGhlIGludmVyc2Ugb2YgPENPREU+bG9jYWx0aW1lPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgdHJhZGl0aW9uYWwgdGltZSByZXByZXNlbnRhdGlvbiAoPENPREU+c3RydWN0IHRtPC9DT0RFPikuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgQU5TSSBDIHJlcXVpcmVzIDxDT0RFPmxvY2FsdGltZTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxDT0RFPmxvY2FsdGltZTwvQ09ERT4gcmVxdWlyZXMgbm8gc3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcy4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAZ0aW1lLmh4cQB+CAR0AA10aW1lX3QgKmNsb2NrdAALc3RydWN0IHRtICp0AAtsb2NhbHRpbWVfcnNxAH4ACnBxAH4IBnNxAH4ADwAA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cnkgZnVuY3Rpb24gZ2VuZXJhdGVzIGFuIGVycm9yLgogICAgICAgICBZb3UgY2FuIHJlcGxhY2UgPENPREU+bWF0aGVycjwvQ09ERT4gYnkgeW91ciBvd24gc3Vicm91dGluZSB0byBjdXN0b21pemUKICAgICAgICAgZXJyb3IgdHJlYXRtZW50LiAgVGhlIGN1c3RvbWl6ZWQgPENPREU+bWF0aGVycjwvQ09ERT4gbXVzdCByZXR1cm4gMCBpZgogICAgICAgICBpdCBmYWlscyB0byByZXNvbHZlIHRoZSBlcnJvciwgYW5kIG5vbi16ZXJvIGlmIHRoZSBlcnJvciBpcyByZXNvbHZlZC4KICAgICAgICAgPGJyPjxicj4gV2hlbiA8Q09ERT5tYXRoZXJyPC9DT0RFPiByZXR1cm5zIGEgbm9uemVybyB2YWx1ZSwgbm8gZXJyb3IgbWVzc2FnZSBpcyBwcmludGVkCiAgICAgICAgIGFuZCB0aGUgdmFsdWUgb2YgPENPREU+ZXJybm88L0NPREU+IGlzIG5vdCBtb2RpZmllZC4gIFlvdSBjYW4gYWNjb21wbGlzaCBlaXRoZXIKICAgICAgICAgb3IgYm90aCBvZiB0aGVzZSB0aGluZ3MgaW4geW91ciBvd24gPENPREU+bWF0aGVycjwvQ09ERT4gdXNpbmcgdGhlIGluZm9ybWF0aW9uCiAgICAgICAgIHBhc3NlZCBpbiB0aGUgc3RydWN0dXJlIDxDT0RFPio8VkFSPmU8L1ZBUj48L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBUaGlzIGlzIHRoZSA8Q09ERT5leGNlcHRpb248L0NPREU+IHN0cnVjdHVyZSAoZGVmaW5lZCBpbiBgPENPREU+bWF0aC5oPC9DT0RFPicpOgogICAgICAgICA8cHJlPjxicj4KICAgICAgICAgCXN0cnVjdCBleGNlcHRpb24gezxicj4KICAgICAgICAgCSAgICAgICAgaW50IHR5cGU7PGJyPgogICAgICAgICAJICAgICAgICBjaGFyICpuYW1lOzxicj4KICAgICAgICAgCSAgICAgICAgZG91YmxlIGFyZzEsIGFyZzIsIHJldHZhbDs8YnI+CiAgICAgICAgIAkJaW50IGVycjs8YnI+CiAgICAgICAgIAl9Ozxicj4KICAgICAgICAgPC9wcmU+CiAgICAgICAgIDxicj48YnI+IFRoZSBtZW1iZXJzIG9mIHRoZSBleGNlcHRpb24gc3RydWN0dXJlIGhhdmUgdGhlIGZvbGxvd2luZyBtZWFuaW5nczoKICAgICAgICAgPERMPgoKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPnR5cGU8L0NPREU+CjxERD4KICAgICAgICAgVGhlIHR5cGUgb2YgbWF0aGVtYXRpY2FsIGVycm9yIHRoYXQgb2NjdXJlZDsgbWFjcm9zIGVuY29kaW5nIGVycm9yCiAgICAgICAgIHR5cGVzIGFyZSBhbHNvIGRlZmluZWQgaW4gYDxDT0RFPm1hdGguaDwvQ09ERT4nLgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+bmFtZTwvQ09ERT4KPEREPgogICAgICAgICBhIHBvaW50ZXIgdG8gYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGhvbGRpbmcgdGhlCiAgICAgICAgIG5hbWUgb2YgdGhlIG1hdGggbGlicmFyeSBmdW5jdGlvbiB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQuCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5hcmcxLCBhcmcyPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSBhcmd1bWVudHMgd2hpY2ggY2F1c2VkIHRoZSBlcnJvci4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPnJldHZhbDwvQ09ERT4KPEREPgogICAgICAgICBUaGUgZXJyb3IgcmV0dXJuIHZhbHVlICh3aGF0IHRoZSBjYWxsaW5nIGZ1bmN0aW9uIHdpbGwgcmV0dXJuKS4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPmVycjwvQ09ERT4KPEREPgogICAgICAgICBJZiBzZXQgdG8gYmUgbm9uLXplcm8sIHRoaXMgaXMgdGhlIG5ldyB2YWx1ZSBhc3NpZ25lZCB0byA8Q09ERT5lcnJubzwvQ09ERT4uCiAgICAgICAgIAo8L0RMPgogICAgICAgICA8YnI+PGJyPiA8YnI+PGJyPiBUaGUgZXJyb3IgdHlwZXMgZGVmaW5lZCBpbiBgPENPREU+bWF0aC5oPC9DT0RFPicgcmVwcmVzZW50IHBvc3NpYmxlIG1hdGhlbWF0aWNhbAogICAgICAgICBlcnJvcnMgYXMgZm9sbG93czoKICAgICAgICAgPGJyPjxicj4gPERMPgoKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkRPTUFJTjwvQ09ERT4KPEREPgogICAgICAgICBBbiBhcmd1bWVudCB3YXMgbm90IGluIHRoZSBkb21haW4gb2YgdGhlIGZ1bmN0aW9uOyBlLmcuIDxDT0RFPmxvZygtMS4wKTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5TSU5HPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSByZXF1ZXN0ZWQgY2FsY3VsYXRpb24gd291bGQgcmVzdWx0IGluIGEgc2luZ3VsYXJpdHk7IGUuZy4gPENPREU+cG93KDAuMCwtMi4wKTwvQ09ERT4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPk9WRVJGTE9XPC9DT0RFPgo8REQ+CiAgICAgICAgIEEgY2FsY3VsYXRpb24gd291bGQgcHJvZHVjZSBhIHJlc3VsdCB0b28gbGFyZ2UgdG8gcmVwcmVzZW50OyBlLmcuCiAgICAgICAgIDxDT0RFPmV4cCgxMDAwLjApPC9DT0RFPi4gCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5VTkRFUkZMT1c8L0NPREU+CjxERD4KICAgICAgICAgQSBjYWxjdWxhdGlvbiB3b3VsZCBwcm9kdWNlIGEgcmVzdWx0IHRvbyBzbWFsbCB0byByZXByZXNlbnQ7IGUuZy4KICAgICAgICAgPENPREU+ZXhwKC0xMDAwLjApPC9DT0RFPi4gCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5UTE9TUzwvQ09ERT4KPEREPgogICAgICAgICBUb3RhbCBsb3NzIG9mIHByZWNpc2lvbi4gIFRoZSByZXN1bHQgd291bGQgaGF2ZSBubyBzaWduaWZpY2FudCBkaWdpdHM7CiAgICAgICAgIGUuZy4gPENPREU+c2luKDEwZTcwKTwvQ09ERT4uIAogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+UExPU1M8L0NPREU+CjxERD4KICAgICAgICAgUGFydGlhbCBsb3NzIG9mIHByZWNpc2lvbi4KICAgICAgICAgPC9ETD4KICAgICAgICAgPGJyPjxicj4gPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIFRoZSBsaWJyYXJ5IGRlZmluaXRpb24gZm9yIDxDT0RFPm1hdGhlcnI8L0NPREU+IHJldHVybnMgPENPREU+MDwvQ09ERT4gaW4gYWxsIGNhc2VzLgogICAgICAgICA8YnI+PGJyPiBZb3UgY2FuIGNoYW5nZSB0aGUgY2FsbGluZyBmdW5jdGlvbidzIHJlc3VsdCBmcm9tIGEgY3VzdG9taXplZCA8Q09ERT5tYXRoZXJyPC9DT0RFPgogICAgICAgICBieSBtb2RpZnlpbmcgPENPREU+ZS0+cmV0dmFsPC9DT0RFPiwgd2hpY2ggcHJvcGFnYXRlcyBiYWNrcyB0byB0aGUgY2FsbGVyLgogICAgICAgICA8YnI+PGJyPiBJZiA8Q09ERT5tYXRoZXJyPC9DT0RFPiByZXR1cm5zIDxDT0RFPjA8L0NPREU+IChpbmRpY2F0aW5nIHRoYXQgaXQgd2FzIG5vdCBhYmxlIHRvIHJlc29sdmUKICAgICAgICAgdGhlIGVycm9yKSB0aGUgY2FsbGVyIHNldHMgPENPREU+ZXJybm88L0NPREU+IHRvIGFuIGFwcHJvcHJpYXRlIHZhbHVlLCBhbmQgcHJpbnRzCiAgICAgICAgIGFuIGVycm9yIG1lc3NhZ2UuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgPENPREU+bWF0aGVycjwvQ09ERT4gaXMgbm90IEFOU0kgQy4gIAogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAXcEAAAACnQABm1hdGguaHhxAH4IXHQAE3N0cnVjdCBleGNlcHRpb24gKmV0AARpbnQgdAAFbWJsZW5zcQB+AApwdAViCiAgICAgICAgV2hlbiBfTUJfQ0FQQUJMRSBpcyBub3QgZGVmaW5lZCwgdGhpcyBpcyBhIG1pbmltYWwgQU5TSS1jb25mb3JtaW5nIAogICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiA8Q09ERT5tYmxlbjwvQ09ERT4uICBJbiB0aGlzIGNhc2UsIHRoZQogICAgICAgICBvbmx5IGBgbXVsdGktYnl0ZSBjaGFyYWN0ZXIgc2VxdWVuY2VzJycgcmVjb2duaXplZCBhcmUgc2luZ2xlIGJ5dGVzLAogICAgICAgICBhbmQgdGh1cyA8Q09ERT4xPC9DT0RFPiBpcyByZXR1cm5lZCB1bmxlc3MgPFZBUj5zPC9WQVI+IGlzIHRoZSBudWxsIHBvaW50ZXIgb3IKICAgICAgICAgaGFzIGEgbGVuZ3RoIG9mIDAgb3IgaXMgdGhlIGVtcHR5IHN0cmluZy4KICAgICAgICAgPGJyPjxicj4gV2hlbiBfTUJfQ0FQQUJMRSBpcyBkZWZpbmVkLCB0aGlzIHJvdXRpbmUgY2FsbHMgPENPREU+X21idG93Y19yPC9DT0RFPiB0byBwZXJmb3JtCiAgICAgICAgIHRoZSBjb252ZXJzaW9uLCBwYXNzaW5nIGEgc3RhdGUgdmFyaWFibGUgdG8gYWxsb3cgc3RhdGUgZGVwZW5kZW50CiAgICAgICAgIGRlY29kaW5nLiAgVGhlIHJlc3VsdCBpcyBiYXNlZCBvbiB0aGUgbG9jYWxlIHNldHRpbmcgd2hpY2ggbWF5CiAgICAgICAgIGJlIHJlc3RyaWN0ZWQgdG8gYSBkZWZpbmVkIHNldCBvZiBsb2NhbGVzLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiA8Q09ERT5tYmxlbjwvQ09ERT4gcmV0dXJucyA8Q09ERT4wPC9DT0RFPiBpZgogICAgICAgICA8VkFSPnM8L1ZBUj4gaXMgPENPREU+TlVMTDwvQ09ERT4gb3IgdGhlIGVtcHR5IHN0cmluZzsgaXQgcmV0dXJucyA8Q09ERT4xPC9DT0RFPiBpZiBub3QgX01CX0NBUEFCTEUgb3IKICAgICAgICAgdGhlIGNoYXJhY3RlciBpcyBhIHNpbmdsZS1ieXRlIGNoYXJhY3RlcjsgaXQgcmV0dXJucyA8Q09ERT4tMTwvQ09ERT4KICAgICAgICAgaWYgdGhlIG11bHRpLWJ5dGUgY2hhcmFjdGVyIGlzIGludmFsaWQ7IG90aGVyd2lzZSBpdCByZXR1cm5zCiAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIG11bHRpYnl0ZSBjaGFyYWN0ZXIuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgPENPREU+bWJsZW48L0NPREU+IGlzIHJlcXVpcmVkIGluIHRoZSBBTlNJIEMgc3RhbmRhcmQuICBIb3dldmVyLCB0aGUgcHJlY2lzZQogICAgICAgICBlZmZlY3RzIHZhcnkgd2l0aCB0aGUgbG9jYWxlLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5tYmxlbjwvQ09ERT4gcmVxdWlyZXMgbm8gc3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcy4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAhzdGRsaWIuaHhxAH4IY3QAF2NvbnN0IGNoYXIgKnMsIHNpemVfdCBudAAEaW50IHQACG1ic3Rvd2Nzc3EAfgAKcHQGVAogICAgICAgIFdoZW4gX01CX0NBUEFCTEUgaXMgbm90IGRlZmluZWQsIHRoaXMgaXMgYSBtaW5pbWFsIEFOU0ktY29uZm9ybWluZyAKICAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgPENPREU+bWJzdG93Y3M8L0NPREU+LiAgSW4gdGhpcyBjYXNlLCB0aGUKICAgICAgICAgb25seSBgYG11bHRpLWJ5dGUgY2hhcmFjdGVyIHNlcXVlbmNlcycnIHJlY29nbml6ZWQgYXJlIHNpbmdsZSBieXRlcywKICAgICAgICAgYW5kIHRoZXkgYXJlIGBgY29udmVydGVkJycgdG8gd2lkZS1jaGFyIHZlcnNpb25zIHNpbXBseSBieSBieXRlCiAgICAgICAgIGV4dGVuc2lvbi4KICAgICAgICAgPGJyPjxicj4gV2hlbiBfTUJfQ0FQQUJMRSBpcyBkZWZpbmVkLCB0aGlzIHJvdXRpbmUgY2FsbHMgPENPREU+X21ic3Rvd2NzX3I8L0NPREU+IHRvIHBlcmZvcm0KICAgICAgICAgdGhlIGNvbnZlcnNpb24sIHBhc3NpbmcgYSBzdGF0ZSB2YXJpYWJsZSB0byBhbGxvdyBzdGF0ZSBkZXBlbmRlbnQKICAgICAgICAgZGVjb2RpbmcuICBUaGUgcmVzdWx0IGlzIGJhc2VkIG9uIHRoZSBsb2NhbGUgc2V0dGluZyB3aGljaCBtYXkKICAgICAgICAgYmUgcmVzdHJpY3RlZCB0byBhIGRlZmluZWQgc2V0IG9mIGxvY2FsZXMuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICBUaGlzIGltcGxlbWVudGF0aW9uIG9mIDxDT0RFPm1ic3Rvd2NzPC9DT0RFPiByZXR1cm5zIDxDT0RFPjA8L0NPREU+IGlmCiAgICAgICAgIDxWQVI+czwvVkFSPiBpcyA8Q09ERT5OVUxMPC9DT0RFPiBvciBpcyB0aGUgZW1wdHkgc3RyaW5nOyAKICAgICAgICAgaXQgcmV0dXJucyA8Q09ERT4tMTwvQ09ERT4gaWYgX01CX0NBUEFCTEUgYW5kIG9uZSBvZiB0aGUKICAgICAgICAgbXVsdGktYnl0ZSBjaGFyYWN0ZXJzIGlzIGludmFsaWQgb3IgaW5jb21wbGV0ZTsKICAgICAgICAgb3RoZXJ3aXNlIGl0IHJldHVybnMgdGhlIG1pbmltdW0gb2Y6IDxDT0RFPm48L0NPREU+IG9yIHRoZQogICAgICAgICBudW1iZXIgb2YgbXVsdGktYnl0ZSBjaGFyYWN0ZXJzIGluIDxDT0RFPnM8L0NPREU+IHBsdXMgMSAodG8KICAgICAgICAgY29tcGVuc2F0ZSBmb3IgdGhlIG51bCBjaGFyYWN0ZXIpLgogICAgICAgICBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIC0xLCB0aGUgc3RhdGUgb2YgdGhlIDxDT0RFPnB3YzwvQ09ERT4gc3RyaW5nIGlzCiAgICAgICAgIGluZGV0ZXJtaW5hdGUuICBJZiB0aGUgaW5wdXQgaGFzIGEgbGVuZ3RoIG9mIDAsIHRoZSBvdXRwdXQKICAgICAgICAgc3RyaW5nIHdpbGwgYmUgbW9kaWZpZWQgdG8gY29udGFpbiBhIHdjaGFyX3QgbnVsIHRlcm1pbmF0b3IuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgPENPREU+bWJzdG93Y3M8L0NPREU+IGlzIHJlcXVpcmVkIGluIHRoZSBBTlNJIEMgc3RhbmRhcmQuICBIb3dldmVyLCB0aGUgcHJlY2lzZQogICAgICAgICBlZmZlY3RzIHZhcnkgd2l0aCB0aGUgbG9jYWxlLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5tYnN0b3djczwvQ09ERT4gcmVxdWlyZXMgbm8gc3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcy4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAhzdGRsaWIuaHhxAH4IanQAJXdjaGFyX3QgKnB3YywgY29uc3QgY2hhciAqcywgc2l6ZV90IG50AARpbnQgdAAGbWJ0b3djc3EAfgAKcHQHPQogICAgICAgIFdoZW4gX01CX0NBUEFCTEUgaXMgbm90IGRlZmluZWQsIHRoaXMgaXMgYSBtaW5pbWFsIEFOU0ktY29uZm9ybWluZyAKICAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgPENPREU+bWJ0b3djPC9DT0RFPi4gIEluIHRoaXMgY2FzZSwKICAgICAgICAgb25seSBgYG11bHRpLWJ5dGUgY2hhcmFjdGVyIHNlcXVlbmNlcycnIHJlY29nbml6ZWQgYXJlIHNpbmdsZSBieXRlcywKICAgICAgICAgYW5kIHRoZXkgYXJlIGBgY29udmVydGVkJycgdG8gdGhlbXNlbHZlcy4KICAgICAgICAgRWFjaCBjYWxsIHRvIDxDT0RFPm1idG93YzwvQ09ERT4gY29waWVzIG9uZSBjaGFyYWN0ZXIgZnJvbSA8Q09ERT4qPFZBUj5zPC9WQVI+PC9DT0RFPiB0bwogICAgICAgICA8Q09ERT4qPFZBUj5wd2M8L1ZBUj48L0NPREU+LCB1bmxlc3MgPFZBUj5zPC9WQVI+IGlzIGEgbnVsbCBwb2ludGVyLiAgVGhlIGFyZ3VtZW50IG4KICAgICAgICAgaXMgaWdub3JlZC4KICAgICAgICAgPGJyPjxicj4gV2hlbiBfTUJfQ0FQQUJMRSBpcyBkZWZpbmVkLCB0aGlzIHJvdXRpbmUgY2FsbHMgPENPREU+X21idG93Y19yPC9DT0RFPiB0byBwZXJmb3JtCiAgICAgICAgIHRoZSBjb252ZXJzaW9uLCBwYXNzaW5nIGEgc3RhdGUgdmFyaWFibGUgdG8gYWxsb3cgc3RhdGUgZGVwZW5kZW50CiAgICAgICAgIGRlY29kaW5nLiAgVGhlIHJlc3VsdCBpcyBiYXNlZCBvbiB0aGUgbG9jYWxlIHNldHRpbmcgd2hpY2ggbWF5CiAgICAgICAgIGJlIHJlc3RyaWN0ZWQgdG8gYSBkZWZpbmVkIHNldCBvZiBsb2NhbGVzLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiA8Q09ERT5tYnRvd2M8L0NPREU+IHJldHVybnMgPENPREU+MDwvQ09ERT4gaWYKICAgICAgICAgPFZBUj5zPC9WQVI+IGlzIDxDT0RFPk5VTEw8L0NPREU+IG9yIGlzIHRoZSBlbXB0eSBzdHJpbmc7IAogICAgICAgICBpdCByZXR1cm5zIDxDT0RFPjE8L0NPREU+IGlmIG5vdCBfTUJfQ0FQQUJMRSBvcgogICAgICAgICB0aGUgY2hhcmFjdGVyIGlzIGEgc2luZ2xlLWJ5dGUgY2hhcmFjdGVyOyBpdCByZXR1cm5zIDxDT0RFPi0xPC9DT0RFPgogICAgICAgICBpZiBuIGlzIDxDT0RFPjA8L0NPREU+IG9yIHRoZSBtdWx0aS1ieXRlIGNoYXJhY3RlciBpcyBpbnZhbGlkOyAKICAgICAgICAgb3RoZXJ3aXNlIGl0IHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgbXVsdGlieXRlIGNoYXJhY3Rlci4KICAgICAgICAgSWYgdGhlIHJldHVybiB2YWx1ZSBpcyAtMSwgbm8gY2hhbmdlcyBhcmUgbWFkZSB0byB0aGUgPENPREU+cHdjPC9DT0RFPgogICAgICAgICBvdXRwdXQgc3RyaW5nLiAgSWYgdGhlIGlucHV0IGlz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dGguaHhxAH4I23QAFGZsb2F0IHZhbCwgZmxvYXQgZGlydAAGZmxvYXQgdAAHbnJhbmQ0OHNxAH4ACnBxAH4EgXNxAH4ADwAAAAF3BAAAAAp0AAhzdGRsaWIuaHhxAH4I4XQAF3Vuc2lnbmVkIHNob3J0IHhzZWVkWzNddAAFbG9uZyB0AAdvbl9leGl0c3EAfgAKcHQGvAogICAgICAgIFlvdSBjYW4gdXNlIDxDT0RFPm9uX2V4aXQ8L0NPREU+IHRvIGVucm9sbCBmdW5jdGlvbnMgaW4gYSBsaXN0IG9mIGZ1bmN0aW9ucyB0aGF0CiAgICAgICAgIHdpbGwgYmUgY2FsbGVkIHdoZW4geW91ciBwcm9ncmFtIHRlcm1pbmF0ZXMgbm9ybWFsbHkuICBUaGUgYXJndW1lbnQgaXMKICAgICAgICAgYSBwb2ludGVyIHRvIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIHdoaWNoIHRha2VzIHR3byBhcmd1bWVudHMuICBUaGUKICAgICAgICAgZmlyc3QgaXMgdGhlIHN0YXR1cyBjb2RlIHBhc3NlZCB0byBleGl0IGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIG9mIHR5cGUKICAgICAgICAgcG9pbnRlciB0byB2b2lkLiAgVGhlIGZ1bmN0aW9uIG11c3Qgbm90IHJldHVybiBhIHJlc3VsdC4gIFRoZSB2YWx1ZQogICAgICAgICBvZiA8VkFSPmFyZzwvVkFSPiBpcyByZWdpc3RlcmVkIGFuZCBwYXNzZWQgYXMgdGhlIGFyZ3VtZW50IHRvIDxWQVI+ZnVuY3Rpb248L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IFRoZSBmdW5jdGlvbnMgYXJlIGtlcHQgaW4gYSBMSUZPIHN0YWNrOyB0aGF0IGlzLCB0aGUgbGFzdCBmdW5jdGlvbgogICAgICAgICBlbnJvbGxlZCBieSA8Q09ERT5hdGV4aXQ8L0NPREU+IG9yIDxDT0RFPm9uX2V4aXQ8L0NPREU+IHdpbGwgYmUgdGhlIGZpcnN0IHRvIGV4ZWN1dGUgd2hlbiAKICAgICAgICAgeW91ciBwcm9ncmFtIGV4aXRzLiAgWW91IGNhbiBpbnRlcm1peCBmdW5jdGlvbnMgdXNpbmcgPENPREU+YXRleGl0PC9DT0RFPiBhbmQKICAgICAgICAgPENPREU+b25fZXhpdDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IFRoZXJlIGlzIG5vIGJ1aWx0LWluIGxpbWl0IHRvIHRoZSBudW1iZXIgb2YgZnVuY3Rpb25zIHlvdSBjYW4gZW5yb2xsCiAgICAgICAgIGluIHRoaXMgbGlzdDsgaG93ZXZlciwgYWZ0ZXIgZXZlcnkgZ3JvdXAgb2YgMzIgZnVuY3Rpb25zIGlzIGVucm9sbGVkLAogICAgICAgICA8Q09ERT5hdGV4aXQ8L0NPREU+LzxDT0RFPm9uX2V4aXQ8L0NPREU+IHdpbGwgY2FsbCA8Q09ERT5tYWxsb2M8L0NPREU+IHRvIGdldCBzcGFjZSBmb3IgdGhlIG5leHQgcGFydCAKICAgICAgICAgb2YgdGhlIGxpc3QuICAgVGhlIGluaXRpYWwgbGlzdCBvZiAzMiBmdW5jdGlvbnMgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQsIHNvCiAgICAgICAgIHlvdSBjYW4gYWx3YXlzIGNvdW50IG9uIGF0IGxlYXN0IHRoYXQgbWFueSBzbG90cyBhdmFpbGFibGUuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICA8Q09ERT5vbl9leGl0PC9DT0RFPiByZXR1cm5zIDxDT0RFPjA8L0NPREU+IGlmIGl0IHN1Y2NlZWRzIGluIGVucm9sbGluZyB5b3VyIGZ1bmN0aW9uLAogICAgICAgICA8Q09ERT4tMTwvQ09ERT4gaWYgaXQgZmFpbHMgKHBvc3NpYmxlIG9ubHkgaWYgbm8gc3BhY2Ugd2FzIGF2YWlsYWJsZSBmb3IKICAgICAgICAgPENPREU+bWFsbG9jPC9DT0RFPiB0byBleHRlbmQgdGhlIGxpc3Qgb2YgZnVuY3Rpb25zKS4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICA8Q09ERT5vbl9leGl0PC9DT0RFPiBpcyBhIG5vbi1zdGFuZGFyZCBnbGliYyBleHRlbnNpb24KICAgICAgICAgPGJyPjxicj4gU3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcyByZXF1aXJlZDogTm9uZQogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAXcEAAAACnQACHN0ZGxpYi5oeHEAfgjndAAodm9pZCAoKmZ1bmN0aW9uKShpbnQsIHZvaWQgKiksIHZvaWQgKmFyZ3QABGludCB0AA5vcGVuX21lbXN0cmVhbXNxAH4ACnB0CKYKICAgICAgICA8Q09ERT5vcGVuX21lbXN0cmVhbTwvQ09ERT4gY3JlYXRlcyBhIHNlZWthYmxlIDxDT0RFPkZJTEU8L0NPREU+IHN0cmVhbSB0aGF0IHdyYXBzIGFuCiAgICAgICAgIGFyYml0cmFyeS1sZW5ndGggYnVmZmVyLCBjcmVhdGVkIGFzIGlmIGJ5IDxDT0RFPm1hbGxvYzwvQ09ERT4uICBUaGUgY3VycmVudAogICAgICAgICBjb250ZW50cyBvZiAqPFZBUj5idWY8L1ZBUj4gYXJlIGlnbm9yZWQ7IHRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyAqPFZBUj5zaXplPC9WQVI+CiAgICAgICAgIGFzIGEgaGludCBvZiB0aGUgbWF4aW11bSBzaXplIGV4cGVjdGVkLCBidXQgZG9lcyBub3QgZmFpbCBpZiB0aGUgaGludAogICAgICAgICB3YXMgd3JvbmcuICBUaGUgcGFyYW1ldGVycyA8VkFSPmJ1ZjwvVkFSPiBhbmQgPFZBUj5zaXplPC9WQVI+IGFyZSBsYXRlciBzdG9yZWQKICAgICAgICAgdGhyb3VnaCBmb2xsb3dpbmcgYW55IGNhbGwgdG8gPENPREU+ZmZsdXNoPC9DT0RFPiBvciA8Q09ERT5mY2xvc2U8L0NPREU+LCBzZXQgdG8gdGhlCiAgICAgICAgIGN1cnJlbnQgYWRkcmVzcyBhbmQgdXNhYmxlIHNpemUgb2YgdGhlIGFsbG9jYXRlZCBzdHJpbmc7IGFsdGhvdWdoCiAgICAgICAgIGFmdGVyIGZmbHVzaCwgdGhlIHBvaW50ZXIgaXMgb25seSB2YWxpZCB1bnRpbCBhbm90aGVyIHN0cmVhbSBvcGVyYXRpb24KICAgICAgICAgdGhhdCByZXN1bHRzIGluIGEgd3JpdGUuICBCZWhhdmlvciBpcyB1bmRlZmluZWQgaWYgdGhlIHVzZXIgYWx0ZXJzCiAgICAgICAgIGVpdGhlciAqPFZBUj5idWY8L1ZBUj4gb3IgKjxWQVI+c2l6ZTwvVkFSPiBwcmlvciB0byA8Q09ERT5mY2xvc2U8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBUaGUgc3RyZWFtIGlzIHdyaXRlLW9ubHksIHNpbmNlIHRoZSB1c2VyIGNhbiBkaXJlY3RseSByZWFkICo8VkFSPmJ1ZjwvVkFSPgogICAgICAgICBhZnRlciBhIGZsdXNoOyBzZWUgPENPREU+Zm1lbW9wZW48L0NPREU+IGZvciBhIHdheSB0byB3cmFwIGEgc3RyaW5nIHdpdGggYQogICAgICAgICByZWFkYWJsZSBzdHJlYW0uICBUaGUgdXNlciBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyA8Q09ERT5mcmVlPC9DT0RFPiBvbgogICAgICAgICB0aGUgZmluYWwgKjxWQVI+YnVmPC9WQVI+IGFmdGVyIDxDT0RFPmZjbG9zZTwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IEFueSB0aW1lIHRoZSBzdHJlYW0gaXMgZmx1c2hlZCwgYSBOVUwgYnl0ZSBpcyB3cml0dGVuIGF0IHRoZSBjdXJyZW50CiAgICAgICAgIHBvc2l0aW9uIChidXQgaXMgbm90IGNvdW50ZWQgaW4gdGhlIGJ1ZmZlciBsZW5ndGgpLCBzbyB0aGF0IHRoZSBzdHJpbmcKICAgICAgICAgaXMgYWx3YXlzIE5VTC10ZXJtaW5hdGVkIGFmdGVyIGF0IG1vc3QgKjxWQVI+c2l6ZTwvVkFSPiBieXRlcy4gIEhvd2V2ZXIsIGRhdGEKICAgICAgICAgcHJldmlvdXNseSB3cml0dGVuIGJleW9uZCB0aGUgY3VycmVudCBzdHJlYW0gb2Zmc2V0IGlzIG5vdCBsb3N0LCBhbmQKICAgICAgICAgdGhlIE5VTCBieXRlIHdyaXR0ZW4gZHVyaW5nIGEgZmx1c2ggaXMgcmVzdG9yZWQgdG8gaXRzIHByZXZpb3VzIHZhbHVlCiAgICAgICAgIHdoZW4gc2Vla2luZyBlbHNld2hlcmUgaW4gdGhlIHN0cmluZy4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYW4gb3BlbiBGSUxFIHBvaW50ZXIgb24gc3VjY2Vzcy4gIE9uIGVycm9yLAogICAgICAgICA8Q09ERT5OVUxMPC9DT0RFPiBpcyByZXR1cm5lZCwgYW5kIDxDT0RFPmVycm5vPC9DT0RFPiB3aWxsIGJlIHNldCB0byBFSU5WQUwgaWYgPFZBUj5idWY8L1ZBUj4KICAgICAgICAgb3IgPFZBUj5zaXplPC9WQVI+IGlzIE5VTEwsIEVOT01FTSBpZiBtZW1vcnkgY291bGQgbm90IGJlIGFsbG9jYXRlZCwgb3IKICAgICAgICAgRU1GSUxFIGlmIHRvbyBtYW55IHN0cmVhbXMgYXJlIGFscmVhZHkgb3Blbi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIGJlaW5nIGFkZGVkIHRvIFBPU0lYIDIwMHgsIGJ1dCBpcyBub3QgaW4gUE9TSVggMjAwMS4KICAgICAgICAgPGJyPjxicj4gU3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcyByZXF1aXJlZDogPENPREU+c2JyazwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAHc3RkaW8uaHhxAH4I7nQAKWNoYXIgKipyZXN0cmljdCBidWYsc2l6ZV90ICpyZXN0cmljdCBzaXpldAAGRklMRSAqdAAGcGVycm9yc3EAfgAKcHEAfgG7c3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+CPV0AAxjaGFyICpwcmVmaXh0AAV2b2lkIHQAA3Bvd3NxAH4ACnB0A/UKICAgICAgICA8Q09ERT5wb3c8L0NPREU+IGFuZCA8Q09ERT5wb3dmPC9DT0RFPiBjYWxjdWxhdGUgPFZBUj54PC9WQVI+IHJhaXNlZCB0byB0aGUgZXhwb25lbnQgPFZBUj55PC9WQVI+LgogICAgICAgICAKICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIE9uIHN1Y2Nlc3MsIDxDT0RFPnBvdzwvQ09ERT4gYW5kIDxDT0RFPnBvd2Y8L0NPREU+IHJldHVybiB0aGUgdmFsdWUgY2FsY3VsYXRlZC4KICAgICAgICAgPGJyPjxicj4gV2hlbiB0aGUgYXJndW1lbnQgdmFsdWVzIHdvdWxkIHByb2R1Y2Ugb3ZlcmZsb3csIDxDT0RFPnBvdzwvQ09ERT4KICAgICAgICAgcmV0dXJucyA8Q09ERT5IVUdFX1ZBTDwvQ09ERT4gYW5kIHNldCA8Q09ERT5lcnJubzwvQ09ERT4gdG8gPENPREU+RVJBTkdFPC9DT0RFPi4gIElmIHRoZQogICAgICAgICBhcmd1bWVudCA8VkFSPng8L1ZBUj4gcGFzc2VkIHRvIDxDT0RFPnBvdzwvQ09ERT4gb3IgPENPREU+cG93ZjwvQ09ERT4gaXMgYSBuZWdhdGl2ZQogICAgICAgICBub25pbnRlZ2VyLCBhbmQgPFZBUj55PC9WQVI+IGlzIGFsc28gbm90IGFuIGludGVnZXIsIHRoZW4gPENPREU+ZXJybm88L0NPREU+CiAgICAgICAgIGlzIHNldCB0byA8Q09ERT5FRE9NPC9DT0RFPi4gIElmIDxWQVI+eDwvVkFSPiBhbmQgPFZBUj55PC9WQVI+IGFyZSBib3RoIDAsIHRoZW4KICAgICAgICAgPENPREU+cG93PC9DT0RFPiBhbmQgPENPREU+cG93ZjwvQ09ERT4gcmV0dXJuIDxDT0RFPjE8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiBZb3UgY2FuIG1vZGlmeSBlcnJvciBoYW5kbGluZyBmb3IgdGhlc2UgZnVuY3Rpb25zIHVzaW5nIDxDT0RFPm1hdGhlcnI8L0NPREU+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIDxDT0RFPnBvdzwvQ09ERT4gaXMgQU5TSSBDLiA8Q09ERT5wb3dmPC9DT0RFPiBpcyBhbiBleHRlbnNpb24uICAKICAgICAgICAgKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAZtYXRoLmh4cQB+CPt0ABJkb3VibGUgeCwgZG91YmxlIHl0AAdkb3VibGUgdAAEcG93ZnNxAH4ACnBxAH4I/XNxAH4ADwAAAAF3BAAAAAp0AAZtYXRoLmh4cQB+CQJ0ABBmbG9hdCB4LCBmbG9hdCB5dAAGZmxvYXQgdAAGcHJpbnRmc3EAfgAKcHEAfgBPc3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+CQh0ABdjb25zdCBjaGFyICpmb3JtYXQsIC4uLnQABGludCB0AARwdXRjc3EAfgAKcHEAfgHIc3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+CQ50ABBpbnQgY2gsIEZJTEUgKmZwdAAEaW50IHQADXB1dGNfdW5sb2NrZWRzcQB+AApwcQB+Ac9zcQB+AA8AAAABdwQAAAAKdAAHc3RkaW8uaHhxAH4JFHQAEGludCBjaCwgRklMRSAqZnB0AARpbnQgdAAHcHV0Y2hhcnNxAH4ACnBxAH4B1nNxAH4ADwAAAAF3BAAAAAp0AAdzdGRpby5oeHEAfgkadAAGaW50IGNodAAEaW50IHQAEHB1dGNoYXJfdW5sb2NrZWRzcQB+AApwdAR5CiAgICAgICAgPENPREU+cHV0Y2hhcl91bmxvY2tlZDwvQ09ERT4gaXMgYSBub24tdGhyZWFkLXNhZmUgdmVyc2lvbiBvZiA8Q09ERT5wdXRjaGFyPC9DT0RFPgogICAgICAgICBkZWNsYXJlZCBpbiA8Q09ERT5zdGRpby5oPC9DT0RFPi4gIDxDT0RFPnB1dGNoYXJfdW5sb2NrZWQ8L0NPREU+IG1heSBvbmx5IHNhZmVseSBiZSB1c2VkCiAgICAgICAgIHdpdGhpbiBhIHNjb3BlIHByb3RlY3RlZCBieSBmbG9ja2ZpbGUoKSAob3IgZnRyeWxvY2tmaWxlKCkpIGFuZAogICAgICAgICBmdW5sb2NrZmlsZSgpLiAgVGhlc2UgZnVuY3Rpb25zIG1heSBzYWZlbHkgYmUgdXNlZCBpbiBhIG11bHRpLXRocmVhZGVkCiAgICAgICAgIHByb2dyYW0gaWYgYW5kIG9ubHkgaWYgdGhleSBhcmUgY2FsbGVkIHdoaWxlIHRoZSBpbnZva2luZyB0aHJlYWQgb3ducwogICAgICAgICB0aGUgKCBGSUxFICopIG9iamVjdCwgYXMgaXMgdGhlIGNhc2UgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG8gdGhlCiAgICAgICAgIGZsb2NrZmlsZSgpIG9yIGZ0cnlsb2NrZmlsZSgpIGZ1bmN0aW9ucy4gIElmIHRocmVhZHMgYXJlIGRpc2FibGVkLAogICAgICAgICB0aGVuIDxDT0RFPnB1dGNoYXJfdW5sb2NrZWQ8L0NPREU+IGlzIGVxdWl2YWxlbnQgdG8gPENPREU+cHV0Y2hhcjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICBTZWUgPENPREU+cHV0Y2hhcjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgUE9TSVggMTAwMy4xIHJlcXVpcmVzIDxDT0RFPnB1dGNoYXJfdW5sb2NrZWQ8L0NPREU+LiAgPENPREU+cHV0Y2hhcl91bmxvY2tlZDwvQ09ERT4gbWF5CiAgICAgICAgIGJlIGltcGxlbWVudGVkIGFzIGEgbWFjcm8uCiAgICAgICAgIDxicj48YnI+IFN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMgcmVxdWlyZWQ6IDxDT0RFPmNsb3NlPC9DT0RFPiwgPENPREU+ZnN0YXQ8L0NPREU+LCA8Q09ERT5pc2F0dHk8L0NPREU+LAogICAgICAgICA8Q09ERT5sc2VlazwvQ09ERT4sIDxDT0RFPnJlYWQ8L0NPREU+LCA8Q09ERT5zYnJrPC9DT0RFPiwgPENPREU+d3JpdGU8L0NPREU+LiAgCiAgICAgICAgICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAHc3RkaW8uaHhxAH4JIHQABmludCBjaHQABGludCB0AARwdXRzc3EAfgAKcHEAfgHdc3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+CSd0AA1jb25zdCBjaGFyICpzdAAEaW50IHQABHB1dHdzcQB+AApwdAL+CiAgICAgICAgPENPREU+cHV0dzwvQ09ERT4gaXMgYSBmdW5jdGlvbiwgZGVmaW5lZCBpbiA8Q09ERT5zdGRpby5oPC9DT0RFPi4gIFlvdSBjYW4gdXNlIDxDT0RFPnB1dHc8L0NPREU+CiAgICAgICAgIHRvIHdyaXRlIGEgd29yZCB0byB0aGUgZmlsZSBvciBzdHJlYW0gaWRlbnRpZmllZCBieSA8VkFSPmZwPC9WQVI+LiAgQXMgYSBzaWRlCiAgICAgICAgIGVmZmVjdCwgPENPREU+cHV0dzwvQ09ERT4gYWR2YW5jZXMgdGhlIGZpbGUncyBjdXJyZW50IHBvc2l0aW9uIGluZGljYXRvci4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIFplcm8gb24gc3VjY2VzcywgPENPREU+RU9GPC9DT0RFPiBvbiBmYWlsdXJlLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIDxDT0RFPnB1dHc8L0NPREU+IGlzIGEgcmVtbmFudCBvZiBLJlIgQzsgaXQgaXMgbm90IHBhcnQgb2YgYW55IElTTyBDIFN0YW5kYXJkLgogICAgICAgICA8Q09ERT5md3JpdGU8L0NPREU+IHNob3VsZCBiZSB1c2VkIGluc3RlYWQuICBJbiBmYWN0LCB0aGlzIGltcGxlbWVudGF0aW9uIG9mCiAgICAgICAgIDxDT0RFPnB1dHc8L0NPREU+IGlzIGJhc2VkIHVwb24gPENPREU+ZndyaXRlPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gU3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcyByZXF1aXJlZDogPENPREU+ZndyaXRlPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAdzdGRpby5oeHEAfgktdAAPaW50IHcsIEZJTEUgKmZwdAAEaW50IHQABXJhaXNlc3EAfgAKcHEAfgHkc3EAfgAPAAAAAXcEAAAACnQACHNpZ25hbC5oeHEAfgk0dAAHaW50IHNpZ3QABGludCB0AARyYW5kc3EAfgAKcHQHTwogICAgICAgIDxDT0RFPnJhbmQ8L0NPREU+IHJldHVybnMgYSBkaWZmZXJlbnQgaW50ZWdlciBlYWNoIHRpbWUgaXQgaXMgY2FsbGVkOyBlYWNoCiAgICAgICAgIGludGVnZXIgaXMgY2hvc2VuIGJ5IGFuIGFsZ29yaXRobSBkZXNpZ25lZCB0byBiZSB1bnByZWRpY3RhYmxlLCBzbwogICAgICAgICB0aGF0IHlvdSBjYW4gdXNlIDxDT0RFPnJhbmQ8L0NPREU+IHdoZW4geW91IHJlcXVpcmUgYSByYW5kb20gbnVtYmVyLgogICAgICAgICBUaGUgYWxnb3JpdGhtIGRlcGVuZHMgb24gYSBzdGF0aWMgdmFyaWFibGUgY2FsbGVkIHRoZSBgYHJhbmRvbSBzZWVkJyc7CiAgICAgICAgIHN0YXJ0aW5nIHdpdGggYSBnaXZlbiB2YWx1ZSBvZiB0aGUgcmFuZG9tIHNlZWQgYWx3YXlzIHByb2R1Y2VzIHRoZQogICAgICAgICBzYW1lIHNlcXVlbmNlIG9mIG51bWJlcnMgaW4gc3VjY2Vzc2l2ZSBjYWxscyB0byA8Q09ERT5yYW5kPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gWW91IGNhbiBzZXQgdGhlIHJhbmRvbSBzZWVkIHVzaW5nIDxDT0RFPnNyYW5kPC9DT0RFPjsgaXQgZG9lcyBub3RoaW5nIGJleW9uZAogICAgICAgICBzdG9yaW5nIGl0cyBhcmd1bWVudCBpbiB0aGUgc3RhdGljIHZhcmlhYmxlIHVzZWQgYnkgPENPREU+cmFuZDwvQ09ERT4uICBZb3UgY2FuCiAgICAgICAgIGV4cGxvaXQgdGhpcyB0byBtYWtlIHRoZSBwc2V1ZG8tcmFuZG9tIHNlcXVlbmNlIGxlc3MgcHJlZGljdGFibGUsIGlmCiAgICAgICAgIHlvdSB3aXNoLCBieSB1c2luZyBzb21lIG90aGVyIHVucHJlZGljdGFibGUgdmFsdWUgKG9mdGVuIHRoZSBsZWFzdAogICAgICAgICBzaWduaWZpY2FudCBwYXJ0cyBvZiBhIHRpbWUtdmFyeWluZyB2YWx1ZSkgYXMgdGhlIHJhbmRvbSBzZWVkIGJlZm9yZQogICAgICAgICBiZWdpbm5pbmcgYSBzZXF1ZW5jZSBvZiBjYWxscyB0byA8Q09ERT5yYW5kPC9DT0RFPjsgb3IsIGlmIHlvdSB3aXNoIHRvIGVuc3VyZQogICAgICAgICAoZm9yIGV4YW1wbGUsIHdoaWxlIGRlYnVnZ2luZykgdGhhdCBzdWNjZXNzaXZlIHJ1bnMgb2YgeW91ciBwcm9ncmFtCiAgICAgICAgIHVzZSB0aGUgc2FtZSBgYHJhbmRvbScnIG51bWJlcnMsIHlvdSBjYW4gdXNlIDxDT0RFPnNyYW5kPC9DT0RFPiB0byBzZXQgdGhlIHNhbWUKICAgICAgICAgcmFuZG9tIHNlZWQgYXQgdGhlIG91dHNldC4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIDxDT0RFPnJhbmQ8L0NPREU+IHJldHVybnMgdGhlIG5leHQgcHNldWRvLXJhbmRvbSBpbnRlZ2VyIGluIHNlcXVlbmNlOyBpdCBpcyBhCiAgICAgICAgIG51bWJlciBiZXR3ZWVuIDxDT0RFPjA8L0NPREU+IGFuZCA8Q09ERT5SQU5EX01BWDwvQ09ERT4gKGluY2x1c2l2ZSkuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPnNyYW5kPC9DT0RFPiBkb2VzIG5vdCByZXR1cm4gYSByZXN1bHQuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgPENPREU+cmFuZDwvQ09ERT4gaXMgcmVxdWlyZWQgYnkgQU5TSSwgYnV0IHRoZSBhbGdvcml0aG0gZm9yIHBzZXVkby1yYW5kb20KICAgICAgICAgbnVtYmVyIGdlbmVyYXRpb24gaXMgbm90IHNwZWNpZmllZDsgdGhlcmVmb3JlLCBldmVuIGlmIHlvdSB1c2UKICAgICAgICAgdGhlIHNhbWUgcmFuZG9tIHNlZWQsIHlvdSBjYW5ub3QgZXhwZWN0IHRoZSBzYW1lIHNlcXVlbmNlIG9mIHJlc3VsdHMKICAgICAgICAgb24gdHdvIGRpZmZlcmVudCBzeXN0ZW1zLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5yYW5kPC9DT0RFPiByZXF1aXJlcyBubyBzdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAXcEAAAACnQACHN0ZGxpYi5oeHEAfgk6dAAEdm9pZHQABGludCB0AAZyYW5kNDhzcQB+AApwcQB+BIFzcQB+AA8AAAAAdwQAAAAKeHEAfglBcHQABG51bGx0AAZyYW5kX3JzcQB+AApwcQB+CTxzcQB+AA8AAAABdwQAAAAKdAAIc3RkbGliLmh4cQB+CUV0ABJ1bnNpZ25lZCBpbnQgKnNlZWR0AARpbnQgdAAHcmVhbGxvY3NxAH4ACnBxAH4A9XNxAH4ADwAAAAF3BAAAAAp0AAhzdGRsaWIuaHhxAH4JS3QAGXZvaWQgKmFwdHIsIHNpemVfdCBuYnl0ZXN0AAZ2b2lkICp0AAlyZW1haW5kZXJzcQB+AApwdAHtCiAgICAgICAgPENPREU+cmVtYWluZGVyPC9DT0RFPiBhbmQgPENPREU+cmVtYWluZGVyZjwvQ09ERT4gZmluZCB0aGUgcmVtYWluZGVyIG9mCiAgICAgICAgIDxWQVI+eDwvVkFSPi88VkFSPnk8L1ZBUj47IHRoaXMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIC08VkFSPnk8L1ZBUj4vMiAuLiArPFZBUj55PC9WQVI+LzIuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICA8Q09ERT5yZW1haW5kZXI8L0NPREU+IHJldHVybnMgdGhlIGludGVnZXIgcmVzdWx0IGFzIGEgZG91YmxlLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIDxDT0RFPnJlbWFpbmRlcjwvQ09ERT4gaXMgYSBTeXN0ZW0gViByZWxlYXNlIDQuCiAgICAgICAgIDxDT0RFPnJlbWFpbmRlcmY8L0NPREU+IGlzIGFuIGV4dGVuc2lvbi4KICAgICAgICAgPGJyPjxicj4gPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAZtYXRoLmh4cQB+CVF0ABJkb3VibGUgeCwgZG91YmxlIHl0AAdkb3VibGUgdAAKcmVtYWluZGVyZnNxAH4ACnBxAH4JU3NxAH4ADwAAAAF3BAAAAAp0AAZtYXRoLmh4cQB+CVh0ABBmbG9hdCB4LCBmbG9hdCB5dAAGZmxvYXQgdAAGcmVtb3Zlc3EAfgAKcHEAfgH1c3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+CV50AA5jaGFyICpmaWxlbmFtZXQABGludCB0AAZyZW5hbWVzcQB+AApwdAQtCiAgICAgICAgVXNlIDxDT0RFPnJlbmFtZTwvQ09ERT4gdG8gZXN0YWJsaXNoIGEgbmV3IG5hbWUgKHRoZSBzdHJpbmcgYXQgPFZBUj5uZXc8L1ZBUj4pIGZvciBhCiAgICAgICAgIGZpbGUgbm93IGtub3duIGJ5IHRoZSBzdHJpbmcgYXQgPFZBUj5vbGQ8L1ZBUj4uICBBZnRlciBhIHN1Y2Nlc3NmdWwKICAgICAgICAgPENPREU+cmVuYW1lPC9DT0RFPiwgdGhlIGZpbGUgaXMgbm8gbG9uZ2VyIGFjY2Vzc2libGUgYnkgdGhlIHN0cmluZyBhdCA8VkFSPm9sZDwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gSWYgPENPREU+cmVuYW1lPC9DT0RFPiBmYWlscywgdGhlIGZpbGUgbmFtZWQgPENPREU+KjxWQVI+b2xkPC9WQVI+PC9DT0RFPiBpcyB1bmFmZmVjdGVkLiAgVGhlCiAgICAgICAgIGNvbmRpdGlvbnMgZm9yIGZhaWx1cmUgZGVwZW5kIG9uIHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICBUaGUgcmVzdWx0IGlzIGVpdGhlciA8Q09ERT4wPC9DT0RFPiAod2hlbiBzdWNjZXNzZnVsKSBvciA8Q09ERT4tMTwvQ09ERT4gKHdoZW4gdGhlIGZpbGUKICAgICAgICAgY291bGQgbm90IGJlIHJlbmFtZWQpLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIEFOU0kgQyByZXF1aXJlcyA8Q09ERT5yZW5hbWU8L0NPREU+LCBidXQgb25seSBzcGVjaWZpZXMgdGhhdCB0aGUgcmVzdWx0IG9uCiAgICAgICAgIGZhaWx1cmUgYmUgbm9uemVyby4gIFRoZSBlZmZlY3RzIG9mIHVzaW5nIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGZpbGUKICAgICAgICAgYXMgPENPREU+KjxWQVI+bmV3PC9WQVI+PC9DT0RFPiBtYXkgdmFyeSBmcm9tIG9uZSBpbXBsZW1lbnRhdGlvbiB0byBhbm90aGVyLgogICAgICAgICA8YnI+PGJyPiBTdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzIHJlcXVpcmVkOiA8Q09ERT5saW5rPC9DT0RFPiwgPENPREU+dW5saW5rPC9DT0RFPiwgb3IgPENPREU+cmVuYW1lPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAdzdGRpby5oeHEAfglkdAAgY29uc3QgY2hhciAqb2xkLCBjb25zdCBjaGFyICpuZXd0AARpbnQgdAAGcmV3aW5kc3EAfgAKcHEAfgH8c3EAfgAPAAAAAXcEAAAACnQAB3N0ZGlvLmh4cQB+CWt0AAhGSUxFICpmcHQABXZvaWQgdAAGcmluZGV4c3EAfgAKcHQCTQogICAgICAgIFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIGxhc3Qgb2NjdXJlbmNlIG9mIDxWQVI+YzwvVkFSPiAoY29udmVydGVkIHRvCiAgICAgICAgIGEgY2hhcikgaW4gdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IDxWQVI+c3RyaW5nPC9WQVI+IChpbmNsdWRpbmcgdGhlCiAgICAgICAgIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyKS4KICAgICAgICAgPGJyPjxicj4gVGhpcyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gPENPREU+c3RycmNocjwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbG9jYXRlZCBjaGFyYWN0ZXIsIG9yIGEgbnVsbCBwb2ludGVyCiAgICAgICAgIGlmIDxWQVI+YzwvVkFSPiBkb2VzIG5vdCBvY2N1ciBpbiA8VkFSPnN0cmluZzwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICA8Q09ERT5yaW5kZXg8L0NPREU+IHJlcXVpcmVzIG5vIHN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAIc3RyaW5nLmh4cQB+CXF0ABljb25zdCBjaGFyICpzdHJpbmcsIGludCBjdAAGY2hhciAqdAAGc2NhbGJuc3EAfgAKcHQCewogICAgICAgIDxDT0RFPnNjYWxibjwvQ09ERT4gYW5kIDxDT0RFPnNjYWxibmY8L0NPREU+IHNjYWxlIDxWQVI+eDwvVkFSPiBieSA8VkFSPm48L1ZBUj4sIHJldHVybmluZyA8VkFSPng8L1ZBUj4gdGltZXMKICAgICAgICAgMiB0byB0aGUgcG93ZXIgPFZBUj5uPC9WQVI+LiAgVGhlIHJlc3VsdCBpcyBjb21wdXRlZCBieSBtYW5pcHVsYXRpbmcgdGhlCiAgICAgICAgIGV4cG9uZW50LCByYXRoZXIgdGhhbiBieSBhY3R1YWxseSBwZXJmb3JtaW5nIGFuIGV4cG9uZW50aWF0aW9uIG9yCiAgICAgICAgIG11bHRpcGxpY2F0aW9uLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgPFZBUj54PC9WQVI+IHRpbWVzIDIgdG8gdGhlIHBvd2VyIDxWQVI+bjwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICBOZWl0aGVyIDxDT0RFPnNjYWxibjwvQ09ERT4gbm9yIDxDT0RFPnNjYWxibmY8L0NPREU+IGlzIHJlcXVpcmVkIGJ5IEFOU0kgQyBvciBieSB0aGUgU3lzdGVtIFYKICAgICAgICAgSW50ZXJmYWNlIERlZmluaXRpb24gKElzc3VlIDIpLgogICAgICAgICA8YnI+PGJyPiA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAXcEAAAACnQABm1hdGguaHhxAH4JeHQAD2RvdWJsZSB4LCBpbnQgeXQAB2RvdWJsZSB0AAdzY2FsYm5mc3EAfgAKcHEAfgl6c3EAfgAPAAAAAXcEAAAACnQABm1hdGguaHhxAH4Jf3QADmZsb2F0IHgsIGludCB5dAAGZmxvYXQgdAAFc2NhbmZzcQB+AApwcQB+AQpzcQB+AA8AAAABdwQAAAAKdAAHc3RkaW8uaHhxAH4JhXQAF2NvbnN0IGNoYXIgKmZvcm1hdCwgLi4udAAEaW50IHQABnNlZWQ0OHNxAH4ACnBxAH4EgXNxAH4ADwAAAAF3BAAAAAp0AAhzdGRsaWIuaHhxAH4Ji3QAF3Vuc2lnbmVkIHNob3J0IHhzZWVkWzNddAAQdW5zaWduZWQgc2hvcnQgKnQABnNldGJ1ZnNxAH4ACnB0B0AKICAgICAgICA8Q09ERT5zZXRidWY8L0NPREU+IHNwZWNpZmllcyB0aGF0IG91dHB1dCB0byB0aGUgZmlsZSBvciBzdHJlYW0gaWRlbnRpZmllZCBieSA8VkFSPmZwPC9WQVI+CiAgICAgICAgIHNob3VsZCBiZSBmdWxseSBidWZmZXJlZC4gIEFsbCBvdXRwdXQgZm9yIHRoaXMgZmlsZSB3aWxsIGdvIHRvIGEKICAgICAgICAgYnVmZmVyIChvZiBzaXplIDxDT0RFPkJVRlNJWjwvQ09ERT4sIHNwZWNpZmllZCBpbiBgPENPREU+c3RkaW8uaDwvQ09ERT4nKS4gIE91dHB1dCB3aWxsCiAgICAgICAgIGJlIHBhc3NlZCBvbiB0byB0aGUgaG9zdCBzeXN0ZW0gb25seSB3aGVuIHRoZSBidWZmZXIgaXMgZnVsbCwgb3Igd2hlbgogICAgICAgICBhbiBpbnB1dCBvcGVyYXRpb24gaW50ZXJ2ZW5lcy4KICAgICAgICAgPGJyPjxicj4gWW91IG1heSwgaWYgeW91IHdpc2gsIHN1cHBseSB5b3VyIG93biBidWZmZXIgYnkgcGFzc2luZyBhIHBvaW50ZXIgdG8KICAgICAgICAgaXQgYXMgdGhlIGFyZ3VtZW50IDxWQVI+YnVmPC9WQVI+LiAgSXQgbXVzdCBoYXZlIHNpemUgPENPREU+QlVGU0laPC9DT0RFPi4gIFlvdSBjYW4KICAgICAgICAgYWxzbyB1c2UgPENPREU+TlVMTDwvQ09ERT4gYXMgdGhlIHZhbHVlIG9mIDxWQVI+YnVmPC9WQVI+LCB0byBzaWduYWwgdGhhdCB0aGUKICAgICAgICAgPENPREU+c2V0YnVmPC9DT0RFPiBmdW5jdGlvbiBpcyB0byBhbGxvY2F0ZSB0aGUgYnVmZmVyLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5XYXJuaW5nczwvaDM+CiAgICAgICAgIFlvdSBtYXkgb25seSB1c2UgPENPREU+c2V0YnVmPC9DT0RFPiBiZWZvcmUgcGVyZm9ybWluZyBhbnkgZmlsZSBvcGVyYXRpb24gb3RoZXIKICAgICAgICAgdGhhbiBvcGVuaW5nIHRoZSBmaWxlLgogICAgICAgICA8YnI+PGJyPiBJZiB5b3Ugc3VwcGx5IGEgbm9uLW51bGwgPFZBUj5idWY8L1ZBUj4sIHlvdSBtdXN0IGVuc3VyZSB0aGF0IHRoZSBhc3NvY2lhdGVkCiAgICAgICAgIHN0b3JhZ2UgY29udGludWVzIHRvIGJlIGF2YWlsYWJsZSB1bnRpbCB5b3UgY2xvc2UgdGhlIHN0cmVhbQogICAgICAgICBpZGVudGlmaWVkIGJ5IDxWQVI+ZnA8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICA8Q09ERT5zZXRidWY8L0NPREU+IGRvZXMgbm90IHJldHVybiBhIHJlc3VsdC4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICBCb3RoIEFOU0kgQyBhbmQgdGhlIFN5c3RlbSBWIEludGVyZmFjZSBEZWZpbml0aW9uIChJc3N1ZSAyKSByZXF1aXJlCiAgICAgICAgIDxDT0RFPnNldGJ1ZjwvQ09ERT4uICBIb3dldmVyLCB0aGV5IGRpZmZlciBvbiB0aGUgbWVhbmluZyBvZiBhIDxDT0RFPk5VTEw8L0NPREU+IGJ1ZmZlcgogICAgICAgICBwb2ludGVyOiB0aGUgU1ZJRCBpc3N1ZSAyIHNwZWNpZmljYXRpb24gc2F5cyB0aGF0IGEgPENPREU+TlVMTDwvQ09ERT4gYnVmZmVyCiAgICAgICAgIHBvaW50ZXIgcmVxdWVzdHMgdW5idWZmZXJlZCBvdXRwdXQuICBGb3IgbWF4aW11bSBwb3J0YWJpbGl0eSwgYXZvaWQKICAgICAgICAgPENPREU+TlVMTDwvQ09ERT4gYnVmZmVyIHBvaW50ZXJzLgogICAgICAgICA8YnI+PGJyPiBTdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzIHJlcXVpcmVkOiA8Q09ERT5jbG9zZTwvQ09ERT4sIDxDT0RFPmZzdGF0PC9DT0RFPiwgPENPREU+aXNhdHR5PC9DT0RFPiwKICAgICAgICAgPENPREU+bHNlZWs8L0NPREU+LCA8Q09ERT5yZWFkPC9DT0RFPiwgPENPREU+c2JyazwvQ09ERT4sIDxDT0RFPndyaXRlPC9DT0RFPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAdzdGRpby5oeHEAfgmRdAATRklMRSAqZnAsIGNoYXIgKmJ1ZnQABXZvaWQgdAAJc2V0YnVmZmVyc3EAfgAKcHQF0gogICAgICAgIDxDT0RFPnNldGJ1ZmZlcjwvQ09ERT4gc3BlY2lmaWVzIHRoYXQgb3V0cHV0IHRvIHRoZSBmaWxlIG9yIHN0cmVhbSBpZGVudGlmaWVkIGJ5CiAgICAgICAgIDxWQVI+ZnA8L1ZBUj4gc2hvdWxkIGJlIGZ1bGx5IGJ1ZmZlcmVkLiAgQWxsIG91dHB1dCBmb3IgdGhpcyBmaWxlIHdpbGwgZ28gdG8gYQogICAgICAgICBidWZmZXIgKG9mIHNpemUgPFZBUj5zaXplPC9WQVI+KS4gIE91dHB1dCB3aWxsIGJlIHBhc3NlZCBvbiB0byB0aGUgaG9zdCBzeXN0ZW0KICAgICAgICAgb25seSB3aGVuIHRoZSBidWZmZXIgaXMgZnVsbCwgb3Igd2hlbiBhbiBpbnB1dCBvcGVyYXRpb24gaW50ZXJ2ZW5lcy4KICAgICAgICAgPGJyPjxicj4gWW91IG1heSwgaWYgeW91IHdpc2gsIHN1cHBseSB5b3VyIG93biBidWZmZXIgYnkgcGFzc2luZyBhIHBvaW50ZXIgdG8KICAgICAgICAgaXQgYXMgdGhlIGFyZ3VtZW50IDxWQVI+YnVmPC9WQVI+LiAgSXQgbXVzdCBoYXZlIHNpemUgPFZBUj5zaXplPC9WQVI+LiAgWW91IGNhbgogICAgICAgICBhbHNvIHVzZSA8Q09ERT5OVUxMPC9DT0RFPiBhcyB0aGUgdmFsdWUgb2YgPFZBUj5idWY8L1ZBUj4sIHRvIHNpZ25hbCB0aGF0IHRoZQogICAgICAgICA8Q09ERT5zZXRidWZmZXI8L0NPREU+IGZ1bmN0aW9uIGlzIHRvIGFsbG9jYXRlIHRoZSBidWZmZXIuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPldhcm5pbmdzPC9oMz4KICAgICAgICAgWW91IG1heSBvbmx5IHVzZSA8Q09ERT5zZXRidWZmZXI8L0NPREU+IGJlZm9yZSBwZXJmb3JtaW5nIGFueSBmaWxlIG9wZXJhdGlvbgogICAgICAgICBvdGhlciB0aGFuIG9wZW5pbmcgdGhlIGZpbGUuCiAgICAgICAgIDxicj48YnI+IElmIHlvdSBzdXBwbHkgYSBub24tbnVsbCA8VkFSPmJ1ZjwvVkFSPiwgeW91IG11c3QgZW5zdXJlIHRoYXQgdGhlIGFzc29jaWF0ZWQKICAgICAgICAgc3RvcmFnZSBjb250aW51ZXMgdG8gYmUgYXZhaWxhYmxlIHVudGlsIHlvdSBjbG9zZSB0aGUgc3RyZWFtCiAgICAgICAgIGlkZW50aWZpZWQgYnkgPFZBUj5mcDwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIDxDT0RFPnNldGJ1ZmZlcjwvQ09ERT4gZG9lcyBub3QgcmV0dXJuIGEgcmVzdWx0LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIFRoaXMgZnVuY3Rpb24gY29tZXMgZnJvbSBCU0Qgbm90IEFOU0kgb3IgUE9TSVguCiAgICAgICAgIDxicj48YnI+IFN1cHBvcnRpbmcgT1Mgc3Vicm91dGlu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cmVhbSBpZGVudGlmaWVkIGJ5IDxWQVI+ZnA8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5fSU9GQkY8L0NPREU+CjxERD4KICAgICAgICAgVXNlIGZ1bGwgb3V0cHV0IGJ1ZmZlcmluZzogb3V0cHV0IHdpbGwgYmUgcGFzc2VkIG9uIHRvIHRoZSBob3N0IHN5c3RlbQogICAgICAgICBvbmx5IHdoZW4gdGhlIGJ1ZmZlciBpcyBmdWxsLCBvciB3aGVuIGFuIGlucHV0IG9wZXJhdGlvbiBpbnRlcnZlbmVzLgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+X0lPTEJGPC9DT0RFPgo8REQ+CiAgICAgICAgIFVzZSBsaW5lIGJ1ZmZlcmluZzogcGFzcyBvbiBvdXRwdXQgdG8gdGhlIGhvc3Qgc3lzdGVtIGF0IGV2ZXJ5CiAgICAgICAgIG5ld2xpbmUsIGFzIHdlbGwgYXMgd2hlbiB0aGUgYnVmZmVyIGlzIGZ1bGwsIG9yIHdoZW4gYW4gaW5wdXQKICAgICAgICAgb3BlcmF0aW9uIGludGVydmVuZXMuCiAgICAgICAgIDwvREw+CiAgICAgICAgIDxicj48YnI+IDxicj48YnI+IFVzZSB0aGUgPFZBUj5zaXplPC9WQVI+IGFyZ3VtZW50IHRvIHNwZWNpZnkgaG93IGxhcmdlIGEgYnVmZmVyIHlvdSB3aXNoLiAgWW91CiAgICAgICAgIGNhbiBzdXBwbHkgdGhlIGJ1ZmZlciBpdHNlbGYsIGlmIHlvdSB3aXNoLCBieSBwYXNzaW5nIGEgcG9pbnRlciB0byBhCiAgICAgICAgIHN1aXRhYmxlIGFyZWEgb2YgbWVtb3J5IGFzIDxWQVI+YnVmPC9WQVI+LiAgT3RoZXJ3aXNlLCB5b3UgbWF5IHBhc3MgPENPREU+TlVMTDwvQ09ERT4KICAgICAgICAgYXMgdGhlIDxWQVI+YnVmPC9WQVI+IGFyZ3VtZW50LCBhbmQgPENPREU+c2V0dmJ1ZjwvQ09ERT4gd2lsbCBhbGxvY2F0ZSB0aGUgYnVmZmVyLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5XYXJuaW5nczwvaDM+CiAgICAgICAgIFlvdSBtYXkgb25seSB1c2UgPENPREU+c2V0dmJ1ZjwvQ09ERT4gYmVmb3JlIHBlcmZvcm1pbmcgYW55IGZpbGUgb3BlcmF0aW9uIG90aGVyCiAgICAgICAgIHRoYW4gb3BlbmluZyB0aGUgZmlsZS4KICAgICAgICAgPGJyPjxicj4gSWYgeW91IHN1cHBseSBhIG5vbi1udWxsIDxWQVI+YnVmPC9WQVI+LCB5b3UgbXVzdCBlbnN1cmUgdGhhdCB0aGUgYXNzb2NpYXRlZAogICAgICAgICBzdG9yYWdlIGNvbnRpbnVlcyB0byBiZSBhdmFpbGFibGUgdW50aWwgeW91IGNsb3NlIHRoZSBzdHJlYW0KICAgICAgICAgaWRlbnRpZmllZCBieSA8VkFSPmZwPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgQSA8Q09ERT4wPC9DT0RFPiByZXN1bHQgaW5kaWNhdGVzIHN1Y2Nlc3MsIDxDT0RFPkVPRjwvQ09ERT4gZmFpbHVyZSAoaW52YWxpZCA8VkFSPm1vZGU8L1ZBUj4gb3IKICAgICAgICAgPFZBUj5zaXplPC9WQVI+IGNhbiBjYXVzZSBmYWlsdXJlKS4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICBCb3RoIEFOU0kgQyBhbmQgdGhlIFN5c3RlbSBWIEludGVyZmFjZSBEZWZpbml0aW9uIChJc3N1ZSAyKSByZXF1aXJlCiAgICAgICAgIDxDT0RFPnNldHZidWY8L0NPREU+LiBIb3dldmVyLCB0aGV5IGRpZmZlciBvbiB0aGUgbWVhbmluZyBvZiBhIDxDT0RFPk5VTEw8L0NPREU+IGJ1ZmZlcgogICAgICAgICBwb2ludGVyOiB0aGUgU1ZJRCBpc3N1ZSAyIHNwZWNpZmljYXRpb24gc2F5cyB0aGF0IGEgPENPREU+TlVMTDwvQ09ERT4gYnVmZmVyCiAgICAgICAgIHBvaW50ZXIgcmVxdWVzdHMgdW5idWZmZXJlZCBvdXRwdXQuICBGb3IgbWF4aW11bSBwb3J0YWJpbGl0eSwgYXZvaWQK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ICAgICAgICA8YnI+PGJyPiBJZiA8Q09ERT4qPFZBUj5hPC9WQVI+PC9DT0RFPiBzb3J0cyBsZXhpY29ncmFwaGljYWxseSBhZnRlciA8Q09ERT4qPFZBUj5iPC9WQVI+PC9DT0RFPiAoYWZ0ZXIKICAgICAgICAgYm90aCBhcmUgY29udmVydGVkIHRvIHVwcGVyY2FzZSksIDxDT0RFPnN0cmNhc2VjbXA8L0NPREU+IHJldHVybnMgYQogICAgICAgICBudW1iZXIgZ3JlYXRlciB0aGFuIHplcm8uICBJZiB0aGUgdHdvIHN0cmluZ3MgbWF0Y2gsCiAgICAgICAgIDxDT0RFPnN0cmNhc2VjbXA8L0NPREU+IHJldHVybnMgemVyby4gIElmIDxDT0RFPio8VkFSPmE8L1ZBUj48L0NPREU+IHNvcnRzCiAgICAgICAgIGxleGljb2dyYXBoaWNhbGx5IGJlZm9yZSA8Q09ERT4qPFZBUj5iPC9WQVI+PC9DT0RFPiwgPENPREU+c3RyY2FzZWNtcDwvQ09ERT4gcmV0dXJucyBhCiAgICAgICAgIG51bWJlciBsZXNzIHRoYW4gemVyby4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICA8Q09ERT5zdHJjYXNlY21wPC9DT0RFPiBpcyBpbiB0aGUgQmVya2VsZXkgU29mdHdhcmUgRGlzdHJpYnV0aW9uLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5zdHJjYXNlY21wPC9DT0RFPiByZXF1aXJlcyBubyBzdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzLiBJdCB1c2VzCiAgICAgICAgIHRvbG93ZXIoKSBmcm9tIGVsc2V3aGVyZSBpbiB0aGlzIGxpYnJhcnkuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAIc3RyaW5nLmh4cQB+Ch10ABxjb25zdCBjaGFyICphLCBjb25zdCBjaGFyICpidAAEaW50IHQACnN0cmNhc2VzdHJzcQB+AApwdALnCiAgICAgICAgPENPREU+c3RyY2FzZXN0cjwvQ09ERT4gc2VhcmNocyB0aGUgc3RyaW5nIDxWQVI+czwvVkFSPiBmb3IKICAgICAgICAgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNlcXVlbmNlIDxWQVI+ZmluZDwvVkFSPi4gIDxDT0RFPnN0cmNhc2VzdHI8L0NPREU+CiAgICAgICAgIGlzIGlkZW50aWNhbCB0byA8Q09ERT5zdHJzdHI8L0NPREU+IGV4Y2VwdCB0aGUgc2VhcmNoIGlzCiAgICAgICAgIGNhc2UtaW5zZW5zaXRpdmUuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICA8YnI+PGJyPiBBIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNhc2UtaW5zZW5zaXRpdmUgb2NjdXJyZW5jZSBvZiB0aGUgc2VxdWVuY2UKICAgICAgICAgPFZBUj5maW5kPC9WQVI+IG9yIDxDT0RFPk5VTEw8L0NPREU+IGlmIG5vIG1hdGNoIHdhcyBmb3VuZC4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICA8Q09ERT5zdHJjYXNlc3RyPC9DT0RFPiBpcyBpbiB0aGUgQmVya2VsZXkgU29mdHdhcmUgRGlzdHJpYnV0aW9uLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5zdHJjYXNlc3RyPC9DT0RFPiByZXF1aXJlcyBubyBzdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzLiBJdCB1c2VzCiAgICAgICAgIHRvbG93ZXIoKSBmcm9tIGVsc2V3aGVyZSBpbiB0aGlzIGxpYnJhcnkuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICBzcQB+AA8AAAABdwQAAAAKdAAIc3RyaW5nLmh4cQB+CiR0AB9jb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICpmaW5kdAAGY2hhciAqdAAGc3RyY2F0c3EAfgAKcHQCbQogICAgICAgIDxDT0RFPnN0cmNhdDwvQ09ERT4gYXBwZW5kcyBhIGNvcHkgb2YgdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IDxWQVI+c3JjPC9WQVI+CiAgICAgICAgIChpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyKSB0byB0aGUgZW5kIG9mIHRoZQogICAgICAgICBzdHJpbmcgcG9pbnRlZCB0byBieSA8VkFSPmRzdDwvVkFSPi4gIFRoZSBpbml0aWFsIGNoYXJhY3RlciBvZgogICAgICAgICA8VkFSPnNyYzwvVkFSPiBvdmVyd3JpdGVzIHRoZSBudWxsIGNoYXJhY3RlciBhdCB0aGUgZW5kIG9mIDxWQVI+ZHN0PC9WQVI+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBpbml0aWFsIHZhbHVlIG9mIDxWQVI+ZHN0PC9WQVI+CiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgPENPREU+c3RyY2F0PC9DT0RFPiBpcyBBTlNJIEMuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPnN0cmNhdDwvQ09ERT4gcmVxdWlyZXMgbm8gc3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcy4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAhzdHJpbmcuaHhxAH4KK3QAGmNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjdAAGY2hhciAqdAAGc3RyY2hyc3EAfgAKcHQCOQogICAgICAgIFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiA8VkFSPmM8L1ZBUj4gKGNvbnZlcnRlZCB0bwogICAgICAgICBhIGNoYXIpIGluIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSA8VkFSPnN0cmluZzwvVkFSPiAoaW5jbHVkaW5nIHRoZQogICAgICAgICB0ZXJtaW5hdGluZyBudWxsIGNoYXJhY3RlcikuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbG9jYXRlZCBjaGFyYWN0ZXIsIG9yIGEgbnVsbCBwb2ludGVyCiAgICAgICAgIGlmIDxWQVI+YzwvVkFSPiBkb2VzIG5vdCBvY2N1ciBpbiA8VkFSPnN0cmluZzwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICA8Q09ERT5zdHJjaHI8L0NPREU+IGlzIEFOU0kgQy4KICAgICAgICAgPGJyPjxicj4gPENPREU+c3RyY2hyPC9DT0RFPiByZXF1aXJlcyBubyBzdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAXcEAAAACnQACHN0cmluZy5oeHEAfgoydAAZY29uc3QgY2hhciAqc3RyaW5nLCBpbnQgY3QABmNoYXIgKnQABnN0cmNtcHNxAH4ACnB0AuMKICAgICAgICA8Q09ERT5zdHJjbXA8L0NPREU+IGNvbXBhcmVzIHRoZSBzdHJpbmcgYXQgPFZBUj5hPC9WQVI+IHRvCiAgICAgICAgIHRoZSBzdHJpbmcgYXQgPFZBUj5iPC9WQVI+LgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgSWYgPENPREU+KjxWQVI+YTwvVkFSPjwvQ09ERT4gc29ydHMgbGV4aWNvZ3JhcGhpY2FsbHkgYWZ0ZXIgPENPREU+KjxWQVI+YjwvVkFSPjwvQ09ERT4sCiAgICAgICAgIDxDT0RFPnN0cmNtcDwvQ09ERT4gcmV0dXJucyBhIG51bWJlciBncmVhdGVyIHRoYW4gemVyby4gIElmIHRoZSB0d28KICAgICAgICAgc3RyaW5ncyBtYXRjaCwgPENPREU+c3RyY21wPC9DT0RFPiByZXR1cm5zIHplcm8uICBJZiA8Q09ERT4qPFZBUj5hPC9WQVI+PC9DT0RFPgogICAgICAgICBzb3J0cyBsZXhpY29ncmFwaGljYWxseSBiZWZvcmUgPENPREU+KjxWQVI+YjwvVkFSPjwvQ09ERT4sIDxDT0RFPnN0cmNtcDwvQ09ERT4gcmV0dXJucyBhCiAgICAgICAgIG51bWJlciBsZXNzIHRoYW4gemVyby4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UG9ydGFiaWxpdHk8L2gzPgogICAgICAgICA8Q09ERT5zdHJjbXA8L0NPREU+IGlzIEFOU0kgQy4KICAgICAgICAgPGJyPjxicj4gPENPREU+c3RyY21wPC9DT0RFPiByZXF1aXJlcyBubyBzdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAXcEAAAACnQACHN0cmluZy5oeHEAfgo5dAAcY29uc3QgY2hhciAqYSwgY29uc3QgY2hhciAqYnQABGludCB0AAdzdHJjb2xsc3EAfgAKcHQDIwogICAgICAgIDxDT0RFPnN0cmNvbGw8L0NPREU+IGNvbXBhcmVzIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSA8VkFSPnN0cmE8L1ZBUj4gdG8KICAgICAgICAgdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IDxWQVI+c3RyYjwvVkFSPiwgdXNpbmcgYW4gaW50ZXJwcmV0YXRpb24KICAgICAgICAgYXBwcm9wcmlhdGUgdG8gdGhlIGN1cnJlbnQgPENPREU+TENfQ09MTEFURTwvQ09ERT4gc3RhdGUuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICBJZiB0aGUgZmlyc3Qgc3RyaW5nIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kIHN0cmluZywKICAgICAgICAgPENPREU+c3RyY29sbDwvQ09ERT4gcmV0dXJucyBhIG51bWJlciBncmVhdGVyIHRoYW4gemVyby4gIElmIHRoZSB0d28KICAgICAgICAgc3RyaW5ncyBhcmUgZXF1aXZhbGVudCwgPENPREU+c3RyY29sbDwvQ09ERT4gcmV0dXJucyB6ZXJvLiAgSWYgdGhlIGZpcnN0CiAgICAgICAgIHN0cmluZyBpcyBsZXNzIHRoYW4gdGhlIHNlY29uZCBzdHJpbmcsIDxDT0RFPnN0cmNvbGw8L0NPREU+IHJldHVybnMgYQogICAgICAgICBudW1iZXIgbGVzcyB0aGFuIHplcm8uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgPENPREU+c3RyY29sbDwvQ09ERT4gaXMgQU5TSSBDLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5zdHJjb2xsPC9DT0RFPiByZXF1aXJlcyBubyBzdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAXcEAAAACnQACHN0cmluZy5oeHEAfgpAdAAjY29uc3QgY2hhciAqc3RyYSwgY29uc3QgY2hhciAqIHN0cmJ0AARpbnQgdAAGc3RyY3B5c3EAfgAKcHQB6QogICAgICAgIDxDT0RFPnN0cmNweTwvQ09ERT4gY29waWVzIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSA8VkFSPnNyYzwvVkFSPgogICAgICAgICAoaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyBudWxsIGNoYXJhY3RlcikgdG8gdGhlIGFycmF5CiAgICAgICAgIHBvaW50ZWQgdG8gYnkgPFZBUj5kc3Q8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJldHVybnM8L2gzPgogICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGluaXRpYWwgdmFsdWUgb2YgPFZBUj5kc3Q8L1ZBUj4uCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgPENPREU+c3RyY3B5PC9DT0RFPiBpcyBBTlNJIEMuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPnN0cmNweTwvQ09ERT4gcmVxdWlyZXMgbm8gc3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcy4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAhzdHJpbmcuaHhxAH4KR3QAGmNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjdAAGY2hhciAqdAAHc3RyY3NwbnNxAH4ACnB0Ak0KICAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBsZW5ndGggb2YgdGhlIGluaXRpYWwgcGFydCBvZgogICAgICAgICB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgPFZBUj5zMTwvVkFSPiB3aGljaCBjb25zaXN0cyBlbnRpcmVseSBvZgogICAgICAgICBjaGFyYWN0ZXJzIDxWQVI+Tk9UPC9WQVI+IGZyb20gdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IDxWQVI+czI8L1ZBUj4KICAgICAgICAgKGV4Y2x1ZGluZyB0aGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIpLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgPENPREU+c3RyY3NwbjwvQ09ERT4gcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBzdWJzdHJpbmcgZm91bmQuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgPENPREU+c3RyY3NwbjwvQ09ERT4gaXMgQU5TSSBDLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT5zdHJjc3BuPC9DT0RFPiByZXF1aXJlcyBubyBzdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgc3EAfgAPAAAAAHcEAAAACnhxAH4KTnQAHmNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMnQAB3NpemVfdCB0AAhzdHJlcnJvcnNxAH4ACnB0IgAKICAgICAgICA8Q09ERT5zdHJlcnJvcjwvQ09ERT4gY29udmVydHMgdGhlIGVycm9yIG51bWJlciA8VkFSPmVycm51bTwvVkFSPiBpbnRvIGEKICAgICAgICAgc3RyaW5nLiAgVGhlIHZhbHVlIG9mIDxWQVI+ZXJybnVtPC9WQVI+IGlzIHVzdWFsbHkgYSBjb3B5IG9mIDxDT0RFPmVycm5vPC9DT0RFPi4KICAgICAgICAgSWYgPENPREU+ZXJybnVtPC9DT0RFPiBpcyBub3QgYSBrbm93biBlcnJvciBudW1iZXIsIHRoZSByZXN1bHQgcG9pbnRzIHRvIGFuCiAgICAgICAgIGVtcHR5IHN0cmluZy4KICAgICAgICAgPGJyPjxicj4gVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiA8Q09ERT5zdHJlcnJvcjwvQ09ERT4gcHJpbnRzIG91dCB0aGUgZm9sbG93aW5nIHN0cmluZ3MKICAgICAgICAgZm9yIGVhY2ggb2YgdGhlIHZhbHVlcyBkZWZpbmVkIGluIGA8Q09ERT5lcnJuby5oPC9DT0RFPic6CiAgICAgICAgIDxicj48YnI+IDxETD4KCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FMkJJRzwvQ09ERT4KPEREPgogICAgICAgICBBcmcgbGlzdCB0b28gbG9uZwogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RUFDQ0VTPC9DT0RFPgo8REQ+CiAgICAgICAgIFBlcm1pc3Npb24gZGVuaWVkCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FQUREUklOVVNFPC9DT0RFPgo8REQ+CiAgICAgICAgIEFkZHJlc3MgYWxyZWFkeSBpbiB1c2UKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVBRFY8L0NPREU+CjxERD4KICAgICAgICAgQWR2ZXJ0aXNlIGVycm9yCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FQUZOT1NVUFBPUlQ8L0NPREU+CjxERD4KICAgICAgICAgQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbCBmYW1pbHkKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVBR0FJTjwvQ09ERT4KPEREPgogICAgICAgICBObyBtb3JlIHByb2Nlc3NlcwogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RUFMUkVBRFk8L0NPREU+CjxERD4KICAgICAgICAgU29ja2V0IGFscmVhZHkgY29ubmVjdGVkCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FQkFERjwvQ09ERT4KPEREPgogICAgICAgICBCYWQgZmlsZSBudW1iZXIKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVCQURNU0c8L0NPREU+CjxERD4KICAgICAgICAgQmFkIG1lc3NhZ2UKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVCVVNZPC9DT0RFPgo8REQ+CiAgICAgICAgIERldmljZSBvciByZXNvdXJjZSBidXN5CiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FQ0hJTEQ8L0NPREU+CjxERD4KICAgICAgICAgTm8gY2hpbGRyZW4KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVDT01NPC9DT0RFPgo8REQ+CiAgICAgICAgIENvbW11bmljYXRpb24gZXJyb3IKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVDT05OQUJPUlRFRDwvQ09ERT4KPEREPgogICAgICAgICBTb2Z0d2FyZSBjYXVzZWQgY29ubmVjdGlvbiBhYm9ydAogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RUNPTk5SRUZVU0VEPC9DT0RFPgo8REQ+CiAgICAgICAgIENvbm5lY3Rpb24gcmVmdXNlZAogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RURFQURMSzwvQ09ERT4KPEREPgogICAgICAgICBEZWFkbG9jawogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RURFU1RBRERSUkVRPC9DT0RFPgo8REQ+CiAgICAgICAgIERlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVFWElTVDwvQ09ERT4KPEREPgogICAgICAgICBGaWxlIGV4aXN0cwogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RURPTTwvQ09ERT4KPEREPgogICAgICAgICBNYXRoIGFyZ3VtZW50CiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FRkFVTFQ8L0NPREU+CjxERD4KICAgICAgICAgQmFkIGFkZHJlc3MKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVGQklHPC9DT0RFPgo8REQ+CiAgICAgICAgIEZpbGUgdG9vIGxhcmdlCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FSE9TVERPV048L0NPREU+CjxERD4KICAgICAgICAgSG9zdCBpcyBkb3duCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FSE9TVFVOUkVBQ0g8L0NPREU+CjxERD4KICAgICAgICAgSG9zdCBpcyB1bnJlYWNoYWJsZQogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RUlEUk08L0NPREU+CjxERD4KICAgICAgICAgSWRlbnRpZmllciByZW1vdmVkCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FSU5QUk9HUkVTUzwvQ09ERT4KPEREPgogICAgICAgICBDb25uZWN0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVJTlRSPC9DT0RFPgo8REQ+CiAgICAgICAgIEludGVycnVwdGVkIHN5c3RlbSBjYWxsCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FSU5WQUw8L0NPREU+CjxERD4KICAgICAgICAgSW52YWxpZCBhcmd1bWVudAogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RUlPPC9DT0RFPgo8REQ+CiAgICAgICAgIEkvTyBlcnJvcgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RUlTQ09OTjwvQ09ERT4KPEREPgogICAgICAgICBTb2NrZXQgaXMgYWxyZWFkeSBjb25uZWN0ZWQKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVJU0RJUjwvQ09ERT4KPEREPgogICAgICAgICBJcyBhIGRpcmVjdG9yeQogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RUxJQkFDQzwvQ09ERT4KPEREPgogICAgICAgICBDYW5ub3QgYWNjZXNzIGEgbmVlZGVkIHNoYXJlZCBsaWJyYXJ5CiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FTElCQkFEPC9DT0RFPgo8REQ+CiAgICAgICAgIEFjY2Vzc2luZyBhIGNvcnJ1cHRlZCBzaGFyZWQgbGlicmFyeQogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RUxJQkVYRUM8L0NPREU+CjxERD4KICAgICAgICAgQ2Fubm90IGV4ZWMgYSBzaGFyZWQgbGlicmFyeSBkaXJlY3RseQogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RUxJQk1BWDwvQ09ERT4KPEREPgogICAgICAgICBBdHRlbXB0aW5nIHRvIGxpbmsgaW4gbW9yZSBzaGFyZWQgbGlicmFyaWVzIHRoYW4gc3lzdGVtIGxpbWl0CiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FTElCU0NOPC9DT0RFPgo8REQ+CiAgICAgICAgIDxDT0RFPi5saWI8L0NPREU+IHNlY3Rpb24gaW4gYS5vdXQgY29ycnVwdGVkCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FTUZJTEU8L0NPREU+CjxERD4KICAgICAgICAgVG9vIG1hbnkgb3BlbiBmaWxlcwogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RU1MSU5LPC9DT0RFPgo8REQ+CiAgICAgICAgIFRvbyBtYW55IGxpbmtzCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FTVNHU0laRTwvQ09ERT4KPEREPgogICAgICAgICBNZXNzYWdlIHRvbyBsb25nCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FTVVMVElIT1A8L0NPREU+CjxERD4KICAgICAgICAgTXVsdGlob3AgYXR0ZW1wdGVkCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FTkFNRVRPT0xPTkc8L0NPREU+CjxERD4KICAgICAgICAgRmlsZSBvciBwYXRoIG5hbWUgdG9vIGxvbmcKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVORVRET1dOPC9DT0RFPgo8REQ+CiAgICAgICAgIE5ldHdvcmsgaW50ZXJmYWNlIG5vdCBjb25maWd1cmVkCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FTkVUVU5SRUFDSDwvQ09ERT4KPEREPgogICAgICAgICBOZXR3b3JrIGlzIHVucmVhY2hhYmxlCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FTkZJTEU8L0NPREU+CjxERD4KICAgICAgICAgVG9vIG1hbnkgb3BlbiBmaWxlcyBpbiBzeXN0ZW0KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVOT0RFVjwvQ09ERT4KPEREPgogICAgICAgICBObyBzdWNoIGRldmljZQogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RU5PRU5UPC9DT0RFPgo8REQ+CiAgICAgICAgIE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVOT0VYRUM8L0NPREU+CjxERD4KICAgICAgICAgRXhlYyBmb3JtYXQgZXJyb3IKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVOT0xDSzwvQ09ERT4KPEREPgogICAgICAgICBObyBsb2NrCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FTk9MSU5LPC9DT0RFPgo8REQ+CiAgICAgICAgIFZpcnR1YWwgY2lyY3VpdCBpcyBnb25lCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FTk9NRU08L0NPREU+CjxERD4KICAgICAgICAgTm90IGVub3VnaCBzcGFjZQogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RU5PTVNHPC9DT0RFPgo8REQ+CiAgICAgICAgIE5vIG1lc3NhZ2Ugb2YgZGVzaXJlZCB0eXBlCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FTk9ORVQ8L0NPREU+CjxERD4KICAgICAgICAgTWFjaGluZSBpcyBub3Qgb24gdGhlIG5ldHdvcmsKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVOT1BLRzwvQ09ERT4KPEREPgogICAgICAgICBObyBwYWNrYWdlCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FTk9QUk9UT09QVDwvQ09ERT4KPEREPgogICAgICAgICBQcm90b2NvbCBub3QgYXZhaWxhYmxlCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FTk9TUEM8L0NPREU+CjxERD4KICAgICAgICAgTm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVOT1NSPC9DT0RFPgo8REQ+CiAgICAgICAgIE5vIHN0cmVhbSByZXNvdXJjZXMKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVOT1NUUjwvQ09ERT4KPEREPgogICAgICAgICBOb3QgYSBzdHJlYW0KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVOT1NZUzwvQ09ERT4KPEREPgogICAgICAgICBGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVOT1RCTEs8L0NPREU+CjxERD4KICAgICAgICAgQmxvY2sgZGV2aWNlIHJlcXVpcmVkCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FTk9UQ09OTjwvQ09ERT4KPEREPgogICAgICAgICBTb2NrZXQgaXMgbm90IGNvbm5lY3RlZAogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RU5PVERJUjwvQ09ERT4KPEREPgogICAgICAgICBOb3QgYSBkaXJlY3RvcnkKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVOT1RFTVBUWTwvQ09ERT4KPEREPgogICAgICAgICBEaXJlY3Rvcnkgbm90IGVtcHR5CiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FTk9UU09DSzwvQ09ERT4KPEREPgogICAgICAgICBTb2NrZXQgb3BlcmF0aW9uIG9uIG5vbi1zb2NrZXQKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVOT1RTVVA8L0NPREU+CjxERD4KICAgICAgICAgTm90IHN1cHBvcnRlZAogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RU5PVFRZPC9DT0RFPgo8REQ+CiAgICAgICAgIE5vdCBhIGNoYXJhY3RlciBkZXZpY2UKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVOWElPPC9DT0RFPgo8REQ+CiAgICAgICAgIE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVQRVJNPC9DT0RFPgo8REQ+CiAgICAgICAgIE5vdCBvd25lcgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RVBJUEU8L0NPREU+CjxERD4KICAgICAgICAgQnJva2VuIHBpcGUKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVQUk9UTzwvQ09ERT4KPEREPgogICAgICAgICBQcm90b2NvbCBlcnJvcgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RVBST1RPVFlQRTwvQ09ERT4KPEREPgogICAgICAgICBQcm90b2NvbCB3cm9uZyB0eXBlIGZvciBzb2NrZXQKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVQUk9UT05PU1VQUE9SVDwvQ09ERT4KPEREPgogICAgICAgICBVbmtub3duIHByb3RvY29sCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FUkFOR0U8L0NPREU+CjxERD4KICAgICAgICAgUmVzdWx0IHRvbyBsYXJnZQogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RVJFTU9URTwvQ09ERT4KPEREPgogICAgICAgICBSZXNvdXJjZSBpcyByZW1vdGUKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVST0ZTPC9DT0RFPgo8REQ+CiAgICAgICAgIFJlYWQtb25seSBmaWxlIHN5c3RlbQogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RVNIVVRET1dOPC9DT0RFPgo8REQ+CiAgICAgICAgIENhbid0IHNlbmQgYWZ0ZXIgc29ja2V0IHNodXRkb3duCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FU09DS1ROT1NVUFBPUlQ8L0NPREU+CjxERD4KICAgICAgICAgU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZAogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RVNQSVBFPC9DT0RFPgo8REQ+CiAgICAgICAgIElsbGVnYWwgc2VlawogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RVNSQ0g8L0NPREU+CjxERD4KICAgICAgICAgTm8gc3VjaCBwcm9jZXNzCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT5FU1JNTlQ8L0NPREU+CjxERD4KICAgICAgICAgU3Jtb3VudCBlcnJvcgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RVRJTUU8L0NPREU+CjxERD4KICAgICAgICAgU3RyZWFtIGlvY3RsIHRpbWVvdXQKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVUSU1FRE9VVDwvQ09ERT4KPEREPgogICAgICAgICBDb25uZWN0aW9uIHRpbWVkIG91dAogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RVRYVEJTWTwvQ09ERT4KPEREPgogICAgICAgICBUZXh0IGZpbGUgYnVzeQogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+RVhERVY8L0NPREU+CjxERD4KICAgICAgICAgQ3Jvc3MtZGV2aWNlIGxpbmsKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVDQU5DRUxFRDwvQ09ERT4KPEREPgogICAgICAgICBPcGVyYXRpb24gY2FuY2VsZWQKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVOT1RSRUNPVkVSQUJMRTwvQ09ERT4KPEREPgogICAgICAgICBTdGF0ZSBub3QgcmVjb3ZlcmFibGUKICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPkVPV05FUkRFQUQ8L0NPREU+CjxERD4KICAgICAgICAgUHJldmlvdXMgb3duZXIgZGllZAogICAgICAgICA8YnI+PGJyPiA8L0RMPgogICAgICAgICA8YnI+PGJyPiA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0cmluZy4gIFlvdXIgYXBwbGljYXRpb24gbXVzdAogICAgICAgICBub3QgbW9kaWZ5IHRoYXQgc3RyaW5nLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIEFOU0kgQyByZXF1aXJlcyA8Q09ERT5zdHJlcnJvcjwvQ09ERT4sIGJ1dCBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBzdHJpbmdzIHVzZWQKICAgICAgICAgZm9yIGVhY2ggZXJyb3IgbnVtYmVyLgogICAgICAgICA8YnI+PGJyPiBBbHRob3VnaCB0aGlzIGltcGxlbWVudGF0aW9uIG9mIDxDT0RFPnN0cmVycm9yPC9DT0RFPiBpcyByZWVudHJhbnQsIEFOU0kgQwogICAgICAgICBkZWNsYXJlcyB0aGF0IHN1YnNlcXVlbnQgY2FsbHMgdG8gPENPREU+c3RyZXJyb3I8L0NPREU+IG1heSBvdmVyd3JpdGUgdGhlCiAgICAgICAgIHJlc3VsdCBzdHJpbmc7IHRoZXJlZm9yZSBwb3J0YWJsZSBjb2RlIGNhbm5vdCBkZXBlbmQgb24gdGhlIHJlZW50cmFuY3kKICAgICAgICAgb2YgdGhpcyBzdWJyb3V0aW5lLgogICAgICAgICA8YnI+PGJyPiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIDxDT0RFPnN0cmVycm9yPC9DT0RFPiBwcm92aWRlcyBmb3IgdXNlci1kZWZpbmVkCiAgICAgICAgIGV4dGVuc2liaWxpdHkuICA8Q09ERT5lcnJuby5oPC9DT0RFPiBkZWZpbmVzIDxWQVI+X19FTEFTVEVSUk9SPC9WQVI+LCB3aGljaCBjYW4gYmUKICAgICAgICAgdXNlZCBhcyBhIGJhc2UgZm9yIHVzZXItZGVmaW5lZCBlcnJvciB2YWx1ZXMuICBJZiB0aGUgdXNlciBzdXBwbGllcyBhCiAgICAgICAgIHJvdXRpbmUgbmFtZWQgPENPREU+X3VzZXJfc3RyZXJyb3I8L0NPREU+LCBhbmQgPFZBUj5lcnJudW08L1ZBUj4gcGFzc2VkIHRvCiAgICAgICAgIDxDT0RFPnN0cmVycm9yPC9DT0RFPiBkb2VzIG5vdCBtYXRjaCBhbnkgb2YgdGhlIHN1cHBvcnRlZCB2YWx1ZXMsCiAgICAgICAgIDxDT0RFPl91c2VyX3N0cmVycm9yPC9DT0RFPiBpcyBjYWxsZWQgd2l0aCA8VkFSPmVycm51bTwvVkFSPiBhcyBpdHMgYXJndW1lbnQuCiAgICAgICAgIDxicj48YnI+IDxDT0RFPl91c2VyX3N0cmVycm9yPC9DT0RFPiB0YWtlcyBvbmUgYXJndW1lbnQgb2YgdHlwZSA8VkFSPmludDwvVkFSPiwgYW5kIHJldHVybnMgYQogICAgICAgICBjaGFy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bmRzIG9mIHNwZWNpZmljYXRpb25zOiB0ZXh0IHRvIGJlCiAgICAgICAgIGNvcGllZCBsaXRlcmFsbHkgaW50byB0aGUgZm9ybWF0dGVkIHN0cmluZywgYW5kIHRpbWUgY29udmVyc2lvbgogICAgICAgICBzcGVjaWZpY2F0aW9ucy4gIFRpbWUgY29udmVyc2lvbiBzcGVjaWZpY2F0aW9ucyBhcmUgdHdvLSBhbmQKICAgICAgICAgdGhyZWUtY2hhcmFjdGVyIHNlcXVlbmNlcyBiZWdpbm5pbmcgd2l0aCBgPENPREU+JTwvQ09ERT4nICh1c2UgYDxDT0RFPiUlPC9DT0RFPicgdG8KICAgICAgICAgaW5jbHVkZSBhIHBlcmNlbnQgc2lnbiBpbiB0aGUgb3V0cHV0KS4gIEVhY2ggZGVmaW5lZCBjb252ZXJzaW9uCiAgICAgICAgIHNwZWNpZmljYXRpb24gc2VsZWN0cyBvbmx5IHRoZSBzcGVjaWZpZWQgZmllbGQocykgb2YgY2FsZW5kYXIgdGltZQogICAgICAgICBkYXRhIGZyb20gPENPREU+KjxWQVI+dGltcDwvVkFSPjwvQ09ERT4sIGFuZCBjb252ZXJ0cyBpdCB0byBhIHN0cmluZyBpbiBvbmUgb2YgdGhlCiAgICAgICAgIGZvbGxvd2luZyB3YXlzOgogICAgICAgICA8YnI+PGJyPiA8REw+CgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+JWE8L0NPREU+CjxERD4KICAgICAgICAgQSB0aHJlZS1sZXR0ZXIgYWJicmV2aWF0aW9uIGZvciB0aGUgZGF5IG9mIHRoZSB3ZWVrLiBbdG1fd2RheV0KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPiVBPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSBmdWxsIG5hbWUgZm9yIHRoZSBkYXkgb2YgdGhlIHdlZWssIG9uZSBvZiBgPENPREU+U3VuZGF5PC9DT0RFPicsCiAgICAgICAgIGA8Q09ERT5Nb25kYXk8L0NPREU+JywgYDxDT0RFPlR1ZXNkYXk8L0NPREU+JywgYDxDT0RFPldlZG5lc2RheTwvQ09ERT4nLCBgPENPREU+VGh1cnNkYXk8L0NPREU+JywKICAgICAgICAgYDxDT0RFPkZyaWRheTwvQ09ERT4nLCBvciBgPENPREU+U2F0dXJkYXk8L0NPREU+Jy4gW3RtX3dkYXldCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT4lYjwvQ09ERT4KPEREPgogICAgICAgICBBIHRocmVlLWxldHRlciBhYmJyZXZpYXRpb24gZm9yIHRoZSBtb250aCBuYW1lLiBbdG1fbW9uXQogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+JUI8L0NPREU+CjxERD4KICAgICAgICAgVGhlIGZ1bGwgbmFtZSBvZiB0aGUgbW9udGgsIG9uZSBvZiBgPENPREU+SmFudWFyeTwvQ09ERT4nLCBgPENPREU+RmVicnVhcnk8L0NPREU+JywKICAgICAgICAgYDxDT0RFPk1hcmNoPC9DT0RFPicsIGA8Q09ERT5BcHJpbDwvQ09ERT4nLCBgPENPREU+TWF5PC9DT0RFPicsIGA8Q09ERT5KdW5lPC9DT0RFPicsIGA8Q09ERT5KdWx5PC9DT0RFPicsCiAgICAgICAgIGA8Q09ERT5BdWd1c3Q8L0NPREU+JywgYDxDT0RFPlNlcHRlbWJlcjwvQ09ERT4nLCBgPENPREU+T2N0b2JlcjwvQ09ERT4nLCBgPENPREU+Tm92ZW1iZXI8L0NPREU+JywKICAgICAgICAgYDxDT0RFPkRlY2VtYmVyPC9DT0RFPicuIFt0bV9tb25dCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT4lYzwvQ09ERT4KPEREPgogICAgICAgICBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvbXBsZXRlIGRhdGUgYW5kIHRpbWUsIGluIHRoZSBmb3JtCiAgICAgICAgIGA8Q09ERT4iJWEgJWIgJWUgJUg6JU06JVMgJVkiPC9DT0RFPicgKGV4YW1wbGUgIk1vbiBBcHIgMDEgMTM6MTM6MTMKICAgICAgICAgMTk5MiIpLiBbdG1fc2VjLCB0bV9taW4sIHRtX2hvdXIsIHRtX21kYXksIHRtX21vbiwgdG1feWVhciwgdG1fd2RheV0KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPiVDPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSBjZW50dXJ5LCB0aGF0IGlzLCB0aGUgeWVhciBkaXZpZGVkIGJ5IDEwMCB0aGVuIHRydW5jYXRlZC4gIEZvcgogICAgICAgICA0LWRpZ2l0IHllYXJzLCB0aGUgcmVzdWx0IGlzIHplcm8tcGFkZGVkIGFuZCBleGFjdGx5IHR3byBjaGFyYWN0ZXJzOwogICAgICAgICBidXQgZm9yIG90aGVyIHllYXJzLCB0aGVyZSBtYXkgYSBuZWdhdGl2ZSBzaWduIG9yIG1vcmUgZGlnaXRzLiAgSW4KICAgICAgICAgdGhpcyB3YXksIGA8Q09ERT4lQyV5PC9DT0RFPicgaXMgZXF1aXZhbGVudCB0byBgPENPREU+JVk8L0NPREU+Jy4gW3RtX3llYXJdCiAgICAgICAgIDxEVD48Q09ERT4lZDwvQ09ERT4KPEREPgogICAgICAgICBUaGUgZGF5IG9mIHRoZSBtb250aCwgZm9ybWF0dGVkIHdpdGggdHdvIGRpZ2l0cyAoZnJvbSBgPENPREU+MDE8L0NPREU+JyB0bwogICAgICAgICBgPENPREU+MzE8L0NPREU+JykuIFt0bV9tZGF5XQogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+JUQ8L0NPREU+CjxERD4KICAgICAgICAgQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkYXRlLCBpbiB0aGUgZm9ybSBgPENPREU+IiVtLyVkLyV5IjwvQ09ERT4nLgogICAgICAgICBbdG1fbWRheSwgdG1fbW9uLCB0bV95ZWFyXQogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+JWU8L0NPREU+CjxERD4KICAgICAgICAgVGhlIGRheSBvZiB0aGUgbW9udGgsIGZvcm1hdHRlZCB3aXRoIGxlYWRpbmcgc3BhY2UgaWYgc2luZ2xlIGRpZ2l0CiAgICAgICAgIChmcm9tIGA8Q09ERT4xPC9DT0RFPicgdG8gYDxDT0RFPjMxPC9DT0RFPicpLiBbdG1fbWRheV0KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPiVFPENPREU+eDwvQ09ERT48L0NPREU+CjxERD4KICAgICAgICAgSW4gc29tZSBsb2NhbGVzLCB0aGUgRSBtb2RpZmllciBzZWxlY3RzIGFsdGVybmF0aXZlIHJlcHJlc2VudGF0aW9ucyBvZgogICAgICAgICBjZXJ0YWluIG1vZGlmaWVycyA8Q09ERT54PC9DT0RFPi4gIEJ1dCBpbiB0aGUgIkMiIGxvY2FsZSBzdXBwb3J0ZWQgYnkgbmV3bGliLAogICAgICAgICBpdCBpcyBpZ25vcmVkLCBhbmQgdHJlYXRlZCBhcyAlPENPREU+eDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT4lRjwvQ09ERT4KPEREPgogICAgICAgICBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIElTTyA4NjAxOjIwMDAgZGF0ZSBmb3JtYXQsIGluIHRoZSBmb3JtCiAgICAgICAgIGA8Q09ERT4iJVktJW0tJWQiPC9DT0RFPicuIFt0bV9tZGF5LCB0bV9tb24sIHRtX3llYXJdCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT4lZzwvQ09ERT4KPEREPgogICAgICAgICBUaGUgbGFzdCB0d28gZGlnaXRzIG9mIHRoZSB3ZWVrLWJhc2VkIHllYXIsIHNlZSBzcGVjaWZpZXIgJUcgKGZyb20KICAgICAgICAgYDxDT0RFPjAwPC9DT0RFPicgdG8gYDxDT0RFPjk5PC9DT0RFPicpLiBbdG1feWVhciwgdG1fd2RheSwgdG1feWRheV0KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPiVHPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSB3ZWVrLWJhc2VkIHllYXIuIEluIHRoZSBJU08gODYwMToyMDAwIGNhbGVuZGFyLCB3ZWVrIDEgb2YgdGhlIHllYXIKICAgICAgICAgaW5jbHVkZXMgSmFudWFyeSA0dGgsIGFuZCBiZWdpbiBvbiBNb25kYXlzLiBUaGVyZWZvcmUsIGlmIEphbnVhcnkgMXN0LAogICAgICAgICAybmQsIG9yIDNyZCBmYWxscyBvbiBhIFN1bmRheSwgdGhhdCBkYXkgYW5kIGVhcmxpZXIgYmVsb25nIHRvIHRoZSBsYXN0CiAgICAgICAgIHdlZWsgb2YgdGhlIHByZXZpb3VzIHllYXI7IGFuZCBpZiBEZWNlbWJlciAyOXRoLCAzMHRoLCBvciAzMXN0IGZhbGxzCiAgICAgICAgIG9uIE1vbmRheSwgdGhhdCBkYXkgYW5kIGxhdGVyIGJlbG9uZyB0byB3ZWVrIDEgb2YgdGhlIG5leHQgeWVhci4gIEZvcgogICAgICAgICBjb25zaXN0ZW5jeSB3aXRoICVZLCBpdCBhbHdheXMgaGFzIGF0IGxlYXN0IGZvdXIgY2hhcmFjdGVycy4gCiAgICAgICAgIEV4YW1wbGU6ICIlRyIgZm9yIFNhdHVyZGF5IDJuZCBKYW51YXJ5IDE5OTkgZ2l2ZXMgIjE5OTgiLCBhbmQgZm9yCiAgICAgICAgIFR1ZXNkYXkgMzB0aCBEZWNlbWJlciAxOTk3IGdpdmVzICIxOTk4Ii4gW3RtX3llYXIsIHRtX3dkYXksIHRtX3lkYXldCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT4laDwvQ09ERT4KPEREPgogICAgICAgICBBIHRocmVlLWxldHRlciBhYmJyZXZpYXRpb24gZm9yIHRoZSBtb250aCBuYW1lIChzeW5vbnltIGZvcgogICAgICAgICAiJWIiKS4gW3RtX21vbl0KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPiVIPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSBob3VyIChvbiBhIDI0LWhvdXIgY2xvY2spLCBmb3JtYXR0ZWQgd2l0aCB0d28gZGlnaXRzIChmcm9tCiAgICAgICAgIGA8Q09ERT4wMDwvQ09ERT4nIHRvIGA8Q09ERT4yMzwvQ09ERT4nKS4gW3RtX2hvdXJdCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT4lSTwvQ09ERT4KPEREPgogICAgICAgICBUaGUgaG91ciAob24gYSAxMi1ob3VyIGNsb2NrKSwgZm9ybWF0dGVkIHdpdGggdHdvIGRpZ2l0cyAoZnJvbQogICAgICAgICBgPENPREU+MDE8L0NPREU+JyB0byBgPENPREU+MTI8L0NPREU+JykuIFt0bV9ob3VyXQogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+JWo8L0NPREU+CjxERD4KICAgICAgICAgVGhlIGNvdW50IG9mIGRheXMgaW4gdGhlIHllYXIsIGZvcm1hdHRlZCB3aXRoIHRocmVlIGRpZ2l0cwogICAgICAgICAoZnJvbSBgPENPREU+MDAxPC9DT0RFPicgdG8gYDxDT0RFPjM2NjwvQ09ERT4nKS4gW3RtX3lkYXldCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT4lazwvQ09ERT4KPEREPgogICAgICAgICBUaGUgaG91ciAob24gYSAyNC1ob3VyIGNsb2NrKSwgZm9ybWF0dGVkIHdpdGggbGVhZGluZyBzcGFjZSBpZiBzaW5nbGUKICAgICAgICAgZGlnaXQgKGZyb20gYDxDT0RFPjA8L0NPREU+JyB0byBgPENPREU+MjM8L0NPREU+JykuIE5vbi1QT1NJWCBleHRlbnNpb24uIFt0bV9ob3VyXQogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+JWw8L0NPREU+CjxERD4KICAgICAgICAgVGhlIGhvdXIgKG9uIGEgMTItaG91ciBjbG9jayksIGZvcm1hdHRlZCB3aXRoIGxlYWRpbmcgc3BhY2UgaWYgc2luZ2xlCiAgICAgICAgIGRpZ2l0IChmcm9tIGA8Q09ERT4xPC9DT0RFPicgdG8gYDxDT0RFPjEyPC9DT0RFPicpLiBOb24tUE9TSVggZXh0ZW5zaW9uLiBbdG1faG91cl0KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPiVtPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSBtb250aCBudW1iZXIsIGZvcm1hdHRlZCB3aXRoIHR3byBkaWdpdHMgKGZyb20gYDxDT0RFPjAxPC9DT0RFPicgdG8gYDxDT0RFPjEyPC9DT0RFPicpLgogICAgICAgICBbdG1fbW9uXQogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+JU08L0NPREU+CjxERD4KICAgICAgICAgVGhlIG1pbnV0ZSwgZm9ybWF0dGVkIHdpdGggdHdvIGRpZ2l0cyAoZnJvbSBgPENPREU+MDA8L0NPREU+JyB0byBgPENPREU+NTk8L0NPREU+JykuIFt0bV9taW5dCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT4lbjwvQ09ERT4KPEREPgogICAgICAgICBBIG5ld2xpbmUgY2hhcmFjdGVyIChgPENPREU+XG48L0NPREU+JykuCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT4lTzxDT0RFPng8L0NPREU+PC9DT0RFPgo8REQ+CiAgICAgICAgIEluIHNvbWUgbG9jYWxlcywgdGhlIE8gbW9kaWZpZXIgc2VsZWN0cyBhbHRlcm5hdGl2ZSBkaWdpdCBjaGFyYWN0ZXJzCiAgICAgICAgIGZvciBjZXJ0YWluIG1vZGlmaWVycyA8Q09ERT54PC9DT0RFPi4gIEJ1dCBpbiB0aGUgIkMiIGxvY2FsZSBzdXBwb3J0ZWQgYnkgbmV3bGliLCBpdAogICAgICAgICBpcyBpZ25vcmVkLCBhbmQgdHJlYXRlZCBhcyAlPENPREU+eDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT4lcDwvQ09ERT4KPEREPgogICAgICAgICBFaXRoZXIgYDxDT0RFPkFNPC9DT0RFPicgb3IgYDxDT0RFPlBNPC9DT0RFPicgYXMgYXBwcm9wcmlhdGUuIFt0bV9ob3VyXQogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+JXI8L0NPREU+CjxERD4KICAgICAgICAgVGhlIDEyLWhvdXIgdGltZSwgdG8gdGhlIHNlY29uZC4gIEVxdWl2YWxlbnQgdG8gIiVJOiVNOiVTICVwIi4gW3RtX3NlYywKICAgICAgICAgdG1fbWluLCB0bV9ob3VyXQogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+JVI8L0NPREU+CjxERD4KICAgICAgICAgVGhlIDI0LWhvdXIgdGltZSwgdG8gdGhlIG1pbnV0ZS4gIEVxdWl2YWxlbnQgdG8gIiVIOiVNIi4gW3RtX21pbiwgdG1faG91cl0KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPiVTPC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSBzZWNvbmQsIGZvcm1hdHRlZCB3aXRoIHR3byBkaWdpdHMgKGZyb20gYDxDT0RFPjAwPC9DT0RFPicgdG8gYDxDT0RFPjYwPC9DT0RFPicpLiAgVGhlCiAgICAgICAgIHZhbHVlIDYwIGFjY291bnRzIGZvciB0aGUgb2NjYXNpb25hbCBsZWFwIHNlY29uZC4gW3RtX3NlY10KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPiV0PC9DT0RFPgo8REQ+CiAgICAgICAgIEEgdGFiIGNoYXJhY3RlciAoYDxDT0RFPlx0PC9DT0RFPicpLgogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+JVQ8L0NPREU+CjxERD4KICAgICAgICAgVGhlIDI0LWhvdXIgdGltZSwgdG8gdGhlIHNlY29uZC4gIEVxdWl2YWxlbnQgdG8gIiVIOiVNOiVTIi4gW3RtX3NlYywKICAgICAgICAgdG1fbWluLCB0bV9ob3VyXQogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+JXU8L0NPREU+CjxERD4KICAgICAgICAgVGhlIHdlZWtkYXkgYXMgYSBudW1iZXIsIDEtYmFzZWQgZnJvbSBNb25kYXkgKGZyb20gYDxDT0RFPjE8L0NPREU+JyB0bwogICAgICAgICBgPENPREU+NzwvQ09ERT4nKS4gW3RtX3dkYXldCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT4lVTwvQ09ERT4KPEREPgogICAgICAgICBUaGUgd2VlayBudW1iZXIsIHdoZXJlIHdlZWtzIHN0YXJ0IG9uIFN1bmRheSwgd2VlayAxIGNvbnRhaW5zIHRoZSBmaXJzdAogICAgICAgICBTdW5kYXkgaW4gYSB5ZWFyLCBhbmQgZWFybGllciBkYXlzIGFyZSBpbiB3ZWVrIDAuICBGb3JtYXR0ZWQgd2l0aCB0d28KICAgICAgICAgZGlnaXRzIChmcm9tIGA8Q09ERT4wMDwvQ09ERT4nIHRvIGA8Q09ERT41MzwvQ09ERT4nKS4gIFNlZSBhbHNvIDxDT0RFPiVXPC9DT0RFPi4gW3RtX3dkYXksIHRtX3lkYXldCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT4lVjwvQ09ERT4KPEREPgogICAgICAgICBUaGUgd2VlayBudW1iZXIsIHdoZXJlIHdlZWtzIHN0YXJ0IG9uIE1vbmRheSwgd2VlayAxIGNvbnRhaW5zIEphbnVhcnkgNHRoLAogICAgICAgICBhbmQgZWFybGllciBkYXlzIGFyZSBpbiB0aGUgcHJldmlvdXMgeWVhci4gIEZvcm1hdHRlZCB3aXRoIHR3byBkaWdpdHMKICAgICAgICAgKGZyb20gYDxDT0RFPjAxPC9DT0RFPicgdG8gYDxDT0RFPjUzPC9DT0RFPicpLiAgU2VlIGFsc28gPENPREU+JUc8L0NPREU+LiBbdG1feWVhciwgdG1fd2RheSwgdG1feWRheV0KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPiV3PC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSB3ZWVrZGF5IGFzIGEgbnVtYmVyLCAwLWJhc2VkIGZyb20gU3VuZGF5IChmcm9tIGA8Q09ERT4wPC9DT0RFPicgdG8gYDxDT0RFPjY8L0NPREU+JykuCiAgICAgICAgIFt0bV93ZGF5XQogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+JVc8L0NPREU+CjxERD4KICAgICAgICAgVGhlIHdlZWsgbnVtYmVyLCB3aGVyZSB3ZWVrcyBzdGFydCBvbiBNb25kYXksIHdlZWsgMSBjb250YWlucyB0aGUgZmlyc3QKICAgICAgICAgTW9uZGF5IGluIGEgeWVhciwgYW5kIGVhcmxpZXIgZGF5cyBhcmUgaW4gd2VlayAwLiAgRm9ybWF0dGVkIHdpdGggdHdvCiAgICAgICAgIGRpZ2l0cyAoZnJvbSBgPENPREU+MDA8L0NPREU+JyB0byBgPENPREU+NTM8L0NPREU+JykuIFt0bV93ZGF5LCB0bV95ZGF5XQogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+JXg8L0NPREU+CjxERD4KICAgICAgICAgQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb21wbGV0ZSBkYXRlLCBlcXVpdmFsZW50IHRvICIlbS8lZC8leSIuCiAgICAgICAgIFt0bV9tb24sIHRtX21kYXksIHRtX3llYXJdCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT4lWDwvQ09ERT4KPEREPgogICAgICAgICBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGZ1bGwgdGltZSBvZiBkYXkgKGhvdXJzLCBtaW51dGVzLCBhbmQKICAgICAgICAgc2Vjb25kcyksIGVxdWl2YWxlbnQgdG8gIiVIOiVNOiVTIi4gW3RtX3NlYywgdG1fbWluLCB0bV9ob3VyXQogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+JXk8L0NPREU+CjxERD4KICAgICAgICAgVGhlIGxhc3QgdHdvIGRpZ2l0cyBvZiB0aGUgeWVhciAoZnJvbSBgPENPREU+MDA8L0NPREU+JyB0byBgPENPREU+OTk8L0NPREU+JykuIFt0bV95ZWFyXQogICAgICAgICA8YnI+PGJyPiA8RFQ+PENPREU+JVk8L0NPREU+CjxERD4KICAgICAgICAgVGhlIGZ1bGwgeWVhciwgZXF1aXZhbGVudCB0byA8Q09ERT4lQyV5PC9DT0RFPi4gIEl0IHdpbGwgYWx3YXlzIGhhdmUgYXQgbGVhc3QgZm91cgogICAgICAgICBjaGFyYWN0ZXJzLCBidXQgbWF5IGhhdmUgbW9yZS4gIFRoZSB5ZWFyIGlzIGFjY3VyYXRlIGV2ZW4gd2hlbiB0bV95ZWFyCiAgICAgICAgIGFkZGVkIHRvIHRoZSBvZmZzZXQgb2YgMTkwMCBvdmVyZmxvd3MgYW4gaW50LiBbdG1feWVhcl0KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPiV6PC9DT0RFPgo8REQ+CiAgICAgICAgIFRoZSBvZmZzZXQgZnJvbSBVVEMuICBUaGUgZm9ybWF0IGNvbnNpc3RzIG9mIGEgc2lnbiAobmVnYXRpdmUgaXMgd2VzdCBvZgogICAgICAgICBHcmVld2ljaCksIHR3byBjaGFyYWN0ZXJzIGZvciBob3VyLCB0aGVuIHR3byBjaGFyYWN0ZXJzIGZvciBtaW51dGVzCiAgICAgICAgICgtaGhtbSBvciAraGhtbSkuICBJZiB0bV9pc2RzdCBpcyBuZWdhdGl2ZSwgdGhlIG9mZnNldCBpcyB1bmtub3duIGFuZCBubwogICAgICAgICBvdXRwdXQgaXMgZ2VuZXJhdGVkOyBpZiBpdCBpcyB6ZXJvLCB0aGUgb2Zmc2V0IGlzIHRoZSBzdGFuZGFyZCBvZmZzZXQgZm9yCiAgICAgICAgIHRoZSBjdXJyZW50IHRpbWUgem9uZTsgYW5kIGlmIGl0IGlzIHBvc2l0aXZlLCB0aGUgb2Zmc2V0IGlzIHRoZSBkYXlsaWdodAogICAgICAgICBzYXZpbmdzIG9mZnNldCBmb3IgdGhlIGN1cnJlbnQgdGltZXpvbmUuIFRoZSBvZmZzZXQgaXMgZGV0ZXJtaW5lZCBmcm9tCiAgICAgICAgIHRoZSBUWiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgYXMgaWYgYnkgY2FsbGluZyB0enNldCgpLiBbdG1faXNkc3RdCiAgICAgICAgIDxicj48YnI+IDxEVD48Q09ERT4lWjwvQ09ERT4KPEREPgogICAgICAgICBUaGUgdGltZSB6b25lIG5hbWUuICBJZiB0bV9pc2RzdCBpcyBuZWdhdGl2ZSwgbm8gb3V0cHV0IGlzIGdlbmVyYXRlZC4KICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgdGltZSB6b25lIG5hbWUgaXMgYmFzZWQgb24gdGhlIFRaIGVudmlyb25tZW50IHZhcmlhYmxlLAogICAgICAgICBhcyBpZiBieSBjYWxsaW5nIHR6c2V0KCkuIFt0bV9pc2RzdF0KICAgICAgICAgPGJyPjxicj4gPERUPjxDT0RFPiUlPC9DT0RFPgo8REQ+CiAgICAgICAgIEEgc2luZ2xlIGNoYXJhY3RlciwgYDxDT0RFPiU8L0NPREU+Jy4KICAgICAgICAgPC9ETD4KICAgICAgICAgPGJyPjxicj4gPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIFdoZW4gdGhlIGZvcm1hdHRlZCB0aW1lIHRha2VzIHVwIG5vIG1vcmUgdGhhbiA8VkFSPm1heHNpemU8L1ZBUj4gY2hhcmFjdGVycywKICAgICAgICAgdGhlIHJlc3VsdCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBmb3JtYXR0ZWQgc3RyaW5nLiAgT3RoZXJ3aXNlLCBpZiB0aGUKICAgICAgICAgZm9ybWF0dGluZyBvcGVyYXRpb24gd2FzIGFiYW5kb25lZCBkdWUgdG8gbGFjayBvZiByb29tLCB0aGUgcmVzdWx0IGlzCiAgICAgICAgIDxDT0RFPjA8L0NPREU+LCBhbmQgdGhlIHN0cmluZyBzdGFydGluZyBhdCA8VkFSPnM8L1ZBUj4gY29ycmVzcG9uZHMgdG8ganVzdCB0aG9zZQogICAgICAgICBwYXJ0cyBvZiA8Q09ERT4qPFZBUj5mb3JtYXQ8L1ZBUj48L0NPREU+IHRoYXQgY291bGQgYmUgY29tcGxldGVseSBmaWxsZWQgaW4gd2l0aGluIHRoZQogICAgICAgICA8VkFSPm1heHNpemU8L1ZBUj4gbGltaXQuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgQU5TSSBDIHJlcXVpcmVzIDxDT0RFPnN0cmZ0aW1lPC9DT0RFPiwgYnV0IGRvZXMgbm90IHNwZWNpZnkgdGhlIGNvbnRlbnRzIG9mCiAgICAgICAgIDxDT0RFPio8VkFSPnM8L1ZBUj48L0NPREU+IHdoZW4gdGhlIGZvcm1hdHRlZCBzdHJpbmcgd291bGQgcmVxdWlyZSBtb3JlIHRoYW4KICAgICAgICAgPFZBUj5tYXhzaXplPC9WQVI+IGNoYXJhY3RlcnMuICBVbnJlY29nbml6ZWQgc3BlY2lmaWVycyBhbmQgZmllbGRzIG9mCiAgICAgICAgIDxDT0RFPnRpbXA8L0NPREU+IHRoYXQgYXJlIG91dCBvZiByYW5nZSBjYXVzZSB1bmRlZmluZWQgcmVzdWx0cy4gIFNpbmNlIHNvbWUKICAgICAgICAgZm9ybWF0cyBleHBhbmQgdG8gMCBieXRlcywgaXQgaXMgd2lzZSB0byBzZXQgPENPREU+KjxWQVI+czwvVkFSPjwvQ09ERT4gdG8gYSBub256ZXJvCiAgICAgICAgIHZhbHVlIGJlZm9yZWhhbmQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBmYWlsdXJlIGFuZCBhbiBlbXB0eSBzdHJpbmcuCiAgICAgICAgIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCA8Q09ERT5zPC9DT0RFPiBiZWluZyBOVUxMLCBub3Igb3ZlcmxhcHBpbmcKICAgICAgICAgPENPREU+czwvQ09ERT4gYW5kIDxDT0RFPmZvcm1hdDwvQ09ERT4uCiAgICAgICAgIDxicj48YnI+IDxDT0RFPnN0cmZ0aW1lPC9DT0RFPiByZXF1aXJlcyBubyBzdXBwb3J0aW5nIE9TIHN1YnJvdXRp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ICAgICBzcQB+AA8AAAABdwQAAAAKdAAIc3RyaW5nLmh4cQB+CqF0ABljb25zdCBjaGFyICpzdHJpbmcsIGludCBjdAAGY2hhciAqdAAGc3Ryc2Vwc3EAfgAKcHQJcAogICAgICAgIFRoZSA8Q09ERT5zdHJ0b2s8L0NPREU+IGZ1bmN0aW9uIGlzIHVzZWQgdG8gaXNvbGF0ZSBzZXF1ZW50aWFsIHRva2VucyBpbiBhIAogICAgICAgICBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLCA8Q09ERT4qPFZBUj5zb3VyY2U8L1ZBUj48L0NPREU+LiBUaGVzZSB0b2tlbnMgYXJlIGRlbGltaXRlZCAKICAgICAgICAgaW4gdGhlIHN0cmluZyBieSBhdCBsZWFzdCBvbmUgb2YgdGhlIGNoYXJhY3RlcnMgaW4gPENPREU+KjxWQVI+ZGVsaW1pdGVyczwvVkFSPjwvQ09ERT4uCiAgICAgICAgIFRoZSBmaXJzdCB0aW1lIHRoYXQgPENPREU+c3RydG9rPC9DT0RFPiBpcyBjYWxsZWQsIDxDT0RFPio8VkFSPnNvdXJjZTwvVkFSPjwvQ09ERT4gc2hvdWxkIGJlCiAgICAgICAgIHNwZWNpZmllZDsgc3Vic2VxdWVudCBjYWxscywgd2lzaGluZyB0byBvYnRhaW4gZnVydGhlciB0b2tlbnMgZnJvbQogICAgICAgICB0aGUgc2FtZSBzdHJpbmcsIHNob3VsZCBwYXNzIGEgbnVsbCBwb2ludGVyIGluc3RlYWQuICBUaGUgc2VwYXJhdG9yCiAgICAgICAgIHN0cmluZywgPENPREU+KjxWQVI+ZGVsaW1pdGVyczwvVkFSPjwvQ09ERT4sIG11c3QgYmUgc3VwcGxpZWQgZWFjaCB0aW1lIGFuZCBtYXkgCiAgICAgICAgIGNoYW5nZSBiZXR3ZWVuIGNhbGxzLgogICAgICAgICA8YnI+PGJyPiBUaGUgPENPREU+c3RydG9rPC9DT0RFPiBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggCiAgICAgICAgIHN1YnNlcXVlbnQgdG9rZW4gaW4gdGhlIHN0cmluZywgYWZ0ZXIgcmVwbGFjaW5nIHRoZSBzZXBhcmF0b3IgCiAgICAgICAgIGNoYXJhY3RlciBpdHNlbGYgd2l0aCBhIG51bGwgY2hhcmFjdGVyLiAgV2hlbiBubyBtb3JlIHRva2VucyByZW1haW4sIAogICAgICAgICBhIG51bGwgcG9pbnRlciBpcyByZXR1cm5lZC4KICAgICAgICAgPGJyPjxicj4gVGhlIDxDT0RFPnN0cnRva19yPC9DT0RFPiBmdW5jdGlvbiBoYXMgdGhlIHNhbWUgYmVoYXZpb3IgYXMgPENPREU+c3RydG9rPC9DT0RFPiwgZXhjZXB0CiAgICAgICAgIGEgcG9pbnRlciB0byBwbGFjZWhvbGRlciA8Q09ERT4qPFZBUj5sYXN0czwvVkFSPjwvQ09ERT4gbXVzdCBiZSBzdXBwbGllZCBieSB0aGUgY2FsbGVyLgogICAgICAgICA8YnI+PGJyPiBUaGUgPENPREU+c3Ryc2VwPC9DT0RFPiBmdW5jdGlvbiBpcyBzaW1pbGFyIGluIGJlaGF2aW9yIHRvIDxDT0RFPnN0cnRvazwvQ09ERT4sIGV4Y2VwdAogICAgICAgICBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyBwb2ludGVyIG11c3QgYmUgc3VwcGxpZWQgPENPREU+PFZBUj5zb3VyY2VfcHRyPC9WQVI+PC9DT0RFPiBhbmQKICAgICAgICAgdGhlIGZ1bmN0aW9uIGRvZXMgbm90IHNraXAgbGVhZGluZyBkZWxpbWl0ZXJzLiAgV2hlbiB0aGUgc3RyaW5nIHN0YXJ0cwogICAgICAgICB3aXRoIGEgZGVsaW1pdGVyLCB0aGUgZGVsaW1pdGVyIGlzIGNoYW5nZWQgdG8gdGhlIG51bGwgY2hhcmFjdGVyIGFuZAogICAgICAgICB0aGUgZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLiAgTGlrZSA8Q09ERT5zdHJ0b2tfcjwvQ09ERT4gYW5kIDxDT0RFPnN0cnRvazwvQ09ERT4sIHRoZQogICAgICAgICA8Q09ERT4qPFZBUj5zb3VyY2VfcHRyPC9WQVI+PC9DT0RFPiBpcyB1cGRhdGVkIHRvIHRoZSBuZXh0IGNoYXJhY3RlciBmb2xsb3dpbmcgdGhlCiAgICAgICAgIGxhc3QgZGVsaW1p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aW9uIHRyYW5zZm9ybXMgdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IDxWQVI+czI8L1ZBUj4gYW5kCiAgICAgICAgIHBsYWNlcyB0aGUgcmVzdWx0aW5nIHN0cmluZyBpbnRvIHRoZSBhcnJheSBwb2ludGVkIHRvIGJ5CiAgICAgICAgIDxWQVI+czE8L1ZBUj4uIFRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBzdWNoIHRoYXQgaWYgdGhlIDxDT0RFPnN0cmNtcDwvQ09ERT4KICAgICAgICAgZnVuY3Rpb24gaXMgYXBwbGllZCB0byB0aGUgdHdvIHRyYW5zZm9ybWVkIHN0cmluZ3MsIGl0IHJldHVybnMKICAgICAgICAgYSB2YWx1ZSBncmVhdGVyIHRoYW4sIGVxdWFsIHRvLCBvciBsZXNzIHRoYW4gemVybywKICAgICAgICAgY29ycmVzcG9pbmRpbmcgdG8gdGhlIHJlc3VsdCBvZiBhIDxDT0RFPnN0cmNvbGw8L0NPREU+IGZ1bmN0aW9uIGFwcGxpZWQKICAgICAgICAgdG8gdGhlIHNhbWUgdHdvIG9yaWdpbmFsIHN0cmluZ3MuCiAgICAgICAgIDxicj48YnI+IE5vIG1vcmUgdGhhbiA8VkFSPm48L1ZBUj4gY2hhcmFjdGVycyBhcmUgcGxhY2VkIGludG8gdGhlIHJlc3VsdGluZwogICAgICAgICBhcnJheSBwb2ludGVkIHRvIGJ5IDxWQVI+czE8L1ZBUj4sIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgbnVsbAogICAgICAgICBjaGFyYWN0ZXIuIElmIDxWQVI+bjwvVkFSPiBpcyB6ZXJvLCA8VkFSPnMxPC9WQVI+IG1heSBiZSBhIG51bGwgcG9pbnRlci4gSWYKICAgICAgICAgY29weWluZyB0YWtlcyBwbGFjZSBiZXR3ZWVuIG9iamVjdHMgdGhhdCBvdmVybGFwLCB0aGUgYmVoYXZpb3IKICAgICAgICAgaXMgdW5kZWZpbmVkLgogICAgICAgICA8YnI+PGJyPiBXaXRoIGEgQyBsb2NhbGUsIHRoaXMgZnVuY3Rpb24ganVzdCBjb3BpZXMuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlJl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IFdoZW4gX01CX0NBUEFCTEUgaXMgZGVmaW5lZCwgdGhpcyByb3V0aW5lIGNhbGxzIDxDT0RFPl93Y3N0b21ic19yPC9DT0RFPiB0byBwZXJmb3JtCiAgICAgICAgIHRoZSBjb252ZXJzaW9uLCBwYXNzaW5nIGEgc3RhdGUgdmFyaWFibGUgdG8gYWxsb3cgc3RhdGUgZGVwZW5kZW50CiAgICAgICAgIGRlY29kaW5nLiAgVGhlIHJlc3VsdCBpcyBiYXNlZCBvbiB0aGUgbG9jYWxlIHNldHRpbmcgd2hpY2ggbWF5CiAgICAgICAgIGJlIHJlc3RyaWN0ZWQgdG8gYSBkZWZpbmVkIHNldCBvZiBsb2NhbGVzLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiA8Q09ERT53Y3N0b21iczwvQ09ERT4gcmV0dXJucyA8Q09ERT4wPC9DT0RFPiBpZgogICAgICAgICA8VkFSPnM8L1ZBUj4gaXMgPENPREU+TlVMTDwvQ09ERT4gb3IgaXMgdGhlIGVtcHR5IHN0cmluZzsgCiAgICAgICAgIGl0IHJldHVybnMgPENPREU+LTE8L0NPREU+IGlmIF9NQl9DQVBBQkxFIGFuZCBvbmUgb2YgdGhlCiAgICAgICAgIHdpZGUtY2hhciBjaGFyYWN0ZXJzIGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbGlkIG11bHRpLWJ5dGUgY2hhcmFjdGVyOwogICAgICAgICBvdGhlcndpc2UgaXQgcmV0dXJucyB0aGUgbWluaW11bSBvZjogPENPREU+bjwvQ09ERT4gb3IgdGhlCiAgICAgICAgIG51bWJlciBvZiBieXRlcyB0aGF0IGFyZSB0cmFuc2ZlcnJlZCB0byA8Q09ERT5zPC9DT0RFPiwgbm90IGluY2x1ZGluZyB0aGUKICAgICAgICAgbnVsIHRlcm1pbmF0b3IuCiAgICAgICAgIDxicj48YnI+IElmIHRoZSByZXR1cm4gdmFsdWUgaXMgLTEsIHRoZSBzdGF0ZSBvZiB0aGUgPENPREU+cHdjPC9DT0RFPiBzdHJpbmcgaXMKICAgICAgICAgaW5kZXRlcm1pbmF0ZS4gIElmIHRoZSBpbnB1dCBoYXMgYSBsZW5ndGggb2YgMCwgdGhlIG91dHB1dAogICAgICAgICBzdHJpbmcgd2lsbCBiZSBtb2RpZmllZCB0byBjb250YWluIGEgd2NoYXJfdCBudWwgdGVybWluYXRvciBpZgogICAgICAgICA8Q09ERT5uPC9DT0RFPiA+IDAuCiAgICAgICAgIDxicj48YnI+ICoKICAgICAgICAgPGgzPlBvcnRhYmlsaXR5PC9oMz4KICAgICAgICAgPENPREU+d2NzdG9tYnM8L0NPREU+IGlzIHJlcXVpcmVkIGluIHRoZSBBTlNJIEMgc3RhbmRhcmQuICBIb3dldmVyLCB0aGUgcHJlY2lzZQogICAgICAgICBlZmZlY3RzIHZhcnkgd2l0aCB0aGUgbG9jYWxlLgogICAgICAgICA8YnI+PGJyPiA8Q09ERT53Y3N0b21iczwvQ09ERT4gcmVxdWlyZXMgbm8gc3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcy4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAhzdGRsaWIuaHhxAH4MRXQAJWNvbnN0IGNoYXIgKnMsIHdjaGFyX3QgKnB3Yywgc2l6ZV90IG50AARpbnQgdAAHd2NzdG91bHNxAH4ACnBxAH4DOXNxAH4ADwAAAAF3BAAAAAp0AAd3Y2hhci5oeHEAfgxMdAAoY29uc3Qgd2NoYXJfdCAqcywgd2NoYXJfdCAqKnB0cixpbnQgYmFzZXQADnVuc2lnbmVkIGxvbmcgdAAId2NzdG91bGxzcQB+AApwcQB+A0BzcQB+AA8AAAABdwQAAAAKdAAHd2NoYXIuaHhxAH4MUnQAKGNvbnN0IHdjaGFyX3QgKnMsIHdjaGFyX3QgKipwdHIsaW50IGJhc2V0ABN1bnNpZ25lZCBsb25nIGxvbmcgdAAId2Nzd2lkdGhzcQB+AApwdAR7CiAgICAgICAgVGhlIDxDT0RFPndjc3dpZHRoPC9DT0RFPiBmdW5jdGlvbiBzaGFsbCBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBjb2x1bW4KICAgICAgICAgcG9zaXRpb25zIHJlcXVpcmVkIGZvciA8VkFSPm48L1ZBUj4gd2lkZS1jaGFyYWN0ZXIgY29kZXMgKG9yIGZld2VyIHRoYW4gPFZBUj5uPC9WQVI+CiAgICAgICAgIHdpZGUtY2hhcmFjdGVyIGNvZGVzIGlmIGEgbnVsbCB3aWRlLWNoYXJhY3RlciBjb2RlIGlzIGVuY291bnRlcmVkCiAgICAgICAgIGJlZm9yZSA8VkFSPm48L1ZBUj4gd2lkZS1jaGFyYWN0ZXIgY29kZXMgYXJlIGV4aGF1c3RlZCkgaW4gdGhlIHN0cmluZyBwb2ludGVkCiAgICAgICAgIHRvIGJ5IDxWQVI+cHdjczwvVkFSPi4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgICA8aDM+UmV0dXJuczwvaDM+CiAgICAgICAgIFRoZSA8Q09ERT53Y3N3aWR0aDwvQ09ERT4gZnVuY3Rpb24gZWl0aGVyIHNoYWxsIHJldHVybiAwIChpZiA8VkFSPnB3Y3M8L1ZBUj4gcG9pbnRzIHRvIGEKICAgICAgICAgbnVsbCB3aWRlLWNoYXJhY3RlciBjb2RlKSwgb3IgcmV0dXJuIHRoZSBudW1iZXIgb2YgY29sdW1uIHBvc2l0aW9ucwogICAgICAgICB0byBiZSBvY2N1cGllZCBieSB0aGUgd2lkZS1jaGFyYWN0ZXIgc3RyaW5nIHBvaW50ZWQgdG8gYnkgPFZBUj5wd2NzPC9WQVI+LCBvcgogICAgICAgICByZXR1cm4gLTEgKGlmIGFueSBvZiB0aGUgZmlyc3QgPFZBUj5uPC9WQVI+IHdpZGUtY2hhcmFjdGVyIGNvZGVzIGluIHRoZQogICAgICAgICB3aWRlLWNoYXJhY3RlciBzdHJpbmcgcG9pbnRlZCB0byBieSA8VkFSPnB3Y3M8L1ZBUj4gaXMgbm90IGEgcHJpbnRhYmxlCiAgICAgICAgIHdpZGUtY2hhcmFjdGVyIGNvZGUpLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIDxDT0RFPndjc3dpZHRoPC9DT0RFPiBoYXMgYmVlbiBpbnRyb2R1Y2VkIGluIHRoZSBTaW5nbGUgVU5JWCBTcGVjaWZpY2F0aW9uIFZvbHVtZSAyLgogICAgICAgICA8Q09ERT53Y3N3aWR0aDwvQ09ERT4gaGFzIGJlZW4gbWFya2VkIGFzIGFuIGV4dGVuc2lvbiBpbiB0aGUgU2luZ2xlIFVOSVggU3BlY2lmaWNhdGlvbiBWb2x1bWUgMy4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAd3Y2hhci5oeHEAfgxYdAAdY29uc3Qgd2NoYXJfdCAqcHdjcywgc2l6ZV90IG50AARpbnQgdAAHd2NzeGZybXNxAH4ACnB0BFIKICAgICAgICA8Q09ERT53Y3N4ZnJtPC9DT0RFPiB0cmFuc2Zvcm1zIHRoZSB3aWRlLWNoYXJhY3RlciBzdHJpbmcgcG9pbnRlZCB0byBieQogICAgICAgICA8VkFSPnN0cmI8L1ZBUj4gdG8gdGhlIHdpZGUtY2hhcmFjdGVyIHN0cmluZyBwb2ludGVkIHRvIGJ5IDxWQVI+c3RyYTwvVkFSPiwKICAgICAgICAgQ29tcGFyaW5nIHR3byB0cmFuc2Zvcm1lZCB3aWRlIHN0cmluZ3Mgd2l0aCA8Q09ERT53Y3NjbXA8L0NPREU+IHNob3VsZCByZXR1cm4KICAgICAgICAgdGhlIHNhbWUgcmVzdWx0IGFzIGNvbXBhcmluZyB0aGUgb3JpZ2luYWwgc3RyaW5ncyB3aXRoIDxDT0RFPndjc2NvbGw8L0NPREU+LgogICAgICAgICBObyBtb3JlIHRoYW4gPFZBUj5uPC9WQVI+IHdpZGUgY2hhcmFjdGVycyBhcmUgdHJhbnNmb3JtZWQsIGluY2x1ZGluZyB0aGUKICAgICAgICAgdHJhaWxpbmcgbnVsbCBjaGFyYWN0ZXIuCiAgICAgICAgIDxicj48YnI+IElmIDxWQVI+bjwvVkFSPiBpcyAwLCA8VkFSPnN0cmE8L1ZBUj4gbWF5IGJlIGEgTlVMTCBwb2ludGVyLgogICAgICAgICA8YnI+PGJyPiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiA8Q09ERT53Y3N4ZnJtPC9DT0RFPiBzaW1wbHkgdXNlcyA8Q09ERT53Y3NsY3B5PC9DT0RFPgogICAgICAgICBhbmQgZG9lcyBub3Qgc3VwcG9ydCBhbnkgbGFuZ3VhZ2Utc3BlY2lmaWMgdHJhbnNmb3JtYXRpb25zLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgPENPREU+d2NzeGZybTwvQ09ERT4gcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSB0cmFuc2Zvcm1lZCB3aWRlIGNoYXJhY3RlcgogICAgICAgICBzdHJpbmcuICBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gPFZBUj5uPC9WQVI+LCB0aGUKICAgICAgICAgY29udGVudCBvZiA8VkFSPnN0cmE8L1ZBUj4gaXMgdW5kZWZpbmVkLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+CiAgICAgICAgIDxDT0RFPndjc3hmcm08L0NPREU+IGlzIElTTy9JRUMgOTg5OS9BTUQxOjE5OTUgKElTTyBDKS4KICAgICAgICAgPGJyPjxicj4gKgogICAgICAgIHNxAH4ADwAAAAF3BAAAAAp0AAd3Y2hhci5oeHEAfgxfdAAtd2NoYXJfdCAqc3RyYSwgY29uc3Qgd2NoYXJfdCAqIHN0cmIsIHNpemVfdCBudAAEaW50IHQABndjdG9tYnNxAH4ACnB0BeEKICAgICAgICBXaGVuIF9NQl9DQVBBQkxFIGlzIG5vdCBkZWZpbmVkLCB0aGlzIGlzIGEgbWluaW1hbCBBTlNJLWNvbmZvcm1pbmcgCiAgICAgICAgIGltcGxlbWVudGF0aW9uIG9mIDxDT0RFPndjdG9tYjwvQ09ERT4uICBUaGUKICAgICAgICAgb25seSBgYHdpZGUgY2hhcmFjdGVycycnIHJlY29nbml6ZWQgYXJlIHNpbmdsZSBieXRlcywKICAgICAgICAgYW5kIHRoZXkgYXJlIGBgY29udmVydGVkJycgdG8gdGhlbXNlbHZlcy4gIAogICAgICAgICA8YnI+PGJyPiBXaGVuIF9NQl9DQVBBQkxFIGlzIGRlZmluZWQsIHRoaXMgcm91dGluZSBjYWxscyA8Q09ERT5fd2N0b21iX3I8L0NPREU+IHRvIHBlcmZvcm0KICAgICAgICAgdGhlIGNvbnZlcnNpb24sIHBhc3NpbmcgYSBzdGF0ZSB2YXJpYWJsZSB0byBhbGxvdyBzdGF0ZSBkZXBlbmRlbnQKICAgICAgICAgZGVjb2RpbmcuICBUaGUgcmVzdWx0IGlzIGJhc2VkIG9uIHRoZSBsb2NhbGUgc2V0dGluZyB3aGljaCBtYXkKICAgICAgICAgYmUgcmVzdHJpY3RlZCB0byBhIGRlZmluZWQgc2V0IG9mIGxvY2FsZXMuCiAgICAgICAgIDxicj48YnI+IEVhY2ggY2FsbCB0byA8Q09ERT53Y3RvbWI8L0NPREU+IG1vZGlmaWVzIDxDT0RFPio8VkFSPnM8L1ZBUj48L0NPREU+IHVubGVzcyA8VkFSPnM8L1ZBUj4gaXMgYSBudWxsCiAgICAgICAgIHBvaW50ZXIgb3IgX01CX0NBUEFCTEUgaXMgZGVmaW5lZCBhbmQgPFZBUj53Y2hhcjwvVkFSPiBpcyBpbnZhbGlkLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5SZXR1cm5zPC9oMz4KICAgICAgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiA8Q09ERT53Y3RvbWI8L0NPREU+IHJldHVybnMgPENPREU+MDwvQ09ERT4gaWYKICAgICAgICAgPFZBUj5zPC9WQVI+IGlzIDxDT0RFPk5VTEw8L0NPREU+OyBpdCByZXR1cm5zIDxDT0RFPi0xPC9DT0RFPiBpZiBfTUJfQ0FQQUJMRSBpcyBlbmFibGVkCiAgICAgICAgIGFuZCB0aGUgd2NoYXIgaXMgbm90IGEgdmFsaWQgbXVsdGktYnl0ZSBjaGFyYWN0ZXIsIGl0IHJldHVybnMgPENPREU+MTwvQ09ERT4KICAgICAgICAgaWYgX01CX0NBUEFCTEUgaXMgbm90IGRlZmluZWQgb3IgdGhlIHdjaGFyIGlzIGluIHJlYWxpdHkgYSBzaW5nbGUKICAgICAgICAgYnl0ZSBjaGFyYWN0ZXIsIG90aGVyd2lzZSBpdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCiAgICAgICAgIG11bHRpLWJ5dGUgY2hhcmFjdGVyLgogICAgICAgICA8YnI+PGJyPiAqCiAgICAgICAgIDxoMz5Qb3J0YWJpbGl0eTwvaDM+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