PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj48aHRtbD48aGVhZD48IS0tIHNhdmVkIGZyb20gdXJsPSgwMDIyKWh0dHA6Ly9pbnRlcm5ldC5lLW1haWwgLS0+PHRpdGxlPkltcHJvdmVkIEl0ZXJhdG9yIENhdGVnb3JpZXMgYW5kIFJlcXVpcmVtZW50czwvdGl0bGU+CjxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSI+CjxtZXRhIGNvbnRlbnQ9Ik1pY3Jvc29mdCBGcm9udFBhZ2UgNS4wIiBuYW1lPSJHRU5FUkFUT1IiPjwvaGVhZD4KPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+CjxwIGFsaWduPSJyaWdodCI+Cjx0YWJsZSBib3JkZXI9IjAiPgogIDx0Ym9keT4KICA8dHI+CiAgICA8dGQgd2lkdGg9IjEyNSI+CiAgICAgIDxwIGFsaWduPSJyaWdodCI+RG9jdW1lbnQgbnVtYmVyOiA8L3A+PC90ZD4KICAgIDx0ZCB3aWR0aD0iMTkwIj4KICAgICAgPHA+SjE2LzAxLTAwMTEgPSBXRzIxIE4xMjk3IDwvcD48L3RkPjwvdHI+CiAgPHRyPgogICAgPHRkIHdpZHRoPSIxMjUiPgogICAgICA8cCBhbGlnbj0icmlnaHQiPkRhdGU6IDwvcD48L3RkPgogICAgPHRkIHdpZHRoPSIxOTAiPgogICAgICA8cD5NYXJjaCAyMSwgMjAwMSA8L3A+PC90ZD48L3RyPgogIDx0cj4KICAgIDx0ZCB3aWR0aD0iMTI1Ij4KICAgICAgPHAgYWxpZ249InJpZ2h0Ij5BdXRob3I6IDwvcD48L3RkPgogICAgPHRkIHdpZHRoPSIxOTAiPgogICAgICA8cD5KZXJlbXkgU2llaywgPGJyPlVuaXZlcnNpdHkgb2YgTm90cmUgRGFtZSA8L3A+PC90ZD48L3RyPgogIDx0cj4KICAgIDx0ZCB3aWR0aD0iMTI1Ij4KICAgICAgPHA+PC9wPjwvdGQ+CiAgICA8dGQgd2lkdGg9IjE5MCI+CiAgICAgIDxwPjxhIGhyZWY9Im1haWx0bzpqc2lla0Bsc2MubmQuZWR1Ij5qc2lla0Bsc2MubmQuZWR1PC9hPiAKICA8L3A+PC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L3A+CjxoMT4KPGNlbnRlcj5JbXByb3ZlZCBJdGVyYXRvciBDYXRlZ29yaWVzIGFuZCBSZXF1aXJlbWVudHM8L2NlbnRlcj48L2gxPgo8aDI+SW50cm9kdWN0aW9uPC9oMj5UaGUgc3RhbmRhcmQgaXRlcmF0b3IgY2F0ZWdvcmllcyBhbmQgcmVxdWlyZW1lbnRzIGFyZSAKZmxhd2VkIGJlY2F1c2UgdGhleSB1c2UgYSBzaW5nbGUgaGllcmFyY2h5IG9mIHJlcXVpcmVtZW50cyB0byBhZGRyZXNzIHR3byAKb3J0aG9nb25hbCBpc3N1ZXM6IDxiPjxpPml0ZXJhdG9yIHRyYXZlcnNhbDwvaT48L2I+IGFuZCA8Yj48aT5kZXJlZmVyZW5jZSByZXR1cm4gCnR5cGU8L2k+PC9iPi4gVGhlIGN1cnJlbnQgaXRlcmF0b3IgcmVxdWlyZW1lbnQgaGllcmFyY2h5IGlzIG1haW5seSBnZWFyZWQgCnRvd2FyZHMgaXRlcmF0b3IgdHJhdmVyc2FsIChoZW5jZSB0aGUgY2F0ZWdvcnkgbmFtZXMpLCB3aGlsZSByZXF1aXJlbWVudHMgdGhhdCAKYWRkcmVzcyBkZXJlZmVyZW5jZSByZXR1cm4gdHlwZSBzbmVhayBpbiBhdCB2YXJpb3VzIHBsYWNlcy4gVGhlIGZvbGxvd2luZyB0YWJsZSAKZ2l2ZXMgYSBzdW1tYXJ5IG9mIHRoZSBjdXJyZW50IGRlcmVmZXJlbmNlIHJldHVybiB0eXBlIHJlcXVpcmVtZW50cyBpbiB0aGUgCml0ZXJhdG9yIGNhdGVnb3JpZXMuIAo8cD4KPC9wPjxjZW50ZXI+CjxhIG5hbWU9InRhYmxlOjEiPgogIDxiPlRhYmxlIDEuPC9iPiBTdW1tYXJ5IG9mIGN1cnJlbnQgZGVyZWZlcmVuY2UgcmV0dXJuIHR5cGUgCiAgcmVxdWlyZW1lbnRzLjwvYT48dGFibGUgYm9yZGVyPSIxIj4KICA8dGJvZHk+CiAgPHRyPgogICAgPHRkPk91dHB1dCBJdGVyYXRvcjwvdGQ+CiAgICA8dGQ+PHR0PippID0gYTwvdHQ+IDwvdGQ+PC90cj4KICA8dHI+CiAgICA8dGQ+SW5wdXQgSXRlcmF0b3I8L3RkPgogICAgPHRkPjx0dD4qaTwvdHQ+IGlzIGNvbnZlcnRpYmxlIHRvIDx0dD5UPC90dD48L3RkPjwvdHI+CiAgPHRyPgogICAgPHRkPkZvcndhcmQgSXRlcmF0b3I8L3RkPgogICAgPHRkPjx0dD4qaTwvdHQ+IGlzIDx0dD5UJmFtcDs8L3R0PiAob3IgPHR0PmNvbnN0IFQmYW1wOzwvdHQ+IG9uY2UgPGEgaHJlZj0iaHR0cDovL2FudWJpcy5ka3V1Zy5kay9KVEMxL1NDMjIvV0cyMS9kb2NzL2x3Zy1hY3RpdmUuaHRtbCMyMDAiPmlzc3VlIAogICAgICAyMDA8L2E+IGlzIHJlc29sdmVkKTwvdGQ+PC90cj4KICA8dHI+CiAgICA8dGQ+UmFuZG9tIEFjY2VzcyBJdGVyYXRvcjwvdGQ+CiAgICA8dGQ+PHR0Pmlbbl08L3R0PiBpcyBjb252ZXJ0aWJsZSB0byA8dHQ+VDwvdHQ+ICh3aGljaCBpcyBvZGQgYmVjYXVzZSB0aGUgCiAgICAgIG9wZXJhdGlvbmFsIHNlbWFudGljcyBzYXkgPHR0Pmlbbl08L3R0PiBpcyBlcXVpdmFsZW50IHRvIDx0dD4qKGkgKyBuKTwvdHQ+IAogICAgICB3aGljaCB3b3VsZCBoYXZlIGEgcmV0dXJuIHR5cGUgb2YgPHR0PlQmYW1wOzwvdHQ+KSA8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjwvY2VudGVyPgo8aDI+RXhhbXBsZXMgb2YgdXNlZnVsIGl0ZXJhdG9ycyB0aGF0IGRvIG5vdCBgYGZpdCcnPC9oMj4KPHA+QmVjYXVzZSBvZiB0aGUgbWl4aW5nIG9mIGl0ZXJhdG9yIHRyYXZlcnNhbCBhbmQgZGVyZWZlcmVuY2UgcmV0dXJuIHR5cGUsIG1hbnkgCnVzZWZ1bCBpdGVyYXRvcnMgY2FuIG5vdCBiZSBhcHByb3ByaWF0ZWx5IGNhdGVnb3JpemVkLiBGb3IgZXhhbXBsZSwgCjx0dD52ZWN0b3ImbHQ7Ym9vbCZndDs6Oml0ZXJhdG9yPC90dD4gaXMgYWxtb3N0IGEgcmFuZG9tIGFjY2VzcyBpdGVyYXRvciwgYnV0IAp0aGUgcmV0dXJuIHR5cGUgaXMgbm90IDx0dD5ib29sJmFtcDs8L3R0PiAoc2VlIDxhIGhyZWY9Imh0dHA6Ly9hbnViaXMuZGt1dWcuZGsvSlRDMS9TQzIyL1dHMjEvZG9jcy9sd2ctYWN0aXZlLmh0bWwjOTYiPmlzc3VlIAo5NjwvYT4gYW5kIEhlcmIgU3V0dGVyJ3MgcGFwZXIgSjE2Lzk5LTAwMDggPSBXRzIxIE4xMTg1KS4gVGhlcmVmb3JlLCB0aGUgCml0ZXJhdG9ycyBvbmx5IG1lZXQgdGhlIHJlcXVpcmVtZW50cyBvZiBpbnB1dCBpdGVyYXRvciBhbmQgb3V0cHV0IGl0ZXJhdG9yLiBUaGlzIAppcyBzbyBub25pbnR1aXRpdmUgdGhhdCBhdCBsZWFzdCBvbmUgaW1wbGVtZW50YXRpb24gZXJyb25lb3VzbHkgYXNzaWducyAKPHR0PnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnPC90dD4gYXMgaXRzIDx0dD5pdGVyYXRvcl9jYXRlZ29yeTwvdHQ+LiBBbHNvLCAKPHR0PnZlY3RvciZsdDtib29sJmd0OzwvdHQ+IGlzIG5vdCB0aGUgb25seSBleGFtcGxlIG9mIHVzZWZ1bCBpdGVyYXRvcnMgdGhhdCBkbyAKbm90IHJldHVybiB0cnVlIHJlZmVyZW5jZXM6IHRoZXJlIGlzIHRoZSBvZnRlbiBjaXRlZCBleGFtcGxlIG9mIGRpc2stYmFzZWQgCmNvbGxlY3Rpb25zLiAKPC9wPjxwPkFub3RoZXIgZXhhbXBsZSBpcyBhIGNvdW50aW5nIGl0ZXJhdG9yLCBhbiBpdGVyYXRvciB0aGUgcmV0dXJucyBhIHNlcXVlbmNlIG9mIAppbnRlZ2VycyB3aGVuIGluY3JlbWVudGVkIGFuZCBkZXJlZmVyZW5jZWQgKHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LmJvb3N0Lm9yZy9saWJzL2l0ZXJhdG9yL2RvYy9jb3VudGluZ19pdGVyYXRvci5odG1sIj48dHQ+Ym9vc3Q6OmNvdW50aW5nX2l0ZXJhdG9yPC90dD48L2E+KS4gClRoZXJlIGFyZSB0d28gd2F5cyB0byBpbXBsZW1lbnQgdGhpcyBpdGVyYXRvciwgMSkgbWFrZSB0aGUgPHR0PnJlZmVyZW5jZTwvdHQ+IAp0eXBlIGJlIGEgdHJ1ZSByZWZlcmVuY2UgKGEgcmVmZXJlbmNlIHRvIGFuIGludGVnZXIgZGF0YSBtZW1iZXIgb2YgdGhlIGNvdW50aW5nIAppdGVyYXRvcikgb3IgMikgbWFrZSB0aGUgPHR0PnJlZmVyZW5jZTwvdHQ+IHR5cGUgYmUgdGhlIHNhbWUgYXMgdGhlIAo8dHQ+dmFsdWVfdHlwZTwvdHQ+LiBPcHRpb24gMSkgcnVucyBpbnRvIHRoZSBwcm9ibGVtcyBkaXNjdXNzZWQgaW4gPGEgaHJlZj0iaHR0cDovL2FudWJpcy5ka3V1Zy5kay9KVEMxL1NDMjIvV0cyMS9kb2NzL2x3Zy1hY3RpdmUuaHRtbCMxOTgiPklzc3VlIAoxOTg8L2E+LCB0aGUgcmVmZXJlbmNlIHdpbGwgbm90IGJlIHZhbGlkIGFmdGVyIHRoZSBpdGVyYXRvciBpcyBkZXN0cm95ZWQuIE9wdGlvbiAKMikgaXMgdGhlcmVmb3JlIGEgYmV0dGVyIGNob2ljZSwgYnV0IHRoZW4gd2UgaGF2ZSBhIGNvdW50aW5nIGl0ZXJhdG9yIHRoYXQgCmNhbm5vdCBiZSBhIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3IuIAo8L3A+PHA+WWV0IGFub3RoZXIgZXhhbXBsZSBpcyBhIHRyYW5zZm9ybSBpdGVyYXRvciwgYW4gaXRlcmF0b3IgYWRhcHRvciB0aGF0IGFwcGxpZXMgCmEgdW5hcnkgZnVuY3Rpb24gb2JqZWN0IHRvIHRoZSBkZXJlZmVyZW5jZSB2YWx1ZSBvZiB0aGUgd3JhcHBlZCBpdGVyYXRvciAoc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cuYm9vc3Qub3JnL2xpYnMvaXRlcmF0b3IvZG9jL3RyYW5zZm9ybV9pdGVyYXRvci5odG1sIj48dHQ+Ym9vc3Q6OnRyYW5zZm9ybV9pdGVyYXRvcjwvdHQ+PC9hPikuIApGb3IgdW5hcnkgZnVuY3Rpb25zIHN1Y2ggYXMgPHR0PnN0ZDo6dGltZXM8L3R0PiB0aGUgcmV0dXJuIHR5cGUgb2YgCjx0dD5vcGVyYXRvcio8L3R0PiBjbGVhcmx5IG5lZWRzIHRvIGJlIHRoZSA8dHQ+cmVzdWx0X3R5cGU8L3R0PiBvZiB0aGUgZnVuY3Rpb24gCm9iamVjdCwgd2hpY2ggaXMgdHlwaWNhbGx5IG5vdCBhIHJlZmVyZW5jZS4gSG93ZXZlciwgd2l0aCB0aGUgY3VycmVudCBpdGVyYXRvciAKcmVxdWlyZW1lbnRzLCBpZiB5b3Ugd3JhcCA8dHQ+aW50KjwvdHQ+IHdpdGggYSB0cmFuc2Zvcm0gaXRlcmF0b3IsIHlvdSBkbyBub3QgCmdldCBhIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3IgYXMgZXhwZWN0ZWQsIGJ1dCBhbiBpbnB1dCBpdGVyYXRvci4gCjwvcD48cD5BIGZvdXJ0aCBleGFtcGxlIGlzIGZvdW5kIGluIHRoZSB2ZXJ0ZXggYW5kIGVkZ2UgaXRlcmF0b3JzIG9mIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmJvb3N0Lm9yZy9saWJzL2dyYXBoL2RvYy90YWJsZV9vZl9jb250ZW50cy5odG1sIj5Cb29zdCBHcmFwaCAKTGlicmFyeTwvYT4uIFRoZXNlIGl0ZXJhdG9ycyByZXR1cm4gdmVydGV4IGFuZCBlZGdlIGRlc2NyaXB0b3JzLCB3aGljaCBhcmUgCmxpZ2h0d2VpZ2h0IGhhbmRsZXMgY3JlYXRlZCBvbi10aGUtZmx5LiBUaGV5IG11c3QgYmUgcmV0dXJuZWQgYnktdmFsdWUuIEFzIGEgCnJlc3VsdCwgdGhlaXIgY3VycmVudCBzdGFuZGFyZCBpdGVyYXRvciBjYXRlZ29yeSBpcyAKPHR0PnN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnPC90dD4sIHdoaWNoIG1lYW5zIHRoYXQsIHN0cmljdGx5IHNwZWFraW5nLCB5b3UgY291bGQgCm5vdCB1c2UgdGhlc2UgaXRlcmF0b3JzIHdpdGggYWxnb3JpdGhtcyBsaWtlIDx0dD5zdGQ6Om1pbl9lbGVtZW50KCk8L3R0Pi4gQXMgYSAKdGVtcG9yYXJ5IHNvbHV0aW9uLCB3ZSBpbnRyb2R1Y2VkIHRoZSBjb25jZXB0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYm9vc3Qub3JnL2xpYnMvdXRpbGl0eS9NdWx0aVBhc3NJbnB1dEl0ZXJhdG9yLmh0bWwiPk11bHRpLVBhc3MgCklucHV0IEl0ZXJhdG9yPC9hPiB0byBkZXNjcmliZSB0aGUgdmVydGV4IGFuZCBlZGdlIGRlc2NyaXB0b3JzLCBidXQgYXMgdGhlIApkZXNpZ24gbm90ZXMgZm9yIGNvbmNlcHQgc3VnZ2VzdCwgYSBiZXR0ZXIgc29sdXRpb24gaXMgbmVlZGVkLiAKPC9wPjxwPkluIHNob3J0LCB0aGVyZSBhcmUgbWFueSB1c2VmdWwgaXRlcmF0b3JzIHRoYXQgZG8gbm90IGZpdCBpbnRvIHRoZSBjdXJyZW50IApzdGFuZGFyZCBpdGVyYXRvciBjYXRlZ29yaWVzLiBBcyBhIHJlc3VsdCwgdGhlIGZvbGxvd2luZyBiYWQgdGhpbmdzIGhhcHBlbjogCjwvcD48dWw+CiAgPGxpPkl0ZXJhdG9ycyBhcmUgb2Z0ZW4gbWlzcy1jYXRlZ29yaXplZC4gCiAgPC9saT48bGk+QWxnb3JpdGhtIHJlcXVpcmVtZW50cyBhcmUgbW9yZSBzdHJpY3QgdGhhbiBuZWNlc3NhcnksIGJlY2F1c2UgdGhleSBjYW4gCiAgbm90IHNlcGFyYXRlIG91dCB0aGUgbmVlZCBmb3IgcmFuZG9tLWFjY2VzcyBmcm9tIHRoZSBuZWVkIGZvciBhIHRydWUgcmVmZXJlbmNlIAogIHJldHVybiB0eXBlLiA8L2xpPjwvdWw+CjxoMj5Qcm9wb3NhbCBmb3IgbmV3IGl0ZXJhdG9yIGNhdGVnb3JpZXMgYW5kIHJlcXVpcmVtZW50czwvaDI+VGhlIGl0ZXJhdG9yIApyZXF1aXJlbWVudHMgc2hvdWxkIGJlIHNlcGFyYXRlZCBpbnRvIHR3byBoaWVyYXJjaGllcy4gT25lIHNldCBvZiBjb25jZXB0cyAKaGFuZGxlcyB0aGUgcmV0dXJuIHR5cGUgc2VtYW50aWNzOiAKPHVsPgogIDxsaT48YSBocmVmPSIjY29uY2VwdF9SZWFkYWJsZUl0ZXJhdG9yIj5SZWFkYWJsZSAKICBJdGVyYXRvcjwvYT4gIAogIDwvbGk+PGxpPjxhIGhyZWY9IiNjb25jZXB0X1dyaXRhYmxlSXRlcmF0b3IiPldyaXRhYmxlIAogIEl0ZXJhdG9yPC9hPiAgCiAgPC9saT48bGk+PGEgaHJlZj0iI2NvbmNlcHRfU3dhcHBhYmxlSXRlcmF0b3IiPlN3YXBwYWJsZSAKICBJdGVyYXRvcjwvYT4gIAogIDwvbGk+PGxpPjxhIGhyZWY9IiNjb25jZXB0X0NvbnN0YW50THZhbHVlSXRlcmF0b3IiPkNvbnN0YW50IAogIEx2YWx1ZSBJdGVyYXRvcjwvYT4gIAogIDwvbGk+PGxpPjxhIGhyZWY9IiNjb25jZXB0X011dGFibGVMdmFsdWVJdGVyYXRvciI+TXV0YWJsZSAKICBMdmFsdWUgSXRlcmF0b3I8L2E+IDwvbGk+PC91bD5UaGUgb3RoZXIgc2V0IG9mIGNvbmNlcHRzIGhhbmRsZXMgaXRlcmF0b3IgCnRyYXZlcnNhbDogCjx1bD4KICA8bGk+PGEgaHJlZj0iI2NvbmNlcHRfRm9yd2FyZFRyYXZlcnNhbEl0ZXJhdG9yIj5Gb3J3YXJkIAogIFRyYXZlcnNhbCBJdGVyYXRvcjwvYT4gIAogIDwvbGk+PGxpPjxhIGhyZWY9IiNjb25jZXB0X0JpZGlyZWN0aW9uYWxUcmF2ZXJzYWxJdGVyYXRvciI+QmlkaXJlY3Rpb25hbCAKICBUcmF2ZXJzYWwgSXRlcmF0b3I8L2E+ICAKICA8L2xpPjxsaT48YSBocmVmPSIjY29uY2VwdF9SYW5kb21BY2Nlc3NUcmF2ZXJzYWxJdGVyYXRvciI+UmFuZG9tIAogIEFjY2VzcyBUcmF2ZXJzYWwgSXRlcmF0b3I8L2E+IDwvbGk+PC91bD5UaGUgY3VycmVudCBJbnB1dCBJdGVyYXRvciBhbmQgT3V0cHV0IApJdGVyYXRvciByZXF1aXJlbWVudHMgd2lsbCBjb250aW51ZSB0byBiZSB1c2VkIGFzIGlzLiBOb3RlIHRoYXQgSW5wdXQgSXRlcmF0b3IgCmltcGxpZXMgUmVhZGFibGUgSXRlcmF0b3IgYW5kIE91dHB1dCBJdGVyYXRvciBpbXBsaWVzIFdyaXRhYmxlIEl0ZXJhdG9yLiAKPHA+Tm90ZTogd2UgY29uc2lkZXJlZCBkZWZpbmluZyBhIFNpbmdsZS1QYXNzIEl0ZXJhdG9yLCB3aGljaCBjb3VsZCBiZSBjb21iaW5lZCAKd2l0aCBSZWFkYWJsZSBvciBXcml0YWJsZSBJdGVyYXRvciB0byByZXBsYWNlIHRoZSBJbnB1dCBhbmQgT3V0cHV0IEl0ZXJhdG9yIApyZXF1aXJlbWVudHMuIFdlIHJlamVjdGVkIHRoaXMgaWRlYSBiZWNhdXNlIHRoZXJlIGFyZSBzZXZlcmFsIGRpZmZlcmVuY2VzIApiZXR3ZWVuIElucHV0IGFuZCBPdXRwdXQgSXRlcmF0b3JzIHRoYXQgbWFrZSBpdCBoYXJkIHRvIG1lcmdlIHRoZW06IElucHV0IApJdGVyYXRvciByZXF1aXJlcyBFcXVhbGl0eSBDb21wYXJhYmxlIHdoaWxlIE91dHB1dCBJdGVyYXRvciBkb2VzIG5vdCBhbmQgSW5wdXQgCkl0ZXJhdG9yIHJlcXVpcmVzIEFzc2lnbmFibGUgd2hpbGUgT3V0cHV0IEl0ZXJhdG9yIGRvZXMgbm90LiAKPC9wPjxoMz5OZXcgY2F0ZWdvcmllcyBhbmQgdHJhaXRzIGNsYXNzZXM8L2gzPkVhY2ggb2YgdGhlIG5ldyBpdGVyYXRvciByZXF1aXJlbWVudHMgCndpbGwgbmVlZCBhIGNhdGVnb3J5IHRhZy4gPHByZT5uYW1lc3BhY2Ugc3RkIHsKCiAgLy8gUmV0dXJuIFR5cGUgQ2F0ZWdvcmllcwogIHN0cnVjdCByZWFkYWJsZV9pdGVyYXRvcl90YWcgeyB9OwogIHN0cnVjdCB3cml0YWJsZV9pdGVyYXRvcl90YWcgeyB9OwogIHN0cnVjdCBzd2FwcGFibGVfaXRlcmF0b3JfdGFnIHsgfTsKICBzdHJ1Y3QgbXV0YWJsZV9sdmFsdWVfaXRlcmF0b3JfdGFnIDogdmlydHVhbCBwdWJsaWMgd3JpdGFibGVfaXRlcmF0b3JfdGFnLAogICAgdmlydHVhbCBwdWJsaWMgcmVhZGFibGVfaXRlcmF0b3JfdGFnIHsgfTsKICBzdHJ1Y3QgY29uc3RhbnRfbHZhbHVlX2l0ZXJhdG9yX3RhZyA6IHB1YmxpYyByZWFkYWJsZV9pdGVyYXRvcl90YWcgeyB9OwoKICAvLyBUcmF2ZXJzYWwgQ2F0ZWdvcmllcwogIHN0cnVjdCBmb3J3YXJkX3RyYXZlcnNhbF90YWcgeyB9OwogIHN0cnVjdCBiaWRpcmVjdGlvbmFsX3RyYXZlcnNhbF90YWcgOiBwdWJsaWMgZm9yd2FyZF90cmF2ZXJzYWxfdGFnIHsgfTsKICBzdHJ1Y3QgcmFuZG9tX2FjY2Vzc190cmF2ZXJzYWxfdGFnIDogcHVibGljIGJpZGlyZWN0aW9uYWxfdHJhdmVyc2FsX3RhZyB7IH07Cgp9CjwvcHJlPkFuZCB0aGVyZSB3aWxsIG5lZWQgdG8gYmUgYSB3YXkgdG8gYWNjZXNzIHRoZXNlIGNhdGVnb3J5IHRhZ3MgdXNpbmcgYSAKdHJhaXRzIG1lY2hhbmlzbS4gQWRkaW5nIG5ldyB0eXBlZGVmcyB0byA8dHQ+c3RkOjppdGVyYXRvcl90cmFpdHM8L3R0PiBpcyBub3QgYW4gCmFjY2VwdGFibGUgc29sdXRpb24gYmVjYXVzZSB0aGF0IHdvdWxkIGJyZWFrIGV2ZXJ5IGV4aXN0aW5nIGl0ZXJhdG9yLiBJbnN0ZWFkLCAKd2UgcHJvcG9zZSB0d28gbmV3IHRyYWl0cyBjbGFzc2VzLiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGVzZSB0cmFpdHMgY2xhc3NlcyBhcmUgCjxiPmJhY2t3YXJkIGNvbXBhdGlibGU8L2I+LCB0aGF0IGlzLCB0aGV5IHNob3VsZCB3b3JrIHdpdGggYW55IGl0ZXJhdG9yIGZvciAKd2hpY2ggdGhlcmUgaXMgYSB2YWxpZCBkZWZpbml0aW9uIG9mIDx0dD5zdGQ6Oml0ZXJhdG9yX3RyYWl0czwvdHQ+LiBUaGlzIGNhbiBiZSAKYWNjb21wbGlzaGVkIGJ5IG1ha2luZyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGUgdHJhaXRzIGNsYXNzZXMgbWFwIHRoZSAKPHR0Pml0ZXJhdG9yX2NhdGVnb3J5PC90dD4gb2YgdGhlIGl0ZXJhdG9yIHRvIHRoZSBhcHByb3ByaWF0ZSByZXR1cm4gb3IgCnRyYXZlcnNhbCBjYXRlZ29yeS4gRm9yIG5ldyBpdGVyYXRvcnMsIGVpdGhlciBzcGVjaWFsaXphdGlvbnMgb2YgdGhlc2UgdHJhaXRzIApjbGFzc2VzIGNhbiBiZSBkZWZpbmVkLCBvciB0aGUgaXRlcmF0b3IgY2FuIHByb3ZpZGUgbmVzdGVkIHR5cGVkZWZzLCBhbmQgaW5oZXJpdCAKZnJvbSA8dHQ+bmV3X2l0ZXJhdG9yX2Jhc2U8L3R0PiAod2hpY2ggaXMganVzdCBhIHNpZ25hbCB0byB0aGUgdHJhaXRzIGNsYXNzIHRoYXQgCml0IGlzIGEgbmV3IGl0ZXJhdG9yKS4gQXMgd2l0aCA8dHQ+c3RkOjppdGVyYXRvcl90cmFpdHM8L3R0Piwgc3BlY2lhbGl6YXRpb25zIApmb3IgPHR0PlQqPC90dD4gYXJlIHByb3ZpZGVkLiA8cHJlPm5hbWVzcGFjZSBzdGQgewoKICBzdHJ1Y3QgbmV3X2l0ZXJhdG9yX2Jhc2UgeyB9OwoKICB0ZW1wbGF0ZSAmbHQ7dHlwZW5hbWUgSXRlcmF0b3ImZ3Q7CiAgc3RydWN0IHJldHVybl9jYXRlZ29yeQogIHsKICAgIDxiPjxpPi8vIFBzZXVkby1jb2RlPC9pPjwvYj4KICAgIGlmIChJdGVyYXRvciBpbmhlcml0cyBmcm9tIG5ld19pdGVyYXRvcl9iYXNlKSB7CiAgICAgIHR5cGVkZWYgdHlwZW5hbWUgSXRlcmF0b3I6OnJldHVybl9jYXRlZ29yeSB0eXBlOwogICAgfSBlbHNlIHsKICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0cyZsdDtJdGVyYXRvciZndDsgT2xkVHJhaXRzOwogICAgICB0eXBlZGVmIHR5cGVuYW1lIE9sZFRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgQ2F0OwogICAgICBpZiAoQ2F0IGluaGVyaXRzIGZyb20gc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZykKCWlmIChpcy1jb25zdChUKSkKCSAgdHlwZWRlZiBib29zdDo6Y29uc3RhbnRfbHZhbHVlX2l0ZXJhdG9yX3RhZyB0eXBlOwoJZWxzZQoJICB0eXBlZGVmIGJvb3N0OjptdXRhYmxlX2x2YWx1ZV9pdGVyYXRvcl90YWcgdHlwZTsKICAgICAgZWxzZSBpZiAoQ2F0IGluaGVyaXRzIGZyb20gc3RkOjppbnB1dF9pdGVyYXRvcl90YWcpCgl0eXBlZGVmIGJvb3N0OjpyZWFkYWJsZV9pdGVyYXRvcl90YWcgdHlwZTsKICAgICAgZWxzZSBpZiAoQ2F0IGluaGVyaXRzIGZyb20gc3RkOjpvdXRwdXRfaXRlcmF0b3JfdGFnKQoJdHlwZWRlZiBib29zdDo6d3JpdGFibGVfaXRlcmF0b3JfdGFnIHR5cGU7CiAgICB9CiAgfTsKCiAgdGVtcGxhdGUgJmx0O3R5cGVuYW1lIFQmZ3Q7CiAgc3RydWN0IHJldHVybl9jYXRlZ29yeSZsdDtUKiZndDsKICB7CiAgICA8Yj48aT4vLyBQc2V1ZG8tY29kZTwvaT48L2I+CiAgICBpZiAoaXMtY29uc3QoVCkpCiAgICAgIHR5cGVkZWYgYm9vc3Q6OmNvbnN0YW50X2x2YWx1ZV9pdGVyYXRvcl90YWcgdHlwZTsKICAgIGVsc2UKICAgICAgdHlwZWRlZiBib29zdDo6bXV0YWJsZV9sdmFsdWVfaXRlcmF0b3JfdGFnIHR5cGU7CiAgfTsKCiAgdGVtcGxhdGUgJmx0O3R5cGVuYW1lIEl0ZXJhdG9yJmd0OwogIHN0cnVjdCB0cmF2ZXJzYWxfY2F0ZWdvcnkKICB7CiAgICA8Yj48aT4vLyBQc2V1ZG8tY29kZTwvaT48L2I+CiAgICBpZiAoSXRlcmF0b3IgaW5oZXJpdHMgZnJvbSBuZXdfaXRlcmF0b3JfYmFzZSkgewogICAgICB0eXBlZGVmIHR5cGVuYW1lIEl0ZXJhdG9yOjp0cmF2ZXJzYWxfY2F0ZWdvcnkgdHlwZTsKICAgIH0gZWxzZSB7CiAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHMmbHQ7SXRlcmF0b3ImZ3Q7IE9sZFRyYWl0czsKICAgICAgdHlwZWRlZiB0eXBlbmFtZSBPbGRUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IENhdDsKCiAgICAgIGlmIChDYXQgaW5oZXJpdHMgZnJvbSBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQoJdHlwZWRlZiBib29zdDo6cmFuZG9tX2FjY2Vzc190cmF2ZXJzYWxfdGFnIHR5cGU7CiAgICAgIGVsc2UgaWYgKENhdCBpbmhlcml0cyBmcm9tIHN0ZDo6YmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcpCgl0eXBlZGVmIGJvb3N0OjpiaWRpcmVjdGlvbmFsX3RyYXZlcnNhbF90YWcgdHlwZTsKICAgICAgZWxzZSBpZiAoQ2F0IGluaGVyaXRzIGZyb20gc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZykKCXR5cGVkZWYgYm9vc3Q6OmZvcndhcmRfdHJhdmVyc2FsX3RhZyB0eXBlOwogICAgfQogIH07CgogIHRlbXBsYXRlICZsdDt0eXBlbmFtZSBUJmd0OwogIHN0cnVjdCB0cmF2ZXJzYWxfY2F0ZWdvcnkmbHQ7VComZ3Q7CiAgewogICAgdHlwZWRlZiBib29zdDo6cmFuZG9tX2FjY2Vzc190cmF2ZXJzYWxfdGFnIHR5cGU7CiAgfTsKCn0KPC9wcmU+CjxoMj5JbXBhY3Qgb24gdGhlIFN0YW5kYXJkIEFsZ29yaXRobXM8L2gyPk1hbnkgb2YgdGhlIHN0YW5kYXJkIGFsZ29yaXRobXMgcGxhY2UgCm1vcmUgcmVxdWlyZW1lbnRzIHRoYW4gbmVjZXNzYXJ5IG9uIHRoZWlyIGl0ZXJhdG9yIHBhcmFtZXRlcnMgZHVlIHRvIHRoZSAKY29hcnNlbmVzcyBvZiB0aGUgY3VycmVudCBpdGVyYXRvciBjYXRlZ29yaWVzLiBCeSB1c2luZyB0aGUgbmV3IGl0ZXJhdG9yIApjYXRlZ29yaWVzIGEgYmV0dGVyIGZpdCBjYW4gYmUgYWNoaWV2ZWQsIHRoZXJlYnkgaW5jcmVhc2luZyB0aGUgcmV1c2FiaWxpdHkgb2YgCnRoZSBhbGdvcml0aG1zLiBUaGVzZSBjaGFuZ2VzIHdpbGwgbm90IGFmZmVjdCB1c2VyLWNvZGUsIHRob3VnaCB0aGV5IHdpbGwgCnJlcXVpcmUgY2hhbmdlcyBieSBzdGFuZGFyZCBpbXBsZW1lbnRlcnM6IGRpc3BhdGNoaW5nIHNob3VsZCBiZSBiYXNlZCBvbiB0aGUgbmV3IApjYXRlZ29yaWVzLCBhbmQgaW4gcGxhY2VzIHJldHVybiB2YWx1ZXMgbWF5IG5lZWQgdG8gYmUgaGFuZGxlZCBtb3JlIGNhcmVmdWxseS4gCkluIHBhcnRpY3VsYXIsIHVzZXMgb2YgPHR0PnN0ZDo6c3dhcCgpPC90dD4gd2lsbCBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggCjx0dD5zdGQ6Oml0ZXJfc3dhcCgpPC90dD4sIGFuZCA8dHQ+c3RkOjppdGVyX3N3YXAoKTwvdHQ+IHdpbGwgbmVlZCB0byBjYWxsIAo8dHQ+c3RkOjpzd2FwKCk8L3R0Pi4gCjxwPgo8L3A+PGNlbnRlcj4KPGEgbmFtZT0idGFibGU6MiI+CiAgPGI+VGFibGUgMi48L2I+IFJlcXVpcmVtZW50IGNoYW5nZXMgZm9yIHN0YW5kYXJkIAogIGFsZ29yaXRobXMuPC9hPjx0YWJsZSBib3JkZXI9IjEiPgogIDx0Ym9keT4KICA8dHI+CiAgICA8dGg+QWxnb3JpdGhtPC90aD4KICAgIDx0aD5SZXF1aXJlbWVudCBDaGFuZ2U8L3RoPjwvdHI+CiAgPHRyPgogICAgPHRkPmZpbmRfZW5kPC90ZD4KICAgIDx0ZCByb3dzcGFuPSIxMiI+Rm9yd2FyZCBJdGVyYXRvcjxicj4tJmd0OyBGb3J3YXJkIFRyYXZlcnNhbCBJdGVyYXRvciBhbmQgCiAgICAgIFJlYWRhYmxlIEl0ZXJhdG9yIDwvdGQ+PC90cj4KICA8dHI+CiAgICA8dGQ+ZmluZF9maXJzdF9vZjwvdGQ+PC90cj4KICA8dHI+CiAgICA8dGQ+YWRqYWNlbnRfZmluZDwvdGQ+PC90cj4KICA8dHI+CiAgICA8dGQ+c2VhcmNoPC90ZD48L3RyPgogIDx0cj4KICAgIDx0ZD5zZWFyY2hfbjwvdGQ+PC90cj4KICA8dHI+CiAgICA8dGQ+cm90YXRlX2NvcHk8L3RkPjwvdHI+CiAgPHRyPgogICAgPHRkPmxvd2VyX2JvdW5kPC90ZD48L3RyPgogIDx0cj4KICAgIDx0ZD51cHBlcl9ib3VuZDwvdGQ+PC90cj4KICA8dHI+CiAgICA8dGQ+ZXF1YWxfcmFuZ2U8L3RkPjwvdHI+CiAgPHRyPgogICAgPHRkPmJpbmFyeV9zZWFyY2g8L3RkPjwvdHI+CiAgPHRyPgogICAgPHRkPm1pbl9lbGVtZW50PC90ZD48L3RyPgogIDx0cj4KICAgIDx0ZD5tYXhfZWxlbWVudDwvdGQ+PC90cj4KICA8dHI+CiAgICA8dGQ+aXRlcl9zd2FwPC90ZD4KICAgIDx0ZD5Gb3J3YXJkIEl0ZXJhdG9yPGJyPi0mZ3Q7IFN3YXBwYWJsZSBJdGVyYXRvciA8L3RkPjwvdHI+CiAgPHRyPgogICAgPHRkPmZpbGw8L3RkPgogICAgPHRkIHJvd3NwYW49IjIiPkZvcndhcmQgSXRlcmF0b3I8YnI+LSZndDsgRm9yd2FyZCBUcmF2ZXJzYWwgSXRlcmF0b3IgYW5kIAogICAgICBXcml0YWJsZSBJdGVyYXRvciA8L3RkPjwvdHI+CiAgPHRyPgogICAgPHRkPmdlbmVyYXRlPC90ZD48L3RyPgogIDx0cj4KICAgIDx0ZD5zd2FwX3JhbmdlczwvdGQ+CiAgICA8dGQgcm93c3Bhbj0iMiI+Rm9yd2FyZCBJdGVyYXRvcjxicj4tJmd0OyBGb3J3YXJkIFRyYXZlcnNhbCBJdGVyYXRvciBhbmQgCiAgICAgIFN3YXBwYWJsZSBJdGVyYXRvciA8L3RkPjwvdHI+CiAgPHRyPgogICAgPHRkPnJvdGF0ZTwvdGQ+PC90cj4KICA8dHI+CiAgICA8dGQ+cmVwbGFjZTwvdGQ+CiAgICA8dGQgcm93c3Bhbj0iNSI+Rm9yd2FyZCBJdGVyYXRvcjxicj4tJmd0OyBGb3J3YXJkIFRyYXZlcnNhbCBJdGVyYXRvciAKICAgICAgYW5kPGJyPlJlYWRhYmxlIEl0ZXJhdG9yIGFuZCBXcml0YWJsZSBJdGVyYXRvciA8L3RkPgogIDwvdHI+PHRyPgogICAgPHRkPnJlcGxhY2VfaWY8L3RkPjwvdHI+CiAgPHRyPgogICAgPHRkPnJlbW92ZTwvdGQ+PC90cj4KICA8dHI+CiAgICA8dGQ+cmVtb3ZlX2lmPC90ZD48L3RyPgogIDx0cj4KICAgIDx0ZD51bmlxdWU8L3RkPjwvdHI+CiAgPHRyPgogICAgPHRkPnJldmVyc2U8L3RkPgogICAgPHRkIHJvd3NwYW49IjIiPkJpZGlyZWN0aW9uYWwgSXRlcmF0b3I8YnI+LSZndDsgQmlkaXJlY3Rpb25hbCBUcmF2ZXJzYWwgCiAgICAgIEl0ZXJhdG9yIGFuZCBTd2FwcGFibGUgSXRlcmF0b3IgPC90ZD48L3RyPgogIDx0cj4KICAgIDx0ZD5wYXJ0aXRpb248L3RkPjwvdHI+CiAgPHRyPgogICAgPHRkPmNvcHlfYmFja3dhcmRzPC90ZD4KICAgIDx0ZD5CaWRpcmVjdGlvbmFsIEl0ZXJhdG9yPGJyPi0mZ3Q7IEJpZGlyZWN0aW9uYWwgVHJhdmVyc2FsIEl0ZXJhdG9yIGFuZCAKICAgICAgUmVhZGFibGUgSXRlcmF0b3I8YnI+QmlkaXJlY3Rpb25hbCBJdGVyYXRvcjxicj4tJmd0OyBCaWRpcmVjdGlvbmFsIAogICAgICBUcmF2ZXJzYWwgSXRlcmF0b3IgYW5kIFdyaXRhYmxlIEl0ZXJhdG9yIDwvdGQ+PC90cj4KICA8dHI+CiAgICA8dGQ+bmV4dF9wZXJtdXRhdGlvbjwvdGQ+CiAgICA8dGQgcm93c3Bhbj0iMiI+QmlkaXJlY3Rpb25hbCBJdGVyYXRvcjxicj4tJmd0OyBCaWRpcmVjdGlvbmFsIFRyYXZlcnNhbCAKICAgICAgSXRlcmF0b3IgYW5kIDxicj5Td2FwcGFibGUgSXRlcmF0b3IgYW5kIFJlYWRhYmxlIEl0ZXJhdG9yIDwvdGQ+CiAgPC90cj48dHI+CiAgICA8dGQ+cHJldl9wZXJtdXRhdGlvbjwvdGQ+PC90cj4KICA8dHI+CiAgICA8dGQ+c3RhYmxlX3BhcnRpdGlvbjwvdGQ+CiAgICA8dGQgcm93c3Bhbj0iMiI+QmlkaXJlY3Rpb25hbCBJdGVyYXRvcjxicj4tJmd0OyBCaWRpcmVjdGlvbmFsIFRyYXZlcnNhbCAKICAgICAgSXRlcmF0b3IgYW5kIDxicj5SZWFkYWJsZSBJdGVyYXRvciBhbmQgV3JpdGFibGUgSXRlcmF0b3IgPC90ZD4KICA8L3RyPjx0cj4KICAgIDx0ZD5pbnBsYWNlX21lcmdlPC90ZD48L3RyPgogIDx0cj4KICAgIDx0ZD5yZXZlcnNlX2NvcHk8L3RkPgogICAgPHRkPkJpZGlyZWN0aW9uYWwgSXRlcmF0b3I8YnI+LSZndDsgQmlkaXJlY3Rpb25hbCBUcmF2ZXJzYWwgSXRlcmF0b3IgYW5kIAogICAgICBSZWFkYWJsZSBJdGVyYXRvciA8L3RkPjwvdHI+CiAgPHRyPgogICAgPHRkPnJhbmRvbV9zaHVmZmxlPC90ZD4KICAgIDx0ZCByb3dzcGFuPSI5Ij5SYW5kb20gQWNjZXNzIEl0ZXJhdG9yPGJyPi0mZ3Q7IFJhbmRvbSBBY2Nlc3MgVHJhdmVyc2FsIAogICAgICBJdGVyYXRvciBhbmQgU3dhcHBhYmxlIEl0ZXJhdG9yIDwvdGQ+PC90cj4KICA8dHI+CiAgICA8dGQ+c29ydDwvdGQ+PC90cj4KICA8dHI+CiAgICA8dGQ+c3RhYmxlX3NvcnQ8L3RkPjwvdHI+CiAgPHRyPgogICAgPHRkPnBhcnRpYWxfc29ydDwvdGQ+PC90cj4KICA8dHI+CiAgICA8dGQ+bnRoX2VsZW1lbnQ8L3RkPjwvdHI+CiAgPHRyPgogICAgPHRkPnB1c2hfaGVhcDwvdGQ+PC90cj4KICA8dHI+CiAgICA8dGQ+cG9wX2hlYXA8L3RkPjwvdHI+CiAgPHRyPgogICAgPHRkPm1ha2VfaGVhcDwvdGQ+PC90cj4KICA8dHI+CiAgICA8dGQ+c29ydF9oZWFwPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2NlbnRlcj4KPGgyPlRoZSBOZXcgSXRlcmF0b3IgUmVxdWlyZW1lbnRzPC9oMj4KPGgzPk5vdGF0aW9uPC9oMz4KPHRhYmxlPgogIDx0Ym9keT4KICA8dHI+CiAgICA8dGQ+PHR0Plg8L3R0PjwvdGQ+CiAgICA8dGQ+VGhlIGl0ZXJhdG9yIHR5cGUuPC90ZD48L3RyPgogIDx0cj4KICAgIDx0ZD48dHQ+VDwvdHQ+PC90ZD4KICAgIDx0ZD5UaGUgdmFsdWUgdHlwZSBvZiA8dHQ+WDwvdHQ+LCBpLmUuLCAKICAgICAgPHR0PnN0ZDo6aXRlcmF0b3JfdHJhaXRzJmx0O1gmZ3Q7Ojp2YWx1ZV90eXBlPC90dD4uPC90ZD48L3RyPgogIDx0cj4KICAgIDx0ZD48dHQ+eDwvdHQ+LCA8dHQ+eTwvdHQ+PC90ZD4KICAgIDx0ZD5BbiBvYmplY3Qgb2YgdHlwZSA8dHQ+WDwvdHQ+LjwvdGQ+PC90cj4KICA8dHI+CiAgICA8dGQ+PHR0PnQ8L3R0PjwvdGQ+CiAgICA8dGQ+QW4gb2JqZWN0IG9mIHR5cGUgPHR0PlQ8L3R0Pi48L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPgo8cD4KPC9wPjxocj4KPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+CjxoMz48YSBuYW1lPSJjb25jZXB0X1JlYWRhYmxlSXRlcmF0b3IiPjwvYT5SZWFkYWJsZSBJdGVyYXRvciA8L2gzPkEgUmVhZGFibGUgCkl0ZXJhdG9yIGlzIGFuIGl0ZXJhdG9yIHRoYXQgZGVyZWZlcmVuY2VzIHRvIHByb2R1Y2UgYW4gcnZhbHVlIHRoYXQgaXMgCmNvbnZlcnRpYmxlIHRvIHRoZSA8dHQ+dmFsdWVfdHlwZTwvdHQ+IG9mIHRoZSBpdGVyYXRvci4gCjxoMz5Bc3NvY2lhdGVkIFR5cGVzPC9oMz4KPHRhYmxlIGJvcmRlcj0iMSI+CiAgPHRib2R5PgogIDx0cj4KICAgIDx0ZD5WYWx1ZSB0eXBlPC90ZD4KICAgIDx0ZD48dHQ+c3RkOjppdGVyYXRvcl90cmFpdHMmbHQ7WCZndDs6OnZhbHVlX3R5cGU8L3R0PjwvdGQ+CiAgICA8dGQ+VGhlIHR5cGUgb2YgdGhlIG9iamVjdHMgcG9pbnRlZCB0byBieSB0aGUgaXRlcmF0b3IuPC90ZD48L3RyPgogIDx0cj4KICAgIDx0ZD5SZWZlcmVuY2UgdHlwZTwvdGQ+CiAgICA8dGQ+PHR0PnN0ZDo6aXRlcmF0b3JfdHJhaXRzJmx0O1gmZ3Q7OjpyZWZlcmVuY2U8L3R0PjwvdGQ+CiAgICA8dGQ+VGhlIHJldHVybiB0eXBlIG9mIGRlcmVmZXJlbmNpbmcgdGhlIGl0ZXJhdG9yLiBUaGlzIHR5cGUgbXVzdCBiZSAKICAgICAgY29udmVydGlibGUgdG8gPHR0PlQ8L3R0Pi4gPC90ZD48L3RyPgogIDx0cj4KICAgIDx0ZD5SZXR1cm4gQ2F0ZWdvcnk8L3RkPgogICAgPHRkPjx0dD5zdGQ6OnJldHVybl9jYXRlZ29yeSZsdDtYJmd0Ozo6dHlwZTwvdHQ+PC90ZD4KICAgIDx0ZD5BIHR5cGUgY29udmVydGlibGUgdG8gPHR0PnN0ZDo6cmVhZGFibGVfaXRlcmF0b3JfdGFnPC90dD4gCiAgPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT4KPGgzPlJlZmluZW1lbnQgb2Y8L2gzPjxhIGhyZWY9Imh0dHA6Ly93d3cuYm9vc3Qub3JnL2xpYnMvdXRpbGl0eS9Db3B5Q29uc3RydWN0aWJsZS5odG1sIj5Db3B5IApDb25zdHJ1Y3RpYmxlPC9hPiAKPGgzPlZhbGlkIGV4cHJlc3Npb25zPC9oMz4KPHRhYmxlIGJvcmRlcj0iMSI+CiAgPHRib2R5PgogIDx0cj4KICAgIDx0aD5OYW1lPC90aD4KICAgIDx0aD5FeHByZXNzaW9uPC90aD4KICAgIDx0aD5UeXBlIHJlcXVpcmVtZW50czwvdGg+CiAgICA8dGg+UmV0dXJuIHR5cGU8L3RoPjwvdHI+CiAgPHRyPgogICAgPHRkPkRlcmVmZXJlbmNlPC90ZD4KICAgIDx0ZD48dHQ+Kng8L3R0PjwvdGQ+CiAgICA8dGQ+oDwvdGQ+CiAgICA8dGQ+PHR0PnN0ZDo6aXRlcmF0b3JfdHJhaXRzJmx0O1gmZ3Q7OjpyZWZlcmVuY2U8L3R0PjwvdGQ+PC90cj4KICA8dHI+CiAgICA8dGQ+TWVtYmVyIGFjY2VzczwvdGQ+CiAgICA8dGQ+PHR0PngtJmd0O208L3R0PjwvdGQ+CiAgICA8dGQ+PHR0PlQ8L3R0PiBpcyBhIHR5cGUgd2l0aCBhIG1lbWJlciBuYW1lZCA8dHQ+bTwvdHQ+LjwvdGQ+CiAgICA8dGQ+SWYgPHR0Pm08L3R0PiBpcyBhIGRhdGEgbWVtYmVyLCB0aGUgdHlwZSBvZiA8dHQ+bTwvdHQ+LiBJZiA8dHQ+bTwvdHQ+IAogICAgICBpcyBhIG1lbWJlciBmdW5jdGlvbiwgdGhlIHJldHVybiB0eXBlIG9mIDx0dD5tPC90dD4uIDwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+CjxwPgo8L3A+PGhyPgo8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4KPGgzPjxhIG5hbWU9ImNvbmNlcHRfV3JpdGFibGVJdGVyYXRvciI+PC9hPldyaXRhYmxlIEl0ZXJhdG9yIDwvaDM+QSBXcml0YWJsZSAKSXRlcmF0b3IgaXMgYW4gaXRlcmF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBhIHZhbHVlIHVzaW5nIHRoZSAKZGVyZWZlcmVuY2UtYXNzaWdubWVudCBleHByZXNzaW9uLiAKPGgzPkRlZmluaXRpb25zPC9oMz5JZiA8dHQ+eDwvdHQ+IGlzIGFuIFdyaXRhYmxlIEl0ZXJhdG9yIG9mIHR5cGUgPHR0Plg8L3R0PiwgCnRoZW4gdGhlIGV4cHJlc3Npb24gPHR0Pip4ID0gYTs8L3R0PiBzdG9yZXMgdGhlIHZhbHVlIDx0dD5hPC90dD4gaW50byAKPHR0Png8L3R0Pi4gTm90ZSB0aGF0IDx0dD5vcGVyYXRvcj08L3R0PiwgbGlrZSBvdGhlciBDKysgZnVuY3Rpb25zLCBtYXkgYmUgCm92ZXJsb2FkZWQ7IGl0IG1heSwgaW4gZmFjdCwgZXZlbiBiZSBhIHRlbXBsYXRlIGZ1bmN0aW9uLiBJbiBnZW5lcmFsLCB0aGVuLCAKPHR0PmE8L3R0PiBtYXkgYmUgYW55IG9mIHNldmVyYWwgZGlmZmVyZW50IHR5cGVzLiBBIHR5cGUgPHR0PkE8L3R0PiBiZWxvbmdzIHRvIAp0aGUgPGk+c2V0IG9mIHZhbHVlIHR5cGVzPC9pPiBvZiA8dHQ+WDwvdHQ+IGlmLCBmb3IgYW4gb2JqZWN0IDx0dD5hPC90dD4gb2YgdHlwZSAKPHR0PkE8L3R0PiwgPHR0Pip4ID0gYTs8L3R0PiBpcyB3ZWxsLWRlZmluZWQgYW5kIGRvZXMgbm90IHJlcXVpcmUgcGVyZm9ybWluZyBhbnkgCm5vbi10cml2aWFsIGNvbnZlcnNpb25zIG9uIDx0dD5hPC90dD4uIAo8aDM+QXNzb2NpYXRlZCBUeXBlczwvaDM+Cjx0YWJsZSBib3JkZXI9IjEiPgogIDx0Ym9keT4KICA8dHI+CiAgICA8dGQ+UmV0dXJuIENhdGVnb3J5PC90ZD4KICAgIDx0ZD48dHQ+c3RkOjpyZXR1cm5fY2F0ZWdvcnkmbHQ7WCZndDs6OnR5cGU8L3R0PjwvdGQ+CiAgICA8dGQ+QSB0eXBlIGNvbnZlcnRpYmxlIHRvIDx0dD5zdGQ6OndyaXRhYmxlX2l0ZXJhdG9yX3RhZzwvdHQ+IAogIDwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+CjxoMz5SZWZpbmVtZW50IG9mPC9oMz48YSBocmVmPSJodHRwOi8vd3d3LmJvb3N0Lm9yZy9saWJzL3V0aWxpdHkvQ29weUNvbnN0cnVjdGlibGUuaHRtbCI+Q29weSAKQ29uc3RydWN0aWJsZTwvYT4gCjxoMz5WYWxpZCBleHByZXNzaW9uczwvaDM+Cjx0YWJsZSBib3JkZXI9IjEiPgogIDx0Ym9keT4KICA8dHI+CiAgICA8dGg+TmFtZTwvdGg+CiAgICA8dGg+RXhwcmVzc2lvbjwvdGg+CiAgICA8dGg+UmV0dXJuIHR5cGU8L3RoPjwvdHI+CiAgPHRyPgogICAgPHRkPkRlcmVmZXJlbmNlIGFzc2lnbm1lbnQ8L3RkPgogICAgPHRkPjx0dD4qeCA9IGE8L3R0PjwvdGQ+CiAgICA8dGQ+dW5zcGVjaWZpZWQ8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPgo8cD4KPC9wPjxocj4KPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+CjxoMz48YSBuYW1lPSJjb25jZXB0X1N3YXBwYWJsZUl0ZXJhdG9yIj48L2E+U3dhcHBhYmxlIEl0ZXJhdG9yIDwvaDM+QSBTd2FwcGFibGUgCkl0ZXJhdG9yIGlzIGFuIGl0ZXJhdG9yIHdob3NlIGRlcmVmZXJlbmNlZCB2YWx1ZXMgY2FuIGJlIHN3YXBwZWQuIAo8cD5Ob3RlOiB0aGUgcmVxdWlyZW1lbnRzIGZvciBTd2FwcGFibGUgSXRlcmF0b3IgYXJlIGRlcGVuZGVudCBvbiB0aGUgaXNzdWVzIApzdXJyb3VuZGluZyA8dHQ+c3RkOjpzd2FwKCk8L3R0PiBiZWluZyByZXNvbHZlZC4gSGVyZSB3ZSBhc3N1bWUgdGhhdCB0aGUgaXNzdWUgCndpbGwgYmUgcmVzb2x2ZWQgYnkgYWxsb3dpbmcgdGhlIG92ZXJsb2FkIG9mIDx0dD5zdGQ6OnN3YXAoKTwvdHQ+IGZvciAKdXNlci1kZWZpbmVkIHR5cGVzLiAKPC9wPjxwPk5vdGU6IFJlYWRhYmxlIEl0ZXJhdG9yIGFuZCBXcml0YWJsZSBJdGVyYXRvciBjb21iaW5lZCBpbXBsaWVzIFN3YXBwYWJsZSAKSXRlcmF0b3IgYmVjYXVzZSBvZiB0aGUgZnVsbHkgdGVtcGxhdGVkIDx0dD5zdGQ6OnN3YXAoKTwvdHQ+LiBIb3dldmVyLCBTd2FwcGFibGUgCkl0ZXJhdG9yIGRvZXMgbm90IGltcGx5IFJlYWRhYmxlIEl0ZXJhdG9yIG5vciBXcml0YWJsZSBJdGVyYXRvci4gCjwvcD48aDM+QXNzb2NpYXRlZCBUeXBlczwvaDM+Cjx0YWJsZSBib3JkZXI9IjEiPgogIDx0Ym9keT4KICA8dHI+CiAgICA8dGQ+UmV0dXJuIENhdGVnb3J5PC90ZD4KICAgIDx0ZD48dHQ+c3RkOjpyZXR1cm5fY2F0ZWdvcnkmbHQ7WCZndDs6OnR5cGU8L3R0PjwvdGQ+CiAgICA8dGQ+QSB0eXBlIGNvbnZlcnRpYmxlIHRvIDx0dD5zdGQ6OnN3YXBwYWJsZV9pdGVyYXRvcl90YWc8L3R0PiAKICA8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPgo8aDM+VmFsaWQgZXhwcmVzc2lvbnM8L2gzPk9mIHRoZSB0d28gdmFsaWQgZXhwcmVzc2lvbnMgbGlzdGVkIGJlbG93LCBvbmx5IG9uZSAKPGI+T1I8L2I+IHRoZSBvdGhlciBpcyByZXF1aXJlZC4gSWYgPHR0PnN0ZDo6aXRlcl9zd2FwKCk8L3R0PiBpcyBvdmVybG9hZGVkIGZvciAKPHR0Plg8L3R0PiB0aGVuIDx0dD5zdGQ6OnN3YXAoKTwvdHQ+IGlzIG5vdCByZXF1aXJlZC4gSWYgCjx0dD5zdGQ6Oml0ZXJfc3dhcCgpPC90dD4gaXMgbm90IG92ZXJsb2FkZWQgZm9yIDx0dD5YPC90dD4gdGhlbiB0aGUgZGVmYXVsdCAKKGZ1bGx5IHRlbXBsYXRlZCkgdmVyc2lvbiBpcyB1c2VkLCB3aGljaCB3aWxsIGNhbGwgPHR0PnN0ZDo6c3dhcCgpPC90dD4gKHRoaXMgCm1lYW5zIGNoYW5naW5nIHRoZSBjdXJyZW50IHJlcXVpcmVtZW50cyBmb3IgPHR0PnN0ZDo6aXRlcl9zd2FwKCk8L3R0PikuIAo8cD4KPHRhYmxlIGJvcmRlcj0iMSI+CiAgPHRib2R5PgogIDx0cj4KICAgIDx0aD5OYW1lPC90aD4KICAgIDx0aD5FeHByZXNzaW9uPC90aD4KICAgIDx0aD5SZXR1cm4gdHlwZTwvdGg+PC90cj4KICA8dHI+CiAgICA8dGQ+SXRlcmF0b3IgU3dhcDwvdGQ+CiAgICA8dGQ+PHR0PnN0ZDo6aXRlcl9zd2FwKHgsIHkpPC90dD48L3RkPgogICAgPHRkPnZvaWQ8L3RkPjwvdHI+CiAgPHRyPgogICAgPHRkPkRlcmVmZXJlbmNlIGFuZCBTd2FwPC90ZD4KICAgIDx0ZD48dHQ+c3RkOjpzd2FwKCp4LCAqeSk8L3R0PjwvdGQ+CiAgICA8dGQ+dm9pZDwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+CjwvcD48cD4KPC9wPjxocj4KPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+CjxoMz48YSBuYW1lPSJjb25jZXB0X0NvbnN0YW50THZhbHVlSXRlcmF0b3IiPjwvYT5Db25zdGFudCBMdmFsdWUgSXRlcmF0b3IgPC9oMz5BIApDb25zdGFudCBMdmFsdWUgSXRlcmF0b3IgaXMgYW4gaXRlcmF0b3IgdGhhdCBkZXJlZmVyZW5jZXMgdG8gcHJvZHVjZSBhIGNvbnN0IApyZWZlcmVuY2UgdG8gdGhlIHBvaW50ZWQtdG8gb2JqZWN0LCBpLmUuLCB0aGUgYXNzb2NpYXRlZCA8dHQ+cmVmZXJlbmNlPC90dD4gdHlwZSAKaXMgPHR0PmNvbnN0IFQmYW1wOzwvdHQ+LiBDaGFuZ2luZyB0aGUgdmFsdWUgb2Ygb3IgZGVzdHJveWluZyBhbiBpdGVyYXRvciB0aGF0IAptb2RlbHMgQ29uc3RhbnQgTHZhbHVlIEl0ZXJhdG9yIGRvZXMgbm90IGludmFsaWRhdGUgcG9pbnRlcnMgYW5kIHJlZmVyZW5jZXMgCnByZXZpb3VzbHkgb2J0YWluZWQgZnJvbSB0aGF0IGl0ZXJhdG9yLiAKPGgzPlJlZmluZW1lbnQgb2Y8L2gzPjxhIGhyZWY9IiNjb25jZXB0X1JlYWRhYmxlSXRlcmF0b3IiPlJlYWRhYmxlIApJdGVyYXRvcjwvYT4gCjxoMz5Bc3NvY2lhdGVkIFR5cGVzPC9oMz4KPHRhYmxlIGJvcmRlcj0iMSI+CiAgPHRib2R5PgogIDx0cj4KICAgIDx0ZD5SZWZlcmVuY2UgdHlwZTwvdGQ+CiAgICA8dGQ+PHR0PnN0ZDo6aXRlcmF0b3JfdHJhaXRzJmx0O1gmZ3Q7OjpyZWZlcmVuY2U8L3R0PjwvdGQ+CiAgICA8dGQ+VGhlIHJldHVybiB0eXBlIG9mIGRlcmVmZXJlbmNpbmcgdGhlIGl0ZXJhdG9yLCB3aGljaCBtdXN0IGJlIDx0dD5jb25zdCAKICAgICAgVCZhbXA7PC90dD4uIDwvdGQ+PC90cj48IS0tICBJIGRvbid0IHRoaW5rIHRoaXMgaXMgbmVlZGVkCgogIDx0cj4KCiAgICA8dGQ+UG9pbnRlciB0eXBlPC90ZD4KCiAgICA8dGQ+PHR0PnN0ZDo6aXRlcmF0b3JfdHJhaXRzJmx0O1gmZ3Q7Ojpwb2ludGVyPC90dD48L3RkPgoKICAgIDx0ZD4KCiAgICAgVGhlIHBvaW50ZXIgdG8gdGhlIHZhbHVlIHR5cGUsIHdoaWNoIG11c3QgYmUgPHR0PmNvbnN0IFQqPC90dD4uCgogICAgPC90ZD4KCiAgPC90cj4KCi0tPgogIDx0cj4KICAgIDx0ZD5SZXR1cm4gQ2F0ZWdvcnk8L3RkPgogICAgPHRkPjx0dD5zdGQ6OnJldHVybl9jYXRlZ29yeSZsdDtYJmd0Ozo6dHlwZTwvdHQ+PC90ZD4KICAgIDx0ZD5BIHR5cGUgY29udmVydGlibGUgdG8gPHR0PnN0ZDo6Y29uc3RhbnRfbHZhbHVlX2l0ZXJhdG9yX3RhZzwvdHQ+IAogIDwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PCEtLSB0aGVzZSBhcmUgbm90IG5lY2Vzc2FyeSBub3cgdGhhdCB3ZSB1c2UgcmVmZXJlbmNlIGFzIG9wZXJhdG9yKiByZXR1cm4gdHlwZQoKPGgzPlZhbGlkIGV4cHJlc3Npb25zPC9oMz4KCgoKPFRhYmxlIGJvcmRlcj4KCjx0cj48VEg+TmFtZTwvVEg+PFRIPkV4cHJlc3Npb248L1RIPjxUSD5UeXBlIHJlcXVpcmVtZW50czwvVEg+PFRIPlJldHVybiB0eXBlPC9USD48L3RyPgoKPHRyPgoKIDx0ZD5EZXJlZmVyZW5jZTwvdGQ+CgogPHRkPjx0dD4qeDwvdHQ+PC90ZD4KCiA8dGQ+Jm5ic3A7PC90ZD4KCiA8dGQ+PHR0PnN0ZDo6aXRlcmF0b3JfdHJhaXRzJmx0O1gmZ3Q7OjpyZWZlcmVuY2U8L3R0PjwvdGQ+Cgo8L3RyPgoKPHRyPgoKIDx0ZD5NZW1iZXIgYWNjZXNzPC90ZD4KCiA8dGQ+PHR0PngtJmd0O208L3R0PjwvdGQ+CgogPHRkPjx0dD5UPC90dD4gaXMgYSB0eXBlIHdpdGggYSBtZW1iZXIgbmFtZWQgPHR0Pm08L3R0Pi48L3RkPgoKIDx0ZD4KCiAmbmJzcDsKCiA8L3RkPgoKPC90cj4KCjwvdGFibGU+CgoKCi0tPgo8cD4KPC9wPjxocj4KPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+CjxoMz48YSBuYW1lPSJjb25jZXB0X011dGFibGVMdmFsdWVJdGVyYXRvciI+PC9hPk11dGFibGUgTHZhbHVlIEl0ZXJhdG9yIDwvaDM+QSAKTXV0YWJsZSBMdmFsdWUgSXRlcmF0b3IgaXMgYW4gaXRlcmF0b3IgdGhhdCBkZXJlZmVyZW5jZXMgdG8gcHJvZHVjZSBhIHJlZmVyZW5jZSAKdG8gdGhlIHBvaW50ZWQtdG8gb2JqZWN0LiBUaGUgYXNzb2NpYXRlZCA8dHQ+cmVmZXJlbmNlPC90dD4gdHlwZSBpcyAKPHR0PlQmYW1wOzwvdHQ+LiBDaGFuZ2luZyB0aGUgdmFsdWUgb2Ygb3IgZGVzdHJveWluZyBhbiBpdGVyYXRvciB0aGF0IG1vZGVscyAKTXV0YWJsZSBMdmFsdWUgSXRlcmF0b3IgZG9lcyBub3QgaW52YWxpZGF0ZSBwb2ludGVycyBhbmQgcmVmZXJlbmNlcyBwcmV2aW91c2x5IApvYnRhaW5lZCBmcm9tIHRoYXQgaXRlcmF0b3IuIAo8aDM+UmVmaW5lbWVudCBvZjwvaDM+PGEgaHJlZj0iI2NvbmNlcHRfUmVhZGFibGVJdGVyYXRvciI+UmVhZGFibGUgCkl0ZXJhdG9yPC9hPiwgPGEgaHJlZj0iI2NvbmNlcHRfV3JpdGFibGVJdGVyYXRvciI+V3JpdGFibGUgCkl0ZXJhdG9yPC9hPiwgYW5kIDxhIGhyZWY9IiNjb25jZXB0X1N3YXBwYWJsZUl0ZXJhdG9yIj5Td2FwcGFibGUgCkl0ZXJhdG9yPC9hPi4gCjxoMz5Bc3NvY2lhdGVkIFR5cGVzPC9oMz4KPHRhYmxlIGJvcmRlcj0iMSI+CiAgPHRib2R5PgogIDx0cj4KICAgIDx0ZD5SZWZlcmVuY2UgdHlwZTwvdGQ+CiAgICA8dGQ+PHR0PnN0ZDo6aXRlcmF0b3JfdHJhaXRzJmx0O1gmZ3Q7OjpyZWZlcmVuY2U8L3R0PjwvdGQ+CiAgICA8dGQ+VGhlIHJldHVybiB0eXBlIG9mIGRlcmVmZXJlbmNpbmcgdGhlIGl0ZXJhdG9yLCB3aGljaCBtdXN0IGJlIAogICAgICA8dHQ+VCZhbXA7PC90dD4uPC90ZD48L3RyPjwhLS0gSSBkb24ndCB0aGluayB0aGlzIGlzIG5lY2Vzc2FyeQoKICA8dHI+CgogICAgPHRkPlBvaW50ZXIgdHlwZTwvdGQ+CgogICAgPHRkPjx0dD5zdGQ6Oml0ZXJhdG9yX3RyYWl0cyZsdDtYJmd0Ozo6cG9pbnRlcjwvdHQ+PC90ZD4KCiAgICA8dGQ+CgogICAgIFRoZSBwb2ludGVyIHRvIHRoZSB2YWx1ZSB0eXBlLCB3aGljaCBpcyA8dHQ+VCo8L3R0Pi4KCiAgICA8L3RkPgoKICA8L3RyPgoKLS0+CiAgPHRyPgogICAgPHRkPlJldHVybiBDYXRlZ29yeTwvdGQ+CiAgICA8dGQ+PHR0PnN0ZDo6cmV0dXJuX2NhdGVnb3J5Jmx0O1gmZ3Q7Ojp0eXBlPC90dD48L3RkPgogICAgPHRkPkEgdHlwZSBjb252ZXJ0aWJsZSB0byA8dHQ+c3RkOjptdXRhYmxlX2x2YWx1ZV9pdGVyYXRvcl90YWc8L3R0PiAKICA8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjwhLS0gbm8gbG9uZ2VyIG5lZWRlZCBzaW5jZSB0aGUgcmV0dXJuIHR5cGUgaXMgc3BlY2lmaWVkIGFzIHJlZmVyZW5jZSBpbiB0aGUgcmVhZGFibGUgaXRlcmF0b3IKCjxoMz5WYWxpZCBleHByZXNzaW9uczwvaDM+CgoKCjxUYWJsZSBib3JkZXI+Cgo8dHI+PFRIPk5hbWU8L1RIPjxUSD5FeHByZXNzaW9uPC9USD48VEg+VHlwZSByZXF1aXJlbWVudHM8L1RIPjxUSD5SZXR1cm4gdHlwZTwvVEg+PC90cj4KCjx0cj4KCiA8dGQ+RGVyZWZlcmVuY2U8L3RkPgoKIDx0ZD48dHQ+Kng8L3R0PjwvdGQ+CgogPHRkPiZuYnNwOzwvdGQ+CgogPHRkPjx0dD5zdGQ6Oml0ZXJhdG9yX3RyYWl0cyZsdDtYJmd0Ozo6cmVmZXJlbmNlPC90dD48L3RkPgoKPC90cj4KCjx0cj4KCiA8dGQ+TWVtYmVyIGFjY2VzczwvdGQ+CgogPHRkPjx0dD54LSZndDttPC90dD48L3RkPgoKIDx0ZD48dHQ+VDwvdHQ+IGlzIGEgdHlwZSB3aXRoIGEgbWVtYmVyIG5hbWVkIDx0dD5tPC90dD4uPC90ZD4KCiA8dGQ+CgogJm5ic3A7CgogPC90ZD4KCjwvdHI+Cgo8L3RhYmxlPgoKCgotLT4KPHA+CjwvcD48aHI+CjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgo8aDM+PGEgbmFtZT0iY29uY2VwdF9Gb3J3YXJkVHJhdmVyc2FsSXRlcmF0b3IiPjwvYT5Gb3J3YXJkIFRyYXZlcnNhbCBJdGVyYXRvciAKPC9oMz5UaGUgRm9yd2FyZCBJdGVyYXRvciBpcyBhbiBpdGVyYXRvciB0aGF0IGNhbiBiZSBpbmNyZW1lbnRlZC4gQWxzbywgaXQgaXMgCnBlcm1pc3NpYmxlIHRvIG1ha2UgbXVsdGlwbGUgcGFzc2VzIHRocm91Z2ggdGhlIGl0ZXJhdG9yJ3MgcmFuZ2UuIAo8aDM+UmVmaW5lbWVudCBvZjwvaDM+PGEgaHJlZj0iaHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy91dGlsaXR5L0NvcHlDb25zdHJ1Y3RpYmxlLmh0bWwiPkNvcHkgCkNvbnN0cnVjdGlibGU8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LmJvb3N0Lm9yZy9saWJzL3V0aWxpdHkvQXNzaWduYWJsZS5odG1sIj5Bc3NpZ25hYmxlPC9hPiwgPGEgaHJlZj0iaHR0cDovL3d3dy5zZ2kuY29tL3RlY2gvc3RsL0RlZmF1bHRDb25zdHJ1Y3RpYmxlLmh0bWwiPkRlZmF1bHQgCkNvbnN0cnVjdGlibGU8L2E+LCBhbmQgPGEgaHJlZj0iaHR0cDovL3d3dy5zZ2kuY29tL3RlY2gvc3RsL0VxdWFsaXR5Q29tcGFyYWJsZS5odG1sIj5FcXVhbGl0eSAKQ29tcGFyYWJsZTwvYT4gCjxoMz5Bc3NvY2lhdGVkIHR5cGVzPC9oMz4KPHRhYmxlIGJvcmRlcj0iMSI+CiAgPHRib2R5PgogIDx0cj4KICAgIDx0ZD5EaWZmZXJlbmNlIFR5cGU8L3RkPgogICAgPHRkPjx0dD5zdGQ6Oml0ZXJhdG9yX3RyYWl0cyZsdDtYJmd0Ozo6ZGlmZmVyZW5jZV90eXBlPC90dD48L3RkPgogICAgPHRkPkEgc2lnbmVkIGludGVncmFsIHR5cGUgdXNlZCBmb3IgcmVwcmVzZW50aW5nIGRpc3RhbmNlcyBiZXR3ZWVuIAogICAgICBpdGVyYXRvcnMgdGhhdCBwb2ludCBpbnRvIHRoZSBzYW1lIHJhbmdlLiA8L3RkPjwvdHI+CiAgPHRyPgogICAgPHRkPlRyYXZlcnNhbCBDYXRlZ29yeTwvdGQ+CiAgICA8dGQ+PHR0PnN0ZDo6dHJhdmVyc2FsX2NhdGVnb3J5Jmx0O1gmZ3Q7Ojp0eXBlPC90dD48L3RkPgogICAgPHRkPkEgdHlwZSBjb252ZXJ0aWJsZSB0byA8dHQ+c3RkOjpmb3J3YXJkX3RyYXZlcnNhbF90YWc8L3R0PiAKICA8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPgo8aDM+VmFsaWQgZXhwcmVzc2lvbnM8L2gzPgo8dGFibGUgYm9yZGVyPSIxIj4KICA8dGJvZHk+CiAgPHRyPgogICAgPHRoPk5hbWU8L3RoPgogICAgPHRoPkV4cHJlc3Npb248L3RoPgogICAgPHRoPlR5cGUgcmVxdWlyZW1lbnRzPC90aD4KICAgIDx0aD5SZXR1cm4gdHlwZTwvdGg+PC90cj4KICA8dHI+CiAgICA8dGQ+UHJlaW5jcmVtZW50PC90ZD4KICAgIDx0ZD48dHQ+KytpPC90dD48L3RkPgogICAgPHRkPqA8L3RkPgogICAgPHRkPjx0dD5YJmFtcDs8L3R0PjwvdGQ+PC90cj4KICA8dHI+CiAgICA8dGQ+UG9zdGluY3JlbWVudDwvdGQ+CiAgICA8dGQ+PHR0PmkrKzwvdHQ+PC90ZD4KICAgIDx0ZD6gPC90ZD4KICAgIDx0ZD5jb252ZXJ0aWJsZSB0byA8dHQ+Y29uc3QgWCZhbXA7PC90dD48L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPgo8cD4KPC9wPjxocj4KPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+CjxoMz48YSBuYW1lPSJjb25jZXB0X0JpZGlyZWN0aW9uYWxUcmF2ZXJzYWxJdGVyYXRvciI+PC9hPkJpZGlyZWN0aW9uYWwgVHJhdmVyc2FsIApJdGVyYXRvciA8L2gzPkFuIGl0ZXJhdG9yIHRoYXQgY2FuIGJlIGluY3JlbWVudGVkIGFuZCBkZWNyZW1lbnRlZC4gCjxoMz5SZWZpbmVtZW50IG9mPC9oMz48YSBocmVmPSIjY29uY2VwdF9Gb3J3YXJkVHJhdmVyc2FsSXRlcmF0b3IiPkZvcndhcmQgClRyYXZlcnNhbCBJdGVyYXRvcjwvYT4gCjxoMz5Bc3NvY2lhdGVkIHR5cGVzPC9oMz4KPHRhYmxlIGJvcmRlcj0iMSI+CiAgPHRib2R5PgogIDx0cj4KICAgIDx0ZD5UcmF2ZXJzYWwgQ2F0ZWdvcnk8L3RkPgogICAgPHRkPjx0dD5zdGQ6OnRyYXZlcnNhbF9jYXRlZ29yeSZsdDtYJmd0Ozo6dHlwZTwvdHQ+PC90ZD4KICAgIDx0ZD5BIHR5cGUgY29udmVydGlibGUgdG8gPHR0PnN0ZDo6YmlkaXJlY3Rpb25hbF90cmF2ZXJzYWxfdGFnPC90dD4gCiAgPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT4KPGgzPlZhbGlkIGV4cHJlc3Npb25zPC9oMz4KPHRhYmxlIGJvcmRlcj0iMSI+CiAgPHRib2R5PgogIDx0cj4KICAgIDx0aD5OYW1lPC90aD4KICAgIDx0aD5FeHByZXNzaW9uPC90aD4KICAgIDx0aD5UeXBlIHJlcXVpcmVtZW50czwvdGg+CiAgICA8dGg+UmV0dXJuIHR5cGU8L3RoPjwvdHI+CiAgPHRyPgogICAgPHRkPlByZWRlY3JlbWVudDwvdGQ+CiAgICA8dGQ+PHR0Pi0taTwvdHQ+PC90ZD4KICAgIDx0ZD6gPC90ZD4KICAgIDx0ZD48dHQ+WCZhbXA7PC90dD48L3RkPjwvdHI+CiAgPHRyPgogICAgPHRkPlBvc3RkZWNyZW1lbnQ8L3RkPgogICAgPHRkPjx0dD5pLS08L3R0PjwvdGQ+CiAgICA8dGQ+oDwvdGQ+CiAgICA8dGQ+Y29udmVydGlibGUgdG8gPHR0PmNvbnN0IFgmYW1wOzwvdHQ+PC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT4KPHA+CjwvcD48aHI+CjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgo8aDM+PGEgbmFtZT0iY29uY2VwdF9SYW5kb21BY2Nlc3NUcmF2ZXJzYWxJdGVyYXRvciI+PC9hPlJhbmRvbSBBY2Nlc3MgVHJhdmVyc2FsIApJdGVyYXRvciA8L2gzPkFuIGl0ZXJhdG9yIHRoYXQgcHJvdmlkZXMgY29uc3RhbnQtdGltZSBtZXRob2RzIGZvciBtb3ZpbmcgZm9yd2FyZCAKYW5kIGJhY2t3YXJkIGluIGFyYml0cmFyeS1zaXplZCBzdGVwcy4gCjxoMz5SZWZpbmVtZW50IG9mPC9oMz48YSBocmVmPSIjY29uY2VwdF9CaWRpcmVjdGlvbmFsVHJhdmVyc2FsSXRlcmF0b3IiPkJpZGlyZWN0aW9uYWwgClRyYXZlcnNhbCBJdGVyYXRvcjwvYT4gYW5kIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2dpLmNvbS90ZWNoL3N0bC9MZXNzVGhhbkNvbXBhcmFibGUuaHRtbCI+TGVzcyBUaGFuIApDb21wYXJhYmxlPC9hPiB3aGVyZSA8dHQ+Jmx0OzwvdHQ+IGlzIGEgdG90YWwgb3JkZXJpbmcgCjxoMz5Bc3NvY2lhdGVkIHR5cGVzPC9oMz4KPHRhYmxlIGJvcmRlcj0iMSI+CiAgPHRib2R5PgogIDx0cj4KICAgIDx0ZD5UcmF2ZXJzYWwgQ2F0ZWdvcnk8L3RkPgogICAgPHRkPjx0dD5zdGQ6OnRyYXZlcnNhbF9jYXRlZ29yeSZsdDtYJmd0Ozo6dHlwZTwvdHQ+PC90ZD4KICAgIDx0ZD5BIHR5cGUgY29udmVydGlibGUgdG8gPHR0PnN0ZDo6cmFuZG9tX2FjY2Vzc190cmF2ZXJzYWxfdGFnPC90dD4gCiAgPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT4KPGgzPlZhbGlkIGV4cHJlc3Npb25zPC9oMz4KPHRhYmxlIGJvcmRlcj0iMSI+CiAgPHRib2R5PgogIDx0cj4KICAgIDx0aD5OYW1lPC90aD4KICAgIDx0aD5FeHByZXNzaW9uPC90aD4KICAgIDx0aD5UeXBlIHJlcXVpcmVtZW50czwvdGg+CiAgICA8dGg+UmV0dXJuIHR5cGU8L3RoPjwvdHI+CiAgPHRyPgogICAgPHRkPkl0ZXJhdG9yIGFkZGl0aW9uPC90ZD4KICAgIDx0ZD48dHQ+aSArPSBuPC90dD48L3RkPgogICAgPHRkPqA8L3RkPgogICAgPHRkPjx0dD5YJmFtcDs8L3R0PjwvdGQ+PC90cj4KICA8dHI+CiAgICA8dGQ+SXRlcmF0b3IgYWRkaXRpb248L3RkPgogICAgPHRkPjx0dD5pICsgbjwvdHQ+IG9yIDx0dD5uICsgaTwvdHQ+PC90ZD4KICAgIDx0ZD6gPC90ZD4KICAgIDx0ZD48dHQ+WDwvdHQ+PC90ZD48L3RyPgogIDx0cj4KICAgIDx0ZD5JdGVyYXRvciBzdWJ0cmFjdGlvbjwvdGQ+CiAgICA8dGQ+PHR0PmkgLT0gbjwvdHQ+PC90ZD4KICAgIDx0ZD6gPC90ZD4KICAgIDx0ZD48dHQ+WCZhbXA7PC90dD48L3RkPjwvdHI+CiAgPHRyPgogICAgPHRkPkl0ZXJhdG9yIHN1YnRyYWN0aW9uPC90ZD4KICAgIDx0ZD48dHQ+aSAtIG48L3R0PjwvdGQ+CiAgICA8dGQ+oDwvdGQ+CiAgICA8dGQ+PHR0Plg8L3R0PjwvdGQ+PC90cj4KICA8dHI+CiAgICA8dGQ+RGlmZmVyZW5jZTwvdGQ+CiAgICA8dGQ+PHR0PmkgLSBqPC90dD48L3RkPgogICAgPHRkPqA8L3RkPgogICAgPHRkPjx0dD5zdGQ6Oml0ZXJhdG9yX3RyYWl0cyZsdDtYJmd0Ozo6ZGlmZmVyZW5jZV90eXBlPC90dD48L3RkPjwvdHI+CiAgPHRyPgogICAgPHRkPkVsZW1lbnQgb3BlcmF0b3I8L3RkPgogICAgPHRkPjx0dD5pW25dPC90dD48L3RkPgogICAgPHRkPjx0dD5YPC90dD4gbXVzdCBhbHNvIGJlIGEgbW9kZWwgb2YgPGEgaHJlZj0iI2NvbmNlcHRfUmVhZGFibGVJdGVyYXRvciI+UmVhZGFibGUgCiAgICAgIEl0ZXJhdG9yPC9hPi4gPC90ZD4KICAgIDx0ZD48dHQ+c3RkOjppdGVyYXRvcl90cmFpdHMmbHQ7WCZndDs6OnJlZmVyZW5jZTwvdHQ+PC90ZD48L3RyPgogIDx0cj4KICAgIDx0ZD5FbGVtZW50IGFzc2lnbm1lbnQ8L3RkPgogICAgPHRkPjx0dD5pW25dID0gdDwvdHQ+PC90ZD4KICAgIDx0ZD48dHQ+WDwvdHQ+IG11c3QgYWxzbyBiZSBhIG1vZGVsIG9mIDxhIGhyZWY9IiNjb25jZXB0X1dyaXRhYmxlSXRlcmF0b3IiPldyaXRhYmxlIAogICAgICBJdGVyYXRvcjwvYT4uPC90ZD4KICAgIDx0ZD51bnNwZWNpZmllZDwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+CjxwPgo8L3A+PGhyPgo8IS0tICBMb2NhbFdvcmRzOiAgSFRNTCBCR0NPTE9SIEZGRkZGRiBUUiBURCBTaWVrIEhSRUYgbWFpbHRvIGpzaWVrCgogLS0+PCEtLSAgTG9jYWxXb3JkczogIGxzYyBlZHUgdHQgY29uc3QgaHJlZiBodHRwIGFudWJpcyBka3V1ZyBkayBKVEMgU0MgV0cgZG9jcyBsdAoKIC0tPjwhLS0gIExvY2FsV29yZHM6ICBsd2cgaHRtbCBib29sIGd0IFN1dHRlcidzIGh0bSBMdmFsdWUgbmFtZXNwYWNlIHN0ZCBzdHJ1Y3QKCiAtLT48IS0tICBMb2NhbFdvcmRzOiAgbHZhbHVlIHR5cGVuYW1lIE9sZFRyYWl0cyByZXVzYWJpbGl0eSBtaW4gaXRlciBwcmV2IGlucGxhY2UKCiAtLT48IS0tICBMb2NhbFdvcmRzOiAgcnZhbHVlIHRlbXBsYXRlZCBQcmVpbmNyZW1lbnQgUG9zdGluY3JlbWVudCBQcmVkZWNyZW1lbnQKCiAtLT48IS0tICBMb2NhbFdvcmRzOiAgUG9zdGRlY3JlbWVudAoKIC0tPjwvYm9keT48L2h0bWw+Cg==