Created
March 17, 2026 22:42
-
-
Save lloyd/4751b2f605dc39b2c5626d8493f26444 to your computer and use it in GitHub Desktop.
Tetris GarGamel bundle
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ZW52Lmx1YQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMDc2NQAwMDAwMDI0ADAwMDAwMDI1MDA0ADE1MTU2MTUwNDQyADAwMTA1MzQAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwADAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtLSBUZXRyaXMg4oCUIEVudmlyb25tZW50IHBoYXNlCi0tIE5FUyBUZXRyaXMgKDE5ODkpIGZhaXRoZnVsIG1lY2hhbmljczogTlJTIHJvdGF0aW9uLCBubyB3YWxsIGtpY2tzLAotLSBpbnN0YW50IGxvY2ssIERBUyAxNi82IGZyYW1lcywgcmUtcm9sbCByYW5kb21pemVyLCBubyBoYXJkIGRyb3AKCmxvY2FsIENPTFMsIFJPV1MgPSAxMCwgMjAKCi0tIE5SUyBwaWVjZSBkZWZpbml0aW9uczogZWFjaCBoYXMgY29sb3Ige3IsZyxifSBhbmQgcm90YXRpb24gc3RhdGVzCi0tIEVhY2ggc3RhdGUgaXMgYSBncmlkIG9mIHJvd3M7IDE9ZmlsbGVkLCAwPWVtcHR5CmxvY2FsIFAgPSB7CiAgICB7Yz17MCwwLjksMC45fSwgcz17ICAtLSAxOiBJIChjeWFuKQogICAgICAgIHt7MCwwLDAsMH0sezEsMSwxLDF9LHswLDAsMCwwfSx7MCwwLDAsMH19LAogICAgICAgIHt7MCwwLDEsMH0sezAsMCwxLDB9LHswLDAsMSwwfSx7MCwwLDEsMH19LAogICAgfX0sCiAgICB7Yz17MC45NSwwLjk1LDB9LCBzPXsgIC0tIDI6IE8gKHllbGxvdykKICAgICAgICB7ezEsMX0sezEsMX19LAogICAgfX0sCiAgICB7Yz17MC43LDAsMC45fSwgcz17ICAtLSAzOiBUIChwdXJwbGUpCiAgICAgICAge3swLDEsMH0sezEsMSwxfSx7MCwwLDB9fSwKICAgICAgICB7ezAsMSwwfSx7MCwxLDF9LHswLDEsMH19LAogICAgICAgIHt7MCwwLDB9LHsxLDEsMX0sezAsMSwwfX0sCiAgICAgICAge3swLDEsMH0sezEsMSwwfSx7MCwxLDB9fSwKICAgIH19LAogICAge2M9ezAsMC44NSwwfSwgcz17ICAgLS0gNDogUyAoZ3JlZW4pCiAgICAgICAge3swLDEsMX0sezEsMSwwfSx7MCwwLDB9fSwKICAgICAgICB7ezEsMCwwfSx7MSwxLDB9LHswLDEsMH19LAogICAgfX0sCiAgICB7Yz17MC45LDAsMH0sIHM9eyAgICAtLSA1OiBaIChyZWQpCiAgICAgICAge3sxLDEsMH0sezAsMSwxfSx7MCwwLDB9fSwKICAgICAgICB7ezAsMCwxfSx7MCwxLDF9LHswLDEsMH19LAogICAgfX0sCiAgICB7Yz17MCwwLDAuOX0sIHM9eyAgICAtLSA2OiBKIChibHVlKQogICAgICAgIHt7MSwwLDB9LHsxLDEsMX0sezAsMCwwfX0sCiAgICAgICAge3swLDEsMX0sezAsMSwwfSx7MCwxLDB9fSwKICAgICAgICB7ezAsMCwwfSx7MSwxLDF9LHswLDAsMX19LAogICAgICAgIHt7MCwxLDB9LHswLDEsMH0sezEsMSwwfX0sCiAgICB9fSwKICAgIHtjPXsxLDAuNSwwfSwgcz17ICAgIC0tIDc6IEwgKG9yYW5nZSkKICAgICAgICB7ezAsMCwxfSx7MSwxLDF9LHswLDAsMH19LAogICAgICAgIHt7MCwxLDB9LHswLDEsMH0sezAsMSwxfX0sCiAgICAgICAge3swLDAsMH0sezEsMSwxfSx7MSwwLDB9fSwKICAgICAgICB7ezEsMSwwfSx7MCwxLDB9LHswLDEsMH19LAogICAgfX0sCn0KCi0tIE5FUyBOVFNDIGdyYXZpdHk6IGZyYW1lcyBwZXIgY2VsbCBhdCBlYWNoIGxldmVsIOKGkiBzZWNvbmRzCmxvY2FsIEZQRCA9IHs0OCw0MywzOCwzMywyOCwyMywxOCwxMyw4LDYsIDUsNSw1LCA0LDQsNCwgMywzLDMsIDIsMiwyLDIsMiwyLDIsMiwyLDIsIDF9CmxvY2FsIEdSQVZJVFkgPSB7fQpmb3IgaSA9IDEsICNGUEQgZG8gR1JBVklUWVtpIC0gMV0gPSBGUERbaV0gLyA2MCBlbmQKZm9yIGx2bCA9ICNGUEQsIDk5IGRvIEdSQVZJVFlbbHZsXSA9IDEgLyA2MCBlbmQKCmxvY2FsIFNPRlRfU1BEID0gMyAvIDYwICAgICAgIC0tIHNvZnQgZHJvcDogMyBmcmFtZXMgcGVyIGNlbGwgKH4yMCBjZWxscy9zZWMpCmxvY2FsIERBU19ERUxBWSA9IDE2IC8gNjAgICAgIC0tIGluaXRpYWwgREFTIGRlbGF5ICgwLjI2N3MpCmxvY2FsIERBU19SRVBFQVQgPSA2IC8gNjAgICAgIC0tIERBUyBhdXRvLXJlcGVhdCAoMC4xcykKbG9jYWwgQVJFX1RJTUUgPSAxNCAvIDYwICAgICAgIC0tIGVudHJ5IGRlbGF5IGJldHdlZW4gcGllY2VzCmxvY2FsIENMRUFSX1RJTUUgPSAxOCAvIDYwICAgIC0tIGxpbmUgY2xlYXIgYW5pbWF0aW9uIGR1cmF0aW9uCmxvY2FsIFNDT1JFX1RCTCA9IHtbMV09NDAsIFsyXT0xMDAsIFszXT0zMDAsIFs0XT0xMjAwfQoKbG9jYWwgZnVuY3Rpb24gZW1pdCh1LCBuYW1lLCBkYXRhKQogICAgdS5ldmVudHNbI3UuZXZlbnRzICsgMV0gPSB7bmFtZSA9IG5hbWUsIGRhdGEgPSBkYXRhIG9yIHt9fQplbmQKCi0tIENoZWNrIGlmIHBpZWNlIGZpdHMgYXQgZ3JpZCBwb3NpdGlvbiAocHIsIHBjID0gdG9wLWxlZnQgb2YgYm91bmRpbmcgYm94KQpsb2NhbCBmdW5jdGlvbiBmaXRzKGdyaWQsIHB0LCByb3QsIHByLCBwYykKICAgIGxvY2FsIHN0YXRlID0gUFtwdF0uc1tyb3RdCiAgICBmb3IgciA9IDEsICNzdGF0ZSBkbwogICAgICAgIGZvciBjID0gMSwgI3N0YXRlW3JdIGRvCiAgICAgICAgICAgIGlmIHN0YXRlW3JdW2NdID09IDEgdGhlbgogICAgICAgICAgICAgICAgbG9jYWwgZ3IsIGdjID0gcHIgKyByIC0gMSwgcGMgKyBjIC0gMQogICAgICAgICAgICAgICAgaWYgZ2MgPCAxIG9yIGdjID4gQ09MUyBvciBnciA+IFJPV1MgdGhlbiByZXR1cm4gZmFsc2UgZW5kCiAgICAgICAgICAgICAgICBpZiBnciA+PSAxIGFuZCBncmlkW2dyXVtnY10gPiAwIHRoZW4gcmV0dXJuIGZhbHNlIGVuZAogICAgICAgICAgICBlbmQKICAgICAgICBlbmQKICAgIGVuZAogICAgcmV0dXJuIHRydWUKZW5kCgotLSBMb2NrIHBpZWNlIGludG8gZ3JpZApsb2NhbCBmdW5jdGlvbiBsb2NrKGdyaWQsIHB0LCByb3QsIHByLCBwYykKICAgIGxvY2FsIHN0YXRlID0gUFtwdF0uc1tyb3RdCiAgICBmb3IgciA9IDEsICNzdGF0ZSBkbwogICAgICAgIGZvciBjID0gMSwgI3N0YXRlW3JdIGRvCiAgICAgICAgICAgIGlmIHN0YXRlW3JdW2NdID09IDEgdGhlbgogICAgICAgICAgICAgICAgbG9jYWwgZ3IsIGdjID0gcHIgKyByIC0gMSwgcGMgKyBjIC0gMQogICAgICAgICAgICAgICAgaWYgZ3IgPj0gMSBhbmQgZ3IgPD0gUk9XUyBhbmQgZ2MgPj0gMSBhbmQgZ2MgPD0gQ09MUyB0aGVuCiAgICAgICAgICAgICAgICAgICAgZ3JpZFtncl1bZ2NdID0gcHQKICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICBlbmQKICAgICAgICBlbmQKICAgIGVuZAplbmQKCi0tIEZpbmQgY29tcGxldGVkIGxpbmVzCmxvY2FsIGZ1bmN0aW9uIGZpbmRfbGluZXMoZ3JpZCkKICAgIGxvY2FsIHJvd3MgPSB7fQogICAgZm9yIHIgPSAxLCBST1dTIGRvCiAgICAgICAgbG9jYWwgZnVsbCA9IHRydWUKICAgICAgICBmb3IgYyA9IDEsIENPTFMgZG8KICAgICAgICAgICAgaWYgZ3JpZFtyXVtjXSA9PSAwIHRoZW4gZnVsbCA9IGZhbHNlOyBicmVhayBlbmQKICAgICAgICBlbmQKICAgICAgICBpZiBmdWxsIHRoZW4gcm93c1sjcm93cyArIDFdID0gciBlbmQKICAgIGVuZAogICAgcmV0dXJuIHJvd3MKZW5kCgotLSBSZW1vdmUgY2xlYXJlZCByb3dzIGFuZCBjb2xsYXBzZQpsb2NhbCBmdW5jdGlvbiByZW1vdmVfbGluZXMoZ3JpZCwgcm93cykKICAgIHRhYmxlLnNvcnQocm93cykKICAgIGZvciBpID0gI3Jvd3MsIDEsIC0xIGRvIHRhYmxlLnJlbW92ZShncmlkLCByb3dzW2ldKSBlbmQKICAgIGZvciBpID0gMSwgI3Jvd3MgZG8KICAgICAgICBsb2NhbCByb3cgPSB7fQogICAgICAgIGZvciBjID0gMSwgQ09MUyBkbyByb3dbY10gPSAwIGVuZAogICAgICAgIHRhYmxlLmluc2VydChncmlkLCAxLCByb3cpCiAgICBlbmQKZW5kCgotLSBORVMgcmFuZG9taXplcjogcGljayByYW5kb20sIHJlcm9sbCBvbmNlIGlmIHNhbWUgYXMgcHJldmlvdXMKbG9jYWwgZnVuY3Rpb24gcmFuZF9waWVjZShwcmV2KQogICAgbG9jYWwgdCA9IGdnLm1hdGgucmFuZG9tKDEsIDcpCiAgICBpZiB0ID09IHByZXYgdGhlbiB0ID0gZ2cubWF0aC5yYW5kb20oMSwgNykgZW5kCiAgICByZXR1cm4gdAplbmQKCi0tIFNwYXduIGNvbHVtbiAoY2VudGVyZWQpCmxvY2FsIGZ1bmN0aW9uIHNwYXduX2NvbChwdCkKICAgIGxvY2FsIHcgPSAjUFtwdF0uc1sxXVsxXQogICAgcmV0dXJuIG1hdGguZmxvb3IoKENPTFMgLSB3KSAvIDIpICsgMQplbmQKCi0tIFNwYXduIHJvdzogZmlyc3QgZmlsbGVkIHJvdyBvZiBwaWVjZSBhdCBncmlkIHJvdyAxCmxvY2FsIGZ1bmN0aW9uIHNwYXduX3JvdyhwdCkKICAgIGxvY2FsIHN0YXRlID0gUFtwdF0uc1sxXQogICAgZm9yIHIgPSAxLCAjc3RhdGUgZG8KICAgICAgICBmb3IgYyA9IDEsICNzdGF0ZVtyXSBkbwogICAgICAgICAgICBpZiBzdGF0ZVtyXVtjXSA9PSAxIHRoZW4gcmV0dXJuIDIgLSByIGVuZAogICAgICAgIGVuZAogICAgZW5kCiAgICByZXR1cm4gMAplbmQKCmxvY2FsIGZ1bmN0aW9uIGluaXQodSkKICAgIHUuUCA9IFAgIC0tIHNoYXJlIHBpZWNlIGRlZnMgd2l0aCByZW5kZXIKICAgIHUuZ3JpZCA9IHt9CiAgICBmb3IgciA9IDEsIFJPV1MgZG8KICAgICAgICB1LmdyaWRbcl0gPSB7fQogICAgICAgIGZvciBjID0gMSwgQ09MUyBkbyB1LmdyaWRbcl1bY10gPSAwIGVuZAogICAgZW5kCiAgICB1LnNjb3JlID0gMAogICAgdS5sZXZlbCA9IDAKICAgIHUubGluZXMgPSAwCiAgICB1LmdhbWVfb3ZlciA9IGZhbHNlCiAgICB1Lm5leHRfdHlwZSA9IHJhbmRfcGllY2UoMCkKICAgIHUuc3RhdGUgPSAic3Bhd24iCiAgICB1LnN0YXRlX3QgPSAwCiAgICB1LmRhc19kaXIgPSAwCiAgICB1LmRhc190ID0gMAogICAgdS5kYXNfY2hhcmdlZCA9IGZhbHNlCiAgICB1LmdyYXZfdCA9IDAKICAgIHUuc29mdF9jZWxscyA9IDAKICAgIHUucHQgPSBuaWwKICAgIHUucm90ID0gMQogICAgdS5wciA9IDAKICAgIHUucGMgPSAwCiAgICB1LmNsZWFyX3Jvd3MgPSB7fQogICAgdS5jbGVhcl9wcm9ncmVzcyA9IDAKICAgIHUucHJldl9sZXZlbCA9IDAKICAgIHUubGFzdF9zY29yZV9taWxlc3RvbmUgPSAwCiAgICB1LnBpZWNlc19wbGFjZWQgPSAwCmVuZAoKbG9jYWwgZnVuY3Rpb24gc3Bhd24odSkKICAgIHUucHQgPSB1Lm5leHRfdHlwZQogICAgdS5yb3QgPSAxCiAgICB1LnBjID0gc3Bhd25fY29sKHUucHQpCiAgICB1LnByID0gc3Bhd25fcm93KHUucHQpCiAgICB1Lm5leHRfdHlwZSA9IHJhbmRfcGllY2UodS5wdCkKICAgIHUuZ3Jhdl90ID0gMAogICAgdS5zb2Z0X2NlbGxzID0gMAogICAgaWYgbm90IGZpdHModS5ncmlkLCB1LnB0LCB1LnJvdCwgdS5wciwgdS5wYykgdGhlbgogICAgICAgIGxvY2sodS5ncmlkLCB1LnB0LCB1LnJvdCwgdS5wciwgdS5wYykKICAgICAgICB1LnN0YXRlID0gImdhbWVvdmVyIgogICAgICAgIHUuZ2FtZV9vdmVyID0gdHJ1ZQogICAgICAgIGVtaXQodSwgImdhbWVvdmVyIikKICAgICAgICBnZy5sb2coIkdhbWUgb3ZlciDigJQgTGV2ZWwgIiAuLiB1LmxldmVsIC4uICIsICIgLi4gdS5saW5lcyAuLiAiIGxpbmVzLCBTY29yZTogIiAuLiB1LnNjb3JlKQogICAgICAgIGdnLmtleUZyYW1lSGludCgiR2FtZSBvdmVyIOKAlCBmaW5hbCBzY29yZSAiIC4uIHUuc2NvcmUpCiAgICAgICAgZ2cuZ2FtZU92ZXIodS5zY29yZSkKICAgICAgICByZXR1cm4KICAgIGVuZAogICAgdS5zdGF0ZSA9ICJwbGF5aW5nIgplbmQKCnJldHVybiBmdW5jdGlvbih1LCBpbnRlbnQsIGR0KQogICAgdS5ldmVudHMgPSB7fQogICAgaWYgbm90IGludGVudCB0aGVuIGludGVudCA9IHt9IGVuZAoKICAgIGlmIG5vdCB1Ll9pbml0IHRoZW4KICAgICAgICB1Ll9pbml0ID0gdHJ1ZQogICAgICAgIGluaXQodSkKICAgICAgICBnZy5ncmFwaGljcy5zZXRCYWNrZ3JvdW5kQ29sb3IoMSwgMSwgMSkKICAgICAgICBnZy5sb2coIlRldHJpcyBiZWdpbnMg4oCUIExldmVsIDAiKQogICAgZW5kCgogICAgaWYgdS5zdGF0ZSA9PSAiZ2FtZW92ZXIiIHRoZW4KICAgICAgICBpZiBpbnRlbnQucm90Ul9qdXN0IG9yIGludGVudC5yb3RMX2p1c3Qgb3IgaW50ZW50LnRhcCB0aGVuIGluaXQodSkgZW5kCiAgICAgICAgcmV0dXJuIHUuZXZlbnRzCiAgICBlbmQKCiAgICBpZiB1LnN0YXRlID09ICJzcGF3biIgdGhlbgogICAgICAgIHNwYXduKHUpCiAgICAgICAgcmV0dXJuIHUuZXZlbnRzCiAgICBlbmQKCiAgICBpZiB1LnN0YXRlID09ICJhcmUiIHRoZW4KICAgICAgICB1LnN0YXRlX3QgPSB1LnN0YXRlX3QgLSBkdAogICAgICAgIGlmIHUuc3RhdGVfdCA8PSAwIHRoZW4gdS5zdGF0ZSA9ICJzcGF3biIgZW5kCiAgICAgICAgcmV0dXJuIHUuZXZlbnRzCiAgICBlbmQKCiAgICBpZiB1LnN0YXRlID09ICJjbGVhcmluZyIgdGhlbgogICAgICAgIHUuc3RhdGVfdCA9IHUuc3RhdGVfdCAtIGR0CiAgICAgICAgdS5jbGVhcl9wcm9ncmVzcyA9IDEgLSBtYXRoLm1heCgwLCB1LnN0YXRlX3QpIC8gQ0xFQVJfVElNRQogICAgICAgIGlmIHUuc3RhdGVfdCA8PSAwIHRoZW4KICAgICAgICAgICAgcmVtb3ZlX2xpbmVzKHUuZ3JpZCwgdS5jbGVhcl9yb3dzKQogICAgICAgICAgICBsb2NhbCBuID0gI3UuY2xlYXJfcm93cwogICAgICAgICAgICB1LmxpbmVzID0gdS5saW5lcyArIG4KICAgICAgICAgICAgdS5sZXZlbCA9IG1hdGguZmxvb3IodS5saW5lcyAvIDEwKQogICAgICAgICAgICB1LnNjb3JlID0gbWF0aC5taW4oOTk5OTk5LCB1LnNjb3JlICsgKFNDT1JFX1RCTFtuXSBvciAwKSAqICh1LmxldmVsICsgMSkpCgogICAgICAgICAgICBsb2NhbCBuYW1lcyA9IHtbMV09IlNpbmdsZSIsIFsyXT0iRG91YmxlIiwgWzNdPSJUcmlwbGUiLCBbNF09IlRldHJpcyEifQogICAgICAgICAgICBnZy5sb2cobmFtZXNbbl0gLi4gIiDigJQgIiAuLiBuIC4uICIgbGluZXMgY2xlYXJlZCAodG90YWw6ICIgLi4gdS5saW5lcyAuLiAiLCBsZXZlbCAiIC4uIHUubGV2ZWwgLi4gIikiKQogICAgICAgICAgICBpZiBuID09IDQgdGhlbgogICAgICAgICAgICAgICAgZ2cua2V5RnJhbWVIaW50KCJUZXRyaXMhIDQgbGluZXMgY2xlYXJlZCBhdCBvbmNlIikKICAgICAgICAgICAgZW5kCgogICAgICAgICAgICBpZiB1LmxldmVsID4gdS5wcmV2X2xldmVsIHRoZW4KICAgICAgICAgICAgICAgIGdnLmxvZygiTGV2ZWwgdXAhIE5vdyBsZXZlbCAiIC4uIHUubGV2ZWwpCiAgICAgICAgICAgICAgICB1LnByZXZfbGV2ZWwgPSB1LmxldmVsCiAgICAgICAgICAgIGVuZAoKICAgICAgICAgICAgbG9jYWwgbWlsZXN0b25lID0gbWF0aC5mbG9vcih1LnNjb3JlIC8gMTAwMDApICogMTAwMDAKICAgICAgICAgICAgaWYgbWlsZXN0b25lID4gdS5sYXN0X3Njb3JlX21pbGVzdG9uZSBhbmQgbWlsZXN0b25lID4gMCB0aGVuCiAgICAgICAgICAgICAgICB1Lmxhc3Rfc2NvcmVfbWlsZXN0b25lID0gbWlsZXN0b25lCiAgICAgICAgICAgICAgICBnZy5sb2coIlNjb3JlIHJlYWNoZWQgIiAuLiBtaWxlc3RvbmUgLi4gIiBwb2ludHMiKQogICAgICAgICAgICAgICAgZ2cua2V5RnJhbWVIaW50KCJTY29yZSBtaWxlc3RvbmU6ICIgLi4gbWlsZXN0b25lIC4uICIgcG9pbnRzIikKICAgICAgICAgICAgZW5kCgogICAgICAgICAgICB1LmNsZWFyX3Jvd3MgPSB7fQogICAgICAgICAgICB1LnN0YXRlID0gImFyZSIKICAgICAgICAgICAgdS5zdGF0ZV90ID0gQVJFX1RJTUUKICAgICAgICBlbmQKICAgICAgICByZXR1cm4gdS5ldmVudHMKICAgIGVuZAoKICAgIC0tID09PT09PT09IFBMQVlJTkcgPT09PT09PT0KICAgIGlmIHUuc3RhdGUgfj0gInBsYXlpbmciIHRoZW4gcmV0dXJuIHUuZXZlbnRzIGVuZAoKICAgIGxvY2FsIHN4ID0gaW50ZW50LnN4IG9yIDAKICAgIGxvY2FsIHN5ID0gaW50ZW50LnN5IG9yIDAKICAgIGxvY2FsIG1vdmVfZGlyID0gMAogICAgaWYgc3ggPCAtMC4zIHRoZW4gbW92ZV9kaXIgPSAtMQogICAgZWxzZWlmIHN4ID4gMC4zIHRoZW4gbW92ZV9kaXIgPSAxIGVuZAogICAgbG9jYWwgc29mdF9kcm9wID0gc3kgPiAwLjMKCiAgICAtLSBSb3RhdGlvbiAobm8gd2FsbCBraWNrcyDigJQganVzdCBmYWlsIGlmIGJsb2NrZWQpCiAgICBpZiBpbnRlbnQucm90Ul9qdXN0IHRoZW4KICAgICAgICBsb2NhbCBuciA9ICh1LnJvdCAlICNQW3UucHRdLnMpICsgMQogICAgICAgIGlmIGZpdHModS5ncmlkLCB1LnB0LCBuciwgdS5wciwgdS5wYykgdGhlbgogICAgICAgICAgICB1LnJvdCA9IG5yCiAgICAgICAgICAgIGVtaXQodSwgInJvdGF0ZSIpCiAgICAgICAgZW5kCiAgICBlbmQKICAgIGlmIGludGVudC5yb3RMX2p1c3QgdGhlbgogICAgICAgIGxvY2FsIG5yID0gKCh1LnJvdCAtIDIpICUgI1BbdS5wdF0ucykgKyAxCiAgICAgICAgaWYgZml0cyh1LmdyaWQsIHUucHQsIG5yLCB1LnByLCB1LnBjKSB0aGVuCiAgICAgICAgICAgIHUucm90ID0gbnIKICAgICAgICAgICAgZW1pdCh1LCAicm90YXRlIikKICAgICAgICBlbmQKICAgIGVuZAoKICAgIC0tIERBUyAoRGVsYXllZCBBdXRvIFNoaWZ0KTogMTYgZnJhbWUgaW5pdGlhbCwgNiBmcmFtZSByZXBlYXQKICAgIGlmIG1vdmVfZGlyIH49IDAgdGhlbgogICAgICAgIGlmIG1vdmVfZGlyIH49IHUuZGFzX2RpciB0aGVuCiAgICAgICAgICAgIHUuZGFzX2RpciA9IG1vdmVfZGlyCiAgICAgICAgICAgIHUuZGFzX3QgPSAwCiAgICAgICAgICAgIHUuZGFzX2NoYXJnZWQgPSBmYWxzZQogICAgICAgICAgICBpZiBmaXRzKHUuZ3JpZCwgdS5wdCwgdS5yb3QsIHUucHIsIHUucGMgKyBtb3ZlX2RpcikgdGhlbgogICAgICAgICAgICAgICAgdS5wYyA9IHUucGMgKyBtb3ZlX2RpcgogICAgICAgICAgICAgICAgZW1pdCh1LCAibW92ZSIpCiAgICAgICAgICAgIGVuZAogICAgICAgIGVsc2UKICAgICAgICAgICAgdS5kYXNfdCA9IHUuZGFzX3QgKyBkdAogICAgICAgICAgICBpZiBub3QgdS5kYXNfY2hhcmdlZCB0aGVuCiAgICAgICAgICAgICAgICBpZiB1LmRhc190ID49IERBU19ERUxBWSB0aGVuCiAgICAgICAgICAgICAgICAgICAgdS5kYXNfY2hhcmdlZCA9IHRydWUKICAgICAgICAgICAgICAgICAgICB1LmRhc190ID0gdS5kYXNfdCAtIERBU19ERUxBWQogICAgICAgICAgICAgICAgICAgIGlmIGZpdHModS5ncmlkLCB1LnB0LCB1LnJvdCwgdS5wciwgdS5wYyArIG1vdmVfZGlyKSB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgIHUucGMgPSB1LnBjICsgbW92ZV9kaXIKICAgICAgICAgICAgICAgICAgICAgICAgZW1pdCh1LCAibW92ZSIpCiAgICAgICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgd2hpbGUgdS5kYXNfdCA+PSBEQVNfUkVQRUFUIGRvCiAgICAgICAgICAgICAgICAgICAgdS5kYXNfdCA9IHUuZGFzX3QgLSBEQVNfUkVQRUFUCiAgICAgICAgICAgICAgICAgICAgaWYgZml0cyh1LmdyaWQsIHUucHQsIHUucm90LCB1LnByLCB1LnBjICsgbW92ZV9kaXIpIHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgdS5wYyA9IHUucGMgKyBtb3ZlX2RpcgogICAgICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGVuZAogICAgICAgIGVuZAogICAgZWxzZQogICAgICAgIHUuZGFzX2RpciA9IDAKICAgICAgICB1LmRhc190ID0gMAogICAgICAgIHUuZGFzX2NoYXJnZWQgPSBmYWxzZQogICAgZW5kCgogICAgLS0gR3Jhdml0eSArIHNvZnQgZHJvcCAoZHJvcCBhdCBtb3N0IDEgY2VsbCBwZXIgZnJhbWUgdG8gYXZvaWQgdmlzdWFsIGp1bXBpbmcpCiAgICBsb2NhbCBkcm9wX3NwZCA9IEdSQVZJVFlbdS5sZXZlbF0gb3IgKDEgLyA2MCkKICAgIGlmIHNvZnRfZHJvcCB0aGVuIGRyb3Bfc3BkID0gbWF0aC5taW4oZHJvcF9zcGQsIFNPRlRfU1BEKSBlbmQKCiAgICB1LmdyYXZfdCA9IHUuZ3Jhdl90ICsgZHQKICAgIGlmIHUuZ3Jhdl90ID49IGRyb3Bfc3BkIHRoZW4KICAgICAgICB1LmdyYXZfdCA9IHUuZ3Jhdl90IC0gZHJvcF9zcGQKICAgICAgICBpZiB1LmdyYXZfdCA+IGRyb3Bfc3BkIHRoZW4gdS5ncmF2X3QgPSBkcm9wX3NwZCBlbmQgIC0tIGNhcCBhY2N1bXVsYXRvcgogICAgICAgIGlmIGZpdHModS5ncmlkLCB1LnB0LCB1LnJvdCwgdS5wciArIDEsIHUucGMpIHRoZW4KICAgICAgICAgICAgdS5wciA9IHUucHIgKyAxCiAgICAgICAgICAgIGlmIHNvZnRfZHJvcCB0aGVuIHUuc29mdF9jZWxscyA9IHUuc29mdF9jZWxscyArIDEgZW5kCiAgICAgICAgZWxzZQogICAgICAgICAgICAtLSBMb2NrIGluc3RhbnRseSAobm8gbG9jayBkZWxheSDigJQgTkVTIGJlaGF2aW9yKQogICAgICAgICAgICBsb2NrKHUuZ3JpZCwgdS5wdCwgdS5yb3QsIHUucHIsIHUucGMpCiAgICAgICAgICAgIHUuc2NvcmUgPSBtYXRoLm1pbig5OTk5OTksIHUuc2NvcmUgKyB1LnNvZnRfY2VsbHMpCiAgICAgICAgICAgIHUucGllY2VzX3BsYWNlZCA9IHUucGllY2VzX3BsYWNlZCArIDEKICAgICAgICAgICAgaWYgdS5waWVjZXNfcGxhY2VkID09IDEgdGhlbgogICAgICAgICAgICAgICAgZ2cubG9nKCJGaXJzdCBwaWVjZSBwbGFjZWQiKQogICAgICAgICAgICBlbmQKICAgICAgICAgICAgZW1pdCh1LCAi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IEJPUkRFUiAgID0gezAuMjE2LCAwLjIyNCwgMC42MDR9ICAgLS0gIzM3Mzk5QSAocHJpbWFyeSA1MDApCmxvY2FsIFRFWFRfRElNICA9IHswLjQzNSwgMC40NDAsIDAuNTIyfSAgLS0gIzZGNzA4NSAodWlMYWJlbERpc2FibGVkKQpsb2NhbCBURVhUX01JRCAgPSB7MC4yNzUsIDAuMjc4LCAwLjM2MX0gIC0tICM0NjQ3NUMgKHVpTGFiZWxTdWJ0aXRsZSkKbG9jYWwgVEVYVF9CUlQgID0gezAuMTM3LCAwLjEzNywgMC4yMDB9ICAtLSAjMjMyMzMzICh1aUxhYmVsQmFzZSkKCi0tIFBpZWNlIGNvbG9ycyBtYXBwZWQgdG8gYXBwIHF1YW50aXplZCBwYWxldHRlCmxvY2FsIENPTE9SUyA9IHsKICAgIHswLjE2LCAwLjcxLCAwLjk2fSwgIC0tIDE6IEkgIOKAlCBxdWFudGl6ZWQtYmx1ZSAjMjhCNkY2CiAgICB7MC45OCwgMC43OCwgMC4yMn0sICAtLSAyOiBPICDigJQgcXVhbnRpemVkLXllbGxvdyAjRkFDNjM3CiAgICB7MC42OSwgMC4zMywgMC44Mn0sICAtLSAzOiBUICDigJQgcXVhbnRpemVkLXB1cnBsZSAjQjA1NEQxCiAgICB7MC4zMywgMC43NCwgMC4yOX0sICAtLSA0OiBTICDigJQgcXVhbnRpemVkLWdyZWVuICM1M0JENEIKICAgIHswLjg1LCAwLjI3LCAwLjI3fSwgIC0tIDU6IFogIOKAlCBxdWFudGl6ZWQtcmVkICNEODQ1NDUKICAgIHswLjQwLCAwLjQwLCAwLjcyfSwgIC0tIDY6IEogIOKAlCBwcmltYXJ5LTMwMCAjNjY3MEQ1CiAgICB7MS4wMCwgMC40OCwgMC4zMn0sICAtLSA3OiBMICDigJQgcXVhbnRpemVkLW9yYW5nZSAjRkY3QTUyCn0KCi0tIFN5bnRoIHNvdW5kIGVmZmVjdHMgKE5FUy1pbnNwaXJlZCwgY3JlYXRlZCBzYWZlbHkg4oCUIG5pbCBpbiBoZWFkbGVzcykKbG9jYWwgc25kID0ge30KaWYgZ2cuYXVkaW8gYW5kIGdnLmF1ZGlvLm5ld1NvdW5kIHRoZW4KICAgIC0tIE1vdmU6IHF1aWNrIGJsaXAsIHNsaWdodCBkb3dud2FyZCBwaXRjaAogICAgc25kLm1vdmUgPSBnZy5hdWRpby5uZXdTb3VuZCh7CiAgICAgICAgd2F2ZWZvcm0gPSAic3F1YXJlIiwgZnJlcVN0YXJ0ID0gMzIwLCBmcmVxRW5kID0gMjQwLCBkdXJhdGlvbiA9IDAuMDQsCiAgICAgICAgdm9sdW1lID0gMC4xOCwgZHV0eSA9IDAuMjUsCiAgICAgICAgZW52ZWxvcGUgPSB7YXR0YWNrID0gMC4wMDIsIGRlY2F5ID0gMC4wMTUsIHN1c3RhaW4gPSAwLjEsIHJlbGVhc2UgPSAwLjAxfQogICAgfSkKCiAgICAtLSBSb3RhdGU6IGJyaWdodCBjaGlycCwgdXB3YXJkIHN3ZWVwCiAgICBzbmQucm90YXRlID0gZ2cuYXVkaW8ubmV3U291bmQoewogICAgICAgIHdhdmVmb3JtID0gInNxdWFyZSIsIGZyZXFTdGFydCA9IDM2MCwgZnJlcUVuZCA9IDU4MCwgZHVyYXRpb24gPSAwLjA2LAogICAgICAgIHZvbHVtZSA9IDAuMjIsIGR1dHkgPSAwLjUsCiAgICAgICAgZW52ZWxvcGUgPSB7YXR0YWNrID0gMC4wMDMsIGRlY2F5ID0gMC4wMiwgc3VzdGFpbiA9IDAuMTUsIHJlbGVhc2UgPSAwLjAxNX0KICAgIH0pCgogICAgLS0gTG9jazogdGh1ZCDigJQgbm9pc2UgYnVyc3QgKyBsb3cgdHJpYW5nbGUKICAgIHNuZC5sb2NrX25vaXNlID0gZ2cuYXVkaW8ubmV3U291bmQoewogICAgICAgIHdhdmVmb3JtID0gIm5vaXNlIiwgZnJlcXVlbmN5ID0gODAsIGR1cmF0aW9uID0gMC4wNywgdm9sdW1lID0gMC4yNSwKICAgICAgICBlbnZlbG9wZSA9IHthdHRhY2sgPSAwLjAwMiwgZGVjYXkgPSAwLjAzLCBzdXN0YWluID0gMC4xNSwgcmVsZWFzZSA9IDAuMDJ9CiAgICB9KQogICAgc25kLmxvY2tfdG9uZSA9IGdnLmF1ZGlvLm5ld1NvdW5kKHsKICAgICAgICB3YXZlZm9ybSA9ICJ0cmlhbmdsZSIsIGZyZXFTdGFydCA9IDE4MCwgZnJlcUVuZCA9IDkwLCBkdXJhdGlvbiA9IDAuMDgsCiAgICAgICAgdm9sdW1lID0gMC4yLAogICAgICAgIGVudmVsb3BlID0ge2F0dGFjayA9IDAuMDAzLCBkZWNheSA9IDAuMDQsIHN1c3RhaW4gPSAwLjEsIHJlbGVhc2UgPSAwLjAyfQogICAgfSkKCiAgICAtLSBTaW5nbGUgbGluZSBjbGVhcjogYXNjZW5kaW5nIHN3ZWVwCiAgICBzbmQuY2xlYXIxID0gZ2cuYXVkaW8ubmV3U291bmQoewogICAgICAgIHdhdmVmb3JtID0gInNxdWFyZSIsIGZyZXFTdGFydCA9IDMzMCwgZnJlcUVuZCA9IDY2MCwgZHVyYXRpb24gPSAwLjE4LAogICAgICAgIHZvbHVtZSA9IDAuMjUsIGR1dHkgPSAwLjUsCiAgICAgICAgZW52ZWxvcGUgPSB7YXR0YWNrID0gMC4wMDUsIGRlY2F5ID0gMC4wNCwgc3VzdGFpbiA9IDAuNSwgcmVsZWFzZSA9IDAuMDh9CiAgICB9KQoKICAgIC0tIERvdWJsZSBsaW5lIGNsZWFyOiB0d28tdG9uZSBmYW5mYXJlCiAgICBzbmQuY2xlYXIyX2xvID0gZ2cuYXVkaW8ubmV3U291bmQoewogICAgICAgIHdhdmVmb3JtID0gInNxdWFyZSIsIGZyZXFTdGFydCA9IDM5MiwgZnJlcUVuZCA9IDUyMywgZHVyYXRpb24gPSAwLjIsCiAgICAgICAgdm9sdW1lID0gMC4yMiwgZHV0eSA9IDAuNSwKICAgICAgICBlbnZlbG9wZSA9IHthdHRhY2sgPSAwLjAwNSwgZGVjYXkgPSAwLjA1LCBzdXN0YWluID0gMC40NSwgcmVsZWFzZSA9IDAuMDh9CiAgICB9KQogICAgc25kLmNsZWFyMl9oaSA9IGdnLmF1ZGlvLm5ld1NvdW5kKHsKICAgICAgICB3YXZlZm9ybSA9ICJzYXd0b290aCIsIGZyZXFTdGFydCA9IDUyMywgZnJlcUVuZCA9IDc4NCwgZHVyYXRpb24gPSAwLjIyLAogICAgICAgIHZvbHVtZSA9IDAuMTUsCiAgICAgICAgZW52ZWxvcGUgPSB7YXR0YWNrID0gMC4wMiwgZGVjYXkgPSAwLjA2LCBzdXN0YWluID0gMC4zNSwgcmVsZWFzZSA9IDAuMX0KICAgIH0pCgogICAgLS0gVHJpcGxlIGxpbmUgY2xlYXI6IHRyaXVtcGhhbnQgcmlzaW5nIGNob3JkCiAgICBzbmQuY2xlYXIzX2xvID0gZ2cuYXVkaW8ubmV3U291bmQoewogICAgICAgIHdhdmVmb3JtID0gInNxdWFyZSIsIGZyZXFTdGFydCA9IDQ0MCwgZnJlcUVuZCA9IDY2MCwgZHVyYXRpb24gPSAwLjI1LAogICAgICAgIHZvbHVtZSA9IDAuMiwgZHV0eSA9IDAuNSwKICAgICAgICBlbnZlbG9wZSA9IHthdHRhY2sgPSAwLjAwNSwgZGVjYXkgPSAwLjA2LCBzdXN0YWluID0gMC41LCByZWxlYXNlID0gMC4xfQogICAgfSkKICAgIHNuZC5jbGVhcjNfbWlkID0gZ2cuYXVkaW8ubmV3U291bmQoewogICAgICAgIHdhdmVmb3JtID0gInNhd3Rvb3RoIiwgZnJlcVN0YXJ0ID0gNTU0LCBmcmVxRW5kID0gODgwLCBkdXJhdGlvbiA9IDAuMjgsCiAgICAgICAgdm9sdW1lID0gMC4xNSwKICAgICAgICBlbnZlbG9wZSA9IHthdHRhY2sgPSAwLjAyLCBkZWNheSA9IDAuMDYsIHN1c3RhaW4gPSAwLjQsIHJlbGVhc2UgPSAwLjEyfQogICAgfSkKICAgIHNuZC5jbGVhcjNfaGkgPSBnZy5hdWRpby5uZXdTb3VuZCh7CiAgICAgICAgd2F2ZWZvcm0gPSAidHJpYW5nbGUiLCBmcmVxU3RhcnQgPSA2NjAsIGZyZXFFbmQgPSAxMDQ3LCBkdXJhdGlvbiA9IDAuMywKICAgICAgICB2b2x1bWUgPSAwLjE4LAogICAgICAgIGVudmVsb3BlID0ge2F0dGFjayA9IDAuMDMsIGRlY2F5ID0gMC4wNSwgc3VzdGFpbiA9IDAuNDUsIHJlbGVhc2UgPSAwLjEyfQogICAgfSkKCiAgICAtLSBURVRSSVMgKDQgbGluZXMpOiBiaWcgZHJhbWF0aWMgc3dlZXAgKyBoYXJtb255CiAgICBzbmQudGV0cmlzX2Jhc3MgPSBnZy5hdWRpby5uZXdTb3VuZCh7CiAgICAgICAgd2F2ZWZvcm0gPSAic3F1YXJlIiwgZnJlcVN0YXJ0ID0gMjIwLCBmcmVxRW5kID0gNDQwLCBkdXJhdGlvbiA9IDAuMzUsCiAgICAgICAgdm9sdW1lID0gMC4yNSwgZHV0eSA9IDAuNSwKICAgICAgICBlbnZlbG9wZSA9IHthdHRhY2sgPSAwLjAwNSwgZGVjYXkgPSAwLjA4LCBzdXN0YWluID0gMC41NSwgcmVsZWFzZSA9IDAuMTV9CiAgICB9KQogICAgc25kLnRldHJpc19sZWFkID0gZ2cuYXVkaW8ubmV3U291bmQoewogICAgICAgIHdhdmVmb3JtID0gInNhd3Rvb3RoIiwgZnJlcVN0YXJ0ID0gNDQwLCBmcmVxRW5kID0gMTMyMCwgZHVyYXRpb24gPSAwLjQsCiAgICAgICAgdm9sdW1lID0gMC4yLAogICAgICAgIGVudmVsb3BlID0ge2F0dGFjayA9IDAuMDEsIGRlY2F5ID0gMC4xLCBzdXN0YWluID0gMC41LCByZWxlYXNlID0gMC4xOH0KICAgIH0pCiAgICBzbmQudGV0cmlzX3NoaW1tZXIgPSBnZy5hdWRpby5uZXdTb3VuZCh7CiAgICAgICAgd2F2ZWZvcm0gPSAidHJpYW5nbGUiLCBmcmVxU3RhcnQgPSA4ODAsIGZyZXFFbmQgPSAxNzYwLCBkdXJhdGlvbiA9IDAuNDUsCiAgICAgICAgdm9sdW1lID0gMC4xNSwKICAgICAgICBlbnZlbG9wZSA9IHthdHRhY2sgPSAwLjAzLCBkZWNheSA9IDAuMDgsIHN1c3RhaW4gPSAwLjQsIHJlbGVhc2UgPSAwLjJ9CiAgICB9KQogICAgc25kLnRldHJpc19ub2lzZSA9IGdnLmF1ZGlvLm5ld1NvdW5kKHsKICAgICAgICB3YXZlZm9ybSA9ICJub2lzZSIsIGZyZXF1ZW5jeSA9IDQwMDAsIGR1cmF0aW9uID0gMC4xNSwgdm9sdW1lID0gMC4xMiwKICAgICAgICBlbnZlbG9wZSA9IHthdHRhY2sgPSAwLjAwNSwgZGVjYXkgPSAwLjA2LCBzdXN0YWluID0gMC4xLCByZWxlYXNlID0gMC4wNX0KICAgIH0pCgogICAgLS0gTGV2ZWwgdXA6IGNlbGVicmF0b3J5IGFycGVnZ2lvLWxpa2Ugc3dlZXAKICAgIHNuZC5sZXZlbHVwX2xvID0gZ2cuYXVkaW8ubmV3U291bmQoewogICAgICAgIHdhdmVmb3JtID0gInNxdWFyZSIsIGZyZXFTdGFydCA9IDUyMywgZnJlcUVuZCA9IDEwNDcsIGR1cmF0aW9uID0gMC4yLAogICAgICAgIHZvbHVtZSA9IDAuMjIsIGR1dHkgPSAwLjUsCiAgICAgICAgZW52ZWxvcGUgPSB7YXR0YWNrID0gMC4wMDUsIGRlY2F5ID0gMC4wNSwgc3VzdGFpbiA9IDAuNCwgcmVsZWFzZSA9IDAuMX0KICAgIH0pCiAgICBzbmQubGV2ZWx1cF9oaSA9IGdnLmF1ZGlvLm5ld1NvdW5kKHsKICAgICAgICB3YXZlZm9ybSA9ICJ0cmlhbmdsZSIsIGZyZXFTdGFydCA9IDc4NCwgZnJlcUVuZCA9IDE1NjgsIGR1cmF0aW9uID0gMC4yNSwKICAgICAgICB2b2x1bWUgPSAwLjE4LAogICAgICAgIGVudmVsb3BlID0ge2F0dGFjayA9IDAuMDIsIGRlY2F5ID0gMC4wNiwgc3VzdGFpbiA9IDAuMzUsIHJlbGVhc2UgPSAwLjEyfQogICAgfSkKCiAgICAtLSBHYW1lIG92ZXI6IGRlc2NlbmRpbmcgZG9vbQogICAgc25kLmdhbWVvdmVyX2ZhbGwgPSBnZy5hdWRpby5uZXdTb3VuZCh7CiAgICAgICAgd2F2ZWZvcm0gPSAic3F1YXJlIiwgZnJlcVN0YXJ0ID0gNDQwLCBmcmVxRW5kID0gNTUsIGR1cmF0aW9uID0gMC42LAogICAgICAgIHZvbHVtZSA9IDAuMywgZHV0eSA9IDAuNSwKICAgICAgICBlbnZlbG9wZSA9IHthdHRhY2sgPSAwLjAwNSwgZGVjYXkgPSAwLjE1LCBzdXN0YWluID0gMC41LCByZWxlYXNlID0gMC4yNX0KICAgIH0pCiAgICBzbmQuZ2FtZW92ZXJfcnVtYmxlID0gZ2cuYXVkaW8ubmV3U291bmQoewogICAgICAgIHdhdmVmb3JtID0gIm5vaXNlIiwgZnJlcXVlbmN5ID0gMTIwLCBkdXJhdGlvbiA9IDAuNSwgdm9sdW1lID0gMC4yLAogICAgICAgIGVudmVsb3BlID0ge2F0dGFjayA9IDAuMDEsIGRlY2F5ID0gMC4xNSwgc3VzdGFpbiA9IDAuMywgcmVsZWFzZSA9IDAuMn0KICAgIH0pCiAgICBzbmQuZ2FtZW92ZXJfdG9uZSA9IGdnLmF1ZGlvLm5ld1NvdW5kKHsKICAgICAgICB3YXZlZm9ybSA9ICJzYXd0b290aCIsIGZyZXFTdGFydCA9IDIyMCwgZnJlcUVuZCA9IDU1LCBkdXJhdGlvbiA9IDAuNywKICAgICAgICB2b2x1bWUgPSAwLjE1LAogICAgICAgIGVudmVsb3BlID0ge2F0dGFjayA9IDAuMDEsIGRlY2F5ID0gMC4yLCBzdXN0YWluID0gMC4zLCByZWxlYXNlID0gMC4zfQogICAgfSkKZW5kCmxvY2FsIHByZXZfbGV2ZWwgPSAwCmxvY2FsIGdhbWVvdmVyX3NuZF9wbGF5ZWQgPSBmYWxzZQoKbG9jYWwgZnVuY3Rpb24gZHJhd19ibG9jayh4LCB5LCBjaSkKICAgIGxvY2FsIGMgPSBDT0xPUlNbY2ldCiAgICAtLSBGaWxsCiAgICBnZy5ncmFwaGljcy5zZXRDb2xvcihjWzFdLCBjWzJdLCBjWzNdKQogICAgZ2cuZ3JhcGhpY3MucmVjdGFuZ2xlKCJmaWxsIiwgeCArIDEsIHkgKyAxLCBDRUxMIC0gMiwgQ0VMTCAtIDIpCiAgICAtLSBIaWdobGlnaHQgKHRvcC1sZWZ0IGJldmVsKQogICAgZ2cuZ3JhcGhpY3Muc2V0Q29sb3IobWF0aC5taW4oMSwgY1sxXSArIDAuMjUpLCBtYXRoLm1pbigxLCBjWzJdICsgMC4yNSksIG1hdGgubWluKDEsIGNbM10gKyAwLjI1KSkKICAgIGdnLmdyYXBoaWNzLnJlY3RhbmdsZSgiZmlsbCIsIHggKyAxLCB5ICsgMSwgQ0VMTCAtIDIsIDIpCiAgICBnZy5ncmFwaGljcy5yZWN0YW5nbGUoImZpbGwiLCB4ICsgMSwgeSArIDEsIDIsIENFTEwgLSAyKQogICAgLS0gU2hhZG93IChib3R0b20tcmlnaHQpCiAgICBnZy5ncmFwaGljcy5zZXRDb2xvcihjWzFdICogMC40NSwgY1syXSAqIDAuNDUsIGNbM10gKiAwLjQ1KQogICAgZ2cuZ3JhcGhpY3MucmVjdGFuZ2xlKCJmaWxsIiwgeCArIDEsIHkgKyBDRUxMIC0gMywgQ0VMTCAtIDIsIDIpCiAgICBnZy5ncmFwaGljcy5yZWN0YW5nbGUoImZpbGwiLCB4ICsgQ0VMTCAtIDMsIHkgKyAxLCAyLCBDRUxMIC0gMikKZW5kCgpyZXR1cm4gZnVuY3Rpb24odSwgZXZlbnRzKQogICAgaWYgbm90IGV2ZW50cyB0aGVuIGV2ZW50cyA9IHt9IGVuZAogICAgaWYgbm90IHUgb3Igbm90IHUuZ3JpZCB0aGVuIHJldHVybiBlbmQKCiAgICAtLSBSZXNldCBvbmUtc2hvdCBmbGFncyBvbiByZXN0YXJ0CiAgICBpZiBub3QgdS5nYW1lX292ZXIgdGhlbiBnYW1lb3Zlcl9zbmRfcGxheWVkID0gZmFsc2UgZW5kCgogICAgLS0gUGxheSBzb3VuZHMgZnJvbSBldmVudHMKICAgIGZvciBfLCBlIGluIGlwYWlycyhldmVudHMpIGRvCiAgICAgICAgaWYgZS5uYW1lID09ICJtb3ZlIiBhbmQgc25kLm1vdmUgdGhlbgogICAgICAgICAgICBzbmQubW92ZTpwbGF5KCkKICAgICAgICBlbHNlaWYgZS5uYW1lID09ICJyb3RhdGUiIGFuZCBzbmQucm90YXRlIHRoZW4KICAgICAgICAgICAgc25kLnJvdGF0ZTpwbGF5KCkKICAgICAgICBlbHNlaWYgZS5uYW1lID09ICJsb2NrIiB0aGVuCiAgICAgICAgICAgIGlmIHNuZC5sb2NrX25vaXNlIHRoZW4gc25kLmxvY2tfbm9pc2U6cGxheSgpIGVuZAogICAgICAgICAgICBpZiBzbmQubG9ja190b25lIHRoZW4gc25kLmxvY2tfdG9uZTpwbGF5KCkgZW5kCiAgICAgICAgZWxzZWlmIGUubmFtZSA9PSAiY2xlYXIiIHRoZW4KICAgICAgICAgICAgbG9jYWwgbiA9IGUuZGF0YSBhbmQgZS5kYXRhLmxpbmVzIG9yIDEKICAgICAgICAgICAgaWYgbiA+PSA0IHRoZW4KICAgICAgICAgICAgICAgIC0tIFRFVFJJUyEgRnVsbCBsYXllcmVkIGZhbmZhcmUKICAgICAgICAgICAgICAgIGlmIHNuZC50ZXRyaXNfYmFzcyB0aGVuIHNuZC50ZXRyaXNfYmFzczpwbGF5KCkgZW5kCiAgICAgICAgICAgICAgICBpZiBzbmQudGV0cmlzX2xlYWQgdGhlbiBzbmQudGV0cmlzX2xlYWQ6cGxheSgpIGVuZAogICAgICAgICAgICAgICAgaWYgc25kLnRldHJpc19zaGltbWVyIHRoZW4gc25kLnRldHJpc19zaGltbWVyOnBsYXkoKSBlbmQKICAgICAgICAgICAgICAgIGlmIHNuZC50ZXRyaXNfbm9pc2UgdGhlbiBzbmQudGV0cmlzX25vaXNlOnBsYXkoKSBlbmQKICAgICAgICAgICAgICAgIGdnLmhhcHRpY3MuaW1wYWN0KCJoZWF2eSIpCiAgICAgICAgICAgIGVsc2VpZiBuID09IDMgdGhlbgogICAgICAgICAgICAgICAgaWYgc25kLmNsZWFyM19sbyB0aGVuIHNuZC5jbGVhcjNfbG86cGxheSgpIGVuZAogICAgICAgICAgICAgICAgaWYgc25kLmNsZWFyM19taWQgdGhlbiBzbmQuY2xlYXIzX21pZDpwbGF5KCkgZW5kCiAgICAgICAgICAgICAgICBpZiBzbmQuY2xlYXIzX2hpIHRoZW4gc25kLmNsZWFyM19oaTpwbGF5KCkgZW5kCiAgICAgICAgICAgICAgICBnZy5oYXB0aWNzLmltcGFjdCgibWVkaXVtIikKICAgICAgICAgICAgZWxzZWlmIG4gPT0gMiB0aGVuCiAgICAgICAgICAgICAgICBpZiBzbmQuY2xlYXIyX2xvIHRoZW4gc25kLmNsZWFyMl9sbzpwbGF5KCkgZW5kCiAgICAgICAgICAgICAgICBpZiBzbmQuY2xlYXIyX2hpIHRoZW4gc25kLmNsZWFyMl9oaTpwbGF5KCkgZW5kCiAgICAgICAgICAgICAgICBnZy5oYXB0aWNzLmltcGFjdCgicmlnaWQiKQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBpZiBzbmQuY2xlYXIxIHRoZW4gc25kLmNsZWFyMTpwbGF5KCkgZW5kCiAgICAgICAgICAgIGVuZAogICAgICAgIGVsc2VpZiBlLm5hbWUgPT0gImdhbWVvdmVyIiBhbmQgbm90IGdhbWVvdmVyX3NuZF9wbGF5ZWQgdGhlbgogICAgICAgICAgICBnYW1lb3Zlcl9zbmRfcGxheWVkID0gdHJ1ZQogICAgICAgICAgICBpZiBzbmQuZ2FtZW92ZXJfZmFsbCB0aGVuIHNuZC5nYW1lb3Zlcl9mYWxsOnBsYXkoKSBlbmQKICAgICAgICAgICAgaWYgc25kLmdhbWVvdmVyX3J1bWJsZSB0aGVuIHNuZC5nYW1lb3Zlcl9ydW1ibGU6cGxheSgpIGVuZAogICAgICAgICAgICBpZiBzbmQuZ2FtZW92ZXJfdG9uZSB0aGVuIHNuZC5nYW1lb3Zlcl90b25lOnBsYXkoKSBlbmQKICAgICAgICAgICAgZ2cuaGFwdGljcy5ub3RpZnkoImVycm9yIikKICAgICAgICBlbmQKICAgIGVuZAoKICAgIC0tIExldmVsIHVwIGRldGVjdGlvbgogICAgaWYgdS5sZXZlbCBhbmQgdS5sZXZlbCA+IHByZXZfbGV2ZWwgdGhlbgogICAgICAgIGlmIHNuZC5sZXZlbHVwX2xvIHRoZW4gc25kLmxldmVsdXBfbG86cGxheSgpIGVuZAogICAgICAgIGlmIHNuZC5sZXZlbHVwX2hpIHRoZW4gc25kLmxldmVsdXBfaGk6cGxheSgpIGVuZAogICAgICAgIGdnLmhhcHRpY3Mubm90aWZ5KCJzdWNjZXNzIikKICAgICAgICBwcmV2X2xldmVsID0gdS5sZXZlbAogICAgZWxzZWlmIHUubGV2ZWwgdGhlbgogICAgICAgIHByZXZfbGV2ZWwgPSB1LmxldmVsCiAgICBlbmQKCiAgICAtLSBHcmlkIGJhY2tncm91bmQKICAgIGdnLmdyYXBoaWNzLnNldENvbG9yKEdSSURfQkdbMV0sIEdSSURfQkdbMl0sIEdSSURfQkdbM10pCiAgICBnZy5ncmFwaGljcy5yZWN0YW5nbGUoImZpbGwiLCBHWCwgR1ksIENPTFMgKiBDRUxMLCBST1dTICogQ0VMTCkKCiAgICAtLSBHcmlkIGxpbmVzCiAgICBnZy5ncmFwaGljcy5zZXRDb2xvcihHUklEX0xJTkVbMV0sIEdSSURfTElORVsyXSwgR1JJRF9MSU5FWzNdKQogICAgZm9yIHIgPSAwLCBST1dTIGRvCiAgICAgICAgZ2cuZ3JhcGhpY3MubGluZShHWCwgR1kgKyByICogQ0VMTCwgR1ggKyBDT0xTICogQ0VMTCwgR1kgKyByICogQ0VMTCkKICAgIGVuZAogICAgZm9yIGMgPSAwLCBDT0xTIGRvCiAgICAgICAgZ2cuZ3JhcGhpY3MubGluZShHWCArIGMgKiBDRUxMLCBHWSwgR1ggKyBjICogQ0VMTCwgR1kgKyBST1dTICogQ0VMTCkKICAgIGVuZAoKICAgIC0tIExvY2tlZCBibG9ja3MKICAgIGZvciByID0gMSwgUk9XUyBkbwogICAgICAgIGZvciBjID0gMSwgQ09MUyBkbwogICAgICAgICAgICBsb2NhbCB2ID0gdS5ncmlkW3JdW2NdCiAgICAgICAgICAgIGlmIHYgPiAwIHRoZW4KICAgICAgICAgICAgICAgIGxvY2FsIGNsZWFyaW5nID0gZmFsc2UKICAgICAgICAgICAgICAgIGlmIHUuY2xlYXJfcm93cyB0aGVuCiAgICAgICAgICAgICAgICAgICAgZm9yIF8sIGNyIGluIGlwYWlycyh1LmNsZWFyX3Jvd3MpIGRvCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNyID09IHIgdGhlbiBjbGVhcmluZyA9IHRydWU7IGJyZWFrIGVuZAogICAgICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgICAgICBpZiBjbGVhcmluZyB0aGVuCiAgICAgICAgICAgICAgICAgICAgbG9jYWwgZGlzdCA9IG1hdGguYWJzKGMgLSA1LjUpCiAgICAgICAgICAgICAgICAgICAgbG9jYWwgcmFkaXVzID0gKHUuY2xlYXJfcHJvZ3Jlc3Mgb3IgMCkgKiA1LjUKICAgICAgICAgICAgICAgICAgICBpZiBkaXN0ID49IHJhZGl1cyB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdfYmxvY2soR1ggKyAoYyAtIDEpICogQ0VMTCwgR1kgKyAociAtIDEpICogQ0VMTCwgdikKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIGdnLmdyYXBoaWNzLnNldENvbG9yKDEsIDEsIDEsIDAuNiAtICh1LmNsZWFyX3Byb2dyZXNzIG9yIDApICogMC42KQogICAgICAgICAgICAgICAgICAgICAgICBnZy5ncmFwaGljcy5yZWN0YW5nbGUoImZpbGwiLCBHWCArIChjLTEpKkNFTEwrMSwgR1kgKyAoci0xKSpDRUxMKzEsIENFTEwtMiwgQ0VMTC0yKQogICAgICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIGRyYXdfYmxvY2soR1ggKyAoYyAtIDEpICogQ0VMTCwgR1kgKyAociAtIDEpICogQ0VMTCwgdikKICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICBlbmQKICAgICAgICBlbmQKICAgIGVuZAoKICAgIC0tIEN1cnJlbnQgcGllY2UKICAgIGlmIHUucHQgYW5kIHUuUCBhbmQgdS5zdGF0ZSA9PSAicGxheWluZyIgdGhlbgogICAgICAgIGxvY2FsIHN0YXRlID0gdS5QW3UucHRdLnNbdS5yb3RdCiAgICAgICAgZm9yIHIgPSAxLCAjc3RhdGUgZG8KICAgICAgICAgICAgZm9yIGMgPSAxLCAjc3RhdGVbcl0gZG8KICAgICAgICAgICAgICAgIGlmIHN0YXRlW3JdW2NdID09IDEgdGhlbgogICAgICAgICAgICAgICAgICAgIGxvY2FsIGdyLCBnYyA9IHUucHIgKyByIC0gMSwgdS5wYyArIGMgLSAxCiAgICAgICAgICAgICAgICAgICAgaWYgZ3IgPj0gMSBhbmQgZ3IgPD0gUk9XUyB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdfYmxvY2soR1ggKyAoZ2MgLSAxKSAqIENFTEwsIEdZICsgKGdyIC0gMSkgKiBDRUxMLCB1LnB0KQogICAgICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGVuZAogICAgICAgIGVuZAogICAgZW5kCgogICAgLS0gR3JpZCBib3JkZXIgKGluZGlnbyBhY2NlbnQpCiAgICBnZy5ncmFwaGljcy5zZXRDb2xvcihCT1JERVJbMV0sIEJPUkRFUlsyXSwgQk9SREVSWzNdLCAwLjYpCiAgICBnZy5ncmFwaGljcy5zZXRMaW5lV2lkdGgoMikKICAgIGdnLmdyYXBoaWNzLnJlY3RhbmdsZSgibGluZSIsIEdYIC0gMSwgR1kgLSAxLCBDT0xTICogQ0VMTCArIDIsIFJPV1MgKiBDRUxMICsgMikKICAgIGdnLmdyYXBoaWNzLnNldExpbmVXaWR0aCgxKQoKICAgIC0tIFJpZ2h0IHBhbmVsCiAgICBsb2NhbCBydyA9IFcgLSBQWCAtIDQKCiAgICAtLSBORVhUIHBpZWNlCiAgICBnZy5ncmFwaGljcy5zZXRGb250KDEwKQogICAgZ2cuZ3JhcGhpY3Muc2V0Q29sb3IoVEVYVF9ESU1bMV0sIFRFWFRfRElNWzJdLCBURVhUX0RJTVszXSkKICAgIGdnLmdyYXBoaWNzLnByaW50KCJORVhUIiwgUFgsIEdZICsgMikKCiAgICBpZiB1Lm5leHRfdHlwZSBhbmQgdS5QIHRoZW4KICAgICAgICBsb2NhbCBzdGF0ZSA9IHUuUFt1Lm5leHRfdHlwZV0uc1sxXQogICAgICAgIGxvY2FsIHBjID0gMTQKICAgICAgICBsb2NhbCBwdyA9ICNzdGF0ZVsxXSAqIHBjCiAgICAgICAgbG9jYWwgbnB4ID0gUFggKyA0CiAgICAgICAgbG9jYWwgbnB5ID0gR1kgKyAyMAogICAgICAgIGZvciByID0gMSwgI3N0YXRlIGRvCiAgICAgICAgICAgIGZvciBjID0gMSwgI3N0YXRlW3JdIGRvCiAgICAgICAgICAgICAgICBpZiBzdGF0ZVtyXVtjXSA9PSAxIHRoZW4KICAgICAgICAgICAgICAgICAgICBsb2NhbCBjYyA9IENPTE9SU1t1Lm5leHRfdHlwZV0KICAgICAgICAgICAgICAgICAgICBnZy5ncmFwaGljcy5zZXRDb2xvcihjY1sxXSwgY2NbMl0sIGNjWzNdKQogICAgICAgICAgICAgICAgICAgIGdnLmdyYXBoaWNzLnJlY3RhbmdsZSgiZmlsbCIsIG5weCArIChjLTEpKnBjICsgMSwgbnB5ICsgKHItMSkqcGMgKyAxLCBwYyAtIDIsIHBjIC0gMikKICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICBlbmQKICAgICAgICBlbmQKICAgIGVuZAoKICAgIC0tIFNjb3JlCiAgICBsb2NhbCBzeSA9IEdZICsgODUKICAgIGdnLmdyYXBoaWNzLnNldEZvbnQoOSkKICAgIGdnLmdyYXBoaWNzLnNldENvbG9yKFRFWFRfRElNWzFdLCBURVhUX0RJTVsyXSwgVEVYVF9ESU1bM10pCiAgICBnZy5ncmFwaGljcy5wcmludCgiU0NPUkUiLCBQWCwgc3kpCiAgICBnZy5ncmFwaGljcy5zZXRGb250KDE1KQogICAgZ2cuZ3JhcGhpY3Muc2V0Q29sb3IoVEVYVF9CUlRbMV0sIFRFWFRfQlJUWzJdLCBURVhUX0JSVFszXSkKICAgIGdnLmdyYXBoaWNzLnByaW50KHRvc3RyaW5nKHUuc2NvcmUgb3IgMCksIFBYLCBzeSArIDE0KQoKICAgIC0tIExldmVsCiAgICBzeSA9IHN5ICsgNTAKICAgIGdnLmdyYXBoaWNzLnNldEZvbnQoOSkKICAgIGdnLmdyYXBoaWNzLnNldENvbG9yKFRFWFRfRElNWzFdLCBURVhUX0RJTVsyXSwgVEVYVF9ESU1bM10pCiAgICBnZy5ncmFwaGljcy5wcmludCgiTEVWRUwiLCBQWCwgc3kpCiAgICBnZy5ncmFwaGljcy5zZXRGb250KDE1KQogICAgZ2cuZ3JhcGhpY3Muc2V0Q29sb3IoVEVYVF9CUlRbMV0sIFRFWFRfQlJUWzJdLCBURVhUX0JSVFszXSkKICAgIGdnLmdyYXBoaWNzLnByaW50KHRvc3RyaW5nKHUubGV2ZWwgb3IgMCksIFBYLCBzeSArIDE0KQoKICAgIC0tIExpbmVzCiAgICBzeSA9IHN5ICsgNTAKICAgIGdnLmdyYXBoaWNzLnNldEZvbnQoOSkKICAgIGdnLmdyYXBoaWNzLnNldENvbG9yKFRFWFRfRElNWzFdLCBURVhUX0RJTVsyXSwgVEVYVF9ESU1bM10pCiAgICBnZy5ncmFwaGljcy5wcmludCgiTElORVMiLCBQWCwgc3kpCiAgICBnZy5ncmFwaGljcy5zZXRGb250KDE1KQogICAgZ2cuZ3JhcGhpY3Muc2V0Q29sb3IoVEVYVF9CUlRbMV0sIFRFWFRfQlJUWzJdLCBURVhUX0JSVFszXSkKICAgIGdnLmdyYXBoaWNzLnByaW50KHRvc3RyaW5nKHUubGluZXMgb3IgMCksIFBYLCBzeSArIDE0KQoKICAgIC0tIFRpdGxlCiAgICBnZy5ncmFwaGljcy5zZXRGb250KDE4KQogICAgZ2cuZ3JhcGhpY3Muc2V0Q29sb3IoVEVYVF9CUlRbMV0sIFRFWFRfQlJUWzJdLCBURVhUX0JSVFszXSkKICAgIGxvY2FsIHRpdGxlID0gIlRFVFJJUyIKICAgIGxvY2FsIHR3ID0gZ2cuZ3JhcGhpY3MuZ2V0VGV4dFdpZHRoKHRpdGxlKQogICAgZ2cuZ3JhcGhpY3MucHJpbnQodGl0bGUsIEdYICsgKENPTFMgKiBDRUxMIC0gdHcpIC8gMiwgR1kgLSAzNSkKCiAgICAtLSBHYW1lIG92ZXIgb3ZlcmxheQogICAgaWYgdS5nYW1lX292ZXIgdGhlbgogICAgICAgIGdnLmdyYXBoaWNzLnNldENvbG9yKDEsIDEsIDEsIDAuODUpCiAgICAgICAgZ2cuZ3JhcGhpY3MucmVjdGFuZ2xlKCJmaWxsIiwgMCwgMCwgVywgSCkKICAgICAgICBnZy5ncmFwaGljcy5zZXRGb250KDI4KQogICAgICAgIGdnLmdyYXBoaWNzLnNldENvbG9yKDAuODUsIDAuMjcsIDAuMjcpCiAgICAgICAgbG9jYWwgdCA9ICJHQU1FIE9WRVIiCiAgICAgICAgdHcgPSBnZy5ncmFwaGljcy5nZXRUZXh0V2lkdGgodCkKICAgICAgICBnZy5ncmFwaGljcy5wcmludCh0LCBXIC8gMiAtIHR3IC8gMiwgSCAvIDIgLSA1MCkKICAgICAgICBnZy5ncmFwaGljcy5zZXRGb250KDE2KQogICAgICAgIGdnLmdyYXBoaWNzLnNldENvbG9yKFRFWFRfQlJUWzFdLCBURVhUX0JSVFsyXSwgVEVYVF9CUlRbM10pCiAgICAgICAgdCA9IHN0cmluZy5mb3JtYXQoIlNjb3JlOiAlZCIsIHUuc2NvcmUgb3IgMCkKICAgICAgICB0dyA9IGdnLmdyYXBoaWNzLmdldFRleHRXaWR0aCh0KQogICAgICAgIGdnLmdyYXBoaWNzLnByaW50KHQsIFcgLyAyIC0gdHcgLyAyLCBIIC8gMikKICAgICAgICBnZy5ncmFwaGljcy5zZXRGb250KDExKQogICAgICAgIGdnLmdyYXBoaWNzLnNldENvbG9yKFRFWFRfRElNWzFdLCBURVhUX0RJTVsyXSwgVEVYVF9ESU1bM10pCiAgICAgICAgdCA9ICJUYXAgdG8gcmVzdGFydCIKICAgICAgICB0dyA9IGdnLmdyYXBoaWNzLmdldFRleHRXaWR0aCh0KQogICAgICAgIGdnLmdyYXBoaWNzLnByaW50KHQsIFcgLyAyIC0gdHcgLyAyLCBIIC8gMiArIDM1KQogICAgZW5kCmVuZAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment