PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIj4KPHRpdGxlPmluZnJhc3RydVF0dXJlIMK3IFRoZSBXb3JsZCBNb2RlbDwvdGl0bGU+CjxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJSb2JvdHMgYXJlIGxlYXJuaW5nIHRoZSB3b3JsZC4gV2UgdGVhY2ggdGhlbSB5b3Vycy4gQSB3b3JraW5nIGNvbmNlcHQgZm9yIHRoZSBob21lIHRoYXQgdW5kZXJzdGFuZHMgaXRzZWxmLCB3aXRoIGEgaHVtYW4gYWx3YXlzIGluIGNoYXJnZS4iPgo8bWV0YSBuYW1lPSJ0aGVtZS1jb2xvciIgY29udGVudD0iIzA3MTAxRiI+CjxzdHlsZT4KQGltcG9ydCB1cmwoJ2h0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9SW50ZXI6d2dodEA0MDA7NTAwOzYwMDs3MDAmZmFtaWx5PUludGVyK1RpZ2h0OndnaHRANTAwOzYwMDs3MDA7ODAwJmZhbWlseT1HZWlzdCtNb25vOndnaHRANDAwOzUwMCZkaXNwbGF5PXN3YXAnKTsKCjpyb290IHsKICAtLXBhcGVyOiAgICAgI0ZCRkNGRTsKICAtLXBhcGVyLTI6ICAgI0YyRjVGQTsKICAtLXJ1bGU6ICAgICAgI0U0RTlGMjsKICAtLXJ1bGUtMjogICAgI0Q2RENFNzsKICAtLWluazogICAgICAgIzA3MTAxRjsKICAtLWluay0yOiAgICAgIzFBMjc0MDsKICAtLXN0ZWVsOiAgICAgIzVDNkI4NTsKICAtLXN0ZWVsLTI6ICAgIzhBOTVBODsKICAtLWhhbG86ICAgICAgIzRGOENGRjsKICAtLWhhbG8tMjogICAgIzZGQTdGRjsKICAtLWhhbG8tZGVlcDogIzJDNUJFMDsKICAtLWhhbG8tc29mdDogI0RDRThGRjsKICAtLWlyaS1hOiAgICAgI0IxOUJGRjsKICAtLWlyaS1jOiAgICAgIzkyRTVGRjsKICAtLXNpZ25hbDogICAgI0Y0QTExQzsKICAtLWdvb2Q6ICAgICAgIzM2QzI4QjsKICAtLXdhcm46ICAgICAgI0Y0QTExQzsKICAtLWJnLWludmVydGVkOiAjMDcxMDFGOwogIC0tZmctaW52ZXJ0ZWQ6ICNGQkZDRkU7Cn0KCiogeyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB9Cmh0bWwgeyBjb2xvci1zY2hlbWU6IGxpZ2h0OyAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7IH0KYm9keSB7CiAgbWFyZ2luOiAwOyBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlcik7IGNvbG9yOiB2YXIoLS1pbmspOwogIGZvbnQtZmFtaWx5OiAnSW50ZXInLCBzeXN0ZW0tdWksIHNhbnMtc2VyaWY7CiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7IGxpbmUtaGVpZ2h0OiAxLjU7Cn0KYSB7IGNvbG9yOiBpbmhlcml0OyB9Ci5zaGVsbCB7IG1heC13aWR0aDogMTE4MHB4OyBtYXJnaW46IDAgYXV0bzsgcGFkZGluZzogMCAyOHB4OyB9CgovKiA9PT09PT09PT09PT0gTkFWID09PT09PT09PT09PSAqLwpuYXYgewogIHBvc2l0aW9uOiBzdGlja3k7IHRvcDogMDsgei1pbmRleDogNjA7CiAgYmFja2dyb3VuZDogcmdiYSgyNTEsMjUyLDI1NCwuODIpOyBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTRweCk7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXJ1bGUpOwp9Ci5uYXYtaW4geyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGhlaWdodDogNjRweDsgfQouYnJhbmQgeyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7IGZvbnQtZmFtaWx5OiAnSW50ZXIgVGlnaHQnOyBmb250LXdlaWdodDogNzAwOyBmb250LXNpemU6IDE4cHg7IGxldHRlci1zcGFjaW5nOiAtLjAyZW07IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQouYnJhbmQgLnEgeyBjb2xvcjogdmFyKC0taGFsby1kZWVwKTsgfQouYnJhbmQtZG90IHsgd2lkdGg6IDI2cHg7IGhlaWdodDogMjZweDsgYm9yZGVyLXJhZGl1czogNTAlOyBiYWNrZ3JvdW5kOiByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDM1JSAzMCUsIHZhcigtLWhhbG8tMiksIHZhcigtLWhhbG8tZGVlcCkpOyBib3gtc2hhZG93OiAwIDAgMCA0cHggdmFyKC0taGFsby1zb2Z0KTsgfQoubmF2LWJhY2sgeyBmb250LXNpemU6IDEzLjVweDsgY29sb3I6IHZhcigtLXN0ZWVsKTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA3cHg7IHBhZGRpbmc6IDhweCAxNHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ydWxlLTIpOyBib3JkZXItcmFkaXVzOiA5OTlweDsgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIC4xNXMsIGNvbG9yIC4xNXM7IH0KLm5hdi1iYWNrOmhvdmVyIHsgY29sb3I6IHZhcigtLWluayk7IGJvcmRlci1jb2xvcjogdmFyKC0taW5rKTsgfQoKLyogPT09PT09PT09PT09IEhFUk8gPT09PT09PT09PT09ICovCi5oZXJvIHsgcGFkZGluZzogOTJweCAwIDU2cHg7IH0KLmV5ZWJyb3cgewogIGZvbnQtZmFtaWx5OiAnR2Vpc3QgTW9ubycsIG1vbm9zcGFjZTsgZm9udC1zaXplOiAxMS41cHg7IGxldHRlci1zcGFjaW5nOiAuMTRlbTsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyBjb2xvcjogdmFyKC0taGFsby1kZWVwKTsgbWFyZ2luOiAwIDAgMjBweDsKICBkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA5cHg7Cn0KLmV5ZWJyb3cgLnBpcCB7IHdpZHRoOiA3cHg7IGhlaWdodDogN3B4OyBib3JkZXItcmFkaXVzOiA1MCU7IGJhY2tncm91bmQ6IHZhcigtLWhhbG8pOyBib3gtc2hhZG93OiAwIDAgMCA0cHggdmFyKC0taGFsby1zb2Z0KTsgYW5pbWF0aW9uOiBwdWxzZSAyLjRzIGVhc2UtaW4tb3V0IGluZmluaXRlOyB9CkBrZXlmcmFtZXMgcHVsc2UgeyAwJSwxMDAlIHsgb3BhY2l0eTogMTsgfSA1MCUgeyBvcGFjaXR5OiAuMzU7IH0gfQouaGVybyBoMSB7CiAgZm9udC1mYW1pbHk6ICdJbnRlciBUaWdodCc7IGZvbnQtd2VpZ2h0OiA3MDA7IGxldHRlci1zcGFjaW5nOiAtLjAzNWVtOwogIGZvbnQtc2l6ZTogY2xhbXAoMzhweCwgNi40dncsIDc4cHgpOyBsaW5lLWhlaWdodDogLjk4OyBtYXJnaW46IDAgMCAyNnB4OyBtYXgtd2lkdGg6IDE2Y2g7CiAgdGV4dC13cmFwOiBiYWxhbmNlOwp9Ci5oZXJvIGgxIC5ncmFkIHsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEwMmRlZywgdmFyKC0taGFsby1kZWVwKSwgdmFyKC0taXJpLWEpIDYwJSwgdmFyKC0taXJpLWMpKTsgLXdlYmtpdC1iYWNrZ3JvdW5kLWNsaXA6IHRleHQ7IGJhY2tncm91bmQtY2xpcDogdGV4dDsgY29sb3I6IHRyYW5zcGFyZW50OyB9Ci5oZXJvLXN1YiB7IGZvbnQtc2l6ZTogY2xhbXAoMTdweCwgMnZ3LCAyMHB4KTsgY29sb3I6IHZhcigtLWluay0yKTsgbWF4LXdpZHRoOiA2MmNoOyBtYXJnaW46IDA7IGxpbmUtaGVpZ2h0OiAxLjU1OyB9Ci5oZXJvLXN1YiBzdHJvbmcgeyBjb2xvcjogdmFyKC0taW5rKTsgZm9udC13ZWlnaHQ6IDYwMDsgfQoKLyogPT09PT09PT09PT09IFNFQ1RJT04gU0NBRkZPTEQgPT09PT09PT09PT09ICovCi5ibG9jayB7IHBhZGRpbmc6IDcycHggMDsgfQouc2VjLWV5ZWJyb3cgeyBmb250LWZhbWlseTogJ0dlaXN0IE1vbm8nLCBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMTEuNXB4OyBsZXR0ZXItc3BhY2luZzogLjE0ZW07IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGNvbG9yOiB2YXIoLS1zdGVlbCk7IG1hcmdpbjogMCAwIDE0cHg7IH0KLnNlYy1oIHsgZm9udC1mYW1pbHk6ICdJbnRlciBUaWdodCc7IGZvbnQtd2VpZ2h0OiA3MDA7IGxldHRlci1zcGFjaW5nOiAtLjAzZW07IGZvbnQtc2l6ZTogY2xhbXAoMjhweCwgNHZ3LCA0NnB4KTsgbGluZS1oZWlnaHQ6IDEuMDQ7IG1hcmdpbjogMCAwIDE2cHg7IHRleHQtd3JhcDogYmFsYW5jZTsgfQouc2VjLWxlZGUgeyBmb250LXNpemU6IGNsYW1wKDE2cHgsIDEuOHZ3LCAxOXB4KTsgY29sb3I6IHZhcigtLWluay0yKTsgbWF4LXdpZHRoOiA2NGNoOyBtYXJnaW46IDA7IGxpbmUtaGVpZ2h0OiAxLjU1OyB9CgovKiA9PT09PT09PT09PT0gVEhFIFNUQUdFIChpbnRlcmFjdGl2ZSkgPT09PT09PT09PT09ICovCi5zdGFnZS13cmFwIHsgbWFyZ2luLXRvcDogMzhweDsgfQouc3RhZ2UgewogIGJhY2tncm91bmQ6IHZhcigtLWJnLWludmVydGVkKTsgY29sb3I6IHZhcigtLWZnLWludmVydGVkKTsKICBib3JkZXItcmFkaXVzOiAyNnB4OyBvdmVyZmxvdzogaGlkZGVuOwogIGJveC1zaGFkb3c6IDAgMXB4IDJweCByZ2JhKDcsMTYsMzEsLjUpLCAwIDQwcHggOTBweCAtNDBweCByZ2JhKDcsMTYsMzEsLjU1KSwgMCAxMHB4IDQwcHggLTE2cHggcmdiYSg3OSwxNDAsMjU1LC4yOCk7CiAgZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxLjU1ZnIgMWZyOwp9CkBtZWRpYSAobWF4LXdpZHRoOiA4ODBweCkgeyAuc3RhZ2UgeyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsgfSB9Cgouc3RhZ2UtY2FudmFzIHsgcG9zaXRpb246IHJlbGF0aXZlOyBiYWNrZ3JvdW5kOgogIHJhZGlhbC1ncmFkaWVudCgxMjAlIDkwJSBhdCAzMCUgMCUsIHJnYmEoNzksMTQwLDI1NSwuMTIpLCB0cmFuc3BhcmVudCA2MCUpLAogIGxpbmVhci1ncmFkaWVudCgxODBkZWcsICMwQTEzMjIsICMwNzBEMTgpOyBwYWRkaW5nOiAxOHB4OyB9Ci5zdGFnZS1jYW52YXMgc3ZnIHsgd2lkdGg6IDEwMCU7IGhlaWdodDogYXV0bzsgZGlzcGxheTogYmxvY2s7IGJvcmRlci1yYWRpdXM6IDE0cHg7IH0KCi5zdGFnZS10YWcgeyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMzBweDsgbGVmdDogMzBweDsgei1pbmRleDogNDsgZm9udC1mYW1pbHk6ICdHZWlzdCBNb25vJywgbW9ub3NwYWNlOyBmb250LXNpemU6IDEwLjVweDsgbGV0dGVyLXNwYWNpbmc6IC4xMmVtOyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyBjb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwuNSk7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyB9Ci5zdGFnZS10YWcgLmxpdmUgeyB3aWR0aDogN3B4OyBoZWlnaHQ6IDdweDsgYm9yZGVyLXJhZGl1czogNTAlOyBiYWNrZ3JvdW5kOiB2YXIoLS1nb29kKTsgYm94LXNoYWRvdzogMCAwIDAgNHB4IHJnYmEoNTQsMTk0LDEzOSwuMTgpOyBhbmltYXRpb246IHB1bHNlIDJzIGluZmluaXRlOyB9CgovKiB3b3JsZCBnZW9tZXRyeSAqLwoudy1sb3QgICB7IGZpbGw6ICMxNjM2MWY7IH0KLnctbG90LTIgeyBmaWxsOiAjMTQzMDE4OyB9Ci53LWhvdXNlIHsgZmlsbDogIzFiMjc0MDsgc3Ryb2tlOiAjMzg1MDdmOyBzdHJva2Utd2lkdGg6IDI7IH0KLnctcm9vbSAgeyBzdHJva2U6ICMyYTNjNjM7IHN0cm9rZS13aWR0aDogMS40OyBmaWxsOiBub25lOyB9Ci53LXJvb21maWxsIHsgZmlsbDogcmdiYSg3OSwxNDAsMjU1LC4wNSk7IH0KLnctZHJpdmUgeyBmaWxsOiAjMjMyYjNiOyB9Ci53LXRyZWUgIHsgZmlsbDogIzFmN2EzZTsgc3Ryb2tlOiAjMmZhZjViOyBzdHJva2Utd2lkdGg6IDEuNTsgfQoudy1iZWQgICB7IGZpbGw6ICM1YTNhNmI7IHN0cm9rZTogIzhkNWJhNjsgc3Ryb2tlLXdpZHRoOiAxLjM7IG9wYWNpdHk6IC44NTsgfQoudy1wYXRpbyB7IGZpbGw6ICMyYTMxNDI7IHN0cm9rZTogIzNkNDY1ZDsgc3Ryb2tlLXdpZHRoOiAxLjI7IH0KLnctbGFiZWwgeyBmb250LWZhbWlseTogJ0dlaXN0IE1vbm8nLCBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMTFweDsgZmlsbDogcmdiYSgyNTUsMjU1LDI1NSwuMzQpOyBsZXR0ZXItc3BhY2luZzogLjA0ZW07IH0KLnctb2JqbGFiZWwgeyBmb250LWZhbWlseTogJ0dlaXN0IE1vbm8nLCBtb25vc3BhY2U7IGZvbnQtc2l6ZTogOS41cHg7IGZpbGw6IHJnYmEoMjU1LDI1NSwyNTUsLjQyKTsgfQoudy1nYXRlICB7IHN0cm9rZTogdmFyKC0tc2lnbmFsKTsgc3Ryb2tlLXdpZHRoOiAyLjU7IHN0cm9rZS1kYXNoYXJyYXk6IDQgNDsgfQoKLmRldiB7IGZpbGw6IHZhcigtLWhhbG8pOyB9Ci5kZXYtcmluZyB7IGZpbGw6IG5vbmU7IHN0cm9rZTogdmFyKC0taGFsbyk7IHN0cm9rZS13aWR0aDogMS40OyBvcGFjaXR5OiAuNTsgfQouZGV2LXB1bHNlIHsgZmlsbDogbm9uZTsgc3Ryb2tlOiB2YXIoLS1oYWxvKTsgc3Ryb2tlLXdpZHRoOiAxLjI7IHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlcjsgfQoKI3ByZWRpY3RlZCB7IGZpbGw6IG5vbmU7IHN0cm9rZTogdmFyKC0taGFsby0yKTsgc3Ryb2tlLXdpZHRoOiAyLjQ7IHN0cm9rZS1kYXNoYXJyYXk6IDcgNzsgb3BhY2l0eTogLjg7IH0KI3RyYWlsIHsgZmlsbDogbm9uZTsgc3Ryb2tlOiB1cmwoI3RyYWlsZ3JhZCk7IHN0cm9rZS13aWR0aDogMy42OyBzdHJva2UtbGluZWNhcDogcm91bmQ7IH0KCi5yb2JvdC1ib2R5IHsgZmlsbDogI2ZmZjsgc3Ryb2tlOiB2YXIoLS1oYWxvLWRlZXApOyBzdHJva2Utd2lkdGg6IDI7IH0KLnJvYm90LWV5ZSB7IGZpbGw6IHZhcigtLWhhbG8tZGVlcCk7IH0KLnJvYm90LWhhbG8geyBmaWxsOiBub25lOyBzdHJva2U6IHZhcigtLWhhbG8tMik7IHN0cm9rZS13aWR0aDogMS41OyBvcGFjaXR5OiAuNjsgfQoKLmRvY2sgeyBmaWxsOiBub25lOyBzdHJva2U6IHJnYmEoMjU1LDI1NSwyNTUsLjMpOyBzdHJva2Utd2lkdGg6IDEuNjsgc3Ryb2tlLWRhc2hhcnJheTogMyA0OyB9Ci5kb2NrLWxhYmVsIHsgZm9udC1mYW1pbHk6ICdHZWlzdCBNb25vJywgbW9ub3NwYWNlOyBmb250LXNpemU6IDlweDsgZmlsbDogcmdiYSgyNTUsMjU1LDI1NSwuNCk7IH0KCi8qIHVua25vd24gb2JqZWN0ICovCi51bmtub3duIHsgb3BhY2l0eTogMDsgdHJhbnNpdGlvbjogb3BhY2l0eSAuNHM7IH0KLnVua25vd24uc2hvdyB7IG9wYWNpdHk6IDE7IH0KLnVua25vd24tYm94IHsgZmlsbDogcmdiYSgyNDQsMTYxLDI4LC4xNik7IHN0cm9rZTogdmFyKC0tc2lnbmFsKTsgc3Ryb2tlLXdpZHRoOiAyOyBzdHJva2UtZGFzaGFycmF5OiA1IDQ7IH0KLnVua25vd24tcSB7IGZpbGw6IHZhcigtLXNpZ25hbCk7IGZvbnQtZmFtaWx5OiAnSW50ZXIgVGlnaHQnOyBmb250LXdlaWdodDogNzAwOyBmb250LXNpemU6IDIwcHg7IHRleHQtYW5jaG9yOiBtaWRkbGU7IH0KCi8qID09PT09PT09PT09PSBSRUFTT05JTkcgUEFORUwgPT09PT09PT09PT09ICovCi5wYW5lbCB7IGJhY2tncm91bmQ6ICMwYzEzMjI7IGJvcmRlci1sZWZ0OiAxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuMDgpOyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBwYWRkaW5nOiAyMnB4OyBnYXA6IDE2cHg7IHBvc2l0aW9uOiByZWxhdGl2ZTsgbWluLWhlaWdodDogNTIwcHg7IH0KLnBhbmVsLWggeyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IH0KLnBhbmVsLXRpdGxlIHsgZm9udC1mYW1pbHk6ICdJbnRlciBUaWdodCc7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMTRweDsgY29sb3I6ICNmZmY7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOXB4OyB9Ci5wYW5lbC10aXRsZSBzdmcgeyBjb2xvcjogdmFyKC0taGFsby0yKTsgfQouY29uZiB7IHRleHQtYWxpZ246IHJpZ2h0OyB9Ci5jb25mLW51bSB7IGZvbnQtZmFtaWx5OiAnR2Vpc3QgTW9ubycsIG1vbm9zcGFjZTsgZm9udC1zaXplOiAyMnB4OyBmb250LXdlaWdodDogNTAwOyBjb2xvcjogdmFyKC0tZ29vZCk7IGxpbmUtaGVpZ2h0OiAxOyB0cmFuc2l0aW9uOiBjb2xvciAuM3M7IH0KLmNvbmYtbnVtLmxvdyB7IGNvbG9yOiB2YXIoLS13YXJuKTsgfQouY29uZi1sYmwgeyBmb250LWZhbWlseTogJ0dlaXN0IE1vbm8nLCBtb25vc3BhY2U7IGZvbnQtc2l6ZTogOXB4OyBsZXR0ZXItc3BhY2luZzogLjEyZW07IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LC40KTsgbWFyZ2luLXRvcDogM3B4OyB9CgoudGFza3MgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDhweDsgfQoudGFza3MtbGJsIHsgZm9udC1mYW1pbHk6ICdHZWlzdCBNb25vJywgbW9ub3NwYWNlOyBmb250LXNpemU6IDkuNXB4OyBsZXR0ZXItc3BhY2luZzogLjEyZW07IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LC40KTsgbWFyZ2luLWJvdHRvbTogMnB4OyB9Ci50YXNrLWJ0biB7CiAgdGV4dC1hbGlnbjogbGVmdDsgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwuMDQpOyBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LC4xKTsKICBjb2xvcjogI2ZmZjsgcGFkZGluZzogMTJweCAxNHB4OyBib3JkZXItcmFkaXVzOiAxMnB4OyBjdXJzb3I6IHBvaW50ZXI7CiAgZm9udC1mYW1pbHk6ICdJbnRlcic7IGZvbnQtc2l6ZTogMTMuNXB4OyBmb250LXdlaWdodDogNTAwOwogIGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTFweDsgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIC4xNXMsIGJhY2tncm91bmQgLjE1cywgdHJhbnNmb3JtIC4xczsKfQoudGFzay1idG46aG92ZXIgeyBib3JkZXItY29sb3I6IHZhcigtLWhhbG8pOyBiYWNrZ3JvdW5kOiByZ2JhKDc5LDE0MCwyNTUsLjEpOyB9Ci50YXNrLWJ0bjphY3RpdmUgeyB0cmFuc2Zvcm06IHNjYWxlKC45OSk7IH0KLnRhc2stYnRuLmlzLWFjdGl2ZSB7IGJvcmRlci1jb2xvcjogdmFyKC0taGFsbyk7IGJhY2tncm91bmQ6IHJnYmEoNzksMTQwLDI1NSwuMTYpOyB9Ci50YXNrLWJ0biAuaWMgeyB3aWR0aDogMzBweDsgaGVpZ2h0OiAzMHB4OyBib3JkZXItcmFkaXVzOiA4cHg7IGJhY2tncm91bmQ6IHJnYmEoNzksMTQwLDI1NSwuMTYpOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgZmxleC1zaHJpbms6IDA7IGNvbG9yOiB2YXIoLS1oYWxvLTIpOyB9Ci50YXNrLWJ0biAuc3ViIHsgZGlzcGxheTogYmxvY2s7IGZvbnQtc2l6ZTogMTFweDsgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsLjQ1KTsgbWFyZ2luLXRvcDogMXB4OyBmb250LXdlaWdodDogNDAwOyB9CgoubG9nIHsgZmxleDogMTsgb3ZlcmZsb3c6IGhpZGRlbjsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA3cHg7IGZvbnQtZmFtaWx5OiAnR2Vpc3QgTW9ubycsIG1vbm9zcGFjZTsgZm9udC1zaXplOiAxMS41cHg7IGxpbmUtaGVpZ2h0OiAxLjQ1OyB9Ci5sb2ctbGluZSB7IGNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LC42Mik7IGRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoNHB4KTsgYW5pbWF0aW9uOiBsb2dJbiAuM3MgZm9yd2FyZHM7IH0KLmxvZy1saW5lIC50IHsgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsLjI4KTsgZmxleC1zaHJpbms6IDA7IH0KLmxvZy1saW5lLndhcm4geyBjb2xvcjogdmFyKC0td2Fybik7IH0KLmxvZy1saW5lLmh1bWFuIHsgY29sb3I6IHZhcigtLWhhbG8tMik7IH0KLmxvZy1saW5lLm9rIHsgY29sb3I6IHZhcigtLWdvb2QpOyB9CkBrZXlmcmFtZXMgbG9nSW4geyB0byB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogbm9uZTsgfSB9Ci5sb2ctZW1wdHkgeyBjb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwuMzIpOyBmb250LWZhbWlseTogJ0ludGVyJzsgZm9udC1zaXplOiAxM3B4OyBsaW5lLWhlaWdodDogMS41OyBtYXJnaW46IGF1dG8gMDsgfQoKLyogaHVtYW4gY2hlY2twb2ludCBjYXJkICovCi5jaGVja3BvaW50IHsKICBwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IDE2cHg7IHJpZ2h0OiAxNnB4OyBib3R0b206IDE2cHg7IHotaW5kZXg6IDg7CiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgIzE0MjE0MiwgIzBkMTgyZik7CiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0taGFsbyk7IGJvcmRlci1yYWRpdXM6IDE2cHg7IHBhZGRpbmc6IDE2cHg7CiAgYm94LXNoYWRvdzogMCAtOHB4IDQwcHggLTEwcHggcmdiYSgwLDAsMCwuNik7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxNDAlKTsgdHJhbnNpdGlvbjogdHJhbnNmb3JtIC4zNXMgY3ViaWMtYmV6aWVyKC4yLC44LC4yLDEpOwp9Ci5jaGVja3BvaW50LnNob3cgeyB0cmFuc2Zvcm06IG5vbmU7IH0KLmNwLWhlYWQgeyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7IG1hcmdpbi1ib3R0b206IDlweDsgfQouY3AtbW9ubyB7IHdpZHRoOiAzNHB4OyBoZWlnaHQ6IDM0cHg7IGJvcmRlci1yYWRpdXM6IDUwJTsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgdmFyKC0taGFsbyksIHZhcigtLWluaykpOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgZm9udC1mYW1pbHk6ICdJbnRlciBUaWdodCc7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMTNweDsgY29sb3I6ICNmZmY7IGZsZXgtc2hyaW5rOiAwOyB9Ci5jcC13aG8geyBmb250LWZhbWlseTogJ0ludGVyIFRpZ2h0JzsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAxMy41cHg7IGNvbG9yOiAjZmZmOyB9Ci5jcC1yb2xlIHsgZm9udC1mYW1pbHk6ICdHZWlzdCBNb25vJywgbW9ub3NwYWNlOyBmb250LXNpemU6IDkuNXB4OyBsZXR0ZXItc3BhY2luZzogLjFlbTsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgY29sb3I6IHZhcigtLWhhbG8tMik7IG1hcmdpbi10b3A6IDFweDsgfQouY3AtcSB7IGZvbnQtc2l6ZTogMTNweDsgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsLjgpOyBsaW5lLWhlaWdodDogMS40NTsgbWFyZ2luOiAwIDAgMTJweDsgfQouY3Atcm93IHsgZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IH0KLmNwLWJ0biB7IGZsZXg6IDE7IGJhY2tncm91bmQ6IHZhcigtLWhhbG8pOyBjb2xvcjogI2ZmZjsgYm9yZGVyOiAwOyBwYWRkaW5nOiAxMHB4OyBib3JkZXItcmFkaXVzOiAxMHB4OyBmb250LWZhbWlseTogJ0ludGVyJzsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAxM3B4OyBjdXJzb3I6IHBvaW50ZXI7IHRyYW5zaXRpb246IGJhY2tncm91bmQgLjE1czsgfQouY3AtYnRuOmhvdmVyIHsgYmFja2dyb3VuZDogdmFyKC0taGFsby1kZWVwKTsgfQouY3AtYnRuLmFsdCB7IGZsZXg6IDAgMCBhdXRvOyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LC4wNik7IGNvbG9yOiAjZmZmOyBwYWRkaW5nOiAxMHB4IDE0cHg7IH0KLmNwLWJ0bi5hbHQ6aG92ZXIgeyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LC4xMik7IH0KLmNwLWF1dG8geyBmb250LWZhbWlseTogJ0dlaXN0IE1vbm8nLCBtb25vc3BhY2U7IGZvbnQtc2l6ZTogOS41cHg7IGNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LC40KTsgbWFyZ2luLXRvcDogOXB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IH0KCi8qIG1vZGVsIHN0YXRzIHN0cmlwICovCi5tb2RlbGJhciB7IGRpc3BsYXk6IGZsZXg7IGdhcDogMDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsLjA3KTsgcGFkZGluZy10b3A6IDE0cHg7IH0KLm1vZGVsYmFyIC5tIHsgZmxleDogMTsgdGV4dC1hbGlnbjogY2VudGVyOyBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LC4wNyk7IH0KLm1vZGVsYmFyIC5tOmxhc3QtY2hpbGQgeyBib3JkZXItcmlnaHQ6IDA7IH0KLm1vZGVsYmFyIC5tdiB7IGZvbnQtZmFtaWx5OiAnR2Vpc3QgTW9ubycsIG1vbm9zcGFjZTsgZm9udC1zaXplOiAxNXB4OyBjb2xvcjogI2ZmZjsgfQoubW9kZWxiYXIgLm1sIHsgZm9udC1mYW1pbHk6ICdHZWlzdCBNb25vJywgbW9ub3NwYWNlOyBmb250LXNpemU6IDguNXB4OyBsZXR0ZXItc3BhY2luZzogLjFlbTsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsLjQpOyBtYXJnaW4tdG9wOiAzcHg7IH0KCi5zdGFnZS1jYXAgeyBmb250LXNpemU6IDEzcHg7IGNvbG9yOiB2YXIoLS1zdGVlbCk7IG1hcmdpbjogMTZweCAycHggMDsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IH0KLnN0YWdlLWNhcCBzdmcgeyBmbGV4LXNocmluazogMDsgY29sb3I6IHZhcigtLWhhbG8tZGVlcCk7IH0KCi8qID09PT09PT09PT09PSBUV08tQ09MVU1OIENPTVBBUkUgPT09PT09PT09PT09ICovCi5jb21wYXJlIHsgZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDIwcHg7IG1hcmdpbi10b3A6IDQwcHg7IH0KQG1lZGlhIChtYXgtd2lkdGg6IDc2MHB4KSB7IC5jb21wYXJlIHsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7IH0gfQouY21wLWNhcmQgeyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ydWxlKTsgYm9yZGVyLXJhZGl1czogMjBweDsgcGFkZGluZzogMjhweDsgYmFja2dyb3VuZDogdmFyKC0tcGFwZXIpOyB9Ci5jbXAtY2FyZC53b3JsZCB7IGJhY2tncm91bmQ6IHZhcigtLWJnLWludmVydGVkKTsgY29sb3I6IHZhcigtLWZnLWludmVydGVkKTsgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDsgfQouY21wLWtpY2tlciB7IGZvbnQtZmFtaWx5OiAnR2Vpc3QgTW9ubycsIG1vbm9zcGFjZTsgZm9udC1zaXplOiAxMC41cHg7IGxldHRlci1zcGFjaW5nOiAuMTJlbTsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgY29sb3I6IHZhcigtLXN0ZWVsKTsgbWFyZ2luOiAwIDAgMTRweDsgfQouY21wLWNhcmQud29ybGQgLmNtcC1raWNrZXIgeyBjb2xvcjogdmFyKC0taGFsby0yKTsgfQouY21wLWggeyBmb250LWZhbWlseTogJ0ludGVyIFRpZ2h0JzsgZm9udC13ZWlnaHQ6IDcwMDsgZm9udC1zaXplOiAyM3B4OyBsZXR0ZXItc3BhY2luZzogLS4wMmVtOyBtYXJnaW46IDAgMCAxMHB4OyB9Ci5jbXAtcCB7IGZvbnQtc2l6ZTogMTVweDsgbGluZS1oZWlnaHQ6IDEuNTU7IGNvbG9yOiB2YXIoLS1pbmstMik7IG1hcmdpbjogMCAwIDE4cHg7IH0KLmNtcC1jYXJkLndvcmxkIC5jbXAtcCB7IGNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LC43Mik7IH0KLmNtcC1lZyB7IGZvbnQtZmFtaWx5OiAnR2Vpc3QgTW9ubycsIG1vbm9zcGFjZTsgZm9udC1zaXplOiAxMnB4OyBsaW5lLWhlaWdodDogMS41OyBwYWRkaW5nOiAxNHB4OyBib3JkZXItcmFkaXVzOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci0yKTsgY29sb3I6IHZhcigtLWluay0yKTsgfQouY21wLWNhcmQud29ybGQgLmNtcC1lZyB7IGJhY2tncm91bmQ6IHJnYmEoMjU1LDI1NSwyNTUsLjA1KTsgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsLjcpOyB9Ci5jbXAtZWcgYiB7IGNvbG9yOiB2YXIoLS1oYWxvLWRlZXApOyBmb250LXdlaWdodDogNTAwOyB9Ci5jbXAtY2FyZC53b3JsZCAuY21wLWVnIGIgeyBjb2xvcjogdmFyKC0taGFsby0yKTsgfQoKLyogPT09PT09PT09PT09IFNURVBTID09PT09PT09PT09PSAqLwouc3RlcHMgeyBkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgzLCAxZnIpOyBnYXA6IDE4cHg7IG1hcmdpbi10b3A6IDM4cHg7IH0KQG1lZGlhIChtYXgtd2lkdGg6IDgyMHB4KSB7IC5zdGVwcyB7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOyB9IH0KLnN0ZXAgeyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ydWxlKTsgYm9yZGVyLXJhZGl1czogMThweDsgcGFkZGluZzogMjZweDsgYmFja2dyb3VuZDogdmFyKC0tcGFwZXIpOyB9Ci5zdGVwLW4geyBmb250LWZhbWlseTogJ0dlaXN0IE1vbm8nLCBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMTJweDsgY29sb3I6IHZhcigtLWhhbG8tZGVlcCk7IG1hcmdpbi1ib3R0b206IDE0cHg7IH0KLnN0ZXAtaCB7IGZvbnQtZmFtaWx5OiAnSW50ZXIgVGlnaHQnOyBmb250LXdlaWdodDogNzAwOyBmb250LXNpemU6IDE5cHg7IGxldHRlci1zcGFjaW5nOiAtLjAyZW07IG1hcmdpbjogMCAwIDhweDsgfQouc3RlcC1wIHsgZm9udC1zaXplOiAxNC41cHg7IGxpbmUtaGVpZ2h0OiAxLjU1OyBjb2xvcjogdmFyKC0taW5rLTIpOyBtYXJnaW46IDA7IH0KCi8qID09PT09PT09PT09PSBQSVRGQUxMUyA9PT09PT09PT09PT0gKi8KLnBpdGZhbGxzIHsgYmFja2dyb3VuZDogdmFyKC0tYmctaW52ZXJ0ZWQpOyBjb2xvcjogdmFyKC0tZmctaW52ZXJ0ZWQpOyB9Ci5wZi1ncmlkIHsgZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMiwgMWZyKTsgZ2FwOiAxNnB4OyBtYXJnaW4tdG9wOiAzOHB4OyB9CkBtZWRpYSAobWF4LXdpZHRoOiA3NjBweCkgeyAucGYtZ3JpZCB7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOyB9IH0KLnBmIHsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuMSk7IGJvcmRlci1yYWRpdXM6IDE2cHg7IHBhZGRpbmc6IDI0cHg7IGJhY2tncm91bmQ6IHJnYmEoMjU1LDI1NSwyNTUsLjAyNSk7IH0KLnBmLXJpc2sgeyBmb250LWZhbWlseTogJ0dlaXN0IE1vbm8nLCBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMTAuNXB4OyBsZXR0ZXItc3BhY2luZzogLjFlbTsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgY29sb3I6IHZhcigtLXNpZ25hbCk7IG1hcmdpbjogMCAwIDhweDsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IH0KLnBmLXJpc2s6OmJlZm9yZSB7IGNvbnRlbnQ6ICcnOyB3aWR0aDogN3B4OyBoZWlnaHQ6IDdweDsgYm9yZGVyLXJhZGl1czogMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1zaWduYWwpOyB9Ci5wZi1oIHsgZm9udC1mYW1pbHk6ICdJbnRlciBUaWdodCc7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMTdweDsgbWFyZ2luOiAwIDAgMTBweDsgY29sb3I6ICNmZmY7IH0KLnBmLXAgeyBmb250LXNpemU6IDE0cHg7IGxpbmUtaGVpZ2h0OiAxLjU1OyBjb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwuNjYpOyBtYXJnaW46IDAgMCAxNHB4OyB9Ci5wZi1hbnMgeyBmb250LXNpemU6IDEzLjVweDsgbGluZS1oZWlnaHQ6IDEuNTsgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsLjkpOyBwYWRkaW5nLWxlZnQ6IDE0cHg7IGJvcmRlci1sZWZ0OiAycHggc29saWQgdmFyKC0tZ29vZCk7IH0KLnBmLWFucyBiIHsgY29sb3I6IHZhcigtLWdvb2QpOyBmb250LXdlaWdodDogNjAwOyB9CgovKiA9PT09PT09PT09PT0gQ0xPU0lORyA9PT09PT09PT09PT0gKi8KLmNsb3NlLWN0YSB7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogOTZweCAwOyB9Ci5jbG9zZS1jdGEgaDIgeyBmb250LWZhbWlseTogJ0ludGVyIFRpZ2h0JzsgZm9udC13ZWlnaHQ6IDcwMDsgZm9udC1zaXplOiBjbGFtcCgzMHB4LCA0LjZ2dywgNTRweCk7IGxldHRlci1zcGFjaW5nOiAtLjAzZW07IGxpbmUtaGVpZ2h0OiAxLjAyOyBtYXJnaW46IDAgMCAxOHB4OyB0ZXh0LXdyYXA6IGJhbGFuY2U7IH0KLmNsb3NlLWN0YSBwIHsgZm9udC1zaXplOiAxOHB4OyBjb2xvcjogdmFyKC0taW5rLTIpOyBtYXgtd2lkdGg6IDUyY2g7IG1hcmdpbjogMCBhdXRvIDMwcHg7IH0KLmJ0bi1yb3cgeyBkaXNwbGF5OiBmbGV4OyBnYXA6IDEycHg7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBmbGV4LXdyYXA6IHdyYXA7IH0KLmJ0biB7IGRpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDlweDsgcGFkZGluZzogMTVweCAyNnB4OyBib3JkZXItcmFkaXVzOiA5OTlweDsgZm9udC1mYW1pbHk6ICdJbnRlcic7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMTVweDsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gLjEycywgYmFja2dyb3VuZCAuMTVzLCBib3JkZXItY29sb3IgLjE1czsgfQouYnRuLXByaW1hcnkgeyBiYWNrZ3JvdW5kOiB2YXIoLS1pbmspOyBjb2xvcjogdmFyKC0tcGFwZXIpOyB9Ci5idG4tcHJpbWFyeTpob3ZlciB7IGJhY2tncm91bmQ6IHZhcigtLWhhbG8tZGVlcCk7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsgfQouYnRuLWdob3N0IHsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcnVsZS0yKTsgY29sb3I6IHZhcigtLWluayk7IH0KLmJ0bi1naG9zdDpob3ZlciB7IGJvcmRlci1jb2xvcjogdmFyKC0taW5rKTsgfQoKZm9vdGVyIHsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLXJ1bGUpOyBwYWRkaW5nOiAzMHB4IDA7IH0KLmZvb3QtaW4geyBkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGZsZXgtd3JhcDogd3JhcDsgZ2FwOiAxNHB4OyBmb250LXNpemU6IDEzcHg7IGNvbG9yOiB2YXIoLS1zdGVlbCk7IH0KLmZvb3Qtbm90ZSB7IGZvbnQtZmFtaWx5OiAnR2Vpc3QgTW9ubycsIG1vbm9zcGFjZTsgZm9udC1zaXplOiAxMXB4OyBsZXR0ZXItc3BhY2luZzogLjA0ZW07IH0KCkBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSB7ICogeyBhbmltYXRpb24tZHVyYXRpb246IC4wMW1zICFpbXBvcnRhbnQ7IH0gfQovKiBlbWJlZCBtb2RlICovCmh0bWwsIGJvZHkgeyBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlcik7IH0KLmVtYmVkLXBhZCAuYmxvY2sgeyBwYWRkaW5nOiA2cHggMDsgfQouZW1iZWQtcGFkIC5zaGVsbCB7IHBhZGRpbmc6IDAgMTZweDsgfQouZW1iZWQtcGFkIC5zdGFnZS13cmFwIHsgbWFyZ2luLXRvcDogMDsgfQo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5Pgo8ZGl2IGNsYXNzPSJlbWJlZC1wYWQiPgo8IS0tID09PT09PT09PT09PSBUSEUgTElWRSBTVEFHRSA9PT09PT09PT09PT0gLS0+CjxzZWN0aW9uIGNsYXNzPSJibG9jayIgc3R5bGU9InBhZGRpbmctdG9wOiA4cHg7Ij4KICA8ZGl2IGNsYXNzPSJzaGVsbCI+CgogICAgPGRpdiBjbGFzcz0ic3RhZ2Utd3JhcCI+CiAgICAgIDxkaXYgY2xhc3M9InN0YWdlIj4KICAgICAgICA8IS0tIENBTlZBUyAtLT4KICAgICAgICA8ZGl2IGNsYXNzPSJzdGFnZS1jYW52YXMiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic3RhZ2UtdGFnIj48c3BhbiBjbGFzcz0ibGl2ZSI+PC9zcGFuPldvcmxkIG1vZGVsIMK3IDEyNDAgQXVyb3JhIEF2ZTwvZGl2PgogICAgICAgICAgPHN2ZyBpZD0ic2NlbmUiIHZpZXdCb3g9IjAgMCA3MjAgNTYwIiBhcmlhLWxhYmVsPSJUb3AtZG93biBkaWdpdGFsIHR3aW4gb2YgYSBob21lIGFuZCB5YXJkIj4KICAgICAgICAgICAgPGRlZnM+CiAgICAgICAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPSJ0cmFpbGdyYWQiIHgxPSIwIiB5MT0iMCIgeDI9IjEiIHkyPSIxIj4KICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzkyRTVGRiIvPgogICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNEY4Q0ZGIi8+CiAgICAgICAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgICAgICAgICAgPC9kZWZzPgoKICAgICAgICAgICAgPCEtLSBsb3QgLS0+CiAgICAgICAgICAgIDxyZWN0IGNsYXNzPSJ3LWxvdCIgeD0iMTYiIHk9IjE2IiB3aWR0aD0iNjg4IiBoZWlnaHQ9IjUyOCIgcng9IjE0Ii8+CiAgICAgICAgICAgIDxyZWN0IGNsYXNzPSJ3LWxvdC0yIiB4PSIzNjAiIHk9IjkyIiB3aWR0aD0iMzI4IiBoZWlnaHQ9IjQzMCIgcng9IjgiLz4KCiAgICAgICAgICAgIDwhLS0gZHJpdmV3YXkgKyBzdHJlZXQgLS0+CiAgICAgICAgICAgIDxyZWN0IGNsYXNzPSJ3LWRyaXZlIiB4PSIxNTAiIHk9IjQzMCIgd2lkdGg9IjkwIiBoZWlnaHQ9IjExNCIvPgogICAgICAgICAgICA8cmVjdCBjbGFzcz0idy1kcml2ZSIgeD0iMTYiIHk9IjUyMCIgd2lkdGg9IjY4OCIgaGVpZ2h0PSIyNCIvPgoKICAgICAgICAgICAgPCEtLSBob3VzZSAtLT4KICAgICAgICAgICAgPHJlY3QgY2xhc3M9InctaG91c2UiIHg9IjYwIiB5PSI4MCIgd2lkdGg9IjMwMCIgaGVpZ2h0PSIzMjAiIHJ4PSI2Ii8+CiAgICAgICAgICAgIDwhLS0gcm9vbXMgLS0+CiAgICAgICAgICAgIDxsaW5lIGNsYXNzPSJ3LXJvb20iIHgxPSIyMTAiIHkxPSI4MCIgeDI9IjIxMCIgeTI9IjQwMCIvPgogICAgICAgICAgICA8bGluZSBjbGFzcz0idy1yb29tIiB4MT0iNjAiIHkxPSIyNDAiIHgyPSIyMTAiIHkyPSIyNDAiLz4KICAgICAgICAgICAgPGxpbmUgY2xhc3M9Inctcm9vbSIgeDE9IjIxMCIgeTE9IjIwMCIgeDI9IjM2MCIgeTI9IjIwMCIvPgogICAgICAgICAgICA8dGV4dCBjbGFzcz0idy1sYWJlbCIgeD0iODQiIHk9IjE3MCI+TElWSU5HPC90ZXh0PgogICAgICAgICAgICA8dGV4dCBjbGFzcz0idy1sYWJlbCIgeD0iODQiIHk9IjMzMCI+S0lUQ0hFTjwvdGV4dD4KICAgICAgICAgICAgPHRleHQgY2xhc3M9InctbGFiZWwiIHg9IjIzNiIgeT0iMTUwIj5CRURST09NPC90ZXh0PgogICAgICAgICAgICA8dGV4dCBjbGFzcz0idy1sYWJlbCIgeD0iMjM2IiB5PSIzMTAiPk9GRklDRTwvdGV4dD4KICAgICAgICAgICAgPCEtLSBmcm9udCBkb29yIC0tPgogICAgICAgICAgICA8cmVjdCB4PSIxOTUiIHk9IjM5NiIgd2lkdGg9IjM0IiBoZWlnaHQ9IjgiIHJ4PSIzIiBmaWxsPSIjMzg1MDdmIi8+CgogICAgICAgICAgICA8IS0tIHlhcmQgb2JqZWN0cyAoa25vd24gdG8gdGhlIG1vZGVsKSAtLT4KICAgICAgICAgICAgPGNpcmNsZSBjbGFzcz0idy10cmVlIiBjeD0iNjIwIiBjeT0iMTUwIiByPSI0MCIvPgogICAgICAgICAgICA8dGV4dCBjbGFzcz0idy1vYmpsYWJlbCIgeD0iNjIwIiB5PSIxNTMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmaWxsOnJnYmEoMjU1LDI1NSwyNTUsLjUpIj5PQUs8L3RleHQ+CiAgICAgICAgICAgIDxyZWN0IGNsYXNzPSJ3LWJlZCIgeD0iNDMwIiB5PSI0NzAiIHdpZHRoPSIyMjAiIGhlaWdodD0iMzQiIHJ4PSI4Ii8+CiAgICAgICAgICAgIDx0ZXh0IGNsYXNzPSJ3LW9iamxhYmVsIiB4PSI1NDAiIHk9IjQ5MSIgdGV4dC1hbmNob3I9Im1pZGRsZSI+RkxPV0VSIEJFRDwvdGV4dD4KICAgICAgICAgICAgPHJlY3QgY2xhc3M9InctcGF0aW8iIHg9IjM5MiIgeT0iMTIwIiB3aWR0aD0iOTIiIGhlaWdodD0iNzQiIHJ4PSI2Ii8+CiAgICAgICAgICAgIDx0ZXh0IGNsYXNzPSJ3LW9iamxhYmVsIiB4PSI0MzgiIHk9IjE2MSIgdGV4dC1hbmNob3I9Im1pZGRsZSI+UEFUSU88L3RleHQ+CiAgICAgICAgICAgIDwhLS0gc2lkZSBnYXRlIC0tPgogICAgICAgICAgICA8bGluZSBjbGFzcz0idy1nYXRlIiB4MT0iNjg4IiB5MT0iMzAwIiB4Mj0iNjg4IiB5Mj0iMzYwIi8+CiAgICAgICAgICAgIDx0ZXh0IGNsYXNzPSJ3LW9iamxhYmVsIiB4PSI2NDgiIHk9IjMzNCIgc3R5bGU9ImZpbGw6dmFyKC0tc2lnbmFsKSI+R0FURTwvdGV4dD4KCiAgICAgICAgICAgIDwhLS0gaW5zdGFsbGVkIGRldmljZXMgKHRoZSBtb2RlbCBpcyBidWlsdCBmcm9tIHRoZXNlKSAtLT4KICAgICAgICAgICAgPGcgaWQ9ImRldmljZXMiPjwvZz4KCiAgICAgICAgICAgIDwhLS0gZG9jayAtLT4KICAgICAgICAgICAgPHJlY3QgY2xhc3M9ImRvY2siIHg9IjM5MiIgeT0iNDA0IiB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHJ4PSI4Ii8+CiAgICAgICAgICAgIDx0ZXh0IGNsYXNzPSJkb2NrLWxhYmVsIiB4PSI0MTIiIHk9IjQ1OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+RE9DSzwvdGV4dD4KCiAgICAgICAgICAgIDwhLS0gZHluYW1pYyBwYXRocyAtLT4KICAgICAgICAgICAgPHBhdGggaWQ9InByZWRpY3RlZCIgZD0iIi8+CiAgICAgICAgICAgIDxwYXRoIGlkPSJ0cmFpbCIgZD0iIi8+CgogICAgICAgICAgICA8IS0tIHVua25vd24gb2JqZWN0IC0tPgogICAgICAgICAgICA8ZyBjbGFzcz0idW5rbm93biIgaWQ9InVua25vd24iPgogICAgICAgICAgICAgIDxyZWN0IGNsYXNzPSJ1bmtub3duLWJveCIgeD0iMCIgeT0iMCIgd2lkdGg9IjQ2IiBoZWlnaHQ9IjM0IiByeD0iNiIvPgogICAgICAgICAgICAgIDx0ZXh0IGNsYXNzPSJ1bmtub3duLXEiIHg9IjIzIiB5PSIyNCI+PzwvdGV4dD4KICAgICAgICAgICAgPC9nPgoKICAgICAgICAgICAgPCEtLSByb2JvdCAtLT4KICAgICAgICAgICAgPGcgaWQ9InJvYm90IiBzdHlsZT0ib3BhY2l0eTowIj4KICAgICAgICAgICAgICA8Y2lyY2xlIGNsYXNzPSJyb2JvdC1oYWxvIiBjeD0iMCIgY3k9IjAiIHI9IjE2Ii8+CiAgICAgICAgICAgICAgPGNpcmNsZSBjbGFzcz0icm9ib3QtYm9keSIgY3g9IjAiIGN5PSIwIiByPSIxMCIvPgogICAgICAgICAgICAgIDxjaXJjbGUgY2xhc3M9InJvYm90LWV5ZSIgY3g9IjAiIGN5PSItNCIgcj0iMi40Ii8+CiAgICAgICAgICAgIDwvZz4KICAgICAgICAgIDwvc3ZnPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8IS0tIFBBTkVMIC0tPgogICAgICAgIDxkaXYgY2xhc3M9InBhbmVsIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InBhbmVsLWgiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYW5lbC10aXRsZSI+CiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiI+PHBhdGggZD0iTTEyIDJhMTAgMTAgMCAxMDAgMjAgMTAgMTAgMCAwMDAtMjB6Ii8+PHBhdGggZD0iTTIgMTJoMjBNMTIgMmExNSAxNSAwIDAxMCAyME0xMiAyYTE1IDE1IDAgMDAwIDIwIi8+PC9zdmc+CiAgICAgICAgICAgICAgV29ybGQgbW9kZWwKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbmYiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbmYtbnVtIiBpZD0iY29uZk51bSI+LS08L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb25mLWxibCI+Y29uZmlkZW5jZTwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxkaXYgY2xhc3M9InRhc2tzIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFza3MtbGJsIj5HaXZlIGl0IGEgam9iPC9kaXY+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InRhc2stYnRuIiBkYXRhLXRhc2s9Im1vdyI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImljIj48c3ZnIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj48cGF0aCBkPSJNMyAyMGgxOE01IDIwdi02aDZ2Nk01IDE0YzAtNCAzLTcgNy03TTEyIDdsNC0yIi8+PC9zdmc+PC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuPk1vdyB0aGUgYmFjayBsYXduPHNwYW4gY2xhc3M9InN1YiI+YXV0b25vbW91cyBtb3dlciDCtyB+MC40IGFjcmU8L3NwYW4+PC9zcGFuPgogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFzay1idG4iIGRhdGEtdGFzaz0icGF0cm9sIj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaWMiPjxzdmcgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjxwYXRoIGQ9Ik0xMiAybDggNHY2YzAgNS0zLjUgOC04IDEwLTQuNS0yLTgtNS04LTEwVjZ6Ii8+PC9zdmc+PC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuPkV2ZW5pbmcgc2VjdXJpdHkgcGF0cm9sPHNwYW4gY2xhc3M9InN1YiI+cGVyaW1ldGVyIGxvb3AgwrcgY2hlY2tzIGNhbWVyYXM8L3NwYW4+PC9zcGFuPgogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFzay1idG4iIGRhdGEtdGFzaz0iZGVsaXZlciI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImljIj48c3ZnIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj48cGF0aCBkPSJNMyA3bDktNCA5IDR2MTBsLTkgNC05LTR6Ii8+PHBhdGggZD0iTTMgN2w5IDQgOS00TTEyIDExdjEwIi8+PC9zdmc+PC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuPkNhcnJ5IHRoZSBwYWNrYWdlIHRvIHRoZSBkb29yPHNwYW4gY2xhc3M9InN1YiI+ZGVsaXZlcnkgYm90IMK3IDE0IGxiIHBhcmNlbDwvc3Bhbj48L3NwYW4+CiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgPC9kaXY+CgogICAgICAgICAgPGRpdiBjbGFzcz0ibG9nIiBpZD0ibG9nIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibG9nLWVtcHR5Ij5QaWNrIGEgam9iLiBUaGUgbW9kZWwgd2lsbCBsb2FkIHRoZSBwcm9wZXJ0eSwgcHJlZGljdCBhIHJvdXRlLCBhbmQgbmFycmF0ZSBldmVyeSBkZWNpc2lvbiBoZXJlLjwvZGl2PgogICAgICAgICAgPC9kaXY+CgogICAgICAgICAgPGRpdiBjbGFzcz0ibW9kZWxiYXIiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtIj48ZGl2IGNsYXNzPSJtdiIgaWQ9Im1PYmoiPjM3PC9kaXY+PGRpdiBjbGFzcz0ibWwiPm9iamVjdHMgbWFwcGVkPC9kaXY+PC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im0iPjxkaXYgY2xhc3M9Im12IiBpZD0ibVVwIj4xNDwvZGl2PjxkaXYgY2xhc3M9Im1sIj5pbnN0YWxscyBsb2dnZWQ8L2Rpdj48L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibSI+PGRpdiBjbGFzcz0ibXYiIGlkPSJtSHVtYW4iPjE8L2Rpdj48ZGl2IGNsYXNzPSJtbCI+aHVtYW4gaW4gbG9vcDwvZGl2PjwvZGl2PgogICAgICAgICAgPC9kaXY+CgogICAgICAgICAgPCEtLSBodW1hbiBjaGVja3BvaW50IC0tPgogICAgICAgICAgPGRpdiBjbGFzcz0iY2hlY2twb2ludCIgaWQ9ImNoZWNrcG9pbnQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjcC1oZWFkIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjcC1tb25vIj5OPC9kaXY+CiAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNwLXdobyI+TmR1PC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjcC1yb2xlIj5odW1hbiBjaGVja3BvaW50IMK3IG9uIGNhbGw8L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxwIGNsYXNzPSJjcC1xIiBpZD0iY3BRIj5UaGUgYm90IGZvdW5kIHNvbWV0aGluZyBub3QgaW4gdGhlIG1vZGVsLiBIb3cgc2hvdWxkIGl0IHByb2NlZWQ/PC9wPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjcC1yb3ciPgogICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImNwLWJ0biIgaWQ9ImNwQ29uZmlybSI+Q29uZmlybSAmYW1wOyByZXN1bWU8L2J1dHRvbj4KICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjcC1idG4gYWx0IiBpZD0iY3BSZXJvdXRlIj5SZXJvdXRlPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjcC1hdXRvIiBpZD0iY3BBdXRvIj5hdXRvLXJlc29sdmluZyBpbiA0czwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPHAgY2xhc3M9InN0YWdlLWNhcCI+CiAgICAgICAgPHN2ZyB3aWR0aD0iMTUiIGhlaWdodD0iMTUiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiI+PHBhdGggZD0iTTEyIDJsMyA3aDdsLTUuNSA0LjVMMTggMjFsLTYtNC02IDQgMS41LTcuNUwyIDloN3oiLz48L3N2Zz4KICAgICAgICBBIGNvbmNlcHQgZGVtby4gUmVhbCBkZXBsb3ltZW50cyBydW4gdGhlIHNhbWUgbG9vcDogbWFwLCBzaW11bGF0ZSwgZGVwbG95LCBlc2NhbGF0ZSB0byBhIHBlcnNvbiB3aGVuIHRoZSBtb2RlbCBpcyB1bnN1cmUuCiAgICAgIDwvcD4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L3NlY3Rpb24+Cgo8L2Rpdj4KPHNjcmlwdD4KKGZ1bmN0aW9uKCl7CiAgY29uc3QgTlMgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnOwogIGNvbnN0IHNjZW5lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NjZW5lJyk7CiAgY29uc3Qgcm9ib3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncm9ib3QnKTsKICBjb25zdCBwcmVkaWN0ZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJlZGljdGVkJyk7CiAgY29uc3QgdHJhaWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHJhaWwnKTsKICBjb25zdCB1bmtub3duID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Vua25vd24nKTsKICBjb25zdCBsb2dFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2cnKTsKICBjb25zdCBjb25mTnVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZOdW0nKTsKICBjb25zdCBjaGVja3BvaW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoZWNrcG9pbnQnKTsKICBjb25zdCBjcFEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3BRJyk7CiAgY29uc3QgY3BBdXRvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NwQXV0bycpOwogIGNvbnN0IGNwQ29uZmlybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjcENvbmZpcm0nKTsKICBjb25zdCBjcFJlcm91dGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3BSZXJvdXRlJyk7CiAgY29uc3QgbUh1bWFuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21IdW1hbicpOwogIGNvbnN0IHRhc2tCdG5zID0gWy4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50YXNrLWJ0bicpXTsKCiAgLy8gLS0tLSBkZXZpY2VzIChidWlsdCBpbnRvIHRoZSBtb2RlbCkgLS0tLQogIGNvbnN0IERFVklDRVMgPSBbCiAgICB7eDoyMDAsIHk6MzkyLCBsYWJlbDonbG9jayd9LCAgIC8vIGZyb250IGRvb3IKICAgIHt4OjEyMCwgeToxNTAsIGxhYmVsOidtZXNoJ30sICAgLy8gbGl2aW5nCiAgICB7eDoyODUsIHk6MzAwLCBsYWJlbDonbWVzaCd9LCAgIC8vIG9mZmljZQogICAge3g6NDcwLCB5OjEzMCwgbGFiZWw6J2NhbSd9LCAgICAvLyBwYXRpbyBjYW0KICAgIHt4OjU2MCwgeTo0NzAsIGxhYmVsOidjYW0nfSAgICAgLy8geWFyZCBjYW0KICBdOwogIGNvbnN0IGRldkxheWVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RldmljZXMnKTsKICBERVZJQ0VTLmZvckVhY2goKGQsaSk9PnsKICAgIGNvbnN0IHJpbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoTlMsJ2NpcmNsZScpOwogICAgcmluZy5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywnZGV2LXJpbmcnKTsgcmluZy5zZXRBdHRyaWJ1dGUoJ2N4JyxkLngpOyByaW5nLnNldEF0dHJpYnV0ZSgnY3knLGQueSk7IHJpbmcuc2V0QXR0cmlidXRlKCdyJywnNycpOwogICAgY29uc3QgZG90ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKE5TLCdjaXJjbGUnKTsKICAgIGRvdC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywnZGV2Jyk7IGRvdC5zZXRBdHRyaWJ1dGUoJ2N4JyxkLngpOyBkb3Quc2V0QXR0cmlidXRlKCdjeScsZC55KTsgZG90LnNldEF0dHJpYnV0ZSgncicsJzMnKTsKICAgIGNvbnN0IHB1bHNlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKE5TLCdjaXJjbGUnKTsKICAgIHB1bHNlLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCdkZXYtcHVsc2UnKTsgcHVsc2Uuc2V0QXR0cmlidXRlKCdjeCcsZC54KTsgcHVsc2Uuc2V0QXR0cmlidXRlKCdjeScsZC55KTsgcHVsc2Uuc2V0QXR0cmlidXRlKCdyJywnNycpOwogICAgcHVsc2UuaW5uZXJIVE1MID0gYDxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9InIiIHZhbHVlcz0iNzsxMzs3IiBkdXI9IjNzIiBiZWdpbj0iJHtpKjAuNH1zIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIvPjxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9Im9wYWNpdHkiIHZhbHVlcz0iLjU7MDsuNSIgZHVyPSIzcyIgYmVnaW49IiR7aSowLjR9cyIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiLz5gOwogICAgZGV2TGF5ZXIuYXBwZW5kKHJpbmcsIHB1bHNlLCBkb3QpOwogIH0pOwoKICAvLyAtLS0tIHRhc2sgZGVmaW5pdGlvbnMgLS0tLQogIC8vIHBhdGg6IFNWRyBwYXRoIHN0cmluZy4gdW5rbm93bkF0OiBmcmFjdGlvbiBhbG9uZyBwYXRoIHdoZXJlIGJvdCBtZWV0cyB0aGUgdW5rbm93biBvYmplY3QuCiAgZnVuY3Rpb24gc2VycGVudGluZSh4MCx4MSx5cyl7CiAgICBsZXQgZCA9IGBNICR7NDEyfSAkezQyNH1gOyAvLyBzdGFydCBhdCBkb2NrCiAgICBkICs9IGAgTCAke3gwfSAke3lzWzBdfWA7CiAgICBsZXQgbGVmdCA9IHRydWU7CiAgICB5cy5mb3JFYWNoKCh5KT0+ewogICAgICBkICs9IGAgTCAke2xlZnQ/eDE6eDB9ICR7eX1gOwogICAgICAvLyBzdGVwIGRvd24gaGFuZGxlZCBieSBuZXh0IHkKICAgICAgbGVmdCA9ICFsZWZ0OwogICAgfSk7CiAgICByZXR1cm4gZDsKICB9CgogIGNvbnN0IFRBU0tTID0gewogICAgbW93OiB7CiAgICAgIGxhYmVsOiAnTW93IHRoZSBiYWNrIGxhd24nLAogICAgICAvLyBib3VzdHJvcGhlZG9uIGFjcm9zcyB0aGUgb3BlbiBiYWNrIGxhd24gKHJpZ2h0IG9mIGhvdXNlLCBjbGVhciBvZiBvYWsvYmVkL3BhdGlvKQogICAgICBkOiAnTSA0MTIgNDI0IEwgNDEwIDQxMCBMIDY2MCA0MTAgTCA2NjAgMzYwIEwgNDEwIDM2MCBMIDQxMCAzMTAgTCA2NjAgMzEwIEwgNjYwIDI2MCBMIDQxMCAyNjAgTCA0MTAgMjMwIEwgNjYwIDIzMCBMIDQxMiA0MjQnLAogICAgICBkdXI6IDEyMDAwLAogICAgICB1bmtub3duQXQ6IDAuNDYsCiAgICAgIGNvbmY6IDk1LCBsb3c6IDM4LAogICAgICBsb2dzOiBbCiAgICAgICAge3A6MC4wMCwgdDonMDA6MDAnLCB0ZXh0OidMb2FkaW5nIHNwYXRpYWwgbW9kZWwgwrcgMTI0MCBBdXJvcmEgQXZlJ30sCiAgICAgICAge3A6MC4wNCwgdDonMDA6MDEnLCB0ZXh0OidLbm93biBvYmplY3RzOiBvYWsgKE5FKSwgZmxvd2VyIGJlZCAoUyksIHBhdGlvIHNldCd9LAogICAgICAgIHtwOjAuMDgsIHQ6JzAwOjAyJywgdGV4dDonTW93YWJsZSByZWdpb246IDAuNDEgYWNyZSDCtyA2IHBhc3NlcyBwbGFubmVkJ30sCiAgICAgICAge3A6MC4xMiwgdDonMDA6MDMnLCB0ZXh0OidQcmVkaWN0aW5nIHJvdXRlLi4uIDk1JSBjb25maWRlbmNlJywgY2xzOicnfSwKICAgICAgICB7cDowLjIwLCB0OicwMDowNScsIHRleHQ6J1Bhc3MgMSBvZiA2IMK3IGN1dHRpbmcnfSwKICAgICAgICB7cDowLjM0LCB0OicwMDowOCcsIHRleHQ6J1Bhc3MgMiBvZiA2IMK3IGNsZWFyJ30sCiAgICAgICAge3A6MC40NSwgdDonMDA6MTEnLCB0ZXh0OidOZXcgb2JqZWN0IG9uIHBhdGggwrcgbm90IGluIG1vZGVsJywgY2xzOid3YXJuJ30sCiAgICAgICAge3A6MC40NTUsIHQ6JzAwOjExJywgdGV4dDonQ29uZmlkZW5jZSBkcm9wcGVkIHRvIDM4JScsIGNsczond2Fybid9LAogICAgICAgIHtwOjAuNDYsIHQ6JzAwOjExJywgdGV4dDonSG9sZGluZy4gRXNjYWxhdGluZyB0byBodW1hbiAoTmR1KScsIGNsczonaHVtYW4nfSwKICAgICAgICB7cDowLjUwLCB0OidSRVNVTUUnLCB0ZXh0OidIdW1hbiBjb25maXJtZWQ6IGdhcmRlbiBob3NlLCBzYWZlIHRvIHNraXAnLCBjbHM6J29rJ30sCiAgICAgICAge3A6MC41MiwgdDonMDA6MTQnLCB0ZXh0OidPYmplY3QgYWRkZWQgdG8gbW9kZWwgwrcgcm91dGluZyBhcm91bmQnLCBjbHM6Jyd9LAogICAgICAgIHtwOjAuNzAsIHQ6JzAwOjE4JywgdGV4dDonUGFzcyA0IG9mIDYgwrcgY2xlYXInfSwKICAgICAgICB7cDowLjk2LCB0OicwMDoyNCcsIHRleHQ6J1Rhc2sgY29tcGxldGUgwrcgbW9kZWwgdXBkYXRlZCAoKzEgb2JqZWN0KScsIGNsczonb2snfQogICAgICBdLAogICAgICBjcFE6ICdBIDE2LWluY2ggb2JqZWN0IGlzIGJsb2NraW5nIHBhc3MgMywgfjEyIGluY2hlcyBvZmYgdGhlIHBsYW5uZWQgbGluZS4gVGhlIG1vZGVsIGhhcyBuZXZlciBzZWVuIGl0IGhlcmUuIE1vdyBhcm91bmQgaXQgb3Igc3RvcD8nCiAgICB9LAogICAgcGF0cm9sOiB7CiAgICAgIGxhYmVsOiAnRXZlbmluZyBzZWN1cml0eSBwYXRyb2wnLAogICAgICAvLyBwZXJpbWV0ZXIgbG9vcCBqdXN0IG91dHNpZGUgdGhlIGhvdXNlLCBzd2VlcGluZyB0aGUgeWFyZCwgcGF1c2luZyBuZWFyIGdhdGUKICAgICAgZDogJ00gNDEyIDQyNCBMIDQxMiA1NiBMIDYwIDU2IEwgNDQgNDAwIEwgMTUwIDQ3MCBMIDQxMiA0NzAgTCA2NjAgNDcwIEwgNjg4IDMzMCBMIDY2MCAyMDAgTCA1NDAgOTIgTCA0MTIgNDI0JywKICAgICAgZHVyOiAxMzAwMCwKICAgICAgdW5rbm93bkF0OiAwLjc0LAogICAgICBjb25mOiA5MywgbG93OiAzMSwKICAgICAgbG9nczogWwogICAgICAgIHtwOjAuMDAsIHQ6JzAwOjAwJywgdGV4dDonTG9hZGluZyBzcGF0aWFsIG1vZGVsIMK3IG5pZ2h0IHByb2ZpbGUnfSwKICAgICAgICB7cDowLjA1LCB0OicwMDowMScsIHRleHQ6J0NhbWVyYXMgb25saW5lOiAyIMK3IG1lc2ggbm9kZXM6IDIgwrcgbG9jazogYXJtZWQnfSwKICAgICAgICB7cDowLjEwLCB0OicwMDowMicsIHRleHQ6J1ByZWRpY3RpbmcgcGVyaW1ldGVyIGxvb3AuLi4gOTMlIGNvbmZpZGVuY2UnfSwKICAgICAgICB7cDowLjMwLCB0OicwMDowNScsIHRleHQ6J05vcnRoIHdhbGwgY2xlYXIgwrcgY3Jvc3MtY2hlY2tpbmcgcGF0aW8gY2FtJ30sCiAgICAgICAge3A6MC41NSwgdDonMDA6MDknLCB0ZXh0OidEcml2ZXdheSBjbGVhciDCtyBsb2NrIGNvbmZpcm1lZCBhcm1lZCd9LAogICAgICAgIHtwOjAuNzIsIHQ6JzAwOjEzJywgdGV4dDonTW90aW9uIGF0IHNpZGUgZ2F0ZSDCtyBub3QgbWF0Y2hlZCB0byBtb2RlbCcsIGNsczond2Fybid9LAogICAgICAgIHtwOjAuNzMsIHQ6JzAwOjEzJywgdGV4dDonQ29uZmlkZW5jZSBkcm9wcGVkIHRvIDMxJScsIGNsczond2Fybid9LAogICAgICAgIHtwOjAuNzQsIHQ6JzAwOjEzJywgdGV4dDonSG9sZGluZyBhdCBnYXRlLiBFc2NhbGF0aW5nIHRvIGh1bWFuIChOZHUpJywgY2xzOidodW1hbid9LAogICAgICAgIHtwOjAuNzgsIHQ6J1JFU1VNRScsIHRleHQ6J0h1bWFuIGNvbmZpcm1lZDogbmVpZ2hib3JcJ3MgY2F0LiBTdGFuZCBkb3duJywgY2xzOidvayd9LAogICAgICAgIHtwOjAuODIsIHQ6JzAwOjE2JywgdGV4dDonUmVzdW1pbmcgbG9vcCDCtyBsb2dnZWQgZm9yIHJldmlldycsIGNsczonJ30sCiAgICAgICAge3A6MC45NywgdDonMDA6MjEnLCB0ZXh0OidQYXRyb2wgY29tcGxldGUgwrcgYWxsIHpvbmVzIGNsZWFyJywgY2xzOidvayd9CiAgICAgIF0sCiAgICAgIGNwUTogJ0hlYXQgc2lnbmF0dXJlIGF0IHRoZSBzaWRlIGdhdGUsIG1vdmluZywgdG9vIHNtYWxsIHRvIGNsYXNzaWZ5LiBDb3VsZCBiZSBhbiBhbmltYWwsIGNvdWxkIGJlIGEgcGVyc29uIGNyb3VjaGluZy4gV2FrZSB5b3UsIG9yIGtlZXAgd2F0Y2hpbmc/JwogICAgfSwKICAgIGRlbGl2ZXI6IHsKICAgICAgbGFiZWw6ICdDYXJyeSB0aGUgcGFja2FnZSB0byB0aGUgZG9vcicsCiAgICAgIGQ6ICdNIDQxMiA0MjQgTCAzMDAgNDcwIEwgMTk1IDQ3MCBMIDE5NSA0MDggTCAyMTIgNDAwIEwgMjE0IDQwMicsCiAgICAgIGR1cjogODAwMCwKICAgICAgdW5rbm93bkF0OiAwLjkzLAogICAgICBjb25mOiA5NiwgbG93OiA0NCwKICAgICAgbG9nczogWwogICAgICAgIHtwOjAuMDAsIHQ6JzAwOjAwJywgdGV4dDonTG9hZGluZyBzcGF0aWFsIG1vZGVsIMK3IGFwcHJvYWNoOiBmcm9udCBkb29yJ30sCiAgICAgICAge3A6MC4wOCwgdDonMDA6MDEnLCB0ZXh0OidQYXJjZWw6IDE0IGxiIMK3IDIyIMOXIDE2IMOXIDEwIGluJ30sCiAgICAgICAge3A6MC4xNiwgdDonMDA6MDInLCB0ZXh0OidQcmVkaWN0aW5nIHJvdXRlIHRvIGRvb3IuLi4gOTYlIGNvbmZpZGVuY2UnfSwKICAgICAgICB7cDowLjQ1LCB0OicwMDowNCcsIHRleHQ6J0Nyb3NzaW5nIGRyaXZld2F5IMK3IHBhdGggY2xlYXInfSwKICAgICAgICB7cDowLjcyLCB0OicwMDowNScsIHRleHQ6J09uIHRoZSBmcm9udCB3YWxrIMK3IGFwcHJvYWNoaW5nIHRoZSBzdGVwJ30sCiAgICAgICAge3A6MC45MSwgdDonMDA6MDcnLCB0ZXh0OidEb29yIG1hdCBvY2N1cGllZCDCtyBvYmplY3Qgbm90IGluIG1vZGVsJywgY2xzOid3YXJuJ30sCiAgICAgICAge3A6MC45MiwgdDonMDA6MDcnLCB0ZXh0OidDb25maWRlbmNlIGRyb3BwZWQgdG8gNDQlJywgY2xzOid3YXJuJ30sCiAgICAgICAge3A6MC45MywgdDonMDA6MDcnLCB0ZXh0OidIb2xkaW5nIGF0IHN0ZXAuIEVzY2FsYXRpbmcgdG8gaHVtYW4gKE5kdSknLCBjbHM6J2h1bWFuJ30sCiAgICAgICAge3A6MC45NiwgdDonUkVTVU1FJywgdGV4dDonSHVtYW4gY29uZmlybWVkOiBleGlzdGluZyBwYXJjZWwuIFNldCBiZXNpZGUgaXQnLCBjbHM6J29rJ30sCiAgICAgICAge3A6MC45OSwgdDonMDA6MDknLCB0ZXh0OidEZWxpdmVyZWQgwrcgcGhvdG8gc2VudCB0byBob21lb3duZXInLCBjbHM6J29rJ30KICAgICAgXSwKICAgICAgY3BROiAnU29tZXRoaW5nIGlzIGFscmVhZHkgb24gdGhlIGRvb3JtYXQgd2hlcmUgdGhlIGRyb3AgcG9pbnQgaXMuIFN0YWNrIG9uIHRvcCwgb3IgcGxhY2UgaXQgdG8gdGhlIHNpZGU/JwogICAgfQogIH07CgogIC8vIC0tLS0gYW5pbWF0aW9uIHN0YXRlIC0tLS0KICBsZXQgcmFmID0gbnVsbCwgY3VycmVudCA9IG51bGwsIHBhdXNlZCA9IGZhbHNlLCByZXNvbHZlZCA9IGZhbHNlOwogIGxldCBlbGFwc2VkID0gMCwgbGFzdFRzID0gMCwgYXV0b1RpbWVyID0gbnVsbCwgYXV0b0xlZnQgPSAwLCBhdXRvSW50ZXJ2YWwgPSBudWxsOwogIGxldCBlbWl0dGVkID0gbmV3IFNldCgpOwoKICBmdW5jdGlvbiBjbGVhclJ1bigpewogICAgaWYgKHJhZikgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmKTsgcmFmID0gbnVsbDsKICAgIGlmIChhdXRvVGltZXIpIGNsZWFyVGltZW91dChhdXRvVGltZXIpOwogICAgaWYgKGF1dG9JbnRlcnZhbCkgY2xlYXJJbnRlcnZhbChhdXRvSW50ZXJ2YWwpOwogICAgcGF1c2VkID0gZmFsc2U7IHJlc29sdmVkID0gZmFsc2U7IGVsYXBzZWQgPSAwOyBsYXN0VHMgPSAwOyBlbWl0dGVkID0gbmV3IFNldCgpOwogICAgdW5rbm93bi5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7CiAgICBjaGVja3BvaW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTsKICAgIHJvYm90LnN0eWxlLm9wYWNpdHkgPSAnMCc7CiAgICBwcmVkaWN0ZWQuc2V0QXR0cmlidXRlKCdkJywnJyk7CiAgICB0cmFpbC5zZXRBdHRyaWJ1dGUoJ2QnLCcnKTsKICB9CgogIGZ1bmN0aW9uIHNldENvbmYodiwgbG93KXsKICAgIGNvbmZOdW0udGV4dENvbnRlbnQgPSBNYXRoLnJvdW5kKHYpICsgJyUnOwogICAgY29uZk51bS5jbGFzc0xpc3QudG9nZ2xlKCdsb3cnLCAhIWxvdyk7CiAgfQoKICBmdW5jdGlvbiBhZGRMb2cobGluZSl7CiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGRpdi5jbGFzc05hbWUgPSAnbG9nLWxpbmUnICsgKGxpbmUuY2xzID8gJyAnICsgbGluZS5jbHMgOiAnJyk7CiAgICBkaXYuaW5uZXJIVE1MID0gYDxzcGFuIGNsYXNzPSJ0Ij4ke2xpbmUudH08L3NwYW4+PHNwYW4+JHtsaW5lLnRleHR9PC9zcGFuPmA7CiAgICBsb2dFbC5hcHBlbmQoZGl2KTsKICAgIGxvZ0VsLnNjcm9sbFRvcCA9IGxvZ0VsLnNjcm9sbEhlaWdodDsKICB9CgogIGZ1bmN0aW9uIHN0YXJ0KHRhc2tLZXkpewogICAgY2xlYXJSdW4oKTsKICAgIGN1cnJlbnQgPSBUQVNLU1t0YXNrS2V5XTsKICAgIGxvZ0VsLmlubmVySFRNTCA9ICcnOwogICAgdGFza0J0bnMuZm9yRWFjaChiID0+IGIuY2xhc3NMaXN0LnRvZ2dsZSgnaXMtYWN0aXZlJywgYi5kYXRhc2V0LnRhc2sgPT09IHRhc2tLZXkpKTsKICAgIHNldENvbmYoY3VycmVudC5jb25mLCBmYWxzZSk7CgogICAgLy8gcGxhY2UgdW5rbm93biBvYmplY3QKICAgIC8vIHBsYW5uaW5nIHBoYXNlOiBkcmF3IHByZWRpY3RlZCBwYXRoCiAgICBwcmVkaWN0ZWQuc2V0QXR0cmlidXRlKCdkJywgY3VycmVudC5kKTsKICAgIGNvbnN0IHRvdGFsID0gcHJlZGljdGVkLmdldFRvdGFsTGVuZ3RoKCk7CiAgICAvLyBwb3NpdGlvbiB0aGUgdW5rbm93biBvYmplY3QgZXhhY3RseSB3aGVyZSB0aGUgcm9ib3Qgd2lsbCBwYXVzZQogICAgY29uc3QgdXB0ID0gcHJlZGljdGVkLmdldFBvaW50QXRMZW5ndGgodG90YWwgKiBjdXJyZW50LnVua25vd25BdCk7CiAgICB1bmtub3duLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3VwdC54LTIzfSwgJHt1cHQueS0xN30pYCk7CiAgICBwcmVkaWN0ZWQuc3R5bGUudHJhbnNpdGlvbiA9ICdub25lJzsKICAgIHByZWRpY3RlZC5zdHlsZS5zdHJva2VEYXNoYXJyYXkgPSB0b3RhbDsKICAgIHByZWRpY3RlZC5zdHlsZS5zdHJva2VEYXNob2Zmc2V0ID0gdG90YWw7CiAgICAvLyBmb3JjZSByZWZsb3cKICAgIHByZWRpY3RlZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIHByZWRpY3RlZC5zdHlsZS50cmFuc2l0aW9uID0gJ3N0cm9rZS1kYXNob2Zmc2V0IDEuMXMgZWFzZSc7CiAgICBwcmVkaWN0ZWQuc3R5bGUuc3Ryb2tlRGFzaG9mZnNldCA9ICcwJzsKCiAgICBhZGRMb2coY3VycmVudC5sb2dzWzBdKTsgZW1pdHRlZC5hZGQoMCk7CiAgICAvLyBiZWdpbiBydW5uaW5nIGFmdGVyIHRoZSBwbGFuIGlzIGRyYXduCiAgICBzZXRUaW1lb3V0KCgpPT57CiAgICAgIGlmIChjdXJyZW50ICE9PSBUQVNLU1t0YXNrS2V5XSkgcmV0dXJuOwogICAgICB0cmFpbC5zZXRBdHRyaWJ1dGUoJ2QnLCBjdXJyZW50LmQpOwogICAgICAvLyBkYXNoZWQgcHJlZGljdGVkIGZhZGVzIHRvIGEgZmFpbnQgZ3VpZGUKICAgICAgcHJlZGljdGVkLnN0eWxlLnRyYW5zaXRpb24gPSAnc3Ryb2tlLWRhc2hvZmZzZXQgMS4xcyBlYXNlLCBvcGFjaXR5IC42cyc7CiAgICAgIHByZWRpY3RlZC5zdHlsZS5vcGFjaXR5ID0gJy4zNSc7CiAgICAgIHByZWRpY3RlZC5zdHlsZS5zdHJva2VEYXNoYXJyYXkgPSAnNCA4JzsKICAgICAgcm9ib3Quc3R5bGUub3BhY2l0eSA9ICcxJzsKICAgICAgbGFzdFRzID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgIHJhZiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTsKICAgIH0sIDExNTApOwogIH0KCiAgZnVuY3Rpb24gbG9vcCh0cyl7CiAgICBpZiAoIWN1cnJlbnQpIHJldHVybjsKICAgIGNvbnN0IGR0ID0gdHMgLSBsYXN0VHM7IGxhc3RUcyA9IHRzOwogICAgaWYgKCFwYXVzZWQpIGVsYXBzZWQgKz0gZHQ7CiAgICBsZXQgcCA9IE1hdGgubWluKGVsYXBzZWQgLyBjdXJyZW50LmR1ciwgMSk7CgogICAgLy8gcGF1c2UgZXhhY3RseSBhdCB0aGUgdW5rbm93biBiZWF0IHVudGlsIHJlc29sdmVkCiAgICBpZiAoIXJlc29sdmVkICYmIHAgPj0gY3VycmVudC51bmtub3duQXQpIHsKICAgICAgcCA9IGN1cnJlbnQudW5rbm93bkF0OwogICAgICBpZiAoIXBhdXNlZCkgdHJpZ2dlckNoZWNrcG9pbnQoKTsKICAgIH0KCiAgICAvLyBwb3NpdGlvbiByb2JvdCArIHJldmVhbCB0cmFpbAogICAgY29uc3QgdG90YWwgPSB0cmFpbC5nZXRUb3RhbExlbmd0aCgpOwogICAgY29uc3QgbGVuID0gdG90YWwgKiBwOwogICAgY29uc3QgcHQgPSB0cmFpbC5nZXRQb2ludEF0TGVuZ3RoKGxlbik7CiAgICBjb25zdCBhaGVhZCA9IHRyYWlsLmdldFBvaW50QXRMZW5ndGgoTWF0aC5taW4obGVuICsgNCwgdG90YWwpKTsKICAgIGNvbnN0IGFuZyA9IE1hdGguYXRhbjIoYWhlYWQueSAtIHB0LnksIGFoZWFkLnggLSBwdC54KSAqIDE4MCAvIE1hdGguUEk7CiAgICByb2JvdC5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHtwdC54fSwgJHtwdC55fSkgcm90YXRlKCR7YW5nfSlgKTsKICAgIHRyYWlsLnN0eWxlLnN0cm9rZURhc2hhcnJheSA9IHRvdGFsOwogICAgdHJhaWwuc3R5bGUuc3Ryb2tlRGFzaG9mZnNldCA9IHRvdGFsIC0gbGVuOwoKICAgIC8vIGVtaXQgbG9ncwogICAgY3VycmVudC5sb2dzLmZvckVhY2goKGxpbmUsIGkpPT57CiAgICAgIGlmICghZW1pdHRlZC5oYXMoaSkgJiYgcCA+PSBsaW5lLnAgJiYgbGluZS50ICE9PSAnUkVTVU1FJykgeyBhZGRMb2cobGluZSk7IGVtaXR0ZWQuYWRkKGkpOyB9CiAgICB9KTsKCiAgICAvLyBjb25maWRlbmNlIGRpcCBhcHByb2FjaGluZyB0aGUgYmVhdAogICAgaWYgKCFyZXNvbHZlZCAmJiBwID49IGN1cnJlbnQudW5rbm93bkF0IC0gMC4wNikgewogICAgICBjb25zdCBkaXBUID0gTWF0aC5taW4oKHAgLSAoY3VycmVudC51bmtub3duQXQgLSAwLjA2KSkgLyAwLjA2LCAxKTsKICAgICAgc2V0Q29uZihjdXJyZW50LmNvbmYgLSBkaXBUICogKGN1cnJlbnQuY29uZiAtIGN1cnJlbnQubG93KSwgdHJ1ZSk7CiAgICB9CgogICAgaWYgKHAgPj0gMSkgeyBmaW5pc2goKTsgcmV0dXJuOyB9CiAgICByYWYgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCk7CiAgfQoKICBmdW5jdGlvbiB0cmlnZ2VyQ2hlY2twb2ludCgpewogICAgcGF1c2VkID0gdHJ1ZTsKICAgIHVua25vd24uY2xhc3NMaXN0LmFkZCgnc2hvdycpOwogICAgY3BRLnRleHRDb250ZW50ID0gY3VycmVudC5jcFE7CiAgICBzZXRDb25mKGN1cnJlbnQubG93LCB0cnVlKTsKICAgIHNldFRpbWVvdXQoKCk9PiBjaGVja3BvaW50LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKSwgMjUwKTsKICAgIC8vIGF1dG8tcmVzb2x2ZSBjb3VudGRvd24KICAgIGF1dG9MZWZ0ID0gNDsKICAgIGNwQXV0by50ZXh0Q29udGVudCA9IGBhdXRvLXJlc29sdmluZyBpbiAke2F1dG9MZWZ0fXNgOwogICAgY3BBdXRvLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgYXV0b0ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCk9PnsKICAgICAgYXV0b0xlZnQtLTsKICAgICAgY3BBdXRvLnRleHRDb250ZW50ID0gYXV0b0xlZnQgPiAwID8gYGF1dG8tcmVzb2x2aW5nIGluICR7YXV0b0xlZnR9c2AgOiAncmVzb2x2aW5nLi4uJzsKICAgICAgaWYgKGF1dG9MZWZ0IDw9IDApIGNsZWFySW50ZXJ2YWwoYXV0b0ludGVydmFsKTsKICAgIH0sIDEwMDApOwogICAgYXV0b1RpbWVyID0gc2V0VGltZW91dCgoKT0+IHJlc29sdmVDaGVja3BvaW50KGZhbHNlKSwgNDAwMCk7CiAgfQoKICBmdW5jdGlvbiByZXNvbHZlQ2hlY2twb2ludChyZXJvdXRlZCl7CiAgICBpZiAocmVzb2x2ZWQpIHJldHVybjsKICAgIHJlc29sdmVkID0gdHJ1ZTsKICAgIGlmIChhdXRvVGltZXIpIGNsZWFyVGltZW91dChhdXRvVGltZXIpOwogICAgaWYgKGF1dG9JbnRlcnZhbCkgY2xlYXJJbnRlcnZhbChhdXRvSW50ZXJ2YWwpOwogICAgY2hlY2twb2ludC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7CiAgICAvLyBidW1wIGh1bWFuLWluLWxvb3AgY291bnRlcgogICAgbUh1bWFuLnRleHRDb250ZW50ID0gKHBhcnNlSW50KG1IdW1hbi50ZXh0Q29udGVudCwxMCkgKyAxKTsKICAgIC8vIGVtaXQgdGhlIFJFU1VNRSBsb2cgbGluZQogICAgY29uc3QgcmVzdW1lTGluZSA9IGN1cnJlbnQubG9ncy5maW5kKGwgPT4gbC50ID09PSAnUkVTVU1FJyk7CiAgICBpZiAocmVzdW1lTGluZSkgewogICAgICBpZiAocmVyb3V0ZWQpIGFkZExvZyh7dDonUkVTVU1FJywgdGV4dDonSHVtYW4gY2hvc2UgcmVyb3V0ZSDCtyBwbGFubmluZyBuZXcgbGluZScsIGNsczonaHVtYW4nfSk7CiAgICAgIGFkZExvZyhyZXN1bWVMaW5lKTsKICAgIH0KICAgIC8vIHJlY292ZXIgY29uZmlkZW5jZQogICAgbGV0IGMgPSBjdXJyZW50LmxvdzsgY29uc3QgdGFyZ2V0ID0gY3VycmVudC5jb25mIC0gNDsKICAgIGNvbnN0IHJlYyA9IHNldEludGVydmFsKCgpPT57CiAgICAgIGMgKz0gKHRhcmdldCAtIGMpICogMC4yNTsKICAgICAgc2V0Q29uZihjLCBjIDwgNzApOwogICAgICBpZiAodGFyZ2V0IC0gYyA8IDEpIHsgc2V0Q29uZih0YXJnZXQsIGZhbHNlKTsgY2xlYXJJbnRlcnZhbChyZWMpOyB9CiAgICB9LCA0MCk7CiAgICBzZXRUaW1lb3V0KCgpPT57IHVua25vd24uY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpOyB9LCA2MDApOwogICAgLy8gcmVzdW1lIG1vdGlvbgogICAgcGF1c2VkID0gZmFsc2U7IGxhc3RUcyA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgaWYgKCFyYWYpIHJhZiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTsKICB9CgogIGZ1bmN0aW9uIGZpbmlzaCgpewogICAgaWYgKHJhZikgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmKTsgcmFmID0gbnVsbDsKICAgIHJvYm90LnF1ZXJ5U2VsZWN0b3IoJy5yb2JvdC1oYWxvJykuc2V0QXR0cmlidXRlKCdzdHJva2UnLCcjMzZDMjhCJyk7CiAgICBzZXRDb25mKGN1cnJlbnQuY29uZiwgZmFsc2UpOwogIH0KCiAgY3BDb25maXJtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCk9PiByZXNvbHZlQ2hlY2twb2ludChmYWxzZSkpOwogIGNwUmVyb3V0ZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpPT4gcmVzb2x2ZUNoZWNrcG9pbnQodHJ1ZSkpOwogIHRhc2tCdG5zLmZvckVhY2goYiA9PiBiLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCk9PiBzdGFydChiLmRhdGFzZXQudGFzaykpKTsKCiAgLy8gLS0tLSBlbWJlZCBicmlkZ2U6IHJlcG9ydCBoZWlnaHQgKyBhdXRvLXBsYXkgd2hlbiBwYXJlbnQgc2Nyb2xscyBpdCBpbnRvIHZpZXcgLS0tLQogIGZ1bmN0aW9uIHJlcG9ydEhlaWdodCgpeyB0cnkgeyBwYXJlbnQucG9zdE1lc3NhZ2UoeyB3bUhlaWdodDogZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQgfSwgJyonKTsgfSBjYXRjaChlKXt9IH0KICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHJlcG9ydEhlaWdodCk7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHJlcG9ydEhlaWdodCk7CiAgc2V0SW50ZXJ2YWwocmVwb3J0SGVpZ2h0LCAxNTAwKTsKICBsZXQgYXV0b1N0YXJ0ZWQgPSBmYWxzZTsKICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChlKT0+ewogICAgaWYgKGUuZGF0YSAmJiBlLmRhdGEud21QbGF5ICYmICFhdXRvU3RhcnRlZCkgeyBhdXRvU3RhcnRlZCA9IHRydWU7IHN0YXJ0KCdtb3cnKTsgfQogIH0pOwp9KSgpOwo8L3NjcmlwdD4KCjwvYm9keT4KPC9odG1sPgo=
Leave a Reply